diff --git a/BUILD.gn b/BUILD.gn
index 93dd2185..5377dbb3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -343,7 +343,7 @@
       ]
     }
 
-    if (use_aura || is_mac) {
+    if (!is_android && !is_ios && !is_fuchsia) {
       deps += [ "//ui/webui/examples:webui_examples" ]
     }
 
diff --git a/DEPS b/DEPS
index 8860b89..c70da56b 100644
--- a/DEPS
+++ b/DEPS
@@ -246,11 +246,11 @@
   'reclient_version': 're_client_version:0.176.0.8c46330a-gomaip',
 
   # screen-ai CIPD packages
-  'screen_ai_linux': 'version:127.16',
-  'screen_ai_macos_amd64': 'version:127.16',
-  'screen_ai_macos_arm64': 'version:127.16',
-  'screen_ai_windows_amd64': 'version:127.16',
-  'screen_ai_windows_386': 'version:127.16',
+  'screen_ai_linux': 'version:127.17',
+  'screen_ai_macos_amd64': 'version:127.17',
+  'screen_ai_macos_arm64': 'version:127.17',
+  'screen_ai_windows_amd64': 'version:127.17',
+  'screen_ai_windows_386': 'version:127.17',
 
   # siso CIPD package version.
   'siso_version': 'git_revision:4442c27a02f2b5de389f88be9639e4e638ff761a',
@@ -276,23 +276,23 @@
   # 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': '46b1cf7626d79babe4e023e377dd106b27a791c0',
+  'src_internal_revision': '3948f2308234bf9aa8b8565ce5ed8d889cc5d139',
   # 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': 'a3847c896e22997313f2d3dc127abfd2cd8806ae',
+  'skia_revision': 'e1be182426377ca8ae1b322e0f2c81118d0aab8b',
   # 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': 'a5ca09d7e54499e81ce889a614cfe01970895e03',
+  'v8_revision': '194368fea07c867d4518e6670fc6350a537a3480',
   # 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': 'f102ef023fcb279daa667c7ab80d72c533869c98',
+  'angle_revision': '6aa46befc457f8876651c1b4e140fb2d352a326d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '720189cae8478484f51531a9eed9abc6d8635271',
+  'swiftshader_revision': 'd7ed113c66ecb95244f0f01c08afce6d7cb6ce48',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -300,7 +300,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
-  'boringssl_revision': '2b619cc49cbe54279ae2aaa3c3a32c9cf2a23e0b',
+  'boringssl_revision': '294ab9730c570213b496cfc2fc14b3c0bfcd4bcc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
@@ -348,7 +348,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'cfa9c31cbefb033f14b4281483ab9abcf43e4dc6',
+  'catapult_revision': '30345af7ee8bf6e5ac59d4fc9a2fa3edbb707a4a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # 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 CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '0bdccb1bad9730955a96fc4b95331750cc561c98',
+  'crossbench_revision': '380bb97970f8e72aa326eb4c6872fc204dd57a85',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -372,7 +372,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': 'dcf675078d9647719ca69e082358962b0296e2a9',
+  'devtools_frontend_revision': 'e8b377b3c7a08eb7bf3e3a1a69ef599a04110396',
   # 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.
@@ -396,7 +396,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': '0287e2776f63e1d6d6eea5b80e58479a1289d22e',
+  'dawn_revision': '4bec057b7e2af7de9a82d5fb46a33a772c2e4437',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -448,7 +448,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '97690c6996f683a6f3e07d75fc4557958c55ac7b',
+  'nearby_revision': 'eea3441da94fa0dd07d7535f1c57158bcbc92b70',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -460,7 +460,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.
-  'cros_components_revision': '5d7864796c5ed4059c265d9eef3e22e9db46ea33',
+  'cros_components_revision': '3597d73c5d3524faf4bbfcbe418deba9958b0f2f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -472,7 +472,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'libunwind_revision':    'b05ea6f335254c55d6f967b5881cc6b38045d824',
+  'libunwind_revision':    '62e217a12ee1133833d9890b2f7adde900e4efbd',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -797,10 +797,10 @@
     'condition': 'non_git_source',
     'objects': [
       {
-        'object_name': 'e87cbaec0ae5267758119ccaf57fca06f76fcdb1',
-        'sha256sum': 'f59fbd8403e57266bd0fc1e6f4df694d6bb6197ad5d8f2a4ad8a9764294dcec7',
-        'size_bytes': 9238072,
-        'generation': 1739494711854341,
+        'object_name': 'e7cdf2d4b8c9cdf2b55da8e139881e9b4740b937',
+        'sha256sum': '8d4dcd9553cde11b2965c92c04f6e2a7bab93682bfe1091d654f5c60c87b3f60',
+        'size_bytes': 9234835,
+        'generation': 1739578133862156,
         'output_file': 'node_modules.tar.gz',
       },
     ],
@@ -1123,7 +1123,7 @@
   },
 
   'src/chrome/release_scripts': {
-      'url': Var('chrome_git') + '/chrome/tools/release/scripts' + '@' + 'f67cfc0d2d342127d3e2572d400d3d8f9e93dc81',
+      'url': Var('chrome_git') + '/chrome/tools/release/scripts' + '@' + 'bfa066d3ee8c712861cb563cbe1297628523bde7',
       'condition': 'checkout_chrome_release_scripts',
   },
 
@@ -1452,12 +1452,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '36ec4270ac455591e49ebc3c455f222539b62e59',
+    'cf15a048c9ae45b95192ce794bea6fc1f78db869',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '4e4b61042e75761a43c8e29387c1f19a35b028f9',
+    'url': Var('chromium_git') + '/website.git' + '@' + '149dc09722d54254101f23b50b6641ba4c41f3ad',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1466,7 +1466,7 @@
   },
 
   'src/ios/third_party/edo/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git' + '@' + '13fd3068bf462e6d55a405f5ec3c62abcf1dd9bb',
+      'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git' + '@' + 'a75d424d4c35afa3ef04cee6b8a51fca57e46a30',
       'condition': 'checkout_ios',
   },
 
@@ -1611,7 +1611,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'X3RUiAVlYpSEgtqmKdDbZFDp3xSdR1NJYbEKBuoy458C',
+          'version': 'R1wNTeO5kH2bzp1NW4g87DLWtiDXaImAQJplHSR-108C',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -1938,7 +1938,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '12fde60ccc102d3243fec651d5ee30207dc491aa',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '869814cf6278c02facde7189073d20d4d33a0d1e',
       'condition': 'checkout_linux or checkout_chromeos',
   },
 
@@ -1947,7 +1947,7 @@
 
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ee429f3694c51421c8b2f2af52049102ef43bca9',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ab387d1ddc530d405f662904f2df292f700e4b0f',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -2200,7 +2200,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/kotlinc',
-              'version': 'NstbMU2T3FwNigAPukklSBBmCKyUGheEgy8WZNY-5WIC',
+              'version': 'Byyh0dwgQgBY_Jzh2Kk2tN7n_bJl2YJXe6JQKdySO4kC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2449,7 +2449,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '503da067462f94898544f65e0fd751b4613ca9b8',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '1e97ffd1534d3cff6b33ba2c01ba30eff2f249cb',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2667,7 +2667,7 @@
     Var('chromium_git') + '/external/github.com/google/ruy.git' + '@' + '83fd40d730feb0804fafbc2d8814bcc19a17b2e5',
 
   'src/third_party/search_engines_data/resources':
-    Var('chromium_git') + '/external/search_engines_data.git' + '@' + '6dc3b54b420e6e03a34ee7259fcd2b1978fac5f3',
+    Var('chromium_git') + '/external/search_engines_data.git' + '@' + 'f9ec42985da1b80796019c6258317efaa6768cb5',
 
   'src/third_party/skia':
     Var('skia_git') + '/skia.git' + '@' +  Var('skia_revision'),
@@ -2750,7 +2750,7 @@
     Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + 'c036420683f672d685e27415de0a5f5e85bdc23f',
 
   'src/third_party/tflite/src':
-    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'b8ffdbdf19bcc43639bc0f3c05ef7d9a4667527f',
+    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'd120e39920c0e61cc1227bc1abe50fd6ecd3ce66',
 
   'src/third_party/turbine/cipd': {
       'packages': [
@@ -2817,7 +2817,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'afae3c2252d76665593652293743457ebcb1bbf7',
+    Var('webrtc_git') + '/src.git' + '@' + '3822af6ef1ab5d1bda81c97cf3cf797db8e288d5',
 
   # 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.
@@ -2863,7 +2863,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'BUSKiikgKynZFrvG5LYEzy3rGwyxdF0XCfjXYnJNcVEC',
+          'version': 'cFP5_MeKETBLhyiZ3wrHD1ei0WT9jfIt4d_zmFFDlL0C',
         },
       ],
       'dep_type': 'cipd',
@@ -2873,7 +2873,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': 'C13nP-0qMu6SzC6Sq-P5kaZJ6p4yEykqSj3TnK39NiUC',
+          'version': 'nkeh5UQvxZz54dBmhgRp3xrCFIEaVW45Smum7g2NkJIC',
         },
       ],
       'dep_type': 'cipd',
@@ -2884,7 +2884,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'ZsOrg7xgPaaYo156AG7K_MFTx9f-wDEH0q6BFQxUiL0C',
+          'version': '9ZKSPWL0BFFJ9i-XXta9akbpsxgQzTvJFPOSLaFXrIgC',
         },
       ],
       'dep_type': 'cipd',
@@ -2895,7 +2895,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-arm64',
-          'version': 'csw65C75AJ7kjYY7eVIUUKBqJvrsMzejzZF_e66ZjagC',
+          'version': 'ocDZkono_-0H7--idWYeYTAFQeO3RVx7ugf5aj4Y4sYC',
         },
       ],
       'dep_type': 'cipd',
@@ -2936,7 +2936,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_app/app',
-        'version': 'QjgXlUuFORCUw_8p0nx2Hw1O7T3ZYOzDDN3CkKOsrw0C',
+        'version': '0-I1fUwcOTNM8v_qLEFUGgt-XWHAH5Yl3ELuGElcX5MC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4479,7 +4479,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        '4e185f6350b47d631b33b5c5fcb8bc359e402990',
+        'f73d4cb558082258f5c49cd4fa7772eea7d10415',
       'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 1d805a4..6b518b66 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -31,40 +31,38 @@
 
 assert(!is_cronet_build)
 
-if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
-  assert(current_toolchain != android_secondary_abi_toolchain)
-}
-
 if (enable_resource_allowlist_generation) {
   system_webview_pak_allowlist =
       "$target_gen_dir/system_webview_pak_allowlist.txt"
 }
 
-if (android_64bit_target_cpu) {
-  _main_trichrome_library_provider =
-      "//chrome/android:trichrome_library_32_64_apk"
-  _main_trichrome_webview_apk_target = "trichrome_webview_32_64_apk"
-  _main_trichrome_webview_bundle_target = "trichrome_webview_32_64_bundle"
-  _main_trichrome_webview_base_bundle_module_target =
-      "trichrome_webview_32_64_base_bundle_module"
-  _main_system_webview_apk_target = "system_webview_32_64_apk"
-  _main_system_webview_bundle_target = "system_webview_32_64_bundle"
-  _main_system_webview_base_bundle_module_target =
-      "system_webview_32_64_base_bundle_module"
+if (!android_64bit_target_cpu) {
+  _default_arch_tokens = ""
+} else if (defined(android_app_secondary_abi)) {
+  _default_arch_tokens = "_32_64"
+} else {
+  _default_arch_tokens = "_64"
+}
 
+_main_trichrome_library_provider =
+    "//chrome/android:trichrome_library${_default_arch_tokens}_apk"
+_main_trichrome_webview_apk_target =
+    "trichrome_webview${_default_arch_tokens}_apk"
+_main_trichrome_webview_bundle_target =
+    "trichrome_webview${_default_arch_tokens}_bundle"
+_main_trichrome_webview_base_bundle_module_target =
+    "trichrome_webview${_default_arch_tokens}_base_bundle_module"
+_main_system_webview_apk_target = "system_webview${_default_arch_tokens}_apk"
+_main_system_webview_bundle_target =
+    "system_webview${_default_arch_tokens}_bundle"
+_main_system_webview_base_bundle_module_target =
+    "system_webview${_default_arch_tokens}_base_bundle_module"
+
+if (android_64bit_target_cpu) {
   # We are assuming that all webview targets have the same Java - if this
   # is no longer true, we should add more targets to this array.
   webview_java_for_jni_targets = [ ":system_webview_64_bundle" ]
 } else {
-  _main_trichrome_library_provider = "//chrome/android:trichrome_library_apk"
-  _main_trichrome_webview_apk_target = "trichrome_webview_apk"
-  _main_trichrome_webview_bundle_target = "trichrome_webview_bundle"
-  _main_trichrome_webview_base_bundle_module_target =
-      "trichrome_webview_base_bundle_module"
-  _main_system_webview_apk_target = "system_webview_apk"
-  _main_system_webview_bundle_target = "system_webview_bundle"
-  _main_system_webview_base_bundle_module_target =
-      "system_webview_base_bundle_module"
   webview_java_for_jni_targets = [ ":system_webview_bundle" ]
 }
 
@@ -75,17 +73,13 @@
   }
 }
 
-# Standalone WebView APK.
-if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
-  group("system_webview_apk") {
-    deps = [ ":system_webview_64_apk" ]
+if (android_64bit_target_cpu) {
+  alias_with_wrapper_script("system_webview_apk") {
+    alias_target = ":$_main_system_webview_apk_target"
   }
-} else {
-  if (android_64bit_target_cpu) {
-    alias_with_wrapper_script("system_webview_apk") {
-      alias_target = ":system_webview_32_64_apk"
-    }
-  }
+}
+
+if (!android_64bit_target_cpu || defined(android_app_secondary_abi)) {
   standalone_system_webview_apk_tmpl(_main_system_webview_apk_target) {
     apk_name = "SystemWebView"
   }
@@ -117,7 +111,7 @@
       [ "//third_party/androidx:androidx_recyclerview_recyclerview_java" ]
 }
 
-if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
+if (android_64bit_target_cpu && !defined(android_app_secondary_abi)) {
   group("system_webview_bundle") {
     deps = [ ":system_webview_64_bundle" ]
   }
@@ -166,7 +160,7 @@
     bundle_name = "SystemWebView64"
     include_32_bit_webview = false
   }
-  if (!skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     # These targets builds a 32-bit only Webview on a 64-bit config, analogous
     # to what's built on a 32-bit config. This lets all Webviews build on a
     # single configuration.
@@ -202,7 +196,7 @@
   }
 }
 
-if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
+if (android_64bit_target_cpu && !defined(android_app_secondary_abi)) {
   group("trichrome_webview_apk") {
     deps = [ ":trichrome_webview_64_apk" ]
   }
@@ -231,7 +225,7 @@
   }
 }
 
-if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
+if (android_64bit_target_cpu && !defined(android_app_secondary_abi)) {
   group("trichrome_webview_bundle") {
     deps = [ ":trichrome_webview_64_bundle" ]
   }
@@ -269,6 +263,7 @@
 if (android_64bit_target_cpu) {
   system_webview_bundle("trichrome_webview_64_bundle") {
     is_trichrome = true
+    include_32_bit_webview = false
     base_module_target = ":trichrome_webview_64_base_bundle_module"
     bundle_name = "TrichromeWebView64"
     static_library_provider = "//chrome/android:trichrome_library_64_apk"
@@ -300,7 +295,7 @@
 }
 
 # Trichrome WebView APK for a 64-bit Chrome.
-if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+if (android_64bit_target_cpu && defined(android_app_secondary_abi)) {
   template("trichrome_webview_64_32_tmpl") {
     trichrome_webview_tmpl(target_name) {
       forward_variables_from(invoker, "*")
@@ -446,7 +441,7 @@
   }
 }
 
-if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+if (android_64bit_target_cpu && defined(android_app_secondary_abi)) {
   # Note here that on a given system, the webview-only library needs the same
   # library name as the browser library, since the system webview factory will
   # differentiate only by ABI.
@@ -1087,7 +1082,7 @@
   ]
 }
 
-if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+if (android_64bit_target_cpu && defined(android_app_secondary_abi)) {
   java_group("webview_secondary_abi_assets") {
     deps = [ "//gin:v8_snapshot_secondary_abi_assets" ]
   }
@@ -1105,7 +1100,7 @@
     ":webview_primary_abi_assets",
     "//third_party/icu:icu_assets",
   ]
-  if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     deps += [ ":webview_secondary_abi_assets" ]
   }
 }
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index 1a6f934..d73c01c5 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -878,9 +878,6 @@
                 "Optimize handling of static properties during animations."),
         Flag.baseFeature("LazyBindJsInjection"),
         Flag.baseFeature(AwFeatures.WEBVIEW_MUTE_AUDIO, "Enables WebView audio to be muted."),
-        Flag.baseFeature(
-                BlinkFeatures.CONCURRENT_VIEW_TRANSITIONS_SPA,
-                "Allows concurrent transitions in local frames rendered in the same process"),
         Flag.baseFeature("WebViewVizUseThreadPool"),
         Flag.baseFeature("InProcessGpuUseIOThread"),
         Flag.baseFeature("EnableCustomInputStreamBufferSize"),
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni
index 6a48c09a..703e9e1 100644
--- a/android_webview/system_webview_apk_tmpl.gni
+++ b/android_webview/system_webview_apk_tmpl.gni
@@ -29,11 +29,20 @@
          "If trichrome library is used, static_library_provider must be set " +
              "so that a dep can be added on the library APK.")
 
-  _include_32_bit_webview =
-      !defined(invoker.include_32_bit_webview) || invoker.include_32_bit_webview
   _include_64_bit_webview =
       android_64bit_target_cpu && (!defined(invoker.include_64_bit_webview) ||
                                    invoker.include_64_bit_webview)
+
+  if (defined(invoker.include_32_bit_webview)) {
+    _include_32_bit_webview = invoker.include_32_bit_webview
+  } else {
+    _include_32_bit_webview =
+        !android_64bit_target_cpu || defined(android_app_secondary_abi)
+
+    # Make sure defaults never lead no abi.
+    assert(_include_32_bit_webview || _include_64_bit_webview)
+  }
+
   if (_is_trichrome) {
     _is_64_bit_browser = android_64bit_target_cpu && invoker.is_64_bit_browser
     _version_code = TRICHROME_VERSION_MAP["${android_64bit_target_cpu}_${_is_64_bit_browser}_${_include_64_bit_webview}_${_include_32_bit_webview}"]
diff --git a/android_webview/system_webview_bundle.gni b/android_webview/system_webview_bundle.gni
index ac859e1b2..e5b36ab 100644
--- a/android_webview/system_webview_bundle.gni
+++ b/android_webview/system_webview_bundle.gni
@@ -26,11 +26,17 @@
       min_sdk_version = 29
     }
     system_image_locale_allowlist = platform_pak_locales
-    is_multi_abi =
-        android_64bit_target_cpu && (!defined(invoker.include_64_bit_webview) ||
-                                     invoker.include_64_bit_webview) &&
-        (!defined(invoker.include_32_bit_webview) ||
-         invoker.include_32_bit_webview)
+    if (android_64bit_target_cpu) {
+      _include_32_bit_webview = !defined(invoker.include_32_bit_webview) ||
+                                invoker.include_32_bit_webview
+      _include_64_bit_webview = !defined(invoker.include_64_bit_webview) ||
+                                invoker.include_64_bit_webview
+      is_multi_abi = _include_32_bit_webview && _include_64_bit_webview
+      not_needed([ "_include_64_bit_webview" ])
+      if (!defined(android_app_secondary_abi)) {
+        assert(!is_multi_abi)
+      }
+    }
 
     if (!defined(proguard_android_sdk_dep)) {
       proguard_android_sdk_dep = webview_framework_dep
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index d254e13..ae0d376 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -71,7 +71,7 @@
     ]
   }
 
-  if (!skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     python_library("webview_trichrome_64_32_cts_tests") {
       pydeps_file = "//android_webview/tools/run_cts.pydeps"
       deps = [ "//android_webview:trichrome_webview_64_32_apk" ]
diff --git a/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index cc41902b..df354e10 100644
--- a/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -2510,6 +2510,10 @@
     getter protocol
     getter provider
     method constructor
+interface FetchLaterResult
+    attribute @@toStringTag
+    getter activated
+    method constructor
 interface File : Blob
     attribute @@toStringTag
     getter lastModified
@@ -11125,6 +11129,7 @@
     method confirm
     method createImageBitmap
     method fetch
+    method fetchLater
     method find
     method focus
     method getComputedStyle
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
index d503838c..84624307 100644
--- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -126,6 +126,7 @@
     method languagePairAvailable
 interface AITranslatorFactory
     attribute @@toStringTag
+    method availability
     method capabilities
     method constructor
     method create
@@ -7727,9 +7728,13 @@
     attribute @@toStringTag
     getter href
     getter interestTargetElement
+    getter rel
+    getter relList
     getter target
     method constructor
     setter interestTargetElement
+    setter rel
+    setter relList
 interface SVGAngle
     attribute @@toStringTag
     attribute SVG_ANGLETYPE_DEG
@@ -11635,12 +11640,15 @@
     method addFromUri
     method item
 interface webkitSpeechRecognition : EventTarget
+    static method availableOnDevice
+    static method installOnDevice
     attribute @@toStringTag
     getter continuous
     getter grammars
     getter interimResults
     getter lang
     getter maxAlternatives
+    getter mode
     getter onaudioend
     getter onaudiostart
     getter onend
@@ -11660,6 +11668,7 @@
     setter interimResults
     setter lang
     setter maxAlternatives
+    setter mode
     setter onaudioend
     setter onaudiostart
     setter onend
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 917d8a9..a7cb155 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -405,6 +405,9 @@
     "birch/coral_item_remover.h",
     "bluetooth_devices_observer.cc",
     "bluetooth_devices_observer.h",
+    "boca/on_task/on_task_pod_controller.h",
+    "boca/on_task/on_task_pod_view.cc",
+    "boca/on_task/on_task_pod_view.h",
     "booting/booting_animation_controller.cc",
     "booting/booting_animation_controller.h",
     "booting/booting_animation_view.cc",
@@ -3823,6 +3826,7 @@
     "birch/birch_ranker_unittest.cc",
     "birch/birch_weather_provider_unittest.cc",
     "birch/coral_item_remover_unittest.cc",
+    "boca/on_task/on_task_pod_view_unittest.cc",
     "bubble//simple_grid_layout_unittest.cc",
     "bubble/bubble_event_filter_unittest.cc",
     "bubble/bubble_utils_unittest.cc",
diff --git a/ash/boca/on_task/OWNERS b/ash/boca/on_task/OWNERS
new file mode 100644
index 0000000..d059214
--- /dev/null
+++ b/ash/boca/on_task/OWNERS
@@ -0,0 +1 @@
+file://chromeos/ash/components/boca/OWNERS
diff --git a/ash/boca/on_task/on_task_pod_controller.h b/ash/boca/on_task/on_task_pod_controller.h
new file mode 100644
index 0000000..329d4e5
--- /dev/null
+++ b/ash/boca/on_task/on_task_pod_controller.h
@@ -0,0 +1,27 @@
+// 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 ASH_BOCA_ON_TASK_ON_TASK_POD_CONTROLLER_H_
+#define ASH_BOCA_ON_TASK_ON_TASK_POD_CONTROLLER_H_
+
+namespace ash {
+
+// Controller interface used by the `OnTaskPodView` to supplement OnTask UX with
+// convenience features like page navigation, tab reloads, etc.
+class OnTaskPodController {
+ public:
+  OnTaskPodController(const OnTaskPodController&) = delete;
+  OnTaskPodController& operator=(const OnTaskPodController&) = delete;
+  virtual ~OnTaskPodController() = default;
+
+  // Attempts to reload the current page.
+  virtual void ReloadCurrentPage() = 0;
+
+ protected:
+  OnTaskPodController() = default;
+};
+
+}  // namespace ash
+
+#endif  // ASH_BOCA_ON_TASK_ON_TASK_POD_CONTROLLER_H_
diff --git a/ash/boca/on_task/on_task_pod_view.cc b/ash/boca/on_task/on_task_pod_view.cc
new file mode 100644
index 0000000..ad7ef09
--- /dev/null
+++ b/ash/boca/on_task/on_task_pod_view.cc
@@ -0,0 +1,62 @@
+// 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 "ash/boca/on_task/on_task_pod_view.h"
+
+#include <memory>
+#include <string>
+
+#include "ash/boca/on_task/on_task_pod_controller.h"
+#include "ash/resources/vector_icons/vector_icons.h"
+#include "ash/style/icon_button.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
+#include "ui/views/background.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace ash {
+namespace {
+
+// Border radius for the OnTask pod.
+constexpr int kPodBorderRadius = 4;
+
+std::unique_ptr<IconButton> CreateIconButton(base::RepeatingClosure callback,
+                                             const gfx::VectorIcon* icon,
+                                             int accessible_name_id) {
+  auto button = std::make_unique<IconButton>(
+      std::move(callback), IconButton::Type::kMedium, icon, accessible_name_id);
+  button->SetIconColor(cros_tokens::kCrosSysOnSurface);
+  button->SetBackgroundColor(SK_ColorTRANSPARENT);
+  return button;
+}
+
+}  // namespace
+
+OnTaskPodView::OnTaskPodView(OnTaskPodController* pod_controller)
+    : pod_controller_(pod_controller) {
+  SetOrientation(views::BoxLayout::Orientation::kHorizontal);
+  SetMainAxisAlignment(views::BoxLayout::MainAxisAlignment::kStart);
+  SetCrossAxisAlignment(views::BoxLayout::CrossAxisAlignment::kStart);
+  SetBackground(views::CreateThemedRoundedRectBackground(
+      cros_tokens::kCrosSysPrimaryContainer, kPodBorderRadius));
+
+  AddShortcutButtons();
+}
+
+OnTaskPodView::~OnTaskPodView() = default;
+
+void OnTaskPodView::AddShortcutButtons() {
+  reload_tab_button_ = AddChildView(CreateIconButton(
+      base::BindRepeating(&OnTaskPodController::ReloadCurrentPage,
+                          base::Unretained(pod_controller_)),
+      &kKsvReloadIcon, IDS_ON_TASK_POD_RELOAD_ACCESSIBLE_NAME));
+}
+
+BEGIN_METADATA(OnTaskPodView)
+END_METADATA
+
+}  // namespace ash
diff --git a/ash/boca/on_task/on_task_pod_view.h b/ash/boca/on_task/on_task_pod_view.h
new file mode 100644
index 0000000..58cb8c33
--- /dev/null
+++ b/ash/boca/on_task/on_task_pod_view.h
@@ -0,0 +1,44 @@
+// 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 ASH_BOCA_ON_TASK_ON_TASK_POD_VIEW_H_
+#define ASH_BOCA_ON_TASK_ON_TASK_POD_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ash/style/icon_button.h"
+#include "base/memory/raw_ptr.h"
+#include "ui/base/metadata/metadata_header_macros.h"
+#include "ui/views/layout/box_layout_view.h"
+
+namespace ash {
+
+class OnTaskPodController;
+
+// OnTaskPodView contains the shortcut buttons that are part of the OnTask pod.
+// The OnTask pod is meant to supplement OnTask UX with convenience features
+// like page navigation, tab reloads, tab strip pinning in locked mode, etc.
+class ASH_EXPORT OnTaskPodView : public views::BoxLayoutView {
+  METADATA_HEADER(OnTaskPodView, views::BoxLayoutView)
+
+ public:
+  explicit OnTaskPodView(OnTaskPodController* pod_controller);
+  OnTaskPodView(const OnTaskPodView&) = delete;
+  OnTaskPodView& operator=(const OnTaskPodView) = delete;
+  ~OnTaskPodView() override;
+
+  // Test element accessors:
+  IconButton* reload_tab_button_for_testing() { return reload_tab_button_; }
+
+ private:
+  // Adds shortcut buttons to the OnTask pod view.
+  void AddShortcutButtons();
+
+  // Pointer to the pod controller that outlives the `OnTaskPodView`.
+  const raw_ptr<OnTaskPodController> pod_controller_;
+  raw_ptr<IconButton> reload_tab_button_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_BOCA_ON_TASK_ON_TASK_POD_VIEW_H_
diff --git a/ash/boca/on_task/on_task_pod_view_unittest.cc b/ash/boca/on_task/on_task_pod_view_unittest.cc
new file mode 100644
index 0000000..54cdf52
--- /dev/null
+++ b/ash/boca/on_task/on_task_pod_view_unittest.cc
@@ -0,0 +1,60 @@
+// 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 "ash/boca/on_task/on_task_pod_view.h"
+
+#include <memory>
+
+#include "ash/boca/on_task/on_task_pod_controller.h"
+#include "ash/test/ash_test_base.h"
+#include "base/memory/raw_ptr.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+namespace {
+
+// Mock implementation of the `OnTaskPodController`.
+class MockOnTaskPodController : public OnTaskPodController {
+ public:
+  MockOnTaskPodController() = default;
+  ~MockOnTaskPodController() override = default;
+
+  MOCK_METHOD(void, ReloadCurrentPage, (), (override));
+};
+
+class OnTaskPodViewTest : public AshTestBase {
+ protected:
+  void SetUp() override {
+    AshTestBase::SetUp();
+
+    widget_ = CreateFramelessTestWidget();
+    widget_->SetFullscreen(true);
+    auto on_task_pod_view =
+        std::make_unique<OnTaskPodView>(&mock_on_task_pod_controller_);
+    on_task_pod_view_ = widget_->SetContentsView(std::move(on_task_pod_view));
+  }
+
+  MockOnTaskPodController mock_on_task_pod_controller_;
+  std::unique_ptr<views::Widget> widget_;
+  raw_ptr<OnTaskPodView> on_task_pod_view_;
+};
+
+TEST_F(OnTaskPodViewTest, OrientationAndAlignment) {
+  EXPECT_EQ(on_task_pod_view_->GetOrientation(),
+            views::BoxLayout::Orientation::kHorizontal);
+  EXPECT_EQ(on_task_pod_view_->GetMainAxisAlignment(),
+            views::BoxLayout::MainAxisAlignment::kStart);
+  EXPECT_EQ(on_task_pod_view_->GetCrossAxisAlignment(),
+            views::BoxLayout::CrossAxisAlignment::kStart);
+}
+
+TEST_F(OnTaskPodViewTest, ReloadTabButtonClickTriggersTabReload) {
+  EXPECT_CALL(mock_on_task_pod_controller_, ReloadCurrentPage()).Times(1);
+  LeftClickOn(on_task_pod_view_->reload_tab_button_for_testing());
+}
+
+}  // namespace
+}  // namespace ash
diff --git a/ash/capture_mode/base_capture_mode_session.h b/ash/capture_mode/base_capture_mode_session.h
index e01486b5..d6d77e34 100644
--- a/ash/capture_mode/base_capture_mode_session.h
+++ b/ash/capture_mode/base_capture_mode_session.h
@@ -188,7 +188,8 @@
       ActionButtonRank rank,
       ActionButtonViewID id) = 0;
 
-  // Adds an action button that can be clicked to fetch smart actions.
+  // Adds an action button that can be clicked to fetch smart actions if the
+  // current behaviour allows showing it, and the device is online.
   virtual void AddSmartActionsButton() = 0;
 
   // Checks if the controller needs to show the scanner disclaimer and shows if
diff --git a/ash/capture_mode/capture_mode_behavior.cc b/ash/capture_mode/capture_mode_behavior.cc
index b3c615e..ea2dfe6 100644
--- a/ash/capture_mode/capture_mode_behavior.cc
+++ b/ash/capture_mode/capture_mode_behavior.cc
@@ -126,7 +126,7 @@
         // actions buttons should be shown.
         capture_mode_controller->PerformCapture(
             PerformCaptureType::kTextDetection);
-      } else if (features::IsScannerEnabled()) {
+      } else {
         // Show the smart actions button regardless of whether there is text
         // in the selected area or not.
         BaseCaptureModeSession* session =
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 3914c9f..c8717d8 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -532,10 +532,11 @@
 
 // Returns true if Scanner actions should be fetched for a captured image with
 // the given `capture_type`.
+// This will return true even if Scanner is disabled so the appropriate metrics
+// can be emitted.
 bool ShouldFetchScannerActions(PerformCaptureType capture_type) {
-  return Shell::Get()->scanner_controller() &&
-         (capture_type == PerformCaptureType::kSunfish ||
-          capture_type == PerformCaptureType::kScanner);
+  return capture_type == PerformCaptureType::kSunfish ||
+         capture_type == PerformCaptureType::kScanner;
 }
 
 // Returns true if region search should be performed on a captured image with
@@ -1998,21 +1999,37 @@
   }
 
   if (ShouldFetchScannerActions(capture_type)) {
+    bool actions_fetched = false;
+    if (ScannerController* scanner_controller =
+            Shell::Get()->scanner_controller()) {
+      // Note that `OnScannerActionsFetched` is always called, even if
+      // `actions_fetched` is false. This is intentional, as
+      // `OnScannerActionsFetched` stops the glow started by
+      // `ShouldShowGlowWhileProcessingCaptureType` in `DefaultBehavior`
+      // (guarded on whether `scanner_controller()` is non-null on `Shell`), and
+      // in `SunfishBehavior` (always true).
+      actions_fetched = scanner_controller->FetchActionsForImage(
+          jpeg_bytes,
+          base::BindOnce(&CaptureModeController::OnScannerActionsFetched,
+                         weak_ptr_factory_.GetWeakPtr(), image_search_token));
+    }
+
     if (capture_type == PerformCaptureType::kSunfish) {
       RecordScannerFeatureUserState(
-          ScannerFeatureUserState::
-              kSunfishScreenInitialScreenCaptureSentToScannerServer);
+          actions_fetched
+              ? ScannerFeatureUserState::
+                    kSunfishSessionImageCapturedAndActionsFetchStarted
+              : ScannerFeatureUserState::
+                    kSunfishSessionImageCapturedAndActionsNotFetched);
     }
     if (capture_type == PerformCaptureType::kScanner) {
       RecordScannerFeatureUserState(
-          ScannerFeatureUserState::
-              kScreenCaptureModeInitialScreenCaptureSentToScannerServer);
+          actions_fetched
+              ? ScannerFeatureUserState::
+                    kSmartActionsButtonImageCapturedAndActionsFetchStarted
+              : ScannerFeatureUserState::
+                    kSmartActionsButtonImageCapturedAndActionsNotFetched);
     }
-
-    Shell::Get()->scanner_controller()->FetchActionsForImage(
-        jpeg_bytes,
-        base::BindOnce(&CaptureModeController::OnScannerActionsFetched,
-                       weak_ptr_factory_.GetWeakPtr(), image_search_token));
   }
 
   if (ShouldSendRegionSearch(capture_type)) {
diff --git a/ash/capture_mode/sunfish_unittest.cc b/ash/capture_mode/sunfish_unittest.cc
index 34512f61..2bf11f1 100644
--- a/ash/capture_mode/sunfish_unittest.cc
+++ b/ash/capture_mode/sunfish_unittest.cc
@@ -44,6 +44,7 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/scanner/fake_scanner_profile_scoped_delegate.h"
 #include "ash/scanner/scanner_controller.h"
+#include "ash/scanner/scanner_enterprise_policy.h"
 #include "ash/scanner/scanner_metrics.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/home_button.h"
@@ -298,6 +299,94 @@
   EXPECT_FALSE(CaptureModeTestApi().IsPendingDlpCheck());
 }
 
+class SunfishEnabledScannerDisabledTest : public SunfishTestBase {
+ public:
+  SunfishEnabledScannerDisabledTest() {
+    scoped_feature_list_.InitWithFeatures(/*enabled_features=*/
+                                          {features::kSunfishFeature},
+                                          /*disabled_features=*/{{
+                                              features::kScannerDogfood,
+                                              features::kScannerUpdate,
+                                          }});
+  }
+  SunfishEnabledScannerDisabledTest(const SunfishEnabledScannerDisabledTest&) =
+      delete;
+  SunfishEnabledScannerDisabledTest& operator=(
+      const SunfishEnabledScannerDisabledTest&) = delete;
+  ~SunfishEnabledScannerDisabledTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(SunfishEnabledScannerDisabledTest,
+       SunfishSessionImageCapturedAndActionsNotFetchedRecorded) {
+  base::HistogramTester histogram_tester;
+  base::test::TestFuture<manta::ScannerProvider::ScannerProtoResponseCallback>
+      fetch_actions_future;
+  auto* capture_mode_controller = CaptureModeController::Get();
+  capture_mode_controller->StartSunfishSession();
+  histogram_tester.ExpectBucketCount(
+      "Ash.ScannerFeature.UserState",
+      ScannerFeatureUserState::kSunfishSessionImageCapturedAndActionsNotFetched,
+      0);
+
+  SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 600, 500),
+                          /*release_mouse=*/true, /*verify_region=*/true);
+  WaitForImageCapturedForSearch(PerformCaptureType::kSunfish);
+
+  histogram_tester.ExpectBucketCount(
+      "Ash.ScannerFeature.UserState",
+      ScannerFeatureUserState::kSunfishSessionImageCapturedAndActionsNotFetched,
+      1);
+}
+
+class SunfishEnabledScannerEnabledTest : public SunfishTestBase {
+ public:
+  SunfishEnabledScannerEnabledTest() {
+    scoped_feature_list_.InitWithFeatures(/*enabled_features=*/
+                                          {
+                                              features::kSunfishFeature,
+                                              features::kScannerDogfood,
+                                              features::kScannerUpdate,
+                                          },
+                                          /*disabled_features=*/{});
+  }
+  SunfishEnabledScannerEnabledTest(const SunfishEnabledScannerEnabledTest&) =
+      delete;
+  SunfishEnabledScannerEnabledTest& operator=(
+      const SunfishEnabledScannerEnabledTest&) = delete;
+  ~SunfishEnabledScannerEnabledTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(SunfishEnabledScannerEnabledTest,
+       SunfishSessionImageCapturedAndActionsNotFetchedRecorded) {
+  base::HistogramTester histogram_tester;
+  base::test::TestFuture<manta::ScannerProvider::ScannerProtoResponseCallback>
+      fetch_actions_future;
+  auto* capture_mode_controller = CaptureModeController::Get();
+  Shell::Get()->session_controller()->GetActivePrefService()->SetInteger(
+      prefs::kScannerEnterprisePolicyAllowed,
+      static_cast<int>(ScannerEnterprisePolicy::kDisallowed));
+  capture_mode_controller->StartSunfishSession();
+  histogram_tester.ExpectBucketCount(
+      "Ash.ScannerFeature.UserState",
+      ScannerFeatureUserState::kSunfishSessionImageCapturedAndActionsNotFetched,
+      0);
+
+  SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 600, 500),
+                          /*release_mouse=*/true, /*verify_region=*/true);
+  WaitForImageCapturedForSearch(PerformCaptureType::kSunfish);
+
+  histogram_tester.ExpectBucketCount(
+      "Ash.ScannerFeature.UserState",
+      ScannerFeatureUserState::kSunfishSessionImageCapturedAndActionsNotFetched,
+      1);
+}
+
 class SunfishTest : public SunfishTestBase {
  public:
   SunfishTest() = default;
@@ -2663,8 +2752,7 @@
   EXPECT_THAT(session_test_api.GetActionButtons(), SizeIs(2));
 }
 
-TEST_F(ScannerTest,
-       SunfishScreenInitialScreenCaptureSentToScannerServerMetricRecorded) {
+TEST_F(ScannerTest, SunfishSessionImageCapturedAndActionsFetchedRecorded) {
   base::HistogramTester histogram_tester;
   base::test::TestFuture<manta::ScannerProvider::ScannerProtoResponseCallback>
       fetch_actions_future;
@@ -2678,7 +2766,7 @@
   histogram_tester.ExpectBucketCount(
       "Ash.ScannerFeature.UserState",
       ScannerFeatureUserState::
-          kSunfishScreenInitialScreenCaptureSentToScannerServer,
+          kSunfishSessionImageCapturedAndActionsFetchStarted,
       0);
 
   SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 600, 500),
@@ -2688,9 +2776,10 @@
   histogram_tester.ExpectBucketCount(
       "Ash.ScannerFeature.UserState",
       ScannerFeatureUserState::
-          kSunfishScreenInitialScreenCaptureSentToScannerServer,
+          kSunfishSessionImageCapturedAndActionsFetchStarted,
       1);
 }
+
 // Tests that action buttons are created when the Scanner response returns as
 // fast as possible.
 TEST_F(ScannerTest, FetchActionsImmediately) {
@@ -3562,9 +3651,7 @@
       ScannerFeatureUserState::kScreenCaptureModeScannerButtonShown, 1);
 }
 
-TEST_F(
-    ScannerTest,
-    SmartActionsButtonShouldRecordMetricWhenImageSentToServerToFetchActions) {
+TEST_F(ScannerTest, SmartActionsButtonShouldRecordMetricWhenActionsFetched) {
   base::HistogramTester histogram_tester;
   auto* controller = CaptureModeController::Get();
   StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
@@ -3589,7 +3676,7 @@
   histogram_tester.ExpectBucketCount(
       "Ash.ScannerFeature.UserState",
       ScannerFeatureUserState::
-          kScreenCaptureModeInitialScreenCaptureSentToScannerServer,
+          kSmartActionsButtonImageCapturedAndActionsFetchStarted,
       0);
 
   // Click the smart actions button.
@@ -3612,7 +3699,57 @@
   histogram_tester.ExpectBucketCount(
       "Ash.ScannerFeature.UserState",
       ScannerFeatureUserState::
-          kScreenCaptureModeInitialScreenCaptureSentToScannerServer,
+          kSmartActionsButtonImageCapturedAndActionsFetchStarted,
+      1);
+}
+
+TEST_F(ScannerTest, SmartActionsButtonShouldRecordMetricWhenActionsNotFetched) {
+  base::HistogramTester histogram_tester;
+  auto* controller = CaptureModeController::Get();
+  StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
+  base::test::TestFuture<OnTextDetectionComplete> detect_text_future;
+  auto* test_delegate =
+      static_cast<TestCaptureModeDelegate*>(controller->delegate_for_testing());
+  EXPECT_CALL(*test_delegate, DetectTextInImage)
+      .WillOnce(WithArg<1>(InvokeFuture(detect_text_future)));
+
+  SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(0, 0, 50, 200),
+                          /*release_mouse=*/true, /*verify_region=*/true);
+  detect_text_future.Take().Run("detected text");
+
+  const CaptureModeSessionTestApi session_test_api(
+      controller->capture_mode_session());
+  // Smart actions button should have been created.
+  const ActionButtonView* smart_actions_button =
+      session_test_api.GetActionButtonByViewId(
+          ActionButtonViewID::kSmartActionsButton);
+  ASSERT_TRUE(smart_actions_button);
+
+  histogram_tester.ExpectBucketCount(
+      "Ash.ScannerFeature.UserState",
+      ScannerFeatureUserState::
+          kSmartActionsButtonImageCapturedAndActionsNotFetched,
+      0);
+
+  // Click the smart actions button when it is now disabled by enterprise.
+  Shell::Get()->session_controller()->GetActivePrefService()->SetInteger(
+      prefs::kScannerEnterprisePolicyAllowed,
+      static_cast<int>(ScannerEnterprisePolicy::kDisallowed));
+  base::test::TestFuture<manta::ScannerProvider::ScannerProtoResponseCallback>
+      fetch_actions_future;
+  ScannerController* scanner_controller = Shell::Get()->scanner_controller();
+  ASSERT_TRUE(scanner_controller);
+  EXPECT_CALL(*GetFakeScannerProfileScopedDelegate(*scanner_controller),
+              FetchActionsForImage)
+      .Times(0);
+
+  LeftClickOn(smart_actions_button);
+  WaitForImageCapturedForSearch(PerformCaptureType::kScanner);
+
+  histogram_tester.ExpectBucketCount(
+      "Ash.ScannerFeature.UserState",
+      ScannerFeatureUserState::
+          kSmartActionsButtonImageCapturedAndActionsNotFetched,
       1);
 }
 
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 1986cd6..efe401c8 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1807,11 +1807,36 @@
              "MediaAppImageMantis",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enables the Erase feature of Mantis
+BASE_FEATURE(kMediaAppImageMantisErase,
+             "MediaAppImageMantisErase",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
+// Enables the Expand Background feature of Mantis
+BASE_FEATURE(kMediaAppImageMantisExpandBackground,
+             "MediaAppImageMantisExpandBackground",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
+// Enables the Make A Sticker feature of Mantis
+BASE_FEATURE(kMediaAppImageMantisMakeASticker,
+             "MediaAppImageMantisMakeASticker",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 // When enabled, the specified model will be used with the Mantis feature
 BASE_FEATURE(kMediaAppImageMantisModel,
              "MediaAppImageMantisModel",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Enables the Reimagine feature of Mantis
+BASE_FEATURE(kMediaAppImageMantisReimagine,
+             "MediaAppImageMantisReimagine",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
+// Enables the Remove Background feature of Mantis
+BASE_FEATURE(kMediaAppImageMantisRemoveBackground,
+             "MediaAppImageMantisRemoveBackground",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 constexpr base::FeatureParam<MantisModel>::Option mantis_model_options[] = {
     {MantisModel::V1, "v1"},
     {MantisModel::V2, "v2"}};
@@ -2742,12 +2767,6 @@
              "FeatureManagementFeatureAwareDeviceDemoMode",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enabled the demo mode session to close GMSCore windows which disrupt
-// the attract loop videos.
-BASE_FEATURE(kDemoModeGMSCoreWindowCloser,
-             "DemoModeGMSCoreWindowCloser",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Disable the demo mode app orientation locked in landscape.
 BASE_FEATURE(kDemoModeAppLandscapeLocked,
              "DemoModeAppLandscapeLocked",
@@ -3522,10 +3541,6 @@
   return base::FeatureList::IsEnabled(kEapGtcWifiAuthentication);
 }
 
-bool IsDemoModeGMSCoreWindowCloserEnabled() {
-  return base::FeatureList::IsEnabled(kDemoModeGMSCoreWindowCloser);
-}
-
 bool IsDemoModeAppLandscapeLockedEnabled() {
   return base::FeatureList::IsEnabled(kDemoModeAppLandscapeLocked);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index bb495f0f..227b2a9 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -609,7 +609,16 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMacAddressRandomization);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMediaAppPdfMahi);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMediaAppImageMantis);
+COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMediaAppImageMantisErase);
+COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kMediaAppImageMantisExpandBackground);
+COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kMediaAppImageMantisMakeASticker);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kMediaAppImageMantisModel);
+COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kMediaAppImageMantisReimagine);
+COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kMediaAppImageMantisRemoveBackground);
 enum class MantisModel { V1, V2 };
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::FeatureParam<MantisModel> kMediaAppImageMantisModelParams;
@@ -883,8 +892,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kFeatureManagementFeatureAwareDeviceDemoMode);
 COMPONENT_EXPORT(ASH_CONSTANTS)
-BASE_DECLARE_FEATURE(kDemoModeGMSCoreWindowCloser);
-COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kDemoModeAppLandscapeLocked);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSideAlignedToasts);
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -1075,7 +1082,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsCryptauthAttestationSyncingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeepLinkingEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeGMSCoreWindowCloserEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeAppLandscapeLockedEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSignInEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeskButtonEnabled();
diff --git a/ash/display/cursor_window_controller.cc b/ash/display/cursor_window_controller.cc
index c7cfc08..a32cc68b 100644
--- a/ash/display/cursor_window_controller.cc
+++ b/ash/display/cursor_window_controller.cc
@@ -259,19 +259,13 @@
   }
 
   if (prefs->GetBoolean(prefs::kNightLightEnabled)) {
-    // All or some displays don't support setting a CRTC matrix, which means
-    // Night Light is using the composited color matrix, and hence software
+    // If the current display doesn't support setting a CRTC matrix,
+    // Night Light will be using the composited color matrix, and hence software
     // cursor should be used.
-    // TODO(afakhry): Instead of switching to the composited cursor on all
-    // displays if any of them don't support a CRTC matrix, we should provide
-    // the functionality to turn on the composited cursor on a per-display basis
-    // (i.e. use it only on the displays that don't support CRTC matrices).
-    const DisplayColorManager::DisplayCtmSupport displays_ctm_support =
-        shell->display_color_manager()->displays_ctm_support();
-    UMA_HISTOGRAM_ENUMERATION("Ash.NightLight.DisplayCrtcCtmSupport",
-                              displays_ctm_support);
-    if (displays_ctm_support != DisplayColorManager::DisplayCtmSupport::kAll)
+    if (!shell->display_color_manager()->HasColorCorrectionMatrix(
+            display_.id())) {
       return true;
+    }
   }
 
   if (prefs->GetBoolean(prefs::kAccessibilityLargeCursorEnabled)) {
diff --git a/ash/display/cursor_window_controller.h b/ash/display/cursor_window_controller.h
index b84f342..0e04589 100644
--- a/ash/display/cursor_window_controller.h
+++ b/ash/display/cursor_window_controller.h
@@ -71,7 +71,6 @@
   void UpdateContainer();
 
   // Sets the display on which to draw cursor.
-  // Only applicable when cursor compositing is enabled.
   void SetDisplay(const display::Display& display);
 
   // When the mouse starts or stops hovering/resizing the docked magnifier
diff --git a/ash/display/display_color_manager.cc b/ash/display/display_color_manager.cc
index e18fbec..d5ef06e8 100644
--- a/ash/display/display_color_manager.cc
+++ b/ash/display/display_color_manager.cc
@@ -70,19 +70,6 @@
   return nullptr;
 }
 
-bool HasColorCorrectionMatrix(display::DisplayConfigurator* configurator,
-                              int64_t display_id) {
-  for (const display::DisplaySnapshot* display_snapshot :
-       configurator->cached_displays()) {
-    if (display_snapshot->display_id() != display_id)
-      continue;
-
-    return display_snapshot->has_color_correction_matrix();
-  }
-
-  return false;
-}
-
 }  // namespace
 
 DisplayColorManager::DisplayColorManager(
@@ -100,10 +87,21 @@
   configurator_->RemoveObserver(this);
 }
 
+bool DisplayColorManager::HasColorCorrectionMatrix(int64_t display_id) {
+  for (const display::DisplaySnapshot* display_snapshot :
+       configurator_->cached_displays()) {
+    if (display_snapshot->display_id() == display_id) {
+      return display_snapshot->has_color_correction_matrix();
+    }
+  }
+
+  return false;
+}
+
 bool DisplayColorManager::SetDisplayColorTemperatureAdjustment(
     int64_t display_id,
     const display::ColorTemperatureAdjustment& cta) {
-  if (!HasColorCorrectionMatrix(configurator_, display_id)) {
+  if (!HasColorCorrectionMatrix(display_id)) {
     // This display doesn't support setting a CRTC matrix.
     return false;
   }
diff --git a/ash/display/display_color_manager.h b/ash/display/display_color_manager.h
index 2cb11db0..e4f6ca68 100644
--- a/ash/display/display_color_manager.h
+++ b/ash/display/display_color_manager.h
@@ -63,6 +63,10 @@
     return displays_ctm_support_;
   }
 
+  // Returns whether |display_id| has color correction matrix according to
+  // |configurator_|
+  bool HasColorCorrectionMatrix(int64_t display_id);
+
   // Sets the color temperature adjustment for |display_id|. Returns true if the
   // hardware supports this operation.
   bool SetDisplayColorTemperatureAdjustment(
diff --git a/ash/scanner/scanner_controller.cc b/ash/scanner/scanner_controller.cc
index f18da612..a71000c 100644
--- a/ash/scanner/scanner_controller.cc
+++ b/ash/scanner/scanner_controller.cc
@@ -594,12 +594,12 @@
   return scanner_session_.get();
 }
 
-void ScannerController::FetchActionsForImage(
+bool ScannerController::FetchActionsForImage(
     scoped_refptr<base::RefCountedMemory> jpeg_bytes,
     ScannerSession::FetchActionsCallback callback) {
   if (!scanner_session_) {
     std::move(callback).Run({});
-    return;
+    return false;
   }
 
   if (!mock_scanner_responses_for_testing_.empty()) {
@@ -609,6 +609,7 @@
   }
 
   scanner_session_->FetchActionsForImage(jpeg_bytes, std::move(callback));
+  return true;
 }
 
 void ScannerController::OnSessionUIClosed() {
diff --git a/ash/scanner/scanner_controller.h b/ash/scanner/scanner_controller.h
index 63fe57a..6a30d91c 100644
--- a/ash/scanner/scanner_controller.h
+++ b/ash/scanner/scanner_controller.h
@@ -74,10 +74,10 @@
   ScannerSession* StartNewSession();
 
   // Fetches Scanner actions that are available based on the current
-  // `scanner_session_` and the contents of `jpeg_bytes`. The actions are
-  // returned via `callback`. If no session is active, then `callback` will be
-  // run with an empty list of actions.
-  void FetchActionsForImage(scoped_refptr<base::RefCountedMemory> jpeg_bytes,
+  // `scanner_session_` and the contents of `jpeg_bytes`, and returns whether a
+  // session was active. The actions are returned via `callback`. If no session
+  // is active, then `callback` will be run with an empty list of actions.
+  bool FetchActionsForImage(scoped_refptr<base::RefCountedMemory> jpeg_bytes,
                             ScannerSession::FetchActionsCallback callback);
 
   // Should be called when the user has finished interacting with a Scanner
diff --git a/ash/scanner/scanner_controller_unittest.cc b/ash/scanner/scanner_controller_unittest.cc
index d118a54..6b4d4aa 100644
--- a/ash/scanner/scanner_controller_unittest.cc
+++ b/ash/scanner/scanner_controller_unittest.cc
@@ -738,8 +738,8 @@
               FetchActionsForImage)
       .WillOnce(RunOnceCallback<1>(std::move(output), manta::MantaStatus()));
 
-  scanner_controller->FetchActionsForImage(/*jpeg_bytes=*/nullptr,
-                                           actions_future.GetCallback());
+  EXPECT_TRUE(scanner_controller->FetchActionsForImage(
+      /*jpeg_bytes=*/nullptr, actions_future.GetCallback()));
 
   EXPECT_THAT(actions_future.Take(), ValueIs(SizeIs(1)));
 }
@@ -749,8 +749,8 @@
   ScannerController* scanner_controller = Shell::Get()->scanner_controller();
   ASSERT_TRUE(scanner_controller);
 
-  scanner_controller->FetchActionsForImage(/*jpeg_bytes=*/nullptr,
-                                           actions_future.GetCallback());
+  EXPECT_FALSE(scanner_controller->FetchActionsForImage(
+      /*jpeg_bytes=*/nullptr, actions_future.GetCallback()));
 
   EXPECT_THAT(actions_future.Take(), ValueIs(IsEmpty()));
 }
diff --git a/ash/scanner/scanner_metrics.h b/ash/scanner/scanner_metrics.h
index ecaf48d..f57fb4a8 100644
--- a/ash/scanner/scanner_metrics.h
+++ b/ash/scanner/scanner_metrics.h
@@ -60,9 +60,9 @@
   kConsentDisclaimerAccepted,
   kConsentDisclaimerRejected,
   kSunfishScreenEnteredViaShortcut,
-  kSunfishScreenInitialScreenCaptureSentToScannerServer,
+  kDeprecatedSunfishScreenInitialScreenCaptureSentToScannerServer,
   kScreenCaptureModeScannerButtonShown,
-  kScreenCaptureModeInitialScreenCaptureSentToScannerServer,
+  kDeprecatedScreenCaptureModeInitialScreenCaptureSentToScannerServer,
   kNoActionsDetected,
   kNewCalendarEventActionDetected,
   kNewCalendarEventActionFinishedSuccessfully,
@@ -104,7 +104,12 @@
   kLauncherShownWithoutSunfishSessionButton = 41,
   kLauncherShownWithSunfishSessionButton = 42,
 
-  kMaxValue = kLauncherShownWithSunfishSessionButton,
+  kSunfishSessionImageCapturedAndActionsNotFetched = 43,
+  kSunfishSessionImageCapturedAndActionsFetchStarted = 44,
+  kSmartActionsButtonImageCapturedAndActionsNotFetched = 45,
+  kSmartActionsButtonImageCapturedAndActionsFetchStarted = 46,
+
+  kMaxValue = kSmartActionsButtonImageCapturedAndActionsFetchStarted,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/ash/enums.xml:ScannerFeatureUserState)
 
diff --git a/ash/scanner/scanner_metrics_unittest.cc b/ash/scanner/scanner_metrics_unittest.cc
index 86d023b5..e0b0e58a 100644
--- a/ash/scanner/scanner_metrics_unittest.cc
+++ b/ash/scanner/scanner_metrics_unittest.cc
@@ -47,9 +47,9 @@
         kConsentDisclaimerAccepted,
         kConsentDisclaimerRejected,
         kSunfishScreenEnteredViaShortcut,
-        kSunfishScreenInitialScreenCaptureSentToScannerServer,
+        kDeprecatedSunfishScreenInitialScreenCaptureSentToScannerServer,
         kScreenCaptureModeScannerButtonShown,
-        kScreenCaptureModeInitialScreenCaptureSentToScannerServer,
+        kDeprecatedScreenCaptureModeInitialScreenCaptureSentToScannerServer,
         kNoActionsDetected,
         kNewCalendarEventActionDetected,
         kNewCalendarEventActionFinishedSuccessfully,
@@ -87,6 +87,10 @@
         kCanShowUiReturnedFalseDueToKioskMode,
         kLauncherShownWithoutSunfishSessionButton,
         kLauncherShownWithSunfishSessionButton,
+        kSunfishSessionImageCapturedAndActionsNotFetched,
+        kSunfishSessionImageCapturedAndActionsFetchStarted,
+        kSmartActionsButtonImageCapturedAndActionsNotFetched,
+        kSmartActionsButtonImageCapturedAndActionsFetchStarted,
     }));
 
 TEST_P(ScannerMetricsParameterisedTest, Record) {
diff --git a/ash/system/night_light/night_light_controller_unittest.cc b/ash/system/night_light/night_light_controller_unittest.cc
index 2eda1d7..a7a122d 100644
--- a/ash/system/night_light/night_light_controller_unittest.cc
+++ b/ash/system/night_light/night_light_controller_unittest.cc
@@ -1404,13 +1404,24 @@
   controller->SetColorTemperature(temperature);
   EXPECT_EQ(temperature, controller->GetColorTemperature());
 
+  ui::test::EventGenerator* generator = GetEventGenerator();
+
   // The first display supports CRTC matrix, so its compositor has identity
   // matrix.
   TestDisplayCompositorTemperature(kId1, 0.0f);
+  const display::Display& display_1 = display_manager()->GetDisplayForId(kId1);
+  generator->MoveMouseTo(display_1.bounds().CenterPoint());
+  // Cursor moves to display that supports CRTC matrix, thus it should be
+  // using hardware compositing.
+  EXPECT_FALSE(IsCursorCompositingEnabled());
+
   // However, the second display doesn't support CRTC matrix, Night Light is
   // using the compositor matrix on this display.
   TestDisplayCompositorTemperature(kId2, temperature);
-  // With mixed CRTC support, software cursor must be on.
+  const display::Display& display_2 = display_manager()->GetDisplayForId(kId2);
+  generator->MoveMouseTo(display_2.bounds().CenterPoint());
+  // Cursor moves to a display that doesn't support CRTC matrix, thus it should
+  // be using software compositing.
   EXPECT_TRUE(IsCursorCompositingEnabled());
 }
 
diff --git a/ash/webui/boca_ui/resources/app/client_delegate.ts b/ash/webui/boca_ui/resources/app/client_delegate.ts
index cb5c31e..e26df78e 100644
--- a/ash/webui/boca_ui/resources/app/client_delegate.ts
+++ b/ash/webui/boca_ui/resources/app/client_delegate.ts
@@ -203,8 +203,7 @@
         return {
           sessionConfig: getSessionConfigMojomToUI(result.session.config) as
               SessionConfig,
-          activity: getStudentActivityMojomToUI(result.session.activities) as
-              IdentifiedActivity[],
+          activity: getStudentActivityMojomToUI(result.session.activities),
         };
       },
       endSession: async () => {
diff --git a/ash/webui/color_internals/resources/index.ts b/ash/webui/color_internals/resources/index.ts
index a562a35..a489421 100644
--- a/ash/webui/color_internals/resources/index.ts
+++ b/ash/webui/color_internals/resources/index.ts
@@ -80,8 +80,7 @@
 
 async function populateTokenTable() {
   function addTokens(table: HTMLTableSectionElement, tokens: Token[]) {
-    Object.values(tokens).forEach(
-        t => appendTokenRowToTable(table, t as Token));
+    Object.values(tokens).forEach(t => appendTokenRowToTable(table, t));
   }
   const json = await requestJSON();
   const tokens = json as unknown as TokenArray;
diff --git a/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts b/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts
index 512e12f..d0abe57 100644
--- a/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts
+++ b/ash/webui/common/resources/cellular_setup/esim_flow_ui.ts
@@ -686,7 +686,7 @@
         if (!activationCodePage) {
           return false;
         }
-        return activationCodePage!.attemptToFocusOnPageContent();
+        return activationCodePage.attemptToFocusOnPageContent();
       case EsimUiState.PROFILE_SELECTION:
         const profileDiscoveryPage =
             this.shadowRoot!.querySelector<ProfileDiscoveryListPageElement>(
diff --git a/ash/webui/common/resources/cr_elements/cr_action_menu/cr_action_menu.ts b/ash/webui/common/resources/cr_elements/cr_action_menu/cr_action_menu.ts
index a818f879..bf0ca8d 100644
--- a/ash/webui/common/resources/cr_elements/cr_action_menu/cr_action_menu.ts
+++ b/ash/webui/common/resources/cr_elements/cr_action_menu/cr_action_menu.ts
@@ -289,7 +289,7 @@
       const delta = next ? 1 : -1;
       index = (numOptions + focusedIndex + delta) % numOptions;
     }
-    options[index]!.focus();
+    options[index].focus();
   }
 
   close() {
@@ -316,7 +316,7 @@
     // accurate for where the menu should be shown.
     this.anchorElement_.scrollIntoViewIfNeeded();
 
-    const rect = this.anchorElement_!.getBoundingClientRect();
+    const rect = this.anchorElement_.getBoundingClientRect();
 
     let height = rect.height;
     if (config && !config.noOffset &&
diff --git a/ash/webui/common/resources/cr_elements/cr_container_shadow_mixin.ts b/ash/webui/common/resources/cr_elements/cr_container_shadow_mixin.ts
index 29fbe60..5205b42 100644
--- a/ash/webui/common/resources/cr_elements/cr_container_shadow_mixin.ts
+++ b/ash/webui/common/resources/cr_elements/cr_container_shadow_mixin.ts
@@ -64,7 +64,7 @@
           this.sides_ = hasBottomShadow ?
               [CrContainerShadowSide.TOP, CrContainerShadowSide.BOTTOM] :
               [CrContainerShadowSide.TOP];
-          this.sides_!.forEach(side => {
+          this.sides_.forEach(side => {
             // The element holding the drop shadow effect to be shown.
             const shadow = document.createElement('div');
             shadow.id = `cr-container-shadow-${side}`;
diff --git a/ash/webui/common/resources/cr_elements/cr_dialog/cr_dialog.ts b/ash/webui/common/resources/cr_elements/cr_dialog/cr_dialog.ts
index e3638d2f..ee57287 100644
--- a/ash/webui/common/resources/cr_elements/cr_dialog/cr_dialog.ts
+++ b/ash/webui/common/resources/cr_elements/cr_dialog/cr_dialog.ts
@@ -334,7 +334,7 @@
     // Only show pulse animation if user left-clicked outside of the dialog
     // contents.
     if (e.button !== 0 ||
-        (e.composedPath()[0]! as HTMLElement).tagName !== 'DIALOG') {
+        (e.composedPath()[0] as HTMLElement).tagName !== 'DIALOG') {
       return;
     }
 
diff --git a/ash/webui/common/resources/cr_elements/cr_lottie/cr_lottie.ts b/ash/webui/common/resources/cr_elements/cr_lottie/cr_lottie.ts
index e0712e0..90e134d 100644
--- a/ash/webui/common/resources/cr_elements/cr_lottie/cr_lottie.ts
+++ b/ash/webui/common/resources/cr_elements/cr_lottie/cr_lottie.ts
@@ -279,10 +279,10 @@
     assert(!this.xhr_);
 
     this.xhr_ = new XMLHttpRequest();
-    this.xhr_!.open('GET', url, true);
-    this.xhr_!.responseType = responseType;
-    this.xhr_!.send();
-    this.xhr_!.onreadystatechange = () => {
+    this.xhr_.open('GET', url, true);
+    this.xhr_.responseType = responseType;
+    this.xhr_.send();
+    this.xhr_.onreadystatechange = () => {
       assert(this.xhr_);
       if (this.xhr_.readyState === 4 && this.xhr_.status === 200) {
         // |successCallback| might trigger another xhr, so we set to null before
diff --git a/ash/webui/common/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts b/ash/webui/common/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts
index 7c5510e..9e8f2aa 100644
--- a/ash/webui/common/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts
+++ b/ash/webui/common/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts
@@ -57,7 +57,7 @@
     const focusMovedFromOutside = e.relatedTarget === null ||
         !this.contains(e.relatedTarget as HTMLElement);
     if (focusMovedWithKeyboard && focusMovedFromOutside) {
-      this.getAllFocusableItems_()[0]!.focus();
+      this.getAllFocusableItems_()[0].focus();
     }
   }
 
@@ -82,12 +82,12 @@
           // If pressing Shift+Tab, immediately focus the first element so that
           // when the event is finished processing, the browser automatically
           // focuses the previous focusable element outside of the menu.
-          items[0]!.focus();
+          items[0].focus();
         } else {
           // If pressing Tab, immediately focus the last element so that when
           // the event is finished processing, the browser automatically focuses
           // the next focusable element outside of the menu.
-          items[items.length - 1]!.focus({preventScroll: true});
+          items[items.length - 1].focus({preventScroll: true});
         }
         return;
       case 'ArrowDown':
@@ -110,7 +110,7 @@
     }
 
     event.preventDefault();
-    items[newFocusedIndex]!.focus();
+    items[newFocusedIndex].focus();
   }
 }
 
diff --git a/ash/webui/common/resources/cr_elements/cr_radio_group/cr_radio_group.ts b/ash/webui/common/resources/cr_elements/cr_radio_group/cr_radio_group.ts
index 7e26968..a6920b42 100644
--- a/ash/webui/common/resources/cr_elements/cr_radio_group/cr_radio_group.ts
+++ b/ash/webui/common/resources/cr_elements/cr_radio_group/cr_radio_group.ts
@@ -174,7 +174,7 @@
       return;
     }
 
-    const radio = enabledRadios[selectedIndex]!;
+    const radio = enabledRadios[selectedIndex];
     const name = `${radio.name}`;
     if (this.selected !== name) {
       event.preventDefault();
@@ -224,10 +224,10 @@
       return result;
     }) as CrRadioButtonElement[];
     this.buttonEventTracker_.removeAll();
-    this.buttons_!.forEach(el => {
-      this.buttonEventTracker_!.add(
+    this.buttons_.forEach(el => {
+      this.buttonEventTracker_.add(
           el, 'disabled-changed', () => this.populate_());
-      this.buttonEventTracker_!.add(el, 'name-changed', () => this.populate_());
+      this.buttonEventTracker_.add(el, 'name-changed', () => this.populate_());
     });
     this.update_();
   }
diff --git a/ash/webui/common/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts b/ash/webui/common/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts
index ff7cbc6d..82a77fbb 100644
--- a/ash/webui/common/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts
+++ b/ash/webui/common/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts
@@ -387,12 +387,12 @@
     } else {
       const delta = moveDown ? 1 : -1;
       nextIndex = (numItems + currentIndex + delta) % numItems;
-      items[currentIndex]!.removeAttribute('selected_');
+      items[currentIndex].removeAttribute('selected_');
     }
-    items[nextIndex]!.setAttribute('selected_', '');
+    items[nextIndex].setAttribute('selected_', '');
     // The newly selected item might not be visible because the dropdown needs
     // to be scrolled. So scroll the dropdown if necessary.
-    items[nextIndex]!.scrollIntoViewIfNeeded();
+    items[nextIndex].scrollIntoViewIfNeeded();
   }
 
   private onInput_() {
diff --git a/ash/webui/common/resources/cr_elements/cr_slider/cr_slider.ts b/ash/webui/common/resources/cr_elements/cr_slider/cr_slider.ts
index 93ab566..3e9307f 100644
--- a/ash/webui/common/resources/cr_elements/cr_slider/cr_slider.ts
+++ b/ash/webui/common/resources/cr_elements/cr_slider/cr_slider.ts
@@ -41,7 +41,7 @@
   }
 
   const sliderTick = tick as SliderTick;
-  return sliderTick.ariaValue !== undefined ? sliderTick.ariaValue! :
+  return sliderTick.ariaValue !== undefined ? sliderTick.ariaValue :
                                               sliderTick.value;
 }
 
@@ -424,14 +424,14 @@
     const value = this.value;
     if (ticks && ticks.length > 0 && Number.isInteger(value) && value >= 0 &&
         value < ticks.length) {
-      const tick = ticks[this.value]!;
+      const tick = ticks[this.value];
       this.label_ = Number.isFinite(tick) ? '' : (tick as SliderTick).label;
       const ariaValueNow = getAriaValue(tick);
       this.setAttribute('aria-valuetext', String(this.label_ || ariaValueNow));
       this.setAttribute('aria-valuenow', ariaValueNow.toString());
-      this.setAttribute('aria-valuemin', getAriaValue(ticks[0]!).toString());
+      this.setAttribute('aria-valuemin', getAriaValue(ticks[0]).toString());
       this.setAttribute(
-          'aria-valuemax', getAriaValue(ticks.slice(-1)[0]!).toString());
+          'aria-valuemax', getAriaValue(ticks.slice(-1)[0]).toString());
     } else {
       this.setAttribute(
           'aria-valuetext', value !== undefined ? value.toString() : '');
diff --git a/ash/webui/common/resources/cr_elements/cr_tabs/cr_tabs.ts b/ash/webui/common/resources/cr_elements/cr_tabs/cr_tabs.ts
index 589b095..ac6eb84 100644
--- a/ash/webui/common/resources/cr_elements/cr_tabs/cr_tabs.ts
+++ b/ash/webui/common/resources/cr_elements/cr_tabs/cr_tabs.ts
@@ -105,11 +105,11 @@
       return;
     }
 
-    const oldTabRect = tabs[oldSelected]!.getBoundingClientRect();
-    const newTabRect = tabs[newSelected]!.getBoundingClientRect();
+    const oldTabRect = tabs[oldSelected].getBoundingClientRect();
+    const newTabRect = tabs[newSelected].getBoundingClientRect();
 
     const newIndicator =
-        tabs[newSelected]!.querySelector<HTMLElement>('.tab-indicator')!;
+        tabs[newSelected].querySelector<HTMLElement>('.tab-indicator')!;
     newIndicator.classList.remove('expand', 'contract');
 
     // Make new indicator look like it is the old indicator.
diff --git a/ash/webui/common/resources/cr_elements/find_shortcut_mixin.ts b/ash/webui/common/resources/cr_elements/find_shortcut_mixin.ts
index 5323e6b..bbd374e 100644
--- a/ash/webui/common/resources/cr_elements/find_shortcut_mixin.ts
+++ b/ash/webui/common/resources/cr_elements/find_shortcut_mixin.ts
@@ -51,7 +51,7 @@
     // should be called is the right before it in |listeners| such that the
     // goes from inner-most to outer-most.
     const index = focusIndex <= 0 ? listeners.length - 1 : focusIndex - 1;
-    if (listeners[index]!.handleFindShortcut(modalContextOpen)) {
+    if (listeners[index].handleFindShortcut(modalContextOpen)) {
       e.preventDefault();
     }
   });
diff --git a/ash/webui/common/resources/cr_elements/focus_row_mixin.ts b/ash/webui/common/resources/cr_elements/focus_row_mixin.ts
index db438e30..41a86eb 100644
--- a/ash/webui/common/resources/cr_elements/focus_row_mixin.ts
+++ b/ash/webui/common/resources/cr_elements/focus_row_mixin.ts
@@ -29,7 +29,7 @@
    * the focus event.
    */
   onFocus(_row: FocusRow, e: Event) {
-    const element = e.composedPath()[0]! as HTMLElement;
+    const element = e.composedPath()[0] as HTMLElement;
     const focusableElement = FocusRow.getFocusableElement(element);
     if (element !== focusableElement) {
       focusableElement.focus();
@@ -261,7 +261,7 @@
 
         private createObserver_(): MutationObserver {
           return new MutationObserver(mutations => {
-            const mutation = mutations[0]!;
+            const mutation = mutations[0];
             if (mutation.attributeName === 'style' && mutation.oldValue) {
               const newStyle =
                   window.getComputedStyle(mutation.target as Element);
@@ -271,9 +271,9 @@
                   mutation.oldValue.match(/^visibility:(.*)(?=;)/);
               // Return early if display and visibility have not changed.
               if (oldDisplayValue &&
-                  newStyle.display === oldDisplayValue[1]!.trim() &&
+                  newStyle.display === oldDisplayValue[1].trim() &&
                   oldVisibilityValue &&
-                  newStyle.visibility === oldVisibilityValue[1]!.trim()) {
+                  newStyle.visibility === oldVisibilityValue[1].trim()) {
                 return;
               }
             }
diff --git a/ash/webui/common/resources/cr_elements/localized_link/localized_link.ts b/ash/webui/common/resources/cr_elements/localized_link/localized_link.ts
index ace5a8f..27c929d 100644
--- a/ash/webui/common/resources/cr_elements/localized_link/localized_link.ts
+++ b/ash/webui/common/resources/cr_elements/localized_link/localized_link.ts
@@ -138,7 +138,7 @@
     assert(
         anchorTags.length === 1,
         'localized-link should contain exactly one anchor tag');
-    const anchorTag = anchorTags[0]!;
+    const anchorTag = anchorTags[0];
     anchorTag.setAttribute('aria-labelledby', ariaLabelledByIds.join(' '));
     anchorTag.tabIndex = this.linkDisabled ? -1 : 0;
 
diff --git a/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts b/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts
index 9d76c2a..3e8e9b55 100644
--- a/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts
+++ b/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts
@@ -47,10 +47,10 @@
   }
 
   connectedCallback() {
-    const tryAgainButton = this.$('#try-again-button')!;
-    const cancelButton = this.$('#cancel-button')!;
-    const okButton = this.$('#ok-button')!;
-    const quickOfficeButton = this.$('#quick-office-button')!;
+    const tryAgainButton = this.$('#try-again-button');
+    const cancelButton = this.$('#cancel-button');
+    const okButton = this.$('#ok-button');
+    const quickOfficeButton = this.$('#quick-office-button');
     tryAgainButton.addEventListener(
         'click', () => this.onTryAgainButtonClick());
     cancelButton.addEventListener('click', () => this.onCancelButtonClick());
@@ -59,16 +59,16 @@
         'click', () => this.onQuickOfficeButtonClick());
     document.addEventListener('keydown', this.onKeyDown.bind(this));
     if (this.enableRetryOption) {
-      this.$('#ok-button')!.style.display = 'none';
+      this.$('#ok-button').style.display = 'none';
     } else {
-      this.$('#try-again-button')!.style.display = 'none';
-      this.$('#cancel-button')!.style.display = 'none';
+      this.$('#try-again-button').style.display = 'none';
+      this.$('#cancel-button').style.display = 'none';
     }
     if (!this.enableQuickOfficeOption) {
-      this.$('#quick-office-button')!.style.display = 'none';
+      this.$('#quick-office-button').style.display = 'none';
     }
     if (this.reasonMessage === '') {
-      this.$('#reason-message')!.style.display = 'none';
+      this.$('#reason-message').style.display = 'none';
     }
   }
 
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_chip_text_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_chip_text_element.ts
index 14be52a..07f51d9 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_chip_text_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_chip_text_element.ts
@@ -110,7 +110,7 @@
   private changeChipText_(chipElement: HTMLElement, newText: string) {
     assert(!!chipElement);
     const currentChipWidth = chipElement.clientWidth;
-    const currentLetterElements = this.getLettersAsElements_(chipElement!);
+    const currentLetterElements = this.getLettersAsElements_(chipElement);
     // Animates the letters of old chip text out.
     for (let i = 0; i < currentLetterElements.length; i++) {
       this.animateLetterOut_(currentLetterElements, i);
@@ -120,7 +120,7 @@
     // value animation.
     setTimeout(() => {
       this.removeLetterElementsFromChip_(currentLetterElements.length);
-      chipElement!.innerHTML = sanitizeInnerHtml(newText);
+      chipElement.innerHTML = sanitizeInnerHtml(newText);
       const newLetterElements = this.getLettersAsElements_(chipElement);
       const newChipWidth = chipElement.clientWidth;
 
@@ -149,13 +149,13 @@
       }
       // Update the chip innerHTML with the new chip text value if its value is
       // not automatically updated.
-      if (chip!.innerHTML !== newText) {
-        chip!.innerHTML = sanitizeInnerHtml(newText);
+      if (chip.innerHTML !== newText) {
+        chip.innerHTML = sanitizeInnerHtml(newText);
       }
       return;
     }
-    chip!.innerHTML = sanitizeInnerHtml(oldText);
-    this.changeChipText_(chip!, newText);
+    chip.innerHTML = sanitizeInnerHtml(oldText);
+    this.changeChipText_(chip, newText);
   }
 }
 
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_freeform_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_freeform_element.ts
index 7bebee5..7e101f89 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_freeform_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_freeform_element.ts
@@ -12,6 +12,7 @@
 import 'chrome://resources/ash/common/personalization/wallpaper.css.js';
 
 import {assertNotReached} from 'chrome://resources/js/assert.js';
+import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
 import type {IronA11yKeysElement} from 'chrome://resources/polymer/v3_0/iron-a11y-keys/iron-a11y-keys.js';
 
 import type {SeaPenSamplePrompt} from './constants.js';
@@ -21,7 +22,7 @@
 import {logSamplePromptShuffleClicked, logSeaPenFreeformTabClicked} from './sea_pen_metrics_logger.js';
 import {WithSeaPenStore} from './sea_pen_store.js';
 import {SEA_PEN_SAMPLES} from './sea_pen_untranslated_constants.js';
-import {isArrayEqual, isNonEmptyArray, shuffle} from './sea_pen_utils.js';
+import {IronAnnounceEvent, isArrayEqual, isNonEmptyArray, shuffle} from './sea_pen_utils.js';
 
 export interface SeaPenFreeformElement {
   $: {
@@ -74,6 +75,11 @@
   private thumbnailResponseStatusCode_: MantaStatusCode|null;
   private thumbnails_: SeaPenThumbnail[]|null;
 
+  override ready() {
+    super.ready();
+    IronA11yAnnouncer.requestAvailability();
+  }
+
   override connectedCallback() {
     super.connectedCallback();
     this.watch<SeaPenFreeformElement['seaPenQuery_']>(
@@ -180,6 +186,8 @@
   private onShuffleClicked_(): void {
     logSamplePromptShuffleClicked();
     this.shuffleSamplePrompts_();
+    this.dispatchEvent(
+        new IronAnnounceEvent(this.i18n('ariaAnnounceSamplePromptsShuffled')));
   }
 
   private shuffleSamplePrompts_(): void {
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_images_element.html b/ash/webui/common/resources/sea_pen/sea_pen_images_element.html
index 6edf928..b34fd374 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_images_element.html
+++ b/ash/webui/common/resources/sea_pen/sea_pen_images_element.html
@@ -167,6 +167,9 @@
     top: -25px;
   }
 </style>
+<p id="generatedImageText" hidden>
+  [[i18n('seaPenAriaDescriptionGeneratedImage')]]
+</p>
 <template is="dom-if" if="[[showError_]]" restamp>
   <sea-pen-error thumbnail-response-status-code="[[thumbnailResponseStatusCode_]]"></sea-pen-error>
 </template>
@@ -196,7 +199,6 @@
     <iron-list id="grid"
         items="[[tiles_]]"
         grid
-        aria-labelledby="seaPenImagesHeading"
         aria-setsize$="[[tiles_.length]]"
         role="listbox">
       <template>
@@ -212,13 +214,16 @@
                 active="[[!isTileVisible_(item, thumbnailsLoading_)]]">
             </sparkle-placeholder>
           </div>
+          <p hidden id="latestTextQueryDescription">
+            [[getAriaDescription_(item, currentSelected_, pendingSelected_)]]
+          </p>
           <wallpaper-grid-item
               class="sea-pen-image fade-in-900ms"
               hidden$="[[!isTileVisible_(item, thumbnailsLoading_)]]"
               disabled="[[isThumbnailPendingSelected_(item, pendingSelected_)]]"
               index="[[index]]"
               data-sea-pen-image
-              aria-description$="[[getAriaDescription_(item, currentSelected_, pendingSelected_)]]"
+              aria-describedby="generatedImageText latestTextQueryDescription latestTextQueryHeading"
               aria-posinset$="[[getAriaIndex_(index)]]"
               on-wallpaper-grid-item-selected="onThumbnailSelected_"
               role="option"
@@ -253,20 +258,22 @@
           icon="sea-pen:info">
       </iron-icon>
       </h2>
-      <template is="dom-repeat" items="[[textQueryHistory_]]">
-        <h3 id="queryHistoryHeading[[index]]"
+      <template as="queryHistoryEntry"
+          index-as="queryHistoryIndex"
+          is="dom-repeat"
+          items="[[textQueryHistory_]]">
+        <h3 id$="queryHistoryHeading[[queryHistoryIndex]]"
             class="wallpaper-collections-heading query-history"
             on-click="onHistoryPromptClicked_"
             on-keypress="onHistoryPromptClicked_"
             role="button"
             tabindex="0">
-          [[item.query]]
+          [[queryHistoryEntry.query]]
         </h3>
-        <iron-list id="historyGrid[[index]]"
-            items="[[item.thumbnails]]"
+        <iron-list id="historyGrid[[queryHistoryIndex]]"
+            items="[[queryHistoryEntry.thumbnails]]"
             grid
-            aria-labelledby="queryHistoryHeading[[index]]"
-            aria-setsize$="[[item.thumbnails.length]]"
+            aria-setsize$="[[queryHistoryEntry.thumbnails.length]]"
             role="listbox">
           <template>
             <div class="thumbnail-item-container history-item">
@@ -276,12 +283,15 @@
                   restamp>
                 <sea-pen-image-loading></sea-pen-image-loading>
               </template>
+              <p hidden aria-hidden="true" id$="queryHistoryDescription[[queryHistoryIndex]]-[[index]]">
+                [[getAriaDescription_(item, currentSelected_, pendingSelected_)]]
+              </p>
               <wallpaper-grid-item
                   class="sea-pen-image fade-in-900ms"
                   disabled="[[isThumbnailPendingSelected_(item, pendingSelected_)]]"
                   index="[[index]]"
                   data-sea-pen-image
-                  aria-description$="[[getAriaDescription_(item, currentSelected_, pendingSelected_)]]"
+                  aria-describedby$="generatedImageText queryHistoryDescription[[queryHistoryIndex]]-[[index]] queryHistoryHeading[[queryHistoryIndex]]"
                   aria-posinset$="[[getAriaIndex_(index)]]"
                   on-wallpaper-grid-item-selected="onThumbnailSelected_"
                   role="option"
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_images_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_images_element.ts
index 84a4c9c..f90519f 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_images_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_images_element.ts
@@ -399,8 +399,8 @@
 
     if (this.cameraFeed_) {
       // Attached cameraFeed_ to the selected image.
-      const item = ((event.target as Element)!.shadowRoot as
-                    ShadowRoot)!.querySelector<HTMLElement>('.item')!;
+      const item = ((event.target as Element).shadowRoot as ShadowRoot)
+                       .querySelector<HTMLElement>('.item')!;
       this.cameraFeed_.remove();
       item.appendChild(this.cameraFeed_);
       this.cameraFeed_.width = item.clientWidth;
@@ -539,10 +539,11 @@
     return !thumbnailsLoading && isNonEmptyArray(textQueryHistory);
   }
 
-  private onHistoryPromptClicked_(e: Event&
-                                  {model: {item: TextQueryHistoryEntry}}) {
+  private onHistoryPromptClicked_(e: Event&{
+    model: {queryHistoryEntry: TextQueryHistoryEntry}
+  }) {
     this.dispatchEvent(
-        new SeaPenHistoryPromptSelectedEvent(e.model.item.query));
+        new SeaPenHistoryPromptSelectedEvent(e.model.queryHistoryEntry.query));
   }
 
   private onLatestTextQueryClicked_() {
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_metrics_logger.ts b/ash/webui/common/resources/sea_pen/sea_pen_metrics_logger.ts
index 8b16fac..c123c64 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_metrics_logger.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_metrics_logger.ts
@@ -33,7 +33,7 @@
   if (templateId === QUERY) {
     return isPersonalizationApp() ? WALLPAPER_FREEFORM : VC_BACKGROUND_FREEFORM;
   }
-  return templateId as SeaPenTemplateId;
+  return templateId;
 }
 
 // Numerical values are used for metrics; do not change or reuse values.
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_options_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_options_element.ts
index 25eb8dd..cfd4e0e 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_options_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_options_element.ts
@@ -153,7 +153,7 @@
         } else if (this.isHiddenChipOptionSelected_()) {
           // If the next option is hidden, select and focus the expand button.
           const expandButton = selector.querySelector('#expandButton');
-          selector.selectIndex(selector.indexOf(expandButton!));
+          selector.selectIndex(selector.indexOf(expandButton));
         }
         break;
       case 'esc':
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts
index 13e9b9d..ff8dfa4 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts
@@ -308,11 +308,11 @@
       const index = parseInt(id, 10);
       const menuElement =
           this.shadowRoot!.querySelectorAll('cr-action-menu')[index];
-      menuElement!.showAtPosition(config);
+      menuElement.showAtPosition(config);
       // focus on the top menu item first.
-      const menuItems = menuElement!.querySelectorAll<HTMLElement>(
+      const menuItems = menuElement.querySelectorAll<HTMLElement>(
           '.dropdown-item:not([hidden]):not(.more-like-this-option)');
-      menuItems![0].focus();
+      menuItems[0].focus();
     }
   }
 
@@ -378,12 +378,12 @@
           this.shadowRoot!.querySelectorAll<HTMLElement>(
               '.recent-image-container:not([hidden])');
       const recentImage =
-          recentImageContainers![index].querySelector<HTMLElement>(
+          recentImageContainers[index].querySelector<HTMLElement>(
               '.sea-pen-image');
       recentImage!.setAttribute('tabindex', '0');
       recentImage!.focus();
       const menuIconButton =
-          recentImageContainers![index].querySelector<HTMLElement>(
+          recentImageContainers[index].querySelector<HTMLElement>(
               '.menu-icon-button');
       menuIconButton!.setAttribute('tabindex', '0');
     });
@@ -448,7 +448,7 @@
       const menuButtons =
           this.shadowRoot!.querySelectorAll<HTMLElement>('.menu-icon-button');
       if (menuId !== null && menuButtons.length > menuId + 1) {
-        menuButtons[menuId]!.focus();
+        menuButtons[menuId].focus();
       }
     });
   }
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_suggestions_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_suggestions_element.ts
index cd9ffba6..2a9cf68 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_suggestions_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_suggestions_element.ts
@@ -15,6 +15,8 @@
 
 import type {CrButtonElement} from 'chrome://resources/ash/common/cr_elements/cr_button/cr_button.js';
 import {assert} from 'chrome://resources/js/assert.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
 import type {IronA11yKeysElement} from 'chrome://resources/polymer/v3_0/iron-a11y-keys/iron-a11y-keys.js';
 import type {IronSelectorElement} from 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
 import {afterNextRender, Debouncer, PolymerElement, timeOut} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -22,7 +24,7 @@
 import {logSuggestionClicked, logSuggestionShuffleClicked} from './sea_pen_metrics_logger.js';
 import {getTemplate} from './sea_pen_suggestions_element.html.js';
 import {SEA_PEN_SUGGESTIONS} from './sea_pen_untranslated_constants.js';
-import {isArrayEqual, isNonEmptyArray, shuffle} from './sea_pen_utils.js';
+import {IronAnnounceEvent, isArrayEqual, isNonEmptyArray, shuffle} from './sea_pen_utils.js';
 
 const seaPenSuggestionSelectedEvent = 'sea-pen-suggestion-selected';
 
@@ -88,6 +90,7 @@
 
   override ready() {
     super.ready();
+    IronA11yAnnouncer.requestAvailability();
     this.$.keys.target = this.$.suggestionSelector;
   }
 
@@ -144,6 +147,8 @@
   private onShuffleClicked_() {
     logSuggestionShuffleClicked();
     this.shuffleSuggestions_();
+    this.dispatchEvent(new IronAnnounceEvent(
+        loadTimeData.getString('ariaAnnouncePromptSuggestionsShuffled')));
   }
 
   private shuffleSuggestions_() {
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_utils.ts b/ash/webui/common/resources/sea_pen/sea_pen_utils.ts
index 18c01e6a..4aa4b21b 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_utils.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_utils.ts
@@ -226,3 +226,18 @@
   return arr1.length === arr2.length &&
       arr1.every((value, index) => value === arr2[index]);
 }
+
+/**
+ * Announces the given message to users when screen reader is enabled.
+ */
+export class IronAnnounceEvent extends CustomEvent<{text: string}> {
+  constructor(message: string) {
+    super('iron-announce', {
+      bubbles: true,
+      composed: true,
+      detail: {
+        text: message,
+      },
+    });
+  }
+}
diff --git a/ash/webui/common/sea_pen_resources.cc b/ash/webui/common/sea_pen_resources.cc
index 287a946..119b7f3a 100644
--- a/ash/webui/common/sea_pen_resources.cc
+++ b/ash/webui/common/sea_pen_resources.cc
@@ -62,6 +62,8 @@
        IDS_SEA_PEN_INTRODUCTION_DIALOG_CLOSE_BUTTON},
       {"seaPenFreeformWallpaperLabel", IDS_SEA_PEN_FREEFORM_WALLPAPER_LABEL},
       {"seaPenTemplatesWallpaperLabel", IDS_SEA_PEN_TEMPLATES_WALLPAPER_LABEL},
+      {"seaPenAriaDescriptionGeneratedImage",
+       IDS_SEA_PEN_ARIA_DESCRIPTION_GENERATED_IMAGE},
       {"seaPenFreeformSamplePromptsLabel",
        IDS_SEA_PEN_FREEFORM_SAMPLE_PROMPTS_LABEL},
       {"seaPenFreeformResultsLabel", IDS_SEA_PEN_FREEFORM_RESULTS_LABEL},
@@ -93,6 +95,10 @@
       {"seaPenDismissError", IDS_PERSONALIZATION_APP_DISMISS},
       {"ariaLabelLoading", IDS_PERSONALIZATION_APP_ARIA_LABEL_LOADING},
       {"seaPenManagedLabel", IDS_ASH_ENTERPRISE_DEVICE_MANAGED_SHORT},
+      {"ariaAnnounceSamplePromptsShuffled",
+       IDS_SEA_PEN_ARIA_ANNOUNCE_SAMPLE_PROMPTS_SHUFFLED},
+      {"ariaAnnouncePromptSuggestionsShuffled",
+       IDS_SEA_PEN_ARIA_ANNOUNCE_SUGGESTIONS_SHUFFLED},
   };
   source->AddLocalizedStrings(kLocalizedStrings);
 }
diff --git a/ash/webui/diagnostics_ui/resources/input_card.ts b/ash/webui/diagnostics_ui/resources/input_card.ts
index 5870e7d6..b28cdd3 100644
--- a/ash/webui/diagnostics_ui/resources/input_card.ts
+++ b/ash/webui/diagnostics_ui/resources/input_card.ts
@@ -134,7 +134,7 @@
   private getDeviceTestability(device: KeyboardInfo|TouchDeviceInfo): boolean {
     // If the device has the key 'testable', we check its testable state.
     if ('testable' in device) {
-      return (device as TouchDeviceInfo).testable;
+      return (device).testable;
     }
 
     if (this.isInternalKeyboard(device)) {
diff --git a/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts b/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts
index 9bad319..52d25f1 100644
--- a/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts
+++ b/ash/webui/diagnostics_ui/resources/touchscreen_tester.ts
@@ -208,8 +208,9 @@
 
     // CSS in .html file does not have access to this element,
     // therefore adjust it here to make the canvas cover the whole screen.
-    const topContainer = this.getDialog(DialogType.CANVAS)!.shadowRoot!
-                             .querySelector<HTMLElement>('.top-container');
+    const topContainer =
+        this.getDialog(DialogType.CANVAS)
+            .shadowRoot!.querySelector<HTMLElement>('.top-container');
     topContainer!.style.display = 'none';
 
     const ctx = canvas.getContext('2d');
diff --git a/ash/webui/media_app_ui/media_app_ui_untrusted.mojom b/ash/webui/media_app_ui/media_app_ui_untrusted.mojom
index 3ece443c..faf488e 100644
--- a/ash/webui/media_app_ui/media_app_ui_untrusted.mojom
+++ b/ash/webui/media_app_ui/media_app_ui_untrusted.mojom
@@ -181,13 +181,22 @@
   // byte arrays containing the encoded format of an image (e.g., PNG, JPEG)
   // with the same dimension. Inpainting is similar with Generative Fill without
   // a `text` prompt, where it tries to fill the image by reconstructing the
-  // "lost" part of the `image`. Also refer to "Expand background" section which
-  // is a special case of Inpainting where the mask is in the boundaries of the
-  // `image` http://go/mantis-bl-dd#heading=h.usc6s0rg999w.
+  // "lost" part of the `image`.
   // TODO(http://crbug.com/370820145): change the opaque `array<uint8>` type.
   InpaintImage(array<uint8> image, array<uint8> mask, uint32 seed)
       => (mantis.mojom.MantisResult result);
 
+
+  // Outpaints the image based on the `mask` and `seed`. Pass the same `seed`
+  // across method calls to get identical result. The `image` and `mask` are
+  // byte arrays containing the encoded format of an image (e.g., PNG, JPEG)
+  // with the same dimension. Outpainting, also known as "Expand background" is
+  // a special case of Inpainting where the mask is in the boundaries of the
+  // `image` http://go/mantis-bl-dd#heading=h.usc6s0rg999w.
+  // TODO(http://crbug.com/370820145): change the opaque `array<uint8>` type.
+  OutpaintImage(array<uint8> image, array<uint8> mask, uint32 seed)
+      => (mantis.mojom.MantisResult result);
+
   // Classifies image for Trust & Safety checking. Refer to "Trust & safety
   // check" subsection of "Entry point" for more details
   // http://go/mantis-bl-dd#heading=h.dqo8t5p2bpij.
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.ts b/ash/webui/os_feedback_ui/resources/feedback_flow.ts
index a80a03c..7a46315 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_flow.ts
+++ b/ash/webui/os_feedback_ui/resources/feedback_flow.ts
@@ -369,10 +369,10 @@
       //   }
       // ].
       assert('EXTRA_DIAGNOSTICS' === feedbackInfo.systemInformation[0].key);
-      this.feedbackContext!.extraDiagnostics =
+      this.feedbackContext.extraDiagnostics =
           feedbackInfo.systemInformation[0].value;
     }
-    this.isUserLoggedIn = this.feedbackContext!.categoryTag !== 'Login';
+    this.isUserLoggedIn = this.feedbackContext.categoryTag !== 'Login';
     this.onFeedbackContextReceived();
   }
 
diff --git a/ash/webui/os_feedback_ui/resources/search_page.ts b/ash/webui/os_feedback_ui/resources/search_page.ts
index 4859f95e..31fb672c 100644
--- a/ash/webui/os_feedback_ui/resources/search_page.ts
+++ b/ash/webui/os_feedback_ui/resources/search_page.ts
@@ -292,7 +292,7 @@
     if (querySeqNo > this.lastPostedQuerySeqNo) {
       this.lastPostedQuerySeqNo = querySeqNo;
       // TODO(xiangdongkong): Use Mojo to communicate with untrusted page.
-      this.iframe!.contentWindow!.postMessage(
+      this.iframe.contentWindow!.postMessage(
           data, OS_FEEDBACK_UNTRUSTED_ORIGIN);
     }
   }
diff --git a/ash/webui/personalization_app/resources/js/ambient/toggle_row_element.ts b/ash/webui/personalization_app/resources/js/ambient/toggle_row_element.ts
index e74f68f..be1e006 100644
--- a/ash/webui/personalization_app/resources/js/ambient/toggle_row_element.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/toggle_row_element.ts
@@ -61,7 +61,7 @@
 
   private onAmbientModeToggled_(event: Event) {
     const toggleButton = event.currentTarget as CrToggleElement;
-    const ambientModeEnabled = toggleButton!.checked;
+    const ambientModeEnabled = toggleButton.checked;
     setAmbientModeEnabled(
         ambientModeEnabled, getAmbientProvider(), this.getStore());
   }
diff --git a/ash/webui/personalization_app/resources/js/user/user_selectors.ts b/ash/webui/personalization_app/resources/js/user/user_selectors.ts
index 3df5e1f7..685125e 100644
--- a/ash/webui/personalization_app/resources/js/user/user_selectors.ts
+++ b/ash/webui/personalization_app/resources/js/user/user_selectors.ts
@@ -40,7 +40,7 @@
       bytes = new Uint8Array(value.bytes);
     } else {
       assert(!!value.sharedMemory, 'sharedMemory must be defined here');
-      const sharedMemory = value.sharedMemory!;
+      const sharedMemory = value.sharedMemory;
       const {buffer, result} =
           sharedMemory.bufferHandle.mapBuffer(0, sharedMemory.size);
       assert(result === Mojo.RESULT_OK, 'Could not map buffer');
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_by_album_id_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_by_album_id_element.ts
index 97346552..a63a9ee 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_by_album_id_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_by_album_id_element.ts
@@ -377,9 +377,9 @@
     // NOTE: Old clients may not support |dedupKey| when setting Google Photos
     // wallpaper, so use |id| in such cases for backwards compatibility.
     if (isGooglePhotosPhoto(pendingSelected) &&
-        ((pendingSelected!.dedupKey &&
-          isImageAMatchForKey(photo, pendingSelected!.dedupKey)) ||
-         isImageAMatchForKey(photo, pendingSelected!.id))) {
+        ((pendingSelected.dedupKey &&
+          isImageAMatchForKey(photo, pendingSelected.dedupKey)) ||
+         isImageAMatchForKey(photo, pendingSelected.id))) {
       return true;
     }
     if (!pendingSelected && !!currentSelected &&
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_element.ts
index 4e24637..9b5d25a4 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_photos_element.ts
@@ -575,9 +575,9 @@
     // NOTE: Old clients may not support |dedupKey| when setting Google Photos
     // wallpaper, so use |id| in such cases for backwards compatibility.
     if (isGooglePhotosPhoto(pendingSelected) &&
-        ((pendingSelected!.dedupKey &&
-          isImageAMatchForKey(photo, pendingSelected!.dedupKey)) ||
-         isImageAMatchForKey(photo, pendingSelected!.id))) {
+        ((pendingSelected.dedupKey &&
+          isImageAMatchForKey(photo, pendingSelected.dedupKey)) ||
+         isImageAMatchForKey(photo, pendingSelected.id))) {
       return true;
     }
     if (!pendingSelected && !!currentSelected &&
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts
index 6d18145..4a7dabb 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts
@@ -63,7 +63,7 @@
     isDarkModeActive: boolean, images: WallpaperImage[]): ImageTile[] {
   const tileMap = images.reduce((result, next) => {
     if (result.has(next.unitId)) {
-      const tile = result.get(next.unitId)! as ImageTile;
+      const tile = result.get(next.unitId)!;
       if (!tile.hasPreviewImage) {
         tile.preview.push(next.url);
       }
@@ -75,7 +75,7 @@
     }
     // Populate the assetId and attribution based on image type and system's
     // color mode.
-    const tile = result.get(next.unitId)! as ImageTile;
+    const tile = result.get(next.unitId)!;
     switch (next.type) {
       case OnlineImageType.kLight:
         if (!isDarkModeActive) {
@@ -277,7 +277,7 @@
       return getLoadingPlaceholders(() => 1);
     }
 
-    const imageArr = images[collectionId]!;
+    const imageArr = images[collectionId];
     return getImageTiles(isDarkModeActive, imageArr);
   }
 
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts
index 1bb8f2f..af51cbc 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts
@@ -292,7 +292,7 @@
     switch (path) {
       // Hide button when viewing a different collection.
       case Paths.COLLECTION_IMAGES:
-        if (!imagesByCollectionId![collectionId!]) {
+        if (!imagesByCollectionId[collectionId]) {
           return false;
         }
         const imageIsInCollection = imagesByCollectionId[collectionId]?.find(
diff --git a/ash/webui/print_preview_cros/resources/js/data/print_ticket_manager.ts b/ash/webui/print_preview_cros/resources/js/data/print_ticket_manager.ts
index 905e6e2..bd1a022 100644
--- a/ash/webui/print_preview_cros/resources/js/data/print_ticket_manager.ts
+++ b/ash/webui/print_preview_cros/resources/js/data/print_ticket_manager.ts
@@ -129,7 +129,7 @@
 
     // TODO(b/323421684): Handle result from page handler and update UI if error
     // occurred.
-    this.printPreviewPageHandler!.print(this.printTicket).finally(() => {
+    this.printPreviewPageHandler.print(this.printTicket).finally(() => {
       this.printRequestInProgress = false;
       this.dispatchEvent(createCustomEvent(PRINT_REQUEST_FINISHED_EVENT));
     });
@@ -138,7 +138,7 @@
   // Does cleanup for print request.
   cancelPrintRequest(): void {
     assert(this.printPreviewPageHandler);
-    this.printPreviewPageHandler!.cancel();
+    this.printPreviewPageHandler.cancel();
   }
 
   // Returns current print ticket.
@@ -169,7 +169,7 @@
       return;
     }
 
-    if (this.printTicket!.destinationId === '') {
+    if (this.printTicket.destinationId === '') {
       this.updateDestinationFields(activeDest.id, /*manuallySelected=*/ false);
     }
 
@@ -212,7 +212,7 @@
     this.printTicket.printerType = source.printerType;
     this.printTicket.printerStatusReason =
         source.printerStatusReason || PrinterStatusReason.UNKNOWN_REASON;
-    this.printTicket!.printerManuallySelected = manuallySelected;
+    this.printTicket.printerManuallySelected = manuallySelected;
   }
 }
 
diff --git a/ash/webui/print_preview_cros/resources/js/destination_dropdown.ts b/ash/webui/print_preview_cros/resources/js/destination_dropdown.ts
index 17d87c9ae..9e36b6d8 100644
--- a/ash/webui/print_preview_cros/resources/js/destination_dropdown.ts
+++ b/ash/webui/print_preview_cros/resources/js/destination_dropdown.ts
@@ -99,7 +99,7 @@
     }
 
     const destinationUpdated =
-        this.controller.updateActiveDestination(row.destination!.id);
+        this.controller.updateActiveDestination(row.destination.id);
     if (destinationUpdated) {
       // Immediately update UI to display selected destination.
       this.selectedDestination = row.destination;
diff --git a/ash/webui/recorder_app_ui/recorder_app_ui.cc b/ash/webui/recorder_app_ui/recorder_app_ui.cc
index 4681a8f..52a0a02 100644
--- a/ash/webui/recorder_app_ui/recorder_app_ui.cc
+++ b/ash/webui/recorder_app_ui/recorder_app_ui.cc
@@ -337,6 +337,24 @@
   std::move(callback).Run(std::move(model_info));
 }
 
+void RecorderAppUI::LoadModelResultCallback(
+    const base::Uuid& model_id,
+    LoadModelCallback callback,
+    on_device_model::mojom::LoadModelResult result) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // TODO: b/366335321 - Propagate need-reboot error from on-device model
+  // service to UI side.
+  if (result != on_device_model::mojom::LoadModelResult::kSuccess) {
+    UpdateModelState(
+        model_id, {recorder_app::mojom::ModelStateType::kError, std::nullopt});
+  } else {
+    UpdateModelState(model_id, {recorder_app::mojom::ModelStateType::kInstalled,
+                                std::nullopt});
+  }
+  std::move(callback).Run(result);
+}
+
 void RecorderAppUI::LoadModel(
     const base::Uuid& model_id,
     mojo::PendingReceiver<on_device_model::mojom::OnDeviceModel> model,
@@ -362,7 +380,10 @@
 
   on_device_model_service_->LoadPlatformModel(
       model_id, std::move(model),
-      progress_receiver.InitWithNewPipeAndPassRemote(), std::move(callback));
+      progress_receiver.InitWithNewPipeAndPassRemote(),
+      base::BindOnce(&RecorderAppUI::LoadModelResultCallback,
+                     weak_ptr_factory_.GetWeakPtr(), model_id,
+                     std::move(callback)));
 
   model_progress_receivers_.Add(this, std::move(progress_receiver), model_id);
 
diff --git a/ash/webui/recorder_app_ui/recorder_app_ui.h b/ash/webui/recorder_app_ui/recorder_app_ui.h
index 4be3aac..4f6f5697 100644
--- a/ash/webui/recorder_app_ui/recorder_app_ui.h
+++ b/ash/webui/recorder_app_ui/recorder_app_ui.h
@@ -103,6 +103,10 @@
 
   void UpdateModelState(const base::Uuid& model_id, ModelState state);
 
+  void LoadModelResultCallback(const base::Uuid& model_id,
+                               LoadModelCallback callback,
+                               on_device_model::mojom::LoadModelResult result);
+
   void GetMicrophoneInfoWithDeviceId(
       GetMicrophoneInfoCallback callback,
       const std::optional<std::string>& device_id);
diff --git a/ash/webui/recorder_app_ui/resources/core/utils/type_utils.ts b/ash/webui/recorder_app_ui/resources/core/utils/type_utils.ts
index f447a99..408ba31 100644
--- a/ash/webui/recorder_app_ui/resources/core/utils/type_utils.ts
+++ b/ash/webui/recorder_app_ui/resources/core/utils/type_utils.ts
@@ -18,7 +18,7 @@
  */
 export function forceCast<T>(x: unknown): T {
   // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
-  return x as unknown as T;
+  return x as T;
 }
 
 /*
diff --git a/ash/webui/recorder_app_ui/resources/pages/record-page.ts b/ash/webui/recorder_app_ui/resources/pages/record-page.ts
index a9960fe..5d9127f 100644
--- a/ash/webui/recorder_app_ui/resources/pages/record-page.ts
+++ b/ash/webui/recorder_app_ui/resources/pages/record-page.ts
@@ -373,8 +373,14 @@
 
   private readonly microphoneManager = useMicrophoneManager();
 
+  private readonly transcriptionAvailable = computed(
+    () => this.platformHandler.isSodaAvailable(),
+  );
+
+  // Shows transcription panel by default if transcription is available.
   // TODO: b/336963138 - Handle when transcription isn't available.
-  private readonly transcriptionShown = signal(false);
+  private readonly transcriptionShown =
+    signal(this.transcriptionAvailable.value);
 
   private readonly transcriptionEnabled = computed(
     () =>
@@ -392,10 +398,6 @@
     this.globalSpeakerLabelEnabled.value,
   );
 
-  private readonly transcriptionAvailable = computed(
-    () => this.platformHandler.isSodaAvailable(),
-  );
-
   private readonly selectedLanguage = computed(
     () => this.platformHandler.getSelectedLanguage(),
   );
@@ -981,6 +983,7 @@
         @click=${this.toggleTranscriptionShown}
         aria-expanded=${this.transcriptionShown.value}
         aria-label=${transcriptButtonTooltip}
+        ?selected=${this.transcriptionShown.value}
         ${withTooltip()}
       >
         <cra-icon slot="icon" name="notes"></cra-icon>
diff --git a/ash/webui/shimless_rma/resources/reimaging_device_information_page.ts b/ash/webui/shimless_rma/resources/reimaging_device_information_page.ts
index 5e16fb78..a31873fe 100644
--- a/ash/webui/shimless_rma/resources/reimaging_device_information_page.ts
+++ b/ash/webui/shimless_rma/resources/reimaging_device_information_page.ts
@@ -324,7 +324,7 @@
             const customLabelSelect: HTMLSelectElement|null =
                 this.shadowRoot!.querySelector('#customLabelSelect');
             assert(customLabelSelect);
-            customLabelSelect!.selectedIndex = this.customLabelIndex;
+            customLabelSelect.selectedIndex = this.customLabelIndex;
           });
         });
   }
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.ts b/ash/webui/shimless_rma/resources/shimless_rma.ts
index 2ad08c2..3978a4ec 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma.ts
+++ b/ash/webui/shimless_rma/resources/shimless_rma.ts
@@ -781,7 +781,7 @@
       return;
     }
 
-    component!.allButtonsDisabled = this.allButtonsDisabled;
+    component.allButtonsDisabled = this.allButtonsDisabled;
   }
 
   updateButtonState(buttonName: string, buttonState: ButtonState): void {
@@ -802,15 +802,15 @@
     const page = this.loadComponent(this.currentPage.componentIs);
     assert(page, 'Could not find page ' + this.currentPage.componentIs);
     assert(
-        page!.onNextButtonClick,
+        page.onNextButtonClick,
         'No onNextButtonClick for ' + this.currentPage.componentIs);
     assert(
-        typeof page!.onNextButtonClick === 'function',
+        typeof page.onNextButtonClick === 'function',
         'onNextButtonClick not a function for ' + this.currentPage.componentIs);
     this.nextButtonClicked = true;
     this.setAllButtonsState(
         /* shouldDisableButtons= */ true, /* showBusyStateOverlay= */ true);
-    page!.onNextButtonClick()
+    page.onNextButtonClick()
         .then((stateResult) => {
           this.processStateResult(stateResult);
         })
@@ -855,7 +855,7 @@
     // Show exit button spinner on the landing page
     const currentPageComponent =
         this.loadComponent(this.currentPage.componentIs);
-    currentPageComponent!.confirmExitButtonClicked = true;
+    currentPageComponent.confirmExitButtonClicked = true;
 
     this.setAllButtonsState(
         /* shouldDisableButtons= */ true, /* showBusyStateOverlay= */ true);
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_util.ts b/ash/webui/shimless_rma/resources/shimless_rma_util.ts
index 804d95a6..a13fade 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma_util.ts
+++ b/ash/webui/shimless_rma/resources/shimless_rma_util.ts
@@ -90,7 +90,7 @@
  */
 export function focusPageTitle(element: HTMLElement): void {
   const pageTitle: HTMLHeadingElement|null =
-      element!.shadowRoot!.querySelector('h1');
+      element.shadowRoot!.querySelector('h1');
   assert(pageTitle);
   afterNextRender(element, () => {
     pageTitle.focus();
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_edit_dialog.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_edit_dialog.ts
index 2899b88..de50942 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_edit_dialog.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_edit_dialog.ts
@@ -237,7 +237,7 @@
     const container =
         accelItem.shadowRoot!.querySelector<HTMLElement>('#container');
     assert(container);
-    container!.focus();
+    container.focus();
   }
 
   private focusAddOrDone(): void {
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts
index 5e4eeea..37e912ea 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts
@@ -102,7 +102,7 @@
     // individual subsections. An atomic replacement makes ensures each
     // subsection's accelerators are kept distinct from each other.
     const tempAccelRowData: AcceleratorRowData[] = [];
-    layoutInfos!.forEach((layoutInfo) => {
+    layoutInfos.forEach((layoutInfo) => {
       if (this.lookupManager.isStandardAccelerator(layoutInfo.style)) {
         const acceleratorInfos =
             this.lookupManager
diff --git a/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts b/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts
index f773e5e8e7..a9bcb73 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts
@@ -446,7 +446,7 @@
  */
 export const getAriaLabelForTextAccelerators =
     (acceleratorInfos: TextAcceleratorInfo[]): string => {
-      return getTextAcceleratorParts(acceleratorInfos as TextAcceleratorInfo[])
+      return getTextAcceleratorParts(acceleratorInfos)
           .map(part => getKeyDisplay(mojoString16ToString(part.text)))
           .join('');
     };
diff --git a/ash/wm/native_cursor_manager_ash.cc b/ash/wm/native_cursor_manager_ash.cc
index 3a3180f5..7a9cc6eb 100644
--- a/ash/wm/native_cursor_manager_ash.cc
+++ b/ash/wm/native_cursor_manager_ash.cc
@@ -86,6 +86,9 @@
       ->window_tree_host_manager()
       ->cursor_window_controller()
       ->SetDisplay(display);
+
+  // Update cursor compositing based on the current display.
+  Shell::Get()->UpdateCursorCompositingEnabled();
 }
 
 void NativeCursorManagerAsh::SetCursor(
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 29bb963..1be4016fe 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -900,6 +900,7 @@
     "types/same_as_any.h",
     "types/strong_alias.h",
     "types/supports_ostream_operator.h",
+    "types/supports_to_string.h",
     "types/to_address.h",
     "types/token_type.h",
     "types/variant_util.h",
@@ -4307,6 +4308,7 @@
 if (is_android) {
   # JNI supported in Robolectric tests.
   generate_jni("base_minimal_jni") {
+    enable_definition_macros = true
     sources = [
       "android/java/src/org/chromium/base/JNIUtils.java",
       "android/java/src/org/chromium/base/JavaExceptionReporter.java",
diff --git a/base/android/field_trial_list.cc b/base/android/field_trial_list.cc
index 7ba644c..f50591d 100644
--- a/base/android/field_trial_list.cc
+++ b/base/android/field_trial_list.cc
@@ -73,6 +73,8 @@
 // friend the JNI function and is, in turn, friended by
 // FieldTrialListIncludingLowAnonymity which allows for the private
 // GetActiveFieldTrialGroups() to be reached.
+static void JNI_FieldTrialList_LogActiveTrials(JNIEnv* env);
+
 class AndroidFieldTrialListLogActiveTrialsFriendHelper {
  private:
   friend void ::JNI_FieldTrialList_LogActiveTrials(JNIEnv* env);
@@ -110,3 +112,5 @@
   return base::FieldTrialList::CreateFieldTrial(trial_name, group_name) !=
          nullptr;
 }
+
+DEFINE_JNI_FOR_FieldTrialList()
diff --git a/base/android/java/src/org/chromium/base/JNIUtils.java b/base/android/java/src/org/chromium/base/JNIUtils.java
index d7cc06c3..255c8a3 100644
--- a/base/android/java/src/org/chromium/base/JNIUtils.java
+++ b/base/android/java/src/org/chromium/base/JNIUtils.java
@@ -5,16 +5,20 @@
 package org.chromium.base;
 
 import org.jni_zero.CalledByNative;
+import org.jni_zero.JNINamespace;
 import org.jni_zero.JniType;
+import org.jni_zero.NativeMethods;
 
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
 /** This class provides JNI-related methods to the native library. */
 @NullMarked
+@JNINamespace("base::android")
 public class JNIUtils {
     private static final String TAG = "JNIUtils";
     private static @Nullable ClassLoader sJniClassLoader;
+    private static boolean sBadClassLoaderUsed;
 
     /**
      * Returns a ClassLoader which can load Java classes from the specified split.
@@ -37,7 +41,13 @@
                 // is very out of date.
             }
         }
-        return sJniClassLoader != null ? sJniClassLoader : JNIUtils.class.getClassLoader();
+        if (sJniClassLoader == null) {
+            sBadClassLoaderUsed = true;
+            // This will be replaced by the Chrome split's ClassLoader as soon as we call
+            // setClassLoader.
+            return JNIUtils.class.getClassLoader();
+        }
+        return sJniClassLoader;
     }
 
     /**
@@ -46,6 +56,20 @@
      * @param classLoader the ClassLoader to use.
      */
     public static void setClassLoader(ClassLoader classLoader) {
+        assert sJniClassLoader == null : "setClassLoader should be called only once.";
         sJniClassLoader = classLoader;
+        if (sBadClassLoaderUsed) {
+            // In the case that we attempt a JNI call before the Chrome split is loaded, we want to
+            // make sure that we invalidate the cached ClassLoader, since the cached ClassLoader
+            // only includes the base module. We cannot do this unconditionally, however, since
+            // sBadClassLoaderUsed also indicates that native is loaded, and this function will
+            // often execute before native is loaded.
+            JNIUtilsJni.get().overwriteMainClassLoader(classLoader);
+        }
+    }
+
+    @NativeMethods
+    interface Natives {
+        void overwriteMainClassLoader(ClassLoader classLoader);
     }
 }
diff --git a/base/android/java/src/org/chromium/base/shared_preferences/SharedPreferencesManager.java b/base/android/java/src/org/chromium/base/shared_preferences/SharedPreferencesManager.java
index 9126ee0..0ef1ef5 100644
--- a/base/android/java/src/org/chromium/base/shared_preferences/SharedPreferencesManager.java
+++ b/base/android/java/src/org/chromium/base/shared_preferences/SharedPreferencesManager.java
@@ -540,7 +540,7 @@
      */
     @CalledByNative
     public void writeString(
-            @JniType("std::string") String key, @JniType("std::string") String value) {
+            @JniType("std::string") String key, @Nullable @JniType("std::string") String value) {
         SharedPreferences.Editor ed = getEditor();
         ed.putString(key, value);
         ed.apply();
diff --git a/base/android/java_exception_reporter.cc b/base/android/java_exception_reporter.cc
index a8f512c..dace51c 100644
--- a/base/android/java_exception_reporter.cc
+++ b/base/android/java_exception_reporter.cc
@@ -15,7 +15,6 @@
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "base/base_minimal_jni/JavaExceptionReporter_jni.h"
 
-using jni_zero::JavaParamRef;
 using jni_zero::JavaRef;
 
 namespace base {
@@ -78,7 +77,7 @@
 void JNI_JavaExceptionReporter_ReportJavaException(
     JNIEnv* env,
     jboolean crash_after_report,
-    const JavaParamRef<jthrowable>& e) {
+    const JavaRef<jthrowable>& e) {
   std::string exception_info = base::android::GetJavaExceptionInfo(env, e);
   bool should_report_exception = g_java_exception_filter.Get().Run(e);
   if (should_report_exception) {
@@ -103,3 +102,5 @@
 
 }  // namespace android
 }  // namespace base
+
+DEFINE_JNI_FOR_JavaExceptionReporter()
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
index b85dce2d..32df13c 100644
--- a/base/android/jni_android.cc
+++ b/base/android/jni_android.cc
@@ -265,3 +265,5 @@
 
 }  // namespace android
 }  // namespace base
+
+DEFINE_JNI_FOR_JniAndroid()
diff --git a/base/android/jni_utils.cc b/base/android/jni_utils.cc
index d23ed22c..8671560 100644
--- a/base/android/jni_utils.cc
+++ b/base/android/jni_utils.cc
@@ -7,6 +7,7 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/containers/flat_map.h"
+#include "base/lazy_instance.h"
 #include "base/no_destructor.h"
 #include "base/synchronization/lock.h"
 
@@ -16,13 +17,27 @@
 namespace base {
 namespace android {
 
-jobject GetSplitClassLoader(JNIEnv* env, const char* split_name) {
-  struct LockAndMap {
-    base::Lock lock;
-    base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map;
-  };
+namespace {
+struct LockAndMap {
+  base::Lock lock;
+  base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map;
+};
+LockAndMap* GetLockAndMap() {
   static base::NoDestructor<LockAndMap> lock_and_map;
+  return lock_and_map.get();
+}
+}  // namespace
 
+static void JNI_JNIUtils_OverwriteMainClassLoader(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& class_loader) {
+  LockAndMap* lock_and_map = GetLockAndMap();
+  base::AutoLock guard(lock_and_map->lock);
+  lock_and_map->map[""].Reset(env, class_loader);
+}
+
+jobject GetSplitClassLoader(JNIEnv* env, const char* split_name) {
+  LockAndMap* lock_and_map = GetLockAndMap();
   base::AutoLock guard(lock_and_map->lock);
   auto it = lock_and_map->map.find(split_name);
   if (it != lock_and_map->map.end()) {
@@ -38,3 +53,5 @@
 
 }  // namespace android
 }  // namespace base
+
+DEFINE_JNI_FOR_JNIUtils()
diff --git a/base/android/token_android.cc b/base/android/token_android.cc
index 0ace17c..eb86d72 100644
--- a/base/android/token_android.cc
+++ b/base/android/token_android.cc
@@ -29,3 +29,5 @@
 }
 
 }  // namespace base::android
+
+DEFINE_JNI_FOR_Token()
diff --git a/base/android/unguessable_token_android.cc b/base/android/unguessable_token_android.cc
index 873b0342..b76bd2a 100644
--- a/base/android/unguessable_token_android.cc
+++ b/base/android/unguessable_token_android.cc
@@ -43,3 +43,5 @@
 
 }  // namespace android
 }  // namespace base
+
+DEFINE_JNI_FOR_UnguessableToken()
diff --git a/base/base64.cc b/base/base64.cc
index b665b4c9..380e528b 100644
--- a/base/base64.cc
+++ b/base/base64.cc
@@ -81,7 +81,10 @@
     // in-place, but it violates the API contract that `output` is only modified
     // on success.
     std::string input_without_whitespace;
-    RemoveChars(input, kInfraAsciiWhitespace, &input_without_whitespace);
+    RemoveChars(input,
+                std::string_view(std::begin(kInfraAsciiWhitespace),
+                                 std::end(kInfraAsciiWhitespace)),
+                &input_without_whitespace);
     // This means that the required size to decode is at most what was needed
     // above, which means `decode_buf` will fit the decoded bytes at its current
     // size and we don't need to call `modp_b64_decode_len()` again.
diff --git a/base/check_op.h b/base/check_op.h
index 76c3d7f1..1f1090a 100644
--- a/base/check_op.h
+++ b/base/check_op.h
@@ -14,9 +14,9 @@
 #include "base/check.h"
 #include "base/dcheck_is_on.h"
 #include "base/memory/raw_ptr_exclusion.h"
-#include "base/strings/to_string.h"
 #include "base/types/is_arc_pointer.h"
 #include "base/types/supports_ostream_operator.h"
+#include "base/types/supports_to_string.h"
 
 // This header defines the (DP)CHECK_EQ etc. macros.
 //
diff --git a/base/containers/span.h b/base/containers/span.h
index e1c6784..2de63b0 100644
--- a/base/containers/span.h
+++ b/base/containers/span.h
@@ -31,6 +31,7 @@
 #include "base/numerics/integral_constant_like.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/cstring_view.h"
+#include "base/strings/to_string.h"
 #include "base/types/to_address.h"
 
 // A span is a view of contiguous elements that can be accessed like an array,
diff --git a/base/json/json_reader.cc b/base/json/json_reader.cc
index af1d4f46..32d8707d 100644
--- a/base/json/json_reader.cc
+++ b/base/json/json_reader.cc
@@ -165,6 +165,17 @@
 }
 
 // static
+std::optional<Value::List> JSONReader::ReadList(std::string_view json,
+                                                int options,
+                                                size_t max_depth) {
+  std::optional<Value> value = Read(json, options, max_depth);
+  if (!value || !value->is_list()) {
+    return std::nullopt;
+  }
+  return std::move(*value).TakeList();
+}
+
+// static
 JSONReader::Result JSONReader::ReadAndReturnValueWithError(
     std::string_view json,
     int options) {
diff --git a/base/json/json_reader.h b/base/json/json_reader.h
index b0b6f194..469546e 100644
--- a/base/json/json_reader.h
+++ b/base/json/json_reader.h
@@ -123,6 +123,13 @@
       int options = JSON_PARSE_CHROMIUM_EXTENSIONS,
       size_t max_depth = internal::kAbsoluteMaxDepth);
 
+  // Reads and parses |json|, returning a Value::List.
+  // If |json| is not a properly formed JSON list string, returns std::nullopt.
+  static std::optional<Value::List> ReadList(
+      std::string_view json,
+      int options = JSON_PARSE_CHROMIUM_EXTENSIONS,
+      size_t max_depth = internal::kAbsoluteMaxDepth);
+
   // Reads and parses |json| like Read(). On success returns a Value as the
   // expected value. Otherwise, it returns an Error instance, populated with a
   // formatted error message, an error code, and the error location if
diff --git a/base/json/json_reader_unittest.cc b/base/json/json_reader_unittest.cc
index a4b61ba..cefcc69 100644
--- a/base/json/json_reader_unittest.cc
+++ b/base/json/json_reader_unittest.cc
@@ -1234,6 +1234,28 @@
   ASSERT_EQ(JSONReader::UsingRust(), using_rust_);
 }
 
+TEST_P(JSONReaderTest, ReadingJsonIntoDictAndList) {
+  {
+    std::optional<base::Value::List> list = JSONReader::ReadList("[1, 2, 3]");
+    ASSERT_TRUE(list);
+  }
+
+  {
+    std::optional<base::Value::List> list = JSONReader::ReadList("{}");
+    ASSERT_FALSE(list);
+  }
+
+  {
+    std::optional<base::Value::Dict> dict = JSONReader::ReadDict("{}");
+    ASSERT_TRUE(dict);
+  }
+
+  {
+    std::optional<base::Value::Dict> dict = JSONReader::ReadDict("[1, 2, 3]");
+    ASSERT_FALSE(dict);
+  }
+}
+
 static void CanParseAnythingWithoutCrashing(const std::string& input) {
   JSONReader::Read(input, JSON_PARSE_CHROMIUM_EXTENSIONS);
 }
diff --git a/base/strings/string_util.h b/base/strings/string_util.h
index 9900d91..5236a687 100644
--- a/base/strings/string_util.h
+++ b/base/strings/string_util.h
@@ -246,6 +246,7 @@
 BASE_EXPORT extern const char16_t kWhitespaceASCIIAs16[];  // No unicode.
 
 // https://infra.spec.whatwg.org/#ascii-whitespace
+// Note that this array is not null-terminated.
 inline constexpr char kInfraAsciiWhitespace[] = {0x09, 0x0A, 0x0C, 0x0D, 0x20};
 
 // Null-terminated string representing the UTF-8 byte order mark.
diff --git a/base/strings/to_string.h b/base/strings/to_string.h
index cae630ce..96d752d 100644
--- a/base/strings/to_string.h
+++ b/base/strings/to_string.h
@@ -15,6 +15,7 @@
 #include <utility>
 
 #include "base/types/supports_ostream_operator.h"
+#include "base/types/supports_to_string.h"
 
 namespace base {
 
@@ -23,9 +24,6 @@
 
 namespace internal {
 
-template <typename T>
-concept SupportsToString = requires(const T& t) { t.ToString(); };
-
 // I/O manipulators are function pointers, but should be sent directly to the
 // `ostream` instead of being cast to `const void*` like other function
 // pointers.
diff --git a/base/tracing/protos/chrome_track_event.proto b/base/tracing/protos/chrome_track_event.proto
index 882386ae9..611cad6 100644
--- a/base/tracing/protos/chrome_track_event.proto
+++ b/base/tracing/protos/chrome_track_event.proto
@@ -700,6 +700,7 @@
     WEBVIEW_MESSAGE_LISTENER_INJECTED = 62;
     WEBVIEW_SAFE_BROWSING_ALLOWLIST_CHANGED = 63;
     WEBVIEW_DOCUMENT_START_JAVASCRIPT_CHANGED = 64;
+    CACHE_CONTROL_NO_STORE_DEVICE_BOUND_SESSION_TERMINATED = 65;
   }
 
   optional BackForwardCacheNotRestoredReason
diff --git a/base/types/supports_to_string.h b/base/types/supports_to_string.h
new file mode 100644
index 0000000..ec612b2
--- /dev/null
+++ b/base/types/supports_to_string.h
@@ -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.
+
+#ifndef BASE_TYPES_SUPPORTS_TO_STRING_H_
+#define BASE_TYPES_SUPPORTS_TO_STRING_H_
+
+namespace base::internal {
+
+template <typename T>
+concept SupportsToString = requires(const T& t) { t.ToString(); };
+
+}  // namespace base::internal
+
+#endif  // BASE_TYPES_SUPPORTS_TO_STRING_H_
diff --git a/build/config/android/abi.gni b/build/config/android/abi.gni
index 5e4121ab..87d1cf67 100644
--- a/build/config/android/abi.gni
+++ b/build/config/android/abi.gni
@@ -92,18 +92,20 @@
 # target_cpu's that are 32-bit-only or 64-bit-only, as they are not used. The
 # presence of this variable may be used in conjunction with android_64bit_target_cpu
 # to identify target_cpu's that are 32-bit-only or 64-bit-only.
-if (target_cpu == "arm64") {
-  android_secondary_abi_cpu = "arm"
-  android_app_secondary_abi = "armeabi-v7a"
-} else if (target_cpu == "x64") {
-  android_secondary_abi_cpu = "x86"
-  android_app_secondary_abi = "x86"
-} else if (target_cpu == "mips64el") {
-  android_secondary_abi_cpu = "mipsel"
-  android_app_secondary_abi = "mips"
-}
+if (!skip_secondary_abi_for_cq) {
+  if (target_cpu == "arm64") {
+    android_secondary_abi_cpu = "arm"
+    android_app_secondary_abi = "armeabi-v7a"
+  } else if (target_cpu == "x64") {
+    android_secondary_abi_cpu = "x86"
+    android_app_secondary_abi = "x86"
+  } else if (target_cpu == "mips64el") {
+    android_secondary_abi_cpu = "mipsel"
+    android_app_secondary_abi = "mips"
+  }
 
-if (defined(android_secondary_abi_cpu)) {
-  android_secondary_abi_toolchain =
-      "//build/toolchain/android:android_clang_${android_secondary_abi_cpu}"
+  if (defined(android_secondary_abi_cpu)) {
+    android_secondary_abi_toolchain =
+        "//build/toolchain/android:android_clang_${android_secondary_abi_cpu}"
+  }
 }
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 5480b31..13bf3e43 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -111,10 +111,6 @@
   assert(android_static_analysis == "on" || android_static_analysis == "off" ||
          android_static_analysis == "build_server")
 
-  # This configuration has not bot coverage and has broken multiple times.
-  # Warn against it.
-  assert(!(enable_chrome_android_internal && skip_secondary_abi_for_cq))
-
   if (enable_chrome_android_internal) {
     import("//clank/config.gni")
   } else {
@@ -286,12 +282,10 @@
     enable_startup_profiles = false
 
     # The target to use as the system WebView implementation.
-    if (android_64bit_target_cpu) {
-      if (skip_secondary_abi_for_cq) {
-        system_webview_apk_target = "//android_webview:system_webview_64_apk"
-      } else {
-        system_webview_apk_target = "//android_webview:system_webview_32_64_apk"
-      }
+    if (defined(android_app_secondary_abi)) {
+      system_webview_apk_target = "//android_webview:system_webview_32_64_apk"
+    } else if (android_64bit_target_cpu) {
+      system_webview_apk_target = "//android_webview:system_webview_64_apk"
     } else {
       system_webview_apk_target = "//android_webview:system_webview_apk"
     }
diff --git a/build/linux/sysroot_scripts/sysroot_creator.py b/build/linux/sysroot_scripts/sysroot_creator.py
index d3fb58d..f67c275 100755
--- a/build/linux/sysroot_scripts/sysroot_creator.py
+++ b/build/linux/sysroot_scripts/sysroot_creator.py
@@ -586,8 +586,15 @@
 def strip_sections(install_root: str, arch: str):
     """
     Strips all sections from ELF files except for dynamic linking and
-    essential sections. Skips static libraries (.a) and object files (.o).
+    essential sections. Skips static libraries (.a), object files (.o), and a
+    few files used by other Chromium-related projects.
     """
+    PRESERVED_FILES = (
+        'libc-2.31.so',
+        'libm-2.31.so',
+        'ld-2.31.so',
+    )
+
     PRESERVED_SECTIONS = {
         ".dynamic",
         ".dynstr",
@@ -600,9 +607,14 @@
         ".note.gnu.build-id",
     }
 
+    preserved_files_count = 0
+    lib_arch_path = os.path.join(install_root, "lib", TRIPLES[arch])
     for root, _, files in os.walk(install_root):
         for file in files:
             file_path = os.path.join(root, file)
+            if file_path.startswith(lib_arch_path) and file in PRESERVED_FILES:
+                preserved_files_count += 1
+                continue
 
             if (os.access(file, os.X_OK) or file.endswith((".a", ".o"))
                     or os.path.islink(file_path)):
@@ -638,6 +650,8 @@
                     for section in sections_to_remove
                 ] + [file_path])
                 subprocess.run(objcopy_cmd, check=True, stderr=subprocess.PIPE)
+    if preserved_files_count != len(PRESERVED_FILES):
+        raise Exception("Expected file to preserve missing")
 
 
 def record_metadata(install_root: str) -> dict[str, tuple[float, float]]:
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 2f33ae7..2ca37507 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -221,6 +221,8 @@
     "metrics/submit_info.h",
     "metrics/total_frame_counter.cc",
     "metrics/total_frame_counter.h",
+    "metrics/ukm_dropped_frames_data.cc",
+    "metrics/ukm_dropped_frames_data.h",
     "metrics/ukm_manager.cc",
     "metrics/ukm_manager.h",
     "metrics/ukm_smoothness_data.cc",
diff --git a/cc/base/features.cc b/cc/base/features.cc
index d7ac5c8..5eeff62 100644
--- a/cc/base/features.cc
+++ b/cc/base/features.cc
@@ -225,4 +225,8 @@
              "ZeroScrollMetricsUpdate",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kViewTransitionFloorTransform,
+             "ViewTransitionFloorTransform",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 }  // namespace features
diff --git a/cc/base/features.h b/cc/base/features.h
index c706c34c..354c7eef 100644
--- a/cc/base/features.h
+++ b/cc/base/features.h
@@ -225,6 +225,11 @@
 // end of frame production for the given VSync.
 CC_BASE_EXPORT BASE_DECLARE_FEATURE(kZeroScrollMetricsUpdate);
 
+// When enabled, the view transition capture transform is floored instead of
+// rounded and we use the render surface pixel snapping to counteract the blurry
+// effect.
+CC_BASE_EXPORT BASE_DECLARE_FEATURE(kViewTransitionFloorTransform);
+
 }  // namespace features
 
 #endif  // CC_BASE_FEATURES_H_
diff --git a/cc/metrics/frame_sequence_metrics.cc b/cc/metrics/frame_sequence_metrics.cc
index 443b386..0e354dd 100644
--- a/cc/metrics/frame_sequence_metrics.cc
+++ b/cc/metrics/frame_sequence_metrics.cc
@@ -15,6 +15,7 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
+#include "cc/metrics/dropped_frame_counter.h"
 #include "cc/metrics/frame_info.h"
 #include "cc/metrics/frame_sequence_tracker.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
@@ -277,7 +278,7 @@
   adopt_from->trace_data_.trace_id = 0u;
 }
 
-void FrameSequenceMetrics::ReportMetrics() {
+int FrameSequenceMetrics::ReportMetrics() {
   // Terminates |trace_data_| for all types of FrameSequenceTracker.
   trace_data_.Terminate(v3_, v4_, GetEffectiveThread());
 
@@ -301,7 +302,7 @@
     v4_.frames_checkerboarded = 0u;
     v4_.frames_checkerboarded_need_raster = 0u;
     v4_.frames_checkerboarded_need_record = 0u;
-    return;
+    return -1;
   }
 
   const auto thread_type = GetEffectiveThread();
@@ -457,6 +458,7 @@
         base::LinearHistogram::FactoryGet(
             GetJankV3HistogramName(type_, thread_name), 1, 100, 101,
             base::HistogramBase::kUmaTargetedHistogramFlag));
+
     v3_.frames_expected = 0u;
     v3_.frames_dropped = 0u;
     v3_.frames_missing_content = 0u;
@@ -465,7 +467,11 @@
     v4_.frames_checkerboarded = 0u;
     v4_.frames_checkerboarded_need_raster = 0u;
     v4_.frames_checkerboarded_need_record = 0u;
+
+    // Return PDF4 to write to UKMs.
+    return percent_dropped_v4;
   }
+  return -1;
 }
 
 FrameSequenceMetrics::TraceData::TraceData(FrameSequenceMetrics* m)
diff --git a/cc/metrics/frame_sequence_metrics.h b/cc/metrics/frame_sequence_metrics.h
index 2c3eb8d..acb1670 100644
--- a/cc/metrics/frame_sequence_metrics.h
+++ b/cc/metrics/frame_sequence_metrics.h
@@ -13,6 +13,7 @@
 #include "base/check.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "base/time/time.h"
 #include "base/trace_event/traced_value.h"
 #include "cc/cc_export.h"
@@ -121,7 +122,8 @@
   bool HasEnoughDataForReporting() const;
   bool HasDataLeftForReporting() const;
   // Report related metrics: throughput, checkboarding...
-  void ReportMetrics();
+  // Returns PercentDroppedFrames4.AllSequences metric.
+  int ReportMetrics();
 
   void AddSortedFrame(const viz::BeginFrameArgs& args,
                       const FrameInfo& frame_info);
diff --git a/cc/metrics/frame_sequence_tracker_collection.cc b/cc/metrics/frame_sequence_tracker_collection.cc
index 5ebce99..c33b235f 100644
--- a/cc/metrics/frame_sequence_tracker_collection.cc
+++ b/cc/metrics/frame_sequence_tracker_collection.cc
@@ -9,8 +9,13 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/shared_memory_mapping.h"
+#include "base/memory/writable_shared_memory_region.h"
 #include "cc/metrics/compositor_frame_reporting_controller.h"
+#include "cc/metrics/frame_sequence_metrics.h"
 #include "cc/metrics/frame_sequence_tracker.h"
+#include "cc/metrics/ukm_dropped_frames_data.h"
+#include "cc/metrics/ukm_smoothness_data.h"
 
 namespace cc {
 
@@ -262,8 +267,10 @@
         accumulated_metrics_.erase(key);
       }
 
-      if (metrics->HasEnoughDataForReporting())
+      if (metrics->HasEnoughDataForReporting()) {
         metrics->ReportMetrics();
+        // TODO(crbug.com/395868899): Write PDF4 metric here
+      }
       if (metrics->HasDataLeftForReporting())
         accumulated_metrics_[key] = std::move(metrics);
     }
@@ -354,4 +361,9 @@
   DestroyTrackers();
 }
 
+void FrameSequenceTrackerCollection::SetUkmDroppedFramesDestination(
+    UkmDroppedFramesDataShared* dropped_frames_data) {
+  ukm_dropped_frames_data_ = dropped_frames_data;
+}
+
 }  // namespace cc
diff --git a/cc/metrics/frame_sequence_tracker_collection.h b/cc/metrics/frame_sequence_tracker_collection.h
index 638b045..2f4f0944 100644
--- a/cc/metrics/frame_sequence_tracker_collection.h
+++ b/cc/metrics/frame_sequence_tracker_collection.h
@@ -12,8 +12,11 @@
 #include "base/containers/flat_map.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "cc/cc_export.h"
+#include "cc/metrics/dropped_frame_counter.h"
 #include "cc/metrics/frame_sequence_metrics.h"
+#include "cc/metrics/ukm_dropped_frames_data.h"
 
 namespace viz {
 struct BeginFrameArgs;
@@ -22,7 +25,6 @@
 namespace cc {
 class FrameSequenceTracker;
 class CompositorFrameReportingController;
-class UkmManager;
 
 // Map of kCustom tracker results keyed by a sequence id.
 using CustomTrackerResults =
@@ -88,8 +90,6 @@
   FrameSequenceTracker* GetRemovalTrackerForTesting(
       FrameSequenceTrackerType type);
 
-  void SetUkmManager(UkmManager* manager);
-
   using NotifyCustomerTrackerResutlsCallback =
       base::RepeatingCallback<void(const CustomTrackerResults&)>;
   void set_custom_tracker_results_added_callback(
@@ -100,6 +100,10 @@
   void AddSortedFrame(const viz::BeginFrameArgs& args,
                       const FrameInfo& frame_info);
 
+  // Registers the shared memory location for PDF4 UKMs.
+  void SetUkmDroppedFramesDestination(
+      UkmDroppedFramesDataShared* dropped_frames_data);
+
  private:
   friend class FrameSequenceTrackerTest;
 
@@ -150,6 +154,9 @@
   size_t main_thread_driving_smoothness_ = 0;
   size_t compositor_thread_driving_smoothness_ = 0;
   size_t raster_thread_driving_smoothness_ = 0;
+
+  // Pointer to shared memory map for PDF4 UKMs
+  raw_ptr<UkmDroppedFramesDataShared> ukm_dropped_frames_data_ = nullptr;
 };
 
 }  // namespace cc
diff --git a/cc/metrics/ukm_dropped_frames_data.cc b/cc/metrics/ukm_dropped_frames_data.cc
new file mode 100644
index 0000000..b72cec3
--- /dev/null
+++ b/cc/metrics/ukm_dropped_frames_data.cc
@@ -0,0 +1,11 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/metrics/ukm_dropped_frames_data.h"
+
+namespace cc {
+
+UkmDroppedFramesData::UkmDroppedFramesData() = default;
+
+}  // namespace cc
diff --git a/cc/metrics/ukm_dropped_frames_data.h b/cc/metrics/ukm_dropped_frames_data.h
new file mode 100644
index 0000000..b5a4d78f
--- /dev/null
+++ b/cc/metrics/ukm_dropped_frames_data.h
@@ -0,0 +1,26 @@
+// 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 CC_METRICS_UKM_DROPPED_FRAMES_DATA_H_
+#define CC_METRICS_UKM_DROPPED_FRAMES_DATA_H_
+
+#include "base/time/time.h"
+#include "cc/cc_export.h"
+#include "cc/metrics/shared_metrics_buffer.h"
+
+namespace cc {
+
+// PercentDroppedFrames4 UKM metric
+// exported from frame_sequence_metrics.cc
+struct CC_EXPORT UkmDroppedFramesData {
+  UkmDroppedFramesData();
+
+  double percent_dropped_frames = 0.0;
+};
+
+using UkmDroppedFramesDataShared = SharedMetricsBuffer<UkmDroppedFramesData>;
+
+}  // namespace cc
+
+#endif  // CC_METRICS_UKM_DROPPED_FRAMES_DATA_H_
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
index c40f171d..3cdab95 100644
--- a/cc/paint/paint_op_reader.cc
+++ b/cc/paint/paint_op_reader.cc
@@ -80,11 +80,17 @@
 void ReadSimpleValueUniformsHelper(
     PaintOpReader& reader,
     std::vector<PaintShader::Uniform<ValueType>>* output_uniforms) {
+  CHECK(output_uniforms);
   size_t count = 0u;
   reader.ReadSize(&count);
   if (!reader.valid() || count == 0u) {
     return;
   }
+  if (count > PaintShader::kMaxNumUniformsPerType ||
+      count > output_uniforms->max_size()) {
+    reader.valid_ = false;
+    return;
+  }
   output_uniforms->reserve(count);
   for (size_t i = 0; i < count; ++i) {
     SkString name;
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc
index 269792b..cdff3bc 100644
--- a/cc/paint/paint_shader.cc
+++ b/cc/paint/paint_shader.cc
@@ -234,6 +234,12 @@
     std::vector<Float2Uniform> float2_uniforms,
     std::vector<Float4Uniform> float4_uniforms,
     std::vector<IntUniform> int_uniforms) {
+  if (float_uniforms.size() > PaintShader::kMaxNumUniformsPerType ||
+      float2_uniforms.size() > PaintShader::kMaxNumUniformsPerType ||
+      float4_uniforms.size() > PaintShader::kMaxNumUniformsPerType ||
+      int_uniforms.size() > PaintShader::kMaxNumUniformsPerType) {
+    return nullptr;
+  }
   SkString cmd(sksl);
   auto [effect, error] = SkRuntimeEffect::MakeForShader(cmd);
   if (!effect) {
diff --git a/cc/paint/paint_shader.h b/cc/paint/paint_shader.h
index b5de8871..3651b25 100644
--- a/cc/paint/paint_shader.h
+++ b/cc/paint/paint_shader.h
@@ -143,6 +143,7 @@
   using Float2Uniform = Uniform<SkV2>;
   using Float4Uniform = Uniform<SkV4>;
   using IntUniform = Uniform<int>;
+  constexpr static size_t kMaxNumUniformsPerType = 16u;
   static sk_sp<PaintShader> MakeSkSLCommand(
       std::string_view sksl,
       std::vector<FloatUniform> float_uniforms,
diff --git a/cc/test/fake_proxy.h b/cc/test/fake_proxy.h
index 5849213..6555e8ac 100644
--- a/cc/test/fake_proxy.h
+++ b/cc/test/fake_proxy.h
@@ -62,6 +62,8 @@
   void SetSourceURL(ukm::SourceId source_id, const GURL& url) override {}
   void SetUkmSmoothnessDestination(
       base::WritableSharedMemoryMapping ukm_smoothness_data) override {}
+  void SetUkmDroppedFramesDestination(
+      base::WritableSharedMemoryMapping ukm_dropped_frames_data) override {}
   void SetRenderFrameObserver(
       std::unique_ptr<RenderFrameMetadataObserver> observer) override {}
   void CompositeImmediatelyForTest(base::TimeTicks frame_begin_time,
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index b80b99f5..311b64b2 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -667,10 +667,8 @@
     // pixel alignment to align it to screen pixels.
     render_surface_transform.PostTranslate(
         render_surface->render_target()->pixel_alignment_offset());
-    // TODO(crbug.com/396190933): For now a render surface with view
-    // transition handles pixel alignment by itself, but that doesn't
-    // work in some cases.
-    if (!render_surface->OwningEffectNode()
+    if (base::FeatureList::IsEnabled(features::kViewTransitionFloorTransform) ||
+        !render_surface->OwningEffectNode()
              ->view_transition_element_resource_id.IsValid()) {
       if (auto offset = draw_property_utils::PixelAlignmentOffset(
               render_surface->screen_space_transform(),
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 4547d5c..4838fa77 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -48,6 +48,7 @@
 #include "cc/layers/heads_up_display_layer_impl.h"
 #include "cc/layers/layer.h"
 #include "cc/layers/painted_scrollbar_layer.h"
+#include "cc/metrics/ukm_dropped_frames_data.h"
 #include "cc/metrics/ukm_manager.h"
 #include "cc/metrics/ukm_smoothness_data.h"
 #include "cc/paint/paint_worklet_layer_painter.h"
@@ -1986,6 +1987,20 @@
   return std::move(ukm_smoothness_mapping.region);
 }
 
+base::ReadOnlySharedMemoryRegion
+LayerTreeHost::CreateSharedMemoryForDroppedFramesUkm() {
+  DCHECK(IsMainThread());
+  const auto size = sizeof(UkmDroppedFramesDataShared);
+  auto ukm_dropped_frames_mapping =
+      base::ReadOnlySharedMemoryRegion::Create(size);
+  if (!ukm_dropped_frames_mapping.IsValid()) {
+    return {};
+  }
+  proxy_->SetUkmDroppedFramesDestination(
+      std::move(ukm_dropped_frames_mapping.mapping));
+  return std::move(ukm_dropped_frames_mapping.region);
+}
+
 void LayerTreeHost::SetRenderFrameObserver(
     std::unique_ptr<RenderFrameMetadataObserver> observer) {
   DCHECK(IsMainThread());
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 46c390b..39fa4c9 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -914,6 +914,7 @@
 
   void SetSourceURL(ukm::SourceId source_id, const GURL& url);
   base::ReadOnlySharedMemoryRegion CreateSharedMemoryForSmoothnessUkm();
+  base::ReadOnlySharedMemoryRegion CreateSharedMemoryForDroppedFramesUkm();
 
   void SetRenderFrameObserver(
       std::unique_ptr<RenderFrameMetadataObserver> observer);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index d9565f5..c88011a 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -75,6 +75,7 @@
 #include "cc/metrics/frame_sequence_metrics.h"
 #include "cc/metrics/lcd_text_metrics_reporter.h"
 #include "cc/metrics/submit_info.h"
+#include "cc/metrics/ukm_dropped_frames_data.h"
 #include "cc/metrics/ukm_smoothness_data.h"
 #include "cc/paint/display_item_list.h"
 #include "cc/paint/paint_worklet_job.h"
@@ -5774,6 +5775,13 @@
   ukm_smoothness_mapping_ = std::move(ukm_smoothness_data);
 }
 
+void LayerTreeHostImpl::SetUkmDroppedFramesDestination(
+    base::WritableSharedMemoryMapping ukm_dropped_frames_data) {
+  frame_trackers_.SetUkmDroppedFramesDestination(
+      ukm_dropped_frames_data.GetMemoryAs<UkmDroppedFramesDataShared>());
+  ukm_dropped_frames_mapping_ = std::move(ukm_dropped_frames_data);
+}
+
 void LayerTreeHostImpl::NotifyDidPresentCompositorFrameOnImplThread(
     uint32_t frame_token,
     std::vector<PresentationTimeCallbackBuffer::SuccessfulCallback> callbacks,
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 3f4a55f..d8fab682 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -799,6 +799,8 @@
 
   void SetUkmSmoothnessDestination(
       base::WritableSharedMemoryMapping ukm_smoothness_data);
+  void SetUkmDroppedFramesDestination(
+      base::WritableSharedMemoryMapping ukm_dropped_frames_data);
 
   // Notifies FrameTrackers, impl side callbacks that the compsitor frame
   // was presented.
@@ -1096,6 +1098,7 @@
   std::unique_ptr<PageScaleAnimation> page_scale_animation_;
 
   base::WritableSharedMemoryMapping ukm_smoothness_mapping_;
+  base::WritableSharedMemoryMapping ukm_dropped_frames_mapping_;
 
   TotalFrameCounter total_frame_counter_;
   // `dropped_frame_counter_` holds a pointer `to ukm_smoothness_mapping_` so
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index edf76b33..e4010760f 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -9695,6 +9695,8 @@
   void SetupTree() override {
     LayerTreeTest::SetupTree();
     shmem_region_ = layer_tree_host()->CreateSharedMemoryForSmoothnessUkm();
+    shmem_region_dropped_frames_ =
+        layer_tree_host()->CreateSharedMemoryForDroppedFramesUkm();
   }
 
   void BeginTest() override {
@@ -9710,6 +9712,9 @@
     // It is not always possible to guarantee an exact number of dropped frames.
     // So validate that there are non-zero dropped frames.
     EXPECT_GT(smoothness->data.avg_smoothness, 0);
+
+    ASSERT_TRUE(shmem_region_dropped_frames_.IsValid());
+    // TODO(crbug.com/395868899): Test that values are exported here.
   }
 
   void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl,
@@ -9744,6 +9749,7 @@
   bool fcp_sent_ = false;
   viz::BeginFrameArgs last_args_;
   base::ReadOnlySharedMemoryRegion shmem_region_;
+  base::ReadOnlySharedMemoryRegion shmem_region_dropped_frames_;
 };
 
 MULTI_THREAD_TEST_F(LayerTreeHostUkmSmoothnessMetric);
diff --git a/cc/trees/proxy.h b/cc/trees/proxy.h
index 57144d1b..35c6a6d 100644
--- a/cc/trees/proxy.h
+++ b/cc/trees/proxy.h
@@ -8,12 +8,14 @@
 #include <memory>
 #include <string>
 
+#include "base/memory/shared_memory_mapping.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "base/types/optional_ref.h"
 #include "cc/cc_export.h"
 #include "cc/input/browser_controls_offset_tag_modifications.h"
 #include "cc/input/browser_controls_state.h"
+#include "cc/paint/draw_image.h"
 #include "cc/trees/paint_holding_commit_trigger.h"
 #include "cc/trees/paint_holding_reason.h"
 #include "cc/trees/task_runner_provider.h"
@@ -115,6 +117,9 @@
   virtual void SetUkmSmoothnessDestination(
       base::WritableSharedMemoryMapping ukm_smoothness_data) = 0;
 
+  virtual void SetUkmDroppedFramesDestination(
+      base::WritableSharedMemoryMapping ukm_dropped_frames_data) = 0;
+
   virtual void SetRenderFrameObserver(
       std::unique_ptr<RenderFrameMetadataObserver> observer) = 0;
 
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc
index c4f1b9c..a40d547d 100644
--- a/cc/trees/proxy_impl.cc
+++ b/cc/trees/proxy_impl.cc
@@ -1013,6 +1013,13 @@
   host_impl_->SetUkmSmoothnessDestination(std::move(ukm_smoothness_data));
 }
 
+void ProxyImpl::SetUkmDroppedFramesDestination(
+    base::WritableSharedMemoryMapping ukm_dropped_frames_data) {
+  DCHECK(IsImplThread());
+  host_impl_->SetUkmDroppedFramesDestination(
+      std::move(ukm_dropped_frames_data));
+}
+
 void ProxyImpl::ClearHistory() {
   DCHECK(IsImplThread());
   scheduler_->ClearHistory();
diff --git a/cc/trees/proxy_impl.h b/cc/trees/proxy_impl.h
index 7523da9..dbacd348 100644
--- a/cc/trees/proxy_impl.h
+++ b/cc/trees/proxy_impl.h
@@ -104,6 +104,8 @@
   void SetSourceURL(ukm::SourceId source_id, const GURL& url);
   void SetUkmSmoothnessDestination(
       base::WritableSharedMemoryMapping ukm_smoothness_data);
+  void SetUkmDroppedFramesDestination(
+      base::WritableSharedMemoryMapping ukm_dropped_frames_data);
   void SetRenderFrameObserver(
       std::unique_ptr<RenderFrameMetadataObserver> observer);
   void DetachInputDelegateAndRenderFrameObserver(
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc
index e265196..b55c600a 100644
--- a/cc/trees/proxy_main.cc
+++ b/cc/trees/proxy_main.cc
@@ -916,6 +916,15 @@
                                 std::move(ukm_smoothness_data)));
 }
 
+void ProxyMain::SetUkmDroppedFramesDestination(
+    base::WritableSharedMemoryMapping ukm_dropped_frames_data) {
+  DCHECK(IsMainThread());
+  ImplThreadTaskRunner()->PostTask(
+      FROM_HERE, base::BindOnce(&ProxyImpl::SetUkmDroppedFramesDestination,
+                                base::Unretained(proxy_impl_.get()),
+                                std::move(ukm_dropped_frames_data)));
+}
+
 void ProxyMain::SetRenderFrameObserver(
     std::unique_ptr<RenderFrameMetadataObserver> observer) {
   ImplThreadTaskRunner()->PostTask(
diff --git a/cc/trees/proxy_main.h b/cc/trees/proxy_main.h
index b237afd..f069b23 100644
--- a/cc/trees/proxy_main.h
+++ b/cc/trees/proxy_main.h
@@ -129,6 +129,8 @@
   void SetSourceURL(ukm::SourceId source_id, const GURL& url) override;
   void SetUkmSmoothnessDestination(
       base::WritableSharedMemoryMapping ukm_smoothness_data) override;
+  void SetUkmDroppedFramesDestination(
+      base::WritableSharedMemoryMapping ukm_dropped_frames_data) override;
   void SetRenderFrameObserver(
       std::unique_ptr<RenderFrameMetadataObserver> observer) override;
   void CompositeImmediatelyForTest(base::TimeTicks frame_begin_time,
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index 6ba66cd..145c1af 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -944,6 +944,11 @@
   DCHECK(task_runner_provider_->IsMainThread());
 }
 
+void SingleThreadProxy::SetUkmDroppedFramesDestination(
+    base::WritableSharedMemoryMapping ukm_smoothness_data) {
+  DCHECK(task_runner_provider_->IsMainThread());
+}
+
 void SingleThreadProxy::ClearHistory() {
   DCHECK(task_runner_provider_->IsImplThread());
   if (scheduler_on_impl_thread_)
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index 5b792ed..fa611e0 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -83,6 +83,8 @@
   void SetSourceURL(ukm::SourceId source_id, const GURL& url) override;
   void SetUkmSmoothnessDestination(
       base::WritableSharedMemoryMapping ukm_smoothness_data) override;
+  void SetUkmDroppedFramesDestination(
+      base::WritableSharedMemoryMapping ukm_smoothness_data) override;
   void SetRenderFrameObserver(
       std::unique_ptr<RenderFrameMetadataObserver> observer) override;
   void CompositeImmediatelyForTest(base::TimeTicks frame_begin_time,
diff --git a/chrome/VERSION b/chrome/VERSION
index 5e4c8dd..48042a22 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=135
 MINOR=0
-BUILD=7025
+BUILD=7026
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 236d62e..3b64016 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -18,6 +18,8 @@
 import("//chrome/android/feed/feed_java_sources.gni")
 import("//chrome/android/modules/chrome_bundle_tmpl.gni")
 import("//chrome/android/modules/chrome_feature_module_tmpl.gni")
+import(
+    "//chrome/browser/bookmarks/android/unmodularized_bookmarks_java_files.gni")
 import("//chrome/browser/commerce/price_tracking/android/java_sources.gni")
 import("//chrome/browser/commerce/subscriptions/android/java_sources.gni")
 import("//chrome/browser/page_info/buildflags.gni")
@@ -43,12 +45,8 @@
 assert(!is_cronet_build)
 assert(enable_supervised_users)
 
-if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
-  assert(current_toolchain != android_secondary_abi_toolchain)
-}
-
 # 32-bit library will have browser code in it. 64-bit is webview-only.
-if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+if (defined(android_app_secondary_abi)) {
   _monochrome_browser_toolchain = android_secondary_abi_toolchain
 } else {
   _monochrome_browser_toolchain = default_toolchain
@@ -355,6 +353,7 @@
       "//chrome/browser/back_press/android:java",
       "//chrome/browser/battery/android:java",
       "//chrome/browser/bluetooth/android:java",
+      "//chrome/browser/bookmarks/android:java",
       "//chrome/browser/browser_controls/android:java",
       "//chrome/browser/browsing_data/android:java",
       "//chrome/browser/collaboration:factory_java",
@@ -819,6 +818,10 @@
     sources += commerce_subscriptions_java_sources
     deps += commerce_subscriptions_java_deps
 
+    # TODO(crbug.com/395908100): Some bookmark files aren't able to be modularized,
+    # include them directly in chrome_java in the meantime and refactor one-by-one.
+    sources += unmodularized_bookmarks_java_files
+
     if (enable_printing) {
       sources +=
           [ "java/src/org/chromium/chrome/browser/printing/TabPrinter.java" ]
@@ -1941,7 +1944,7 @@
   chrome_public_apk_or_module_tmpl("chrome_public_apk") {
     target_type = "android_apk"
     apk_name = "ChromePublic"
-    if (android_64bit_target_cpu) {
+    if (defined(android_app_secondary_abi)) {
       # Ensure 64-bit chrome does not depend on 32-bit things.
       assert_no_deps =
           [ "//build/config:toolchain_marker_" +
@@ -2106,7 +2109,7 @@
     resources_package = "org.chromium.chrome.base"
   }
 
-  if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
+  if (android_64bit_target_cpu && !defined(android_app_secondary_abi)) {
     group("trichrome_library_apk") {
       deps = [ ":trichrome_library_64_apk" ]
     }
@@ -2182,7 +2185,7 @@
       }
     }
 
-    if (!skip_secondary_abi_for_cq) {
+    if (defined(android_app_secondary_abi)) {
       trichrome_library_apk_tmpl("trichrome_library_32_apk") {
         apk_name = "TrichromeLibrary32"
         is_64_bit_browser = false
@@ -2440,7 +2443,7 @@
   # Public webview targets don't work with non-public sdks.
   # https://crbug.com/1000763
   instrumentation_test_runner("monochrome_public_smoke_test") {
-    if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
+    if (android_64bit_target_cpu && !defined(android_app_secondary_abi)) {
       apk_under_test = ":monochrome_64_public_apk"
       if (!is_java_debug) {
         proguard_mapping_path =
@@ -2502,7 +2505,7 @@
 
   instrumentation_test_runner("monochrome_public_bundle_smoke_test") {
     if (android_64bit_target_cpu) {
-      if (skip_secondary_abi_for_cq) {
+      if (!defined(android_app_secondary_abi)) {
         apk_under_test = "//chrome/android:monochrome_64_public_bundle_apks"
         if (!is_java_debug) {
           proguard_mapping_path =
@@ -2530,7 +2533,7 @@
 
   _verify_32bit_static_initializers =
       defined(expected_static_initializer_32bit_count) &&
-      !skip_secondary_abi_for_cq
+      defined(android_app_secondary_abi)
   _verify_64bit_static_initializers =
       defined(expected_static_initializer_64bit_count) &&
       android_64bit_target_cpu
@@ -2595,7 +2598,7 @@
     modules = [ "test_dummy" ]
     extra_args = _bundle_smoke_test_extra_args
     if (android_64bit_target_cpu) {
-      if (skip_secondary_abi_for_cq) {
+      if (!defined(android_app_secondary_abi)) {
         apk_under_test = "//chrome/android:trichrome_chrome_64_bundle_apks"
         additional_apks = [ "//chrome/android:trichrome_library_64_apk" ]
         if (!is_java_debug) {
@@ -2682,7 +2685,7 @@
     }
   }
 
-  if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
+  if (android_64bit_target_cpu && !defined(android_app_secondary_abi)) {
     group("monochrome_public_bundle") {
       deps = [ ":monochrome_64_public_bundle" ]
     }
@@ -2754,7 +2757,7 @@
     }
 
     # Used for binary size monitoring things:
-    if (is_official_build && !skip_secondary_abi_for_cq) {
+    if (is_official_build && defined(android_app_secondary_abi)) {
       _trichrome_library_basename = "TrichromeLibrary.apk"
       _trichrome_chrome_basename = "TrichromeChrome.minimal.apks"
       _trichrome_chrome_bundle = "TrichromeChrome.aab"
@@ -2858,7 +2861,7 @@
         data_deps = [ ":trichrome_32_minimal_apks" ]
       }
 
-      if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+      if (defined(android_app_secondary_abi)) {
         android_size_bot_config("resource_size_config_trichrome") {
           name = "Trichrome"
           mapping_files = [
@@ -2934,7 +2937,7 @@
       }
     }
 
-    if (!skip_secondary_abi_for_cq) {
+    if (defined(android_app_secondary_abi)) {
       chrome_public_bundle("monochrome_32_public_bundle") {
         is_monochrome = true
         bundle_name = "MonochromePublic32"
@@ -3043,7 +3046,6 @@
     "java/src/org/chromium/chrome/browser/backup/ChromeBackupAgentImpl.java",
     "java/src/org/chromium/chrome/browser/backup/ChromeBackupWatcher.java",
     "java/src/org/chromium/chrome/browser/backup/DictPrefBackupSerializer.java",
-    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
     "java/src/org/chromium/chrome/browser/browserservices/digitalgoods/SiteIsolator.java",
     "java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge.java",
     "java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappGeolocationBridge.java",
@@ -3196,6 +3198,7 @@
 
   public_deps = [
     ":base_module_jni",
+    "//chrome/browser/bookmarks/android:jni_headers",
     "//chrome/browser/partnerbookmarks:jni_headers",
     "//chrome/browser/webid:jni_headers",
   ]
@@ -3416,7 +3419,7 @@
     collect_inputs_only = true
   }
 
-  if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     group("monochrome_64_secondary_abi_lib") {
       public_deps = [ ":libmonochrome_64($android_secondary_abi_toolchain)" ]
     }
@@ -3429,7 +3432,7 @@
   }
 
   # 32-bit browser library alias targets, pulled in by 64-bit WebView builds.
-  if (!skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     group("monochrome_secondary_abi_lib") {
       public_deps = [ ":libmonochrome($android_secondary_abi_toolchain)" ]
     }
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
index f3d76f23..b3677d8 100644
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -20,7 +20,11 @@
   "java/res/anim/slide_in_up.xml",
   "java/res/anim/slide_out_down.xml",
   "java/res/anim/slide_out_left.xml",
+  "java/res/color-night/widget_bg.xml",
+  "java/res/color-night/widget_button_bg.xml",
   "java/res/color-night/widget_searchbox_bg.xml",
+  "java/res/color/widget_bg.xml",
+  "java/res/color/widget_button_bg.xml",
   "java/res/color/widget_searchbox_bg.xml",
   "java/res/drawable-hdpi/btn_close_white.png",
   "java/res/drawable-hdpi/btn_left.png",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index e6786d4..b483f18 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -178,80 +178,6 @@
   "java/src/org/chromium/chrome/browser/backup/DictPrefBackupSerializer.java",
   "java/src/org/chromium/chrome/browser/backup/IntPrefBackupSerializer.java",
   "java/src/org/chromium/chrome/browser/backup/PrefBackupSerializer.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerTestingDelegate.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkMetrics.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkOpener.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkQueryHandler.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiObserver.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiState.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/CancelableAnimator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ScopedBookmarkModelObservation.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonViewBinder.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsProvider.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarProperties.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java",
-  "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarViewBinder.java",
   "java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetProvider.java",
   "java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetProxy.java",
   "java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetServiceImpl.java",
@@ -967,7 +893,6 @@
   "java/src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider.java",
   "java/src/org/chromium/chrome/browser/read_later/ReadLaterIphController.java",
   "java/src/org/chromium/chrome/browser/read_later/ReadingListBackPressHandler.java",
-  "java/src/org/chromium/chrome/browser/read_later/ReadingListUtils.java",
   "java/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationController.java",
   "java/src/org/chromium/chrome/browser/renderer_host/ChromeNavigationUiData.java",
   "java/src/org/chromium/chrome/browser/resources/ResourceMapper.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index b1ab5a7b..44d95c9 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -151,7 +151,7 @@
                               invoker.include_32_bit_webview
     _include_primary_abi = !android_64bit_target_cpu || _is_64_bit_browser ||
                            _include_64_bit_webview
-    _include_secondary_abi = android_64bit_target_cpu &&
+    _include_secondary_abi = defined(android_app_secondary_abi) &&
                              (!_is_64_bit_browser || _include_32_bit_webview)
     if (_include_secondary_abi) {
       _secondary_out_dir =
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
index 486f672..a08bb71e 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
@@ -27,7 +27,6 @@
 import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;
 
 import android.view.View;
-import android.view.ViewGroup;
 
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.test.espresso.Espresso;
@@ -47,6 +46,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Features.EnableFeatures;
@@ -82,6 +82,7 @@
 @DoNotBatch(reason = "TODO(crbug.com/348068134): Batch this test suite.")
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @EnableFeatures({ChromeFeatureList.ANDROID_TAB_DECLUTTER})
+@DisabledTest(message = "crbug.com/397759336")
 public class ArchivedTabsDialogCoordinatorTest {
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
@@ -98,7 +99,6 @@
     private Profile mProfile;
     private ArchivedTabModelOrchestrator mArchivedTabModelOrchestrator;
     private TabModel mArchivedTabModel;
-    private ViewGroup mParentView;
     private TabCreator mRegularTabCreator;
     private TabModel mRegularTabModel;
     private UserActionTester mUserActionTester;
@@ -755,16 +755,15 @@
     }
 
     private void showDialog(int numOfArchivedTabs) {
-        onViewWaiting(
-                        withText(
-                                mActivityTestRule
-                                        .getActivity()
-                                        .getResources()
-                                        .getQuantityString(
-                                                R.plurals.archived_tab_card_title,
-                                                numOfArchivedTabs,
-                                                numOfArchivedTabs)))
-                .perform(click());
+        String tabsText =
+                mActivityTestRule
+                        .getActivity()
+                        .getResources()
+                        .getQuantityString(
+                                R.plurals.archived_tab_card_title,
+                                numOfArchivedTabs,
+                                numOfArchivedTabs);
+        onViewWaiting(withText(tabsText)).perform(click());
         mRobot.resultRobot.verifyTabListEditorIsVisible();
         mTimesShown++;
         assertEquals(mTimesShown, mUserActionTester.getActionCount("Tabs.ArchivedTabsDialogShown"));
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 f7992d8..97cc5f7 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
@@ -76,7 +76,6 @@
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.app.bookmarks.BookmarkEditActivity;
 import org.chromium.chrome.browser.bookmarks.BookmarkModel;
-import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.layouts.LayoutType;
@@ -260,7 +259,7 @@
                     if (mSnackbarManager == null) return;
                     mSnackbarManager.dismissAllSnackbars();
                 });
-        BookmarkUtils.clearLastUsedPrefs();
+        BookmarkModel.clearLastUsedParent();
     }
 
     private @TabListCoordinator.TabListMode int getMode() {
diff --git a/chrome/android/java/res/color-night/widget_bg.xml b/chrome/android/java/res/color-night/widget_bg.xml
new file mode 100644
index 0000000..998714f
--- /dev/null
+++ b/chrome/android/java/res/color-night/widget_bg.xml
@@ -0,0 +1,9 @@
+<?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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?attr/colorSurfaceContainer" />
+</selector>
diff --git a/chrome/android/java/res/color-night/widget_button_bg.xml b/chrome/android/java/res/color-night/widget_button_bg.xml
new file mode 100644
index 0000000..cf7ae13
--- /dev/null
+++ b/chrome/android/java/res/color-night/widget_button_bg.xml
@@ -0,0 +1,9 @@
+<?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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?attr/colorOnSurfaceInverse" />
+</selector>
diff --git a/chrome/android/java/res/color/widget_bg.xml b/chrome/android/java/res/color/widget_bg.xml
new file mode 100644
index 0000000..327e1d0
--- /dev/null
+++ b/chrome/android/java/res/color/widget_bg.xml
@@ -0,0 +1,9 @@
+<?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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?attr/colorSurface" />
+</selector>
diff --git a/chrome/android/java/res/color/widget_button_bg.xml b/chrome/android/java/res/color/widget_button_bg.xml
new file mode 100644
index 0000000..998714f
--- /dev/null
+++ b/chrome/android/java/res/color/widget_button_bg.xml
@@ -0,0 +1,9 @@
+<?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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?attr/colorSurfaceContainer" />
+</selector>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
index 76608bc..02f33560 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -410,6 +410,11 @@
             }
             modelList.add(new MVCListAdapter.ListItem(menutype, propertyModel));
         }
+        int lastIndex = modelList.size() - 1;
+        int itemId = modelList.get(lastIndex).model.get(AppMenuItemProperties.MENU_ITEM_ID);
+        if (DividerLineMenuItemViewBinder.isDividerLineItemId(itemId)) {
+            modelList.removeAt(lastIndex);
+        }
         mModelList = modelList;
         return modelList;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java
index 3b2b322..4cac50c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java
@@ -18,6 +18,12 @@
 public class DividerLineMenuItemViewBinder implements CustomViewBinder {
     private static final int DIVIDER_LINE_ITEM_VIEW_TYPE = 0;
 
+    public static boolean isDividerLineItemId(int id) {
+        return id == R.id.divider_line_id
+                || id == R.id.managed_by_divider_line_id
+                || id == R.id.quick_delete_divider_line_id;
+    }
+
     @Override
     public int getViewTypeCount() {
         return 1;
@@ -25,11 +31,7 @@
 
     @Override
     public int getItemViewType(int id) {
-        return (id == R.id.divider_line_id
-                        || id == R.id.managed_by_divider_line_id
-                        || id == R.id.quick_delete_divider_line_id)
-                ? DIVIDER_LINE_ITEM_VIEW_TYPE
-                : CustomViewBinder.NOT_HANDLED;
+        return isDividerLineItemId(id) ? DIVIDER_LINE_ITEM_VIEW_TYPE : CustomViewBinder.NOT_HANDLED;
     }
 
     @Override
@@ -47,9 +49,7 @@
 
         if (key == AppMenuItemProperties.MENU_ITEM_ID) {
             int id = model.get(AppMenuItemProperties.MENU_ITEM_ID);
-            assert id == R.id.divider_line_id
-                    || id == R.id.managed_by_divider_line_id
-                    || id == R.id.quick_delete_divider_line_id;
+            assert isDividerLineItemId(id);
             view.setId(id);
             view.setEnabled(false);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
index 2eecc79..564f5fc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
@@ -23,7 +23,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.EarlyTraceEvent;
 import org.chromium.base.IntentUtils;
-import org.chromium.base.JNIUtils;
 import org.chromium.base.LocaleUtils;
 import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
@@ -211,7 +210,6 @@
         ModuleUtil.updateCrashKeys();
 
         AsyncTask.takeOverAndroidThreadPool();
-        JNIUtils.setClassLoader(getClassLoader());
         ResourceBundle.setAvailablePakLocales(ProductConfig.LOCALES);
         LibraryLoader.getInstance().setLinkerImplementation(ProductConfig.USE_CHROMIUM_LINKER);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/COMMON_METADATA b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/COMMON_METADATA
deleted file mode 100644
index 6189c87d..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/COMMON_METADATA
+++ /dev/null
@@ -1,7 +0,0 @@
-monorail: {
-  component: "UI>Browser>Bookmarks"
-}
-team_email: "clank-app-team@google.com"
-buganizer_public: {
-  component_id: 1457392
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/DIR_METADATA b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/DIR_METADATA
deleted file mode 100644
index 0488c08..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/DIR_METADATA
+++ /dev/null
@@ -1 +0,0 @@
-mixins: "//chrome/android/java/src/org/chromium/chrome/browser/bookmarks/COMMON_METADATA"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/OWNERS
deleted file mode 100644
index 7813db8f..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-fgorski@chromium.org
-mdjones@chromium.org
-twellington@chromium.org
-wylieb@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayout.java
index 042707a..2df2133 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayout.java
@@ -27,6 +27,7 @@
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
+import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
 import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
@@ -63,12 +64,15 @@
  */
 public class NewTabAnimationLayout extends Layout {
     private static final int FOREGROUND_ANIMATION_DURATION = 300;
+    private static final int FOREGROUND_FADE_DURATION = 150;
     private final ViewGroup mAnimationHostView;
     private final CompositorViewHolder mCompositorViewHolder;
     private final BlackHoleEventFilter mBlackHoleEventFilter;
 
     private @Nullable StaticTabSceneLayer mSceneLayer;
     private AnimatorSet mTabCreatedForegroundAnimation;
+    private ObjectAnimator mFadeAnimator;
+    private ShrinkExpandImageView mRectView;
     private int mNextTabId = Tab.INVALID_TAB_ID;
 
     /**
@@ -234,6 +238,12 @@
         mSceneLayer.update(layoutTab);
     }
 
+    /**
+     * Returns true if animations are running (excluding {@link #mFadeAnimator}).
+     *
+     * <p>Including {@link #mFadeAnimator} would prevent {@link #doneHiding} from being called
+     * during the animation cycle in {@link LayoutManagerImpl#onUpdate(long, long)}.
+     */
     @Override
     public boolean isRunningAnimations() {
         // TODO(crbug.com/40282469): Check background animation once it is implemented.
@@ -306,13 +316,35 @@
         mNextTabId = nextTabId;
     }
 
+    /**
+     * Forces the new tab animation to finish.
+     *
+     * <p>This method is intended for internal use within {@link NewTabAnimationLayout}. It ensures
+     * {@link #mFadeAnimator} runs after calling {@link #startHiding}, preventing premature
+     * termination by external calls to {@link #forceAnimationToFinish} from {@link
+     * LayoutManagerImpl#startShowing}.
+     */
+    @VisibleForTesting
+    void forceNewTabAnimationToFinish() {
+        // TODO(crbug.com/40282469): Make sure the right mode is selected after forcing the
+        // animation to finish.
+        if (mTabCreatedForegroundAnimation != null) {
+            mAnimationHostView.removeView(mRectView);
+            mFadeAnimator = null;
+            mTabCreatedForegroundAnimation.end();
+        } else if (mFadeAnimator != null) {
+            mFadeAnimator.end();
+        }
+        // TODO(crbug.com/40282469): Implement this for Background Animation.
+    }
+
     @VisibleForTesting
     AnimatorSet getForegroundAnimatorSet() {
         return mTabCreatedForegroundAnimation;
     }
 
     /**
-     * Animate opening a tab in the foreground.
+     * Animates opening a tab in the foreground.
      *
      * @param id The id of the new tab to animate.
      * @param sourceId The id of the tab that spawned this new tab.
@@ -323,22 +355,22 @@
         assert mLayoutTabs.length == 1;
         mLayoutTabs = new LayoutTab[] {mLayoutTabs[0], newLayoutTab};
         updateCacheVisibleIds(new ArrayList<>(Arrays.asList(id, sourceId)));
-        forceAnimationToFinish();
+        forceNewTabAnimationToFinish();
 
         // TODO(crbug.com/40933120): Investigate why the old tab flickers when switching to the new
         // tab.
         requestUpdate();
 
-        ShrinkExpandImageView rectView = new ShrinkExpandImageView(getContext());
+        mRectView = new ShrinkExpandImageView(getContext());
         @ColorInt
         int backgroundColor = NewTabAnimationUtils.getBackgroundColor(getContext(), newIsIncognito);
-        rectView.setRoundedFillColor(backgroundColor);
+        mRectView.setRoundedFillColor(backgroundColor);
 
         // TODO(crbug.com/40933120): Investigate why {@link
         // RoundedCornerImageView#setRoundedCorners} sometimes incorrectly detects the view as LTR
         // during the animation.
         boolean isRtl = LocalizationUtils.isLayoutRtl();
-        rectView.setLayoutDirection(isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
+        mRectView.setLayoutDirection(isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
 
         Rect initialRect = new Rect();
         Rect finalRect = new Rect();
@@ -362,7 +394,7 @@
 
         ShrinkExpandAnimator shrinkExpandAnimator =
                 new ShrinkExpandAnimator(
-                        rectView, initialRect, finalRect, /* searchBoxHeight= */ 0);
+                        mRectView, initialRect, finalRect, /* searchBoxHeight= */ 0);
         ObjectAnimator rectAnimator =
                 ObjectAnimator.ofObject(
                         shrinkExpandAnimator,
@@ -378,30 +410,41 @@
         float scaleFactor = (float) initialRect.width() / finalRect.width();
         int endRadius = Math.round(radius * scaleFactor);
         int[] endRadii = new int[] {0, endRadius, endRadius, endRadius};
-        rectView.setRoundedCorners(startRadii[0], startRadii[1], startRadii[2], startRadii[3]);
+        mRectView.setRoundedCorners(startRadii[0], startRadii[1], startRadii[2], startRadii[3]);
         ValueAnimator cornerAnimator =
                 RoundedCornerAnimatorUtil.createRoundedCornerAnimator(
-                        rectView, startRadii, endRadii);
+                        mRectView, startRadii, endRadii);
+
+        mFadeAnimator = ObjectAnimator.ofFloat(mRectView, ShrinkExpandImageView.ALPHA, 1f, 0f);
+        mFadeAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR);
+        mFadeAnimator.setDuration(FOREGROUND_FADE_DURATION);
+        mFadeAnimator.addListener(
+                new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        mAnimationHostView.removeView(mRectView);
+                        mFadeAnimator = null;
+                    }
+                });
 
         mTabCreatedForegroundAnimation = new AnimatorSet();
         mTabCreatedForegroundAnimation.setInterpolator(Interpolators.STANDARD_INTERPOLATOR);
         mTabCreatedForegroundAnimation.setDuration(FOREGROUND_ANIMATION_DURATION);
-        // TODO(crbug.com/40933120): Add fade animator and ensure {@link #doneHiding} gets called
-        // properly in the animation cycle.
         mTabCreatedForegroundAnimation.playTogether(rectAnimator, cornerAnimator);
         mTabCreatedForegroundAnimation.addListener(
                 new AnimatorListenerAdapter() {
                     @Override
                     public void onAnimationEnd(Animator animation) {
+                        if (mFadeAnimator != null) mFadeAnimator.start();
                         startHiding();
                         mTabModelSelector.selectModel(newIsIncognito);
                         mNextTabId = id;
-                        mAnimationHostView.removeView(rectView);
                         mTabCreatedForegroundAnimation = null;
                     }
                 });
-        mAnimationHostView.addView(rectView);
-        rectView.reset(initialRect);
-        rectView.post(mTabCreatedForegroundAnimation::start);
+
+        mAnimationHostView.addView(mRectView);
+        mRectView.reset(initialRect);
+        mRectView.post(mTabCreatedForegroundAnimation::start);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java
index dda3a44..bce55e6a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java
@@ -281,7 +281,7 @@
         assertEquals(CURRENT_TAB_ID, layoutTabs[0].getId());
         assertEquals(NEW_TAB_ID, layoutTabs[1].getId());
 
-        verify(mNewTabAnimationLayout).forceAnimationToFinish();
+        verify(mNewTabAnimationLayout, times(1)).forceNewTabAnimationToFinish();
         verify(mAnimationHostView, times(1)).addView(any());
 
         mNewTabAnimationLayout.getForegroundAnimatorSet().start();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
index c6e1dd9..17c6e803 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -3350,6 +3350,9 @@
         } else {
             resizeTabStrip(animate, false, animate);
         }
+
+        // Update the ideal view positions, since these are needed for reorder offset calculations.
+        computeIdealViewPositions();
     }
 
     private List<Animator> resizeTabStrip(boolean animate, boolean delay, boolean deferAnimations) {
@@ -3674,7 +3677,7 @@
                 }
 
                 view.setIdealX(startX + drawXOffset);
-                delta = view.getWidth() - mGroupTitleOverlapWidth;
+                delta = (view.getWidth() - mGroupTitleOverlapWidth) * view.getWidthWeight();
             }
 
             delta = MathUtils.flipSignIf(delta, LocalizationUtils.isLayoutRtl());
@@ -3682,10 +3685,14 @@
         }
     }
 
+    private boolean shouldRenderView(StripLayoutView view) {
+        return view.isVisible() && !view.isDraggedOffStrip();
+    }
+
     private int getVisibleViewCount(StripLayoutView[] views) {
         int renderCount = 0;
         for (int i = 0; i < views.length; ++i) {
-            if (views[i].isVisible()) renderCount++;
+            if (shouldRenderView(views[i])) renderCount++;
         }
         return renderCount;
     }
@@ -3694,7 +3701,7 @@
         int renderIndex = 0;
         for (int i = 0; i < allViews.length; ++i) {
             final StripLayoutView view = allViews[i];
-            if (view.isVisible()) viewsToRender[renderIndex++] = view;
+            if (shouldRenderView(view)) viewsToRender[renderIndex++] = view;
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java
index a9739e9..0e7d7dd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java
@@ -29,6 +29,9 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabShareUtils;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Drag and drop reorder - start dragging strip view. Subsequently drag out of, within and back onto
  * strip.
@@ -99,7 +102,8 @@
         }
 
         // Attempt to start a drag and drop action. If the drag successfully started, early-out.
-        if (mActiveSubStrategy != null && mActiveSubStrategy.startViewDragAction(startPoint)) {
+        if (mActiveSubStrategy != null
+                && mActiveSubStrategy.startViewDragAction(stripTabs, startPoint)) {
             return;
         }
 
@@ -157,17 +161,17 @@
         return mActiveSubStrategy == mTabSubStrategy;
     }
 
-    private void removeViewOutOfStrip(StripLayoutTab draggedTab) {
-        draggedTab.setIsDraggedOffStrip(true);
-        draggedTab.setDrawX(draggedTab.getIdealX());
-        draggedTab.setDrawY(draggedTab.getHeight());
-        draggedTab.setOffsetY(draggedTab.getHeight());
+    private void removeViewOutOfStrip(StripLayoutView draggedView) {
+        draggedView.setIsDraggedOffStrip(true);
+        draggedView.setDrawX(draggedView.getIdealX());
+        draggedView.setDrawY(draggedView.getHeight());
+        draggedView.setOffsetY(draggedView.getHeight());
     }
 
-    private void bringViewOntoStrip(StripLayoutTab draggedTab) {
-        draggedTab.setIsDraggedOffStrip(false);
-        draggedTab.setOffsetX(mLastOffsetX);
-        draggedTab.setOffsetY(0);
+    private void bringViewOntoStrip(StripLayoutView draggedView) {
+        draggedView.setIsDraggedOffStrip(false);
+        draggedView.setOffsetX(mLastOffsetX);
+        draggedView.setOffsetY(0);
         mLastOffsetX = 0f;
     }
 
@@ -246,9 +250,11 @@
         /**
          * Attempts to start the view tearing action through {@link TabDragSource}.
          *
+         * @param stripTabs The list of {@link StripLayoutTab}.
+         * @param startPoint The location on-screen that the gesture started at.
          * @return {@code True} if the drag and drop action started, and {@code false} otherwise.
          */
-        abstract boolean startViewDragAction(PointF startPoint);
+        abstract boolean startViewDragAction(StripLayoutTab[] stripTabs, PointF startPoint);
 
         /** Called when the view tearing action has completed. */
         void onStopViewDragAction(StripLayoutGroupTitle[] groupTitles, StripLayoutTab[] stripTabs) {
@@ -317,7 +323,7 @@
         }
 
         @Override
-        boolean startViewDragAction(PointF startPoint) {
+        boolean startViewDragAction(StripLayoutTab[] stripTabs, PointF startPoint) {
             Tab tab = mModel.getTabById(((StripLayoutTab) mViewBeingDragged).getTabId());
             assert tab != null : "No matching Tab found.";
             return mTabDragSource.startTabDragAction(
@@ -353,14 +359,61 @@
     }
 
     private class GroupReorderSubStrategy extends ReorderSubStrategy {
+        List<StripLayoutView> mViewsBeingDragged = new ArrayList<>();
+
         // TODO(crbug.com/384969886): Implement.
         GroupReorderSubStrategy(ReorderStrategy groupReorderStrategy) {
             super(groupReorderStrategy);
         }
 
         @Override
-        boolean startViewDragAction(PointF startPoint) {
+        public void startReorderMode(
+                StripLayoutTab[] stripTabs,
+                StripLayoutGroupTitle[] stripGroupTitles,
+                StripLayoutView interactingView,
+                PointF startPoint) {
+            // 1. Hide compositor buttons.
+            mStripUpdateDelegate.setCompositorButtonsVisible(false);
+
+            // 2. Bring dragged views onto strip, resize strip accordingly.
+            mAnimationHost.finishAnimationsAndPushTabUpdates();
+            for (StripLayoutView view : mViewsBeingDragged) {
+                bringViewOntoStrip(view);
+            }
+            mStripUpdateDelegate.resizeTabStrip(
+                    /* animate= */ false, /* tabToAnimate= */ null, /* animateTabAdded= */ false);
+
+            // 3. Start to reorder within strip - delegate to the wrapped strategy.
+            super.startReorderMode(stripTabs, stripGroupTitles, interactingView, startPoint);
+        }
+
+        @Override
+        public void stopReorderMode(
+                StripLayoutGroupTitle[] groupTitles, StripLayoutTab[] stripTabs) {
+            // 1. Show compositor buttons.
+            mStripUpdateDelegate.setCompositorButtonsVisible(true);
+
+            // 2. Store reorder state, then exit reorder within strip.
+            mLastOffsetX = mViewBeingDragged.getOffsetX();
+            super.stopReorderMode(groupTitles, stripTabs);
+
+            // 3. Immediately hide the dragged views without animating. Resize strip accordingly.
+            // TODO(crbug.com/384855584): Animate this action.
+            mAnimationHost.finishAnimationsAndPushTabUpdates();
+            for (StripLayoutView view : mViewsBeingDragged) {
+                removeViewOutOfStrip(view);
+            }
+            mStripUpdateDelegate.resizeTabStrip(
+                    /* animate= */ false, /* tabToAnimate= */ null, /* animateTabAdded= */ false);
+        }
+
+        @Override
+        boolean startViewDragAction(StripLayoutTab[] stripTabs, PointF startPoint) {
             StripLayoutGroupTitle draggedGroupTitle = (StripLayoutGroupTitle) mViewBeingDragged;
+            mViewsBeingDragged.add(draggedGroupTitle);
+            mViewsBeingDragged.addAll(
+                    StripLayoutUtils.getGroupedTabs(
+                            mModel, stripTabs, draggedGroupTitle.getRootId()));
 
             return mTabDragSource.startGroupDragAction(
                     mContainerView,
@@ -369,6 +422,12 @@
                     draggedGroupTitle.getDrawX(),
                     draggedGroupTitle.getWidth());
         }
+
+        @Override
+        void onStopViewDragAction(StripLayoutGroupTitle[] groupTitles, StripLayoutTab[] stripTabs) {
+            mViewsBeingDragged.clear();
+            super.onStopViewDragAction(groupTitles, stripTabs);
+        }
     }
 
     // ============================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
index b7aaa59..6469435 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -29,6 +29,7 @@
 import org.chromium.base.shared_preferences.SharedPreferencesManager;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
 import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item;
 import org.chromium.chrome.browser.contextmenu.ContextMenuCoordinator.ListItemType;
 import org.chromium.chrome.browser.download.DownloadUtils;
@@ -45,7 +46,6 @@
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
 import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.chrome.browser.read_later.ReadingListUtils;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.share.ChromeShareExtras;
 import org.chromium.chrome.browser.share.LensUtils;
@@ -326,7 +326,7 @@
                                     !mIsDownloadRestrictedByPolicy));
                 }
                 if (!mParams.isImage()
-                        && ReadingListUtils.isReadingListSupported(mParams.getLinkUrl())) {
+                        && BookmarkUtils.isReadingListSupported(mParams.getLinkUrl())) {
                     linkGroup.add(createListItem(Item.READ_LATER, shouldTriggerReadLaterHelpUi()));
                 }
                 if (enableShareFromContextMenu()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListBackPressHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListBackPressHandler.java
index 8f674665..d381b78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListBackPressHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListBackPressHandler.java
@@ -77,7 +77,7 @@
                 && mBookmarkModelSupplier.get().areAccountBookmarkFoldersActive()) {
             BookmarkUtils.showBookmarkManager(null, mLastUsedParent, tab.getProfile());
         } else {
-            ReadingListUtils.showReadingList(tab.getProfile());
+            BookmarkUtils.showReadingList(tab.getProfile());
         }
 
         WebContents webContents = tab.getWebContents();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListUtils.java
deleted file mode 100644
index ad6d13b..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/read_later/ReadingListUtils.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.read_later;
-
-import org.chromium.base.ResettersForTesting;
-import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
-import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.components.bookmarks.BookmarkId;
-import org.chromium.components.bookmarks.BookmarkType;
-import org.chromium.components.embedder_support.util.UrlUtilities;
-import org.chromium.url.GURL;
-
-/** Utility functions for reading list feature. */
-public final class ReadingListUtils {
-    private static final String TAG = "ReadingListUtils";
-
-    private static Boolean sReadingListSupportedForTesting;
-    private static Boolean sSkipShowSaveFlowForTesting;
-
-    /** Returns whether the URL can be added as reading list article. */
-    public static boolean isReadingListSupported(GURL url) {
-        if (sReadingListSupportedForTesting != null) return sReadingListSupportedForTesting;
-        if (url == null || url.isEmpty() || !url.isValid()) return false;
-
-        // This should match ReadingListModel::IsUrlSupported(), having a separate function since
-        // the UI may not load native library.
-        return UrlUtilities.isHttpOrHttps(url);
-    }
-
-    /** For cases where GURLs are faked for testing (e.g. test pages). */
-    public static void setReadingListSupportedForTesting(Boolean supported) {
-        sReadingListSupportedForTesting = supported;
-        ResettersForTesting.register(() -> sReadingListSupportedForTesting = null);
-    }
-
-    /**
-     * Opens the Reading list folder in the bookmark manager.
-     *
-     * @param profile The profile associated with the bookmark manager.
-     */
-    public static void showReadingList(Profile profile) {
-        BookmarkUtils.showBookmarkManager(
-                null, new BookmarkId(0, BookmarkType.READING_LIST), profile);
-    }
-
-    /** For cases where we don't want to mock the entire bookmarks save flow infra. */
-    public static void setSkipShowSaveFlowForTesting(Boolean skipShowSaveFlowForTesting) {
-        sSkipShowSaveFlowForTesting = skipShowSaveFlowForTesting;
-        ResettersForTesting.register(() -> sSkipShowSaveFlowForTesting = null);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
index e68f5cb..970399d2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
@@ -39,7 +39,6 @@
 import org.chromium.chrome.browser.homepage.HomepageManager;
 import org.chromium.chrome.browser.magic_stack.HomeModulesConfigManager;
 import org.chromium.chrome.browser.night_mode.NightModeMetrics.ThemeSettingsEntry;
-import org.chromium.chrome.browser.night_mode.NightModeUtils;
 import org.chromium.chrome.browser.night_mode.settings.ThemeSettingsFragment;
 import org.chromium.chrome.browser.password_check.PasswordCheck;
 import org.chromium.chrome.browser.password_check.PasswordCheckFactory;
@@ -295,6 +294,12 @@
                                     .removePreference(findPreference(PREF_TOOLBAR_SHORTCUT));
                         });
 
+        findPreference(PREF_UI_THEME)
+                .getExtras()
+                .putInt(
+                        ThemeSettingsFragment.KEY_THEME_SETTINGS_ENTRY,
+                        ThemeSettingsEntry.SETTINGS);
+
         if (BuildInfo.getInstance().isAutomotive) {
             getPreferenceScreen().removePreference(findPreference(PREF_SAFETY_CHECK));
             getPreferenceScreen().removePreference(findPreference(PREF_SAFETY_HUB));
@@ -372,17 +377,6 @@
             removePreferenceIfPresent(PREF_HOME_MODULES_CONFIG);
         }
 
-        if (NightModeUtils.isNightModeSupported()) {
-            Preference themePref = addPreferenceIfAbsent(PREF_UI_THEME);
-            themePref
-                    .getExtras()
-                    .putInt(
-                            ThemeSettingsFragment.KEY_THEME_SETTINGS_ENTRY,
-                            ThemeSettingsEntry.SETTINGS);
-        } else {
-            removePreferenceIfPresent(PREF_UI_THEME);
-        }
-
         if (DeveloperSettings.shouldShowDeveloperSettings()) {
             addPreferenceIfAbsent(PREF_DEVELOPER);
         } else {
diff --git a/chrome/android/javatests/BUILD.gn b/chrome/android/javatests/BUILD.gn
index adabd1af..0ffc889 100644
--- a/chrome/android/javatests/BUILD.gn
+++ b/chrome/android/javatests/BUILD.gn
@@ -56,6 +56,7 @@
   "//chrome/browser/autofill/android:java_resources",
   "//chrome/browser/autofill/test:test_support_java",
   "//chrome/browser/back_press/android:java",
+  "//chrome/browser/bookmarks/android:java",
   "//chrome/browser/browser_controls/android:java",
   "//chrome/browser/browsing_data/android:java",
   "//chrome/browser/commerce/android:java",
@@ -1502,6 +1503,7 @@
   "//chrome/browser/android/cookies:java",
   "//chrome/browser/android/crypto:java",
   "//chrome/browser/android/intents:java",
+  "//chrome/browser/bookmarks/android:java",
   "//chrome/browser/browser_controls/android:java",
   "//chrome/browser/commerce/android:java",
   "//chrome/browser/commerce/price_tracking/android:java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java
index 29a64d31..3543f6b1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java
@@ -41,6 +41,7 @@
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Features.DisableFeatures;
 import org.chromium.base.test.util.Features.EnableFeatures;
@@ -461,6 +462,7 @@
     @Test
     @MediumTest
     @EnableFeatures(OmniboxFeatureList.ANDROID_HUB_SEARCH)
+    @DisabledTest(message = "crbug.com/397730179")
     public void testOpenArchivedTabFromHubSearch() {
         finishLoading();
         mActivityTestRule.loadUrl(mActivityTestRule.getTestServer().getURL(TEST_PATH));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/DIR_METADATA b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/DIR_METADATA
deleted file mode 100644
index 0488c08..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/DIR_METADATA
+++ /dev/null
@@ -1 +0,0 @@
-mixins: "//chrome/android/java/src/org/chromium/chrome/browser/bookmarks/COMMON_METADATA"
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/OWNERS
index 50bb1fa7b..a82ac88 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/OWNERS
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/OWNERS
@@ -1 +1 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/bookmarks/OWNERS
+file://chrome/browser/bookmarks/android/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
index 03cfc28..3c474909 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -61,7 +61,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Features.DisableFeatures;
 import org.chromium.base.test.util.Features.EnableFeatures;
@@ -135,7 +134,6 @@
 /** Test suite for verifying the behavior of various URL overriding actions. */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-@DisableIf.Device(DeviceFormFactor.TABLET) // crbug.com/372085373
 public class UrlOverridingTest {
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
index 6d84f29..5d04c85 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -1542,8 +1542,7 @@
                             ContentSettingsType.FEDERATED_IDENTITY_API);
             assertEquals(1, exceptions.size());
             assertEquals(GURLUtils.getOrigin(rpUrl), exceptions.get(0).getPrimaryPattern() + "/");
-            assertEquals(
-                    ContentSettingValues.BLOCK, exceptions.get(0).getContentSetting().intValue());
+            assertEquals(ContentSettingValues.BLOCK, exceptions.get(0).getContentSetting());
         }
 
         // Toggle the federated identity permission.
@@ -1557,8 +1556,7 @@
                             ContentSettingsType.FEDERATED_IDENTITY_API);
             assertEquals(1, exceptions.size());
             assertEquals(GURLUtils.getOrigin(rpUrl), exceptions.get(0).getPrimaryPattern() + "/");
-            assertEquals(
-                    ContentSettingValues.ALLOW, exceptions.get(0).getContentSetting().intValue());
+            assertEquals(ContentSettingValues.ALLOW, exceptions.get(0).getContentSetting());
         }
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
index 3f20315..4ca07e5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
@@ -84,7 +84,6 @@
 import org.chromium.chrome.browser.magic_stack.HomeModulesConfigManager;
 import org.chromium.chrome.browser.magic_stack.HomeModulesConfigSettings;
 import org.chromium.chrome.browser.night_mode.NightModeMetrics.ThemeSettingsEntry;
-import org.chromium.chrome.browser.night_mode.NightModeUtils;
 import org.chromium.chrome.browser.night_mode.settings.ThemeSettingsFragment;
 import org.chromium.chrome.browser.password_check.PasswordCheck;
 import org.chromium.chrome.browser.password_check.PasswordCheckFactory;
@@ -201,7 +200,6 @@
         SigninAndHistorySyncActivityLauncherImpl.setLauncherForTest(
                 mSigninAndHistorySyncActivityLauncher);
         DeveloperSettings.setIsEnabledForTests(true);
-        NightModeUtils.setNightModeSupportedForTesting(true);
         Intents.init();
         // Keep render tests consistent by suppressing the "new" label.
         ChromeSharedPreferences.getInstance()
@@ -693,17 +691,8 @@
     @Test
     @SmallTest
     public void testRemoveSettings() {
-        // Disable night mode
-        NightModeUtils.setNightModeSupportedForTesting(false);
-
-        // Disable developer option
         DeveloperSettings.setIsEnabledForTests(false);
-
         startSettings();
-
-        Assert.assertNull(
-                "Preference should be disabled: " + MainSettings.PREF_UI_THEME,
-                mMainSettings.findPreference(MainSettings.PREF_UI_THEME));
         Assert.assertNull(
                 "Preference should be disabled: " + MainSettings.PREF_DEVELOPER,
                 mMainSettings.findPreference(MainSettings.PREF_DEVELOPER));
diff --git a/chrome/android/junit/BUILD.gn b/chrome/android/junit/BUILD.gn
index e9be5021..9043a4f 100644
--- a/chrome/android/junit/BUILD.gn
+++ b/chrome/android/junit/BUILD.gn
@@ -84,6 +84,7 @@
     "//chrome/browser/auxiliary_search:java",
     "//chrome/browser/auxiliary_search/proto:proto_java",
     "//chrome/browser/back_press/android:java",
+    "//chrome/browser/bookmarks/android:java",
     "//chrome/browser/browser_controls/android:java",
     "//chrome/browser/collaboration:factory_java",
     "//chrome/browser/collaboration:internal_java",
@@ -1266,7 +1267,6 @@
       "src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImplTest.java",
       "src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProviderTest.java",
       "src/org/chromium/chrome/browser/read_later/ReadLaterIphControllerUnitTest.java",
-      "src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java",
       "src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java",
       "src/org/chromium/chrome/browser/safe_browsing/PasswordProtectionBroadcastReceiverTest.java",
       "src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingReferringAppBridgeTest.java",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
index 622cfec..c09038c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -403,6 +403,7 @@
         doReturn(mOtherFolderItem).when(mBookmarkModel).getBookmarkById(mOtherFolderId);
         doReturn(mReadingListFolderId).when(mBookmarkModel).getLocalOrSyncableReadingListFolder();
         doReturn(mReadingListFolderItem).when(mBookmarkModel).getBookmarkById(mReadingListFolderId);
+        doReturn(true).when(mBookmarkModel).isReadingListFolder(mReadingListFolderId);
         doReturn(true).when(mBookmarkModel).doesBookmarkExist(any());
         doReturn(Arrays.asList(mFolderId2, mFolderId3))
                 .when(mBookmarkModel)
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java
index 9ba98a0e..a1e07db 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java
@@ -53,6 +53,7 @@
 import org.chromium.components.signin.identitymanager.IdentityManager;
 import org.chromium.ui.base.TestActivity;
 import org.chromium.url.GURL;
+import org.chromium.url.JUnitTestGURLs;
 
 /** Unit tests for {@link BookmarkUtils}. */
 @Batch(Batch.UNIT_TESTS)
@@ -236,4 +237,20 @@
                 mBookmarkModel.addManagedFolder(mBookmarkModel.getMobileFolderId(), "managed");
         assertFalse(BookmarkUtils.canAddFolderToParent(mBookmarkModel, managedFolder));
     }
+
+    @Test
+    public void isReadingListSupported() {
+        assertFalse(BookmarkUtils.isReadingListSupported(null));
+        assertFalse(BookmarkUtils.isReadingListSupported(GURL.emptyGURL()));
+        assertFalse(BookmarkUtils.isReadingListSupported(JUnitTestGURLs.NTP_URL));
+        assertTrue(BookmarkUtils.isReadingListSupported(JUnitTestGURLs.EXAMPLE_URL));
+        assertTrue(BookmarkUtils.isReadingListSupported(JUnitTestGURLs.HTTP_URL));
+
+        // empty url
+        GURL testUrl = GURL.emptyGURL();
+        assertFalse(BookmarkUtils.isReadingListSupported(testUrl));
+
+        // invalid url
+        assertFalse(BookmarkUtils.isReadingListSupported(JUnitTestGURLs.INVALID_URL));
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/SharedBookmarkModelMocks.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/SharedBookmarkModelMocks.java
index 9caa4e7..0e9b41f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/SharedBookmarkModelMocks.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/SharedBookmarkModelMocks.java
@@ -100,6 +100,7 @@
         doReturn(OTHER_BOOKMARK_ITEM).when(bookmarkModel).getBookmarkById(OTHER_BOOKMARK_ID);
         doReturn(MOBILE_BOOKMARK_ITEM).when(bookmarkModel).getBookmarkById(MOBILE_BOOKMARK_ID);
         doReturn(READING_LIST_ITEM).when(bookmarkModel).getBookmarkById(READING_LIST_BOOKMARK_ID);
+        doReturn(true).when(bookmarkModel).isReadingListFolder(READING_LIST_BOOKMARK_ID);
         doReturn(PARTNER_BOOKMARK_ITEM).when(bookmarkModel).getBookmarkById(PARTNER_BOOKMARK_ID);
         doReturn(FOLDER_ITEM_A).when(bookmarkModel).getBookmarkById(FOLDER_BOOKMARK_ID_A);
         doReturn(URL_ITEM_A).when(bookmarkModel).getBookmarkById(URL_BOOKMARK_ID_A);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java
deleted file mode 100644
index 45add0c..0000000
--- a/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.read_later;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.chrome.browser.bookmarks.BookmarkModel;
-import org.chromium.url.GURL;
-import org.chromium.url.JUnitTestGURLs;
-
-/** Unit test for {@link ReadingListUtils}. */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class ReadingListUtilsUnitTest {
-    @Mock BookmarkModel mBookmarkModel;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        doAnswer(
-                        (invocation) -> {
-                            ((Runnable) invocation.getArgument(0)).run();
-                            return null;
-                        })
-                .when(mBookmarkModel)
-                .finishLoadingBookmarkModel(any());
-    }
-
-    @Test
-    @SmallTest
-    public void isReadingListSupported() {
-        Assert.assertFalse(ReadingListUtils.isReadingListSupported(null));
-        Assert.assertFalse(ReadingListUtils.isReadingListSupported(GURL.emptyGURL()));
-        Assert.assertFalse(ReadingListUtils.isReadingListSupported(JUnitTestGURLs.NTP_URL));
-        Assert.assertTrue(ReadingListUtils.isReadingListSupported(JUnitTestGURLs.EXAMPLE_URL));
-        Assert.assertTrue(ReadingListUtils.isReadingListSupported(JUnitTestGURLs.HTTP_URL));
-
-        // empty url
-        GURL testUrl = GURL.emptyGURL();
-        Assert.assertFalse(ReadingListUtils.isReadingListSupported(testUrl));
-
-        // invalid url
-        Assert.assertFalse(ReadingListUtils.isReadingListSupported(JUnitTestGURLs.INVALID_URL));
-    }
-}
diff --git a/chrome/android/modules/stack_unwinder/stack_unwinder_module.gni b/chrome/android/modules/stack_unwinder/stack_unwinder_module.gni
index 2e0f7fbc..9ee40c9e 100644
--- a/chrome/android/modules/stack_unwinder/stack_unwinder_module.gni
+++ b/chrome/android/modules/stack_unwinder/stack_unwinder_module.gni
@@ -8,7 +8,7 @@
 # not enabled on non-official builds to not affect build time for developers.
 # The unwind file is ~2MB in apk, which is fine for Canary.
 add_unwind_tables_in_chrome_32bit_apk =
-    !skip_secondary_abi_for_cq && is_official_build &&
+    defined(android_app_secondary_abi) && is_official_build &&
     (target_cpu == "arm" || target_cpu == "arm64") &&
     (android_channel == "default" || android_channel == "beta" ||
      android_channel == "canary" || android_channel == "dev")
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index f2904754..bd9db75 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1191,6 +1191,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" />এ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ব্যৱহাৰ কৰাটো অব্যাহত ৰাখিব নোৱাৰে</translation>
 <translation id="1812284620455788548"><ph name="TAB_NAME" /> কাষ্ট কৰি থকা হৈছে</translation>
 <translation id="1813278315230285598">সেৱা</translation>
+<translation id="1813828404076816564">শ্বেয়াৰ কৰা টেবৰ গোটৰ সুবিধাটোৰ বিষয়ে মতামত পঠিয়াবলৈ মতামতৰ বুটামটো বাছনি কৰক</translation>
 <translation id="18139523105317219">EDI পাৰ্টিৰ নাম</translation>
 <translation id="1815083418640426271">নিকা পাঠ হিচাপে পে’ষ্ট কৰক</translation>
 <translation id="1815097521077272760">এই গে’মটোৰ বাবে কীব’ৰ্ডৰ নিয়ন্ত্ৰণ ব্যৱহাৰ কৰি চাবলৈ আপোনাক আমন্ত্ৰণ জনোৱা হৈছে।</translation>
@@ -4120,6 +4121,7 @@
 <translation id="3857807444929313943">ওপৰলৈ উঠাওক, তাৰ পাছত পুনৰ স্পৰ্শ কৰক</translation>
 <translation id="3858860766373142691">নাম</translation>
 <translation id="385939467708172187">বিশ্বস্ত পাছৱৰ্ড ব্যৱহাৰ কৰক</translation>
+<translation id="3859869403161297890">শ্বেয়াৰ কৰা টেবৰ গোটৰ বিষয়ে আপোনাৰ মতামত ইয়াত দিয়ক</translation>
 <translation id="3859987779882450877">স্বয়ংক্ৰিয়ভাৱে পৰামৰ্শ দিয়ে আৰু আপোনাৰ খুলি থোৱা টেবৰ পৰা গোট সৃষ্টি কৰে</translation>
 <translation id="386009056910366930">“<ph name="GROUP_NAME" />” টেবৰ গোটটো পৰিচালনা কৰক</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" ব্যৱহাৰকাৰীৰ নামটো উপলব্ধ নহয়</translation>
@@ -8173,6 +8175,7 @@
 <translation id="6805478749741295868">এইটো এটা পৰীক্ষামূলক AI সুবিধা আৰু সদায় শুদ্ধ ফলাফল প্ৰদৰ্শন নকৰে।</translation>
 <translation id="6805647936811177813"><ph name="HOST_NAME" />ৰ পৰা ক্লাইণ্টৰ প্ৰমাণপত্ৰ আমদানি কৰিবলৈ অনুগ্ৰহ কৰি <ph name="TOKEN_NAME" />ত ছাইন ইন কৰক।</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" />ত RLZ ট্ৰেকিং সক্ষম কৰক।</translation>
+<translation id="6805817411033102703">শ্বেয়াৰ কৰা টেবৰ গোটৰ বিষয়ে মতামত</translation>
 <translation id="6806089545527108739">অনুমতি নিদিব কিন্তু পাছত সুধিব</translation>
 <translation id="680644983456221885">Googleলৈ পঠিওৱা আপোনাৰ ব্ৰাউজিঙৰ ডেটাৰ ভিত্তিক বিপজ্জনক ছাইটসমূহ, ডাউনল’ড আৰু এক্সটেনশ্বনৰ পৰা ৰিয়েল টাইমত আগতীয়া সুৰক্ষা</translation>
 <translation id="6806781719264274042">কেৱল Google একাউণ্ট থকা আপোনাৰ সম্পৰ্কসমূহে। <ph name="LINK_BEGIN" />সম্পৰ্কসমূহ চাওক<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 862289f..56a4038 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1180,6 +1180,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" /> <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> istifadəsinə davam edə bilməz</translation>
 <translation id="1812284620455788548"><ph name="TAB_NAME" /> yayımlanır</translation>
 <translation id="1813278315230285598">Xidmətlər</translation>
+<translation id="1813828404076816564">Paylaşılan tab qrupları funksiyası ilə bağlı rəy göndərmək üçün rəy düyməsini seçin</translation>
 <translation id="18139523105317219">EDI Partiya Adı</translation>
 <translation id="1815083418640426271">Sadə Mətn Kimi Yerləşdirin</translation>
 <translation id="1815097521077272760">Bu oyun üçün klaviatura nəzarətini sınamağa dəvət olunmusunuz.</translation>
@@ -4108,6 +4109,7 @@
 <translation id="3857807444929313943">Qaldırın və təkrar toxunun</translation>
 <translation id="3858860766373142691">Ad</translation>
 <translation id="385939467708172187">Güclü paroldan istifadə edin</translation>
+<translation id="3859869403161297890">Paylaşılan tab qrupları haqqında rəyinizi burada göndərin</translation>
 <translation id="3859987779882450877">Açıq tablarınızdan avtomatik olaraq qruplar təklif edir və yaradır</translation>
 <translation id="386009056910366930">"<ph name="GROUP_NAME" />" tab qrupunu idarə edin</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" istifadəçi adı əlçatan deyil</translation>
@@ -8156,6 +8158,7 @@
 <translation id="6805478749741295868">Bu, təcrübi AI funksiyasıdır və həmişə doğru nəticə verməyə bilər.</translation>
 <translation id="6805647936811177813"><ph name="HOST_NAME" />'dan klient sertifikatını import etmək üçün <ph name="TOKEN_NAME" /> üzərinə daxil olun.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" /> üzərində RLZ izləməni aktiv edin.</translation>
+<translation id="6805817411033102703">Paylaşılan tab qrupları rəyi</translation>
 <translation id="6806089545527108739">İcazə verməyin, amma sonra soruşun</translation>
 <translation id="680644983456221885">Google-a göndərilən baxış datasına əsasən təhlükəli sayt, endirmə və artırmalardan real zamanda proaktiv qoruma</translation>
 <translation id="6806781719264274042">Yalnız Google Hesabı olan kontaktlarınız. <ph name="LINK_BEGIN" />Kontaktlara baxın<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 918d61f..a961e3a 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1194,6 +1194,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" />-এ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ব্যবহার করা চালিয়ে যাওয়া যাচ্ছে না</translation>
 <translation id="1812284620455788548"><ph name="TAB_NAME" /> কাস্ট করা হচ্ছে</translation>
 <translation id="1813278315230285598">পরিষেবাসমূহ</translation>
+<translation id="1813828404076816564">শেয়ার করা ট্যাব গ্রুপ ফিচার সম্পর্কিত মতামত পাঠাতে 'মতামত দিন' বোতাম বেছে নিন</translation>
 <translation id="18139523105317219">EDI পার্টি নাম</translation>
 <translation id="1815083418640426271">সাধারণ টেক্সট হিসেবে আটকে দিন</translation>
 <translation id="1815097521077272760">এই গেমের জন্য কীবোর্ড নিয়ন্ত্রণ চেষ্টা করার জন্য আপনাকে আমন্ত্রণ জানানো হয়েছে।</translation>
@@ -4123,6 +4124,7 @@
 <translation id="3857807444929313943">আঙ্গুল লিফ্ট করে আবার টাচ করুন</translation>
 <translation id="3858860766373142691">নাম</translation>
 <translation id="385939467708172187">শক্তিশালী পাসওয়ার্ড ব্যবহার করুন</translation>
+<translation id="3859869403161297890">এখানে শেয়ার করা ট্যাব গ্রুপ সম্পর্কে আপনার মতামত পাঠান</translation>
 <translation id="3859987779882450877">আপনার খোলা ট্যাবগুলিকে নিয়ে অটোমেটিক গ্রুপ তৈরি ও সাজেস্ট করে</translation>
 <translation id="386009056910366930">"<ph name="GROUP_NAME" />" ট্যাব গ্রুপ ম্যানেজ করুন</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" ইউজারনেমটি পাওয়া যাচ্ছে না</translation>
@@ -8178,6 +8180,7 @@
 <translation id="6805478749741295868">এটি হল পরীক্ষামূলক AI ফিচার এবং সব সময় সঠিক তথ্য দেবে না।</translation>
 <translation id="6805647936811177813"><ph name="HOST_NAME" /> থেকে ক্লায়েন্ট সার্টিফিকেট আমদানি করতে দয়া করে <ph name="TOKEN_NAME" />-এ প্রবেশ করুন৷</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" /> এ RLZ নজর রাখা সক্ষম করুন৷</translation>
+<translation id="6805817411033102703">শেয়ার করা ট্যাব গ্রুপ সম্পর্কিত মতামত</translation>
 <translation id="6806089545527108739">অনুমতি দেবেন না কিন্তু পরে জিজ্ঞাসা করুন</translation>
 <translation id="680644983456221885">Google-কে পাঠানো আপনার ব্রাউজ করা ডেটার উপর ভিত্তি করে বিপজ্জনক সাইট, ডাউনলোড এবং এক্সটেনশন থেকে রিয়েল-টাইমে সুরক্ষা পাওয়া যায়</translation>
 <translation id="6806781719264274042">শুধুমাত্র আপনার যেসব পরিচিতির Google অ্যাকাউন্ট রয়েছে। <ph name="LINK_BEGIN" />পরিচিতি দেখুন<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index a125960..0b490dec 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1181,6 +1181,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" /> kann <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> nicht mehr verwenden</translation>
 <translation id="1812284620455788548">„<ph name="TAB_NAME" />“ wird gestreamt</translation>
 <translation id="1813278315230285598">Dienste</translation>
+<translation id="1813828404076816564">Wähle die Feedback-Schaltfläche aus, um Feedback zur Funktion „Geteilte Tabgruppen“ zu senden</translation>
 <translation id="18139523105317219">Name der EDI-Partei</translation>
 <translation id="1815083418640426271">Als unformatierten Text einfügen</translation>
 <translation id="1815097521077272760">Du wurdest eingeladen, die Tastatursteuerung für dieses Spiel auszuprobieren.</translation>
@@ -4104,6 +4105,7 @@
 <translation id="3857807444929313943">Anheben und erneut berühren</translation>
 <translation id="3858860766373142691">Name</translation>
 <translation id="385939467708172187">Starkes Passwort verwenden</translation>
+<translation id="3859869403161297890">Hier kannst du Feedback zu geteilten Tabgruppen geben</translation>
 <translation id="3859987779882450877">Es werden automatisch Gruppen aus deinen geöffneten Tabs vorgeschlagen und erstellt</translation>
 <translation id="386009056910366930">Tabgruppe „<ph name="GROUP_NAME" />“ verwalten</translation>
 <translation id="3861638017150647085">Der Nutzername "<ph name="USERNAME" />" ist nicht verfügbar</translation>
@@ -8151,6 +8153,7 @@
 <translation id="6805478749741295868">Dies ist eine experimentelle KI-Funktion, die nicht immer richtig funktioniert.</translation>
 <translation id="6805647936811177813">Melde dich in <ph name="TOKEN_NAME" /> an, um das Clientzertifikat von <ph name="HOST_NAME" /> herunterzuladen.</translation>
 <translation id="680572642341004180">RLZ-Nachverfolgung für <ph name="SHORT_PRODUCT_OS_NAME" /> aktivieren</translation>
+<translation id="6805817411033102703">Feedback zu geteilten Tabgruppen</translation>
 <translation id="6806089545527108739">Nicht zulassen, später noch einmal fragen</translation>
 <translation id="680644983456221885">Proaktiver Schutz in Echtzeit vor gefährlichen Websites, Downloads und Erweiterungen auf Basis deiner Browserdaten, die an Google gesendet werden.</translation>
 <translation id="6806781719264274042">Nur meine Kontakte mit einem Google-Konto. <ph name="LINK_BEGIN" />Kontakte anzeigen<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index e1eed99..55e9b9e 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1185,6 +1185,7 @@
 <translation id="1812027881030482584">Sait <ph name="SITE_ETLD_PLUS_ONE" /> ei saa teenuse <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> kasutamisega jätkata</translation>
 <translation id="1812284620455788548">Vahelehe <ph name="TAB_NAME" /> ülekandmine</translation>
 <translation id="1813278315230285598">Teenused</translation>
+<translation id="1813828404076816564">Jagatud vahelehegruppide funktsiooni kohta tagasiside saatmiseks valige tagasiside nupp</translation>
 <translation id="18139523105317219">EDI-osapoole nimi</translation>
 <translation id="1815083418640426271">Kleebi lihttekstina</translation>
 <translation id="1815097521077272760">Saite kutse proovida selles mängus klaviatuuriga juhtimist.</translation>
@@ -4113,6 +4114,7 @@
 <translation id="3857807444929313943">Tõstke sõrm andurilt ja seejärel puudutage uuesti</translation>
 <translation id="3858860766373142691">Nimi</translation>
 <translation id="385939467708172187">Kasutage tugevat parooli</translation>
+<translation id="3859869403161297890">Tagasisidet jagatud vahelehegruppide kohta saate saata siin</translation>
 <translation id="3859987779882450877">Soovitab teie avatud vahelehtede põhjal automaatselt gruppe ja loob need</translation>
 <translation id="386009056910366930">Vahelehegrupi „<ph name="GROUP_NAME" />“ haldamine</translation>
 <translation id="3861638017150647085">Kasutajanime „<ph name="USERNAME" />” pole saadaval</translation>
@@ -8165,6 +8167,7 @@
 <translation id="6805478749741295868">See on katsejärgus AI funktsioon ega saa alati õigeid tulemusi.</translation>
 <translation id="6805647936811177813">Logige sisse rakendusse <ph name="TOKEN_NAME" /> rakendusest <ph name="HOST_NAME" /> kliendi sertifikaadi importimiseks.</translation>
 <translation id="680572642341004180">Lubage RLZ-i jälgimine rakenduses <ph name="SHORT_PRODUCT_OS_NAME" />.</translation>
+<translation id="6805817411033102703">Tagasiside jagatud vahelehegruppide kohta</translation>
 <translation id="6806089545527108739">Ära luba, aga küsi hiljem</translation>
 <translation id="680644983456221885">Reaalajas ja ennetav kaitse ohtlike saitide, allalaadimiste ja laienduste eest, mis põhineb teie sirvimisandmetel, mis saadetakse Google'ile</translation>
 <translation id="6806781719264274042">Ainult teie kontaktid, kellel on Google'i konto. <ph name="LINK_BEGIN" />Vaadake kontakte<ph name="LINK_END" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 1ced30f9..9806cb18 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1185,6 +1185,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" /> ne peut pas continuer à utiliser <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation>
 <translation id="1812284620455788548">Diffusion de <ph name="TAB_NAME" /></translation>
 <translation id="1813278315230285598">Services</translation>
+<translation id="1813828404076816564">Sélectionner le bouton de commentaires pour envoyer des commentaires concernant la fonctionnalité de groupes d'onglets partagés</translation>
 <translation id="18139523105317219">Nom de partie EDI</translation>
 <translation id="1815083418640426271">Coller en tant que texte brut</translation>
 <translation id="1815097521077272760">Vous avez été invité à essayer les commandes clavier pour ce jeu.</translation>
@@ -4112,6 +4113,7 @@
 <translation id="3857807444929313943">Relever le doigt et toucher le capteur de nouveau</translation>
 <translation id="3858860766373142691">Nom</translation>
 <translation id="385939467708172187">Utilisez un mot de passe fort</translation>
+<translation id="3859869403161297890">Envoyez vos commentaires sur les groupes d'onglets partagés ici.</translation>
 <translation id="3859987779882450877">Suggère et crée automatiquement des groupes à partir de vos onglets ouverts.</translation>
 <translation id="386009056910366930">Gérer le groupe d'onglets « <ph name="GROUP_NAME" /> »</translation>
 <translation id="3861638017150647085">Le nom d'utilisateur « <ph name="USERNAME" /> » n'est pas disponible</translation>
@@ -8164,6 +8166,7 @@
 <translation id="6805478749741295868">Il s'agit d'une fonctionnalité d'IA expérimentale et elle ne fonctionnera pas toujours correctement.</translation>
 <translation id="6805647936811177813">Veuillez vous connecter à <ph name="TOKEN_NAME" /> pour importer le certificat client de <ph name="HOST_NAME" />.</translation>
 <translation id="680572642341004180">Activer le suivi RLZ pour <ph name="SHORT_PRODUCT_OS_NAME" />.</translation>
+<translation id="6805817411033102703">Commentaires sur les groupes d'onglets partagés</translation>
 <translation id="6806089545527108739">Ne pas autoriser, mais demander plus tard</translation>
 <translation id="680644983456221885">Une protection proactive en temps réel contre les sites, les extensions et les téléchargements dangereux, basée sur les données de navigation envoyées à Google</translation>
 <translation id="6806781719264274042">Seulement vos contacts qui ont un compte Google. <ph name="LINK_BEGIN" />Afficher les contacts<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 7ccd4fb..f22818d4 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1183,6 +1183,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" /> non pode continuar usando <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation>
 <translation id="1812284620455788548">Emitindo <ph name="TAB_NAME" /></translation>
 <translation id="1813278315230285598">Servizos</translation>
+<translation id="1813828404076816564">Selecciona o botón correspondente para enviar comentarios sobre a función de grupos de pestanas compartidos</translation>
 <translation id="18139523105317219">Nome da parte EDI</translation>
 <translation id="1815083418640426271">Pegar como texto sen formato</translation>
 <translation id="1815097521077272760">Convidáronte a probar o control co teclado neste xogo.</translation>
@@ -4111,6 +4112,7 @@
 <translation id="3857807444929313943">Levanta o dedo e volve tocar o sensor</translation>
 <translation id="3858860766373142691">Nome</translation>
 <translation id="385939467708172187">Usa este contrasinal seguro</translation>
+<translation id="3859869403161297890">Envía comentarios sobre os grupos de pestanas compartidos aquí</translation>
 <translation id="3859987779882450877">Suxerirá e creará grupos automaticamente a partir das pestanas que teñas abertas</translation>
 <translation id="386009056910366930">Xestionar o grupo de pestanas "<ph name="GROUP_NAME" />"</translation>
 <translation id="3861638017150647085">O nome de usuario "<ph name="USERNAME" />" non está dispoñible</translation>
@@ -8160,6 +8162,7 @@
 <translation id="6805478749741295868">Esta función de IA é experimental e non sempre acerta.</translation>
 <translation id="6805647936811177813">Inicia sesión en <ph name="TOKEN_NAME" /> para importar o certificado do cliente de <ph name="HOST_NAME" />.</translation>
 <translation id="680572642341004180">Activar seguimento RLZ en <ph name="SHORT_PRODUCT_OS_NAME" />.</translation>
+<translation id="6805817411033102703">Comentarios sobre os grupos de pestanas compartidos</translation>
 <translation id="6806089545527108739">Non permitir, pero preguntar máis tarde</translation>
 <translation id="680644983456221885">Protección proactiva e en tempo real contra sitios, descargas e extensións perigosos baseada nos teus datos de navegación enviados a Google</translation>
 <translation id="6806781719264274042">Só os contactos que teñan unha Conta de Google. <ph name="LINK_BEGIN" />Ver contactos<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index c35d5ad..c282fcd 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1181,6 +1181,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" /> എന്നതിന് <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ഉപയോഗിക്കുന്നത് തുടരാനാകുന്നില്ല</translation>
 <translation id="1812284620455788548"><ph name="TAB_NAME" /> കാസ്റ്റ് ചെയ്യുന്നു</translation>
 <translation id="1813278315230285598">സേവനങ്ങള്‍</translation>
+<translation id="1813828404076816564">പങ്കിട്ട ടാബ് ഗ്രൂപ്പുകൾ ഫീച്ചറിനെ കുറിച്ച് ഫീഡ്ബാക്ക് അയയ്ക്കാൻ ഫീഡ്ബാക്ക് ബട്ടൺ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="18139523105317219">EDI പാര്‍‌ട്ടി നാമം</translation>
 <translation id="1815083418640426271">പ്ലെയിന്‍ വാചകമായി ഒട്ടിക്കുക</translation>
 <translation id="1815097521077272760">ഈ ഗെയിമിനുള്ള കീബോർഡ് നിയന്ത്രണം പരീക്ഷിക്കാൻ നിങ്ങളെ ക്ഷണിച്ചു.</translation>
@@ -4106,6 +4107,7 @@
 <translation id="3857807444929313943">വിരൽ ഉയർത്തി, വീണ്ടും സ്‌പർശിക്കുക</translation>
 <translation id="3858860766373142691">പേര്</translation>
 <translation id="385939467708172187">ശക്തമായ പാസ്‌വേഡ് ഉപയോഗിക്കുക</translation>
+<translation id="3859869403161297890">പങ്കിട്ട ടാബ് ഗ്രൂപ്പുകളെ കുറിച്ചുള്ള നിങ്ങളുടെ ഫീഡ്‌ബാക്ക് ഇവിടെ അയയ്ക്കുക</translation>
 <translation id="3859987779882450877">നിങ്ങളുടെ തുറന്നിരിക്കുന്ന ടാബുകളിൽ നിന്ന് സ്വയമേവ ഗ്രൂപ്പുകൾ നിർദ്ദേശിക്കുകയും സൃഷ്ടിക്കുകയും ചെയ്യുന്നു</translation>
 <translation id="386009056910366930">“<ph name="GROUP_NAME" />” ടാബ് ഗ്രൂപ്പ് മാനേജ് ചെയ്യുക</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" എന്ന ഉപയോക്തൃനാമം ലഭ്യമല്ല</translation>
@@ -8157,6 +8159,7 @@
 <translation id="6805478749741295868">ഇതൊരു പരീക്ഷണാത്മക AI ഫീച്ചറാണ്, ഇത് എല്ലായ്‌പ്പോഴും ശരിയായിരിക്കണമെന്നുമില്ല.</translation>
 <translation id="6805647936811177813"><ph name="HOST_NAME" /> എന്നതില്‍ നിന്നും ക്ലയന്‍റ് സര്‍ട്ടിഫിക്കറ്റ് ഇമ്പോർട്ട് ചെയ്യുന്നതിന് <ph name="TOKEN_NAME" /> എന്നതിലേക്ക് ദയവായി പ്രവേശിക്കുക.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" />-ൽ RLZ ട്രാക്ക് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
+<translation id="6805817411033102703">പങ്കിട്ട ടാബ് ഗ്രൂപ്പുകളെ കുറിച്ചുള്ള ഫീഡ്ബാക്ക്</translation>
 <translation id="6806089545527108739">അനുവദിക്കരുത്, എന്നാൽ പിന്നീട് ചോദിക്കുക</translation>
 <translation id="680644983456221885">Google-ലേക്ക് അയയ്‌ക്കുന്ന നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയെ അടിസ്ഥാനമാക്കി അപകടകരമായ സൈറ്റുകൾ, ഡൗൺലോഡുകൾ, വിപുലീകരണങ്ങൾ എന്നിവയിൽ നിന്ന് തത്സമയവും സജീവവുമായുള്ള പരിരക്ഷ</translation>
 <translation id="6806781719264274042">Google Account ഉള്ള നിങ്ങളുടെ കോൺടാക്റ്റുകൾ മാത്രം. <ph name="LINK_BEGIN" />കോൺടാക്റ്റുകൾ കാണുക<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index b00a077..91d908a 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1193,6 +1193,7 @@
 <translation id="1812027881030482584"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ஐப் பயன்படுத்தி <ph name="SITE_ETLD_PLUS_ONE" /> ஐத் தொடர முடியாது</translation>
 <translation id="1812284620455788548"><ph name="TAB_NAME" /> உலாவிப் பக்கத்தை அலைபரப்புகிறது</translation>
 <translation id="1813278315230285598">சேவைகள்</translation>
+<translation id="1813828404076816564">பகிர்ந்த பக்கக் குழுக்கள் அம்சம் குறித்த கருத்தை அனுப்ப கருத்து பட்டனைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="18139523105317219">EDI பார்ட்டி பெயர்</translation>
 <translation id="1815083418640426271">எளிய உரையாக ஒட்டு</translation>
 <translation id="1815097521077272760">இந்த கேமிற்கான கீபோர்டு கட்டுப்பாடுகளைப் பயன்படுத்திப் பார்க்க நீங்கள் அழைக்கப்பட்டுள்ளீர்கள்.</translation>
@@ -4122,6 +4123,7 @@
 <translation id="3857807444929313943">விரலை எடுத்துவிட்டு மீண்டும் தொடவும்</translation>
 <translation id="3858860766373142691">பெயர்</translation>
 <translation id="385939467708172187">வலிமையான கடவுச்சொல்லைப் பயன்படுத்துங்கள்</translation>
+<translation id="3859869403161297890">பகிர்ந்த பக்கக் குழுக்கள் குறித்த உங்கள் கருத்தை இங்கே அனுப்பலாம்</translation>
 <translation id="3859987779882450877">நீங்கள் திறக்கும் பக்கங்களின் அடிப்படையில் தானாகவே குழுக்களைப் பரிந்துரைக்கும் உருவாக்கும்</translation>
 <translation id="386009056910366930">“<ph name="GROUP_NAME" />” பக்கக் குழுவை நிர்வகியுங்கள்</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" என்ற பயனர்பெயரைப் பயன்படுத்த முடியாது</translation>
@@ -8175,6 +8177,7 @@
 <translation id="6805478749741295868">இது பரிசோதனைக் கட்டத்தில் உள்ள AI அம்சம் என்பதால் சில சமயங்களில் சரியாகச் செயல்படாமல் போகலாம்.</translation>
 <translation id="6805647936811177813"><ph name="HOST_NAME" /> இல் இருந்து கிளையண்ட் சான்றிதழை இறக்குமதி செய்ய <ph name="TOKEN_NAME" /> இல் தயவுசெய்து உள்நுழைக.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" /> இல் RLZ கண்காணிப்பை இயக்கு.</translation>
+<translation id="6805817411033102703">பகிர்ந்த பக்கக் குழுக்கள் குறித்த கருத்து</translation>
 <translation id="6806089545527108739">இப்போது அனுமதிக்காதே, பின்னர் கேள்</translation>
 <translation id="680644983456221885">Googleளுக்கு அனுப்பப்படும் உலாவிய தரவின் அடிப்படையில் ஆபத்தான இணையதளங்கள், பதிவிறக்கங்கள், நீட்டிப்புகள் ஆகியவற்றில் இருந்து நிகழ்நேர, முன்கூட்டிய பாதுகாப்பு</translation>
 <translation id="6806781719264274042">Google கணக்கை வைத்திருக்கும் உங்கள் தொடர்புகள் மட்டும். <ph name="LINK_BEGIN" />தொடர்புகளைக் காட்டு<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 36fdbea..9054adf 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1184,6 +1184,7 @@
 <translation id="1812027881030482584"><ph name="SITE_ETLD_PLUS_ONE" />, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> kullanarak devam edemiyor</translation>
 <translation id="1812284620455788548"><ph name="TAB_NAME" /> yayınlanıyor</translation>
 <translation id="1813278315230285598">Hizmetler</translation>
+<translation id="1813828404076816564">Ortak sekme grupları özelliğiyle ilgili geri bildirim göndermek için geri bildirim düğmesini seçin</translation>
 <translation id="18139523105317219">EDI Grup Adı</translation>
 <translation id="1815083418640426271">Düz Metin Olarak Yapıştır</translation>
 <translation id="1815097521077272760">Bu oyundaki klavye kontrolü özelliğini denemeye davet edildiniz.</translation>
@@ -4105,6 +4106,7 @@
 <translation id="3857807444929313943">Kaldırın, tekrar dokunun</translation>
 <translation id="3858860766373142691">Ad</translation>
 <translation id="385939467708172187">Güçlü Şifre Kullanın</translation>
+<translation id="3859869403161297890">Ortak sekme gruplarıyla ilgili geri bildiriminizi buradan gönderin</translation>
 <translation id="3859987779882450877">Açık sekmelerinizden otomatik olarak gruplar önerir ve oluşturur</translation>
 <translation id="386009056910366930">"<ph name="GROUP_NAME" />" sekme grubunu yönetin</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" kullanıcı adı kullanılamıyor</translation>
@@ -8157,6 +8159,7 @@
 <translation id="6805478749741295868">Bu, deneysel bir yapay zeka özelliği olduğundan her zaman düzgün çalışmayabilir.</translation>
 <translation id="6805647936811177813"><ph name="HOST_NAME" /> adresinden istemci sertifikasını içe aktarmak için lütfen <ph name="TOKEN_NAME" /> cihazında oturum açın.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" /> üzerinde RLZ izlemeyi etkinleştir.</translation>
+<translation id="6805817411033102703">Ortak sekme gruplarıyla ilgili geri bildirim</translation>
 <translation id="6806089545527108739">İzin verme, ancak daha sonra sor</translation>
 <translation id="680644983456221885">Tarama verilerinizin Google'a gönderilmesi aracılığıyla tehlikeli siteler, indirmeler ve uzantılara karşı gerçek zamanlı, proaktif koruma</translation>
 <translation id="6806781719264274042">Yalnızca Google Hesabı olan kişileriniz. <ph name="LINK_BEGIN" />Kişileri göster<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 502a5e39..4d54bb8a 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1196,6 +1196,7 @@
 <translation id="1812027881030482584">Не вдається ввійти на сайті <ph name="SITE_ETLD_PLUS_ONE" /> за допомогою сервісу "<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />"</translation>
 <translation id="1812284620455788548">Трансляція вкладки <ph name="TAB_NAME" /></translation>
 <translation id="1813278315230285598">Служби</translation>
+<translation id="1813828404076816564">Щоб надіслати відгук про спільні групи вкладок, натисніть кнопку "Відгук"</translation>
 <translation id="18139523105317219">Ім'я сторони EDI</translation>
 <translation id="1815083418640426271">Вставити як звичайний текст</translation>
 <translation id="1815097521077272760">Вас запрошують спробувати керувати цією грою за допомогою клавіатури.</translation>
@@ -4125,6 +4126,7 @@
 <translation id="3857807444929313943">Підніміть і опустіть палець</translation>
 <translation id="3858860766373142691">Назва</translation>
 <translation id="385939467708172187">Використати надійний пароль</translation>
+<translation id="3859869403161297890">Тут ви можете надіслати відгук про спільні групи вкладок</translation>
 <translation id="3859987779882450877">Автоматично пропонує і створює групи з відкритих вкладок</translation>
 <translation id="386009056910366930">Керувати групою вкладок "<ph name="GROUP_NAME" />"</translation>
 <translation id="3861638017150647085">Ім'я користувача "<ph name="USERNAME" />" недоступне</translation>
@@ -8178,6 +8180,7 @@
 <translation id="6805478749741295868">Це експериментальна функція ШІ, тому вона не завжди працює правильно.</translation>
 <translation id="6805647936811177813">Увійдіть у <ph name="TOKEN_NAME" />, щоб імпортувати сертифікат клієнта з <ph name="HOST_NAME" />.</translation>
 <translation id="680572642341004180">Увімкнути відстеження RLZ в <ph name="SHORT_PRODUCT_OS_NAME" />.</translation>
+<translation id="6805817411033102703">Відгук про спільні групи вкладок</translation>
 <translation id="6806089545527108739">Не дозволяти, але запитати пізніше</translation>
 <translation id="680644983456221885">Розумний захист у реальному часі від небезпечних сайтів, завантажень і розширень на основі ваших даних веб-перегляду, що надсилаються в Google</translation>
 <translation id="6806781719264274042">Лише ваші контакти, які мають обліковий запис Google. <ph name="LINK_BEGIN" />Переглянути контакти<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 517f156..4fd193d 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1192,6 +1192,7 @@
 <translation id="1812027881030482584">I-<ph name="SITE_ETLD_PLUS_ONE" /> ayikwazi ukuqhubeka isebenzisa i-<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation>
 <translation id="1812284620455788548">Kwethulwa i-<ph name="TAB_NAME" /></translation>
 <translation id="1813278315230285598">Amasevisi</translation>
+<translation id="1813828404076816564">Khetha inkinobho yempendulo ukuze uthumele impendulo mayelana nesakhi samaqembu wethebhu eyabiwe</translation>
 <translation id="18139523105317219">Igama lenhlangano ye-EDI</translation>
 <translation id="1815083418640426271">Namathisela njengombhalo ongenalutho</translation>
 <translation id="1815097521077272760">Umenywe ukuthi uzame ukulawula ikhibhodi yale geyimu.</translation>
@@ -4123,6 +4124,7 @@
 <translation id="3857807444929313943">Phakamisa, bese uyathinta futhi</translation>
 <translation id="3858860766373142691">Igama</translation>
 <translation id="385939467708172187">Sebenzisa iphasiwedi eqinile</translation>
+<translation id="3859869403161297890">Thumela impendulo yakho mayelana namaqembu amathebhu okwabelwana ngawo lapha</translation>
 <translation id="3859987779882450877">Iphakamisa ngokuzenzakalela iphinde isungule amaqembu kusukela kumathebhu akho avuliwe</translation>
 <translation id="386009056910366930">Phatha iqembu lethebhu elithi "<ph name="GROUP_NAME" />"</translation>
 <translation id="3861638017150647085">Igama lomsebenzisi "<ph name="USERNAME" />" alitholakali</translation>
@@ -8177,6 +8179,7 @@
 <translation id="6805478749741295868">Lesi isakhi se-AI esihlolwayo futhi ngeke siyithole kahle ngaso sonke isikhathi.</translation>
 <translation id="6805647936811177813">Sicela ungene ngemvume ku-<ph name="TOKEN_NAME" /> ukuze ungenise isitifiketi seklayenti kusuka ku-<ph name="HOST_NAME" />.</translation>
 <translation id="680572642341004180">Nika amandla ukulandelela kwe-RLZ ku-<ph name="SHORT_PRODUCT_OS_NAME" />.</translation>
+<translation id="6805817411033102703">Impendulo yamaqembu wethebhu eyabiwe</translation>
 <translation id="6806089545527108739">Ungakuvumeli kodwa ubuze kamuva</translation>
 <translation id="680644983456221885">Isikhathi sangempela, isivikelo esisebenzayo kumasayithi ayingozi, ukudawuniloda, nezandiso ezisuselwa kudatha yakho yokubhrawuza ethunyelwa ku-Google</translation>
 <translation id="6806781719264274042">Oxhumana nabo kuphela abaneGoogle Account. <ph name="LINK_BEGIN" />Buka oxhumana nabo<ph name="LINK_END" /></translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 29858d2..f6966f74 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -345,6 +345,8 @@
     "component_updater/pnacl_component_installer.h",
     "component_updater/privacy_sandbox_attestations_component_installer.cc",
     "component_updater/privacy_sandbox_attestations_component_installer.h",
+    "component_updater/probabilistic_reveal_token_component_installer.cc",
+    "component_updater/probabilistic_reveal_token_component_installer.h",
     "component_updater/recovery_component_installer.cc",
     "component_updater/recovery_component_installer.h",
     "component_updater/recovery_improved_component_installer.cc",
@@ -2139,6 +2141,8 @@
     "//components/infobars/core",
     "//components/invalidation",
     "//components/invalidation/impl",
+    "//components/ip_protection/common:ip_protection_telemetry",
+    "//components/ip_protection/common:masked_domain_list",
     "//components/javascript_dialogs",
     "//components/keyed_service/content",
     "//components/language/content/browser",
@@ -4534,6 +4538,8 @@
         "upgrade_detector/installed_version_poller.h",
         "upgrade_detector/upgrade_detector_impl.cc",
         "upgrade_detector/upgrade_detector_impl.h",
+        "upgrade_detector/version_history_client.cc",
+        "upgrade_detector/version_history_client.h",
         "usb/usb_status_icon.cc",
         "usb/usb_status_icon.h",
       ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 69a973550..ccba88a0 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1888,9 +1888,14 @@
 
 const FeatureEntry::FeatureParam kNtpOutlookCalendarModuleFakeData[] = {
     {ntp_features::kNtpOutlookCalendarModuleDataParam, "fake"}};
+const FeatureEntry::FeatureParam
+    kNtpOutlookCalendarModuleFakeAttachmentsData[] = {
+        {ntp_features::kNtpOutlookCalendarModuleDataParam, "fake-attachments"}};
 const FeatureEntry::FeatureVariation kNtpOutlookCalendarModuleVariations[] = {
     {"- Fake Data", kNtpOutlookCalendarModuleFakeData,
      std::size(kNtpOutlookCalendarModuleFakeData), nullptr},
+    {"- Fake Attachments Data", kNtpOutlookCalendarModuleFakeAttachmentsData,
+     std::size(kNtpOutlookCalendarModuleFakeAttachmentsData), nullptr},
 };
 
 const FeatureEntry::FeatureParam kNtpMiddleSlotPromoDismissalFakeData[] = {
@@ -5786,6 +5791,10 @@
      flag_descriptions::kAccessibilityIncludeLongClickActionDescription,
      kOsAndroid,
      FEATURE_VALUE_TYPE(features::kAccessibilityIncludeLongClickAction)},
+    {"enable-accessibility-text-formatting",
+     flag_descriptions::kAccessibilityTextFormattingName,
+     flag_descriptions::kAccessibilityTextFormattingDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(features::kAccessibilityTextFormatting)},
     {"enable-accessibility-unified-snapshots",
      flag_descriptions::kAccessibilityUnifiedSnapshotsName,
      flag_descriptions::kAccessibilityUnifiedSnapshotsDescription, kOsAndroid,
@@ -8198,12 +8207,34 @@
     {"media-app-pdf-mahi", flag_descriptions::kMediaAppPdfMahiName,
      flag_descriptions::kMediaAppPdfMahiDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kMediaAppPdfMahi)},
+    {"media-app-image-mantis-erase",
+     flag_descriptions::kMediaAppImageMantisEraseName,
+     flag_descriptions::kMediaAppImageMantisEraseDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kMediaAppImageMantisErase)},
+    {"media-app-image-mantis-expand-background",
+     flag_descriptions::kMediaAppImageMantisExpandBackgroundName,
+     flag_descriptions::kMediaAppImageMantisExpandBackgroundDescription,
+     kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kMediaAppImageMantisExpandBackground)},
+    {"media-app-image-mantis-make-a-sticker",
+     flag_descriptions::kMediaAppImageMantisMakeAStickerName,
+     flag_descriptions::kMediaAppImageMantisMakeAStickerDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kMediaAppImageMantisMakeASticker)},
     {"media-app-image-mantis-model",
      flag_descriptions::kMediaAppImageMantisModelName,
      flag_descriptions::kMediaAppImageMantisModelDescription, kOsCrOS,
      FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kMediaAppImageMantisModel,
                                     kMediaAppImageMantisModelVariations,
                                     "MediaAppImageMantisModel")},
+    {"media-app-image-mantis-reimagine",
+     flag_descriptions::kMediaAppImageMantisReimagineName,
+     flag_descriptions::kMediaAppImageMantisReimagineDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kMediaAppImageMantisReimagine)},
+    {"media-app-image-mantis-remove-background",
+     flag_descriptions::kMediaAppImageMantisRemoveBackgroundName,
+     flag_descriptions::kMediaAppImageMantisRemoveBackgroundDescription,
+     kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kMediaAppImageMantisRemoveBackground)},
     {"on-device-app-controls", flag_descriptions::kOnDeviceAppControlsName,
      flag_descriptions::kOnDeviceAppControlsDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kForceOnDeviceAppControlsForAllRegions)},
@@ -8706,9 +8737,7 @@
      flag_descriptions::kGlobalVaapiLockDescription, kOsCrOS | kOsLinux,
      FEATURE_VALUE_TYPE(media::kGlobalVaapiLock)},
 
-#if BUILDFLAG(IS_WIN) ||                                      \
-    (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
-    BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
     {
         "ui-debug-tools",
         flag_descriptions::kUIDebugToolsName,
@@ -9162,7 +9191,7 @@
      STRING_VALUE_TYPE(switches::kDemoModeTestTag, "")},
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_WIN)
     {"enable-delegated-compositing",
      flag_descriptions::kEnableDelegatedCompositingName,
      flag_descriptions::kEnableDelegatedCompositingDescription, kOsAll,
@@ -11706,6 +11735,11 @@
      flag_descriptions::kPrivacySandboxAdTopicsContentParityDescription, kOsAll,
      FEATURE_VALUE_TYPE(privacy_sandbox::kPrivacySandboxAdTopicsContentParity)},
 
+    {"autofill-enable-card-expired-text",
+     flag_descriptions::kAutofillEnableCardExpiredTextName,
+     flag_descriptions::kAutofillEnableCardExpiredTextDescription, kOsAll,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardExpiredText)},
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc
index 15e2dccc..560bbe8 100644
--- a/chrome/browser/after_startup_task_utils.cc
+++ b/chrome/browser/after_startup_task_utils.cc
@@ -13,7 +13,6 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "components/performance_manager/public/graph/graph.h"
 #include "components/performance_manager/public/graph/page_node.h"
@@ -21,14 +20,10 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ui/ash/login/login_display_host.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/startup/browser_params_proxy.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 using content::BrowserThread;
 
 namespace {
@@ -155,19 +150,11 @@
   StartupObserver() = default;
 
   void OnStartupComplete() {
-    if (!PerformanceManager::IsAvailable()) {
-      // Already shutting down before startup finished. Do not notify.
-      return;
-    }
+    CHECK(PerformanceManager::IsAvailable());
 
-    // This should only be called once.
-    if (!startup_complete_) {
-      startup_complete_ = true;
-      content::GetUIThreadTaskRunner({})->PostTask(
-          FROM_HERE, base::BindOnce(&SetBrowserStartupIsComplete));
-      // This will result in delete getting called.
-      TakeFromGraph();
-    }
+    SetBrowserStartupIsComplete();
+    // This will result in delete getting called.
+    TakeFromGraph();
   }
 
   // GraphOwned overrides
@@ -191,54 +178,28 @@
     }
   }
 
-  void PassToGraph() {
-    // Pass to the performance manager so we can get notified when
-    // loading completes.  Ownership of this object is passed to the
-    // performance manager.
-    DCHECK(PerformanceManager::IsAvailable());
-    PerformanceManager::PassToGraph(FROM_HERE, base::WrapUnique(this));
-  }
-
   void TakeFromGraph() {
     // Remove this object from the performance manager.  This will
     // cause the object to be deleted.
-    DCHECK(PerformanceManager::IsAvailable());
-    PerformanceManager::CallOnGraph(
-        FROM_HERE, base::BindOnce(
-                       [](performance_manager::GraphOwned* observer,
-                          performance_manager::Graph* graph) {
-                         graph->TakeFromGraph(observer);
-                       },
-                       base::Unretained(this)));
+    CHECK(PerformanceManager::IsAvailable());
+    PerformanceManager::GetGraph()->TakeFromGraph(this);
   }
-
-  bool startup_complete_ = false;
 };
 
 // static
 void StartupObserver::Start() {
-  // Create the StartupObserver and pass it to the Performance Manager which
-  // will own it going forward.
-  (new StartupObserver)->PassToGraph();
+  CHECK(PerformanceManager::IsAvailable());
+
+  // Pass a new StartupObserver to the performance manager so we can get
+  // notified when loading completes. The performance manager takes ownership.
+  PerformanceManager::GetGraph()->PassToGraph(
+      base::WrapUnique(new StartupObserver()));
 }
 
 }  // namespace
 
 void AfterStartupTaskUtils::StartMonitoringStartup() {
-  // For Android, startup completion is signaled via
-  // AfterStartupTaskUtils.java. We do not use the StartupObserver.
-#if !BUILDFLAG(IS_ANDROID)
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // For Lacros, there may not be a Browser created at startup.
-  if (chromeos::BrowserParamsProxy::Get()->InitialBrowserAction() ==
-      crosapi::mojom::InitialBrowserAction::kDoNotOpenWindow) {
-    content::GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE, base::BindOnce(&SetBrowserStartupIsComplete));
-    return;
-  }
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If we are on a login screen which does not expect WebUI to be loaded,
   // Browser won't be created at startup.
   if (ash::LoginDisplayHost::default_host() &&
@@ -249,6 +210,9 @@
   }
 #endif
 
+  // For Android, startup completion is signaled via
+  // AfterStartupTaskUtils.java. We do not use the StartupObserver.
+#if !BUILDFLAG(IS_ANDROID)
   StartupObserver::Start();
 #endif  // !BUILDFLAG(IS_ANDROID)
 
diff --git a/chrome/browser/ai/ai_language_model.cc b/chrome/browser/ai/ai_language_model.cc
index 26113450..637933d 100644
--- a/chrome/browser/ai/ai_language_model.cc
+++ b/chrome/browser/ai/ai_language_model.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/ai/ai_context_bound_object.h"
 #include "chrome/browser/ai/ai_manager.h"
 #include "chrome/browser/ai/ai_utils.h"
+#include "components/optimization_guide/core/model_execution/multimodal_message.h"
 #include "components/optimization_guide/core/model_execution/optimization_guide_model_execution_error.h"
 #include "components/optimization_guide/core/optimization_guide_enums.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
@@ -50,6 +51,7 @@
 }  // namespace features
 namespace {
 
+using optimization_guide::MultimodalMessageReadView;
 using optimization_guide::proto::PromptApiMetadata;
 using optimization_guide::proto::PromptApiPrompt;
 using optimization_guide::proto::PromptApiRequest;
@@ -129,19 +131,13 @@
   return result;
 }
 
-std::unique_ptr<google::protobuf::MessageLite>
-AILanguageModel::Context::MaybeFormatRequest(PromptApiRequest request) {
-  return std::make_unique<PromptApiRequest>(std::move(request));
-}
-
-std::unique_ptr<google::protobuf::MessageLite>
-AILanguageModel::Context::MakeRequest() {
+PromptApiRequest AILanguageModel::Context::MakeRequest() {
   PromptApiRequest request;
   request.mutable_initial_prompts()->MergeFrom(initial_prompts_.prompts);
   for (auto& context_item : context_items_) {
     request.mutable_prompt_history()->MergeFrom((context_item.prompts));
   }
-  return MaybeFormatRequest(std::move(request));
+  return request;
 }
 
 bool AILanguageModel::Context::HasContextItem() {
@@ -210,7 +206,7 @@
         MakePrompt(ConvertRole(prompt->role), prompt->content);
   }
   session_->GetContextSizeInTokens(
-      *context_->MaybeFormatRequest(request),
+      MultimodalMessageReadView(request),
       base::BindOnce(&AILanguageModel::InitializeContextWithInitialPrompts,
                      weak_ptr_factory_.GetWeakPtr(), request,
                      std::move(callback)));
@@ -347,18 +343,17 @@
   }
 
   if (context_->HasContextItem()) {
-    session_->AddContext(*context_->MakeRequest());
+    session_->AddContext(context_->MakeRequest());
   }
 
   session_->ExecuteModel(
-      *context_->MaybeFormatRequest(request),
-      base::BindRepeating(&AILanguageModel::ModelExecutionCallback,
-                          weak_ptr_factory_.GetWeakPtr(), request,
-                          responder_id));
+      request, base::BindRepeating(&AILanguageModel::ModelExecutionCallback,
+                                   weak_ptr_factory_.GetWeakPtr(), request,
+                                   responder_id));
 }
 
 void AILanguageModel::Prompt(
-    const std::string& input,
+    on_device_model::mojom::InputPtr input,
     mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
         pending_responder) {
   if (!session_) {
@@ -369,16 +364,20 @@
     return;
   }
 
+  CHECK_EQ(input->pieces.size(), 1u);
+  CHECK(std::holds_alternative<std::string>(input->pieces[0]));
+  const std::string& input_text = std::get<std::string>(input->pieces[0]);
+
   // Clear the response from the previous execution.
   current_response_ = "";
   mojo::RemoteSetElementId responder_id =
       responder_set_.Add(std::move(pending_responder));
   PromptApiRequest request;
   *request.add_current_prompts() =
-      MakePrompt(PromptApiRole::PROMPT_API_ROLE_USER, input);
+      MakePrompt(PromptApiRole::PROMPT_API_ROLE_USER, input_text);
 
   session_->GetExecutionInputSizeInTokens(
-      *context_->MaybeFormatRequest(request),
+      MultimodalMessageReadView(request),
       base::BindOnce(&AILanguageModel::PromptGetInputSizeCompletion,
                      weak_ptr_factory_.GetWeakPtr(), responder_id, request));
 }
@@ -451,7 +450,7 @@
       MakePrompt(PromptApiRole::PROMPT_API_ROLE_USER, input);
 
   session_->GetExecutionInputSizeInTokens(
-      *context_->MaybeFormatRequest(request),
+      MultimodalMessageReadView(request),
       base::BindOnce(
           [](mojo::Remote<blink::mojom::AILanguageModelCountPromptTokensClient>
                  client_remote,
diff --git a/chrome/browser/ai/ai_language_model.h b/chrome/browser/ai/ai_language_model.h
index 06c5615..314fab5 100644
--- a/chrome/browser/ai/ai_language_model.h
+++ b/chrome/browser/ai/ai_language_model.h
@@ -21,6 +21,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
+#include "services/on_device_model/public/mojom/on_device_model.mojom.h"
 #include "third_party/blink/public/mojom/ai/ai_common.mojom-forward.h"
 #include "third_party/blink/public/mojom/ai/ai_language_model.mojom.h"
 #include "third_party/blink/public/mojom/ai/ai_manager.mojom-forward.h"
@@ -95,13 +96,7 @@
 
     // Combines the initial prompts and all current items into a request.
     // The type of request produced is a PromptApiRequest.
-    std::unique_ptr<google::protobuf::MessageLite> MakeRequest();
-
-    // Either returns it's argument wrapped in unique_ptr, or converts it to a
-    // StringValue depending on whether this Context has
-    // use_prompt_api_proto = true.
-    std::unique_ptr<google::protobuf::MessageLite> MaybeFormatRequest(
-        PromptApiRequest request);
+    PromptApiRequest MakeRequest();
 
     // Returns true if the system prompt is set or there is at least one context
     // item.
@@ -136,7 +131,7 @@
       const optimization_guide::proto::Any& any);
 
   // `blink::mojom::AILanguageModel` implementation.
-  void Prompt(const std::string& input,
+  void Prompt(on_device_model::mojom::InputPtr input,
               mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
                   pending_responder) override;
   void Fork(
diff --git a/chrome/browser/ai/ai_language_model_unittest.cc b/chrome/browser/ai/ai_language_model_unittest.cc
index 89482e6..b0bddddc 100644
--- a/chrome/browser/ai/ai_language_model_unittest.cc
+++ b/chrome/browser/ai/ai_language_model_unittest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ai/ai_language_model.h"
 
 #include <optional>
+#include <string>
 #include <vector>
 
 #include "base/functional/bind.h"
@@ -25,6 +26,7 @@
 #include "components/optimization_guide/proto/features/prompt_api.pb.h"
 #include "components/optimization_guide/proto/on_device_model_execution_config.pb.h"
 #include "components/optimization_guide/proto/string_value.pb.h"
+#include "services/on_device_model/public/mojom/on_device_model.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/ai/ai_common.mojom.h"
@@ -40,8 +42,9 @@
 
 namespace {
 
-using optimization_guide::proto::PromptApiRequest;
-using optimization_guide::proto::PromptApiRole;
+using ::optimization_guide::MultimodalMessageReadView;
+using ::optimization_guide::proto::PromptApiRequest;
+using ::optimization_guide::proto::PromptApiRole;
 
 constexpr uint32_t kTestMaxContextToken = 10u;
 constexpr uint32_t kTestInitialPromptsToken = 5u;
@@ -72,6 +75,12 @@
      "M: I'm fine, thank you, and you?\n"
      "U: I'm fine too.\n");
 
+on_device_model::mojom::InputPtr MakeInput(const std::string& text) {
+  auto input = on_device_model::mojom::Input::New();
+  input->pieces.push_back(text);
+  return input;
+}
+
 std::vector<blink::mojom::AILanguageModelInitialPromptPtr>
 GetTestInitialPrompts() {
   auto create_initial_prompt = [](Role role, const char* content) {
@@ -132,33 +141,23 @@
       "optimization_guide.proto.PromptApiRequest") {
     return ToString(*static_cast<const PromptApiRequest*>(&request_metadata));
   }
-  if (request_metadata.GetTypeName() ==
-      "optimization_guide.proto.StringValue") {
-    return static_cast<const optimization_guide::proto::StringValue*>(
-               &request_metadata)
-        ->value();
-  }
   return "unexpected type";
 }
 
 std::string GetContextString(AILanguageModel::Context& ctx) {
-  return ToString(*ctx.MakeRequest());
+  return ToString(ctx.MakeRequest());
 }
 
 const optimization_guide::proto::Any& GetPromptApiMetadata(
-    bool use_prompt_api_proto,
     bool is_streaming_chunk_by_chunk) {
-  static base::NoDestructor<
-      std::map<std::pair<bool, bool>, optimization_guide::proto::Any>>
+  static base::NoDestructor<std::map<bool, optimization_guide::proto::Any>>
       metadata_map;
-  auto key = std::make_pair(use_prompt_api_proto, is_streaming_chunk_by_chunk);
+  auto key = is_streaming_chunk_by_chunk;
 
   if (metadata_map->find(key) == metadata_map->end()) {
-    metadata_map->emplace(key, [use_prompt_api_proto,
-                                is_streaming_chunk_by_chunk]() {
+    metadata_map->emplace(key, [is_streaming_chunk_by_chunk]() {
       optimization_guide::proto::PromptApiMetadata metadata;
-      metadata.set_version(
-          use_prompt_api_proto ? AILanguageModel::kMinVersionUsingProto : 0);
+      metadata.set_version(AILanguageModel::kMinVersionUsingProto);
       metadata.set_is_streaming_chunk_by_chunk(is_streaming_chunk_by_chunk);
       return optimization_guide::AnyWrapProto(metadata);
     }());
@@ -183,7 +182,6 @@
     std::string expected_cloned_context =
         base::StrCat({kExpectedFormattedTestPrompt, kTestResponse, "\n"});
     std::string expected_prompt = kExpectedFormattedTestPrompt;
-    bool use_prompt_api_proto = false;
     bool should_overflow_context = false;
     bool should_use_supported_language = true;
   };
@@ -259,12 +257,11 @@
                                  sampling_params_copy->temperature));
             }
 
-            SetUpMockSession(*session, options.use_prompt_api_proto,
-                             IsModelStreamingChunkByChunk());
+            SetUpMockSession(*session, IsModelStreamingChunkByChunk());
 
             ON_CALL(*session, GetContextSizeInTokens(_, _))
                 .WillByDefault(
-                    [&](const google::protobuf::MessageLite& request_metadata,
+                    [&](MultimodalMessageReadView request_metadata,
                         optimization_guide::
                             OptimizationGuideModelSizeInTokenCallback
                                 callback) {
@@ -301,8 +298,7 @@
             auto session = std::make_unique<
                 testing::NiceMock<optimization_guide::MockSession>>();
 
-            SetUpMockSession(*session, options.use_prompt_api_proto,
-                             IsModelStreamingChunkByChunk());
+            SetUpMockSession(*session, IsModelStreamingChunkByChunk());
 
             ON_CALL(*session, AddContext(_))
                 .WillByDefault(
@@ -445,17 +441,16 @@
               auto session = std::make_unique<
                   testing::NiceMock<optimization_guide::MockSession>>();
 
-              SetUpMockSession(*session, /*use_prompt_api_proto=*/true,
+              SetUpMockSession(*session,
                                /*is_streaming_chunk_by_chunk=*/true);
               ON_CALL(*session, GetExecutionInputSizeInTokens(_, _))
                   .WillByDefault(
-                      [&](const google::protobuf::MessageLite& request_metadata,
+                      [&](MultimodalMessageReadView request_metadata,
                           optimization_guide::
                               OptimizationGuideModelSizeInTokenCallback
                                   callback) {
                         size_in_token_callback =
-                            base::BindOnce(std::move(callback),
-                                           ToString(request_metadata).size());
+                            base::BindOnce(std::move(callback), 1);
                       });
 
               // The model should not be executed.
@@ -521,12 +516,11 @@
           auto session = std::make_unique<
               testing::NiceMock<optimization_guide::MockSession>>();
 
-          SetUpMockSession(*session, /*use_prompt_api_proto=*/false,
-                           IsModelStreamingChunkByChunk());
+          SetUpMockSession(*session, IsModelStreamingChunkByChunk());
 
           ON_CALL(*session, GetContextSizeInTokens(_, _))
               .WillByDefault(
-                  [&](const google::protobuf::MessageLite& request_metadata,
+                  [&](MultimodalMessageReadView request_metadata,
                       optimization_guide::
                           OptimizationGuideModelSizeInTokenCallback callback) {
                     std::move(callback).Run(mock_size_in_tokens);
@@ -534,7 +528,7 @@
 
           ON_CALL(*session, GetExecutionInputSizeInTokens(_, _))
               .WillByDefault(
-                  [&](const google::protobuf::MessageLite& request_metadata,
+                  [&](MultimodalMessageReadView request_metadata,
                       optimization_guide::
                           OptimizationGuideModelSizeInTokenCallback callback) {
                     std::move(callback).Run(mock_size_in_tokens);
@@ -616,23 +610,24 @@
               responder_run_loop_2.Quit();
             }));
 
-    mock_session->Prompt("A", mock_responder_1.BindNewPipeAndPassRemote());
+    mock_session->Prompt(MakeInput("A"),
+                         mock_responder_1.BindNewPipeAndPassRemote());
     responder_run_loop_1.Run();
-    mock_session->Prompt("B", mock_responder_2.BindNewPipeAndPassRemote());
+    mock_session->Prompt(MakeInput("B"),
+                         mock_responder_2.BindNewPipeAndPassRemote());
     responder_run_loop_2.Run();
   }
 
  private:
   void SetUpMockSession(
       testing::NiceMock<optimization_guide::MockSession>& session,
-      bool use_prompt_api_proto,
       bool is_streaming_chunk_by_chunk) {
     ON_CALL(session, GetTokenLimits())
         .WillByDefault(AITestUtils::GetFakeTokenLimits);
 
     ON_CALL(session, GetOnDeviceFeatureMetadata())
-        .WillByDefault(ReturnRef(GetPromptApiMetadata(
-            use_prompt_api_proto, is_streaming_chunk_by_chunk)));
+        .WillByDefault(
+            ReturnRef(GetPromptApiMetadata(is_streaming_chunk_by_chunk)));
     ON_CALL(session, GetSamplingParams()).WillByDefault([]() {
       // We don't need to use these value, so just mock it with defaults.
       return optimization_guide::SamplingParams{
@@ -643,21 +638,17 @@
         .WillByDefault(
             [](const std::string& text,
                optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                   callback) { std::move(callback).Run(text.size()); });
+                   callback) { std::move(callback).Run(1); });
     ON_CALL(session, GetExecutionInputSizeInTokens(_, _))
         .WillByDefault(
-            [](const google::protobuf::MessageLite& request_metadata,
+            [](MultimodalMessageReadView request_metadata,
                optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                   callback) {
-              std::move(callback).Run(ToString(request_metadata).size());
-            });
+                   callback) { std::move(callback).Run(1); });
     ON_CALL(session, GetContextSizeInTokens(_, _))
         .WillByDefault(
-            [](const google::protobuf::MessageLite& request_metadata,
+            [](MultimodalMessageReadView request_metadata,
                optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                   callback) {
-              std::move(callback).Run(ToString(request_metadata).size());
-            });
+                   callback) { std::move(callback).Run(1); });
   }
 
   void StreamResponse(
@@ -737,7 +728,8 @@
               responder_run_loop.Quit();
             }));
 
-    mock_session->Prompt(prompt, mock_responder.BindNewPipeAndPassRemote());
+    mock_session->Prompt(MakeInput(prompt),
+                         mock_responder.BindNewPipeAndPassRemote());
     responder_run_loop.Run();
   }
 
@@ -876,7 +868,6 @@
                                   "U: Test prompt\n"
                                   "M: Test response\n"),
       .expected_prompt = "U: Test prompt\nM: ",
-      .use_prompt_api_proto = true,
   });
 }
 
@@ -897,7 +888,7 @@
       [](mojo::Remote<blink::mojom::AILanguageModel> mock_session,
          AITestUtils::MockModelStreamingResponder& mock_responder) {
         mock_session->Destroy();
-        mock_session->Prompt(kTestPrompt,
+        mock_session->Prompt(MakeInput(kTestPrompt),
                              mock_responder.BindNewPipeAndPassRemote());
       }));
 }
@@ -908,7 +899,7 @@
   TestSessionDestroy(base::BindOnce(
       [](mojo::Remote<blink::mojom::AILanguageModel> mock_session,
          AITestUtils::MockModelStreamingResponder& mock_responder) {
-        mock_session->Prompt(kTestPrompt,
+        mock_session->Prompt(MakeInput(kTestPrompt),
                              mock_responder.BindNewPipeAndPassRemote());
         mock_session->Destroy();
       }));
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
index 5814a89..7f418ff 100644
--- a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
+++ b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
@@ -23,7 +23,6 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/repeating_test_future.h"
 #include "base/test/scoped_command_line.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/version.h"
diff --git a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc
index aa556e3..05a66482 100644
--- a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc
+++ b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc
@@ -13,7 +13,6 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h"
 #include "ash/wm/window_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_test.h"
 #include "chrome/browser/ash/arc/input_overlay/actions/action.h"
 #include "chrome/browser/ash/arc/input_overlay/arc_input_overlay_metrics.h"
diff --git a/chrome/browser/ash/bruschetta/bruschetta_service_unittest.cc b/chrome/browser/ash/bruschetta/bruschetta_service_unittest.cc
index b870cf8a..17667ae 100644
--- a/chrome/browser/ash/bruschetta/bruschetta_service_unittest.cc
+++ b/chrome/browser/ash/bruschetta/bruschetta_service_unittest.cc
@@ -7,7 +7,6 @@
 #include "ash/constants/ash_features.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/bruschetta/bruschetta_pref_names.h"
 #include "chrome/browser/ash/bruschetta/bruschetta_util.h"
 #include "chrome/browser/ash/guest_os/dbus_test_helper.h"
diff --git a/chrome/browser/ash/extensions/install_limiter.cc b/chrome/browser/ash/extensions/install_limiter.cc
index ad2ea4ac..057a6eb7 100644
--- a/chrome/browser/ash/extensions/install_limiter.cc
+++ b/chrome/browser/ash/extensions/install_limiter.cc
@@ -11,6 +11,7 @@
 #include "base/functional/bind.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/ash/extensions/install_limiter_factory.h"
+#include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extensions_browser_client.h"
 
 namespace extensions {
diff --git a/chrome/browser/ash/file_manager/BUILD.gn b/chrome/browser/ash/file_manager/BUILD.gn
index dbaa405..5472676 100644
--- a/chrome/browser/ash/file_manager/BUILD.gn
+++ b/chrome/browser/ash/file_manager/BUILD.gn
@@ -171,6 +171,7 @@
     "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/drivefs",
     "//chromeos/ash/components/file_manager:constants",
+    "//chromeos/ash/components/policy",
     "//chromeos/ash/experiences/arc:arc_base_utils",
     "//chromeos/ash/experiences/arc:arc_features",
     "//chromeos/ash/experiences/arc/mojom:notifications",
diff --git a/chrome/browser/ash/file_manager/volume_manager.cc b/chrome/browser/ash/file_manager/volume_manager.cc
index 69422807..828dca4 100644
--- a/chrome/browser/ash/file_manager/volume_manager.cc
+++ b/chrome/browser/ash/file_manager/volume_manager.cc
@@ -4,11 +4,13 @@
 
 #include "chrome/browser/ash/file_manager/volume_manager.h"
 
+#include <optional>
 #include <string_view>
 
 #include "ash/constants/ash_features.h"
 #include "base/auto_reset.h"
 #include "base/base64url.h"
+#include "base/check_deref.h"
 #include "base/check_is_test.h"
 #include "base/containers/span.h"
 #include "base/feature_list.h"
@@ -39,6 +41,8 @@
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h"
 #include "chrome/common/chrome_features.h"
+#include "chromeos/ash/components/policy/external_storage/device_id.h"
+#include "chromeos/ash/components/policy/external_storage/external_storage_policy_controller.h"
 #include "chromeos/ash/experiences/arc/arc_util.h"
 #include "chromeos/components/disks/disks_prefs.h"
 #include "components/prefs/pref_service.h"
@@ -193,8 +197,11 @@
   return name;
 }
 
-ash::MountAccessMode GetExternalStorageAccessMode(const Profile* profile) {
-  return profile->GetPrefs()->GetBoolean(disks::prefs::kExternalStorageReadOnly)
+ash::MountAccessMode GetExternalStorageAccessMode(
+    const Profile* profile,
+    std::optional<policy::DeviceId> device_id) {
+  return policy::ExternalStoragePolicyController::IsDeviceReadOnly(
+             CHECK_DEREF(profile->GetPrefs()), std::move(device_id))
              ? ash::MountAccessMode::kReadOnly
              : ash::MountAccessMode::kReadWrite;
 }
@@ -381,6 +388,10 @@
       disks::prefs::kExternalStorageReadOnly,
       base::BindRepeating(&VolumeManager::OnExternalStorageReadOnlyChanged,
                           weak_ptr_factory_.GetWeakPtr()));
+  pref_change_registrar_.Add(
+      disks::prefs::kExternalStorageAllowlist,
+      base::BindRepeating(&VolumeManager::OnExternalStorageAllowlistChanged,
+                          weak_ptr_factory_.GetWeakPtr()));
 
   // Subscribe to storage monitor for MTP notifications.
   if (storage_monitor::StorageMonitor::GetInstance()) {
@@ -698,16 +709,18 @@
       }
 
       bool mounting = false;
+      const auto device_id = policy::DeviceId::FromDisk(&disk);
       if (disk.mount_path().empty() && disk.has_media() &&
-          !profile_->GetPrefs()->GetBoolean(
-              disks::prefs::kExternalStorageDisabled)) {
+          !policy::ExternalStoragePolicyController::IsDeviceDisabled(
+              CHECK_DEREF(profile_->GetPrefs()), device_id)) {
         // If disk is not mounted yet and it has media and there is no policy
         // forbidding external storage, give it a try.
         // Initiate disk mount operation. MountPath auto-detects the filesystem
         // format if the second argument is empty.
         disk_mount_manager_->MountPath(
             disk.device_path(), {}, disk.device_label(), {},
-            ash::MountType::kDevice, GetExternalStorageAccessMode(profile_),
+            ash::MountType::kDevice,
+            GetExternalStorageAccessMode(profile_, device_id),
             base::DoNothing());
         mounting = true;
       }
@@ -816,7 +829,9 @@
       // operation.
       disk_mount_manager_->MountPath(
           device_path, {}, {}, {}, ash::MountType::kDevice,
-          GetExternalStorageAccessMode(profile_), base::DoNothing());
+          GetExternalStorageAccessMode(profile_,
+                                       GetDeviceIdFromDevicePath(device_path)),
+          base::DoNothing());
 
       for (auto& observer : observers_) {
         observer.OnFormatCompleted(device_path, device_label,
@@ -854,7 +869,9 @@
       if (error != ash::PartitionError::kSuccess) {
         disk_mount_manager_->MountPath(
             device_path, {}, {}, {}, ash::MountType::kDevice,
-            GetExternalStorageAccessMode(profile_), base::DoNothing());
+            GetExternalStorageAccessMode(
+                profile_, GetDeviceIdFromDevicePath(device_path)),
+            base::DoNothing());
       }
 
       for (auto& observer : observers_) {
@@ -901,7 +918,9 @@
       // of the volume name).
       disk_mount_manager_->MountPath(
           device_path, {}, mount_label, {}, ash::MountType::kDevice,
-          GetExternalStorageAccessMode(profile_), base::DoNothing());
+          GetExternalStorageAccessMode(profile_,
+                                       GetDeviceIdFromDevicePath(device_path)),
+          base::DoNothing());
 
       bool successfully_renamed = error == ash::RenameError::kSuccess;
       for (auto& observer : observers_) {
@@ -1107,52 +1126,58 @@
 }
 
 void VolumeManager::OnExternalStorageDisabledChanged() {
-  // If the policy just got disabled we have to unmount every device currently
-  // mounted. The opposite is fine - we can let the user re-plug their device to
-  // make it available.
-  if (profile_->GetPrefs()->GetBoolean(
-          disks::prefs::kExternalStorageDisabled)) {
-    // We do not iterate on mount_points directly, because mount_points can
-    // be changed by UnmountPath(). Also, a failing unmount shouldn't be retried
-    // indefinitely. So make a set of all the mount points that should be
-    // unmounted (all external media mounts), and iterate through them.
-    std::vector<std::string> remaining_mount_paths;
-    for (const auto& mount_point : disk_mount_manager_->mount_points()) {
-      if (mount_point.mount_type == ash::MountType::kDevice) {
-        remaining_mount_paths.push_back(mount_point.mount_path);
-      }
-    }
-    if (remaining_mount_paths.empty()) {
-      return;
-    }
+  // If the policy just got set to disabled we have to unmount every device
+  // currently mounted which is not allowlisted. The opposite is fine - we can
+  // let the user re-plug their device to make it available.
 
-    std::string mount_path = remaining_mount_paths.back();
-    remaining_mount_paths.pop_back();
-    disk_mount_manager_->UnmountPath(
-        mount_path,
-        base::BindOnce(
-            &VolumeManager::OnExternalStorageDisabledChangedUnmountCallback,
-            weak_ptr_factory_.GetWeakPtr(), std::move(remaining_mount_paths)));
+  const PrefService& pref_service = CHECK_DEREF(profile_->GetPrefs());
+
+  // We do not iterate on mount_points directly, because mount_points can be
+  // changed by UnmountPath(). Also, a failing unmount shouldn't be retried
+  // indefinitely. So make a set of all the mount points that should be
+  // unmounted (all external media mounts which aren't allowlisted), and iterate
+  // through them.
+  std::vector<std::string> remaining_mount_paths;
+  for (const auto& mount_point : disk_mount_manager_->mount_points()) {
+    if (mount_point.mount_type == ash::MountType::kDevice &&
+        policy::ExternalStoragePolicyController::IsDeviceDisabled(
+            pref_service, GetDeviceIdFromDevicePath(mount_point.source_path))) {
+      remaining_mount_paths.push_back(mount_point.mount_path);
+    }
   }
+  if (remaining_mount_paths.empty()) {
+    return;
+  }
+
+  std::string mount_path = remaining_mount_paths.back();
+  remaining_mount_paths.pop_back();
+  disk_mount_manager_->UnmountPath(
+      mount_path,
+      base::BindOnce(
+          &VolumeManager::OnExternalStorageDisabledChangedUnmountCallback,
+          weak_ptr_factory_.GetWeakPtr(), std::move(remaining_mount_paths)));
 }
 
 void VolumeManager::OnExternalStorageReadOnlyChanged() {
-  const ash::MountAccessMode access_mode =
-      GetExternalStorageAccessMode(profile_);
   for (const auto& disk : disk_mount_manager_->disks()) {
+    const ash::MountAccessMode access_mode = GetExternalStorageAccessMode(
+        profile_, policy::DeviceId::FromDisk(disk.get()));
     disk_mount_manager_->RemountRemovableDrive(*disk, access_mode);
   }
 }
 
+void VolumeManager::OnExternalStorageAllowlistChanged() {
+  // The Allowlist overrides both Disabled and ReadOnly policies, fire both of
+  // their listener events.
+  OnExternalStorageDisabledChanged();
+  OnExternalStorageReadOnlyChanged();
+}
+
 void VolumeManager::OnRemovableStorageAttached(
     const storage_monitor::StorageInfo& info) {
   if (!storage_monitor::StorageInfo::IsMTPDevice(info.device_id())) {
     return;
   }
-  if (profile_->GetPrefs()->GetBoolean(
-          disks::prefs::kExternalStorageDisabled)) {
-    return;
-  }
 
   // Resolve mtp storage name and get MtpStorageInfo.
   std::string storage_name;
@@ -1182,13 +1207,25 @@
     return;
   }
 
+  // `mtp_storage_info` is a protocol buffer and proto file syntax has a uint32
+  // type, but not a uint16 type.
+  const policy::DeviceId device_id =
+      policy::DeviceId(static_cast<uint16_t>(mtp_storage_info->vendor_id),
+                       static_cast<uint16_t>(mtp_storage_info->product_id));
+
+  if (policy::ExternalStoragePolicyController::IsDeviceDisabled(
+          CHECK_DEREF(profile_->GetPrefs()), device_id)) {
+    return;
+  }
+
   // Mtp write is enabled only when the device is writable, supports generic
   // hierarchical file system, and writing to external storage devices is not
   // prohibited by the preference.
   const bool read_only =
       mtp_storage_info->access_capability != kAccessCapabilityReadWrite ||
       mtp_storage_info->filesystem_type != kFilesystemTypeGenericHierarchical ||
-      GetExternalStorageAccessMode(profile_) == ash::MountAccessMode::kReadOnly;
+      policy::ExternalStoragePolicyController::IsDeviceReadOnly(
+          CHECK_DEREF(profile_->GetPrefs()), device_id);
 
   const base::FilePath path = base::FilePath::FromUTF8Unsafe(info.location());
   const std::string fsid = GetMountPointNameForMediaStorage(info);
@@ -1550,8 +1587,9 @@
 
   // Filter out removable disks if forbidden by policy for this profile.
   if (volume.type() == VOLUME_TYPE_REMOVABLE_DISK_PARTITION &&
-      profile_->GetPrefs()->GetBoolean(
-          disks::prefs::kExternalStorageDisabled)) {
+      policy::ExternalStoragePolicyController::IsDeviceDisabled(
+          CHECK_DEREF(profile_->GetPrefs()),
+          GetDeviceIdFromDevicePath(volume.source_path().value()))) {
     return false;
   }
 
@@ -1806,4 +1844,13 @@
   }
 }
 
+// TODO(isandrk, b/383308221): Convert to take an `std::string_view` (need to
+// convert `FindDiskBySourcePath` as well).
+std::optional<policy::DeviceId> VolumeManager::GetDeviceIdFromDevicePath(
+    const std::string& device_path) {
+  const ash::disks::Disk* disk =
+      disk_mount_manager_->FindDiskBySourcePath(device_path);
+  return policy::DeviceId::FromDisk(disk);
+}
+
 }  // namespace file_manager
diff --git a/chrome/browser/ash/file_manager/volume_manager.h b/chrome/browser/ash/file_manager/volume_manager.h
index 561bafc1..639575e4 100644
--- a/chrome/browser/ash/file_manager/volume_manager.h
+++ b/chrome/browser/ash/file_manager/volume_manager.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_ASH_FILE_MANAGER_VOLUME_MANAGER_H_
 #define CHROME_BROWSER_ASH_FILE_MANAGER_VOLUME_MANAGER_H_
 
+#include <optional>
 #include <set>
 #include <string>
 #include <string_view>
@@ -30,6 +31,7 @@
 #include "chrome/browser/ash/guest_os/public/types.h"
 #include "chrome/browser/ash/policy/skyvault/local_files_migration_manager.h"
 #include "chrome/browser/ash/policy/skyvault/local_user_files_policy_observer.h"
+#include "chromeos/ash/components/policy/external_storage/device_id.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/storage_monitor/removable_storage_observer.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
@@ -243,6 +245,9 @@
   // Called on change to kExternalStorageReadOnly pref.
   void OnExternalStorageReadOnlyChanged();
 
+  // Called on change to kExternalStorageAllowlist pref.
+  void OnExternalStorageAllowlistChanged();
+
   // RemovableStorageObserver overrides.
   void OnRemovableStorageAttached(
       const storage_monitor::StorageInfo& info) override;
@@ -386,6 +391,9 @@
   // thus removing all local volumes.
   void OnMigrationReset() override;
 
+  std::optional<policy::DeviceId> GetDeviceIdFromDevicePath(
+      const std::string& device_path);
+
   static int counter_;
   const int id_ = ++counter_;  // Only used in log traces
 
diff --git a/chrome/browser/ash/file_manager/volume_manager_unittest.cc b/chrome/browser/ash/file_manager/volume_manager_unittest.cc
index 834022af..71d8950 100644
--- a/chrome/browser/ash/file_manager/volume_manager_unittest.cc
+++ b/chrome/browser/ash/file_manager/volume_manager_unittest.cc
@@ -75,11 +75,31 @@
 using ::ash::disks::DiskMountManager;
 using ::ash::disks::FakeDiskMountManager;
 using base::FilePath;
+using ::testing::UnorderedElementsAre;
 
 std::vector<std::string> arc_volume_ids = {
     arc::kImagesRootId, arc::kVideosRootId, arc::kAudioRootId,
     arc::kDocumentsRootId, "android_files:0"};
 
+const char kAllowlistedVendorId[] = "A123";
+const char kAllowlistedProductId[] = "456B";
+const policy::DeviceId kAllowlistedDeviceId{0xA123, 0x456B};
+
+// Adds `kAllowlistedDeviceId` to ExternalStorageAllowlist.
+void SetExternalStorageAllowlist(PrefService* pref_service) {
+  pref_service->SetList(
+      disks::prefs::kExternalStorageAllowlist,
+      base::Value::List().Append(kAllowlistedDeviceId.ToDict()));
+}
+
+std::unique_ptr<Disk> CreateAllowlistedDisk(const std::string& disk_path) {
+  return Disk::Builder()
+      .SetDevicePath(disk_path)
+      .SetVendorId(kAllowlistedVendorId)
+      .SetProductId(kAllowlistedProductId)
+      .Build();
+}
+
 class LoggingObserver : public VolumeManagerObserver {
  public:
   struct Event {
@@ -476,10 +496,6 @@
 }
 
 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_Added) {
-  // Enable external storage.
-  profile()->GetPrefs()->SetBoolean(disks::prefs::kExternalStorageDisabled,
-                                    false);
-
   LoggingObserver observer;
   volume_manager()->AddObserver(&observer);
 
@@ -510,10 +526,6 @@
 }
 
 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_AddedNonMounting) {
-  // Enable external storage.
-  profile()->GetPrefs()->SetBoolean(disks::prefs::kExternalStorageDisabled,
-                                    false);
-
   // Device which is already mounted.
   {
     LoggingObserver observer;
@@ -966,7 +978,14 @@
 }
 
 TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
-  // Here create four mount points.
+  // Set up ExternalStorageAllowlist.
+  disk_mount_manager_->AddDiskForTest(CreateAllowlistedDisk("mount1"));
+  SetExternalStorageAllowlist(profile()->GetPrefs());
+
+  // Subscribe to pref changes.
+  volume_manager()->Initialize();
+
+  // Create four mount points (first one is allowlisted).
   disk_mount_manager_->MountPath("mount1", "", "", {}, ash::MountType::kDevice,
                                  ash::MountAccessMode::kReadWrite,
                                  base::DoNothing());
@@ -986,38 +1005,26 @@
   ASSERT_EQ(4U, disk_mount_manager_->mount_points().size());
   ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
 
-  // Emulate to set kExternalStorageDisabled to false.
+  // Set kExternalStorageDisabled to false and expect no effects.
   profile()->GetPrefs()->SetBoolean(disks::prefs::kExternalStorageDisabled,
                                     false);
-  volume_manager()->OnExternalStorageDisabledChanged();
-
-  // Expect no effects.
   EXPECT_EQ(4U, disk_mount_manager_->mount_points().size());
   EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
 
-  // Emulate to set kExternalStorageDisabled to true.
+  // Set kExternalStorageDisabled to true.
   profile()->GetPrefs()->SetBoolean(disks::prefs::kExternalStorageDisabled,
                                     true);
-  volume_manager()->OnExternalStorageDisabledChanged();
 
   // Wait until all unmount request finishes, so that callback chain to unmount
   // all the mount points will be invoked.
   disk_mount_manager_->FinishAllUnmountPathRequests();
 
-  // The external media mount points should be unmounted. Other mount point
-  // types should remain. The failing unmount should also remain.
-  EXPECT_EQ(2U, disk_mount_manager_->mount_points().size());
-
-  std::set<std::string> expected_unmount_requests = {
-      "mount1",
-      "mount2",
-      "failed_unmount",
-  };
-  for (const auto& request : disk_mount_manager_->unmount_requests()) {
-    EXPECT_TRUE(base::Contains(expected_unmount_requests, request));
-    expected_unmount_requests.erase(request);
-  }
-  EXPECT_TRUE(expected_unmount_requests.empty());
+  // External media mount points which are not allowlisted should be unmounted.
+  // Other mount point types should remain. The failing unmount should also
+  // remain.
+  EXPECT_EQ(3U, disk_mount_manager_->mount_points().size());
+  EXPECT_THAT(disk_mount_manager_->unmount_requests(),
+              UnorderedElementsAre("mount2", "failed_unmount"));
 }
 
 TEST_F(VolumeManagerTest, ExternalStorageDisabledPolicyMultiProfile) {
@@ -1074,23 +1081,28 @@
   // This subscribes to pref changes.
   volume_manager()->Initialize();
 
-  // Set up some disks.
-  disk_mount_manager_->AddDiskForTest(
-      Disk::Builder().SetDevicePath("device1").Build());
+  // Set up some disks (first one is allowlisted).
+  disk_mount_manager_->AddDiskForTest(CreateAllowlistedDisk("device1"));
   disk_mount_manager_->AddDiskForTest(
       Disk::Builder().SetDevicePath("device2").Build());
 
   // Trigger pref updates.
   profile()->GetPrefs()->SetBoolean(disks::prefs::kExternalStorageReadOnly,
                                     true);
+  SetExternalStorageAllowlist(profile()->GetPrefs());
   profile()->GetPrefs()->SetBoolean(disks::prefs::kExternalStorageReadOnly,
                                     false);
 
   // Verify that removable disk remounts are triggered.
   using ash::MountAccessMode;
   std::vector<FakeDiskMountManager::RemountRequest> expected = {
+      // ExternalStorageReadOnly set to true.
       {"device1", MountAccessMode::kReadOnly},
       {"device2", MountAccessMode::kReadOnly},
+      // ExternalStorageAllowlist set to device1.
+      {"device1", MountAccessMode::kReadWrite},
+      {"device2", MountAccessMode::kReadOnly},
+      // ExternalStorageReadOnly set to false.
       {"device1", MountAccessMode::kReadWrite},
       {"device2", MountAccessMode::kReadWrite},
   };
diff --git a/chrome/browser/ash/lobster/lobster_bubble_coordinator.cc b/chrome/browser/ash/lobster/lobster_bubble_coordinator.cc
index f37e9b0f..f0645070 100644
--- a/chrome/browser/ash/lobster/lobster_bubble_coordinator.cc
+++ b/chrome/browser/ash/lobster/lobster_bubble_coordinator.cc
@@ -27,8 +27,7 @@
 void LobsterBubbleCoordinator::LoadUI(Profile* profile,
                                       std::optional<std::string_view> query,
                                       LobsterMode mode,
-                                      const gfx::Rect& caret_bounds,
-                                      bool should_show_feedback_ui) {
+                                      const gfx::Rect& caret_bounds) {
   if (IsShowingUI()) {
     contents_wrapper_->CloseUI();
   }
@@ -47,7 +46,8 @@
 
   url = net::AppendOrReplaceQueryParameter(
       url, kLobsterFeedbackEnabledParamKey,
-      should_show_feedback_ui ? "true" : "false");
+      base::FeatureList::IsEnabled(ash::features::kLobsterFeedback) ? "true"
+                                                                    : "false");
 
   contents_wrapper_ = std::make_unique<WebUIContentsWrapperT<MakoUntrustedUI>>(
       url, profile, IDS_ACCNAME_ORCA,
diff --git a/chrome/browser/ash/lobster/lobster_bubble_coordinator.h b/chrome/browser/ash/lobster/lobster_bubble_coordinator.h
index 62326f7..3bf3ef8 100644
--- a/chrome/browser/ash/lobster/lobster_bubble_coordinator.h
+++ b/chrome/browser/ash/lobster/lobster_bubble_coordinator.h
@@ -29,8 +29,7 @@
   void LoadUI(Profile* profile,
               std::optional<std::string_view> query,
               LobsterMode mode,
-              const gfx::Rect& caret_bounds,
-              bool should_show_feedback_ui);
+              const gfx::Rect& caret_bounds);
   void ShowUI();
   void CloseUI();
 
diff --git a/chrome/browser/ash/lobster/lobster_service.cc b/chrome/browser/ash/lobster/lobster_service.cc
index 979bc35..05e7530 100644
--- a/chrome/browser/ash/lobster/lobster_service.cc
+++ b/chrome/browser/ash/lobster/lobster_service.cc
@@ -8,10 +8,8 @@
 #include <string>
 #include <utility>
 
-#include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
-#include "ash/public/cpp/lobster/lobster_enums.h"
 #include "ash/public/cpp/lobster/lobster_session.h"
 #include "base/check_deref.h"
 #include "base/command_line.h"
@@ -115,14 +113,7 @@
 void LobsterService::LoadUI(std::optional<std::string> query,
                             ash::LobsterMode mode,
                             const gfx::Rect& caret_bounds) {
-  bubble_coordinator_.LoadUI(
-      profile_, query, mode, caret_bounds,
-      /*should_show_feedback=*/
-      profile_->GetPrefs()->GetInteger(
-          ash::prefs::kLobsterEnterprisePolicySettings) ==
-              base::to_underlying(ash::LobsterEnterprisePolicyValue::
-                                      kAllowedWithModelImprovement) &&
-          base::FeatureList::IsEnabled(ash::features::kLobsterFeedback));
+  bubble_coordinator_.LoadUI(profile_, query, mode, caret_bounds);
 }
 
 void LobsterService::ShowUI() {
diff --git a/chrome/browser/ash/login/BUILD.gn b/chrome/browser/ash/login/BUILD.gn
index a65a3ce..5c96cd52 100644
--- a/chrome/browser/ash/login/BUILD.gn
+++ b/chrome/browser/ash/login/BUILD.gn
@@ -373,6 +373,7 @@
     "oobe_interactive_ui_test.cc",
     "oobe_localization_browsertest.cc",
     "oobe_metrics_browsertest.cc",
+    "oobe_pre_consent_metrics_browsertest.cc",
     "password_change_browsertest.cc",
     "post_login_deferred_task_browsertest.cc",
     "proxy_auth_dialog_browsertest.cc",
@@ -485,6 +486,7 @@
     "//components/language/core/browser",
     "//components/metrics/structured:structured_events",
     "//components/metrics/structured:test_support",
+    "//components/metrics_services_manager:metrics_services_manager",
     "//components/onc",
     "//components/policy:chrome_settings_proto_generated_compile",
     "//components/policy/core/browser",
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_window_closer.cc b/chrome/browser/ash/login/demo_mode/demo_mode_window_closer.cc
index d4891c9..4a1d9b9 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_window_closer.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_window_closer.cc
@@ -120,6 +120,8 @@
   // non-window/widget if open.
 }
 
+// TODO(crbug.com/302583338): Remove this function once
+// `DemoMode.GMSCoreDialogShown` never present.
 bool DemoModeWindowCloser::CloseGMSCoreWindowIfPresent(
     const apps::InstanceUpdate& update) {
   if (!gms_core_app_id_.empty()) {
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc
index 366111cb..1d1f646 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -669,6 +669,11 @@
       if (!components_) {
         components_ = std::make_unique<DemoComponents>(GetDemoConfig());
       }
+
+      // Create the window closer.
+      window_closer_ = std::make_unique<DemoModeWindowCloser>(
+          base::BindRepeating(&TriggerLaunchDemoModeApp));
+
       if (features::IsGrowthCampaignsInDemoModeEnabled()) {
         auto* campaigns_manager = growth::CampaignsManager::Get();
         CHECK(campaigns_manager);
@@ -696,13 +701,6 @@
       // Register the device with in the A/A experiment
       RegisterDemoModeAAExperiment();
 
-      // Create the window closer.
-      // TODO(crbug.com/302583338): Remove this feature flag.
-      if (ash::features::IsDemoModeGMSCoreWindowCloserEnabled()) {
-        window_closer_ = std::make_unique<DemoModeWindowCloser>(
-            base::BindRepeating(&TriggerLaunchDemoModeApp));
-      }
-
       // TODO(b/292454543): Remove this after issue is resolved.
       if (InstallAttributes::IsInitialized()) {
         LOG(WARNING) << "Demo Mode DeviceMode: "
@@ -748,7 +746,8 @@
 
   TriggerLaunchDemoModeApp();
 
-  if (demo_mode::IsDemoAccountSignInEnabled() && window_closer_) {
+  if (demo_mode::IsDemoAccountSignInEnabled()) {
+    CHECK(window_closer_);
     idle_handler_ = std::make_unique<DemoModeIdleHandler>(window_closer_.get());
   }
 }
diff --git a/chrome/browser/ash/login/oobe_pre_consent_metrics_browsertest.cc b/chrome/browser/ash/login/oobe_pre_consent_metrics_browsertest.cc
new file mode 100644
index 0000000..468a4c2ed
--- /dev/null
+++ b/chrome/browser/ash/login/oobe_pre_consent_metrics_browsertest.cc
@@ -0,0 +1,303 @@
+// 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 "ash/constants/ash_features.h"
+#include "ash/public/cpp/login_screen_test_api.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/task/single_thread_task_runner.h"
+#include "base/task/thread_pool.h"
+#include "base/threading/thread_restrictions.h"
+#include "chrome/browser/ash/login/login_pref_names.h"
+#include "chrome/browser/ash/login/screens/consolidated_consent_screen.h"
+#include "chrome/browser/ash/login/screens/guest_tos_screen.h"
+#include "chrome/browser/ash/login/startup_utils.h"
+#include "chrome/browser/ash/login/test/cryptohome_mixin.h"
+#include "chrome/browser/ash/login/test/device_state_mixin.h"
+#include "chrome/browser/ash/login/test/js_checker.h"
+#include "chrome/browser/ash/login/test/login_manager_mixin.h"
+#include "chrome/browser/ash/login/test/oobe_base_test.h"
+#include "chrome/browser/ash/login/test/oobe_screen_exit_waiter.h"
+#include "chrome/browser/ash/login/test/oobe_screen_waiter.h"
+#include "chrome/browser/ash/login/test/oobe_screens_utils.h"
+#include "chrome/browser/ash/login/test/user_auth_config.h"
+#include "chrome/browser/ash/login/test/user_policy_mixin.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
+#include "chrome/browser/ash/policy/test_support/embedded_policy_test_server_mixin.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
+#include "chrome/browser/metrics/cros_pre_consent_metrics_manager.h"
+#include "chrome/browser/metrics/structured/test/structured_metrics_mixin.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/webui/ash/login/choobe_screen_handler.h"
+#include "chrome/browser/ui/webui/ash/login/consolidated_consent_screen_handler.h"
+#include "chrome/browser/ui/webui/ash/login/gaia_screen_handler.h"
+#include "chrome/browser/ui/webui/ash/login/marketing_opt_in_screen_handler.h"
+#include "chrome/browser/ui/webui/ash/login/sync_consent_screen_handler.h"
+#include "chrome/browser/ui/webui/ash/login/theme_selection_screen_handler.h"
+#include "chrome/test/base/fake_gaia_mixin.h"
+#include "chromeos/ash/components/settings/cros_settings_names.h"
+#include "components/metrics/metrics_pref_names.h"
+#include "components/metrics/metrics_service.h"
+#include "components/metrics/metrics_state_manager.h"
+#include "components/metrics/structured/structured_events.h"
+#include "components/metrics/structured/test/test_structured_metrics_recorder.h"
+#include "components/metrics_services_manager/metrics_services_manager.h"
+#include "components/prefs/pref_test_utils.h"
+#include "components/version_info/version_info.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/browser_test.h"
+
+namespace ash {
+
+class OobePreConsentMetricsTest : public OobeBaseTest {
+ public:
+  OobePreConsentMetricsTest() {
+    // TODO(crbug.com/396450575): Remove this line after ash feature flag is set
+    // to true by default.
+    feature_list_.InitAndEnableFeature(ash::features::kOobePreConsentMetrics);
+  }
+
+  OobePreConsentMetricsTest(const OobePreConsentMetricsTest&) = delete;
+  OobePreConsentMetricsTest& operator=(const OobePreConsentMetricsTest&) =
+      delete;
+  ~OobePreConsentMetricsTest() override = default;
+
+  void SetUp() override {
+    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+
+    OobeBaseTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    OobeBaseTest::SetUpOnMainThread();
+
+    fake_gaia_.SetupFakeGaiaForLoginWithDefaults();
+    LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build =
+        true;
+
+    metrics::CrOSPreConsentMetricsManager::Get()->SetCompletedPathForTesting(
+        GetTestPath());
+  }
+
+  void TearDown() override { OobeBaseTest::TearDown(); }
+
+  base::FilePath GetTestPath() {
+    return temp_dir_.GetPath().Append("test-file");
+  }
+
+  void EnsureManagerSetupAndValidateConsent() {
+    ASSERT_NE(metrics::CrOSPreConsentMetricsManager::Get(), nullptr);
+
+    ValidateMetricsConsent(/*enabled=*/true);
+  }
+
+  // Checks if the file that marks the end of pre-consent stage exists.
+  void CheckForMarkerFile(base::Location from_here = FROM_HERE) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    ASSERT_TRUE(base::PathExists(GetTestPath()));
+  }
+
+  void ValidateMetricsConsent(bool enabled) {
+    EXPECT_EQ(g_browser_process->local_state()->GetBoolean(
+        metrics::prefs::kMetricsReportingEnabled), enabled);
+  }
+
+ protected:
+  base::test::ScopedFeatureList feature_list_;
+  base::ScopedTempDir temp_dir_;
+  FakeGaiaMixin fake_gaia_{&mixin_host_};
+  LoginManagerMixin login_manager_mixin_{&mixin_host_, {}, &fake_gaia_};
+  std::unique_ptr<metrics::CrOSPreConsentMetricsManager> manager_;
+};
+
+IN_PROC_BROWSER_TEST_F(OobePreConsentMetricsTest, RegularUserConsented) {
+  EnsureManagerSetupAndValidateConsent();
+
+  login_manager_mixin_.LoginAsNewRegularUser();
+  OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
+  test::WaitForConsolidatedConsentScreen();
+
+  test::TapConsolidatedConsentAccept();
+  OobeScreenExitWaiter(ConsolidatedConsentScreenView::kScreenId).Wait();
+
+  ValidateMetricsConsent(/*enabled=*/true);
+  CheckForMarkerFile();
+}
+
+IN_PROC_BROWSER_TEST_F(OobePreConsentMetricsTest, RegularUserDissented) {
+  EnsureManagerSetupAndValidateConsent();
+
+  login_manager_mixin_.LoginAsNewRegularUser();
+  OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
+  test::WaitForConsolidatedConsentScreen();
+
+  // Dissent to metrics. This will toggle the metrics setting, disabling
+  // metrics.
+  test::OobeJS().TapOnPath({"consolidated-consent", "usageOptin"});
+  test::TapConsolidatedConsentAccept();
+  OobeScreenExitWaiter(ConsolidatedConsentScreenView::kScreenId).Wait();
+
+  ValidateMetricsConsent(/*enabled=*/false);
+  CheckForMarkerFile();
+}
+
+IN_PROC_BROWSER_TEST_F(OobePreConsentMetricsTest, GuestUserConsented) {
+  EnsureManagerSetupAndValidateConsent();
+
+  WizardController::default_controller()->AdvanceToScreen(
+      GuestTosScreenView::kScreenId);
+  OobeScreenWaiter(GuestTosScreenView::kScreenId).Wait();
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"guest-tos", "overview"})
+      ->Wait();
+
+  // Accept guest tos since usage optin is default on.
+  test::OobeJS().ClickOnPath({"guest-tos", "acceptButton"});
+
+  EXPECT_TRUE(g_browser_process->local_state()->GetBoolean(
+      ash::prefs::kOobeGuestMetricsEnabled));
+  CheckForMarkerFile();
+
+  // Validate pre-consent stage has completed and consent remains true before
+  // first non-guest user sign in.
+  chrome::AttemptUserExit();
+
+  ValidateMetricsConsent(/*enabled=*/true);
+  CheckForMarkerFile();
+}
+
+IN_PROC_BROWSER_TEST_F(OobePreConsentMetricsTest, GuestUserDissented) {
+  EnsureManagerSetupAndValidateConsent();
+
+  WizardController::default_controller()->AdvanceToScreen(
+      GuestTosScreenView::kScreenId);
+  OobeScreenWaiter(GuestTosScreenView::kScreenId).Wait();
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"guest-tos", "overview"})
+      ->Wait();
+
+  // Toggle usage optin off.
+  test::OobeJS().ClickOnPath({"guest-tos", "usageOptin"});
+  test::OobeJS().ClickOnPath({"guest-tos", "acceptButton"});
+
+  EXPECT_FALSE(g_browser_process->local_state()->GetBoolean(
+      ash::prefs::kOobeGuestMetricsEnabled));
+  CheckForMarkerFile();
+
+  // Validate pre-consent stage has completed and consent remains true before
+  // first non-guest user sign in.
+  chrome::AttemptUserExit();
+
+  ValidateMetricsConsent(/*enabled=*/true);
+  CheckForMarkerFile();
+}
+
+class ManagedOobePreConsentMetricsTest : public OobePreConsentMetricsTest {
+ public:
+  ManagedOobePreConsentMetricsTest() = default;
+  ~ManagedOobePreConsentMetricsTest() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    OobePreConsentMetricsTest::SetUpInProcessBrowserTestFixture();
+    ASSERT_TRUE(user_policy_mixin_.RequestPolicyUpdate());
+  }
+
+ protected:
+  const LoginManagerMixin::TestUserInfo test_user_{
+      AccountId::FromUserEmailGaiaId(FakeGaiaMixin::kEnterpriseUser1,
+                                     FakeGaiaMixin::kEnterpriseUser1GaiaId)};
+  UserPolicyMixin user_policy_mixin_{&mixin_host_, test_user_.account_id};
+};
+
+IN_PROC_BROWSER_TEST_F(ManagedOobePreConsentMetricsTest, ManagedUser) {
+  EnsureManagerSetupAndValidateConsent();
+
+  ASSERT_TRUE(user_policy_mixin_.RequestPolicyUpdate());
+  login_manager_mixin_.LoginWithDefaultContext(test_user_);
+  OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
+
+  ValidateMetricsConsent(/*enabled=*/true);
+  EXPECT_FALSE(
+      metrics::CrOSPreConsentMetricsManager::Get()->is_enabled_for_testing());
+  CheckForMarkerFile();
+}
+
+class ChildOobePreConsentMetricsTest : public OobePreConsentMetricsTest {
+ public:
+  ChildOobePreConsentMetricsTest() = default;
+  ~ChildOobePreConsentMetricsTest() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    ASSERT_TRUE(user_policy_mixin_.RequestPolicyUpdate());
+    OobePreConsentMetricsTest::SetUpInProcessBrowserTestFixture();
+  }
+
+ private:
+  const LoginManagerMixin::TestUserInfo test_user_{
+      AccountId::FromUserEmailGaiaId(test::kTestEmail, test::kTestGaiaId)};
+  UserPolicyMixin user_policy_mixin_{&mixin_host_, test_user_.account_id};
+};
+
+IN_PROC_BROWSER_TEST_F(ChildOobePreConsentMetricsTest, ChildUser) {
+  EnsureManagerSetupAndValidateConsent();
+
+  LoginDisplayHost::default_host()
+      ->GetWizardContextForTesting()
+      ->sign_in_as_child = true;
+
+  login_manager_mixin_.LoginAsNewChildUser();
+  OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
+
+  WizardController::default_controller()->AdvanceToScreen(
+      ConsolidatedConsentScreenView::kScreenId);
+  test::WaitForConsolidatedConsentScreen();
+
+  test::TapConsolidatedConsentAccept();
+  OobeScreenExitWaiter(ConsolidatedConsentScreenView::kScreenId).Wait();
+
+  ValidateMetricsConsent(/*enabled=*/true);
+  CheckForMarkerFile();
+}
+
+class EnrolledDeviceOobePreConsentMetricsTest
+    : public OobePreConsentMetricsTest {
+ public:
+  EnrolledDeviceOobePreConsentMetricsTest() {
+    LOG(WARNING) << "EnrolledDeviceOobePreConsentMetricsTest";
+    login_manager_mixin_.AppendRegularUsers(1);
+    device_state_.SetState(
+        DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED);
+  }
+
+  void SetUpOnMainThread() override {
+    OobeBaseTest::SetUpOnMainThread();
+
+    fake_gaia_.SetupFakeGaiaForLoginWithDefaults();
+    LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build =
+        true;
+  }
+
+ private:
+  DeviceStateMixin device_state_{
+      &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED};
+};
+
+// Since the device is already enrolled, pre-consent feature should not be
+// enabled.
+IN_PROC_BROWSER_TEST_F(EnrolledDeviceOobePreConsentMetricsTest,
+                       ShouldNotHavePreConsentMetrics) {
+  EXPECT_EQ(metrics::CrOSPreConsentMetricsManager::Get(), nullptr);
+  // It's unable to check the pre-consent complete file since the location of
+  // the file, "/home/chronos", is not accessible by browser test. And because
+  // CrOSPreConsentMetricsManager is not created at all in
+  // `CrOSPreConsentMetricsManager::MaybeCreate` so it's not possible to
+  // override the complete file location. However, by checking if the
+  // CrOSPreConsentMetricsManager is nullptr should be sufficient because it
+  // indicates that the manager is not initialized and pre-consent will have no
+  // chance to be enabled.
+}
+
+}  // namespace ash
diff --git a/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc b/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc
index cfbca7f..789df25 100644
--- a/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc
+++ b/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/repeating_test_future.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/values.h"
diff --git a/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc b/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc
index 61669710..004271b 100644
--- a/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc
+++ b/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc
@@ -13,7 +13,6 @@
 #include "ash/constants/ash_switches.h"
 #include "base/memory/raw_ptr.h"
 #include "base/test/scoped_command_line.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chromeos/ash/components/multidevice/remote_device_test_util.h"
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc
index a6a69e7..72d4d4bc 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_encrypted_event_reporter_unittest.cc
@@ -14,7 +14,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/task/sequenced_task_runner.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/policy/reporting/app_install_event_log_manager_wrapper.h"
 #include "chrome/browser/ash/policy/reporting/arc_app_install_event_log.h"
 #include "chrome/browser/ash/policy/reporting/arc_app_install_event_log_manager.h"
diff --git a/chrome/browser/ash/scanner/scanner_keyed_service.cc b/chrome/browser/ash/scanner/scanner_keyed_service.cc
index 06de28bd..5c7bd11 100644
--- a/chrome/browser/ash/scanner/scanner_keyed_service.cc
+++ b/chrome/browser/ash/scanner/scanner_keyed_service.cc
@@ -22,6 +22,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
+#include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -180,6 +181,8 @@
   }
   manta::proto::ScannerInput scanner_input;
   scanner_input.set_image(std::string(base::as_string_view(*jpeg_bytes)));
+  scanner_input.mutable_current_timestamp()->set_seconds(
+      base::Time::Now().InSecondsFSinceUnixEpoch());
   *scanner_input.mutable_selected_action() = std::move(selected_action);
   scanner_provider_->Call(scanner_input, std::move(callback));
 }
diff --git a/chrome/browser/ash/system/device_disabling_manager_unittest.cc b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
index f427fec..035f2c30 100644
--- a/chrome/browser/ash/system/device_disabling_manager_unittest.cc
+++ b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h"
 #include "chrome/browser/ash/policy/core/device_policy_builder.h"
diff --git a/chrome/browser/ash/system_web_apps/apps/recorder_app/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/recorder_app/BUILD.gn
index 0b5498c6..06af56e 100644
--- a/chrome/browser/ash/system_web_apps/apps/recorder_app/BUILD.gn
+++ b/chrome/browser/ash/system_web_apps/apps/recorder_app/BUILD.gn
@@ -35,6 +35,7 @@
     "//components/signin/public/identity_manager",
     "//components/soda",
     "//components/soda:utils",
+    "//components/variations/service",
     "//url",
   ]
 }
diff --git a/chrome/browser/ash/system_web_apps/apps/recorder_app/chrome_recorder_app_ui_delegate.cc b/chrome/browser/ash/system_web_apps/apps/recorder_app/chrome_recorder_app_ui_delegate.cc
index 9932f350..369839b 100644
--- a/chrome/browser/ash/system_web_apps/apps/recorder_app/chrome_recorder_app_ui_delegate.cc
+++ b/chrome/browser/ash/system_web_apps/apps/recorder_app/chrome_recorder_app_ui_delegate.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/system_web_apps/apps/recorder_app/chrome_recorder_app_ui_delegate.h"
 
+#include "ash/constants/generative_ai_country_restrictions.h"
 #include "ash/webui/recorder_app_ui/recorder_app_ui_delegate.h"
 #include "ash/webui/recorder_app_ui/url_constants.h"
 #include "chrome/browser/browser_process.h"
@@ -20,9 +21,22 @@
 #include "components/soda/constants.h"
 #include "components/soda/soda_installer.h"
 #include "components/soda/soda_util.h"
+#include "components/variations/service/variations_service.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
+namespace {
+// Returns country code in the format of lowercase ISO 3166-1 alpha-2. Example:
+// us, br, in. Returns empty string on failure case, which would not pass
+// IsGenerativeAiAllowedForCountry check.
+std::string GetCountryCode() {
+  return (g_browser_process != nullptr &&
+          g_browser_process->variations_service() != nullptr)
+             ? g_browser_process->variations_service()->GetLatestCountry()
+             : "";
+}
+}  // namespace
+
 ChromeRecorderAppUIDelegate::ChromeRecorderAppUIDelegate(content::WebUI* web_ui)
     : web_ui_(web_ui) {}
 
@@ -90,8 +104,13 @@
 
   const AccountInfo extended_account_info =
       identity_manager->FindExtendedAccountInfoByAccountId(account_id);
-  return extended_account_info.capabilities
-             .can_use_generative_ai_in_recorder_app() == signin::Tribool::kTrue;
+  if (extended_account_info.capabilities
+          .can_use_generative_ai_in_recorder_app() != signin::Tribool::kTrue) {
+    return false;
+  }
+
+  // Check location restrictions.
+  return ash::IsGenerativeAiAllowedForCountry(GetCountryCode());
 }
 
 bool ChromeRecorderAppUIDelegate::CanUseSpeakerLabelForCurrentProfile() {
diff --git a/chrome/browser/autofill/autofill_entity_data_manager_factory.cc b/chrome/browser/autofill/autofill_entity_data_manager_factory.cc
index 738f831..635e3790 100644
--- a/chrome/browser/autofill/autofill_entity_data_manager_factory.cc
+++ b/chrome/browser/autofill/autofill_entity_data_manager_factory.cc
@@ -7,7 +7,7 @@
 #include "base/no_destructor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/webdata_services/web_data_service_factory.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc b/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc
index e68f23b..f384185 100644
--- a/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc
+++ b/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc
@@ -23,7 +23,7 @@
 #include "chrome/browser/user_annotations/user_annotations_service_factory.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/filling/addresses/field_filling_address_util.h"
 #include "components/autofill/core/browser/form_types.h"
diff --git a/chrome/browser/autofill_ai/chrome_autofill_ai_client.h b/chrome/browser/autofill_ai/chrome_autofill_ai_client.h
index da85283..af6417e2 100644
--- a/chrome/browser/autofill_ai/chrome_autofill_ai_client.h
+++ b/chrome/browser/autofill_ai/chrome_autofill_ai_client.h
@@ -9,7 +9,7 @@
 #include <utility>
 
 #include "components/autofill/content/browser/content_autofill_client.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill_ai/core/browser/autofill_ai_client.h"
 #include "components/autofill_ai/core/browser/autofill_ai_manager.h"
 #include "components/autofill_ai/core/browser/suggestion/autofill_ai_model_executor.h"
diff --git a/chrome/browser/autofill_ai/chrome_autofill_ai_client_unittest.cc b/chrome/browser/autofill_ai/chrome_autofill_ai_client_unittest.cc
index 208a143d..b7b52482 100644
--- a/chrome/browser/autofill_ai/chrome_autofill_ai_client_unittest.cc
+++ b/chrome/browser/autofill_ai/chrome_autofill_ai_client_unittest.cc
@@ -17,14 +17,14 @@
 #include "chrome/browser/user_annotations/user_annotations_service_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/data_manager/test_personal_data_manager.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "components/autofill/core/browser/test_utils/test_profiles.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_test_helper.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/autofill/core/common/form_field_data.h"
diff --git a/chrome/browser/background/background_contents_service.cc b/chrome/browser/background/background_contents_service.cc
index f1f173c..78b48f6 100644
--- a/chrome/browser/background/background_contents_service.cc
+++ b/chrome/browser/background/background_contents_service.cc
@@ -19,6 +19,7 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "base/values.h"
+#include "build/build_config.h"
 #include "chrome/browser/apps/platform_apps/app_load_service.h"
 #include "chrome/browser/background/background_contents_service_factory.h"
 #include "chrome/browser/background/background_contents_service_observer.h"
@@ -59,9 +60,9 @@
 #include "ui/message_center/public/cpp/notification_types.h"
 #include "ui/message_center/public/cpp/notifier_id.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/notifier_catalogs.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using content::SiteInstance;
 using content::WebContents;
@@ -766,14 +767,14 @@
       message_center::NOTIFICATION_TYPE_SIMPLE, id, std::u16string(), message,
       ui::ImageModel::FromImage(notification_icon), std::u16string(),
       GURL("chrome://extension-crash"),
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       message_center::NotifierId(
           message_center::NotifierType::SYSTEM_COMPONENT, kNotifierId,
           ash::NotificationCatalogName::kBackgroundCrash),
 #else
       message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT,
                                  kNotifierId),
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
       {}, delegate);
   notification_service->Display(NotificationHandler::Type::TRANSIENT,
                                 notification,
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
index 0bb0e7d8..69da0ad 100644
--- a/chrome/browser/background/background_mode_manager.cc
+++ b/chrome/browser/background/background_mode_manager.cc
@@ -25,7 +25,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
@@ -902,8 +901,7 @@
 
   // Since there are multiple profiles which share the status tray, we now
   // use the browser process to keep track of it.
-#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS_ASH) && \
-    !BUILDFLAG(IS_CHROMEOS_LACROS)
+#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS)
   if (!status_tray_)
     status_tray_ = g_browser_process->status_tray();
 #endif
diff --git a/chrome/browser/background/background_mode_manager_unittest.cc b/chrome/browser/background/background_mode_manager_unittest.cc
index d8e7b2f..7b34f42 100644
--- a/chrome/browser/background/background_mode_manager_unittest.cc
+++ b/chrome/browser/background/background_mode_manager_unittest.cc
@@ -18,7 +18,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/test_simple_task_runner.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/test_extension_system.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
@@ -46,7 +45,7 @@
 #include "ui/gfx/image/image.h"
 #include "ui/message_center/public/cpp/notifier_id.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -309,7 +308,7 @@
   // We aren't interested in if the keep alive works correctly in this test.
   std::unique_ptr<ScopedKeepAlive> test_keep_alive_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // ChromeOS needs extra services to run in the following order.
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
diff --git a/chrome/browser/badging/badge_manager_unittest.cc b/chrome/browser/badging/badge_manager_unittest.cc
index 026b0de..5b6ca0e18 100644
--- a/chrome/browser/badging/badge_manager_unittest.cc
+++ b/chrome/browser/badging/badge_manager_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/test/bind.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/badging/badge_manager_delegate.h"
 #include "chrome/browser/badging/badge_manager_factory.h"
 #include "chrome/browser/badging/test_badge_manager_delegate.h"
@@ -57,9 +56,6 @@
 
   void SetUp() override {
     TestingProfile::Builder builder;
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-    builder.SetIsMainProfile(true);
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
     profile_ = builder.Build();
 
     provider_ = web_app::FakeWebAppProvider::Get(profile());
@@ -194,7 +190,6 @@
   EXPECT_EQ(kAppId, delegate()->cleared_badges().front());
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 TEST_F(BadgeManagerUnittest, BadgingMultipleProfiles) {
   std::unique_ptr<Profile> other_profile = std::make_unique<TestingProfile>();
   web_app::FakeWebAppProvider* new_provider =
@@ -253,7 +248,6 @@
   EXPECT_FALSE(other_updated_apps.empty());
   EXPECT_EQ(kAppId, other_updated_apps[0]);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
 // Tests methods which call into the badge manager delegate do not crash when
 // the delegate is unset.
diff --git a/chrome/browser/bookmarks/android/BUILD.gn b/chrome/browser/bookmarks/android/BUILD.gn
index fdf434d..773a7ae0 100644
--- a/chrome/browser/bookmarks/android/BUILD.gn
+++ b/chrome/browser/bookmarks/android/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/android/rules.gni")
+import("//third_party/jni_zero/jni_zero.gni")
 
 source_set("android") {
   sources = [ "bookmark_bridge.h" ]
@@ -36,8 +37,107 @@
   ]
 }
 
-# TODO(crbug.com/395908100): Replace Placeholder.java once internal code is setup.
 android_library("java") {
+  sources = [
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerProperties.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkMetrics.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkQueryHandler.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiObserver.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiState.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/CancelableAnimator.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ScopedBookmarkModelObservation.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewBinder.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewProperties.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonProperties.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonViewBinder.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsProvider.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarProperties.java",
+    "java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarViewBinder.java",
+  ]
+
+  deps = [
+    "//base:base_java",
+    "//base:base_shared_preferences_java",
+    "//base:callback_java",
+    "//base:lifetime_java",
+    "//base:supplier_java",
+    "//base:tasks_java",
+    "//chrome/android:chrome_app_java_resources",
+    "//chrome/browser/android/lifecycle:java",
+    "//chrome/browser/browser_controls/android:java",
+    "//chrome/browser/commerce/android:java",
+    "//chrome/browser/hub:factory_java",
+    "//chrome/browser/hub:java",
+    "//chrome/browser/page_image_service/android:java",
+    "//chrome/browser/partnerbookmarks:java",
+    "//chrome/browser/preferences:java",
+    "//chrome/browser/profiles/android:java",
+    "//chrome/browser/signin/services/android:java",
+    "//chrome/browser/sync/android:ui_java",
+    "//chrome/browser/tab:java",
+    "//chrome/browser/ui/android/favicon:java",
+    "//chrome/browser/ui/android/native_page:java",
+    "//chrome/browser/ui/android/signin:java",
+    "//chrome/browser/ui/android/toolbar:java",
+    "//chrome/browser/ui/messages/android:java",
+    "//chrome/browser/user_education:java",
+    "//components/bookmarks/common/android:bookmarks_java",
+    "//components/browser_ui/bottomsheet/android:java",
+    "//components/browser_ui/styles/android:java",
+    "//components/browser_ui/util/android:java",
+    "//components/browser_ui/widget/android:java",
+    "//components/commerce/core/android:core_java",
+    "//components/embedder_support/android:util_java",
+    "//components/feature_engagement/public:public_java",
+    "//components/image_fetcher:java",
+    "//components/payments/content/android/ui:java",
+    "//components/power_bookmarks/core:proto_java",
+    "//components/profile_metrics:browser_profile_type_enum_java",
+    "//components/signin/public/android:java",
+    "//components/sync/android:sync_java",
+    "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
+    "//third_party/android_deps:material_design_java",
+    "//third_party/android_deps:protobuf_lite_runtime_java",
+    "//third_party/androidx:androidx_annotation_annotation_java",
+    "//third_party/androidx:androidx_appcompat_appcompat_java",
+    "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
+    "//third_party/androidx:androidx_core_core_java",
+    "//third_party/androidx:androidx_lifecycle_lifecycle_common_java",
+    "//third_party/androidx:androidx_recyclerview_recyclerview_java",
+    "//third_party/jni_zero:jni_zero_java",
+    "//ui/android:ui_java",
+    "//url:url_java",
+  ]
+  srcjar_deps = [ ":jni_headers" ]
+  resources_package = "org.chromium.chrome.browser.bookmarks"
+}
+
+generate_jni("jni_headers") {
   sources =
-      [ "java/src/org/chromium/chrome/browser/bookmarks/Placeholder.java" ]
+      [ "java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java" ]
 }
diff --git a/chrome/browser/bookmarks/android/DEPS b/chrome/browser/bookmarks/android/DEPS
index 2b3b86c..b684b37 100644
--- a/chrome/browser/bookmarks/android/DEPS
+++ b/chrome/browser/bookmarks/android/DEPS
@@ -1,4 +1,19 @@
 include_rules = [
     "+components/power_bookmarks/core",
     "+chrome/browser/partnerbookmarks",
+    "+components/image_fetcher",
+
+    # TODO(crbug.com/395908100): Temporary exceptions to bookmark modularization.
+    # Avoid adding to this list if possible, and ask wylieb@ if you have any
+    # questions or concerns.
+    "+chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditActivity.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkFolderPickerActivity.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/signin/LegacySyncPromoView.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/signin/SigninAndHistorySyncActivityLauncherImpl.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/ActivityUtils.java",
+    "+chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java",
 ]
\ No newline at end of file
diff --git a/chrome/browser/bookmarks/android/OWNERS b/chrome/browser/bookmarks/android/OWNERS
index 2c84324..ed432fb 100644
--- a/chrome/browser/bookmarks/android/OWNERS
+++ b/chrome/browser/bookmarks/android/OWNERS
@@ -1 +1,3 @@
+mdjones@chromium.org
+twellington@chromium.org
 wylieb@chromium.org
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc
index 95d4010..9b5ba7c0 100644
--- a/chrome/browser/bookmarks/android/bookmark_bridge.cc
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -67,7 +67,7 @@
 #include "url/gurl.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
-#include "chrome/android/chrome_jni_headers/BookmarkBridge_jni.h"
+#include "chrome/browser/bookmarks/android/jni_headers/BookmarkBridge_jni.h"
 
 using base::android::AttachCurrentThread;
 using base::android::JavaParamRef;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
index 16bfd06..9c37821 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
@@ -15,7 +15,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
 import org.chromium.chrome.browser.tab.CurrentTabObserver;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java
index 7f824a5f..1741213 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java
@@ -26,9 +26,7 @@
      * @param bookmarkModel The underlying source of bookmark data.
      * @param bookmarkUiPrefs Stores display preferences for bookmarks.
      */
-    public BasicBookmarkQueryHandler(
-            BookmarkModel bookmarkModel,
-            BookmarkUiPrefs bookmarkUiPrefs) {
+    public BasicBookmarkQueryHandler(BookmarkModel bookmarkModel, BookmarkUiPrefs bookmarkUiPrefs) {
         mBookmarkModel = bookmarkModel;
         mBookmarkUiPrefs = bookmarkUiPrefs;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java
index 4b95cfb..82dbe0a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkAddNewFolderCoordinator.java
@@ -9,7 +9,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 
-import org.chromium.chrome.R;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
index 1071e1f..9dddf97 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.bookmarks;
 
+import android.content.SharedPreferences.Editor;
 import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
@@ -22,6 +23,8 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.OneshotSupplierImpl;
 import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkItem;
@@ -1055,8 +1058,12 @@
     }
 
     @CalledByNative
-    private static void clearLastUsedParent() {
-        BookmarkUtils.clearLastUsedPrefs();
+    @VisibleForTesting
+    public static void clearLastUsedParent() {
+        Editor editor = ChromeSharedPreferences.getInstance().getEditor();
+        editor.remove(ChromePreferenceKeys.BOOKMARKS_LAST_USED_PARENT);
+        editor.remove(ChromePreferenceKeys.BOOKMARKS_LAST_USED_URL);
+        editor.apply();
     }
 
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java
index ac82291..ffff179 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java
@@ -16,7 +16,6 @@
 
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.ViewType;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.components.bookmarks.BookmarkId;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
index 4ee81e5..bbfdb36 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java
@@ -8,11 +8,9 @@
 
 import androidx.annotation.Nullable;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.ViewType;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.chrome.browser.bookmarks.ImprovedBookmarkRowProperties.ImageVisibility;
-import org.chromium.chrome.browser.read_later.ReadingListUtils;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkItem;
 import org.chromium.components.commerce.core.ShoppingService;
@@ -142,7 +140,7 @@
 
     private static boolean allItemsSupportReadingList(List<BookmarkItem> bookmarkItems) {
         for (BookmarkItem item : bookmarkItems) {
-            if (!ReadingListUtils.isReadingListSupported(item.getUrl())) {
+            if (!BookmarkUtils.isReadingListSupported(item.getUrl())) {
                 return false;
             }
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java
index e386827..42d0c65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerViewBinder.java
@@ -9,7 +9,6 @@
 
 import androidx.appcompat.widget.Toolbar;
 
-import org.chromium.chrome.R;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkListEntry.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
index 32b74db..a4fe5d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
@@ -26,7 +26,6 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.supplier.OneshotSupplierImpl;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.ViewType;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.chrome.browser.commerce.ShoppingServiceFactory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java
index 78865c0..87717eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java
@@ -12,7 +12,6 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import org.chromium.chrome.R;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
index e6347697..e3dfdb3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
@@ -25,7 +25,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.task.TaskTraits;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.ViewType;
 import org.chromium.chrome.browser.bookmarks.BookmarkMetrics.BookmarkManagerFilter;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
@@ -1693,7 +1692,7 @@
         // global to avoid confusing users.
         boolean filterVisible =
                 mShoppingFilterAvailable
-                        && !BookmarkUtils.isReadingListFolder(mBookmarkModel, getCurrentFolderId());
+                        && !mBookmarkModel.isReadingListFolder(getCurrentFolderId());
         searchBoxPropertyModel.set(
                 BookmarkSearchBoxRowProperties.SHOPPING_CHIP_VISIBILITY, filterVisible);
         Set<PowerBookmarkType> powerFilter = mCurrentPowerFilter;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerTestingDelegate.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerTestingDelegate.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerTestingDelegate.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerTestingDelegate.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
index b08bc49..6907b4a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
@@ -10,7 +10,6 @@
 
 import androidx.annotation.DimenRes;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.SectionHeaderData;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMetrics.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMetrics.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMetrics.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMetrics.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
index e053742b..7cb0c0c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -183,4 +184,14 @@
         if (tab == null) return null;
         return getMostRecentlyAddedUserBookmarkIdForUrl(tab.getOriginalUrl());
     }
+
+    /** Returns whether the given folder is a reading list folder. */
+    public boolean isReadingListFolder(BookmarkId folderId) {
+        if (folderId == null) {
+            return false;
+        }
+
+        return Objects.equals(folderId, getLocalOrSyncableReadingListFolder())
+                || Objects.equals(folderId, getAccountReadingListFolder());
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java
index f6478ec..acf6ee9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java
@@ -13,7 +13,6 @@
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.ApplicationStatus.ActivityStateListener;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.app.bookmarks.BookmarkFolderPickerActivity;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkOpener.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkOpener.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkOpener.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkOpener.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
index 06c14958..0f732d0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
@@ -6,7 +6,6 @@
 
 import android.content.ComponentName;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java
index b939c44..d7e6c0f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java
@@ -16,7 +16,6 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.supplier.OneshotSupplier;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.hub.DisplayButtonData;
 import org.chromium.chrome.browser.hub.FadeHubLayoutAnimationFactory;
 import org.chromium.chrome.browser.hub.FullButtonData;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
index 68a3803..60afd0aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
@@ -12,7 +12,6 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.base.ResettersForTesting;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.signin.LegacySyncPromoView;
 import org.chromium.chrome.browser.signin.SigninAndHistorySyncActivityLauncherImpl;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkQueryHandler.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkQueryHandler.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkQueryHandler.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkQueryHandler.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java
index e041460..5c8a802 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java
@@ -16,7 +16,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.chrome.browser.commerce.PriceTrackingUtils;
 import org.chromium.chrome.browser.commerce.ShoppingServiceFactory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
index 1bc0c42..08957f68 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java
@@ -21,7 +21,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.CallbackController;
 import org.chromium.base.metrics.RecordUserAction;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.chrome.browser.bookmarks.ImprovedBookmarkSaveFlowProperties.FolderText;
 import org.chromium.chrome.browser.bookmarks.PowerBookmarkMetrics.PriceTrackingState;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java
index 3bf53db..f2695a9a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRow.java
@@ -17,7 +17,6 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
-import org.chromium.chrome.R;
 import org.chromium.ui.KeyboardVisibilityDelegate;
 import org.chromium.ui.text.EmptyTextWatcher;
 import org.chromium.ui.widget.ChromeImageButton;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java
index 6bd0580..8f7ce0e28 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java
@@ -10,7 +10,6 @@
 import androidx.annotation.StringRes;
 
 import org.chromium.base.Callback;
-import org.chromium.chrome.R;
 import org.chromium.components.browser_ui.widget.chips.ChipView;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java
index f80afa4..374e68b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkTextInputLayout.java
@@ -12,7 +12,6 @@
 
 import com.google.android.material.textfield.TextInputLayout;
 
-import org.chromium.chrome.R;
 import org.chromium.ui.text.EmptyTextWatcher;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
index b30aa087..ae9e91cc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
@@ -13,7 +13,6 @@
 import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener;
 import androidx.core.view.MenuCompat;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiState.BookmarkUiMode;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.browser_ui.util.ToolbarUtils;
@@ -59,8 +58,6 @@
         setOnMenuItemClickListener(this);
     }
 
-    void setBookmarkOpener(BookmarkOpener bookmarkOpener) {}
-
     void setSelectionDelegate(SelectionDelegate selectionDelegate) {
         mSelectionDelegate = selectionDelegate;
         getMenu().setGroupEnabled(R.id.selection_mode_menu_group, true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java
index c97f34a..45bfad29 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 
 import org.chromium.base.supplier.OneshotSupplier;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiState.BookmarkUiMode;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.bookmarks.BookmarkId;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
index 8ce83ae..25d5ba5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
@@ -16,7 +16,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.OneshotSupplier;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowSortOrder;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.Observer;
@@ -339,7 +338,7 @@
         // Special behavior in reading list:
         // - Select CHRONOLOGICAL as sort order.
         // - Disable sort menu items.
-        boolean inReadingList = BookmarkUtils.isReadingListFolder(mBookmarkModel, mCurrentFolder);
+        boolean inReadingList = mBookmarkModel.isReadingListFolder(mCurrentFolder);
         mModel.set(BookmarkToolbarProperties.SORT_MENU_IDS_ENABLED, !inReadingList);
         if (inReadingList) {
             // Reading list items are always sorted by date added.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiObserver.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiObserver.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiObserver.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiObserver.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
index bf80e4e..d17227b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
@@ -12,7 +12,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ObserverList;
 import org.chromium.base.shared_preferences.SharedPreferencesManager;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiState.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiState.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiState.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiState.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java
index 33c7a910..6a34e2e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUndoController.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 
 import org.chromium.base.lifetime.DestroyChecker;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkModel.BookmarkDeleteObserver;
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
index 9222d694..88d119c4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
@@ -8,7 +8,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences.Editor;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
@@ -63,6 +62,7 @@
 import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
 import org.chromium.components.commerce.core.ShoppingService;
 import org.chromium.components.embedder_support.util.UrlConstants;
+import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.signin.identitymanager.IdentityManager;
 import org.chromium.ui.UiUtils;
@@ -82,6 +82,8 @@
     private static final String TAG = "BookmarkUtils";
     private static final int READING_LIST_SESSION_LENGTH_MS = (int) TimeUnit.HOURS.toMillis(1);
 
+    private static Boolean sReadingListSupportedForTesting;
+
     /**
      * If the tab has already been bookmarked, start {@link BookmarkEditActivity} for the normal
      * bookmark or show the reading list page for reading list bookmark. If not, add the bookmark to
@@ -656,14 +658,6 @@
                         ChromePreferenceKeys.BOOKMARKS_LAST_USED_URL, UrlConstants.BOOKMARKS_URL);
     }
 
-    @VisibleForTesting
-    public static void clearLastUsedPrefs() {
-        Editor editor = ChromeSharedPreferences.getInstance().getEditor();
-        editor.remove(ChromePreferenceKeys.BOOKMARKS_LAST_USED_PARENT);
-        editor.remove(ChromePreferenceKeys.BOOKMARKS_LAST_USED_URL);
-        editor.apply();
-    }
-
     /** Save the last used {@link BookmarkId} as a folder to put new bookmarks to. */
     public static void setLastUsedParent(BookmarkId bookmarkId) {
         ChromeSharedPreferences.getInstance()
@@ -891,7 +885,7 @@
             return false;
         }
 
-        if (isReadingListFolder(bookmarkModel, parentId)) {
+        if (bookmarkModel.isReadingListFolder(parentId)) {
             return false;
         }
 
@@ -936,14 +930,24 @@
         }
     }
 
-    /** Return whether the given BookmarkId is a reading list folder. */
-    public static boolean isReadingListFolder(BookmarkModel boomkarkModel, BookmarkId bookmarkId) {
-        if (bookmarkId == null) {
-            return false;
-        }
+    /** Returns whether the URL can be added as reading list article. */
+    public static boolean isReadingListSupported(GURL url) {
+        if (sReadingListSupportedForTesting != null) return sReadingListSupportedForTesting;
+        if (url == null || url.isEmpty() || !url.isValid()) return false;
 
-        return Objects.equals(bookmarkId, boomkarkModel.getLocalOrSyncableReadingListFolder())
-                || Objects.equals(bookmarkId, boomkarkModel.getAccountReadingListFolder());
+        // This should match ReadingListModel::IsUrlSupported(), having a separate function since
+        // the UI may not load native library.
+        return UrlUtilities.isHttpOrHttps(url);
+    }
+
+    /**
+     * Opens the Reading list folder in the bookmark manager.
+     *
+     * @param profile The profile associated with the bookmark manager.
+     */
+    public static void showReadingList(Profile profile) {
+        BookmarkUtils.showBookmarkManager(
+                null, new BookmarkId(0, BookmarkType.READING_LIST), profile);
     }
 
     private static int getDisplayTextSize(Resources resources) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/CancelableAnimator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/CancelableAnimator.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/CancelableAnimator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/CancelableAnimator.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java
index e0ceb7e..66c3bef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderView.java
@@ -20,7 +20,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StyleRes;
 
-import org.chromium.chrome.R;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.widget.RoundedCornerOutlineProvider;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java
index 37b4d27..beef791 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java
@@ -9,7 +9,6 @@
 
 import androidx.annotation.Nullable;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowSortOrder;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkItem;
@@ -55,7 +54,7 @@
     @Override
     public List<BookmarkListEntry> buildBookmarkListForParent(
             BookmarkId parentId, Set<PowerBookmarkType> powerFilter) {
-        boolean isReadingList = BookmarkUtils.isReadingListFolder(mBookmarkModel, parentId);
+        boolean isReadingList = mBookmarkModel.isReadingListFolder(parentId);
         final List<BookmarkListEntry> bookmarkListEntries;
         if (!isReadingList && powerFilter != null && !powerFilter.isEmpty()) {
             bookmarkListEntries = collectLeafNodes(parentId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java
index 517a1e05..9b28434 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java
@@ -21,7 +21,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
-import org.chromium.chrome.R;
 import org.chromium.components.browser_ui.widget.RoundedCornerOutlineProvider;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectableListUtils;
 import org.chromium.ui.listmenu.ListMenuButton;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
index 0851b68..85179842 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java
@@ -10,7 +10,6 @@
 
 import org.chromium.base.supplier.LazyOneshotSupplier;
 import org.chromium.base.supplier.LazyOneshotSupplierImpl;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
 import org.chromium.chrome.browser.bookmarks.ImprovedBookmarkRowProperties.ImageVisibility;
 import org.chromium.components.bookmarks.BookmarkId;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java
index 686a22d..9e014fff 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java
@@ -6,7 +6,6 @@
 
 import android.view.View;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.ImprovedBookmarkRowProperties.ImageVisibility;
 import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter;
 import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightParams;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java
index 7cf78b4b..3f591ab78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java
@@ -13,8 +13,6 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import org.chromium.chrome.R;
-
 /** Controls the bookmarks save-flow view. */
 public class ImprovedBookmarkSaveFlowView extends FrameLayout {
     private View mBookmarkContainer;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
index 03931f0e..3e2e2f9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
@@ -14,7 +14,6 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.ResettersForTesting;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.commerce.PriceTrackingUtils;
 import org.chromium.chrome.browser.commerce.ShoppingServiceFactory;
 import org.chromium.chrome.browser.price_tracking.PriceDropNotificationManagerFactory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java
index 07bc818..1c07c53 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeader.java
@@ -11,7 +11,6 @@
 
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
-import org.chromium.chrome.R;
 import org.chromium.components.bookmarks.BookmarkItem;
 import org.chromium.components.bookmarks.BookmarkType;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ScopedBookmarkModelObservation.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ScopedBookmarkModelObservation.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ScopedBookmarkModelObservation.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ScopedBookmarkModelObservation.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java
index 6d42fa4..d5249c7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java
@@ -10,7 +10,6 @@
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.ShoppingAccessoryViewProperties.PriceInfo;
 import org.chromium.components.commerce.core.CommerceSubscription;
 import org.chromium.components.commerce.core.ShoppingService;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java
index a27293c..cd75e3d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryView.java
@@ -18,7 +18,6 @@
 
 import androidx.core.widget.ImageViewCompat;
 
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.ShoppingAccessoryViewProperties.PriceInfo;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
@@ -83,15 +82,13 @@
                 mContainer
                         .getBackground()
                         .setColorFilter(
-                                getContext()
-                                        .getColor(R.color.price_drop_annotation_bg_color),
+                                getContext().getColor(R.color.price_drop_annotation_bg_color),
                                 PorterDuff.Mode.SRC_ATOP);
             }
             ImageViewCompat.setImageTintList(
                     mPriceTrackedIcon,
                     ColorStateList.valueOf(
-                            getContext()
-                                    .getColor(R.color.price_drop_annotation_text_green)));
+                            getContext().getColor(R.color.price_drop_annotation_text_green)));
 
             // Primary text displays the current price.
             mPriceDropText.setText(info.getCurrentPriceText());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewBinder.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewBinder.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java
index d619d11..0eb1793 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBar.java
@@ -14,7 +14,7 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.bookmarks.R;
 
 /** View for the bookmark bar which provides users with bookmark access from top chrome. */
 class BookmarkBar extends LinearLayout implements View.OnLayoutChangeListener {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java
index b06093f..d614f15 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButton.java
@@ -24,7 +24,7 @@
 
 import org.chromium.base.CallbackController;
 import org.chromium.base.supplier.LazyOneshotSupplier;
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.bookmarks.R;
 
 import java.util.function.IntConsumer;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonViewBinder.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarButtonViewBinder.java
diff --git a/chrome/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
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java
index 35854c3..7d5595d 100644
--- a/chrome/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
@@ -14,7 +14,7 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.ObservableSupplier;
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.bookmarks.R;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
diff --git a/chrome/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
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java
index 14009c95..bbde03d 100644
--- a/chrome/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
@@ -20,7 +20,7 @@
 
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
-import org.chromium.chrome.R;
+import org.chromium.chrome.browser.bookmarks.R;
 import org.chromium.ui.base.LocalizationUtils;
 
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsProvider.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsProvider.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsProvider.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsProvider.java
diff --git a/chrome/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
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java
index 5480dd51..40199e7 100644
--- a/chrome/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
@@ -16,11 +16,11 @@
 import org.chromium.base.supplier.LazyOneshotSupplier;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkImageFetcher;
 import org.chromium.chrome.browser.bookmarks.BookmarkModel;
 import org.chromium.chrome.browser.bookmarks.BookmarkOpener;
 import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
+import org.chromium.chrome.browser.bookmarks.R;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.ui.favicon.FaviconUtils;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarProperties.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarProperties.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarProperties.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarProperties.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java
index 574f070..4653b7c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java
@@ -14,8 +14,8 @@
 
 import org.chromium.base.supplier.LazyOneshotSupplier;
 import org.chromium.base.supplier.LazyOneshotSupplierImpl;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkImageFetcher;
+import org.chromium.chrome.browser.bookmarks.R;
 import org.chromium.components.bookmarks.BookmarkItem;
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarViewBinder.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarViewBinder.java
rename to chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarViewBinder.java
diff --git a/chrome/browser/bookmarks/android/unmodularized_bookmarks_java_files.gni b/chrome/browser/bookmarks/android/unmodularized_bookmarks_java_files.gni
new file mode 100644
index 0000000..ac466d0
--- /dev/null
+++ b/chrome/browser/bookmarks/android/unmodularized_bookmarks_java_files.gni
@@ -0,0 +1,44 @@
+# 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.
+
+# TODO(crbug.com/395908100): Temporary exceptions to bookmark modularization.
+# Avoid adding to this list if possible, and ask wylieb@ if you have any
+# questions or concerns.
+unmodularized_bookmarks_java_files = [
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkOpener.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPane.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerProperties.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowViewBinder.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkQueryHandler.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMoveSnackbarManager.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateProperties.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerEmptyStateViewBinder.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRow.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowProperties.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerTestingDelegate.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerCoordinator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediator.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BasicBookmarkQueryHandler.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowProperties.java",
+  "//chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java",
+]
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc
index 9ccc90e..54a2f36 100644
--- a/chrome/browser/browser_features.cc
+++ b/chrome/browser/browser_features.cc
@@ -7,7 +7,6 @@
 #include "base/feature_list.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 #if BUILDFLAG(IS_WIN)
 #include "chrome/browser/net/system_network_context_manager.h"
@@ -99,12 +98,9 @@
 
 // Destroy profiles when their last browser window is closed, instead of when
 // the browser exits.
-// On Lacros the feature is enabled only for secondary profiles, check the
-// implementation of `ProfileManager::ProfileInfo::FromUnownedProfile()`.
 BASE_FEATURE(kDestroyProfileOnBrowserClose,
              "DestroyProfileOnBrowserClose",
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
              base::FEATURE_ENABLED_BY_DEFAULT);
 #else
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/browser_keyevents_browsertest.cc b/chrome/browser/browser_keyevents_browsertest.cc
index af7f8fd..a4590b46 100644
--- a/chrome/browser/browser_keyevents_browsertest.cc
+++ b/chrome/browser/browser_keyevents_browsertest.cc
@@ -17,7 +17,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_paths.h"
@@ -541,8 +540,7 @@
 #endif
 
 // https://crbug.com/81451 for mac
-// https://crbug.com/1249688 for Lacros
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_MAC)
 #define MAYBE_AccessKeys DISABLED_AccessKeys
 #else
 #define MAYBE_AccessKeys AccessKeys
diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
index 136c3f26..53b0746 100644
--- a/chrome/browser/browser_process.h
+++ b/chrome/browser/browser_process.h
@@ -28,7 +28,6 @@
 #include "base/functional/callback_forward.h"
 #include "base/memory/scoped_refptr.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/common/buildflags.h"
 #include "components/safe_browsing/buildflags.h"
 #include "media/media_buildflags.h"
@@ -255,9 +254,7 @@
   // before the full browser starts.
   virtual StartupData* startup_data() = 0;
 
-// TODO(crbug.com/40118868): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
   // This will start a timer that, if Chrome is in persistent mode, will check
   // whether an update is available, and if that's the case, restart the
   // browser. Note that restart code will strip some of the command line keys
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 6bcb4ec6..83b19aa3a 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -170,7 +170,7 @@
 #include "chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/soda/soda_installer_impl_chromeos.h"
 #else
 #include "ui/message_center/message_center.h"
@@ -237,7 +237,7 @@
 #include "chrome/browser/sessions/exit_type_service.h"
 #endif
 
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/first_run/upgrade_util.h"
 #include "chrome/browser/ui/profiles/profile_picker.h"
 #endif
@@ -271,7 +271,7 @@
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #endif
 
-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
 // How often to check if the persistent instance of Chrome needs to restart
 // to install an update.
 static const int kUpdateCheckIntervalHours = 6;
@@ -308,7 +308,7 @@
 }
 
 void BrowserProcessImpl::Init() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Forces creation of |metrics_services_manager_client_| if necessary
   // (typically this call is a no-op as MetricsServicesManager has already been
   // created).
@@ -533,11 +533,11 @@
   {
     TRACE_EVENT0("shutdown",
                  "BrowserProcessImpl::StartTearDown:ProfileManager");
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
     // The desktop profile picker needs to be closed before the guest profile
     // can be destroyed.
     ProfilePicker::Hide();
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
     // `profile_manager_` must be destroyed before `background_mode_manager_`,
     // because the background mode manager does not stop observing profile
     // changes at destruction (notifying the observers would cause a use-after-
@@ -730,7 +730,7 @@
   metrics::MetricsService* metrics = g_browser_process->metrics_service();
   if (metrics) {
     metrics->LogCleanShutdown();
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
     // The MetricsService may update Local State prefs in memory without
     // writing the updated prefs to disk, so schedule a Local State write now.
     //
@@ -998,7 +998,7 @@
 #endif
 
 const std::string& BrowserProcessImpl::GetApplicationLocale() {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // TODO(crbug.com/40663419): Remove #if.
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #endif
@@ -1115,17 +1115,17 @@
 
   registry->RegisterBooleanPref(prefs::kAllowCrossOriginAuthPrompt, false);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
   registry->RegisterBooleanPref(prefs::kEulaAccepted, false);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID)
+#endif  // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
 
   registry->RegisterStringPref(language::prefs::kApplicationLocale,
                                std::string());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   registry->RegisterStringPref(prefs::kOwnerLocale, std::string());
   registry->RegisterStringPref(prefs::kHardwareKeyboardLayout,
                                std::string());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   registry->RegisterBooleanPref(metrics::prefs::kMetricsReportingEnabled,
                                 GoogleUpdateSettings::GetCollectStatsConsent());
@@ -1206,9 +1206,7 @@
   return startup_data_;
 }
 
-// TODO(crbug.com/40118868): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
 void BrowserProcessImpl::StartAutoupdateTimer() {
   autoupdate_timer_.Start(FROM_HERE, base::Hours(kUpdateCheckIntervalHours),
                           this, &BrowserProcessImpl::OnAutoupdateTimer);
@@ -1343,9 +1341,9 @@
   soda_installer_impl_ = std::make_unique<speech::SodaInstallerImpl>();
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   soda_installer_impl_ = std::make_unique<speech::SodaInstallerImplChromeOS>();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if !BUILDFLAG(IS_ANDROID)
   screen_ai_download_ = screen_ai::ScreenAIInstallState::Create();
@@ -1670,9 +1668,7 @@
 }
 
 // Mac is currently not supported.
-// TODO(crbug.com/40118868): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
 
 bool BrowserProcessImpl::IsRunningInBackground() const {
   // Check if browser is in the background.
@@ -1742,5 +1738,4 @@
     RestartBackgroundInstance();
   }
 }
-#endif  // BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS_LACROS))
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
index 0ac5334..c960092 100644
--- a/chrome/browser/browser_process_impl.h
+++ b/chrome/browser/browser_process_impl.h
@@ -23,7 +23,6 @@
 #include "base/sequence_checker.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/common/buildflags.h"
 #include "components/keep_alive_registry/keep_alive_state_observer.h"
@@ -210,9 +209,7 @@
 
   StartupData* startup_data() override;
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
   void StartAutoupdateTimer() override;
 #endif
 
@@ -411,9 +408,7 @@
 
   std::unique_ptr<BatteryMetrics> battery_metrics_;
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
   base::RepeatingTimer autoupdate_timer_;
 
   // Gets called by autoupdate timer to see if browser needs restart and can be
@@ -422,8 +417,7 @@
   bool IsRunningInBackground() const;
   void OnPendingRestartResult(bool is_update_pending_restart);
   void RestartBackgroundInstance();
-#endif  // BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS_LACROS))
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
 
   // component updater is normally not used under ChromeOS due
   // to concerns over integrity of data shared between profiles,
diff --git a/chrome/browser/browser_process_platform_part.h b/chrome/browser/browser_process_platform_part.h
index bf8231e3..e360549 100644
--- a/chrome/browser/browser_process_platform_part.h
+++ b/chrome/browser/browser_process_platform_part.h
@@ -6,16 +6,12 @@
 #define CHROME_BROWSER_BROWSER_PROCESS_PLATFORM_PART_H_
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 // Include the appropriate BrowserProcessPlatformPart based on the platform.
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/browser_process_platform_part_android.h"  // IWYU pragma: export
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/browser_process_platform_part_ash.h"  // IWYU pragma: export
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/browser_process_platform_part_chromeos.h"  // IWYU pragma: export
-class BrowserProcessPlatformPart : public BrowserProcessPlatformPartChromeOS {};
 #elif BUILDFLAG(IS_MAC)
 #include "chrome/browser/browser_process_platform_part_mac.h"  // IWYU pragma: export
 #else
diff --git a/chrome/browser/browser_process_platform_part_chromeos_browsertest.cc b/chrome/browser/browser_process_platform_part_chromeos_browsertest.cc
index 6abedb10..3b7279f 100644
--- a/chrome/browser/browser_process_platform_part_chromeos_browsertest.cc
+++ b/chrome/browser/browser_process_platform_part_chromeos_browsertest.cc
@@ -8,7 +8,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_browser_session.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
@@ -271,172 +270,3 @@
   EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
             tab_strip_model->GetWebContentsAt(0)->GetVisibleURL());
 }
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Test that multiple profiles with different URLS and LAST_AND_URLS startup
-// prefs work as intended.
-IN_PROC_BROWSER_TEST_F(BrowserProcessPlatformPartChromeOSBrowsertest,
-                       StartupPrefSetAsLastAndURLsMultiProfile) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  // Disable the profile picker.
-  g_browser_process->local_state()->SetInteger(
-      prefs::kBrowserProfilePickerAvailabilityOnStartup,
-      static_cast<int>(ProfilePicker::AvailabilityOnStartup::kDisabled));
-
-  // Initial browser will be navigated to original_url.
-  const GURL original_url = embedded_test_server()->GetURL("/simple.html");
-
-  // Open `original_url` in a tab for profile_urls's browser.
-  auto* profile_urls = browser()->profile();
-  profile_urls->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, true);
-  TabStripModel* tab_strip_model = browser()->tab_strip_model();
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), original_url));
-  ASSERT_EQ(1, tab_strip_model->count());
-  EXPECT_EQ(original_url,
-            tab_strip_model->GetWebContentsAt(0)->GetLastCommittedURL());
-
-  // Create a second profile.
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  base::FilePath dest_path =
-      profile_manager->user_data_dir().Append(FILE_PATH_LITERAL("New Profile"));
-  base::ScopedAllowBlockingForTesting allow_blocking;
-  Profile* profile_last_and_urls = profile_manager->GetProfile(dest_path);
-  ASSERT_TRUE(profile_last_and_urls);
-  profile_last_and_urls->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage,
-                                                true);
-
-  // Open `original_url` in a tab for profile_last_and_urls's browser.
-  Browser* new_browser = Browser::Create(
-      Browser::CreateParams(Browser::TYPE_NORMAL, profile_last_and_urls, true));
-  chrome::NewTab(new_browser);
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(new_browser, original_url));
-  tab_strip_model = new_browser->tab_strip_model();
-  ASSERT_EQ(1, tab_strip_model->count());
-  EXPECT_EQ(original_url,
-            tab_strip_model->GetWebContentsAt(0)->GetLastCommittedURL());
-
-  // Keep the browser process running while browsers for both profiles are
-  // closed.
-  ScopedKeepAlive keep_alive(KeepAliveOrigin::BROWSER,
-                             KeepAliveRestartOption::DISABLED);
-  ScopedProfileKeepAlive profile_keep_alive_urls(
-      profile_urls, ProfileKeepAliveOrigin::kBrowserWindow);
-  ScopedProfileKeepAlive profile_keep_alive_last_and_urls(
-      profile_last_and_urls, ProfileKeepAliveOrigin::kBrowserWindow);
-  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls));
-  CloseBrowserSynchronously(browser());
-  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last_and_urls));
-  CloseBrowserSynchronously(new_browser);
-  ASSERT_TRUE(BrowserList::GetInstance()->empty());
-
-  // Create the startup pref configuration.
-  const GURL restore_url_1 = embedded_test_server()->GetURL("/title1.html");
-  const GURL restore_url_2 = embedded_test_server()->GetURL("/title2.html");
-  const GURL restore_url_3 = embedded_test_server()->GetURL("/title3.html");
-  SessionStartupPref startup_pref(SessionStartupPref::URLS);
-  std::vector<GURL> urls_to_open;
-  urls_to_open.push_back(restore_url_1);
-  urls_to_open.push_back(restore_url_2);
-  urls_to_open.push_back(restore_url_3);
-  startup_pref.urls = urls_to_open;
-
-  // Set `profile_urls` to the URLS pref.
-  SessionStartupPref::SetStartupPref(profile_urls, startup_pref);
-
-  // Set `profile_last_and_urls` to the LAST_AND_URLS pref.
-  startup_pref.type = SessionStartupPref::LAST_AND_URLS;
-  SessionStartupPref::SetStartupPref(profile_last_and_urls, startup_pref);
-
-  // Open a window for `profile_urls` and test to make sure URLs are set as
-  // expected.
-  {
-    chrome::NewEmptyWindow(profile_urls);
-    ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls));
-    ASSERT_EQ(0u, chrome::GetBrowserCount(profile_last_and_urls));
-
-    auto* pref_urls_opened_browser =
-        chrome::FindLastActiveWithProfile(profile_urls);
-    ASSERT_TRUE(pref_urls_opened_browser);
-
-    EXPECT_NO_FATAL_FAILURE(
-        WaitForLoadStopForBrowser(pref_urls_opened_browser));
-    tab_strip_model = pref_urls_opened_browser->tab_strip_model();
-    EXPECT_EQ(3, tab_strip_model->GetTabCount());
-    EXPECT_EQ(restore_url_1,
-              tab_strip_model->GetWebContentsAt(0)->GetVisibleURL());
-    EXPECT_EQ(restore_url_2,
-              tab_strip_model->GetWebContentsAt(1)->GetVisibleURL());
-    EXPECT_EQ(restore_url_3,
-              tab_strip_model->GetWebContentsAt(2)->GetVisibleURL());
-
-    // If there are existing open browsers opening a new browser should not
-    // trigger a restore or open another window with startup URLs.
-    auto* active_browser =
-        ui_test_utils::OpenNewEmptyWindowAndWaitUntilActivated(profile_urls);
-    ASSERT_EQ(2u, chrome::GetBrowserCount(profile_urls));
-    EXPECT_NO_FATAL_FAILURE(WaitForLoadStopForBrowser(active_browser));
-    tab_strip_model = active_browser->tab_strip_model();
-    EXPECT_EQ(1, tab_strip_model->GetTabCount());
-    EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
-              tab_strip_model->GetWebContentsAt(0)->GetVisibleURL());
-  }
-
-  // Open a window for `profile_last_and_urls` and test to make sure the
-  // previous window is restored and startup URLs are opened in a new window as
-  // expected.
-  {
-    // Request a new browser window.
-    ui_test_utils::BrowserChangeObserver restore_browser_observer(
-        nullptr, ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);
-    chrome::NewEmptyWindow(profile_last_and_urls);
-
-    // This startup pref should restore a single window.
-    base::RunLoop run_loop;
-    testing::SessionsRestoredWaiter restore_waiter(run_loop.QuitClosure(), 1);
-    run_loop.Run();
-
-    auto* pref_urls_opened_browser = restore_browser_observer.Wait();
-    ASSERT_TRUE(pref_urls_opened_browser);
-    EXPECT_EQ(pref_urls_opened_browser->profile(), profile_last_and_urls);
-    ui_test_utils::WaitUntilBrowserBecomeActive(pref_urls_opened_browser);
-
-    ASSERT_EQ(2u, chrome::GetBrowserCount(profile_urls));
-    ASSERT_EQ(2u, chrome::GetBrowserCount(profile_last_and_urls));
-
-    auto* last_session_opened_browser = FindOneOtherBrowserForProfile(
-        profile_last_and_urls, pref_urls_opened_browser);
-    ASSERT_TRUE(last_session_opened_browser);
-
-    EXPECT_NO_FATAL_FAILURE(
-        WaitForLoadStopForBrowser(last_session_opened_browser));
-    tab_strip_model = last_session_opened_browser->tab_strip_model();
-    ASSERT_EQ(1, tab_strip_model->count());
-    EXPECT_EQ(original_url,
-              tab_strip_model->GetWebContentsAt(0)->GetVisibleURL());
-
-    EXPECT_NO_FATAL_FAILURE(
-        WaitForLoadStopForBrowser(pref_urls_opened_browser));
-    tab_strip_model = pref_urls_opened_browser->tab_strip_model();
-    EXPECT_EQ(3, tab_strip_model->GetTabCount());
-    EXPECT_EQ(restore_url_1,
-              tab_strip_model->GetWebContentsAt(0)->GetVisibleURL());
-    EXPECT_EQ(restore_url_2,
-              tab_strip_model->GetWebContentsAt(1)->GetVisibleURL());
-    EXPECT_EQ(restore_url_3,
-              tab_strip_model->GetWebContentsAt(2)->GetVisibleURL());
-
-    // If there are existing open browsers opening a new browser should not
-    // trigger a restore or open another window with last URLs.
-    ui_test_utils::OpenNewEmptyWindowAndWaitUntilActivated(
-        profile_last_and_urls);
-    ASSERT_EQ(3u, chrome::GetBrowserCount(profile_last_and_urls));
-    auto* last_active_browser =
-        chrome::FindLastActiveWithProfile(profile_last_and_urls);
-    EXPECT_NO_FATAL_FAILURE(WaitForLoadStopForBrowser(last_active_browser));
-    tab_strip_model = last_active_browser->tab_strip_model();
-    EXPECT_EQ(1, tab_strip_model->GetTabCount());
-    EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
-              tab_strip_model->GetWebContentsAt(0)->GetVisibleURL());
-  }
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/certificate_provider/certificate_provider_service.cc b/chrome/browser/certificate_provider/certificate_provider_service.cc
index 7d09a42..ee5080f 100644
--- a/chrome/browser/certificate_provider/certificate_provider_service.cc
+++ b/chrome/browser/certificate_provider/certificate_provider_service.cc
@@ -18,16 +18,10 @@
 #include "base/memory/ptr_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/task_runner.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/certificate_provider/certificate_provider.h"
 #include "extensions/common/extension_id.h"
 #include "net/base/net_errors.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/cert_database.mojom.h"
-#include "chromeos/lacros/lacros_service.h"
-#endif  // IS_CHROMEOS_LACROS
-
 namespace chromeos {
 
 namespace {
@@ -241,17 +235,6 @@
     const std::string& extension_id,
     const CertificateInfoList& certificate_infos) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Synchronize with Ash-Chrome
-  chromeos::LacrosService* service = chromeos::LacrosService::Get();
-  if (service && service->IsAvailable<crosapi::mojom::CertDatabase>() &&
-      service->GetInterfaceVersion<crosapi::mojom::CertDatabase>() >=
-          static_cast<int>(crosapi::mojom::CertDatabase::MethodMinVersions::
-                               kSetCertsProvidedByExtensionMinVersion)) {
-    service->GetRemote<crosapi::mojom::CertDatabase>()
-        ->SetCertsProvidedByExtension(extension_id, certificate_infos);
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
   certificate_map_.UpdateCertificatesForExtension(extension_id,
                                                   certificate_infos);
   for (auto& observer : observers_)
diff --git a/chrome/browser/certificate_provider/security_token_pin_dialog_host_popup_impl.cc b/chrome/browser/certificate_provider/security_token_pin_dialog_host_popup_impl.cc
index f4a8c6d..b73fc16 100644
--- a/chrome/browser/certificate_provider/security_token_pin_dialog_host_popup_impl.cc
+++ b/chrome/browser/certificate_provider/security_token_pin_dialog_host_popup_impl.cc
@@ -9,7 +9,7 @@
 
 #include "base/check_op.h"
 #include "base/functional/bind.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -20,7 +20,7 @@
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/dialog_delegate.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ui/ash/login/login_display_host.h"
 #endif
 
@@ -29,7 +29,7 @@
 namespace {
 
 gfx::NativeWindow GetBrowserParentWindow() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (ash::LoginDisplayHost::default_host())
     return ash::LoginDisplayHost::default_host()->GetNativeWindow();
 #endif
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc
index dbd4eac..7a32eb9c 100644
--- a/chrome/browser/chrome_browser_field_trials.cc
+++ b/chrome/browser/chrome_browser_field_trials.cc
@@ -14,7 +14,6 @@
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/metrics/chrome_browser_sampling_trials.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/metrics/chrome_metrics_service_client.h"
@@ -33,18 +32,12 @@
 #include "chrome/common/chrome_features.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/login/ui/management_disclosure_field_trial.h"
 #include "chrome/common/channel_info.h"
 #include "chromeos/ash/services/multidevice_setup/public/cpp/first_run_field_trial.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// GN doesn't understand conditional includes, so we need nogncheck here.
-// See crbug.com/1125897.
-#include "chromeos/startup/startup.h"  // nogncheck
-#endif
-
 #if BUILDFLAG(IS_LINUX)
 #include "base/nix/xdg_util.h"
 #include "ui/base/ui_base_features.h"
@@ -74,7 +67,7 @@
   metrics::CreateFallbackUkmSamplingTrialIfNeeded(
       entropy_providers.default_entropy(), feature_list);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!has_seed) {
     ash::multidevice_setup::CreateFirstRunFieldTrial(feature_list);
   }
diff --git a/chrome/browser/chrome_browser_interface_binders_webui.cc b/chrome/browser/chrome_browser_interface_binders_webui.cc
index a7dcf53..ac2100d 100644
--- a/chrome/browser/chrome_browser_interface_binders_webui.cc
+++ b/chrome/browser/chrome_browser_interface_binders_webui.cc
@@ -340,6 +340,7 @@
 
 #if BUILDFLAG(ENABLE_GLIC)
 #include "chrome/browser/glic/glic_enabling.h"
+#include "chrome/browser/glic/glic_fre_ui.h"
 #include "chrome/browser/glic/glic_ui.h"
 #endif
 
@@ -408,8 +409,11 @@
 #if BUILDFLAG(ENABLE_GLIC)
   if (glic::GlicEnabling::IsProfileEligible(Profile::FromBrowserContext(
           render_frame_host->GetProcess()->GetBrowserContext()))) {
-    // Register the binder for all eligible profiles but the WebUI page will
-    // check whether Glic is policy-enabled and restrict access if needed.
+    // Register binders for all eligible profiles.
+    RegisterWebUIControllerInterfaceBinder<glic::mojom::FrePageHandlerFactory,
+                                           glic::GlicFreUI>(map);
+    // For GlicUI, the WebUI page will check whether Glic is policy-enabled and
+    // restrict access if needed. This isn't required for the GlicFreUI.
     RegisterWebUIControllerInterfaceBinder<glic::mojom::PageHandlerFactory,
                                            glic::GlicUI>(map);
   }
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
index a983e4b1..fee5306 100644
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -283,7 +283,7 @@
                 &performance_manager::mechanism::userspace_swap::
                     UserspaceSwapInitializationImpl::Create,
                 render_process_host->GetDeprecatedID()),
-            performance_manager::PerformanceManager::GetTaskRunner());
+            ui_task_runner);
   }
 #endif  // BUILDFLAG(IS_CHROMEOS) && defined(ARCH_CPU_X86_64)
 
diff --git a/chrome/browser/chrome_resource_bundle_helper.cc b/chrome/browser/chrome_resource_bundle_helper.cc
index 0e256b2..d1e99bf1 100644
--- a/chrome/browser/chrome_resource_bundle_helper.cc
+++ b/chrome/browser/chrome_resource_bundle_helper.cc
@@ -10,7 +10,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/metrics/chrome_feature_list_creator.h"
 #include "chrome/browser/prefs/chrome_command_line_pref_store.h"
 #include "chrome/browser/prefs/chrome_pref_service_factory.h"
@@ -27,16 +26,12 @@
 #include "ui/base/resource/resource_bundle_android.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "chrome/common/pref_names.h"
 #include "ui/lottie/resource.h"  // nogncheck
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "ui/base/ui_base_switches.h"
-#endif
-
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "extensions/common/extension_l10n_util.h"
 #endif
@@ -47,7 +42,7 @@
     ChromeFeatureListCreator* chrome_feature_list_creator) {
   TRACE_EVENT0("startup", "ChromeBrowserMainParts::InitializeLocalState");
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(ash::switches::kLoginManager)) {
     PrefService* local_state = chrome_feature_list_creator->local_state();
@@ -63,7 +58,7 @@
       local_state->SetString(language::prefs::kApplicationLocale, owner_locale);
     }
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 // Initializes the shared instance of ResourceBundle and returns the application
@@ -93,7 +88,7 @@
       local_state->GetString(language::prefs::kApplicationLocale);
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ui::ResourceBundle::SetLottieParsingFunctions(
       &lottie::ParseLottieAsStillImage, &lottie::ParseLottieAsThemedStillImage);
 #endif
diff --git a/chrome/browser/commerce/price_tracking/android/DEPS b/chrome/browser/commerce/price_tracking/android/DEPS
index 560a914..0ca05a2 100644
--- a/chrome/browser/commerce/price_tracking/android/DEPS
+++ b/chrome/browser/commerce/price_tracking/android/DEPS
@@ -4,12 +4,12 @@
   "+chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModelObserver.java",
-  "+chrome/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java",
   "+chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java",
+  "+chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/TabBookmarker.java",
   "+components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/ImageFetcher.java",
   "+components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/ImageFetcherFactory.java",
 ]
diff --git a/chrome/browser/component_updater/masked_domain_list_component_installer.cc b/chrome/browser/component_updater/masked_domain_list_component_installer.cc
index d361b39..410a914 100644
--- a/chrome/browser/component_updater/masked_domain_list_component_installer.cc
+++ b/chrome/browser/component_updater/masked_domain_list_component_installer.cc
@@ -4,18 +4,173 @@
 
 #include "chrome/browser/component_updater/masked_domain_list_component_installer.h"
 
+#include <cstdint>
+#include <optional>
+#include <string>
 #include <utility>
+#include <vector>
 
+#include "base/feature_list.h"
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/path_service.h"
 #include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+#include "base/time/time.h"
 #include "base/version.h"
+#include "chrome/common/chrome_paths.h"
 #include "components/component_updater/installer_policies/masked_domain_list_component_installer_policy.h"
+#include "components/ip_protection/common/ip_protection_telemetry.h"
+#include "components/ip_protection/common/masked_domain_list.h"
+#include "components/privacy_sandbox/masked_domain_list/masked_domain_list.pb.h"
 #include "content/public/browser/network_service_instance.h"
+#include "content/public/common/content_client.h"
 #include "mojo/public/cpp/base/proto_wrapper.h"
+#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 
 namespace component_updater {
 
+namespace {
+
+constexpr base::FilePath::CharType kDefaultMdlFileName[] =
+    FILE_PATH_LITERAL("Default MDL");
+
+constexpr base::FilePath::CharType kRegularBrowsingMdlFileName[] =
+    FILE_PATH_LITERAL("Regular Browsing MDL");
+
+bool UseFlatbuffer() {
+  return base::FeatureList::IsEnabled(
+      network::features::kMaskedDomainListFlatbufferImpl);
+}
+
+struct BuildFlatbufferResult {
+  base::File default_mdl_file;
+  uint64_t default_mdl_size = 0;
+  base::File regular_browsing_mdl_file;
+  uint64_t regular_browsing_mdl_size = 0;
+};
+
+void BuildFlatbuffer(
+    std::optional<mojo_base::ProtoWrapper> masked_domain_list) {
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE, {base::MayBlock()},
+      // Build the flatbuffer file in a thread, as it does some CPU-intensive
+      // processing and writes to disk, which can block.
+      base::BindOnce(
+          [](std::optional<mojo_base::ProtoWrapper> masked_domain_list)
+              -> std::optional<BuildFlatbufferResult> {
+            base::FilePath user_data_path;
+            if (!base::PathService::Get(chrome::DIR_USER_DATA,
+                                        &user_data_path)) {
+              VLOG(1) << "DIR_USER_DATA does not exist";
+              return std::nullopt;
+            }
+
+            base::FilePath default_mdl_file_path =
+                user_data_path.Append(kDefaultMdlFileName);
+            base::FilePath regular_browsing_mdl_file_path =
+                user_data_path.Append(kRegularBrowsingMdlFileName);
+
+            std::optional<masked_domain_list::MaskedDomainList> mdl =
+                masked_domain_list->As<masked_domain_list::MaskedDomainList>();
+            if (!mdl.has_value()) {
+              VLOG(1) << "Masked Domain List was empty";
+              return std::nullopt;
+            }
+            UMA_HISTOGRAM_MEMORY_KB("NetworkService.MaskedDomainList.SizeInKB",
+                                    mdl->ByteSizeLong() / 1024);
+            const base::Time start_time = base::Time::Now();
+            if (!ip_protection::MaskedDomainList::BuildFromProto(
+                    *mdl, default_mdl_file_path,
+                    regular_browsing_mdl_file_path)) {
+              VLOG(1) << "Masked Domain List flatbuffer build failed";
+              return std::nullopt;
+            }
+            base::UmaHistogramTimes(
+                "NetworkService.IpProtection.ProxyAllowList."
+                "FlatbufferBuildTime",
+                base::Time::Now() - start_time);
+
+            std::optional<int64_t> default_mdl_size =
+                base::GetFileSize(default_mdl_file_path);
+            if (!default_mdl_size.has_value()) {
+              VLOG(1) << "Could not get size of " << default_mdl_file_path;
+              return std::nullopt;
+            }
+            ip_protection::Telemetry().MdlEstimatedDiskUsage(*default_mdl_size);
+
+            std::optional<int64_t> regular_browsing_mdl_size =
+                base::GetFileSize(regular_browsing_mdl_file_path);
+            if (!regular_browsing_mdl_size.has_value()) {
+              VLOG(1) << "Could not get size of "
+                      << regular_browsing_mdl_file_path;
+              return std::nullopt;
+            }
+            ip_protection::Telemetry().MdlEstimatedDiskUsage(
+                *regular_browsing_mdl_size);
+
+            // Open the files read-only, and share those file handles to the
+            // network service.
+            int flags = base::File::AddFlagsForPassingToUntrustedProcess(
+                base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ |
+                base::File::Flags::FLAG_DELETE_ON_CLOSE);
+
+            base::File default_mdl_file(default_mdl_file_path, flags);
+            base::File regular_browsing_mdl_file(regular_browsing_mdl_file_path,
+                                                 flags);
+
+            BuildFlatbufferResult result{
+                .default_mdl_file = std::move(default_mdl_file),
+                .default_mdl_size =
+                    base::checked_cast<uint64_t>(*default_mdl_size),
+                .regular_browsing_mdl_file =
+                    std::move(regular_browsing_mdl_file),
+                .regular_browsing_mdl_size =
+                    base::checked_cast<uint64_t>(*regular_browsing_mdl_size),
+            };
+            return result;
+          },
+          std::move(masked_domain_list)),
+      // Call to the network service on the main thread.
+      base::BindOnce([](std::optional<BuildFlatbufferResult> result) {
+        if (result.has_value()) {
+          content::GetNetworkService()->UpdateMaskedDomainListFlatbuffer(
+              std::move(result->default_mdl_file), result->default_mdl_size,
+              std::move(result->regular_browsing_mdl_file),
+              result->regular_browsing_mdl_size);
+        }
+      }));
+}
+
+}  // namespace
+
+void OnMaskedDomainListReady(
+    base::Version version,
+    std::optional<mojo_base::ProtoWrapper> masked_domain_list) {
+  base::UmaHistogramBoolean(
+      "NetworkService.IpProtection.ProxyAllowList."
+      "UpdateSuccess",
+      masked_domain_list.has_value());
+  if (masked_domain_list.has_value()) {
+    VLOG(1) << "Received Masked Domain List";
+
+    if (UseFlatbuffer()) {
+      BuildFlatbuffer(std::move(masked_domain_list));
+    } else {
+      content::GetNetworkService()->UpdateMaskedDomainList(
+          std::move(masked_domain_list).value(),
+          /*exclusion_list=*/std::vector<std::string>());
+    }
+  } else {
+    VLOG(1) << "Could not read Masked Domain List file";
+  }
+}
 void RegisterMaskedDomainListComponent(ComponentUpdateService* cus) {
   if (!MaskedDomainListComponentInstallerPolicy::IsEnabled()) {
     return;
@@ -24,18 +179,7 @@
   VLOG(1) << "Registering Masked Domain List component.";
 
   auto policy = std::make_unique<MaskedDomainListComponentInstallerPolicy>(
-      /*on_list_ready=*/base::BindRepeating(
-          [](base::Version version,
-             std::optional<mojo_base::ProtoWrapper> masked_domain_list) {
-            if (masked_domain_list.has_value()) {
-              VLOG(1) << "Received Masked Domain List";
-              content::GetNetworkService()->UpdateMaskedDomainList(
-                  std::move(masked_domain_list.value()),
-                  /*exclusion_list=*/std::vector<std::string>());
-            } else {
-              LOG(ERROR) << "Could not read Masked Domain List file";
-            }
-          }));
+      base::BindRepeating(OnMaskedDomainListReady));
 
   base::MakeRefCounted<ComponentInstaller>(std::move(policy),
                                            /*action_handler=*/nullptr,
diff --git a/chrome/browser/component_updater/masked_domain_list_component_installer.h b/chrome/browser/component_updater/masked_domain_list_component_installer.h
index 3680232..7d040d7 100644
--- a/chrome/browser/component_updater/masked_domain_list_component_installer.h
+++ b/chrome/browser/component_updater/masked_domain_list_component_installer.h
@@ -5,12 +5,23 @@
 #ifndef CHROME_BROWSER_COMPONENT_UPDATER_MASKED_DOMAIN_LIST_COMPONENT_INSTALLER_H_
 #define CHROME_BROWSER_COMPONENT_UPDATER_MASKED_DOMAIN_LIST_COMPONENT_INSTALLER_H_
 
-#include "components/component_updater/component_installer.h"
+#include <optional>
+
+#include "mojo/public/cpp/base/proto_wrapper.h"
+
+namespace base {
+class Version;
+}
 
 namespace component_updater {
 
+class ComponentUpdateService;
+
+void OnMaskedDomainListReady(
+    base::Version version,
+    std::optional<mojo_base::ProtoWrapper> masked_domain_list);
 void RegisterMaskedDomainListComponent(ComponentUpdateService* cus);
 
-}
+}  // namespace component_updater
 
 #endif  // CHROME_BROWSER_COMPONENT_UPDATER_MASKED_DOMAIN_LIST_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/masked_domain_list_component_installer_unittest.cc b/chrome/browser/component_updater/masked_domain_list_component_installer_unittest.cc
index fcaae13..491d790 100644
--- a/chrome/browser/component_updater/masked_domain_list_component_installer_unittest.cc
+++ b/chrome/browser/component_updater/masked_domain_list_component_installer_unittest.cc
@@ -4,12 +4,23 @@
 
 #include "chrome/browser/component_updater/masked_domain_list_component_installer.h"
 
+#include <string>
+
 #include "base/check.h"
+#include "base/containers/span.h"
+#include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/run_until.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/scoped_path_override.h"
+#include "base/version.h"
+#include "chrome/common/chrome_paths.h"
 #include "components/component_updater/mock_component_updater_service.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/test/browser_task_environment.h"
+#include "mojo/public/cpp/base/proto_wrapper.h"
+#include "mojo/public/cpp/base/proto_wrapper_passkeys.h"
 #include "services/network/network_service.h"
 #include "services/network/public/cpp/features.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -20,20 +31,47 @@
 namespace {
 using ::testing::_;
 
+constexpr char kMaskedDomainListProto[] = "masked_domain_list.MaskedDomainList";
+constexpr char kUpdateSuccessHistogram[] =
+    "NetworkService.IpProtection.ProxyAllowList.UpdateSuccess";
+constexpr char kUpdateProcessTimeHistogram[] =
+    "NetworkService.IpProtection.ProxyAllowList.UpdateProcessTime";
+constexpr char kFlatbufferBuildTimeHistogram[] =
+    "NetworkService.IpProtection.ProxyAllowList.FlatbufferBuildTime";
+constexpr char kMdlSizeHistogram[] = "NetworkService.MaskedDomainList.SizeInKB";
+constexpr char kDiskUsageHistogram[] =
+    "NetworkService.MaskedDomainList.DiskUsageInKB";
+
 }  // namespace
 
 class MaskedDomainListComponentInstallerPolicyTest : public ::testing::Test {
  public:
   MaskedDomainListComponentInstallerPolicyTest() {
-    CHECK(component_install_dir_.CreateUniqueTempDir());
     content::GetNetworkService();  // Initializes Network Service.
   }
 
+  mojo_base::ProtoWrapper FakeMdl() {
+    masked_domain_list::MaskedDomainList mdl;
+    masked_domain_list::ResourceOwner* resource_owner =
+        mdl.add_resource_owners();
+    resource_owner->set_owner_name("foo");
+    resource_owner->add_owned_properties("property.example.com");
+    resource_owner->add_owned_resources()->set_domain("resource.example.com");
+
+    std::string proto_str;
+    EXPECT_TRUE(mdl.SerializeToString(&proto_str));
+    return mojo_base::ProtoWrapper(base::as_byte_span(proto_str),
+                                   kMaskedDomainListProto,
+                                   mojo_base::ProtoWrapperBytes::GetPassKey());
+  }
+
  protected:
+  // Ensure each test run has its own user-data directory.
+  const base::ScopedPathOverride path_override{chrome::DIR_USER_DATA};
+
   content::BrowserTaskEnvironment env_;
   base::test::ScopedFeatureList scoped_feature_list_;
-
-  base::ScopedTempDir component_install_dir_;
+  base::HistogramTester histogram_tester_;
 };
 
 TEST_F(MaskedDomainListComponentInstallerPolicyTest, FeatureDisabled) {
@@ -66,4 +104,44 @@
                    ->IsPopulated());
 }
 
+TEST_F(MaskedDomainListComponentInstallerPolicyTest,
+       OnMaskedDomainListReadyProto) {
+  scoped_feature_list_.InitWithFeatures(
+      {network::features::kMaskedDomainList},
+      {network::features::kMaskedDomainListFlatbufferImpl});
+
+  OnMaskedDomainListReady(base::Version(), FakeMdl());
+  EXPECT_TRUE(base::test::RunUntil([&] {
+    return network::NetworkService::GetNetworkServiceForTesting()
+        ->masked_domain_list_manager()
+        ->IsPopulated();
+  }));
+  histogram_tester_.ExpectTotalCount(kUpdateSuccessHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kUpdateProcessTimeHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kFlatbufferBuildTimeHistogram, 0);
+  histogram_tester_.ExpectTotalCount(kMdlSizeHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kDiskUsageHistogram, 0);
+}
+
+TEST_F(MaskedDomainListComponentInstallerPolicyTest,
+       OnMaskedDomainListReadyFlatbuffer) {
+  scoped_feature_list_.InitWithFeatures(
+      {network::features::kMaskedDomainList,
+       network::features::kMaskedDomainListFlatbufferImpl},
+      {});
+
+  OnMaskedDomainListReady(base::Version(), FakeMdl());
+  EXPECT_TRUE(base::test::RunUntil([&] {
+    return network::NetworkService::GetNetworkServiceForTesting()
+        ->masked_domain_list_manager()
+        ->IsPopulated();
+  }));
+  histogram_tester_.ExpectTotalCount(kUpdateSuccessHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kUpdateProcessTimeHistogram, 0);
+  histogram_tester_.ExpectTotalCount(kFlatbufferBuildTimeHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kMdlSizeHistogram, 1);
+  // Both MDLs get measured, so two records.
+  histogram_tester_.ExpectTotalCount(kDiskUsageHistogram, 2);
+}
+
 }  // namespace component_updater
diff --git a/chrome/browser/component_updater/probabilistic_reveal_token_component_installer.cc b/chrome/browser/component_updater/probabilistic_reveal_token_component_installer.cc
new file mode 100644
index 0000000..203522e
--- /dev/null
+++ b/chrome/browser/component_updater/probabilistic_reveal_token_component_installer.cc
@@ -0,0 +1,44 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/component_updater/probabilistic_reveal_token_component_installer.h"
+
+#include <memory>
+#include <optional>
+#include <string>
+
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "components/component_updater/component_updater_service.h"
+#include "components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.h"
+#include "content/public/browser/network_service_instance.h"
+#include "services/network/public/mojom/network_service.mojom.h"
+
+namespace component_updater {
+
+void RegisterProbabilisticRevealTokenComponent(
+    component_updater::ComponentUpdateService* cus) {
+  VLOG(1) << "Registering Probabilistic Reveal Token component.";
+  auto installer = base::MakeRefCounted<ComponentInstaller>(
+      std::make_unique<ProbabilisticRevealTokenComponentInstallerPolicy>(
+          /*on_registry_ready=*/base::BindRepeating([](const std::optional<
+                                                        std::string>
+                                                           json_content) {
+            if (!json_content) {
+              VLOG(1)
+                  << "Failed to receive Probabilistic Reveal Token Registry.";
+              return;
+            }
+            VLOG(1) << "Received Probabilistic Reveal Token Registry.";
+
+            // TODO(crbug.com/396401608): Set the PRT registry in the network
+            // service.
+          })));
+
+  installer->Register(cus, base::OnceClosure());
+}
+
+}  // namespace component_updater
diff --git a/chrome/browser/component_updater/probabilistic_reveal_token_component_installer.h b/chrome/browser/component_updater/probabilistic_reveal_token_component_installer.h
new file mode 100644
index 0000000..75325f0
--- /dev/null
+++ b/chrome/browser/component_updater/probabilistic_reveal_token_component_installer.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 CHROME_BROWSER_COMPONENT_UPDATER_PROBABILISTIC_REVEAL_TOKEN_COMPONENT_INSTALLER_H_
+#define CHROME_BROWSER_COMPONENT_UPDATER_PROBABILISTIC_REVEAL_TOKEN_COMPONENT_INSTALLER_H_
+
+namespace component_updater {
+
+class ComponentUpdateService;
+
+// Call once during startup to make the component update service aware of
+// the Probabilistic Reveal Token component.
+void RegisterProbabilisticRevealTokenComponent(ComponentUpdateService* cus);
+
+}  // namespace component_updater
+
+#endif  // CHROME_BROWSER_COMPONENT_UPDATER_PROBABILISTIC_REVEAL_TOKEN_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/probabilistic_reveal_token_component_installer_unittest.cc b/chrome/browser/component_updater/probabilistic_reveal_token_component_installer_unittest.cc
new file mode 100644
index 0000000..5a997b2
--- /dev/null
+++ b/chrome/browser/component_updater/probabilistic_reveal_token_component_installer_unittest.cc
@@ -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.
+
+#include "chrome/browser/component_updater/probabilistic_reveal_token_component_installer.h"
+
+#include "base/test/task_environment.h"
+#include "components/component_updater/mock_component_updater_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace component_updater {
+
+class ProbabilisticRevealTokenComponentInstallerTest : public ::testing::Test {
+ public:
+  ProbabilisticRevealTokenComponentInstallerTest() = default;
+
+  void RunUntilIdle() { env_.RunUntilIdle(); }
+
+ protected:
+  base::test::TaskEnvironment env_;
+  MockComponentUpdateService cus_;
+};
+
+TEST_F(ProbabilisticRevealTokenComponentInstallerTest, ComponentRegistration) {
+  EXPECT_CALL(cus_, RegisterComponent(testing::_)).Times(1);
+  RegisterProbabilisticRevealTokenComponent(&cus_);
+  RunUntilIdle();
+}
+
+}  // namespace component_updater
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc
index 0b38c24..ab71f325 100644
--- a/chrome/browser/component_updater/registration.cc
+++ b/chrome/browser/component_updater/registration.cc
@@ -33,6 +33,7 @@
 #include "chrome/browser/component_updater/pki_metadata_component_installer.h"
 #include "chrome/browser/component_updater/pnacl_component_installer.h"
 #include "chrome/browser/component_updater/privacy_sandbox_attestations_component_installer.h"
+#include "chrome/browser/component_updater/probabilistic_reveal_token_component_installer.h"
 #include "chrome/browser/component_updater/ssl_error_assistant_component_installer.h"
 #include "chrome/browser/component_updater/subresource_filter_component_installer.h"
 #include "chrome/browser/component_updater/tpcd_metadata_component_installer.h"
@@ -268,6 +269,8 @@
     RegisterWasmTtsEngineComponent(cus);
   }
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+  RegisterProbabilisticRevealTokenComponent(cus);
 }
 
 }  // namespace component_updater
diff --git a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java
index 494dd101..f7975bec 100644
--- a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java
+++ b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.contextmenu;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.graphics.Bitmap;
 import android.net.Uri;
 
@@ -14,6 +16,8 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.share.ShareImageFileUtils;
 import org.chromium.components.embedder_support.contextmenu.ContextMenuImageFormat;
 import org.chromium.components.embedder_support.contextmenu.ContextMenuNativeDelegate;
@@ -21,6 +25,7 @@
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.WebContents;
 
+@NullMarked
 class ContextMenuNativeDelegateImpl implements ContextMenuNativeDelegate {
     private static final int MAX_SHARE_DIMEN_PX = 2048;
 
@@ -29,9 +34,9 @@
     private long mNativePtr;
 
     /** See function for details. */
-    private static byte[] sHardcodedImageBytesForTesting;
+    private static byte @Nullable [] sHardcodedImageBytesForTesting;
 
-    private static String sHardcodedImageExtensionForTesting;
+    private static @Nullable String sHardcodedImageExtensionForTesting;
 
     /**
      * The tests trigger the context menu via JS rather than via a true native call which means
@@ -134,6 +139,8 @@
     }
 
     private static ImageCallbackResult createImageCallbackResultForTesting() {
+        assumeNonNull(sHardcodedImageBytesForTesting);
+        assumeNonNull(sHardcodedImageExtensionForTesting);
         return new ImageCallbackResult(
                 sHardcodedImageBytesForTesting, sHardcodedImageExtensionForTesting);
     }
diff --git a/chrome/browser/defaults.cc b/chrome/browser/defaults.cc
index 1f490bc..9c70bc11 100644
--- a/chrome/browser/defaults.cc
+++ b/chrome/browser/defaults.cc
@@ -6,41 +6,28 @@
 
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 namespace browser_defaults {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
 const bool kBrowserAliveWithNoWindows = true;
 const bool kShowExitMenuItem = false;
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-// Note: Lacros can get kicked out of memory when the last window closes.
-const bool kBrowserAliveWithNoWindows = false;
-const bool kShowExitMenuItem = false;
 #else
 const bool kBrowserAliveWithNoWindows = false;
 const bool kShowExitMenuItem = true;
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const bool kShowUpgradeMenuItem = false;
 const bool kShowImportOnBookmarkBar = false;
 const bool kAlwaysOpenIncognitoBrowserIfStartedWithIncognitoSwitch = true;
+const bool kAlwaysCreateTabbedBrowserOnSessionRestore = false;
+const bool kShowHelpMenuItemIcon = true;
 #else
 const bool kShowUpgradeMenuItem = true;
 const bool kShowImportOnBookmarkBar = true;
 const bool kAlwaysOpenIncognitoBrowserIfStartedWithIncognitoSwitch = false;
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS)
-const bool kAlwaysCreateTabbedBrowserOnSessionRestore = false;
-#else
 const bool kAlwaysCreateTabbedBrowserOnSessionRestore = true;
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-const bool kShowHelpMenuItemIcon = true;
-#else
 const bool kShowHelpMenuItemIcon = false;
 #endif
 
diff --git a/chrome/browser/device_identity/device_oauth2_token_service.cc b/chrome/browser/device_identity/device_oauth2_token_service.cc
index 26b6552..3862144 100644
--- a/chrome/browser/device_identity/device_oauth2_token_service.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_service.cc
@@ -14,7 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/task/single_thread_task_runner.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/device_identity/device_oauth2_token_store.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "components/prefs/pref_service.h"
@@ -131,7 +131,7 @@
   return token_manager_.get();
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 void DeviceOAuth2TokenService::SetServiceAccountEmail(
     const std::string& account_email) {
   store_->SetAccountEmail(account_email);
diff --git a/chrome/browser/device_identity/device_oauth2_token_service.h b/chrome/browser/device_identity/device_oauth2_token_service.h
index b23b7980a..04dd121 100644
--- a/chrome/browser/device_identity/device_oauth2_token_service.h
+++ b/chrome/browser/device_identity/device_oauth2_token_service.h
@@ -11,7 +11,7 @@
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/device_identity/device_oauth2_token_store.h"
 #include "google_apis/gaia/core_account_id.h"
 #include "google_apis/gaia/gaia_oauth_client.h"
@@ -78,7 +78,7 @@
 
   OAuth2AccessTokenManager* GetAccessTokenManager();
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Used on non-ChromeOS platforms to set the email associated with the
   // current service account. On ChromeOS, this function isn't used because
   // the service account identity comes from CrosSettings.
diff --git a/chrome/browser/device_identity/device_oauth2_token_service_factory.cc b/chrome/browser/device_identity/device_oauth2_token_service_factory.cc
index e2330ef..6d0c676 100644
--- a/chrome/browser/device_identity/device_oauth2_token_service_factory.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_service_factory.cc
@@ -7,12 +7,11 @@
 #include <memory>
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/device_identity/device_oauth2_token_service.h"
 #include "content/public/browser/browser_thread.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos.h"
 #else
 #include "chrome/browser/device_identity/device_oauth2_token_store_desktop.h"
@@ -24,11 +23,10 @@
 
 std::unique_ptr<DeviceOAuth2TokenStore> CreatePlatformTokenStore(
     PrefService* local_state) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<chromeos::DeviceOAuth2TokenStoreChromeOS>(
       local_state);
-#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
-    (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   return std::make_unique<DeviceOAuth2TokenStoreDesktop>(local_state);
 #else
   NOTREACHED();
diff --git a/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc b/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
index ab25c47..811d813f 100644
--- a/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
@@ -60,7 +60,7 @@
     TriggerTrustedAccountIdCallback(true);
   }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   void SetAccountEmail(const std::string& account_email) override {
     account_id_ = CoreAccountId::FromRobotEmail(account_email);
   }
diff --git a/chrome/browser/device_identity/device_oauth2_token_store.h b/chrome/browser/device_identity/device_oauth2_token_store.h
index da3b782..f3168be 100644
--- a/chrome/browser/device_identity/device_oauth2_token_store.h
+++ b/chrome/browser/device_identity/device_oauth2_token_store.h
@@ -9,7 +9,7 @@
 
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "google_apis/gaia/core_account_id.h"
 
 // An interface to be implemented per-platform that represents an
@@ -75,7 +75,7 @@
   // Invokes |callback| when the operation completes.
   virtual void PrepareTrustedAccountId(TrustedAccountIdCallback callback) = 0;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Requests that this store persist the current service account's associated
   // email.
   // On ChromeOS, the account email comes from CrosSettings so this should never
diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn
index 28d663e..160082e 100644
--- a/chrome/browser/devtools/BUILD.gn
+++ b/chrome/browser/devtools/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
 import("//extensions/buildflags/buildflags.gni")
 import("//printing/buildflags/buildflags.gni")
 
@@ -42,7 +41,7 @@
     "protocol/target.h",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     _protocol_generated += [
       "protocol/window_manager.cc",
       "protocol/window_manager.h",
@@ -63,7 +62,7 @@
     outputs = [ output_file ]
 
     args = [ rebase_path(_blink_protocol_path, root_build_dir) ]
-    if (is_chromeos_ash) {
+    if (is_chromeos) {
       inputs += [ "cros_protocol.pdl" ]
       args += [ rebase_path("cros_protocol.pdl", root_build_dir) ]
     }
@@ -144,7 +143,6 @@
       "//chrome/browser/ui/tabs:tab_strip_model_observer",
     ]
     deps += [
-      "//build:chromeos_buildflags",
       "//chrome:extra_resources",
       "//chrome:resources",
       "//chrome:strings",
@@ -193,10 +191,10 @@
       "//ui/views/controls/webview",
     ]
     if (is_chromeos) {
-      deps += [ "//chromeos/constants" ]
-    }
-    if (is_chromeos_ash) {
-      deps += [ "//ash/constants" ]
+      deps += [
+        "//ash/constants",
+        "//chromeos/constants",
+      ]
     }
     sources += [
       "aida_client.cc",
@@ -328,7 +326,7 @@
       "protocol/target_handler.cc",
       "protocol/target_handler.h",
     ]
-    if (is_chromeos_ash) {
+    if (is_chromeos) {
       deps += [ "//ash" ]
       sources += [
         "protocol/window_manager_handler.cc",
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index c27eaca2..692e883a 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -14,7 +14,6 @@
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_features.h"
 #include "chrome/browser/devtools/chrome_devtools_session.h"
 #include "chrome/browser/devtools/device/android_device_manager.h"
@@ -61,15 +60,12 @@
 #include "ui/views/controls/webview/webview.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
+#include "ash/constants/ash_switches.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/pref_names.h"
 #include "components/prefs/pref_service.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_switches.h"
-#endif
-
 using content::DevToolsAgentHost;
 
 const char ChromeDevToolsManagerDelegate::kTypeApp[] = "app";
@@ -215,7 +211,7 @@
           profile, ProfileKeepAliveOrigin::kRemoteDebugging);
     }
   }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 }
 
 ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
diff --git a/chrome/browser/devtools/chrome_devtools_session.cc b/chrome/browser/devtools/chrome_devtools_session.cc
index 17d7ac9..41a7a928 100644
--- a/chrome/browser/devtools/chrome_devtools_session.cc
+++ b/chrome/browser/devtools/chrome_devtools_session.cc
@@ -12,7 +12,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/metrics_hashes.h"
 #include "base/strings/string_number_conversions.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/browser_features.h"
 #include "chrome/browser/devtools/protocol/autofill_handler.h"
 #include "chrome/browser/devtools/protocol/browser_handler.h"
@@ -32,7 +32,7 @@
 #include "content/public/browser/devtools_manager_delegate.h"
 #include "third_party/inspector_protocol/crdtp/dispatch.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/devtools/protocol/window_manager_handler.h"
 #endif
 
@@ -121,7 +121,7 @@
           std::make_unique<PWAHandler>(&dispatcher_, agent_host->GetId());
     }
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   window_manager_handler_ =
       std::make_unique<WindowManagerHandler>(&dispatcher_);
 #endif
diff --git a/chrome/browser/devtools/chrome_devtools_session.h b/chrome/browser/devtools/chrome_devtools_session.h
index 8bae180..3055c80 100644
--- a/chrome/browser/devtools/chrome_devtools_session.h
+++ b/chrome/browser/devtools/chrome_devtools_session.h
@@ -10,7 +10,7 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
 #include "base/memory/raw_ptr.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/devtools/protocol/extensions_handler.h"
 #include "chrome/browser/devtools/protocol/protocol.h"
 #include "chrome/browser/devtools/protocol/storage_handler.h"
@@ -75,7 +75,7 @@
   std::unique_ptr<StorageHandler> storage_handler_;
   std::unique_ptr<SystemInfoHandler> system_info_handler_;
   std::unique_ptr<TargetHandler> target_handler_;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::unique_ptr<WindowManagerHandler> window_manager_handler_;
 #endif
   raw_ptr<content::DevToolsAgentHostClientChannel> client_channel_;
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc
index ddde59ea..c8e9ce0 100644
--- a/chrome/browser/devtools/devtools_browsertest.cc
+++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -34,7 +34,6 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_features.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/devtools/device/tcp_device_provider.h"
@@ -2348,7 +2347,7 @@
 
 // Disabled. Failing on MacOS MSAN. See https://crbug.com/849129.
 // Also failing on Linux. See https://crbug.com/1187693.
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #define MAYBE_TestDispatchKeyEventShowsAutoFill \
   DISABLED_TestDispatchKeyEventShowsAutoFill
 #else
@@ -2663,7 +2662,7 @@
 };
 
 // Fails on CrOS. crbug.com/431399
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_RemoteDebugger DISABLED_RemoteDebugger
 #else
 // TODO(crbug.com/41478279): Flaky on all platforms.
diff --git a/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc b/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
index 9a3427d..de54cc3b 100644
--- a/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
+++ b/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
@@ -424,6 +424,8 @@
                      &Delegate::RecordEnumeratedHistogram, delegate);
   d->RegisterHandler("recordPerformanceHistogram",
                      &Delegate::RecordPerformanceHistogram, delegate);
+  d->RegisterHandler("recordPerformanceHistogramMedium",
+                     &Delegate::RecordPerformanceHistogramMedium, delegate);
   d->RegisterHandler("recordUserMetricsAction",
                      &Delegate::RecordUserMetricsAction, delegate);
   d->RegisterHandler("recordImpression", &Delegate::RecordImpression, delegate);
diff --git a/chrome/browser/devtools/devtools_embedder_message_dispatcher.h b/chrome/browser/devtools/devtools_embedder_message_dispatcher.h
index 369cbaf..4502105 100644
--- a/chrome/browser/devtools/devtools_embedder_message_dispatcher.h
+++ b/chrome/browser/devtools/devtools_embedder_message_dispatcher.h
@@ -115,6 +115,8 @@
                                            int boundary_value) = 0;
     virtual void RecordPerformanceHistogram(const std::string& name,
                                             double duration) = 0;
+    virtual void RecordPerformanceHistogramMedium(const std::string& name,
+                                                  double duration) = 0;
     virtual void RecordUserMetricsAction(const std::string& name) = 0;
     virtual void RecordImpression(const ImpressionEvent& event) = 0;
     virtual void RecordResize(const ResizeEvent& event) = 0;
diff --git a/chrome/browser/devtools/devtools_eye_dropper.cc b/chrome/browser/devtools/devtools_eye_dropper.cc
index 48b7b571..70d54e0 100644
--- a/chrome/browser/devtools/devtools_eye_dropper.cc
+++ b/chrome/browser/devtools/devtools_eye_dropper.cc
@@ -183,7 +183,7 @@
   // on the platform. Linux, Mac and Win have large cursors with two circles for
   // original spot and its magnified projection; Ash gets smaller (64 px)
   // magnified projection only with centered hotspot.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const float kCursorSize = 63;
   const float kDiameter = 63;
   const float kHotspotOffset = 32;
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index 8f2796c..eb1e9a5 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -1900,6 +1900,21 @@
   base::UmaHistogramTimes(name, delta);
 }
 
+void DevToolsUIBindings::RecordPerformanceHistogramMedium(
+    const std::string& name,
+    double duration) {
+  if (!frontend_host_) {
+    return;
+  }
+  if (duration < 0) {
+    return;
+  }
+  // Use histogram_functions.h instead of macros as the name comes from the
+  // DevTools frontend javascript and so will always have the same call site.
+  base::TimeDelta delta = base::Milliseconds(duration);
+  base::UmaHistogramMediumTimes(name, delta);
+}
+
 void DevToolsUIBindings::RecordUserMetricsAction(const std::string& name) {
   if (!frontend_host_) {
     return;
diff --git a/chrome/browser/devtools/devtools_ui_bindings.h b/chrome/browser/devtools/devtools_ui_bindings.h
index 77721d0..14de75e 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.h
+++ b/chrome/browser/devtools/devtools_ui_bindings.h
@@ -198,6 +198,8 @@
                                  int boundary_value) override;
   void RecordPerformanceHistogram(const std::string& name,
                                   double duration) override;
+  void RecordPerformanceHistogramMedium(const std::string& name,
+                                        double duration) override;
   void RecordUserMetricsAction(const std::string& name) override;
   void RecordImpression(const ImpressionEvent& event) override;
   void RecordResize(const ResizeEvent& event) override;
diff --git a/chrome/browser/devtools/process_sharing_infobar_delegate.cc b/chrome/browser/devtools/process_sharing_infobar_delegate.cc
index 45cd6e2b..d7d2682 100644
--- a/chrome/browser/devtools/process_sharing_infobar_delegate.cc
+++ b/chrome/browser/devtools/process_sharing_infobar_delegate.cc
@@ -94,7 +94,7 @@
       views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH));
   delegate->SetAcceptCallback(base::BindOnce(
       [](base::WeakPtr<content::WebContents> inspected_web_contents) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
         PrefService* prefs = Profile::FromBrowserContext(
                                  inspected_web_contents->GetBrowserContext())
                                  ->GetPrefs();
diff --git a/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc b/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
index 181e642e..1229f49 100644
--- a/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
@@ -6,7 +6,6 @@
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/autofill/autofill_uitest_util.h"
 #include "chrome/browser/devtools/protocol/devtools_protocol_test_support.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/download/download_prefs.cc b/chrome/browser/download/download_prefs.cc
index fce8d67..86e7eb9e 100644
--- a/chrome/browser/download/download_prefs.cc
+++ b/chrome/browser/download/download_prefs.cc
@@ -267,11 +267,12 @@
     // automatically can change in the future. When the list is tightened, it is
     // expected that some entries in the users' auto open list will get dropped
     // permanently as a result.
-    if (FileTypePolicies::GetInstance()->IsAllowedToOpenAutomatically(
+    if (!FileTypePolicies::GetInstance()->IsAllowedToOpenAutomatically(
             filename_with_extension)) {
-      auto_open_by_user_.insert(extension);
+      continue;
     }
 #endif
+    auto_open_by_user_.insert(extension);
   }
 }
 
diff --git a/chrome/browser/error_reporting/BUILD.gn b/chrome/browser/error_reporting/BUILD.gn
index fb11553..6eb7a36e 100644
--- a/chrome/browser/error_reporting/BUILD.gn
+++ b/chrome/browser/error_reporting/BUILD.gn
@@ -1,7 +1,6 @@
 # Copyright 2020 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
-import("//build/config/chromeos/ui_mode.gni")
 
 # TODO(crbug.com/40188745): fuchsia cannot use components/crash.
 assert(!is_android && !is_fuchsia)
@@ -11,7 +10,6 @@
     "constants.cc",
     "constants.h",
   ]
-  deps = [ "//build:chromeos_buildflags" ]
 }
 
 static_library("error_reporting") {
@@ -22,7 +20,6 @@
   deps = [
     "//base",
     "//build:branding_buildflags",
-    "//build:chromeos_buildflags",
     "//chrome/common:constants",
     "//components/crash/content/browser/error_reporting",
     "//components/crash/core/app",
@@ -53,7 +50,6 @@
     ":error_reporting",
     "//base",
     "//base/test:test_support",
-    "//build:chromeos_buildflags",
     "//chrome/common:constants",
     "//components/crash/content/browser/error_reporting",
     "//components/variations",
diff --git a/chrome/browser/error_reporting/chrome_js_error_report_processor.cc b/chrome/browser/error_reporting/chrome_js_error_report_processor.cc
index 4ab9db0..ceae341 100644
--- a/chrome/browser/error_reporting/chrome_js_error_report_processor.cc
+++ b/chrome/browser/error_reporting/chrome_js_error_report_processor.cc
@@ -23,7 +23,6 @@
 #include "base/time/default_clock.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/crash/content/browser/error_reporting/javascript_error_report.h"
 #include "components/crash/core/app/client_upload_info.h"
 #include "components/crash/core/app/crashpad.h"
@@ -37,10 +36,6 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/build_time.h"
-#endif
-
 namespace {
 
 constexpr char kNoBrowserNoWindow[] = "NO_BROWSER";
diff --git a/chrome/browser/error_reporting/chrome_js_error_report_processor_unittest.cc b/chrome/browser/error_reporting/chrome_js_error_report_processor_unittest.cc
index cfeffd7..6d2500b 100644
--- a/chrome/browser/error_reporting/chrome_js_error_report_processor_unittest.cc
+++ b/chrome/browser/error_reporting/chrome_js_error_report_processor_unittest.cc
@@ -16,7 +16,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/simple_test_clock.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/crash_upload_list/crash_upload_list.h"
 #include "chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h"
 #include "chrome/common/chrome_paths.h"
diff --git a/chrome/browser/error_reporting/crash_client_upload_info_browsertest.cc b/chrome/browser/error_reporting/crash_client_upload_info_browsertest.cc
index 2b64f0e..561bd7f6 100644
--- a/chrome/browser/error_reporting/crash_client_upload_info_browsertest.cc
+++ b/chrome/browser/error_reporting/crash_client_upload_info_browsertest.cc
@@ -33,7 +33,7 @@
 
 // Tests that product name returned by GetClientProductInfo() is correct.
 IN_PROC_BROWSER_TEST_F(CrashClientUploadInfoTest, GetClientProductInfo) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   constexpr char kProductName[] = "Chrome_ChromeOS";
 #elif BUILDFLAG(IS_LINUX)
 #if defined(ADDRESS_SANITIZER)
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 9cd27d46..e1f01bb 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -76,6 +76,8 @@
     "forced_extensions/install_stage_tracker.h",
     "forced_extensions/install_stage_tracker_factory.cc",
     "forced_extensions/install_stage_tracker_factory.h",
+    "install_approval.cc",
+    "install_approval.h",
     "install_observer.cc",
     "install_observer.h",
     "install_tracker.cc",
@@ -84,6 +86,7 @@
     "install_tracker_factory.h",
     "load_error_reporter.cc",
     "load_error_reporter.h",
+    "manifest_check_level.h",
     "permissions_url_constants.cc",
     "permissions_url_constants.h",
     "policy_handlers.cc",
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 be1152b..d559d11 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
@@ -120,20 +120,6 @@
 class EnterpriseReportingPrivateApiTest : public extensions::ExtensionApiTest {
  public:
   EnterpriseReportingPrivateApiTest() {
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-    scoped_features_.InitWithFeatures(
-        /*enabled_features=*/
-        {
-            extensions_features::
-                kApiEnterpriseReportingPrivateReportDataMaskingEvent,
-        },
-        /*disabled_features=*/{});
-#else
-    scoped_features_.InitAndEnableFeature(
-        extensions_features::
-            kApiEnterpriseReportingPrivateReportDataMaskingEvent);
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-
 #if !BUILDFLAG(IS_CHROMEOS)
     browser_dm_token_storage_.SetClientId("client_id");
     browser_dm_token_storage_.SetEnrollmentToken("enrollment_token");
@@ -259,8 +245,6 @@
 
   base::CallbackListSubscription create_services_subscription_;
 
-  base::test::ScopedFeatureList scoped_features_;
-
 #if !BUILDFLAG(IS_CHROMEOS)
   policy::FakeBrowserDMTokenStorage browser_dm_token_storage_;
 #endif
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index ba215c9..aeb90a5 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -32,6 +32,7 @@
 #include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/extension_allowlist.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/manifest_v2_experiment_manager.h"
 #include "chrome/browser/extensions/mv2_experiment_stage.h"
@@ -107,10 +108,9 @@
 
   ~PendingApprovals() override = default;
 
-  void PushApproval(std::unique_ptr<WebstoreInstaller::Approval> approval);
-  std::unique_ptr<WebstoreInstaller::Approval> PopApproval(
-      Profile* profile,
-      const std::string& id);
+  void PushApproval(std::unique_ptr<InstallApproval> approval);
+  std::unique_ptr<InstallApproval> PopApproval(Profile* profile,
+                                               const std::string& id);
   void Clear();
 
   int GetCount() const { return approvals_.size(); }
@@ -142,27 +142,25 @@
     observation_.RemoveObservation(profile);
   }
 
-  using ApprovalList =
-      std::vector<std::unique_ptr<WebstoreInstaller::Approval>>;
+  using ApprovalList = std::vector<std::unique_ptr<InstallApproval>>;
 
   ApprovalList approvals_;
   base::ScopedMultiSourceObservation<Profile, ProfileObserver> observation_{
       this};
 };
 
-void PendingApprovals::PushApproval(
-    std::unique_ptr<WebstoreInstaller::Approval> approval) {
+void PendingApprovals::PushApproval(std::unique_ptr<InstallApproval> approval) {
   MaybeAddObservation(approval->profile);
   approvals_.push_back(std::move(approval));
 }
 
-std::unique_ptr<WebstoreInstaller::Approval> PendingApprovals::PopApproval(
+std::unique_ptr<InstallApproval> PendingApprovals::PopApproval(
     Profile* profile,
     const std::string& id) {
   for (auto iter = approvals_.begin(); iter != approvals_.end(); ++iter) {
     if (iter->get()->extension_id == id &&
         profile->IsSameOrParent(iter->get()->profile)) {
-      std::unique_ptr<WebstoreInstaller::Approval> approval = std::move(*iter);
+      std::unique_ptr<InstallApproval> approval = std::move(*iter);
       approvals_.erase(iter);
       MaybeRemoveObservation(approval->profile);
       return approval;
@@ -395,9 +393,9 @@
 }
 
 // static
-std::unique_ptr<WebstoreInstaller::Approval>
-WebstorePrivateApi::PopApprovalForTesting(Profile* profile,
-                                          const std::string& extension_id) {
+std::unique_ptr<InstallApproval> WebstorePrivateApi::PopApprovalForTesting(
+    Profile* profile,
+    const std::string& extension_id) {
   return g_pending_approvals.Get().PopApproval(profile, extension_id);
 }
 
@@ -799,8 +797,8 @@
   // the future we may also want to add time-based expiration, where an
   // allowlist entry is only valid for some number of minutes.
   DCHECK(parsed_manifest_);
-  std::unique_ptr<WebstoreInstaller::Approval> approval(
-      WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
+  std::unique_ptr<InstallApproval> approval(
+      InstallApproval::CreateWithNoInstallPrompt(
           profile_, details().id, std::move(*parsed_manifest_), false));
   approval->use_app_installed_bubble = !!details().app_install_bubble;
   // If we are enabling the launcher, we should not show the app list in order
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.h b/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
index 187f5ed..52f7f3a 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
@@ -36,6 +36,7 @@
 namespace extensions {
 
 class Extension;
+struct InstallApproval;
 class ScopedActiveInstall;
 
 class WebstorePrivateApi {
@@ -56,7 +57,7 @@
   // Gets the pending approval for the |extension_id| in |profile|. Pending
   // approvals are held between the calls to beginInstallWithManifest and
   // completeInstall. This should only be used for testing.
-  static std::unique_ptr<WebstoreInstaller::Approval> PopApprovalForTesting(
+  static std::unique_ptr<InstallApproval> PopApprovalForTesting(
       Profile* profile,
       const std::string& extension_id);
 
@@ -192,7 +193,7 @@
 
   void OnInstallSuccess(const std::string& id);
 
-  std::unique_ptr<WebstoreInstaller::Approval> approval_;
+  std::unique_ptr<InstallApproval> approval_;
   std::unique_ptr<ScopedActiveInstall> scoped_active_install_;
   base::WeakPtrFactory<WebstorePrivateCompleteInstallFunction>
       weak_ptr_factory_{this};
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index 77d70ff..cf71f36 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h"
 #include "chrome/browser/extensions/extension_install_prompt.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/mixin_based_extension_apitest.h"
 #include "chrome/browser/extensions/webstore_installer.h"
 #include "chrome/browser/profiles/profile.h"
@@ -271,7 +272,7 @@
   std::string appId = "iladmdjkfniedhfhcfoefgojhgaiaccc";
   ASSERT_TRUE(RunInstallTest("begin_install.html", "extension.crx"));
 
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
+  std::unique_ptr<InstallApproval> approval =
       WebstorePrivateApi::PopApprovalForTesting(browser()->profile(), appId);
   EXPECT_EQ(appId, approval->extension_id);
   EXPECT_TRUE(approval->use_app_installed_bubble);
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
index f54688a..43021f8b 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/extensions/extension_api_unittest.h"
 #include "chrome/browser/extensions/extension_install_prompt_show_params.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/mv2_experiment_stage.h"
 #include "chrome/browser/extensions/test_extension_system.h"
 #include "chrome/browser/profiles/profile.h"
@@ -783,7 +784,7 @@
   EXPECT_EQ(test_case.expected_friction_shown,
             function->GetFrictionDialogShownForTesting());
 
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
+  std::unique_ptr<InstallApproval> approval =
       WebstorePrivateApi::PopApprovalForTesting(profile(), kExtensionId);
   if (test_case.dialog_action == ScopedTestDialogAutoConfirm::ACCEPT) {
     ASSERT_TRUE(approval);
diff --git a/chrome/browser/extensions/chrome_test_extension_loader.cc b/chrome/browser/extensions/chrome_test_extension_loader.cc
index d036bb0d..081cf23 100644
--- a/chrome/browser/extensions/chrome_test_extension_loader.cc
+++ b/chrome/browser/extensions/chrome_test_extension_loader.cc
@@ -30,6 +30,7 @@
 #include "extensions/common/manifest_handlers/background_info.h"
 #include "extensions/common/manifest_handlers/content_scripts_handler.h"
 #include "extensions/common/manifest_handlers/incognito_info.h"
+#include "extensions/common/manifest_handlers/shared_module_info.h"
 #include "extensions/common/mojom/host_id.mojom.h"
 #include "extensions/test/extension_background_page_waiter.h"
 #include "extensions/test/test_content_script_load_waiter.h"
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index 3af419d..44c07cc87 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -28,11 +28,11 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/forced_extensions/install_stage_tracker.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/install_tracker_factory.h"
 #include "chrome/browser/extensions/load_error_reporter.h"
 #include "chrome/browser/extensions/permissions/permissions_updater.h"
-#include "chrome/browser/extensions/webstore_installer.h"
 #include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h"
 #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
 #include "chrome/browser/profiles/profile.h"
@@ -100,20 +100,18 @@
 scoped_refptr<CrxInstaller> CrxInstaller::Create(
     ExtensionService* service,
     std::unique_ptr<ExtensionInstallPrompt> client,
-    const WebstoreInstaller::Approval* approval) {
+    const InstallApproval* approval) {
   return new CrxInstaller(service->AsExtensionServiceWeakPtr(),
                           std::move(client), approval);
 }
 
 CrxInstaller::CrxInstaller(base::WeakPtr<ExtensionService> service_weak,
                            std::unique_ptr<ExtensionInstallPrompt> client,
-                           const WebstoreInstaller::Approval* approval)
+                           const InstallApproval* approval)
     : profile_(service_weak->profile()),
       install_directory_(service_weak->install_directory()),
       install_source_(mojom::ManifestLocation::kInternal),
       approved_(false),
-      expected_manifest_check_level_(
-          WebstoreInstaller::MANIFEST_CHECK_LEVEL_STRICT),
       fail_install_if_unexpected_version_(false),
       extensions_enabled_(service_weak->extensions_enabled()),
       delete_source_(false),
@@ -148,8 +146,7 @@
     // so we can check that they match the CRX's.
     approved_ = true;
     expected_manifest_check_level_ = approval->manifest_check_level;
-    if (expected_manifest_check_level_ !=
-        WebstoreInstaller::MANIFEST_CHECK_LEVEL_NONE) {
+    if (expected_manifest_check_level_ != ManifestCheckLevel::kNone) {
       expected_manifest_ = std::make_unique<base::Value::Dict>(
           approval->manifest->value()->Clone());
     }
@@ -347,8 +344,7 @@
   // Make sure the manifests match if we want to bypass the prompt.
   if (approved_) {
     bool valid = false;
-    if (expected_manifest_check_level_ ==
-        WebstoreInstaller::MANIFEST_CHECK_LEVEL_NONE) {
+    if (expected_manifest_check_level_ == ManifestCheckLevel::kNone) {
       // To skip manifest checking, the extension must be a shared module
       // and not request any permissions.
       if (SharedModuleInfo::IsSharedModule(extension) &&
@@ -357,8 +353,8 @@
       }
     } else {
       valid = *expected_manifest_ == *original_manifest_;
-      if (!valid && expected_manifest_check_level_ ==
-          WebstoreInstaller::MANIFEST_CHECK_LEVEL_LOOSE) {
+      if (!valid &&
+          expected_manifest_check_level_ == ManifestCheckLevel::kLoose) {
         std::string error;
         scoped_refptr<Extension> dummy_extension = Extension::Create(
             base::FilePath(), install_source_, *expected_manifest_,
diff --git a/chrome/browser/extensions/crx_installer.h b/chrome/browser/extensions/crx_installer.h
index e35c0db..f51bddf 100644
--- a/chrome/browser/extensions/crx_installer.h
+++ b/chrome/browser/extensions/crx_installer.h
@@ -20,7 +20,7 @@
 #include "base/version.h"
 #include "chrome/browser/extensions/extension_install_prompt.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/webstore_installer.h"
+#include "chrome/browser/extensions/manifest_check_level.h"
 #include "chrome/browser/profiles/profile_observer.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "components/sync/model/string_ordinal.h"
@@ -44,6 +44,7 @@
 class CrxInstallError;
 class ExtensionService;
 class ExtensionUpdaterTest;
+struct InstallApproval;
 enum class InstallationStage;
 class MockCrxInstaller;
 class PreloadCheckGroup;
@@ -114,7 +115,7 @@
   static scoped_refptr<CrxInstaller> Create(
       ExtensionService* service,
       std::unique_ptr<ExtensionInstallPrompt> client,
-      const WebstoreInstaller::Approval* approval);
+      const InstallApproval* approval);
 
   // Install the crx in |source_file|. The file must be a CRX3. A publisher
   // proof in the file is required unless off-webstore installation is allowed.
@@ -275,7 +276,7 @@
 
   CrxInstaller(base::WeakPtr<ExtensionService> service_weak,
                std::unique_ptr<ExtensionInstallPrompt> client,
-               const WebstoreInstaller::Approval* approval);
+               const InstallApproval* approval);
   ~CrxInstaller() override;
 
   // Converts the source user script to an extension.
@@ -426,7 +427,8 @@
 
   // The level of checking when comparing the actual manifest against
   // the |expected_manifest_|.
-  WebstoreInstaller::ManifestCheckLevel expected_manifest_check_level_;
+  ManifestCheckLevel expected_manifest_check_level_ =
+      ManifestCheckLevel::kStrict;
 
   // If valid, specifies the minimum version we'll install. Installation will
   // fail if the actual version is smaller.
diff --git a/chrome/browser/extensions/crx_installer_browsertest.cc b/chrome/browser/extensions/crx_installer_browsertest.cc
index baa8cca..12b1ab62 100644
--- a/chrome/browser/extensions/crx_installer_browsertest.cc
+++ b/chrome/browser/extensions/crx_installer_browsertest.cc
@@ -39,6 +39,7 @@
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
 #include "chrome/browser/extensions/forced_extensions/install_stage_tracker.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/permissions/scripting_permissions_modifier.h"
 #include "chrome/browser/extensions/scoped_database_manager_for_test.h"
 #include "chrome/browser/profiles/profile.h"
@@ -204,11 +205,11 @@
 
 class ExtensionCrxInstallerTest : public ExtensionBrowserTest {
  protected:
-  std::unique_ptr<WebstoreInstaller::Approval> GetApproval(
+  std::unique_ptr<InstallApproval> GetApproval(
       const char* manifest_dir,
       const extensions::ExtensionId& id,
       bool strict_manifest_checks) {
-    std::unique_ptr<WebstoreInstaller::Approval> result;
+    std::unique_ptr<InstallApproval> result;
 
     base::ScopedAllowBlockingForTesting allow_io;
     base::FilePath ext_path = test_data_dir_.AppendASCII(manifest_dir);
@@ -219,7 +220,7 @@
       return result;
     }
 
-    return WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
+    return InstallApproval::CreateWithNoInstallPrompt(
         browser()->profile(), id, std::move(*parsed_manifest),
         strict_manifest_checks);
   }
@@ -290,7 +291,7 @@
     std::move(quit_closure).Run();
   }
 
-  void RunCrxInstaller(const WebstoreInstaller::Approval* approval,
+  void RunCrxInstaller(const InstallApproval* approval,
                        std::unique_ptr<ExtensionInstallPrompt> prompt,
                        CrxInstaller::InstallerResultCallback callback,
                        const base::FilePath& crx_path) {
@@ -356,7 +357,7 @@
                          MockPromptProxy* mock_install_prompt) {
     base::FilePath ext_path = test_data_dir_.AppendASCII(ext_relpath);
 
-    std::unique_ptr<WebstoreInstaller::Approval> approval;
+    std::unique_ptr<InstallApproval> approval;
     if (!id.empty()) {
       approval = GetApproval(ext_relpath, id, true);
     }
@@ -692,7 +693,7 @@
   // the newly published version hasn't fully propagated to all the download
   // servers yet. So load the v2 manifest, but then install the v1 crx file.
   extensions::ExtensionId id = "ooklpoaelmiimcjipecogjfcejghbogp";
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
+  std::unique_ptr<InstallApproval> approval =
       GetApproval("crx_installer/v2_no_permission_change/", id, false);
 
   RunCrxInstaller(approval.get(), mock_prompt->CreatePrompt(),
@@ -712,7 +713,7 @@
   // the newly published version hasn't fully propagated to all the download
   // servers yet. So load the v2 manifest, but then install the v1 crx file.
   const extensions::ExtensionId id = "ooklpoaelmiimcjipecogjfcejghbogp";
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
+  std::unique_ptr<InstallApproval> approval =
       GetApproval("crx_installer/v2_no_permission_change/", id, false);
 
   RunCrxInstaller(
diff --git a/chrome/browser/extensions/install_approval.cc b/chrome/browser/extensions/install_approval.cc
new file mode 100644
index 0000000..ebde96d
--- /dev/null
+++ b/chrome/browser/extensions/install_approval.cc
@@ -0,0 +1,59 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/install_approval.h"
+
+#include <memory>
+
+#include "base/version.h"
+#include "chrome/browser/extensions/manifest_check_level.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest.h"
+#include "extensions/common/mojom/manifest.mojom-shared.h"
+
+namespace extensions {
+
+InstallApproval::InstallApproval() = default;
+
+std::unique_ptr<InstallApproval> InstallApproval::CreateWithInstallPrompt(
+    Profile* profile) {
+  // Use `new` due to private constructor.
+  std::unique_ptr<InstallApproval> result(new InstallApproval());
+  result->profile = profile;
+  return result;
+}
+
+std::unique_ptr<InstallApproval> InstallApproval::CreateForSharedModule(
+    Profile* profile) {
+  // Use `new` due to private constructor.
+  std::unique_ptr<InstallApproval> result(new InstallApproval());
+  result->profile = profile;
+  result->skip_install_dialog = true;
+  result->skip_post_install_ui = true;
+  result->manifest_check_level = ManifestCheckLevel::kNone;
+  return result;
+}
+
+std::unique_ptr<InstallApproval> InstallApproval::CreateWithNoInstallPrompt(
+    Profile* profile,
+    const ExtensionId& extension_id,
+    base::Value::Dict parsed_manifest,
+    bool strict_manifest_check) {
+  // Use `new` due to private constructor.
+  std::unique_ptr<InstallApproval> result(new InstallApproval());
+  result->extension_id = extension_id;
+  result->profile = profile;
+  result->manifest =
+      std::make_unique<Manifest>(mojom::ManifestLocation::kInvalidLocation,
+                                 std::move(parsed_manifest), extension_id);
+  result->skip_install_dialog = true;
+  result->manifest_check_level = strict_manifest_check
+                                     ? ManifestCheckLevel::kStrict
+                                     : ManifestCheckLevel::kLoose;
+  return result;
+}
+
+InstallApproval::~InstallApproval() = default;
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/install_approval.h b/chrome/browser/extensions/install_approval.h
new file mode 100644
index 0000000..9030b06
--- /dev/null
+++ b/chrome/browser/extensions/install_approval.h
@@ -0,0 +1,113 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_INSTALL_APPROVAL_H_
+#define CHROME_BROWSER_EXTENSIONS_INSTALL_APPROVAL_H_
+
+#include <memory>
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/supports_user_data.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_install_prompt.h"
+#include "chrome/browser/extensions/manifest_check_level.h"
+#include "extensions/common/extension_id.h"
+#include "ui/gfx/image/image_skia.h"
+
+class Profile;
+
+namespace base {
+class Version;
+}
+
+namespace extensions {
+
+class Manifest;
+
+// Contains information about what parts of the extension install process can be
+// skipped or modified. Captures the information about the extension install
+// that the user approved, so that we can compare that information against the
+// extension downloaded in case there was a gap in time between when the install
+// was approved and the CRX was downloaded.
+struct InstallApproval : public base::SupportsUserData::Data {
+  static std::unique_ptr<InstallApproval> CreateWithInstallPrompt(
+      Profile* profile);
+
+  // Creates an InstallApproval for installing a shared module.
+  static std::unique_ptr<InstallApproval> CreateForSharedModule(
+      Profile* profile);
+
+  // Creates an InstallApproval that will skip putting up an install
+  // confirmation prompt if the actual manifest from the extension to be
+  // installed matches `parsed_manifest`. The `strict_manifest_check` controls
+  // whether we want to require an exact manifest match, or are willing to
+  // tolerate a looser check just that the effective permissions are the same.
+  static std::unique_ptr<InstallApproval> CreateWithNoInstallPrompt(
+      Profile* profile,
+      const ExtensionId& extension_id,
+      base::Value::Dict parsed_manifest,
+      bool strict_manifest_check);
+
+  ~InstallApproval() override;
+
+  // The extension id that was approved for installation.
+  ExtensionId extension_id;
+
+  // The profile the extension should be installed into.
+  raw_ptr<Profile> profile = nullptr;
+
+  // The expected manifest, before localization.
+  std::unique_ptr<Manifest> manifest;
+
+  // Whether to use a bubble notification when an app is installed, instead of
+  // the default behavior of transitioning to the new tab page.
+  bool use_app_installed_bubble = false;
+
+  // Whether to skip the post install UI like the extension installed bubble.
+  bool skip_post_install_ui = false;
+
+  // Whether to skip the install dialog once the extension has been downloaded
+  // and unpacked. One reason this can be true is that in the normal webstore
+  // installation, the dialog is shown earlier, before any download is done,
+  // so there's no need to show it again.
+  bool skip_install_dialog = false;
+
+  // Manifest check level for checking actual manifest against expected
+  // manifest.
+  ManifestCheckLevel manifest_check_level = ManifestCheckLevel::kStrict;
+
+  // Used to show the install dialog.
+  ExtensionInstallPrompt::ShowDialogCallback show_dialog_callback;
+
+  // The icon to use to display the extension while it is installing.
+  gfx::ImageSkia installing_icon;
+
+  // A dummy extension created from `manifest`;
+  scoped_refptr<Extension> dummy_extension;
+
+  // Required minimum version.
+  std::unique_ptr<base::Version> minimum_version;
+
+  // The authuser index required to download the item being installed. May be
+  // the empty string, in which case no authuser parameter is used.
+  std::string authuser;
+
+  // Whether the user clicked through the install friction dialog when the
+  // extension is not included in the Enhanced Safe Browsing CRX allowlist and
+  // the user has enabled Enhanced Protection.
+  bool bypassed_safebrowsing_friction = false;
+
+  // Whether to withhold permissions at installation. By default, permissions
+  // are granted at installation.
+  bool withhold_permissions = false;
+
+ private:
+  InstallApproval();
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_INSTALL_APPROVAL_H_
diff --git a/chrome/browser/extensions/manifest_check_level.h b/chrome/browser/extensions/manifest_check_level.h
new file mode 100644
index 0000000..debaa88
--- /dev/null
+++ b/chrome/browser/extensions/manifest_check_level.h
@@ -0,0 +1,25 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_MANIFEST_CHECK_LEVEL_H_
+#define CHROME_BROWSER_EXTENSIONS_MANIFEST_CHECK_LEVEL_H_
+
+namespace extensions {
+
+// The amount of manifest checking to perform.
+enum class ManifestCheckLevel {
+  // Do not check for any manifest equality.
+  kNone,
+
+  // Only check that the expected and actual permissions have the same
+  // effective permissions.
+  kLoose,
+
+  // All data in the expected and actual manifests must match.
+  kStrict,
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_MANIFEST_CHECK_LEVEL_H_
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc
index 718fe99..a9dde3b 100644
--- a/chrome/browser/extensions/webstore_installer.cc
+++ b/chrome/browser/extensions/webstore_installer.cc
@@ -32,9 +32,11 @@
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/download/download_stats.h"
 #include "chrome/browser/extensions/crx_installer.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/install_tracker_factory.h"
 #include "chrome/browser/extensions/install_verifier.h"
+#include "chrome/browser/extensions/manifest_check_level.h"
 #include "chrome/browser/extensions/shared_module_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_paths.h"
@@ -72,7 +74,7 @@
 
 namespace {
 
-// Key used to attach the Approval to the DownloadItem.
+// Key used to attach the InstallApproval to the DownloadItem.
 const char kApprovalKey[] = "extensions.webstore_installer";
 
 const char kInvalidIdError[] = "Invalid id";
@@ -211,48 +213,11 @@
   return url;
 }
 
-WebstoreInstaller::Approval::Approval() = default;
-
-std::unique_ptr<WebstoreInstaller::Approval>
-WebstoreInstaller::Approval::CreateWithInstallPrompt(Profile* profile) {
-  std::unique_ptr<Approval> result(new Approval());
-  result->profile = profile;
-  return result;
-}
-
-std::unique_ptr<WebstoreInstaller::Approval>
-WebstoreInstaller::Approval::CreateForSharedModule(Profile* profile) {
-  std::unique_ptr<Approval> result(new Approval());
-  result->profile = profile;
-  result->skip_install_dialog = true;
-  result->skip_post_install_ui = true;
-  result->manifest_check_level = MANIFEST_CHECK_LEVEL_NONE;
-  return result;
-}
-
-std::unique_ptr<WebstoreInstaller::Approval>
-WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
-    Profile* profile,
-    const extensions::ExtensionId& extension_id,
-    base::Value::Dict parsed_manifest,
-    bool strict_manifest_check) {
-  std::unique_ptr<Approval> result(new Approval());
-  result->extension_id = extension_id;
-  result->profile = profile;
-  result->manifest =
-      std::make_unique<Manifest>(mojom::ManifestLocation::kInvalidLocation,
-                                 std::move(parsed_manifest), extension_id);
-  result->skip_install_dialog = true;
-  result->manifest_check_level = strict_manifest_check ?
-    MANIFEST_CHECK_LEVEL_STRICT : MANIFEST_CHECK_LEVEL_LOOSE;
-  return result;
-}
-
-WebstoreInstaller::Approval::~Approval() = default;
-
-const WebstoreInstaller::Approval* WebstoreInstaller::GetAssociatedApproval(
+// static
+const InstallApproval* WebstoreInstaller::GetAssociatedApproval(
     const DownloadItem& download) {
-  return static_cast<const Approval*>(download.GetUserData(kApprovalKey));
+  return static_cast<const InstallApproval*>(
+      download.GetUserData(kApprovalKey));
 }
 
 WebstoreInstaller::WebstoreInstaller(Profile* profile,
@@ -260,7 +225,7 @@
                                      FailureCallback failure_callback,
                                      content::WebContents* web_contents,
                                      const extensions::ExtensionId& id,
-                                     std::unique_ptr<Approval> approval,
+                                     std::unique_ptr<InstallApproval> approval,
                                      InstallSource source)
     : web_contents_(web_contents->GetWeakPtr()),
       profile_(profile),
@@ -434,8 +399,8 @@
   download_item_->AddObserver(this);
   if (pending_modules_.size() > 1) {
     // We are downloading a shared module. We need create an approval for it.
-    std::unique_ptr<Approval> approval =
-        Approval::CreateForSharedModule(profile_);
+    std::unique_ptr<InstallApproval> approval =
+        InstallApproval::CreateForSharedModule(profile_);
     const SharedModuleInfo::ImportInfo& info = pending_modules_.front();
     approval->extension_id = info.extension_id;
     const base::Version version_required(info.minimum_version);
@@ -684,7 +649,7 @@
       extension_service();
   CHECK(service);
 
-  const Approval* approval = GetAssociatedApproval(download);
+  const InstallApproval* approval = GetAssociatedApproval(download);
   DCHECK(approval);
 
   crx_installer_ = download_crx_util::CreateCrxInstaller(profile_, download);
diff --git a/chrome/browser/extensions/webstore_installer.h b/chrome/browser/extensions/webstore_installer.h
index e359c4f..cec44cb 100644
--- a/chrome/browser/extensions/webstore_installer.h
+++ b/chrome/browser/extensions/webstore_installer.h
@@ -14,18 +14,15 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
-#include "base/supports_user_data.h"
 #include "base/timer/timer.h"
-#include "base/values.h"
 #include "base/version.h"
-#include "chrome/browser/extensions/extension_install_prompt.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_item.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/install/crx_install_error.h"
 #include "extensions/common/manifest_handlers/shared_module_info.h"
-#include "ui/gfx/image/image_skia.h"
 #include "url/gurl.h"
 
 class Profile;
@@ -42,7 +39,7 @@
 
 class CrxInstaller;
 class Extension;
-class Manifest;
+struct InstallApproval;
 
 // Downloads and installs extensions from the web store.
 class WebstoreInstaller : public ExtensionRegistryObserver,
@@ -69,103 +66,13 @@
     FAILURE_REASON_OTHER
   };
 
-  enum ManifestCheckLevel {
-    // Do not check for any manifest equality.
-    MANIFEST_CHECK_LEVEL_NONE,
-
-    // Only check that the expected and actual permissions have the same
-    // effective permissions.
-    MANIFEST_CHECK_LEVEL_LOOSE,
-
-    // All data in the expected and actual manifests must match.
-    MANIFEST_CHECK_LEVEL_STRICT,
-  };
-
   using SuccessCallback = base::OnceCallback<void(const std::string&)>;
   using FailureCallback = base::OnceCallback<
       void(const std::string&, const std::string&, FailureReason)>;
 
-  // Contains information about what parts of the extension install process can
-  // be skipped or modified. If one of these is present, it means that a CRX
-  // download was initiated by WebstoreInstaller. The Approval instance should
-  // be checked further for additional details.
-  struct Approval : public base::SupportsUserData::Data {
-    static std::unique_ptr<Approval> CreateWithInstallPrompt(Profile* profile);
-
-    // Creates an Approval for installing a shared module.
-    static std::unique_ptr<Approval> CreateForSharedModule(Profile* profile);
-
-    // Creates an Approval that will skip putting up an install confirmation
-    // prompt if the actual manifest from the extension to be installed matches
-    // |parsed_manifest|. The |strict_manifest_check| controls whether we want
-    // to require an exact manifest match, or are willing to tolerate a looser
-    // check just that the effective permissions are the same.
-    static std::unique_ptr<Approval> CreateWithNoInstallPrompt(
-        Profile* profile,
-        const std::string& extension_id,
-        base::Value::Dict parsed_manifest,
-        bool strict_manifest_check);
-
-    ~Approval() override;
-
-    // The extension id that was approved for installation.
-    std::string extension_id;
-
-    // The profile the extension should be installed into.
-    raw_ptr<Profile> profile = nullptr;
-
-    // The expected manifest, before localization.
-    std::unique_ptr<Manifest> manifest;
-
-    // Whether to use a bubble notification when an app is installed, instead of
-    // the default behavior of transitioning to the new tab page.
-    bool use_app_installed_bubble = false;
-
-    // Whether to skip the post install UI like the extension installed bubble.
-    bool skip_post_install_ui = false;
-
-    // Whether to skip the install dialog once the extension has been downloaded
-    // and unpacked. One reason this can be true is that in the normal webstore
-    // installation, the dialog is shown earlier, before any download is done,
-    // so there's no need to show it again.
-    bool skip_install_dialog = false;
-
-    // Manifest check level for checking actual manifest against expected
-    // manifest.
-    ManifestCheckLevel manifest_check_level = MANIFEST_CHECK_LEVEL_STRICT;
-
-    // Used to show the install dialog.
-    ExtensionInstallPrompt::ShowDialogCallback show_dialog_callback;
-
-    // The icon to use to display the extension while it is installing.
-    gfx::ImageSkia installing_icon;
-
-    // A dummy extension created from |manifest|;
-    scoped_refptr<Extension> dummy_extension;
-
-    // Required minimum version.
-    std::unique_ptr<base::Version> minimum_version;
-
-    // The authuser index required to download the item being installed. May be
-    // the empty string, in which case no authuser parameter is used.
-    std::string authuser;
-
-    // Whether the user clicked through the install friction dialog when the
-    // extension is not included in the Enhanced Safe Browsing CRX allowlist and
-    // the user has enabled Enhanced Protection.
-    bool bypassed_safebrowsing_friction = false;
-
-    // Whether to withhold permissions at installation. By default, permissions
-    // are granted at installation.
-    bool withhold_permissions = false;
-
-   private:
-    Approval();
-  };
-
-  // Gets the Approval associated with the |download|, or nullptr if there's
-  // none. Note that the Approval is owned by |download|.
-  static const Approval* GetAssociatedApproval(
+  // Gets the InstallApproval associated with the `download`, or nullptr if
+  // there's none. Note that the InstallApproval is owned by `download`.
+  static const InstallApproval* GetAssociatedApproval(
       const download::DownloadItem& download);
 
   // Creates a WebstoreInstaller for downloading and installing the extension
@@ -177,7 +84,7 @@
                     FailureCallback failure_callback,
                     content::WebContents* web_contents,
                     const std::string& id,
-                    std::unique_ptr<Approval> approval,
+                    std::unique_ptr<InstallApproval> approval,
                     InstallSource source);
 
   // Starts downloading and installing the extension.
@@ -259,7 +166,7 @@
   // trigger at least every second, though sometimes more frequently (depending
   // on number of modules, etc).
   base::OneShotTimer download_progress_timer_;
-  std::unique_ptr<Approval> approval_;
+  std::unique_ptr<InstallApproval> approval_;
   GURL download_url_;
   scoped_refptr<CrxInstaller> crx_installer_;
 
diff --git a/chrome/browser/extensions/webstore_installer_browsertest.cc b/chrome/browser/extensions/webstore_installer_browsertest.cc
index 6d0b150f..d1e9671 100644
--- a/chrome/browser/extensions/webstore_installer_browsertest.cc
+++ b/chrome/browser/extensions/webstore_installer_browsertest.cc
@@ -10,6 +10,7 @@
 #include "base/run_loop.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/permissions/scripting_permissions_modifier.h"
 #include "chrome/browser/extensions/webstore_installer_test.h"
 #include "chrome/browser/profiles/profile.h"
@@ -46,7 +47,7 @@
                         FailureCallback failure_callback,
                         content::WebContents* web_contents,
                         const std::string& id,
-                        std::unique_ptr<Approval> approval,
+                        std::unique_ptr<InstallApproval> approval,
                         InstallSource source)
       : WebstoreInstaller(profile,
                           std::move(success_callback),
@@ -133,8 +134,8 @@
   ASSERT_TRUE(active_web_contents);
 
   // Create an approval.
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
-      WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
+  std::unique_ptr<InstallApproval> approval =
+      InstallApproval::CreateWithNoInstallPrompt(
           browser()->profile(), kTestExtensionId, GetManifest(), false);
 
   // Create and run a WebstoreInstaller.
@@ -164,8 +165,8 @@
   ASSERT_TRUE(active_web_contents);
 
   // Create an approval.
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
-      WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
+  std::unique_ptr<InstallApproval> approval =
+      InstallApproval::CreateWithNoInstallPrompt(
           browser()->profile(), kTestExtensionId, manifest.Clone(), false);
 
   // Create and run a WebstoreInstaller.
@@ -247,8 +248,8 @@
 
   // Create an approval that withhelds permissions when the checkbox is not
   // selected.
-  std::unique_ptr<WebstoreInstaller::Approval> approval =
-      WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
+  std::unique_ptr<InstallApproval> approval =
+      InstallApproval::CreateWithNoInstallPrompt(
           browser()->profile(), kTestExtensionWithPermissionsId, GetManifest(),
           false);
   approval->withhold_permissions = shoud_withhold_permissions;
diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc
index ed74559..64cf647 100644
--- a/chrome/browser/extensions/webstore_standalone_installer.cc
+++ b/chrome/browser/extensions/webstore_standalone_installer.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/extension_install_prompt.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/install_approval.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/scoped_active_install.h"
 #include "chrome/browser/extensions/webstore_data_fetcher.h"
@@ -165,11 +166,11 @@
   return std::make_unique<ExtensionInstallPrompt>(GetWebContents());
 }
 
-std::unique_ptr<WebstoreInstaller::Approval>
-WebstoreStandaloneInstaller::CreateApproval() const {
-  std::unique_ptr<WebstoreInstaller::Approval> approval(
-      WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
-          profile_, id_, manifest_->Clone(), true));
+std::unique_ptr<InstallApproval> WebstoreStandaloneInstaller::CreateApproval()
+    const {
+  std::unique_ptr<InstallApproval> approval(
+      InstallApproval::CreateWithNoInstallPrompt(profile_, id_,
+                                                 manifest_->Clone(), true));
   approval->skip_post_install_ui = !ShouldShowPostInstallUI();
   approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon_);
   return approval;
@@ -191,7 +192,7 @@
 
   DCHECK(payload.result == ExtensionInstallPrompt::Result::ACCEPTED);
 
-  std::unique_ptr<WebstoreInstaller::Approval> approval = CreateApproval();
+  std::unique_ptr<InstallApproval> approval = CreateApproval();
 
   ExtensionRegistry* extension_registry = ExtensionRegistry::Get(profile_);
   const Extension* installed_extension =
diff --git a/chrome/browser/extensions/webstore_standalone_installer.h b/chrome/browser/extensions/webstore_standalone_installer.h
index 572cf7e..ad3dd18 100644
--- a/chrome/browser/extensions/webstore_standalone_installer.h
+++ b/chrome/browser/extensions/webstore_standalone_installer.h
@@ -27,6 +27,7 @@
 
 namespace extensions {
 class Extension;
+struct InstallApproval;
 class ScopedActiveInstall;
 class WebstoreDataFetcher;
 
@@ -126,7 +127,7 @@
   virtual std::unique_ptr<ExtensionInstallPrompt> CreateInstallUI();
 
   // Create an approval to pass installation parameters to the CrxInstaller.
-  virtual std::unique_ptr<WebstoreInstaller::Approval> CreateApproval() const;
+  virtual std::unique_ptr<InstallApproval> CreateApproval() const;
 
   // Called once the install prompt has finished.
   virtual void OnInstallPromptDone(
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSource.java
index e637791..695e4e3 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSource.java
@@ -4,12 +4,15 @@
 
 package org.chromium.chrome.browser.feedback;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Used by various components to provide a set of feedback data that can be gathered asynchronously.
  * Note that if the owner times out, {@link #getFeedback()} might be called even if
  * this source isn't ready.  At that point this source should do it's best to provide what data it
  * can.
  */
+@NullMarked
 public interface AsyncFeedbackSource extends FeedbackSource {
     /**
      * Starts the feedback collection process for this source.  This source should notify
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSourceAdapter.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSourceAdapter.java
index f12ced48..e469f8a 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSourceAdapter.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSourceAdapter.java
@@ -10,6 +10,8 @@
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.AsyncTask.Status;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.concurrent.ExecutionException;
 
@@ -21,10 +23,11 @@
  * asynchronous work.
  * @param <Result> The {@link Object} type that represents the result of doing the background work.
  */
+@NullMarked
 public abstract class AsyncFeedbackSourceAdapter<Result> implements AsyncFeedbackSource {
-    private Worker mWorker;
+    private @Nullable Worker mWorker;
 
-    private class Worker extends AsyncTask<Result> {
+    private class Worker extends AsyncTask<@Nullable Result> {
         private final Runnable mCallback;
 
         public Worker(Runnable callback) {
@@ -33,13 +36,13 @@
 
         // AsyncTask implementation.
         @Override
-        protected Result doInBackground() {
+        protected @Nullable Result doInBackground() {
             return AsyncFeedbackSourceAdapter.this.doInBackground(
                     ContextUtils.getApplicationContext());
         }
 
         @Override
-        protected void onPostExecute(Result result) {
+        protected void onPostExecute(@Nullable Result result) {
             mCallback.run();
         }
     }
@@ -50,14 +53,14 @@
      * @param context The application {@link Context}.
      * @return        The result of doing the work in the background or {@code null}.
      */
-    protected abstract Result doInBackground(Context context);
+    protected abstract @Nullable Result doInBackground(Context context);
 
     /**
      * @return The result of the background work if it has been started and finished.  This will be
      *         null if the underlying background task has not finished yet (see {@link #isReady()})
      *         or if {@link #doInBackground(Context)} returned {@code null}.
      */
-    protected final Result getResult() {
+    protected final @Nullable Result getResult() {
         try {
             return mWorker != null && mWorker.getStatus() == Status.FINISHED ? mWorker.get() : null;
         } catch (ExecutionException | InterruptedException e) {
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/DeviceInfoFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/DeviceInfoFeedbackSource.java
index abca086e..c1cdd30 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/DeviceInfoFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/DeviceInfoFeedbackSource.java
@@ -8,11 +8,13 @@
 
 import org.chromium.base.BuildInfo;
 import org.chromium.base.ContextUtils;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.base.DeviceFormFactor;
 
 import java.util.Map;
 
 /** Grabs feedback about the device information - name and type. */
+@NullMarked
 class DeviceInfoFeedbackSource implements FeedbackSource {
     private static final String DEVICE_NAME_KEY = "device_name";
     private static final String DEVICE_TYPE_KEY = "device_type";
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FallbackHelpAndFeedbackLauncherDelegate.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FallbackHelpAndFeedbackLauncherDelegate.java
index 7e4859e6..8820d59 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FallbackHelpAndFeedbackLauncherDelegate.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FallbackHelpAndFeedbackLauncherDelegate.java
@@ -6,26 +6,26 @@
 
 import android.app.Activity;
 
-import androidx.annotation.NonNull;
-
 import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
 
 /**
  * Basic implementation for displaying help support for Chrome.
  *
  * <p>NOTE: This class is designed to be replaced by downstream targets.
  */
+@NullMarked
 public class FallbackHelpAndFeedbackLauncherDelegate implements HelpAndFeedbackLauncherDelegate {
     private static final String TAG = "HelpAndFeedback";
 
     @Override
-    public void show(Activity activity, String helpContext, @NonNull FeedbackCollector collector) {
+    public void show(Activity activity, String helpContext, FeedbackCollector collector) {
         Log.d(TAG, "Feedback data: " + collector.getBundle());
         HelpAndFeedbackLauncherDelegate.launchFallbackSupportUri(activity);
     }
 
     @Override
-    public void showFeedback(Activity activity, @NonNull FeedbackCollector collector) {
+    public void showFeedback(Activity activity, FeedbackCollector collector) {
         Log.d(TAG, "Feedback data: " + collector.getBundle());
         HelpAndFeedbackLauncherDelegate.launchFallbackSupportUri(activity);
     }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
index da8e6523..5691f5a 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
@@ -4,13 +4,13 @@
 
 package org.chromium.chrome.browser.feedback;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 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.profiles.Profile;
 
 import java.util.HashMap;
@@ -18,6 +18,7 @@
 
 /** Reports profile settings for users in a family group. */
 @JNINamespace("chrome::android")
+@NullMarked
 public class FamilyInfoFeedbackSource implements AsyncFeedbackSource {
     // LINT.IfChange
     private static final String FAMILY_MEMBER_ROLE = "Family_Member_Role";
@@ -27,7 +28,7 @@
     private final Profile mProfile;
     private Map<String, String> mFeedbackMap = new HashMap<>();
     private boolean mIsReady;
-    private Runnable mCallback;
+    private @Nullable Runnable mCallback;
 
     public FamilyInfoFeedbackSource(Profile profile) {
         mProfile = profile;
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java
index a055689..f221869 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java
@@ -10,8 +10,6 @@
 import android.os.SystemClock;
 import android.util.Pair;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import com.google.common.collect.Iterables;
@@ -21,6 +19,9 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.components.signin.base.CoreAccountInfo;
@@ -36,23 +37,25 @@
  * a set of Key - Value pairs used to submit feedback requests.
  * @param <T> Initialization params used by subclasses for the feedback source builders.
  */
+@NullMarked
 public abstract class FeedbackCollector<T> implements Runnable {
     /** The timeout for gathering data asynchronously. This timeout is ignored for screenshots. */
     private static final int TIMEOUT_MS = 500;
 
     private final long mStartTime = SystemClock.elapsedRealtime();
 
-    private final String mCategoryTag;
-    private final String mDescription;
-    private String mAccountInUse;
+    private final @Nullable String mCategoryTag;
+    private final @Nullable String mDescription;
+    private @Nullable String mAccountInUse;
 
     private List<FeedbackSource> mSynchronousSources;
+
     @VisibleForTesting protected List<AsyncFeedbackSource> mAsynchronousSources;
 
-    private ScreenshotSource mScreenshotTask;
+    private @Nullable ScreenshotSource mScreenshotTask;
 
     /** The callback is cleared once notified so we will never notify the caller twice. */
-    private Callback<FeedbackCollector> mCallback;
+    private @Nullable Callback<FeedbackCollector> mCallback;
 
     public FeedbackCollector(
             @Nullable String categoryTag,
@@ -64,6 +67,7 @@
     }
 
     // Subclasses must invoke init() at construction time.
+    @Initializer
     protected void init(
             Activity activity,
             @Nullable ScreenshotSource screenshotTask,
@@ -103,21 +107,19 @@
     }
 
     @VisibleForTesting
-    @NonNull
     protected abstract List<FeedbackSource> buildSynchronousFeedbackSources(
             Activity activity, T initParams);
 
     @VisibleForTesting
-    @NonNull
     protected abstract List<AsyncFeedbackSource> buildAsynchronousFeedbackSources(T initParams);
 
     /** @return The category tag for this feedback report. */
-    public String getCategoryTag() {
+    public @Nullable String getCategoryTag() {
         return mCategoryTag;
     }
 
     /** @return The description of this feedback report. */
-    public String getDescription() {
+    public @Nullable String getDescription() {
         return mDescription;
     }
 
@@ -131,7 +133,7 @@
      * @return Returns the histogram data from {@link #getLogs()}.
      */
     @Deprecated
-    public String getHistograms() {
+    public @Nullable String getHistograms() {
         return getLogs().get(HistogramFeedbackSource.HISTOGRAMS_KEY);
     }
 
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackContextFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackContextFeedbackSource.java
index 53094a5..12f05f9 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackContextFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackContextFeedbackSource.java
@@ -6,23 +6,25 @@
 
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.Map;
 
 /**
  * Provides information about which feature was being used when the feedback report was triggered.
  */
+@NullMarked
 public class FeedbackContextFeedbackSource implements FeedbackSource {
     static final String FEEDBACK_CONTEXT_KEY = "Feedback Context";
-    private final String mFeedbackContext;
+    private final @Nullable String mFeedbackContext;
 
     FeedbackContextFeedbackSource(@Nullable String feedbackContext) {
         mFeedbackContext = feedbackContext;
     }
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         if (TextUtils.isEmpty(mFeedbackContext)) return null;
         return Map.of(FEEDBACK_CONTEXT_KEY, mFeedbackContext);
     }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackSource.java
index dd62249..f08376c 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackSource.java
@@ -6,7 +6,8 @@
 
 import android.util.Pair;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.Map;
 
@@ -17,6 +18,7 @@
  * please ensure the teams that operationalize feedback are aware and supportive. Contact:
  * chrome-gtech@.
  */
+@NullMarked
 public interface FeedbackSource {
     /**
      * Called to get all relevant feedback for this source.
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncher.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncher.java
index 7362993..04db421 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncher.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncher.java
@@ -6,11 +6,13 @@
 
 import android.app.Activity;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.Map;
 
 /** Interface for launching a help and feedback page. */
+@NullMarked
 public interface HelpAndFeedbackLauncher {
     /**
      * Starts an activity showing a help page for the specified context ID.
@@ -38,9 +40,9 @@
     void showFeedback(
             final Activity activity,
             @Nullable String url,
-            @Nullable final String categoryTag,
+            final @Nullable String categoryTag,
             int screenshotMode,
-            @Nullable final String feedbackContext);
+            final @Nullable String feedbackContext);
 
     /**
      * Starts an activity prompting the user to enter feedback.
@@ -68,6 +70,6 @@
     void showFeedback(
             final Activity activity,
             @Nullable String url,
-            @Nullable final String categoryTag,
-            @Nullable final Map<String, String> feedContext);
+            final @Nullable String categoryTag,
+            final @Nullable Map<String, String> feedContext);
 }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncherDelegate.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncherDelegate.java
index b4410a1a..b900240 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncherDelegate.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncherDelegate.java
@@ -10,9 +10,10 @@
 import android.net.Uri;
 import android.provider.Browser;
 
-import androidx.annotation.NonNull;
+import org.chromium.build.annotations.NullMarked;
 
 /** Delegate that handles the display of the HelpAndFeedback flows. */
+@NullMarked
 public interface HelpAndFeedbackLauncherDelegate {
     static final String FALLBACK_SUPPORT_URL = "https://support.google.com/chrome/topic/6069782";
 
@@ -25,7 +26,7 @@
      *                    context and will be used to show a more relevant help page.
      * @param collector the {@link FeedbackCollector} to use for extra data. Must not be null.
      */
-    void show(Activity activity, String helpContext, @NonNull FeedbackCollector collector);
+    void show(Activity activity, String helpContext, FeedbackCollector collector);
 
     /**
      * Starts an activity prompting the user to enter feedback.
@@ -34,7 +35,7 @@
      *                 screenshot of.
      * @param collector the {@link FeedbackCollector} to use for extra data. Must not be null.
      */
-    void showFeedback(Activity activity, @NonNull FeedbackCollector collector);
+    void showFeedback(Activity activity, FeedbackCollector collector);
 
     /**
      * Handles the fallback help case of opening the URL in the browser.
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HistogramFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HistogramFeedbackSource.java
index 1c6b3a9..0160ee7a 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HistogramFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/HistogramFeedbackSource.java
@@ -9,12 +9,15 @@
 import org.chromium.base.SysUtils;
 import org.chromium.base.metrics.JSONVerbosityLevel;
 import org.chromium.base.metrics.StatisticsRecorderAndroid;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.browser_ui.util.ConversionUtils;
 
 /** Grabs feedback about the UMA histograms. */
 // TODO(dtrainor): Make this class protected and HISTOGRAMS_KEY private once grabbing specific log
 // sources is no longer required.
+@NullMarked
 public class HistogramFeedbackSource implements FeedbackSource {
     public static final String HISTOGRAMS_KEY = "histograms";
 
@@ -30,7 +33,7 @@
     }
 
     @Override
-    public Pair<String, String> getLogs() {
+    public @Nullable Pair<String, String> getLogs() {
         if (mIsOffTheRecord) return null;
         int jsonVerbosityLevel = JSONVerbosityLevel.JSON_VERBOSITY_LEVEL_FULL;
 
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/IMEFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/IMEFeedbackSource.java
index 81c7335..f9669e1 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/IMEFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/IMEFeedbackSource.java
@@ -8,15 +8,18 @@
 import android.text.TextUtils;
 
 import org.chromium.base.ContextUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.Map;
 
 /** Grabs feedback about the default IME input method. */
+@NullMarked
 public class IMEFeedbackSource implements FeedbackSource {
     IMEFeedbackSource() {}
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         String imePackage =
                 Settings.Secure.getString(
                         ContextUtils.getApplicationContext().getContentResolver(),
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/InterestFeedFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/InterestFeedFeedbackSource.java
index ebcfd63..b6fcedac 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/InterestFeedFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/InterestFeedFeedbackSource.java
@@ -4,12 +4,14 @@
 
 package org.chromium.chrome.browser.feedback;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.HashMap;
 import java.util.Map;
 
 /** Provides information about whether the interest feed is enabled for use in feedback reports. */
+@NullMarked
 public class InterestFeedFeedbackSource implements FeedbackSource {
     private static final String KEY = "Interest Feed";
     private static final String ENABLED_VALUE = "Enabled";
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/LowEndDeviceFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/LowEndDeviceFeedbackSource.java
index df1aaf68..e45e107f 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/LowEndDeviceFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/LowEndDeviceFeedbackSource.java
@@ -5,11 +5,13 @@
 package org.chromium.chrome.browser.feedback;
 
 import org.chromium.base.SysUtils;
+import org.chromium.build.annotations.NullMarked;
 
 import java.util.HashMap;
 import java.util.Map;
 
 /** Provides data about whether the feedback comes from a low-end device. */
+@NullMarked
 public class LowEndDeviceFeedbackSource implements FeedbackSource {
     private static final String LOW_END_DEVICE_KEY = "lowmem";
     private final HashMap<String, String> mMap;
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java
index 5ba2375d..2dc8abb 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java
@@ -9,15 +9,18 @@
 import android.text.TextUtils;
 
 import org.chromium.base.PackageUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.Map;
 
 /** Grabs a list of all granted permissions. */
+@NullMarked
 class PermissionFeedbackSource implements FeedbackSource {
     PermissionFeedbackSource() {}
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         String grantedPermissions = "";
         String notGrantedPermission = "";
 
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java
index 4eee1aa..a9a5e9b 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java
@@ -8,6 +8,8 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.common.ContentSwitches;
 
 import java.util.HashMap;
@@ -15,6 +17,7 @@
 
 /** Grabs feedback about the current system. */
 @JNINamespace("chrome::android")
+@NullMarked
 public class ProcessIdFeedbackSource implements AsyncFeedbackSource {
     // Process types used for feedback report. These should be in sync with the enum
     // in //content/public/common/process_type.h
@@ -31,7 +34,7 @@
     }
 
     /** A map of process type -> list of PIDs for that type. Can be {@code null}. */
-    private Map<String, String> mProcessMap;
+    private @Nullable Map<String, String> mProcessMap;
 
     private boolean mIsReady;
 
@@ -75,7 +78,7 @@
     }
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         return mProcessMap;
     }
 
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java
index d254dca3..4e871a0 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java
@@ -6,20 +6,21 @@
 
 import android.graphics.Bitmap;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** An interface for a class that can provide screenshots to a consumer. */
+@NullMarked
 public interface ScreenshotSource {
     /**
      * Starts capturing the screenshot.
      * @param callback The {@link Runnable} to call when the screenshot capture process is complete.
      */
-    void capture(@Nullable Runnable callback);
+    void capture(Runnable callback);
 
     /** @return Whether or not this source is finished attempting to grab a screenshot. */
     boolean isReady();
 
     /** @return A screenshot if available or {@code null} otherwise. */
-    @Nullable
-    Bitmap getScreenshot();
+    @Nullable Bitmap getScreenshot();
 }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java
index 8f96815..18b4fb7 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java
@@ -8,16 +8,19 @@
 
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** A implementation of {@link ScreenshotSource} that returns back a {@link Bitmap} given to it. */
+@NullMarked
 class StaticScreenshotSource implements ScreenshotSource {
-    private final Bitmap mBitmap;
+    private final @Nullable Bitmap mBitmap;
 
     /**
      * Creates a new {@link StaticScreenshotSource}.
      * @param screenshot The {@link Bitmap} to use as a screenshot.
      */
-    public StaticScreenshotSource(Bitmap screenshot) {
+    public StaticScreenshotSource(@Nullable Bitmap screenshot) {
         mBitmap = screenshot;
     }
 
@@ -33,7 +36,7 @@
     }
 
     @Override
-    public Bitmap getScreenshot() {
+    public @Nullable Bitmap getScreenshot() {
         return mBitmap;
     }
 }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java
index 04a2843..f3e92a6 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java
@@ -13,6 +13,8 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.LocaleUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.util.ConversionUtils;
 
 import java.io.File;
@@ -21,10 +23,11 @@
 
 /** Grabs feedback about the current system. */
 @JNINamespace("chrome::android")
+@NullMarked
 public class SystemInfoFeedbackSource extends AsyncFeedbackSourceAdapter<StatFs> {
     // AsyncFeedbackSourceAdapter implementation.
     @Override
-    protected StatFs doInBackground(Context context) {
+    protected @Nullable StatFs doInBackground(Context context) {
         File directory = Environment.getDataDirectory();
         if (!directory.exists()) return null;
 
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/UrlFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/UrlFeedbackSource.java
index 81ee48f..efb3d68 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/UrlFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/UrlFeedbackSource.java
@@ -6,22 +6,24 @@
 
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.Map;
 
 /** Grabs feedback about the current URL. */
+@NullMarked
 class UrlFeedbackSource implements FeedbackSource {
     private static final String URL_KEY = "URL";
 
-    private final String mUrl;
+    private final @Nullable String mUrl;
 
     UrlFeedbackSource(@Nullable String url) {
         mUrl = url;
     }
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         if (TextUtils.isEmpty(mUrl)) return null;
         return Map.of(URL_KEY, mUrl);
     }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsFeedbackSource.java
index cea6df23..a6aeb3ab 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsFeedbackSource.java
@@ -4,12 +4,15 @@
 
 package org.chromium.chrome.browser.feedback;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.variations.VariationsAssociatedData;
 
 import java.util.Map;
 
 /** Grabs feedback about the current variations state. */
+@NullMarked
 class VariationsFeedbackSource implements FeedbackSource {
     private final boolean mIsOffTheRecord;
 
@@ -18,7 +21,7 @@
     }
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         if (mIsOffTheRecord) return null;
         return VariationsAssociatedData.getFeedbackMap();
     }
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsStateFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsStateFeedbackSource.java
index 7c64b7c..6261a125 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsStateFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/VariationsStateFeedbackSource.java
@@ -4,12 +4,15 @@
 
 package org.chromium.chrome.browser.feedback;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.variations.VariationsAssociatedData;
 
 import java.util.Map;
 
 /** Grabs feedback about the current command-line variations. */
+@NullMarked
 class VariationsStateFeedbackSource implements FeedbackSource {
     private final boolean mIsOffTheRecord;
 
@@ -18,7 +21,7 @@
     }
 
     @Override
-    public Map<String, String> getFeedback() {
+    public @Nullable Map<String, String> getFeedback() {
         if (mIsOffTheRecord) return null;
         return VariationsAssociatedData.getVariationsStateFeedbackMap();
     }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index d2936531..7c63450b 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -318,7 +318,7 @@
   {
     "name": "arc-aaudio-mmap-low-latency",
     "owners": [ "pteerapong@chromium.org", "chromeos-audio@google.com" ],
-    "expiry_milestone": 135
+    "expiry_milestone": 145
   },
   {
     "name": "arc-arc-on-demand",
@@ -606,6 +606,11 @@
     "expiry_milestone": 135
   },
   {
+    "name": "autofill-enable-card-expired-text",
+    "owners": [ "ferny@google.com", "payments-autofill-team@google.com" ],
+    "expiry_milestone": 140
+  },
+  {
     "name": "autofill-enable-card-info-runtime-retrieval",
     "owners": [ "hvs@google.com", "payments-autofill-team@google.com"],
     "expiry_milestone": 145
@@ -2408,6 +2413,11 @@
     "expiry_milestone": 143
   },
   {
+    "name": "enable-accessibility-text-formatting",
+    "owners": [ "mschillaci@google.com", "//ui/accessibility/OWNERS" ],
+    "expiry_milestone": 145
+  },
+  {
     "name": "enable-accessibility-unified-snapshots",
     "owners": [ "mschillaci@google.com", "//ui/accessibility/OWNERS" ],
     "expiry_milestone": 140
@@ -2915,12 +2925,12 @@
   {
     "name": "enable-enterprise-profile-badging-for-avatar",
     "owners": [ "ydago@chromium.org", "esalma@google.com","cbe-magic@google.com"],
-    "expiry_milestone": 135
+    "expiry_milestone": 136
   },
   {
     "name": "enable-enterprise-profile-badging-for-menu",
     "owners": [ "ydago@chromium.org", "esalma@google.com","cbe-magic@google.com"],
-    "expiry_milestone": 135
+    "expiry_milestone": 136
   },
   {
     "name": "enable-enterprise-profile-required-interstitial",
@@ -5874,6 +5884,27 @@
     "expiry_milestone": 120
   },
   {
+    "name": "media-app-image-mantis-erase",
+    "owners": [
+      "cros-mantis@google.com"
+    ],
+    "expiry_milestone": 145
+  },
+  {
+    "name": "media-app-image-mantis-expand-background",
+    "owners": [
+      "cros-mantis@google.com"
+    ],
+    "expiry_milestone": 145
+  },
+  {
+    "name": "media-app-image-mantis-make-a-sticker",
+    "owners": [
+      "cros-mantis@google.com"
+    ],
+    "expiry_milestone": 145
+  },
+  {
     "name": "media-app-image-mantis-model",
     "owners": [
       "cros-mantis@google.com"
@@ -5881,6 +5912,20 @@
     "expiry_milestone": 145
   },
   {
+    "name": "media-app-image-mantis-reimagine",
+    "owners": [
+      "cros-mantis@google.com"
+    ],
+    "expiry_milestone": 145
+  },
+  {
+    "name": "media-app-image-mantis-remove-background",
+    "owners": [
+      "cros-mantis@google.com"
+    ],
+    "expiry_milestone": 145
+  },
+  {
     "name": "media-app-pdf-a11y-ocr",
     "owners": [ "//ash/webui/media_app_ui/OWNERS" ],
     "expiry_milestone": 130
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index d6cd7b6..aff979b 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -571,6 +571,12 @@
     "When enabled, Chrome will sync user data related to buy now pay later.";
 #endif
 
+const char kAutofillEnableCardExpiredTextName[] =
+    "Enable 'expired' text for expired cards.";
+const char kAutofillEnableCardExpiredTextDescription[] =
+    "When enabled, cards that have expired will display 'expired' instead of "
+    "'expires' text.";
+
 const char kAutofillEnableCvcStorageAndFillingName[] =
     "Enable CVC storage and filling for payments autofill";
 const char kAutofillEnableCvcStorageAndFillingDescription[] =
@@ -4159,6 +4165,11 @@
     "When enabled, the accessibility tree for the web contents will include "
     "the ACTION_LONG_CLICK action on all relevant nodes.";
 
+const char kAccessibilityTextFormattingName[] = "Accessibility Text Formatting";
+const char kAccessibilityTextFormattingDescription[] =
+    "When enabled, text formatting information will be included in the "
+    "AccessibilityNodeInfo tree on Android";
+
 const char kAccessibilityUnifiedSnapshotsName[] =
     "Accessibility Unified Snapshots";
 const char kAccessibilityUnifiedSnapshotsDescription[] =
@@ -6857,11 +6868,34 @@
 const char kMediaAppPdfMahiDescription[] =
     "Enable Mahi feature on PDF files in Gallery app.";
 
+const char kMediaAppImageMantisEraseName[] = "Erase feature of Mantis";
+const char kMediaAppImageMantisEraseDescription[] =
+    "Enable the Erase feature of Mantis";
+
+const char kMediaAppImageMantisExpandBackgroundName[] =
+    "Expand Background feature of Mantis";
+const char kMediaAppImageMantisExpandBackgroundDescription[] =
+    "Enable the Expand background feature of Mantis";
+
+const char kMediaAppImageMantisMakeAStickerName[] =
+    "Make a sticker feature of Mantis";
+const char kMediaAppImageMantisMakeAStickerDescription[] =
+    "Enable the Make a sticker feature of Mantis";
+
 const char kMediaAppImageMantisModelName[] =
     "The model to use with the Mantis feature";
 const char kMediaAppImageMantisModelDescription[] =
     "This flag controls the model to use with the Mantis feature.";
 
+const char kMediaAppImageMantisReimagineName[] = "Reimagine feature of Mantis";
+const char kMediaAppImageMantisReimagineDescription[] =
+    "Enable the Reimagine feature of Mantis";
+
+const char kMediaAppImageMantisRemoveBackgroundName[] =
+    "Remove Background feature of Mantis";
+const char kMediaAppImageMantisRemoveBackgroundDescription[] =
+    "Enable the Remove Background feature of Mantis";
+
 const char kMicrophoneMuteSwitchDeviceName[] = "Microphone Mute Switch Device";
 const char kMicrophoneMuteSwitchDeviceDescription[] =
     "Support for detecting the state of hardware microphone mute toggle. Only "
@@ -7840,9 +7874,7 @@
     "media track into a track capturing just a specific DOM element.";
 #endif  // !BUILDFLAG(IS_ANDROID)
 
-#if BUILDFLAG(IS_WIN) ||                                      \
-    (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
-    BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
 const char kUIDebugToolsName[] = "Debugging tools for UI";
 const char kUIDebugToolsDescription[] =
     "Enables additional keyboard shortcuts to help debugging.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 0473549..beb5794 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -359,6 +359,9 @@
 extern const char kAutofillEnableBuyNowPayLaterSyncingDescription[];
 #endif
 
+extern const char kAutofillEnableCardExpiredTextName[];
+extern const char kAutofillEnableCardExpiredTextDescription[];
+
 extern const char kAutofillEnableCvcStorageAndFillingName[];
 extern const char kAutofillEnableCvcStorageAndFillingDescription[];
 
@@ -2425,6 +2428,8 @@
 extern const char kAccessibilityDeprecateTypeAnnounceDescription[];
 extern const char kAccessibilityIncludeLongClickActionName[];
 extern const char kAccessibilityIncludeLongClickActionDescription[];
+extern const char kAccessibilityTextFormattingName[];
+extern const char kAccessibilityTextFormattingDescription[];
 extern const char kAccessibilityUnifiedSnapshotsName[];
 extern const char kAccessibilityUnifiedSnapshotsDescription[];
 extern const char kAccessibilityManageBroadcastReceiverOnBackgroundName[];
@@ -4028,9 +4033,24 @@
 extern const char kMediaAppImageMantisModelName[];
 extern const char kMediaAppImageMantisModelDescription[];
 
+extern const char kMediaAppImageMantisEraseName[];
+extern const char kMediaAppImageMantisEraseDescription[];
+
+extern const char kMediaAppImageMantisExpandBackgroundName[];
+extern const char kMediaAppImageMantisExpandBackgroundDescription[];
+
+extern const char kMediaAppImageMantisMakeAStickerName[];
+extern const char kMediaAppImageMantisMakeAStickerDescription[];
+
 extern const char kMicrophoneMuteSwitchDeviceName[];
 extern const char kMicrophoneMuteSwitchDeviceDescription[];
 
+extern const char kMediaAppImageMantisReimagineName[];
+extern const char kMediaAppImageMantisReimagineDescription[];
+
+extern const char kMediaAppImageMantisRemoveBackgroundName[];
+extern const char kMediaAppImageMantisRemoveBackgroundDescription[];
+
 extern const char kMultiCalendarSupportName[];
 extern const char kMultiCalendarSupportDescription[];
 
@@ -4615,9 +4635,7 @@
 extern const char kElementCaptureDescription[];
 #endif  // !BUILDFLAG(IS_ANDROID)
 
-#if BUILDFLAG(IS_WIN) ||                                      \
-    (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
-    BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
 extern const char kUIDebugToolsName[];
 extern const char kUIDebugToolsDescription[];
 #endif
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn
index 6248a056..7eb2591 100644
--- a/chrome/browser/glic/BUILD.gn
+++ b/chrome/browser/glic/BUILD.gn
@@ -16,6 +16,7 @@
     "glic_cookie_synchronizer.h",
     "glic_enabling.h",
     "glic_focused_tab_manager.h",
+    "glic_fre_ui.h",
     "glic_iph_controller.h",
     "glic_keyed_service.h",
     "glic_keyed_service_factory.h",
@@ -80,6 +81,7 @@
     "glic_fre_dialog_view.h",
     "glic_fre_page_handler.cc",
     "glic_fre_page_handler.h",
+    "glic_fre_ui.cc",
     "glic_iph_controller.cc",
     "glic_keyed_service.cc",
     "glic_keyed_service_factory.cc",
@@ -116,6 +118,7 @@
     "//chrome/browser/media/webrtc",
     "//chrome/browser/profiles:profile_util",
     "//chrome/browser/resources/glic:resources",
+    "//chrome/browser/resources/glic/fre:resources",
     "//chrome/browser/themes:themes",
     "//chrome/browser/ui:browser_element_identifiers",
     "//chrome/browser/ui:browser_list",
@@ -143,7 +146,10 @@
 }
 
 mojom("mojo_bindings") {
-  sources = [ "glic.mojom" ]
+  sources = [
+    "glic.mojom",
+    "glic_fre.mojom",
+  ]
   webui_module_path = "/"
 
   public_deps = [
diff --git a/chrome/browser/glic/glic.mojom b/chrome/browser/glic/glic.mojom
index 5e6544f..666c5c6 100644
--- a/chrome/browser/glic/glic.mojom
+++ b/chrome/browser/glic/glic.mojom
@@ -23,8 +23,6 @@
   // Creates the PageHandler for chrome://glic.
   CreatePageHandler(pending_receiver<PageHandler> receiver,
       pending_remote<Page> page);
-  // Creates the handler for chrome://glic/glic_fre.
-  CreateFrePageHandler(pending_receiver<FrePageHandler> receiver);
 };
 
 // It is used in the Glic.PanelWebUiState.FinishState histogram.
@@ -86,20 +84,6 @@
   WebUiStateChanged(WebUiState new_state);
 };
 
-// Handler for the glic FRE WebUI.
-// TODO(crbug.com/393399675): The FRE should be handled in a separate WebUI
-// and mojom.
-interface FrePageHandler {
-  // Closes the glic FRE modal dialog and opens the widget hosting the main
-  // glic WebUI.
-  AcceptFre();
-  // Closes the glic FRE modal dialog.
-  DismissFre();
-  // Opens `url` in a new backgrounded tab when a link is clicked in the FRE
-  // modal dialog if `url` uses the Google domain.
-  ValidateAndOpenLinkInNewTab(url.mojom.Url url);
-};
-
 // Reason for failure while extracting tab context. This MUST be kept in sync
 // with the glic_api.ts enum.
 [Stable, Extensible]
diff --git a/chrome/browser/glic/glic_border_view_interactive_uitest.cc b/chrome/browser/glic/glic_border_view_interactive_uitest.cc
index 29b3b364..b5c608d8 100644
--- a/chrome/browser/glic/glic_border_view_interactive_uitest.cc
+++ b/chrome/browser/glic/glic_border_view_interactive_uitest.cc
@@ -149,8 +149,10 @@
   void StartBorderAnimation(Browser* browser) {
     // Mimicking the user journey by clicking the button and having the WebApp
     // set the context access indicator status.
-    RunTestSequence(PressButton(kGlicButtonElementId),
-                    InAnyContext(WaitForShow(kGlicViewElementId)));
+    RunTestSequence(
+        PressButton(kGlicButtonElementId),
+        InAnyContext(
+            WaitForShow(kGlicViewElementId).SetMustRemainVisible(false)));
     // TODO(crbug.com/390233842): We should call this in the testing web app.
     GetGlicService(browser)->SetContextAccessIndicator(true);
   }
diff --git a/chrome/browser/glic/glic_cookie_synchronizer.cc b/chrome/browser/glic/glic_cookie_synchronizer.cc
index 62a8bd5b..6e2a979 100644
--- a/chrome/browser/glic/glic_cookie_synchronizer.cc
+++ b/chrome/browser/glic/glic_cookie_synchronizer.cc
@@ -47,9 +47,9 @@
 content::StoragePartitionConfig GetGlicFreStoragePartitionConfig(
     content::BrowserContext* browser_context) {
   // This storage partition must match the partition attribute in
-  // chrome/browser/resources/glic/glic_fre/fre.html: "glicfrepart".
+  // chrome/browser/resources/glic_fre/fre.html: "glicfrepart".
   return content::StoragePartitionConfig::Create(
-      browser_context, "glic",
+      browser_context, "glic-fre",
       /*partition_name=*/"glicfrepart",
       /*in_memory=*/true);
 }
diff --git a/chrome/browser/glic/glic_fre.mojom b/chrome/browser/glic/glic_fre.mojom
new file mode 100644
index 0000000..36ca128
--- /dev/null
+++ b/chrome/browser/glic/glic_fre.mojom
@@ -0,0 +1,25 @@
+// 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.
+
+module glic.mojom;
+
+import "url/mojom/url.mojom";
+
+// Factory for PageHandler used in chrome://glic-fre.
+interface FrePageHandlerFactory {
+  // Creates the PageHandler for chrome://glic-fre.
+  CreatePageHandler(pending_receiver<FrePageHandler> receiver);
+};
+
+// Page handler for the glic FRE WebUI.
+interface FrePageHandler {
+  // Closes the glic FRE modal dialog and opens the widget hosting the main
+  // glic WebUI.
+  AcceptFre();
+  // Closes the glic FRE modal dialog.
+  DismissFre();
+  // Opens `url` in a new backgrounded tab when a link is clicked in the FRE
+  // modal dialog if `url` uses the Google domain.
+  ValidateAndOpenLinkInNewTab(url.mojom.Url url);
+};
\ No newline at end of file
diff --git a/chrome/browser/glic/glic_fre_page_handler.h b/chrome/browser/glic/glic_fre_page_handler.h
index 1b44a8d..bad52cd5 100644
--- a/chrome/browser/glic/glic_fre_page_handler.h
+++ b/chrome/browser/glic/glic_fre_page_handler.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_GLIC_GLIC_FRE_PAGE_HANDLER_H_
 
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/glic/glic.mojom.h"
+#include "chrome/browser/glic/glic_fre.mojom.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 
diff --git a/chrome/browser/glic/glic_fre_ui.cc b/chrome/browser/glic/glic_fre_ui.cc
new file mode 100644
index 0000000..71c13a6f
--- /dev/null
+++ b/chrome/browser/glic/glic_fre_ui.cc
@@ -0,0 +1,69 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/glic/glic_fre_ui.h"
+
+#include <string>
+
+#include "base/command_line.h"
+#include "chrome/browser/glic/fre_util.h"
+#include "chrome/browser/glic/glic_enabling.h"
+#include "chrome/browser/glic/glic_fre_page_handler.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/glic_fre_resources.h"
+#include "chrome/grit/glic_fre_resources_map.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/url_data_source.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/webui/webui_allowlist.h"
+#include "ui/webui/webui_util.h"
+
+namespace glic {
+
+GlicFreUIConfig::GlicFreUIConfig()
+    : DefaultWebUIConfig(content::kChromeUIScheme,
+                         chrome::kChromeUIGlicFreHost) {}
+
+bool GlicFreUIConfig::IsWebUIEnabled(content::BrowserContext* browser_context) {
+  return GlicEnabling::IsProfileEligible(
+      Profile::FromBrowserContext(browser_context));
+}
+
+GlicFreUI::GlicFreUI(content::WebUI* web_ui) : ui::MojoWebUIController(web_ui) {
+  content::BrowserContext* browser_context =
+      web_ui->GetWebContents()->GetBrowserContext();
+
+  // Set up the chrome://glic-fre source.
+  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
+      browser_context, chrome::kChromeUIGlicFreHost);
+
+  // Add required resources.
+  webui::SetupWebUIDataSource(source, kGlicFreResources, IDR_GLIC_FRE_FRE_HTML);
+
+  // Set up FRE URL via cli flag, or default to the finch param value.
+  source->AddString("glicFreURL", GetFreURL().spec());
+}
+
+WEB_UI_CONTROLLER_TYPE_IMPL(GlicFreUI)
+
+GlicFreUI::~GlicFreUI() = default;
+
+void GlicFreUI::BindInterface(
+    mojo::PendingReceiver<glic::mojom::FrePageHandlerFactory> receiver) {
+  page_factory_receiver_.reset();
+  page_factory_receiver_.Bind(std::move(receiver));
+}
+
+void GlicFreUI::CreatePageHandler(
+    mojo::PendingReceiver<glic::mojom::FrePageHandler> receiver) {
+  fre_page_handler_ = std::make_unique<GlicFrePageHandler>(
+      web_ui()->GetWebContents(), std::move(receiver));
+}
+
+}  // namespace glic
diff --git a/chrome/browser/glic/glic_fre_ui.h b/chrome/browser/glic/glic_fre_ui.h
new file mode 100644
index 0000000..1d352f7
--- /dev/null
+++ b/chrome/browser/glic/glic_fre_ui.h
@@ -0,0 +1,47 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_GLIC_GLIC_FRE_UI_H_
+#define CHROME_BROWSER_GLIC_GLIC_FRE_UI_H_
+
+#include "chrome/browser/glic/glic_fre.mojom.h"
+#include "content/public/browser/web_ui_controller.h"
+#include "content/public/browser/webui_config.h"
+#include "content/public/common/url_constants.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace glic {
+class GlicFrePageHandler;
+class GlicFreUI;
+
+class GlicFreUIConfig : public content::DefaultWebUIConfig<GlicFreUI> {
+ public:
+  GlicFreUIConfig();
+  bool IsWebUIEnabled(content::BrowserContext* browser_context) override;
+};
+
+// The WebUI for chrome://glic-fre
+class GlicFreUI : public ui::MojoWebUIController,
+                  public glic::mojom::FrePageHandlerFactory {
+ public:
+  explicit GlicFreUI(content::WebUI* web_ui);
+  ~GlicFreUI() override;
+
+  void BindInterface(
+      mojo::PendingReceiver<glic::mojom::FrePageHandlerFactory> receiver);
+
+ private:
+  void CreatePageHandler(
+      mojo::PendingReceiver<glic::mojom::FrePageHandler> receiver) override;
+
+  std::unique_ptr<GlicFrePageHandler> fre_page_handler_;
+
+  mojo::Receiver<glic::mojom::FrePageHandlerFactory> page_factory_receiver_{
+      this};
+
+  WEB_UI_CONTROLLER_TYPE_DECL();
+};
+
+}  // namespace glic
+#endif  // CHROME_BROWSER_GLIC_GLIC_FRE_UI_H_
diff --git a/chrome/browser/glic/glic_keyed_service.cc b/chrome/browser/glic/glic_keyed_service.cc
index 971503f..65f0049 100644
--- a/chrome/browser/glic/glic_keyed_service.cc
+++ b/chrome/browser/glic/glic_keyed_service.cc
@@ -64,6 +64,7 @@
 
 void GlicKeyedService::Shutdown() {
   window_controller_->Shutdown();
+  SetContextAccessIndicator(false);
 }
 
 void GlicKeyedService::ToggleUI(BrowserWindowInterface* bwi,
diff --git a/chrome/browser/glic/glic_ui.cc b/chrome/browser/glic/glic_ui.cc
index d15e629..f12f5c68 100644
--- a/chrome/browser/glic/glic_ui.cc
+++ b/chrome/browser/glic/glic_ui.cc
@@ -7,9 +7,7 @@
 #include <string>
 
 #include "base/command_line.h"
-#include "chrome/browser/glic/fre_util.h"
 #include "chrome/browser/glic/glic_enabling.h"
-#include "chrome/browser/glic/glic_fre_page_handler.h"
 #include "chrome/browser/glic/glic_page_handler.h"
 #include "chrome/browser/glic/guest_util.h"
 #include "chrome/browser/glic/resources/grit/glic_browser_resources.h"
@@ -75,9 +73,6 @@
   // Set up guest URL via cli flag or default to finch param value.
   source->AddString("glicGuestURL", GetGuestURL().spec());
 
-  // Set up FRE URL via cli flag, or default to the finch param value.
-  source->AddString("glicFreURL", GetFreURL().spec());
-
   // Set up loading notice timeout values.
   source->AddInteger("preLoadingTimeMs", features::kGlicPreLoadingTimeMs.Get());
   source->AddInteger("minLoadingTimeMs", features::kGlicMinLoadingTimeMs.Get());
@@ -129,10 +124,4 @@
       web_ui()->GetWebContents(), std::move(receiver), std::move(page));
 }
 
-void GlicUI::CreateFrePageHandler(
-    mojo::PendingReceiver<glic::mojom::FrePageHandler> receiver) {
-  fre_page_handler_ = std::make_unique<GlicFrePageHandler>(
-      web_ui()->GetWebContents(), std::move(receiver));
-}
-
 }  // namespace glic
diff --git a/chrome/browser/glic/glic_ui.h b/chrome/browser/glic/glic_ui.h
index cb7e607..1e32bc3 100644
--- a/chrome/browser/glic/glic_ui.h
+++ b/chrome/browser/glic/glic_ui.h
@@ -13,7 +13,6 @@
 
 namespace glic {
 class GlicPageHandler;
-class GlicFrePageHandler;
 class GlicUI;
 
 class GlicUIConfig : public content::DefaultWebUIConfig<GlicUI> {
@@ -43,13 +42,8 @@
       mojo::PendingReceiver<glic::mojom::PageHandler> receiver,
       mojo::PendingRemote<glic::mojom::Page> page) override;
 
-  void CreateFrePageHandler(
-      mojo::PendingReceiver<glic::mojom::FrePageHandler> receiver) override;
-
   std::unique_ptr<GlicPageHandler> page_handler_;
 
-  std::unique_ptr<GlicFrePageHandler> fre_page_handler_;
-
   mojo::Receiver<glic::mojom::PageHandlerFactory> page_factory_receiver_{this};
 
   static bool simulate_no_connection_;
diff --git a/chrome/browser/glic/glic_window_animator.cc b/chrome/browser/glic/glic_window_animator.cc
index 06f682fc..c6cb245 100644
--- a/chrome/browser/glic/glic_window_animator.cc
+++ b/chrome/browser/glic/glic_window_animator.cc
@@ -14,7 +14,9 @@
 
 namespace {
 
-constexpr static int kAnimationDurationMs = 300;
+constexpr static int kResizeAnimationDurationMs = 300;
+constexpr static int kAttachedWidgetOpacityDurationMs = 150;
+constexpr static int kDetachedWidgetOpacityDurationMs = 100;
 constexpr static SkColor kDefaultBackgroundColor =
     SkColorSetARGB(255, 27, 28, 29);
 constexpr static int kCornerRadius = 12;
@@ -22,6 +24,45 @@
 
 }  // namespace
 
+class GlicWindowAnimator::GlicWindowOpacityAnimation
+    : public gfx::LinearAnimation {
+ public:
+  GlicWindowOpacityAnimation(GlicWindowAnimator* window_animator,
+                             GlicWindowController* window_controller,
+                             base::TimeDelta duration,
+                             float start_opacity,
+                             float target_opacity)
+      : gfx::LinearAnimation(duration, kDefaultFrameRate, window_animator),
+        window_animator_(window_animator),
+        window_controller_(window_controller),
+        start_opacity_(start_opacity),
+        target_opacity_(target_opacity) {}
+
+  GlicWindowOpacityAnimation(const GlicWindowOpacityAnimation&) = delete;
+  GlicWindowOpacityAnimation& operator=(const GlicWindowOpacityAnimation&) =
+      delete;
+  ~GlicWindowOpacityAnimation() override = default;
+
+  // gfx::LinearAnimation:
+  void AnimateToState(double state) override {
+    window_controller_->GetGlicWidget()->SetOpacity(
+        gfx::Tween::FloatValueBetween(GetCurrentValue(), start_opacity_,
+                                      target_opacity_));
+  }
+
+  // gfx::LinearAnimation:
+  void AnimationEnded(const Animation* animation) {
+    // Destroys `this`.
+    window_animator_->FadeComplete();
+  }
+
+ private:
+  raw_ptr<GlicWindowAnimator> window_animator_;
+  raw_ptr<GlicWindowController> window_controller_;
+  const float start_opacity_;
+  const float target_opacity_;
+};
+
 GlicWindowAnimator::GlicWindowAnimator(GlicWindowController* window_controller)
     : window_controller_(window_controller) {}
 
@@ -38,14 +79,12 @@
   target_bounds.set_x(top_left_x);
   target_bounds.set_width(target_size.width());
   target_bounds.set_height(target_size.height());
+  SetRoundedRectBackground();
 
-  // TODO(crbug.com/389982576): Match the background color of the widget with
-  // the web client background.
-  window_controller_->GetGlicView()->SetBackground(
-      views::CreateRoundedRectBackground(kDefaultBackgroundColor,
-                                         kCornerRadius));
-
-  AnimateBounds(target_bounds, base::Milliseconds(kAnimationDurationMs),
+  // Fade in widget while resizing out.
+  AnimateOpacity(0.0f, 1.0f,
+                 base::Milliseconds(kAttachedWidgetOpacityDurationMs));
+  AnimateBounds(target_bounds, base::Milliseconds(kResizeAnimationDurationMs),
                 std::move(callback));
 }
 
@@ -53,15 +92,40 @@
   gfx::Rect target_bounds =
       window_controller_->GetGlicWidget()->GetWindowBoundsInScreen();
   target_bounds.set_y(target_bounds.y() + kInitialDetachedYPosition);
+  SetRoundedRectBackground();
 
+  // Fade in widget while animating down.
+  AnimateOpacity(0.0f, 1.0f,
+                 base::Milliseconds(kDetachedWidgetOpacityDurationMs));
+  AnimateBounds(target_bounds, base::Milliseconds(kResizeAnimationDurationMs),
+                std::move(callback));
+}
+
+void GlicWindowAnimator::RunCloseAnimation(GlicButton* glic_button,
+                                           base::OnceClosure callback) {
+  // The widget is going away so it's fine to replace any existing animation.
+  AnimateBounds(glic_button->GetBoundsWithInset(),
+                base::Milliseconds(kResizeAnimationDurationMs),
+                std::move(callback));
+}
+
+void GlicWindowAnimator::AnimateOpacity(float start_opacity,
+                                        float target_opacity,
+                                        base::TimeDelta duration) {
+  CHECK(window_controller_->GetGlicWidget());
+
+  window_controller_->GetGlicWidget()->SetOpacity(start_opacity);
+  opacity_animation_ = std::make_unique<GlicWindowOpacityAnimation>(
+      this, window_controller_, duration, start_opacity, target_opacity);
+  opacity_animation_->Start();
+}
+
+void GlicWindowAnimator::SetRoundedRectBackground() {
   // TODO(crbug.com/389982576): Match the background color of the widget with
   // the web client background.
   window_controller_->GetGlicView()->SetBackground(
       views::CreateRoundedRectBackground(kDefaultBackgroundColor,
                                          kCornerRadius));
-
-  AnimateBounds(target_bounds, base::Milliseconds(kAnimationDurationMs),
-                std::move(callback));
 }
 
 void GlicWindowAnimator::AnimateBounds(const gfx::Rect& target_bounds,
@@ -100,7 +164,6 @@
                                          base::TimeDelta duration,
                                          base::OnceClosure callback) {
   // Maintain the size whether there's an ongoing animation or not.
-
   gfx::Rect new_bounds = GetCurrentTargetBounds();
   new_bounds.set_origin(target_position);
   AnimateBounds(new_bounds, duration, std::move(callback));
@@ -120,4 +183,9 @@
   window_resize_animation_.reset();
 }
 
+void GlicWindowAnimator::FadeComplete() {
+  // Destroy opacity_animation_.
+  opacity_animation_.reset();
+}
+
 }  // namespace glic
diff --git a/chrome/browser/glic/glic_window_animator.h b/chrome/browser/glic/glic_window_animator.h
index 84ad176f..28b3ac8 100644
--- a/chrome/browser/glic/glic_window_animator.h
+++ b/chrome/browser/glic/glic_window_animator.h
@@ -35,13 +35,11 @@
   // Runs the detached open widget animation for the Glic widget.
   void RunOpenDetachedAnimation(base::OnceClosure callback);
 
-  // Sets target bounds for the widget (must exist) and creates a
-  // GlicWindowResizeAnimation instance to begin a new animation. If a bounds
-  // animation is already running, end it and start a new one. Duration is set
-  // to 0 if negative.
-  void AnimateBounds(const gfx::Rect& target_bounds,
-                     base::TimeDelta duration,
-                     base::OnceClosure callback);
+  // Runs the attached close animation for the Glic widget.
+  void RunCloseAnimation(GlicButton* glic_button, base::OnceClosure callback);
+
+  // Sets the background color and corner radius of the Glic widget.
+  void SetRoundedRectBackground();
 
   // Animate the window size, maintaining the position of the top right corner.
   // If there is already a running bounds change animation, update that
@@ -61,7 +59,25 @@
   // GlicWindowResizeAnimation.
   void ResizeFinished();
 
+  // Called when the opacity fading animation has finished. Public for use by
+  // GlicWindowOpacityAnimation.
+  void FadeComplete();
+
  private:
+  // Sets target bounds for the widget (must exist) and creates a
+  // GlicWindowResizeAnimation instance to begin a new animation. If a bounds
+  // animation is already running, end it and start a new one. Duration is set
+  // to 0 if negative.
+  void AnimateBounds(const gfx::Rect& target_bounds,
+                     base::TimeDelta duration,
+                     base::OnceClosure callback);
+
+  // Sets target opacity for the widget (must exist) and creates a
+  // GlicWindowOpacityAnimation instance to begin a new opacity animation.
+  void AnimateOpacity(float start_opacity,
+                      float target_opacity,
+                      base::TimeDelta duration);
+
   // Gets the bounds for the widget's resize animation. If there is an animation
   // already ongoing, use the target bounds for that animation. Otherwise, use
   // the widget's current bounds.
@@ -70,6 +86,10 @@
   // GlicWindowController owns GlicWindowAnimator and will outlive it
   const raw_ptr<GlicWindowController> window_controller_;
   std::unique_ptr<GlicWindowResizeAnimation> window_resize_animation_;
+
+  class GlicWindowOpacityAnimation;
+  std::unique_ptr<GlicWindowOpacityAnimation> opacity_animation_;
+
   base::WeakPtrFactory<GlicWindowAnimator> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/glic/glic_window_controller.cc b/chrome/browser/glic/glic_window_controller.cc
index 957da21e..b329b8a 100644
--- a/chrome/browser/glic/glic_window_controller.cc
+++ b/chrome/browser/glic/glic_window_controller.cc
@@ -33,6 +33,7 @@
 #include "chrome/browser/ui/views/tabs/glic_button.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_action_container.h"
 #include "chrome/browser/ui/views/tabs/window_finder.h"
+#include "chrome/common/chrome_features.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/display/screen.h"
 #include "ui/events/event_observer.h"
@@ -60,8 +61,6 @@
 constexpr static int kAttachmentBuffer = 20;
 constexpr static int kDetachYDistance = 36;
 
-constexpr static int kWidgetDefaultWidth = 300;
-constexpr static int kWidgetTopBarHeight = 48;
 constexpr static int kAnimationDurationMs = 300;
 
 constexpr char kHistogramGlicPanelPresentationTime[] =
@@ -88,6 +87,11 @@
       ->GetGlicButton();
 }
 
+gfx::Size GetWidgetInitialSize() {
+  return {features::kGlicInitialWidth.Get(),
+          features::kGlicInitialHeight.Get()};
+}
+
 }  // namespace
 
 // Helper class for observing mouse and key events from native window.
@@ -475,6 +479,12 @@
     OpenDetached();
   }
 
+  // Immediately hook up the WebView to the WebContents.
+  GetGlicView()->web_view()->SetWebContents(contents_->web_contents());
+
+  // TODO(sanaakbani): fade this in.
+  GetGlicView()->SetVisible(false);
+
   // If the web client is already initialized, wait for it to load in parallel.
   if (web_client_) {
     WaitForGlicToLoad();
@@ -488,7 +498,7 @@
 }
 
 gfx::Rect GlicWindowController::GetInitialDetachedBounds() {
-  gfx::Size widget_size(kWidgetDefaultWidth, kWidgetTopBarHeight);
+  gfx::Size widget_size = GetWidgetInitialSize();
   if (glic_size_) {
     widget_size = *glic_size_;
   }
@@ -521,7 +531,7 @@
   AttachToBrowser(browser);
 
   // Set target size for animation and run the open attached animation.
-  gfx::Size widget_size(kWidgetDefaultWidth, kWidgetTopBarHeight);
+  gfx::Size widget_size = GetWidgetInitialSize();
   if (glic_size_) {
     widget_size = *glic_size_;
   }
@@ -577,7 +587,11 @@
   if (state_ == State::kOpenAnimation) {
     state_ = State::kWaitingForGlicToLoad;
 
-    GetGlicView()->web_view()->SetWebContents(contents_->web_contents());
+    // Note: this logic may never be called if state_ != kOpenAnimation when the
+    // open animation is finished (or cancelled).
+    // TODO(sanaakbani): fade this in.
+    GetGlicView()->SetVisible(true);
+
     if (glic_loaded_) {
       ShowFinish();
     }
@@ -589,6 +603,8 @@
   if (state_ == State::kClosed || state_ == State::kOpen) {
     return;
   }
+  // TODO(sanaakbani): fade this in.
+  GetGlicView()->SetVisible(true);
   state_ = State::kOpen;
 
   // Record the presentation time of showing the glic panel in an UMA histogram.
@@ -623,7 +639,7 @@
 
   // Set the draggable area to the top bar of the window, by default.
   GetGlicView()->SetDraggableAreas(
-      {{0, 0, GetGlicView()->width(), kWidgetTopBarHeight}});
+      {{0, 0, GetGlicView()->width(), GetWidgetInitialSize().height()}});
   NotifyIfPanelStateChanged();
 }
 
@@ -837,14 +853,16 @@
 
   const bool reopen_detached = state_ == State::kClosingToReopenDetached;
 
+  // The webview should be faded out instead.
+  if (GetGlicView()) {
+    GetGlicView()->web_view()->SetWebContents(nullptr);
+  }
+
   if (attached_browser_) {
     state_ = State::kCloseAnimation;
-    GetGlicView()->web_view()->SetWebContents(nullptr);
     GlicButton* glic_button = GetGlicButton(*attached_browser_);
-    // The widget is going away so it's fine to replace any existing animation.
-    glic_window_animator_->AnimateBounds(
-        glic_button->GetBoundsWithInset(),
-        base::Milliseconds(kAnimationDurationMs),
+    glic_window_animator_->RunCloseAnimation(
+        glic_button,
         base::BindOnce(&GlicWindowController::CloseFinish, GetWeakPtr(),
                        reopen_detached, closing_to_reopen_detached_source_));
   } else {
@@ -1003,7 +1021,8 @@
     // Define attachment zone as the right of the tab strip. It either is the
     // width of the widget or 1/3 of the tab strip, whichever is smaller.
     gfx::Rect attachment_zone = tab_strip_region_view->GetBoundsInScreen();
-    int width = std::min(attachment_zone.width() / 3, kWidgetDefaultWidth);
+    int width =
+        std::min(attachment_zone.width() / 3, GetWidgetInitialSize().width());
     attachment_zone.SetByBounds(attachment_zone.right() - width,
                                 attachment_zone.y() - kAttachmentBuffer,
                                 attachment_zone.right() + kAttachmentBuffer,
@@ -1181,6 +1200,7 @@
   ForceClose();
   contents_.reset();
   fre_controller_->Shutdown();
+  window_activation_callback_list_.Notify(false);
 }
 
 void GlicWindowController::ResetPresentationTimingState() {
diff --git a/chrome/browser/glic/glic_window_controller_interactive_uitest.cc b/chrome/browser/glic/glic_window_controller_interactive_uitest.cc
index 1c213f4..c9b67a460 100644
--- a/chrome/browser/glic/glic_window_controller_interactive_uitest.cc
+++ b/chrome/browser/glic/glic_window_controller_interactive_uitest.cc
@@ -222,21 +222,22 @@
       SetOnIncompatibleAction(OnIncompatibleAction::kSkipTest,
                               kActivateSurfaceIncompatibilityNotice),
       ActivateSurface(kBrowserViewElementId), SimulateGlicHotkey(),
-      InAnyContext(WaitForShow(kGlicViewElementId)),
+      InAnyContext(WaitForShow(kGlicViewElementId).SetMustRemainVisible(false)),
       CheckControllerHasWidget(true),
       CheckControllerWidgetMode(GlicWindowMode::kAttached));
 }
 
 IN_PROC_BROWSER_TEST_F(GlicWindowControllerUiTest,
                        HotkeyDetachedWithNotNormalBrowser) {
-  RunTestSequence(Do([&]() {
-                    Browser* const pwa =
-                        CreateBrowserForApp("app name", browser()->profile());
-                    pwa->window()->Activate();
-                  }),
-                  SimulateGlicHotkey(),
-                  InAnyContext(WaitForShow(kGlicViewElementId)),
-                  CheckControllerWidgetMode(GlicWindowMode::kDetached));
+  RunTestSequence(
+      Do([&]() {
+        Browser* const pwa =
+            CreateBrowserForApp("app name", browser()->profile());
+        pwa->window()->Activate();
+      }),
+      SimulateGlicHotkey(),
+      InAnyContext(WaitForShow(kGlicViewElementId).SetMustRemainVisible(false)),
+      CheckControllerWidgetMode(GlicWindowMode::kDetached));
 }
 
 IN_PROC_BROWSER_TEST_F(GlicWindowControllerUiTest,
@@ -248,10 +249,11 @@
       ActivateSurface(kBrowserViewElementId));
   browser()->window()->Minimize();
   ASSERT_TRUE(ui_test_utils::WaitForMinimized(browser()));
-  RunTestSequence(SimulateGlicHotkey(),
-                  InAnyContext(WaitForShow(kGlicViewElementId)),
-                  CheckControllerHasWidget(true),
-                  CheckControllerWidgetMode(GlicWindowMode::kDetached));
+  RunTestSequence(
+      SimulateGlicHotkey(),
+      InAnyContext(WaitForShow(kGlicViewElementId).SetMustRemainVisible(false)),
+      CheckControllerHasWidget(true),
+      CheckControllerWidgetMode(GlicWindowMode::kDetached));
 }
 
 #if BUILDFLAG(IS_WIN)
@@ -277,10 +279,11 @@
       ->SetNativeWindowOcclusionState(aura::Window::OcclusionState::OCCLUDED,
                                       {});
 
-  RunTestSequence(SimulateGlicHotkey(),
-                  InAnyContext(WaitForShow(kGlicViewElementId)),
-                  CheckControllerHasWidget(true),
-                  CheckControllerWidgetMode(GlicWindowMode::kDetached));
+  RunTestSequence(
+      SimulateGlicHotkey(),
+      InAnyContext(WaitForShow(kGlicViewElementId).SetMustRemainVisible(false)),
+      CheckControllerHasWidget(true),
+      CheckControllerWidgetMode(GlicWindowMode::kDetached));
 }
 #endif  // BUILDFLAG(IS_WIN)
 
@@ -392,8 +395,10 @@
   ResetMemoryPressure();
   glic_service()->TryPreload();
   EXPECT_TRUE(window_controller().IsWarmed());
-  RunTestSequence(PressButton(kGlicButtonElementId),
-                  InAnyContext(WaitForShow(kGlicViewElementId)));
+  RunTestSequence(
+      PressButton(kGlicButtonElementId),
+      InAnyContext(
+          WaitForShow(kGlicViewElementId).SetMustRemainVisible(false)));
 }
 
 // These tests for dragging across multiple displays is for mac-only.
diff --git a/chrome/browser/glic/glic_window_resize_animation.cc b/chrome/browser/glic/glic_window_resize_animation.cc
index 1ef162d2..db2a36a 100644
--- a/chrome/browser/glic/glic_window_resize_animation.cc
+++ b/chrome/browser/glic/glic_window_resize_animation.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/glic/glic_window_animator.h"
 #include "chrome/browser/glic/glic_window_controller.h"
 #include "ui/gfx/animation/tween.h"
+#include "ui/views/background.h"
 #include "ui/views/widget/widget.h"
 
 #if BUILDFLAG(IS_MAC)
@@ -62,8 +63,9 @@
 
 void GlicWindowResizeAnimation::AnimateToState(double state) {
   window_controller_->GetGlicWidget()->SetBounds(gfx::Tween::RectValueBetween(
-      gfx::Tween::CalculateValue(gfx::Tween::EASE_IN_OUT_EMPHASIZED, state),
+      gfx::Tween::CalculateValue(gfx::Tween::FAST_OUT_SLOW_IN_3, state),
       initial_bounds_, new_bounds_));
+  glic_window_animator_->SetRoundedRectBackground();
   duration_left_ = (1 - GetCurrentValue()) * duration();
 }
 
diff --git a/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc b/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc
index aabf104..74a5887 100644
--- a/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc
+++ b/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc
@@ -5,15 +5,14 @@
 #include "chrome/browser/guest_view/chrome_guest_view_manager_delegate.h"
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/task_manager/web_contents_tags.h"
 #include "chrome/common/buildflags.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/app_mode/kiosk_chrome_app_manager.h"
 #include "chrome/browser/ash/app_mode/kiosk_controller.h"
 #include "chrome/browser/ash/app_mode/kiosk_system_session.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_GLIC)
 #include "chrome/browser/glic/guest_util.h"
@@ -34,7 +33,7 @@
   // manager.
   task_manager::WebContentsTags::CreateForGuestContents(guest_web_contents);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Notifies Kiosk controller about the added guest.
   ash::KioskController::Get().OnGuestAdded(guest_web_contents);
 #endif
diff --git a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc
index b0a05c3..4a1a51a 100644
--- a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc
+++ b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc
@@ -12,7 +12,6 @@
 #include "base/test/test_timeouts.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_interactive_uitest.cc b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_interactive_uitest.cc
index ac93728..1e5e4133 100644
--- a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_interactive_uitest.cc
+++ b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_interactive_uitest.cc
@@ -9,7 +9,6 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/run_until.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -118,14 +117,8 @@
 
 }  // namespace
 
-// TODO(crbug.com/40714227): Flaky under Lacros.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_EscapeExitsFullscreen DISABLED_EscapeExitsFullscreen
-#else
-#define MAYBE_EscapeExitsFullscreen EscapeExitsFullscreen
-#endif
 IN_PROC_BROWSER_TEST_F(ChromeMimeHandlerViewInteractiveUITest,
-                       MAYBE_EscapeExitsFullscreen) {
+                       EscapeExitsFullscreen) {
   // Use the testing subclass of MimeHandlerViewGuest.
   TestMimeHandlerViewGuest::RegisterTestGuestViewType(GetGuestViewManager());
 
diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.cc b/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.cc
index 7c0a991a..8fc01c9 100644
--- a/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.cc
+++ b/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.cc
@@ -78,6 +78,13 @@
   }
 }
 
+void DesktopSessionDurationTracker::EndSessionForTesting() {
+  if (!in_session_) {
+    StartSession();
+  }
+  EndSession(base::TimeDelta());
+}
+
 // static
 void DesktopSessionDurationTracker::CleanupForTesting() {
   DCHECK(g_desktop_session_duration_tracker_instance);
diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h b/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h
index 7d36a4cf..5cbdb6b 100644
--- a/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h
+++ b/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h
@@ -62,6 +62,9 @@
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
+  // Ends the session and saves session information into histograms.
+  void EndSessionForTesting();
+
   // Cleans up any global state for testing.
   static void CleanupForTesting();
 
diff --git a/chrome/browser/nacl_host/test/gdb_debug_stub_browsertest.cc b/chrome/browser/nacl_host/test/gdb_debug_stub_browsertest.cc
index a830bb2..f0399447 100644
--- a/chrome/browser/nacl_host/test/gdb_debug_stub_browsertest.cc
+++ b/chrome/browser/nacl_host/test/gdb_debug_stub_browsertest.cc
@@ -11,7 +11,6 @@
 #include "base/process/process.h"
 #include "base/strings/string_number_conversions.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/ppapi/ppapi_test.h"
 #include "components/nacl/browser/nacl_browser.h"
@@ -75,21 +74,18 @@
 #else
 # define MAYBE_Empty Empty
 #endif
-
 IN_PROC_BROWSER_TEST_F(NaClGdbDebugStubTest, MAYBE_Empty) {
   RunDebugStubTest("Empty", "continue");
 }
 
 #if defined(ADDRESS_SANITIZER)
 # define MAYBE_Breakpoint DISABLED_Breakpoint
-#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-    defined(ARCH_CPU_ARM_FAMILY)
+#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM_FAMILY)
 // Timing out on ARM linux: http://crbug.com/238469
 # define MAYBE_Breakpoint DISABLED_Breakpoint
 #else
 # define MAYBE_Breakpoint Breakpoint
 #endif
-
 IN_PROC_BROWSER_TEST_F(NaClGdbDebugStubTest, MAYBE_Breakpoint) {
   RunDebugStubTest("Empty", "breakpoint");
 }
diff --git a/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.cc b/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.cc
index d86b227..93d55fa 100644
--- a/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.cc
+++ b/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.cc
@@ -24,7 +24,8 @@
 
 ntp::calendar::mojom::CalendarEventPtr GetFakeEvent(
     int index,
-    CalendarType calendar_type) {
+    CalendarType calendar_type,
+    bool has_attachments_enabled) {
   ntp::calendar::mojom::CalendarEventPtr event =
       ntp::calendar::mojom::CalendarEvent::New();
   event->title = "Calendar Event " + base::NumberToString(index);
@@ -36,7 +37,7 @@
     ntp::calendar::mojom::AttachmentPtr attachment =
         ntp::calendar::mojom::Attachment::New();
     attachment->title = "Attachment " + base::NumberToString(i);
-    if (calendar_type != CalendarType::OUTLOOK_CALENDAR) {
+    if (has_attachments_enabled) {
       attachment->resource_url =
           GURL("https://foo.com/attachment" + base::NumberToString(i));
     }
@@ -53,10 +54,11 @@
 }
 
 std::vector<ntp::calendar::mojom::CalendarEventPtr> GetFakeEvents(
-    CalendarType calendar_type) {
+    CalendarType calendar_type,
+    bool has_attachments_enabled) {
   std::vector<ntp::calendar::mojom::CalendarEventPtr> events;
   for (int i = 0; i < 5; ++i) {
-    events.push_back(GetFakeEvent(i, calendar_type));
+    events.push_back(GetFakeEvent(i, calendar_type, has_attachments_enabled));
   }
   return events;
 }
diff --git a/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.h b/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.h
index f02748c..b91d7d2 100644
--- a/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.h
+++ b/chrome/browser/new_tab_page/modules/v2/calendar/calendar_fake_data_helper.h
@@ -20,7 +20,8 @@
 using GetResponseCallback = base::OnceCallback<void(std::string)>;
 
 std::vector<ntp::calendar::mojom::CalendarEventPtr> GetFakeEvents(
-    CalendarType calendar_type);
+    CalendarType calendar_type,
+    bool has_attachments_enabled);
 
 // Should only be called for CalendarType::OUTLOOK_CALENDAR.
 std::unique_ptr<std::string> GetFakeJsonResponse();
diff --git a/chrome/browser/new_tab_page/modules/v2/calendar/google_calendar_page_handler.cc b/chrome/browser/new_tab_page/modules/v2/calendar/google_calendar_page_handler.cc
index 48c72d2..7067398 100644
--- a/chrome/browser/new_tab_page/modules/v2/calendar/google_calendar_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/v2/calendar/google_calendar_page_handler.cc
@@ -153,7 +153,8 @@
       ntp_features::kNtpCalendarModuleDataParam);
   if (!fake_data_param.empty()) {
     std::move(callback).Run(calendar::calendar_fake_data_helper::GetFakeEvents(
-        calendar::calendar_fake_data_helper::CalendarType::GOOGLE_CALENDAR));
+        calendar::calendar_fake_data_helper::CalendarType::GOOGLE_CALENDAR,
+        /*has_attachments_enabled=*/true));
   } else {
     std::vector<google_apis::calendar::EventType> event_types = {
         google_apis::calendar::EventType::kDefault};
diff --git a/chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar_page_handler.cc b/chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar_page_handler.cc
index 8708b611..fcd7b5e2 100644
--- a/chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar_page_handler.cc
@@ -249,8 +249,10 @@
       ntp_features::kNtpOutlookCalendarModule,
       ntp_features::kNtpOutlookCalendarModuleDataParam);
   if (!fake_data_param.empty()) {
+    bool has_attachments_enabled = fake_data_param == "fake-attachments";
     std::move(callback).Run(calendar::calendar_fake_data_helper::GetFakeEvents(
-        calendar::calendar_fake_data_helper::CalendarType::OUTLOOK_CALENDAR));
+        calendar::calendar_fake_data_helper::CalendarType::OUTLOOK_CALENDAR,
+        has_attachments_enabled));
   } else {
     MakeRequest(std::move(callback));
   }
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationWrapperCompatBuilder.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationWrapperCompatBuilder.java
index 40d2aaa..1609776 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationWrapperCompatBuilder.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationWrapperCompatBuilder.java
@@ -9,6 +9,8 @@
 
 import androidx.core.app.NotificationCompat;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.notifications.NotificationMetadata;
 import org.chromium.components.browser_ui.notifications.NotificationWrapperBuilder;
 import org.chromium.components.browser_ui.notifications.NotificationWrapperCompatBuilder;
@@ -19,12 +21,13 @@
  * Extends the base NotificationWrapperCompatBuilder to add UMA by way of {@link
  * NotificationIntentInterceptor}.
  */
+@NullMarked
 public class ChromeNotificationWrapperCompatBuilder extends NotificationWrapperCompatBuilder {
     ChromeNotificationWrapperCompatBuilder(
             Context context,
             String channelId,
             ChannelsInitializer channelsInitializer,
-            NotificationMetadata metadata) {
+            @Nullable NotificationMetadata metadata) {
         super(context, channelId, channelsInitializer, metadata);
         if (metadata != null) {
             getBuilder()
@@ -34,7 +37,8 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setContentIntent(PendingIntentProvider contentIntent) {
+    public NotificationWrapperBuilder setContentIntent(
+            @Nullable PendingIntentProvider contentIntent) {
         PendingIntent pendingIntent =
                 NotificationIntentInterceptor.createInterceptPendingIntent(
                         NotificationIntentInterceptor.IntentType.CONTENT_INTENT,
@@ -76,7 +80,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setDeleteIntent(PendingIntentProvider intent) {
+    public NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntentProvider intent) {
         return setDeleteIntent(
                 NotificationIntentInterceptor.createInterceptPendingIntent(
                         NotificationIntentInterceptor.IntentType.DELETE_INTENT,
@@ -87,7 +91,8 @@
 
     @Override
     public NotificationWrapperBuilder setDeleteIntent(
-            PendingIntentProvider intent, @NotificationUmaTracker.ActionType int actionType) {
+            @Nullable PendingIntentProvider intent,
+            @NotificationUmaTracker.ActionType int actionType) {
         // As `actionType` will be part of the `requestCode` that `NotificationIntentInterceptor`
         // generates, the below wrapper `PendingIntent` will not be `Intent.filterEquals` to the
         // one above.
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java
index 32571ade..7b7c603 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.notifications;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -18,11 +20,12 @@
 import android.os.Bundle;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.app.NotificationCompat;
 import androidx.core.graphics.drawable.IconCompat;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.notifications.NotificationMetadata;
 import org.chromium.components.browser_ui.notifications.NotificationWrapper;
 import org.chromium.components.browser_ui.notifications.NotificationWrapperBuilder;
@@ -36,6 +39,7 @@
 import java.util.List;
 
 /** Abstract base class for building a notification. Stores all given arguments for later use. */
+@NullMarked
 public abstract class NotificationBuilderBase {
     protected static class Action {
         @IntDef({Type.BUTTON, Type.TEXT})
@@ -52,14 +56,14 @@
         }
 
         public int iconId;
-        public Bitmap iconBitmap;
-        public CharSequence title;
+        public @Nullable Bitmap iconBitmap;
+        public @Nullable CharSequence title;
         public PendingIntentProvider intent;
         public @Type int type;
         public @NotificationUmaTracker.ActionType int umaActionType;
 
         /** If the action.type is TEXT, this corresponds to the placeholder text for the input. */
-        public String placeholder;
+        public @Nullable String placeholder;
 
         Action(
                 int iconId,
@@ -78,10 +82,10 @@
 
         Action(
                 int iconId,
-                CharSequence title,
+                @Nullable CharSequence title,
                 PendingIntentProvider intent,
                 @Type int type,
-                String placeholder,
+                @Nullable String placeholder,
                 @NotificationUmaTracker.ActionType int umaActionType) {
             this.iconId = iconId;
             this.title = title;
@@ -92,11 +96,11 @@
         }
 
         Action(
-                Bitmap iconBitmap,
-                CharSequence title,
+                @Nullable Bitmap iconBitmap,
+                @Nullable CharSequence title,
                 PendingIntentProvider intent,
                 @Type int type,
-                String placeholder) {
+                @Nullable String placeholder) {
             this.iconBitmap = iconBitmap;
             this.title = title;
             this.intent = intent;
@@ -129,31 +133,31 @@
     private final int mLargeIconHeightPx;
     private final RoundedIconGenerator mIconGenerator;
 
-    protected CharSequence mTitle;
-    protected CharSequence mBody;
-    protected CharSequence mOrigin;
-    protected String mChannelId;
-    protected CharSequence mTickerText;
-    protected Bitmap mImage;
+    protected @Nullable CharSequence mTitle;
+    protected @Nullable CharSequence mBody;
+    protected @Nullable CharSequence mOrigin;
+    protected @Nullable String mChannelId;
+    protected @Nullable CharSequence mTickerText;
+    protected @Nullable Bitmap mImage;
 
     protected int mSmallIconId;
-    @Nullable protected Bitmap mSmallIconBitmapForStatusBar;
-    @Nullable protected Bitmap mSmallIconBitmapForContent;
-    @Nullable protected Bundle mExtras;
+    protected @Nullable Bitmap mSmallIconBitmapForStatusBar;
+    protected @Nullable Bitmap mSmallIconBitmapForContent;
+    protected @Nullable Bundle mExtras;
 
-    protected PendingIntentProvider mContentIntent;
-    protected PendingIntentProvider mDeleteIntent;
+    protected @Nullable PendingIntentProvider mContentIntent;
+    protected @Nullable PendingIntentProvider mDeleteIntent;
     protected @NotificationUmaTracker.ActionType int mDeleteIntentActionType =
             NotificationUmaTracker.ActionType.UNKNOWN;
     protected List<Action> mActions = new ArrayList<>(MAX_AUTHOR_PROVIDED_ACTION_BUTTONS);
     protected List<Action> mSettingsActions = new ArrayList<>(1);
     protected int mDefaults;
-    protected long[] mVibratePattern;
+    protected long @Nullable [] mVibratePattern;
     protected boolean mSilent;
     protected long mTimestamp;
     protected boolean mRenotify;
     protected int mPriority;
-    private Bitmap mLargeIcon;
+    private @Nullable Bitmap mLargeIcon;
     private boolean mSuppressShowingLargeIcon;
     protected long mTimeoutAfterMs;
 
@@ -257,7 +261,7 @@
     private static @Nullable Bitmap applyWhiteOverlay(@Nullable Bitmap icon) {
         Bitmap whitened = null;
         if (icon != null) {
-            whitened = icon.copy(icon.getConfig(), /* isMutable= */ true);
+            whitened = icon.copy(assumeNonNull(icon.getConfig()), /* isMutable= */ true);
             applyWhiteOverlayToBitmap(whitened);
         }
         return whitened;
@@ -330,7 +334,7 @@
     }
 
     /** Sets the channel id of the notification. */
-    public NotificationBuilderBase setChannelId(String channelId) {
+    public NotificationBuilderBase setChannelId(@Nullable String channelId) {
         mChannelId = channelId;
         return this;
     }
@@ -455,7 +459,7 @@
      *
      * <p>See {@link NotificationBuilderBase#ensureNormalizedIcon} for more details.
      */
-    protected Bitmap getNormalizedLargeIcon() {
+    protected @Nullable Bitmap getNormalizedLargeIcon() {
         if (mSuppressShowingLargeIcon) {
             return null;
         }
@@ -474,7 +478,8 @@
      * @return An appropriately sized icon to use for the notification.
      */
     @VisibleForTesting
-    public Bitmap ensureNormalizedIcon(Bitmap icon, CharSequence origin) {
+    public @Nullable Bitmap ensureNormalizedIcon(
+            @Nullable Bitmap icon, @Nullable CharSequence origin) {
         if (icon == null || icon.getWidth() == 0) {
             return origin != null
                     ? mIconGenerator.generateIconForUrl(origin.toString(), true)
@@ -491,7 +496,8 @@
      * Creates a public version of the notification to be displayed in sensitive contexts, such as
      * on the lockscreen, displaying just the site origin and badge or generated icon.
      */
-    protected Notification createPublicNotification(Context context) {
+    protected @Nullable Notification createPublicNotification(Context context) {
+        assumeNonNull(mChannelId);
         NotificationWrapperBuilder builder =
                 NotificationWrapperBuilderFactory.createNotificationWrapperBuilder(mChannelId)
                         .setContentText(context.getString(R.string.notification_hidden_text))
@@ -503,7 +509,7 @@
             // The Icon class was added in Android M.
             Bitmap publicIcon =
                     mSmallIconBitmapForStatusBar.copy(
-                            mSmallIconBitmapForStatusBar.getConfig(), true);
+                            assumeNonNull(mSmallIconBitmapForStatusBar.getConfig()), true);
             builder.setSmallIcon(Icon.createWithBitmap(publicIcon));
         }
         return builder.build();
@@ -565,7 +571,8 @@
      * this notification is built and posted, a further summary notification must be posted for
      * notifications in the group to appear grouped in the notification shade.
      */
-    static void setGroupOnBuilder(NotificationWrapperBuilder builder, CharSequence origin) {
+    static void setGroupOnBuilder(
+            NotificationWrapperBuilder builder, @Nullable CharSequence origin) {
         if (origin == null) return;
         builder.setGroup(NotificationConstants.GROUP_WEB_PREFIX + origin);
         // TODO(crbug.com/40498483) Post a group summary notification.
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
index 3a25500..b8907e0 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
@@ -4,7 +4,10 @@
 
 package org.chromium.chrome.browser.notifications;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Constants used in more than a single Notification class, e.g. intents and extra names. */
+@NullMarked
 public class NotificationConstants {
     // These actions have to be synchronized with the receiver defined in AndroidManifest.xml.
     static final String ACTION_CLICK_NOTIFICATION =
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java
index 91c2424..f68942f 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.notifications;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+
 import android.app.Activity;
 import android.app.Notification;
 import android.app.PendingIntent;
@@ -15,13 +17,14 @@
 import android.view.MotionEvent;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
 import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.components.browser_ui.notifications.NotificationMetadata;
 import org.chromium.components.browser_ui.notifications.PendingIntentProvider;
@@ -35,6 +38,7 @@
  * Notification#contentIntent}, {@link Notification.Action#actionIntent} and {@link
  * Notification#deleteIntent} with broadcast receivers.
  */
+@NullMarked
 public class NotificationIntentInterceptor {
     private static final String TAG = "IntentInterceptor";
     private static final String EXTRA_PENDING_INTENT =
@@ -83,8 +87,8 @@
 
     public static final class ServiceImpl extends NotificationIntentInterceptorService.Impl {
         @Override
-        protected void onHandleIntent(Intent intent) {
-            processIntent(intent);
+        protected void onHandleIntent(@Nullable Intent intent) {
+            processIntent(assertNonNull(intent));
         }
     }
 
@@ -352,7 +356,7 @@
     }
 
     /** Allows tests to read pending intent with the private extra name. */
-    public static PendingIntent getPendingIntentForTesting(Intent trampolineIntent) {
+    public static @Nullable PendingIntent getPendingIntentForTesting(Intent trampolineIntent) {
         return trampolineIntent.getParcelableExtra(EXTRA_PENDING_INTENT);
     }
 }
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSettingsBridge.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSettingsBridge.java
index e481fe5..a14a2192 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSettingsBridge.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSettingsBridge.java
@@ -11,12 +11,14 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
 import org.chromium.components.url_formatter.SchemeDisplay;
 import org.chromium.components.url_formatter.UrlFormatter;
 
 /** Interface for native code to interact with Android notification channels. */
+@NullMarked
 public class NotificationSettingsBridge {
     /**
      * Creates a notification channel for the given origin, unless a channel for this origin already
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSystemStatusUtil.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSystemStatusUtil.java
index ea1aa77..3f4d498 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSystemStatusUtil.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationSystemStatusUtil.java
@@ -9,6 +9,7 @@
 import org.jni_zero.CalledByNative;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.notifications.NotificationProxyUtils;
 
 /**
@@ -20,6 +21,7 @@
  * Chrome, which is obviously very bad. While we have a strong focus on providing clear attribution
  * and ways of revoking notifications for a particular website, measuring this is still important.
  */
+@NullMarked
 public class NotificationSystemStatusUtil {
     // Status codes returned by {@link #getAppNotificationStatus}.
     static final int APP_NOTIFICATIONS_STATUS_UNDETERMINABLE = 0;
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
index b06b1d52d..0437e75 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
@@ -8,7 +8,6 @@
 import android.text.format.DateUtils;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.app.NotificationManagerCompat;
 
@@ -17,6 +16,8 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
 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.channels.ChromeChannelDefinitions;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
@@ -31,6 +32,7 @@
  * Helper class to make tracking notification UMA stats easier for various features. Having a single
  * entry point here to make more complex tracking easier to add in the future.
  */
+@NullMarked
 public class NotificationUmaTracker {
     /*
      * A list of notification types.  To add a type to this list please update
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationWrapperBuilderFactory.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationWrapperBuilderFactory.java
index ebfc8032..868aeca 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationWrapperBuilderFactory.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationWrapperBuilderFactory.java
@@ -6,9 +6,9 @@
 
 import android.content.Context;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.ContextUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions;
 import org.chromium.components.browser_ui.notifications.NotificationManagerProxyImpl;
 import org.chromium.components.browser_ui.notifications.NotificationMetadata;
@@ -19,6 +19,7 @@
  * Factory which supplies the appropriate type of notification builder based on Android version.
  * Should be used for all notifications we create, to ensure a notification channel is set on O.
  */
+@NullMarked
 public class NotificationWrapperBuilderFactory {
     /**
      * Creates a NotificationCompat.Builder under the hood, wrapped in our own interface, and
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
index 20b526cd..a3d838f 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
@@ -4,13 +4,17 @@
 
 package org.chromium.chrome.browser.notifications;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.notifications.NotificationMetadata;
 import org.chromium.components.browser_ui.notifications.NotificationWrapper;
 import org.chromium.components.browser_ui.notifications.NotificationWrapperBuilder;
 
 /** Builds a notification using the standard Notification.BigTextStyle layout. */
+@NullMarked
 public class StandardNotificationBuilder extends NotificationBuilderBase {
     private final Context mContext;
 
@@ -23,7 +27,7 @@
     public NotificationWrapper build(NotificationMetadata metadata) {
         NotificationWrapperBuilder builder =
                 NotificationWrapperBuilderFactory.createNotificationWrapperBuilder(
-                        mChannelId, metadata);
+                        assumeNonNull(mChannelId), metadata);
 
         builder.setContentTitle(mTitle);
         builder.setContentText(mBody);
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/TrampolineActivityTracker.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/TrampolineActivityTracker.java
index 4aa27b6..cf180b0c 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/TrampolineActivityTracker.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/TrampolineActivityTracker.java
@@ -14,6 +14,8 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.TimeUtils;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 
 import java.lang.annotation.Retention;
@@ -30,16 +32,17 @@
  * notification, it should inform this class about the corresponding job ID. The timeout will then
  * be set to the latest remaining job that is expected to finish.
  */
+@NullMarked
 public class TrampolineActivityTracker {
 
     @SuppressLint("StaticFieldLeak")
-    private static TrampolineActivityTracker sInstance;
+    private static @Nullable TrampolineActivityTracker sInstance;
 
     private final Runnable mRunnable;
     private final Map<String, Long> mEstimatedJobCompletionTimeMap = new HashMap<>();
 
     private boolean mNativeInitialized;
-    private Activity mTrackedActivity;
+    private @Nullable Activity mTrackedActivity;
 
     // Number of activities waiting for notification intent handling.
     private Handler mHandler;
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelsUpdater.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelsUpdater.java
index 0766a226..181fb923 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelsUpdater.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChannelsUpdater.java
@@ -4,17 +4,18 @@
 
 package org.chromium.chrome.browser.notifications.channels;
 
-
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.shared_preferences.SharedPreferencesManager;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
 import org.chromium.components.browser_ui.notifications.BaseNotificationManagerProxyFactory;
 import org.chromium.components.browser_ui.notifications.channels.ChannelsInitializer;
 
 /** Contains helper methods for checking if we should update channels and updating them if so. */
+@NullMarked
 public class ChannelsUpdater {
     private static final Object sLock = new Object();
 
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java
index 5bed1dc..a1a50693 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java
@@ -12,6 +12,8 @@
 
 import androidx.annotation.StringDef;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.notifications.R;
 import org.chromium.components.browser_ui.notifications.NotificationManagerProxy;
 import org.chromium.components.browser_ui.notifications.NotificationManagerProxyImpl;
@@ -39,6 +41,7 @@
  * <br>
  * See the README.md in this directory for more information before adding or changing any channels.
  */
+@NullMarked
 public class ChromeChannelDefinitions extends ChannelDefinitions {
     /**
      * Version number identifying the current set of channels. This must be incremented whenever the
@@ -432,12 +435,12 @@
     }
 
     @Override
-    public PredefinedChannelGroup getChannelGroup(@ChannelGroupId String groupId) {
+    public @Nullable PredefinedChannelGroup getChannelGroup(@ChannelGroupId String groupId) {
         return PredefinedChannelGroups.MAP.get(groupId);
     }
 
     @Override
-    public PredefinedChannel getChannelFromId(@ChannelId String channelId) {
+    public @Nullable PredefinedChannel getChannelFromId(@ChannelId String channelId) {
         return PredefinedChannels.MAP.get(channelId);
     }
 
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/LocaleChangedBroadcastReceiver.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/LocaleChangedBroadcastReceiver.java
index 8413182..e63eb558 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/LocaleChangedBroadcastReceiver.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/LocaleChangedBroadcastReceiver.java
@@ -10,8 +10,10 @@
 
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
 
 /** Triggered when Android's locale changes. */
+@NullMarked
 public class LocaleChangedBroadcastReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java
index e6c815a..d37fe70c 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java
@@ -4,16 +4,19 @@
 
 package org.chromium.chrome.browser.notifications.channels;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
 import android.app.NotificationManager;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.notifications.NotificationChannelStatus;
 import org.chromium.chrome.browser.notifications.NotificationSettingsBridge.SiteChannel;
 import org.chromium.components.browser_ui.notifications.NotificationManagerProxyImpl;
@@ -23,11 +26,12 @@
 import java.util.List;
 
 /** Creates/deletes and queries our notification channels for websites. */
+@NullMarked
 public class SiteChannelsManager {
     private static final String CHANNEL_ID_PREFIX_SITES = "web:";
     private static final String CHANNEL_ID_SEPARATOR = ";";
 
-    private static SiteChannelsManager sInstance;
+    private static @Nullable SiteChannelsManager sInstance;
 
     public static SiteChannelsManager getInstance() {
         if (sInstance == null) {
@@ -62,8 +66,10 @@
 
         // Channel group must be created before the channel.
         NotificationChannelGroup channelGroup =
-                ChromeChannelDefinitions.getInstance()
-                        .getChannelGroup(ChromeChannelDefinitions.ChannelGroupId.SITES)
+                assumeNonNull(
+                                ChromeChannelDefinitions.getInstance()
+                                        .getChannelGroup(
+                                                ChromeChannelDefinitions.ChannelGroupId.SITES))
                         .toNotificationChannelGroup(
                                 ContextUtils.getApplicationContext().getResources());
         NotificationManagerProxyImpl.getInstance().createNotificationChannelGroup(channelGroup);
@@ -81,7 +87,7 @@
     }
 
     private @Nullable SiteChannel getSiteChannelForOrigin(String origin) {
-        String normalizedOrigin = WebsiteAddress.create(origin).getOrigin();
+        String normalizedOrigin = assumeNonNull(WebsiteAddress.create(origin)).getOrigin();
         for (SiteChannel channel : getSiteChannels()) {
             if (channel.getOrigin().equals(normalizedOrigin)) {
                 return channel;
@@ -154,7 +160,7 @@
     @VisibleForTesting
     public static String createChannelId(String origin, long creationTime) {
         return CHANNEL_ID_PREFIX_SITES
-                + WebsiteAddress.create(origin).getOrigin()
+                + assumeNonNull(WebsiteAddress.create(origin)).getOrigin()
                 + CHANNEL_ID_SEPARATOR
                 + creationTime;
     }
@@ -183,10 +189,11 @@
         SiteChannel channel = getSiteChannelForOrigin(origin);
         // Fall back to generic Sites channel if a channel for this origin doesn't exist.
         // TODO(crbug.com/40558363) Stop using this channel as a fallback and fully deprecate it.
-        boolean fallbackToSitesChannel = channel == null;
-        if (fallbackToSitesChannel) {
+        if (channel != null) {
+            return channel.getId();
+        } else {
             RecordHistogram.recordBooleanHistogram("Notifications.Android.SitesChannel", true);
+            return ChromeChannelDefinitions.ChannelId.SITES;
         }
-        return fallbackToSitesChannel ? ChromeChannelDefinitions.ChannelId.SITES : channel.getId();
     }
 }
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionChangeReceiver.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionChangeReceiver.java
index 1a10b9f..bf6e08b 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionChangeReceiver.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionChangeReceiver.java
@@ -9,6 +9,7 @@
 import android.content.Context;
 import android.content.Intent;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.components.browser_ui.notifications.NotificationProxyUtils;
 
@@ -16,6 +17,7 @@
  * A {@link android.content.BroadcastReceiver} that detects when our App level notifications are
  * blocked or unblocked via the settings menu. When this happens we record a metric.
  */
+@NullMarked
 public class NotificationPermissionChangeReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
index f753c008..76d425f9 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
@@ -9,7 +9,6 @@
 import android.os.Build;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.BuildInfo;
@@ -18,6 +17,8 @@
 import org.chromium.base.UnownedUserData;
 import org.chromium.base.UnownedUserDataKey;
 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.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker.NotificationPermissionState;
@@ -36,6 +37,7 @@
  * Central class containing the logic for when to trigger notification permission request optionally
  * with a rationale.
  */
+@NullMarked
 public class NotificationPermissionController implements UnownedUserData {
     /** Field trial param controlling rationale behavior. */
     public static final String FIELD_TRIAL_ALWAYS_SHOW_RATIONALE_BEFORE_REQUESTING_PERMISSION =
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleBottomSheet.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleBottomSheet.java
index 680c38d..83e443c 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleBottomSheet.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleBottomSheet.java
@@ -10,9 +10,10 @@
 import android.view.ViewGroup.LayoutParams;
 import android.widget.Button;
 
-import androidx.annotation.NonNull;
-
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.NullUnmarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker.NotificationRationaleResult;
 import org.chromium.chrome.browser.notifications.R;
@@ -25,13 +26,14 @@
 import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver;
 
 /** Bottom sheet to explain the advantages of Chrome notifications. */
+@NullMarked
 public class NotificationPermissionRationaleBottomSheet
         implements RationaleDelegate, BottomSheetContent {
     private final BottomSheetController mBottomSheetController;
     private final Context mContext;
-    private Callback<Integer> mResponseCallback;
+    private @Nullable Callback<Integer> mResponseCallback;
     private final BottomSheetObserver mBottomSheetObserver;
-    private View mContentView;
+    private @Nullable View mContentView;
     private boolean mWasSheetOpened;
 
     public NotificationPermissionRationaleBottomSheet(
@@ -147,12 +149,13 @@
 
     /* BottomSheetContent implementation. */
     @Override
+    @NullUnmarked
     public View getContentView() {
         return mContentView;
     }
 
     @Override
-    public View getToolbarView() {
+    public @Nullable View getToolbarView() {
         return null;
     }
 
@@ -201,7 +204,7 @@
     }
 
     @Override
-    public @NonNull String getSheetContentDescription(Context context) {
+    public String getSheetContentDescription(Context context) {
         return context.getString(R.string.notification_permission_rationale_content_description);
     }
 
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleDialogController.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleDialogController.java
index 1f18f1b..e664d90f 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleDialogController.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionRationaleDialogController.java
@@ -10,6 +10,7 @@
 import android.view.View;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker.NotificationRationaleResult;
 import org.chromium.chrome.browser.notifications.R;
@@ -24,6 +25,7 @@
 import org.chromium.ui.modelutil.PropertyModel;
 
 /** Dialog to explain the advantages of Chrome notifications. */
+@NullMarked
 public class NotificationPermissionRationaleDialogController implements RationaleDelegate {
     private final ModalDialogManager mModalDialogManager;
     private final Context mContext;
diff --git a/chrome/browser/on_device_translation/on_device_translation_browsertest.cc b/chrome/browser/on_device_translation/on_device_translation_browsertest.cc
index 838d68f2..79540e69 100644
--- a/chrome/browser/on_device_translation/on_device_translation_browsertest.cc
+++ b/chrome/browser/on_device_translation/on_device_translation_browsertest.cc
@@ -1422,6 +1422,51 @@
   TestLanguagePairAvailable(browser(), "en", "en", "no");
 }
 
+// Test the behavior of `ai.translator.availability()` for translations
+// containing English + a preferred language.
+IN_PROC_BROWSER_TEST_F(OnDeviceTranslationBrowserTest,
+                       TranslatorAvailabilityPreferredLanguages) {
+  SetSelectedLanguages("ja,fr");
+  MockComponentManager mock_component_manager(GetTempDir());
+  mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Ja);
+  NavigateToEmptyPage();
+
+  // Translation is not available until the Language Kit is downloaded.
+  TestTranslationAvailable(browser(), "ja", "en", "downloadable");
+  mock_component_manager.InstallMockTranslateKitComponent();
+  TestTranslationAvailable(browser(), "ja", "en", "available");
+
+  // Translation availability requires download of all required language packs.
+  TestTranslationAvailable(browser(), "ja", "fr", "downloadable");
+  mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Fr);
+  TestTranslationAvailable(browser(), "ja", "fr", "available");
+}
+
+// Test the behavior of `ai.translator.availability()` for a translation
+// containing a language outside of English + the user's preferred languages.
+IN_PROC_BROWSER_TEST_F(OnDeviceTranslationBrowserTest,
+                       TranslatorAvailabilityNonPreferredLanguages) {
+  SetSelectedLanguages("fr");
+  MockComponentManager mock_component_manager(GetTempDir());
+  mock_component_manager.InstallMockTranslateKitComponent();
+  mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Fr);
+  NavigateToEmptyPage();
+
+  // Translation is not available for unsupported languages.
+  TestTranslationAvailable(browser(), "fr", "abcxyz", "unavailable");
+
+  // The Japanese language pack needs to be downloaded in order for
+  // translation between Japanese and French to be available.
+  TestTranslationAvailable(browser(), "ja", "fr", "downloadable");
+
+  // Even if all required language packs are installed, the
+  // Japanese <-> French translation availability status remains
+  // "downloadable" because Japanese is not included in English +
+  // preferred languages.
+  mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Ja);
+  TestTranslationAvailable(browser(), "ja", "fr", "downloadable");
+}
+
 // Test that calling both the legacy and new API works.
 // This is a regression test for https://crbug.com/381344025.
 IN_PROC_BROWSER_TEST_F(OnDeviceTranslationBrowserTest, UseBothLegacyAndNewAPI) {
diff --git a/chrome/browser/on_device_translation/test/test_util.cc b/chrome/browser/on_device_translation/test/test_util.cc
index b9c9116..6aef19d5 100644
--- a/chrome/browser/on_device_translation/test/test_util.cc
+++ b/chrome/browser/on_device_translation/test/test_util.cc
@@ -258,4 +258,28 @@
             result);
 }
 
+// Tests that the capabilities availability() method returns the expected
+// result for the given languages.
+void TestTranslationAvailable(Browser* browser,
+                              const std::string_view sourceLang,
+                              const std::string_view targetLang,
+                              const std::string_view result) {
+  ASSERT_EQ(EvalJs(browser->tab_strip_model()->GetActiveWebContents(),
+                   base::StringPrintf(R"(
+  (async () => {
+    try {
+      return await ai.translator.availability({
+          sourceLanguage: '%s',
+          targetLanguage: '%s',
+        });
+    } catch (e) {
+      return e.toString();
+    }
+    })();
+  )",
+                                      sourceLang, targetLang))
+                .ExtractString(),
+            result);
+}
+
 }  // namespace on_device_translation
diff --git a/chrome/browser/on_device_translation/test/test_util.h b/chrome/browser/on_device_translation/test/test_util.h
index b9bcfa5..55ad799 100644
--- a/chrome/browser/on_device_translation/test/test_util.h
+++ b/chrome/browser/on_device_translation/test/test_util.h
@@ -136,6 +136,13 @@
                                const std::string_view targetLang,
                                const std::string_view result);
 
+// Tests that the AITranslatorCapabilities.languagePairAvailable() returns the
+// expected result.
+void TestTranslationAvailable(Browser* browser,
+                              const std::string_view sourceLang,
+                              const std::string_view targetLang,
+                              const std::string_view result);
+
 }  // namespace on_device_translation
 
 #endif  // CHROME_BROWSER_ON_DEVICE_TRANSLATION_TEST_TEST_UTIL_H_
diff --git a/chrome/browser/on_device_translation/translation_manager_impl.cc b/chrome/browser/on_device_translation/translation_manager_impl.cc
index 0408302d..ff2277a0 100644
--- a/chrome/browser/on_device_translation/translation_manager_impl.cc
+++ b/chrome/browser/on_device_translation/translation_manager_impl.cc
@@ -404,4 +404,51 @@
   return *service_controller_;
 }
 
+void TranslationManagerImpl::TranslationAvailable(
+    const std::string& source_language,
+    const std::string& target_language,
+    TranslationAvailableCallback callback) {
+  CHECK(browser_context_);
+  RecordTranslationAPICallForLanguagePair("Availability", source_language,
+                                          target_language);
+
+  PrefService* profile_pref =
+      Profile::FromBrowserContext(browser_context_.get())->GetPrefs();
+
+  if (!profile_pref->GetBoolean(prefs::kTranslatorAPIAllowed)) {
+    std::move(callback).Run(
+        blink::mojom::CanCreateTranslatorResult::kNoDisallowedByPolicy);
+    return;
+  }
+
+  const std::vector<std::string_view> accept_languages = base::SplitStringPiece(
+      profile_pref->GetString(language::prefs::kAcceptLanguages), ",",
+      base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+  bool mask_readily_result =
+      (source_language != "en" &&
+       !IsInAcceptLanguage(accept_languages, source_language)) ||
+      (target_language != "en" &&
+       !IsInAcceptLanguage(accept_languages, target_language));
+
+  GetServiceController().CanTranslate(
+      source_language, target_language,
+      base::BindOnce(
+          [](bool mask_readily_result, TranslationAvailableCallback callback,
+             blink::mojom::CanCreateTranslatorResult result) {
+            if (result == blink::mojom::CanCreateTranslatorResult::kReadily &&
+                mask_readily_result) {
+              // TODO(crbug.com/392073246): For translations containing a
+              // language outside of English + the user's preferred (accept)
+              // languages, check if a translator exists for the given origin
+              // before returning the "readily" availability value for the
+              // translation, instead of always returning an "after-download"
+              // result.
+              std::move(callback).Run(blink::mojom::CanCreateTranslatorResult::
+                                          kAfterDownloadLanguagePackNotReady);
+              return;
+            }
+            std::move(callback).Run(result);
+          },
+          mask_readily_result, std::move(callback)));
+}
 }  // namespace on_device_translation
diff --git a/chrome/browser/on_device_translation/translation_manager_impl.h b/chrome/browser/on_device_translation/translation_manager_impl.h
index 7784c71..3c515341 100644
--- a/chrome/browser/on_device_translation/translation_manager_impl.h
+++ b/chrome/browser/on_device_translation/translation_manager_impl.h
@@ -62,6 +62,10 @@
   void GetTranslatorAvailabilityInfo(
       GetTranslatorAvailabilityInfoCallback callback) override;
 
+  void TranslationAvailable(const std::string& source_language,
+                            const std::string& target_language,
+                            TranslationAvailableCallback callback) override;
+
   static bool PassAcceptLanguagesCheck(const std::string& accept_languages_str,
                                        const std::string& source_lang,
                                        const std::string& target_lang);
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java
index fb87acb..7733a02 100644
--- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java
+++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.optimization_guide;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
@@ -13,6 +12,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.components.optimization_guide.OptimizationGuideDecision;
 import org.chromium.components.optimization_guide.proto.CommonTypesProto.Any;
 import org.chromium.components.optimization_guide.proto.CommonTypesProto.RequestContext;
@@ -30,6 +31,7 @@
  * <p>An instance of this class must be created, used, and destroyed on the UI thread.
  */
 @JNINamespace("optimization_guide::android")
+@NullMarked
 public class OptimizationGuideBridge {
     private long mNativeOptimizationGuideBridge;
 
@@ -202,7 +204,7 @@
     private static void onOptimizationGuideDecision(
             OptimizationGuideCallback callback,
             @OptimizationGuideDecision int optimizationGuideDecision,
-            @Nullable byte[] serializedAnyMetadata) {
+            byte @Nullable [] serializedAnyMetadata) {
         callback.onOptimizationGuideDecision(
                 optimizationGuideDecision, deserializeAnyMetadata(serializedAnyMetadata));
     }
@@ -213,7 +215,7 @@
             GURL url,
             int optimizationTypeInt,
             @OptimizationGuideDecision int optimizationGuideDecision,
-            @Nullable byte[] serializedAnyMetadata) {
+            byte @Nullable [] serializedAnyMetadata) {
         OptimizationType optimizationType = OptimizationType.forNumber(optimizationTypeInt);
         if (optimizationType == null) return;
         callback.onOnDemandOptimizationGuideDecision(
@@ -262,7 +264,7 @@
 
     /** Returns a 2D byte array of all cached push notifications for the given optimization type. */
     @CalledByNative
-    private static byte[][] getEncodedPushNotifications(int optimizationTypeInt) {
+    private static byte @Nullable [][] getEncodedPushNotifications(int optimizationTypeInt) {
         OptimizationType optimizationType = OptimizationType.forNumber(optimizationTypeInt);
         if (optimizationType == null) return null;
 
@@ -297,12 +299,12 @@
     @CalledByNative
     private static OptimizationGuideDecisionWithMetadata createDecisionWithMetadata(
             @OptimizationGuideDecision int optimizationGuideDecision,
-            @Nullable byte[] serializedAnyMetadata) {
+            byte @Nullable [] serializedAnyMetadata) {
         return new OptimizationGuideDecisionWithMetadata(
                 optimizationGuideDecision, deserializeAnyMetadata(serializedAnyMetadata));
     }
 
-    private static @Nullable Any deserializeAnyMetadata(@Nullable byte[] serializedAnyMetadata) {
+    private static @Nullable Any deserializeAnyMetadata(byte @Nullable [] serializedAnyMetadata) {
         if (serializedAnyMetadata == null) {
             return null;
         }
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory.java
index 97027b7..f7d5ea6 100644
--- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory.java
+++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory.java
@@ -4,19 +4,20 @@
 
 package org.chromium.chrome.browser.optimization_guide;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 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.profiles.Profile;
 
 /** Provides access to {@link Profile} specific {@link OptimizationGuideBridge} instances. */
+@NullMarked
 public class OptimizationGuideBridgeFactory {
     /** Return the {@link OptimizationGuideBridge} associated with the given {@link Profile}. */
-    @Nullable
-    public static OptimizationGuideBridge getForProfile(Profile profile) {
+    public static @Nullable OptimizationGuideBridge getForProfile(Profile profile) {
         return OptimizationGuideBridgeFactoryJni.get().getForProfile(profile);
     }
 
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideDecisionWithMetadata.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideDecisionWithMetadata.java
index b558191..acb47176 100644
--- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideDecisionWithMetadata.java
+++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideDecisionWithMetadata.java
@@ -4,15 +4,16 @@
 
 package org.chromium.chrome.browser.optimization_guide;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.optimization_guide.OptimizationGuideDecision;
 import org.chromium.components.optimization_guide.proto.CommonTypesProto.Any;
 
+@NullMarked
 public class OptimizationGuideDecisionWithMetadata {
 
     private final @OptimizationGuideDecision int mDecision;
-    @Nullable private final Any mMetadata;
+    private final @Nullable Any mMetadata;
 
     OptimizationGuideDecisionWithMetadata(
             @OptimizationGuideDecision int decision, @Nullable Any metadata) {
@@ -24,8 +25,7 @@
         return mDecision;
     }
 
-    @Nullable
-    public Any getMetadata() {
+    public @Nullable Any getMetadata() {
         return mMetadata;
     }
 }
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java
index 42fc67a3..4090b33 100644
--- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java
+++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java
@@ -4,16 +4,19 @@
 
 package org.chromium.chrome.browser.optimization_guide;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.util.Base64;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Log;
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.metrics.RecordHistogram;
+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.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
@@ -34,8 +37,9 @@
  * native is down are persisted to prefs, up to an experimentally controlled limit. Such overflows
  * are detected and also forwarded to native.
  */
+@NullMarked
 public class OptimizationGuidePushNotificationManager {
-    private static Boolean sNativeIsInitialized;
+    private static @Nullable Boolean sNativeIsInitialized;
 
     private static final String TAG = "OGPNotificationMngr";
 
@@ -80,8 +84,10 @@
         }
 
         if (nativeIsInitialized()) {
-            OptimizationGuideBridgeFactory.getForProfile(ProfileManager.getLastUsedRegularProfile())
-                    .onNewPushNotification(payload);
+            var optimizationGuideBridge =
+                    OptimizationGuideBridgeFactory.getForProfile(
+                            ProfileManager.getLastUsedRegularProfile());
+            assumeNonNull(optimizationGuideBridge).onNewPushNotification(payload);
             return;
         }
 
@@ -119,8 +125,7 @@
      * @param optimizationType the optimization type to get cached notifications for
      * @return a possibly null array of persisted notifications
      */
-    @Nullable
-    public static HintNotificationPayload[] getNotificationCacheForOptimizationType(
+    public static HintNotificationPayload @Nullable [] getNotificationCacheForOptimizationType(
             OptimizationType optimizationType) {
         Set<String> cache = getStringCacheForOptimizationType(optimizationType);
         if (checkForOverflow(cache)) return null;
diff --git a/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc b/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc
index dd9f3ca..3943ff6 100644
--- a/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc
@@ -94,7 +94,7 @@
 
   int64_t client_id =
       local_state->GetInt64(optimization_guide::model_execution::prefs::
-                                localstate::kModelQualityLogggingClientId);
+                                localstate::kModelQualityLoggingClientId);
 
   // If the client id is zero no client id is set, in that case do nothing.
   if (client_id == 0) {
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
index 1f44309..3bc499e 100644
--- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
@@ -24,6 +24,7 @@
 #include "base/trace_event/trace_id_helper.h"
 #include "base/trace_event/typed_macros.h"
 #include "cc/base/features.h"
+#include "cc/metrics/ukm_dropped_frames_data.h"
 #include "cc/metrics/ukm_smoothness_data.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
@@ -426,6 +427,7 @@
   if (GetDelegate().StartedInForeground())
     RecordTimingMetrics(timing);
   ReportLayoutStability();
+  RecordDroppedFramesMetrics();
   RecordSmoothnessMetrics();
   RecordResponsivenessMetrics();
   // Assume that page ends on this method, as the app could be evicted right
@@ -505,6 +507,7 @@
   if (GetDelegate().StartedInForeground())
     RecordTimingMetrics(timing);
   ReportLayoutStability();
+  RecordDroppedFramesMetrics();
   RecordSmoothnessMetrics();
   RecordResponsivenessMetrics();
   RecordPageEndMetrics(&timing, current_time,
@@ -1523,6 +1526,21 @@
   builder.SetHourOfDay(exploded.hour);
 }
 
+void UkmPageLoadMetricsObserver::RecordDroppedFramesMetrics() {
+  auto* dropped_frames =
+      ukm_dropped_frames_data_.GetMemoryAs<cc::UkmDroppedFramesDataShared>();
+  if (!dropped_frames) {
+    return;
+  }
+
+  cc::UkmDroppedFramesData dropped_frames_data;
+  bool success = dropped_frames->Read(dropped_frames_data);
+  if (!success) {
+    return;
+  }
+  // TODO(crbug.com/395868899): Read PDF4 metric here.
+}
+
 void UkmPageLoadMetricsObserver::RecordSmoothnessMetrics() {
   auto* smoothness =
       ukm_smoothness_data_.GetMemoryAs<cc::UkmSmoothnessDataShared>();
@@ -1774,9 +1792,11 @@
   }
 }
 
-void UkmPageLoadMetricsObserver::SetUpSharedMemoryForSmoothness(
-    const base::ReadOnlySharedMemoryRegion& shared_memory) {
-  ukm_smoothness_data_ = shared_memory.Map();
+void UkmPageLoadMetricsObserver::SetUpSharedMemoryForUkms(
+    const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+    const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) {
+  ukm_smoothness_data_ = smoothness_memory.Map();
+  ukm_dropped_frames_data_ = dropped_frames_memory.Map();
 }
 
 void UkmPageLoadMetricsObserver::OnCpuTimingUpdate(
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h
index 3eeb70cd..cca3012 100644
--- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h
@@ -111,8 +111,9 @@
       content::RenderFrameHost* subframe_rfh,
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
 
-  void SetUpSharedMemoryForSmoothness(
-      const base::ReadOnlySharedMemoryRegion& shared_memory) override;
+  void SetUpSharedMemoryForUkms(
+      const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+      const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) override;
 
   void OnCpuTimingUpdate(
       content::RenderFrameHost* subframe_rfh,
@@ -187,6 +188,7 @@
       ukm::builders::PageLoad& builder,
       const page_load_metrics::PageEndReason page_end_reason);
 
+  void RecordDroppedFramesMetrics();
   void RecordSmoothnessMetrics();
   void RecordResponsivenessMetrics();
 
@@ -362,6 +364,7 @@
   std::optional<net::HttpConnectionInfo> connection_info_;
 
   base::ReadOnlySharedMemoryMapping ukm_smoothness_data_;
+  base::ReadOnlySharedMemoryMapping ukm_dropped_frames_data_;
 
   // Only true if the page became hidden after the first time it was shown in
   // the foreground, no matter how it started.
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index a2343f0..cd71a06 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -23,7 +23,6 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/affiliations/affiliation_service_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/device_reauth/chrome_device_authenticator_factory.h"
@@ -859,7 +858,7 @@
   manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin,
                                                        federated_matches);
 #endif
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
   if (was_autofilled_on_pageload &&
       !IsAuthenticatorRequestWindowUrl(GetLastCommittedURL()) &&
       password_manager_util::
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index 2c0d005..92916017 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -15,7 +15,6 @@
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
-#include "build/chromeos_buildflags.h"
 #include "components/autofill/content/browser/scoped_autofill_managers_observation.h"
 #include "components/autofill/core/browser/foundations/autofill_manager.h"
 #include "components/autofill/core/common/password_generation_util.h"
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
index dc8f6d5..e4f52c1 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -829,7 +829,7 @@
       GURL("https://passwords.google.com/path?query=1")));
 }
 
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
 // Test that authentication is not possible if the `authenticator` is `nullptr`.
 TEST_F(ChromePasswordManagerClientTest, CanUseBiometricAuthNoAuthenticator) {
   EXPECT_FALSE(GetClient()->IsReauthBeforeFillingRequired(
@@ -859,7 +859,7 @@
       password_manager::prefs::kBiometricAuthenticationBeforeFilling, false);
   EXPECT_FALSE(GetClient()->IsReauthBeforeFillingRequired(&authenticator));
 }
-#endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
 // Test that authentication is possible if both the biometric authentication
@@ -875,7 +875,7 @@
 }
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Test that authentication is possible if biometric authentication
 // hardware is available, the user configured the corresponding setting and the
 // feature flag is enabled.
diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc b/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
index c798aca..7cfb6a2 100644
--- a/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
+++ b/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/test/scoped_feature_list.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/extensions/api/settings_private/generated_pref_test_base.h"
 #include "chrome/browser/extensions/api/settings_private/generated_prefs_factory.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
@@ -107,7 +107,7 @@
   EXPECT_EQ(test_observer.GetUpdatedPrefName(),
             kGeneratedPasswordLeakDetectionPref);
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Clearing the primary account does not make sense on ChromeOS.
   test_observer.Reset();
   identity_test_env()->ClearPrimaryAccount();
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index af55954..2617fb33 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -26,7 +26,6 @@
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/password_manager/password_manager_test_base.h"
 #include "chrome/browser/password_manager/password_manager_uitest_util.h"
diff --git a/chrome/browser/password_manager/password_manager_interactive_uitest.cc b/chrome/browser/password_manager/password_manager_interactive_uitest.cc
index 7c4ede2..5cb440cd 100644
--- a/chrome/browser/password_manager/password_manager_interactive_uitest.cc
+++ b/chrome/browser/password_manager/password_manager_interactive_uitest.cc
@@ -12,7 +12,6 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/run_until.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/password_manager/password_manager_interactive_test_base.h"
 #include "chrome/browser/password_manager/passwords_navigation_observer.h"
diff --git a/chrome/browser/password_manager/password_reuse_manager_factory.cc b/chrome/browser/password_manager/password_reuse_manager_factory.cc
index ef84f3e..95a6221 100644
--- a/chrome/browser/password_manager/password_reuse_manager_factory.cc
+++ b/chrome/browser/password_manager/password_reuse_manager_factory.cc
@@ -8,7 +8,6 @@
 
 #include "base/no_destructor.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/password_manager/account_password_store_factory.h"
 #include "chrome/browser/password_manager/profile_password_store_factory.h"
@@ -138,10 +137,7 @@
   // Prepare password hash data for reuse detection.
   reuse_manager->PreparePasswordHashData(GetSignInStateForMetrics(profile));
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   std::unique_ptr<password_manager::PasswordReuseManagerSigninNotifier>
       notifier = std::make_unique<
           password_manager::PasswordReuseManagerSigninNotifierImpl>(
diff --git a/chrome/browser/password_manager/profile_password_store_factory.cc b/chrome/browser/password_manager/profile_password_store_factory.cc
index 7d5a5ca..01d50d8 100644
--- a/chrome/browser/password_manager/profile_password_store_factory.cc
+++ b/chrome/browser/password_manager/profile_password_store_factory.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/bind.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/affiliations/affiliation_service_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/password_manager/credentials_cleaner_runner_factory.h"
diff --git a/chrome/browser/performance_manager/user_tuning/battery_saver_mode_manager.cc b/chrome/browser/performance_manager/user_tuning/battery_saver_mode_manager.cc
index 4b7e4f1..976baca 100644
--- a/chrome/browser/performance_manager/user_tuning/battery_saver_mode_manager.cc
+++ b/chrome/browser/performance_manager/user_tuning/battery_saver_mode_manager.cc
@@ -172,14 +172,11 @@
   ~FreezingDelegateImpl() override = default;
 
   void ToggleFreezingOnBatterySaverMode(bool is_enabled) final {
-    PerformanceManagerImpl::CallOnGraph(
-        FROM_HERE,
-        base::BindOnce(
-            [](bool is_enabled, performance_manager::Graph* graph) {
-              CHECK_DEREF(graph->GetRegisteredObjectAs<FreezingPolicy>())
-                  .ToggleFreezingOnBatterySaverMode(is_enabled);
-            },
-            is_enabled));
+    if (PerformanceManager::IsAvailable()) {
+      Graph* graph = PerformanceManager::GetGraph();
+      CHECK_DEREF(graph->GetRegisteredObjectAs<FreezingPolicy>())
+          .ToggleFreezingOnBatterySaverMode(is_enabled);
+    }
   }
 };
 
diff --git a/chrome/browser/performance_manager/user_tuning/cpu_health_tracker_unittest.cc b/chrome/browser/performance_manager/user_tuning/cpu_health_tracker_unittest.cc
index 6bd5a75..e29fb8f 100644
--- a/chrome/browser/performance_manager/user_tuning/cpu_health_tracker_unittest.cc
+++ b/chrome/browser/performance_manager/user_tuning/cpu_health_tracker_unittest.cc
@@ -39,7 +39,6 @@
 #include "components/performance_manager/public/resource_attribution/query_results.h"
 #include "components/performance_manager/public/resource_attribution/resource_contexts.h"
 #include "components/performance_manager/public/user_tuning/prefs.h"
-#include "components/performance_manager/test_support/run_in_graph.h"
 #include "components/performance_manager/test_support/test_harness_helper.h"
 #include "components/system_cpu/cpu_sample.h"
 #include "content/public/browser/web_contents.h"
@@ -152,18 +151,11 @@
   void ProcessQueryResultMap(
       CpuHealthTracker::CpuPercent system_cpu_usage_percentage,
       resource_attribution::QueryResultMap results) {
-    performance_manager::PerformanceManager::CallOnGraph(
-        FROM_HERE,
-        base::BindOnce(
-            [](CpuHealthTracker::CpuPercent system_cpu_usage_percentage,
-               resource_attribution::QueryResultMap results, Graph* graph) {
-              CpuHealthTracker* const health_tracker =
-                  CpuHealthTracker::GetFromGraph(graph);
-              CHECK(health_tracker);
-              health_tracker->ProcessQueryResultMap(system_cpu_usage_percentage,
-                                                    results);
-            },
-            system_cpu_usage_percentage, results));
+    Graph* graph = PerformanceManager::GetGraph();
+    CpuHealthTracker* const health_tracker =
+        CpuHealthTracker::GetFromGraph(graph);
+    CHECK(health_tracker);
+    health_tracker->ProcessQueryResultMap(system_cpu_usage_percentage, results);
   }
 };
 
@@ -179,16 +171,12 @@
     pm_harness_.SetUp();
     SetContents(CreateTestWebContents());
 
-    performance_manager::RunInGraph(
-        [status_change_cb = base::BindPostTask(
-             content::GetUIThreadTaskRunner({}),
-             status_change_future_.GetRepeatingCallback())](Graph* graph) {
-          std::unique_ptr<CpuHealthTracker> cpu_health_tracker =
-              std::make_unique<CpuHealthTracker>(std::move(status_change_cb),
-                                                 base::DoNothing());
+    std::unique_ptr<CpuHealthTracker> cpu_health_tracker =
+        std::make_unique<CpuHealthTracker>(
+            status_change_future_.GetRepeatingCallback(), base::DoNothing());
 
-          graph->PassToGraph(std::move(cpu_health_tracker));
-        });
+    Graph* graph = PerformanceManager::GetGraph();
+    graph->PassToGraph(std::move(cpu_health_tracker));
     SetUpGraphObjects();
   }
 
@@ -353,13 +341,12 @@
     pm_harness_.SetUp();
     manager_.reset(new PerformanceDetectionManager());
     SetUpGraphObjects();
-    performance_manager::RunInGraph(
-        [context_id = browser()->profile()->UniqueId()](Graph* graph) {
-          policies::PageDiscardingHelper* const discard_helper =
-              policies::PageDiscardingHelper::GetFromGraph(graph);
-          CHECK(discard_helper);
-          discard_helper->SetNoDiscardPatternsForProfile(context_id, {});
-        });
+    Graph* graph = PerformanceManager::GetGraph();
+    policies::PageDiscardingHelper* const discard_helper =
+        policies::PageDiscardingHelper::GetFromGraph(graph);
+    CHECK(discard_helper);
+    discard_helper->SetNoDiscardPatternsForProfile(
+        browser()->profile()->UniqueId(), {});
 
     helper_ = std::make_unique<ProfileDiscardOptOutListHelper>();
     helper_->OnProfileAdded(browser()->profile());
@@ -488,26 +475,18 @@
              1)});
   }
 
-  PerformanceManager::CallOnGraph(
-      FROM_HERE,
-      base::BindOnce(
-          [](base::flat_map<resource_attribution::PageContext,
-                            CpuHealthTracker::CpuPercent> page_contexts_cpu,
-             Graph* graph) {
-            CpuHealthTracker::GetFromGraph(graph)->GetFilteredActionableTabs(
-                page_contexts_cpu,
-                CpuHealthTracker::CpuPercent(
-                    performance_manager::features::
-                        kCPUDegradedHealthPercentageThreshold.Get()),
-                base::BindOnce(
-                    [](CpuHealthTracker::ActionableTabsResult result) {
-                      // The actionable tab list should be empty because each
-                      // page's CPU usage is below the minimum needed to  be
-                      // considered as actionable.
-                      EXPECT_TRUE(result.empty());
-                    }));
-          },
-          std::move(page_contexts_cpu)));
+  Graph* graph = PerformanceManager::GetGraph();
+  CpuHealthTracker::GetFromGraph(graph)->GetFilteredActionableTabs(
+      page_contexts_cpu,
+      CpuHealthTracker::CpuPercent(
+          performance_manager::features::kCPUDegradedHealthPercentageThreshold
+              .Get()),
+      base::BindOnce([](CpuHealthTracker::ActionableTabsResult result) {
+        // The actionable tab list should be empty because each
+        // page's CPU usage is below the minimum needed to  be
+        // considered as actionable.
+        EXPECT_TRUE(result.empty());
+      }));
 }
 
 // The PerformanceDetectionManager should properly notify observers
@@ -703,10 +682,9 @@
 
   // This is usually called when the profile is created. Fake it here since it
   // doesn't happen in tests.
-  RunInGraph([&](Graph* graph) {
-    policies::PageDiscardingHelper::GetFromGraph(graph)
-        ->SetNoDiscardPatternsForProfile(incognito_profile->UniqueId(), {});
-  });
+  Graph* graph = PerformanceManager::GetGraph();
+  policies::PageDiscardingHelper::GetFromGraph(graph)
+      ->SetNoDiscardPatternsForProfile(incognito_profile->UniqueId(), {});
 
   resource_attribution::PageContext default_page_context =
       AddBackgroundTab("http://b.com", browser());
diff --git a/chrome/browser/performance_manager/user_tuning/performance_detection_manager.cc b/chrome/browser/performance_manager/user_tuning/performance_detection_manager.cc
index 986cfa24..c907c116 100644
--- a/chrome/browser/performance_manager/user_tuning/performance_detection_manager.cc
+++ b/chrome/browser/performance_manager/user_tuning/performance_detection_manager.cc
@@ -97,13 +97,10 @@
 }
 
 void PerformanceDetectionManager::ForceTabCpuDataRefresh() {
-  PerformanceManager::CallOnGraph(
-      FROM_HERE, base::BindOnce([](performance_manager::Graph* graph) {
-        performance_manager::user_tuning::CpuHealthTracker* const
-            health_tracker = performance_manager::user_tuning::
-                CpuHealthTracker::GetFromGraph(graph);
-        health_tracker->QueryAndProcessTabActionability(std::nullopt);
-      }));
+  Graph* graph = PerformanceManager::GetGraph();
+  CpuHealthTracker* const health_tracker =
+      CpuHealthTracker::GetFromGraph(graph);
+  health_tracker->QueryAndProcessTabActionability(std::nullopt);
 }
 
 void PerformanceDetectionManager::OnDiscardComplete() {
@@ -129,19 +126,14 @@
 
 void PerformanceDetectionManager::RecordCpuHealthStatus(
     base::TimeDelta time_after_discard) {
-  PerformanceManager::CallOnGraph(
-      FROM_HERE,
-      base::BindOnce(
-          [](base::TimeDelta time, performance_manager::Graph* graph) {
-            performance_manager::user_tuning::CpuHealthTracker* const
-                health_tracker = performance_manager::user_tuning::
-                    CpuHealthTracker::GetFromGraph(graph);
-            PerformanceDetectionManager::HealthLevel health_level =
-                health_tracker->GetCurrentHealthLevel();
+  Graph* graph = PerformanceManager::GetGraph();
 
-            RecordCpuHealthStatusAfterDiscard(time, health_level);
-          },
-          time_after_discard));
+  CpuHealthTracker* const health_tracker =
+      performance_manager::user_tuning::CpuHealthTracker::GetFromGraph(graph);
+  PerformanceDetectionManager::HealthLevel health_level =
+      health_tracker->GetCurrentHealthLevel();
+
+  RecordCpuHealthStatusAfterDiscard(time_after_discard, health_level);
 }
 
 void PerformanceDetectionManager::NotifyActionableTabObserversForTesting(
@@ -194,21 +186,12 @@
               &PerformanceDetectionManager::NotifyActionableTabObservers,
               weak_ptr_factory_.GetWeakPtr()));
 
-  performance_manager::PerformanceManager::CallOnGraph(
-      FROM_HERE,
-      base::BindOnce(
-          [](CpuHealthTracker::StatusChangeCallback on_status_change,
-             CpuHealthTracker::ActionableTabResultCallback
-                 on_actionable_list_change,
-             Graph* graph) {
-            std::unique_ptr<CpuHealthTracker> cpu_health_tracker =
-                std::make_unique<CpuHealthTracker>(
-                    std::move(on_status_change),
-                    std::move(on_actionable_list_change));
+  Graph* graph = PerformanceManager::GetGraph();
 
-            graph->PassToGraph(std::move(cpu_health_tracker));
-          },
-          std::move(on_status_change), std::move(on_actionable_list_change)));
+  std::unique_ptr<CpuHealthTracker> cpu_health_tracker =
+      std::make_unique<CpuHealthTracker>(std::move(on_status_change),
+                                         std::move(on_actionable_list_change));
+  graph->PassToGraph(std::move(cpu_health_tracker));
 }
 
 void PerformanceDetectionManager::NotifyStatusObservers(
diff --git a/chrome/browser/performance_manager/user_tuning/performance_detection_manager_unittest.cc b/chrome/browser/performance_manager/user_tuning/performance_detection_manager_unittest.cc
index 653cdee..f4484e3 100644
--- a/chrome/browser/performance_manager/user_tuning/performance_detection_manager_unittest.cc
+++ b/chrome/browser/performance_manager/user_tuning/performance_detection_manager_unittest.cc
@@ -21,7 +21,6 @@
 #include "components/performance_manager/public/graph/graph.h"
 #include "components/performance_manager/public/performance_manager.h"
 #include "components/performance_manager/public/resource_attribution/page_context.h"
-#include "components/performance_manager/test_support/run_in_graph.h"
 #include "components/performance_manager/test_support/test_harness_helper.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
@@ -127,13 +126,12 @@
     ChromeRenderViewHostTestHarness::SetUp();
     pm_harness_.SetUp();
     SetContents(CreateTestWebContents());
-    performance_manager::RunInGraph([](Graph* graph) {
-      auto page_discarding_helper =
-          std::make_unique<policies::PageDiscardingHelper>();
-      page_discarding_helper->SetMockDiscarderForTesting(
-          std::make_unique<testing::MockPageDiscarder>());
-      graph->PassToGraph(std::move(page_discarding_helper));
-    });
+    Graph* graph = PerformanceManager::GetGraph();
+    auto page_discarding_helper =
+        std::make_unique<policies::PageDiscardingHelper>();
+    page_discarding_helper->SetMockDiscarderForTesting(
+        std::make_unique<testing::MockPageDiscarder>());
+    graph->PassToGraph(std::move(page_discarding_helper));
   }
 
   void TearDown() override {
diff --git a/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc b/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc
index ddc07c4..8320e4906 100644
--- a/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc
+++ b/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc
@@ -29,29 +29,16 @@
   ~ProfileDiscardOptOutListHelperDelegateImpl() override = default;
 
   void ClearPatterns(const std::string& browser_context_id) override {
-    performance_manager::PerformanceManager::CallOnGraph(
-        FROM_HERE,
-        base::BindOnce(
-            [](std::string browser_context_id,
-               performance_manager::Graph* graph) {
-              policies::PageDiscardingHelper::GetFromGraph(graph)
-                  ->ClearNoDiscardPatternsForProfile(browser_context_id);
-            },
-            browser_context_id));
+    Graph* graph = PerformanceManager::GetGraph();
+    policies::PageDiscardingHelper::GetFromGraph(graph)
+        ->ClearNoDiscardPatternsForProfile(browser_context_id);
   }
 
   void SetPatterns(const std::string& browser_context_id,
                    const std::vector<std::string>& patterns) override {
-    performance_manager::PerformanceManager::CallOnGraph(
-        FROM_HERE, base::BindOnce(
-                       [](std::string browser_context_id,
-                          std::vector<std::string> patterns,
-                          performance_manager::Graph* graph) {
-                         policies::PageDiscardingHelper::GetFromGraph(graph)
-                             ->SetNoDiscardPatternsForProfile(
-                                 browser_context_id, patterns);
-                       },
-                       browser_context_id, std::move(patterns)));
+    Graph* graph = PerformanceManager::GetGraph();
+    policies::PageDiscardingHelper::GetFromGraph(graph)
+        ->SetNoDiscardPatternsForProfile(browser_context_id, patterns);
   }
 };
 
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc
index b6e1897b..b00a972 100644
--- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc
+++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc
@@ -48,10 +48,6 @@
           MemorySaverModeDelegate {
  public:
   void ToggleMemorySaverMode(MemorySaverModeState state) override {
-    performance_manager::PerformanceManager::CallOnGraph(
-        FROM_HERE,
-        base::BindOnce(
-            [](MemorySaverModeState state) {
               auto* memory_saver_mode_policy =
                   policies::MemorySaverModePolicy::GetInstance();
               CHECK(memory_saver_mode_policy);
@@ -67,20 +63,12 @@
                   return;
               }
               NOTREACHED();
-            },
-            state));
   }
 
   void SetMode(prefs::MemorySaverModeAggressiveness mode) override {
-    performance_manager::PerformanceManager::CallOnGraph(
-        FROM_HERE, base::BindOnce(
-                       [](prefs::MemorySaverModeAggressiveness mode) {
-                         auto* policy =
-                             policies::MemorySaverModePolicy::GetInstance();
-                         CHECK(policy);
-                         policy->SetMode(mode);
-                       },
-                       mode));
+    auto* policy = policies::MemorySaverModePolicy::GetInstance();
+    CHECK(policy);
+    policy->SetMode(mode);
   }
 
   ~MemorySaverModeDelegateImpl() override = default;
@@ -199,8 +187,7 @@
   g_user_performance_tuning_manager = this;
 
   if (notifier) {
-    performance_manager::PerformanceManager::PassToGraph(FROM_HERE,
-                                                         std::move(notifier));
+    PerformanceManager::GetGraph()->PassToGraph(std::move(notifier));
   }
 
   performance_manager::user_tuning::prefs::MigrateMemorySaverModePref(
diff --git a/chrome/browser/platform_util.cc b/chrome/browser/platform_util.cc
index 484b20b5..9ed26d2 100644
--- a/chrome/browser/platform_util.cc
+++ b/chrome/browser/platform_util.cc
@@ -9,19 +9,10 @@
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
 #include "base/task/thread_pool.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/platform_util_internal.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/lacros/window_properties.h"
-#include "chromeos/ui/base/window_pin_type.h"
-#include "ui/aura/window.h"
-#endif
-
 using content::BrowserThread;
 
 namespace platform_util {
@@ -89,17 +80,7 @@
 }
 
 bool IsBrowserLockedFullscreen(const Browser* browser) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  aura::Window* window = browser->window()->GetNativeWindow();
-  // |window| can be nullptr inside of unit tests.
-  if (!window)
-    return false;
-
-  return window->GetProperty(lacros::kWindowPinTypeKey) ==
-         chromeos::WindowPinType::kTrustedPinned;
-#else
   return false;
-#endif
 }
 
 }  // namespace platform_util
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceUtil.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceUtil.java
index a56233a..9993d843 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceUtil.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceUtil.java
@@ -4,11 +4,13 @@
 
 package org.chromium.chrome.browser.preferences;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.prefs.PrefChangeRegistrar;
 import org.chromium.components.user_prefs.UserPrefs;
 
 /** Utilities for accessing PrefServices. */
+@NullMarked
 public class PrefServiceUtil {
     /** Create a PrefChangeRegistrar watching the UserPrefs of a Profile. */
     public static PrefChangeRegistrar createFor(Profile profile) {
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 8bc5078..ec31b65a 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1084,6 +1084,12 @@
 constexpr char kScannerFeedbackEnabled[] = "ash.scanner.feedback_enabled";
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
+#if BUILDFLAG(IS_ANDROID)
+// Deprecated 02/2025.
+inline constexpr char kRootSecretPrefName[] =
+    "webauthn.authenticator_root_secret";
+#endif  // BUILDFLAG(IS_ANDROID)
+
 // Register local state used only for migration (clearing or moving to a new
 // key).
 void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
@@ -1104,7 +1110,7 @@
   registry->RegisterTimePref(kDeviceRegisteredTime, base::Time());
   registry->RegisterDictionaryPref(kArcKioskDictionaryName);
 
-// Deprecated 04/2024.
+  // Deprecated 04/2024.
   registry->RegisterDictionaryPref(kLastUploadedEuiccStatusPrefLegacy);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
@@ -1176,6 +1182,11 @@
 
   // Deprecated 02/2025.
   registry->RegisterBooleanPref(kUserAgentClientHintsGREASEUpdateEnabled, true);
+
+#if BUILDFLAG(IS_ANDROID)
+  // Deprecated 02/2025.
+  registry->RegisterStringPref(kRootSecretPrefName, std::string());
+#endif  // BUILDFLAG(IS_ANDROID)
 }
 
 // Register prefs used only for migration (clearing or moving to a new key).
@@ -1316,7 +1327,7 @@
                              base::Time());
   registry->RegisterBooleanPref(kShowTunaScreenEnabled, true);
 
-// Deprecated 08/2024
+  // Deprecated 08/2024
   registry->RegisterBooleanPref(kStandaloneWindowMigrationNudgeShown, false);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
@@ -2407,6 +2418,11 @@
   local_state->ClearPref(prefs::kDefaultBrowserPromptRefreshStudyGroup);
 #endif
 
+  // Added 02/2025
+#if BUILDFLAG(IS_ANDROID)
+  local_state->ClearPref(kRootSecretPrefName);
+#endif  // BUILDFLAG(IS_ANDROID)
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS
 
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
index c0ef65c..f5cd90c 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
@@ -1378,9 +1378,7 @@
 
 // TODO(https://cubug.com/1282624): This test should run on Android after we're
 // able to interact with Android UI.
-// TODO(crbug.com/40231021): On LacrOS, the window's bound changes
-// unexpectedly, and it stops auto completing.
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+#if !BUILDFLAG(IS_ANDROID)
 IN_PROC_BROWSER_TEST_F(SearchPreloadUnifiedBrowserTest, TriggerAndActivate) {
   base::HistogramTester histogram_tester;
   const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html");
@@ -1526,7 +1524,7 @@
 
   EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetch_url));
 }
-#endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 // Tests prerender is not cancelled after SearchPrefetchService cancels prefetch
 // requests.
diff --git a/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper_browsertest.cc b/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper_browsertest.cc
index f36560e..6600f435 100644
--- a/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper_browsertest.cc
@@ -9,7 +9,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/test/scoped_feature_list.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engine_choice/search_engine_choice_service_factory.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
diff --git a/chrome/browser/preloading/prerender/BUILD.gn b/chrome/browser/preloading/prerender/BUILD.gn
index aff531b..73847bd 100644
--- a/chrome/browser/preloading/prerender/BUILD.gn
+++ b/chrome/browser/preloading/prerender/BUILD.gn
@@ -2,8 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
-
 source_set("browser_tests") {
   testonly = true
 
diff --git a/chrome/browser/privacy_sandbox/android/BUILD.gn b/chrome/browser/privacy_sandbox/android/BUILD.gn
index 69c9058..0a0fcc8 100644
--- a/chrome/browser/privacy_sandbox/android/BUILD.gn
+++ b/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -102,6 +102,7 @@
     "javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxBridgeTest.java",
     "javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClickTest.java",
     "javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java",
+    "javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3Test.java",
     "javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragmentTest.java",
     "javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsFragmentTest.java",
     "javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragmentTest.java",
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 abb6d0a..808bf793 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
@@ -15,6 +15,7 @@
 
 import androidx.annotation.IdRes;
 import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.chrome.browser.content.WebContentsFactory;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -114,7 +115,7 @@
                 .getViewTreeObserver()
                 .addOnScrollChangedListener(
                         () -> {
-                            if (!mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) {
+                            if (!canScrollVerticallyDown()) {
                                 mMoreButton.setVisibility(View.GONE);
                                 mBottomFade.setVisibility(View.GONE);
                                 mActionButtons.setVisibility(View.VISIBLE);
@@ -227,6 +228,11 @@
         }
     }
 
+    @VisibleForTesting
+    public boolean canScrollVerticallyDown() {
+        return mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN);
+    }
+
     // OnClickListener:
     @Override
     public void onClick(View view) {
@@ -246,7 +252,7 @@
 
     @Override
     public void onShow(DialogInterface dialogInterface) {
-        if (mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) {
+        if (canScrollVerticallyDown()) {
             mMoreButton.setVisibility(View.VISIBLE);
             mBottomFade.setVisibility(View.VISIBLE);
             mActionButtons.setVisibility(View.GONE);
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
new file mode 100644
index 0000000..9d9554b7
--- /dev/null
+++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3Test.java
@@ -0,0 +1,304 @@
+// 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.privacy_sandbox;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.action.ViewActions.scrollTo;
+import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.RootMatchers.isDialog;
+import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE;
+import static androidx.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.hamcrest.CoreMatchers.not;
+
+import static org.chromium.ui.test.util.ViewUtils.clickOnClickableSpan;
+import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+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.DisabledTest;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
+import org.chromium.chrome.test.util.ChromeRenderTestRule;
+import org.chromium.net.test.EmbeddedTestServer;
+import org.chromium.ui.test.util.RenderTestRule;
+
+import java.io.IOException;
+
+/** Tests {@link PrivacySandboxDialogV3}. */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@Batch(Batch.PER_CLASS)
+public final class PrivacySandboxDialogV3Test {
+    @ClassRule
+    public static final ChromeTabbedActivityTestRule sActivityTestRule =
+            new ChromeTabbedActivityTestRule();
+
+    @Rule
+    public final BlankCTATabInitialStateRule mInitialStateRule =
+            new BlankCTATabInitialStateRule(sActivityTestRule, false);
+
+    @Rule
+    public CustomTabActivityTestRule mCustomTabActivityTestRule = new CustomTabActivityTestRule();
+
+    @Rule
+    public ChromeRenderTestRule mRenderTestRule =
+            ChromeRenderTestRule.Builder.withPublicCorpus()
+                    .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_PRIVACY_SANDBOX)
+                    .setRevision(2)
+                    .setDescription("Changed feature flag behavior for button equalization")
+                    .build();
+
+    private PrivacySandboxDialogV3 mDialog;
+    private String mTestPage;
+    private EmbeddedTestServer mTestServer;
+
+    @Before
+    public void setUp() {
+        Context appContext = getInstrumentation().getTargetContext().getApplicationContext();
+        mTestServer = EmbeddedTestServer.createAndStartServer(appContext);
+        mTestPage = mTestServer.getURL("/chrome/test/data/android/google.html");
+    }
+
+    @After
+    public void tearDown() {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    if (mDialog != null) {
+                        mDialog.dismiss();
+                        mDialog = null;
+                    }
+                });
+    }
+
+    private void renderViewWithId(int id, String renderId) {
+        onViewWaiting(withId(id), true);
+        onView(withId(id))
+                .inRoot(isDialog())
+                .check(
+                        (v, noMatchException) -> {
+                            if (noMatchException != null) throw noMatchException;
+                            try {
+                                ThreadUtils.runOnUiThreadBlocking(() -> RenderTestRule.sanitize(v));
+                                mRenderTestRule.render(v, renderId);
+                            } catch (IOException e) {
+                                assert false : "Render test failed due to " + e;
+                            }
+                        });
+    }
+
+    private void launchDialog() {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    if (mDialog != null) {
+                        mDialog.dismiss();
+                        mDialog = null;
+                    }
+                    mDialog =
+                            new PrivacySandboxDialogV3(
+                                    sActivityTestRule.getActivity(),
+                                    sActivityTestRule.getProfile(false),
+                                    sActivityTestRule.getActivity().getWindowAndroid());
+                    mDialog.show();
+                });
+        // Wait for the dialog to render.
+        onViewWaiting(withId(R.id.privacy_sandbox_dialog), true);
+    }
+
+    public void clickMoreButtonAndScrollToBottomIfNeeded() {
+        // Repeatedly click on the more button till we hit the bottom of the screen.
+        while (mDialog.canScrollVerticallyDown()) {
+            onViewWaiting(withId(R.id.more_button), true);
+            onView(withId(R.id.bottom_fade)).check(matches(isDisplayed()));
+            onView(withId(R.id.more_button)).inRoot(isDialog()).perform(click());
+            // TODO(crbug.com/392943234): Assert that a histogram was emitted.
+        }
+        onView(withId(R.id.more_button)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.bottom_fade)).check(matches(not(isDisplayed())));
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"RenderTest"})
+    public void testRenderEeaConsent() throws IOException {
+        launchDialog();
+        renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_consent_eea_view");
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"RenderTest"})
+    @DisabledTest(message = "crbug.com/397790001")
+    public void testRenderEeaConsentDropdownContent() throws IOException {
+        launchDialog();
+        onView(withId(R.id.ad_measurement_dropdown_element))
+                .inRoot(isDialog())
+                .perform(scrollTo(), click());
+        // Expands the dropdown element.
+        onView(withId(R.id.ad_measurement_dropdown_element)).inRoot(isDialog()).perform(click());
+        renderViewWithId(R.id.privacy_sandbox_dialog, "ad_measurement_dropdown_container");
+    }
+
+    @Test
+    @SmallTest
+    public void testEeaConsentMoreButtonIsNotShown() {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    if (mDialog != null) {
+                        mDialog.dismiss();
+                        mDialog = null;
+                    }
+                    mDialog =
+                            new PrivacySandboxDialogV3(
+                                    sActivityTestRule.getActivity(),
+                                    sActivityTestRule.getProfile(false),
+                                    sActivityTestRule.getActivity().getWindowAndroid());
+                    // 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.no_button)).check(matches(withEffectiveVisibility(VISIBLE)));
+        onView(withId(R.id.ack_button)).check(matches(withEffectiveVisibility(VISIBLE)));
+    }
+
+    @Test
+    @SmallTest
+    public void testEeaConsentActionButtonsAreShown() {
+        launchDialog();
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        // Verify action buttons are shown
+        onView(withId(R.id.no_button)).check(matches(isDisplayed()));
+        onView(withId(R.id.ack_button)).check(matches(isDisplayed()));
+    }
+
+    @Test
+    @SmallTest
+    public void testEeaConsentAcceptButtonDismissesDialog() {
+        launchDialog();
+        onView(withId(R.id.privacy_sandbox_consent_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_consent_title)).check(doesNotExist());
+    }
+
+    @Test
+    @SmallTest
+    public void testEeaConsentDeclineButtonDismissesDialog() {
+        launchDialog();
+        onView(withId(R.id.privacy_sandbox_consent_title)).check(matches(isDisplayed()));
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        onViewWaiting(withId(R.id.no_button), true);
+        onView(withId(R.id.no_button)).inRoot(isDialog()).perform(click());
+        onView(withId(R.id.privacy_sandbox_consent_title)).check(doesNotExist());
+    }
+
+    @Test
+    @SmallTest
+    public void testEeaConsentActionButtonsAreSticky() {
+        launchDialog();
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        // Verify action buttons are shown
+        onView(withId(R.id.no_button)).check(matches(isDisplayed()));
+        onView(withId(R.id.ack_button)).check(matches(isDisplayed()));
+        // Scroll back to the top
+        onView(withId(R.id.privacy_sandbox_consent_title)).inRoot(isDialog()).perform(scrollTo());
+        onView(withId(R.id.privacy_sandbox_consent_title)).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.no_button)).check(matches(isDisplayed()));
+        onView(withId(R.id.ack_button)).check(matches(isDisplayed()));
+    }
+
+    @Test
+    @SmallTest
+    public void testEEAConsentPrivacyPolicyLink() {
+        launchDialog();
+        onView(withId(R.id.learn_more_text)).inRoot(isDialog()).perform(scrollTo(), click());
+        // Validate Privacy Policy View is not shown
+        onView(withId(R.id.privacy_policy_view))
+                .inRoot(isDialog())
+                .check(matches(not(isDisplayed())));
+        // Click "Privacy Policy" link
+        onView(withId(R.id.learn_more_text)).inRoot(isDialog()).perform(clickOnClickableSpan(0));
+        // TODO(crbug.com/392943234): Assert that a histogram was emitted when the link was
+        // clicked.
+        // Validate EEA Consent is not shown
+        onView(withId(R.id.privacy_sandbox_consent_eea_view))
+                .inRoot(isDialog())
+                .check(matches(not(isDisplayed())));
+        // Validate Privacy Policy View is shown
+        onView(withId(R.id.privacy_policy_view)).inRoot(isDialog()).check(matches(isDisplayed()));
+        onView(withId(R.id.privacy_policy_title)).inRoot(isDialog()).check(matches(isDisplayed()));
+        onView(withId(R.id.privacy_policy_back_button))
+                .inRoot(isDialog())
+                .check(matches(isDisplayed()));
+        // Click back button
+        onView(withId(R.id.privacy_policy_back_button)).inRoot(isDialog()).perform(click());
+        // TODO(crbug.com/392943234): Assert that a histogram was emitted when the back button
+        // was clicked.
+        // Validate EEA Consent is shown
+        onView(withId(R.id.privacy_sandbox_consent_eea_view))
+                .inRoot(isDialog())
+                .check(matches(isDisplayed()));
+        // Validate Privacy Policy View is not shown
+        onView(withId(R.id.privacy_policy_view))
+                .inRoot(isDialog())
+                .check(matches(not(isDisplayed())));
+    }
+
+    @Test
+    @SmallTest
+    @DisabledTest(message = "crbug.com/397790001")
+    public void testEEAConsentDropdown() {
+        launchDialog();
+        onView(withId(R.id.ad_measurement_dropdown_element)).inRoot(isDialog()).perform(scrollTo());
+        // Validate dropdown content is not shown
+        onView(withId(R.id.ad_measurement_dropdown_container))
+                .inRoot(isDialog())
+                .check(matches(not(isDisplayed())));
+        // Expand the dropdown element.
+        onView(withId(R.id.ad_measurement_dropdown_element)).inRoot(isDialog()).perform(click());
+        // Validate the dropdown content is shown.
+        onView(withId(R.id.ad_measurement_dropdown_container))
+                .inRoot(isDialog())
+                .check(matches(isDisplayed()));
+        // Retract the dropdown element.
+        onView(withId(R.id.ad_measurement_dropdown_element)).inRoot(isDialog()).perform(click());
+        // Validate the dropdown content is not shown
+        onView(withId(R.id.ad_measurement_dropdown_container))
+                .inRoot(isDialog())
+                .check(matches(not(isDisplayed())));
+    }
+}
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
index 47a721c..2529a94 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h"
 
 #include "base/no_destructor.h"
+#include "build/build_config.h"
 #include "chrome/browser/browsing_topics/browsing_topics_service_factory.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -22,14 +23,14 @@
 #include "components/profile_metrics/browser_profile_type.h"
 #include "content/public/browser/storage_partition.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/browser_context_helper/browser_context_types.h"
 #endif
 
 namespace {
 
 profile_metrics::BrowserProfileType GetProfileType(Profile* profile) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Alias the "system" profiles which present as regular profiles for metrics
   // purposes (e.g. signin screen), to system metrics profiles. This is done
   // here as, due to dependency injection, the service itself does not hold a
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc
index 7b04b22..6029b53 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/test/metrics/user_action_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/branding_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -83,22 +84,14 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS)
-#include "chromeos/components/kiosk/kiosk_test_utils.h"
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chromeos/ash/components/login/login_state/login_state.h"
 #include "chromeos/ash/components/login/login_state/scoped_test_public_session_login_state.h"
+#include "chromeos/components/kiosk/kiosk_test_utils.h"
 #include "components/user_manager/fake_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/crosapi.mojom.h"
-#include "chromeos/startup/browser_init_params.h"
-#endif
-
 namespace {
 using ::browsing_topics::Topic;
 using ::privacy_sandbox::CanonicalTopic;
@@ -3278,20 +3271,11 @@
 #if BUILDFLAG(IS_CHROMEOS)
 TEST_F(PrivacySandboxServiceM1PromptTest, DeviceLocalAccountUser) {
   privacy_sandbox_service()->ForceChromeBuildForTests(true);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   user_manager::ScopedUserManager user_manager(
       std::make_unique<user_manager::FakeUserManager>(local_state()));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   // No prompt should be shown for a public session account.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   ash::ScopedTestPublicSessionLoginState login_state;
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  crosapi::mojom::BrowserInitParamsPtr init_params =
-      crosapi::mojom::BrowserInitParams::New();
-  init_params->session_type = crosapi::mojom::SessionType::kPublicSession;
-  chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
-#endif
   // TODO(crbug.com/361794340): Ensure the promptType is correct across
   // different surfaceTypes.
   EXPECT_EQ(
@@ -3299,15 +3283,9 @@
       PromptType::kNone);
 
   // A prompt should be shown for a regular user.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   ash::LoginState::Get()->SetLoggedInState(
       ash::LoginState::LoggedInState::LOGGED_IN_ACTIVE,
       ash::LoginState::LoggedInUserType::LOGGED_IN_USER_REGULAR);
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  init_params = crosapi::mojom::BrowserInitParams::New();
-  init_params->session_type = crosapi::mojom::SessionType::kRegularSession;
-  chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
-#endif
   EXPECT_EQ(
       privacy_sandbox_service()->GetRequiredPromptType(SurfaceType::kDesktop),
       PromptType::kM1Consent);
diff --git a/chrome/browser/referrer_policy_browsertest.cc b/chrome/browser/referrer_policy_browsertest.cc
index d1f73632..6923a20 100644
--- a/chrome/browser/referrer_policy_browsertest.cc
+++ b/chrome/browser/referrer_policy_browsertest.cc
@@ -13,7 +13,6 @@
 #include "base/synchronization/lock.h"
 #include "base/thread_annotations.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/net/system_network_context_manager.h"
@@ -411,13 +410,7 @@
 }
 
 // Context menu, from HTTP to HTTP.
-// TODO(crbug.com/40804570): Flaky on Lacros.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_ContextMenuOrigin DISABLED_ContextMenuOrigin
-#else
-#define MAYBE_ContextMenuOrigin ContextMenuOrigin
-#endif
-IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuOrigin) {
+IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, ContextMenuOrigin) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
   RunReferrerTest(
@@ -427,8 +420,8 @@
 }
 
 // Context menu, from HTTPS to HTTP.
-// TODO(crbug.com/40803947): Fix flakiness on Linux and Lacros then reenable.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/40803947): Fix flakiness on Linux then reenable.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_HttpsContextMenuOrigin DISABLED_HttpsContextMenuOrigin
 #else
 #define MAYBE_HttpsContextMenuOrigin HttpsContextMenuOrigin
@@ -536,8 +529,8 @@
 }
 
 // Context menu, from HTTP to HTTP via server redirect.
-// TODO(crbug.com/40803947): Fix flakiness on Linux and Lacros then reenable.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// TODO(crbug.com/40803947): Fix flakiness on Linux then reenable.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_ContextMenuRedirect DISABLED_ContextMenuRedirect
 #else
 #define MAYBE_ContextMenuRedirect ContextMenuRedirect
@@ -553,13 +546,7 @@
 }
 
 // Context menu, from HTTPS to HTTP via server redirect.
-// TODO(crbug.com/40804570): Flaky on Lacros.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_HttpsContextMenuRedirect DISABLED_HttpsContextMenuRedirect
-#else
-#define MAYBE_HttpsContextMenuRedirect HttpsContextMenuRedirect
-#endif
-IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_HttpsContextMenuRedirect) {
+IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsContextMenuRedirect) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
   RunReferrerTest(network::mojom::ReferrerPolicy::kOrigin, START_ON_HTTPS,
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
index 57901da..021bc403 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
@@ -14,7 +14,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
 #include "base/process/process_metrics.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
@@ -258,7 +258,7 @@
 // Fix for urgent discarding woes in crbug.com/883071. These protections only
 // apply on non-ChromeOS desktop platforms (Linux, Mac, Win).
 // NOTE: These do not currently provide DecisionDetails!
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   if (reason == LifecycleUnitDiscardReason::URGENT) {
     // Limit urgent discarding to once only, unless discarding for the
     // enterprise memory limit feature.
@@ -280,14 +280,14 @@
   // whether the tab can be discarded. Additional reasons can be added for
   // reporting purposes, but do not affect whether the tab can be discarded.
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (web_contents()->GetVisibility() == content::Visibility::VISIBLE)
     decision_details->AddReason(DecisionFailureReason::LIVE_STATE_VISIBLE);
 #else
   // Do not discard the tab if it is currently active in its window.
   if (tab_strip_model_->GetActiveWebContents() == web_contents())
     decision_details->AddReason(DecisionFailureReason::LIVE_STATE_VISIBLE);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Do not discard tabs in which the user has entered text in a form.
 
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
index 39232e5..07496d4 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
@@ -16,7 +16,6 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
@@ -321,7 +320,7 @@
   ExpectCanDiscardFalseTrivialAllReasons(&tab_lifecycle_unit);
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 TEST_F(TabLifecycleUnitTest, CannotDiscardActive) {
   TabLifecycleUnit tab_lifecycle_unit(GetTabLifecycleUnitSource(), &observers_,
                                       web_contents_, tab_strip_model_.get());
@@ -375,7 +374,7 @@
   GetTabLifecycleUnitSource()->SetMemoryLimitEnterprisePolicyFlag(true);
   ExpectCanDiscardTrue(&tab_lifecycle_unit, LifecycleUnitDiscardReason::URGENT);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(TabLifecycleUnitTest, CannotDiscardInvalidURL) {
   content::WebContents* web_contents = AddNewHiddenWebContentsToTabStrip();
diff --git a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
index 3e4c2b04..3f3ef3f4 100644
--- a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
@@ -17,7 +17,6 @@
 #include "base/test/simple_test_clock.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/devtools/devtools_window_testing.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
@@ -490,7 +489,7 @@
       tab_manager()->DiscardTabImpl(LifecycleUnitDiscardReason::EXTERNAL));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Makes sure that recently opened or used tabs are protected.
 // These protections only apply on non-Ash desktop platforms. Check
 // TabLifecycleUnit::CanDiscard for more details.
@@ -541,7 +540,7 @@
   // WebContentsData::WebContentsDestroyed.
   tsm->CloseAllTabs();
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Makes sure that tabs using media devices are protected.
 IN_PROC_BROWSER_TEST_P(TabManagerTest, ProtectVideoTabs) {
@@ -630,13 +629,7 @@
       tab_manager()->DiscardTabImpl(LifecycleUnitDiscardReason::EXTERNAL));
 }
 
-// TODO(crbug.com/336450782): Flaky on Lacros ASAN.
-#if BUILDFLAG(IS_CHROMEOS_LACROS) && defined(ADDRESS_SANITIZER)
-#define MAYBE_AutoDiscardable DISABLED_AutoDiscardable
-#else
-#define MAYBE_AutoDiscardable AutoDiscardable
-#endif
-IN_PROC_BROWSER_TEST_P(TabManagerTest, MAYBE_AutoDiscardable) {
+IN_PROC_BROWSER_TEST_P(TabManagerTest, AutoDiscardable) {
   // Get two tabs open.
   NavigateToURLWithDisposition(browser(), GURL(chrome::kChromeUIAboutURL),
                                WindowOpenDisposition::CURRENT_TAB,
@@ -1026,7 +1019,7 @@
 
 // On ChromeOS, active tabs are discarded if their window is non-visible. On
 // other platforms, they are never discarded.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_TRUE(
       IsTabDiscarded(browser()->tab_strip_model()->GetWebContentsAt(0)));
 #else
diff --git a/chrome/browser/resource_coordinator/tab_manager_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
index 409f7e0..749c4013 100644
--- a/chrome/browser/resource_coordinator/tab_manager_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
@@ -21,7 +21,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
 #include "chrome/browser/profiles/profile.h"
@@ -102,7 +101,7 @@
   EXPECT_TRUE(TabManager::IsInternalPage(GURL(chrome::kChromeUISettingsURL)));
 
 // Debugging URLs are not included.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_FALSE(TabManager::IsInternalPage(GURL(chrome::kChromeUIDiscardsURL)));
 #endif
   EXPECT_FALSE(
@@ -167,7 +166,7 @@
   EXPECT_TRUE(IsTabDiscarded(tab_strip1->GetWebContentsAt(1)));
   EXPECT_TRUE(IsTabDiscarded(tab_strip2->GetWebContentsAt(1)));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // On ChromeOS, a non-visible tab should be discarded even if it's active in
   // its tab strip.
   EXPECT_TRUE(IsTabDiscarded(tab_strip2->GetWebContentsAt(0)));
@@ -175,7 +174,7 @@
   // On other platforms, an active tab is never discarded, even if it's not
   // visible.
   EXPECT_FALSE(IsTabDiscarded(tab_strip2->GetWebContentsAt(0)));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Tabs with a committed URL must be closed explicitly to avoid DCHECK errors.
   tab_strip1->CloseAllTabs();
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 92c40c7..7c2e790 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -160,7 +160,10 @@
   }
 
   if (enable_glic) {
-    public_deps += [ "glic:resources" ]
+    public_deps += [
+      "glic:resources",
+      "glic/fre:resources",
+    ]
   }
 }
 
diff --git a/chrome/browser/resources/ash/inline_login/welcome_page_app.ts b/chrome/browser/resources/ash/inline_login/welcome_page_app.ts
index 4a84e7c..6186715c 100644
--- a/chrome/browser/resources/ash/inline_login/welcome_page_app.ts
+++ b/chrome/browser/resources/ash/inline_login/welcome_page_app.ts
@@ -48,8 +48,8 @@
         .forEach(link => {
           const handleClick = () =>
               this.dispatchEvent(new CustomEvent('opened-new-window'));
-          link!.addEventListener('click', handleClick as EventListener);
-          link!.addEventListener(
+          link.addEventListener('click', handleClick as EventListener);
+          link.addEventListener(
               'auxclick',
               // For middle-click, do the same things as Ctrl+click
               ((event: MouseEvent) => {
diff --git a/chrome/browser/resources/ash/print_preview/data/destination_cros.ts b/chrome/browser/resources/ash/print_preview/data/destination_cros.ts
index 86f79ce..d7a35fb 100644
--- a/chrome/browser/resources/ash/print_preview/data/destination_cros.ts
+++ b/chrome/browser/resources/ash/print_preview/data/destination_cros.ts
@@ -11,7 +11,6 @@
 import type {Cdd, ColorCapability, ColorOption, CopiesCapability, DpiOption, DuplexType, MediaSizeOption, MediaTypeOption} from './cdd.js';
 import type {ManagedPrintOptions} from './managed_print_options_cros.js';
 import {IPP_PRINT_QUALITY, managedPrintOptionsDuplexToCdd, managedPrintOptionsQualityToIpp} from './managed_print_options_cros.js';
-import type {PrinterStatus} from './printer_status_cros.js';
 import {getStatusReasonFromPrinterStatus, PrinterStatusReason} from './printer_status_cros.js';
 
 /**
@@ -433,8 +432,7 @@
         .requestPrinterStatusUpdate(this.id_)
         .then(status => {
           if (status) {
-            const statusReason =
-                getStatusReasonFromPrinterStatus(status as PrinterStatus);
+            const statusReason = getStatusReasonFromPrinterStatus(status);
             const isPrinterUnreachable =
                 statusReason === PrinterStatusReason.PRINTER_UNREACHABLE;
             if (isPrinterUnreachable && !this.printerStatusRetrySent_) {
diff --git a/chrome/browser/resources/ash/print_preview/data/destination_store.ts b/chrome/browser/resources/ash/print_preview/data/destination_store.ts
index ddd6833..0a75a52 100644
--- a/chrome/browser/resources/ash/print_preview/data/destination_store.ts
+++ b/chrome/browser/resources/ash/print_preview/data/destination_store.ts
@@ -791,7 +791,7 @@
     let inserted = false;
     destinations.forEach(destination => {
       if (destination) {
-        inserted = this.insertIntoStore_(destination!) || inserted;
+        inserted = this.insertIntoStore_(destination) || inserted;
       }
     });
     if (inserted) {
diff --git a/chrome/browser/resources/ash/print_preview/data/model.ts b/chrome/browser/resources/ash/print_preview/data/model.ts
index e3611906..2ddd9144 100644
--- a/chrome/browser/resources/ash/print_preview/data/model.ts
+++ b/chrome/browser/resources/ash/print_preview/data/model.ts
@@ -888,15 +888,15 @@
 
     const capsHasDuplex = !!caps && !!caps.duplex && !!caps.duplex.option;
     const capsHasLongEdge = capsHasDuplex &&
-        caps!.duplex!.option.some(o => o.type === DuplexType.LONG_EDGE);
+        caps.duplex!.option.some(o => o.type === DuplexType.LONG_EDGE);
     const capsHasShortEdge = capsHasDuplex &&
-        caps!.duplex!.option.some(o => o.type === DuplexType.SHORT_EDGE);
+        caps.duplex!.option.some(o => o.type === DuplexType.SHORT_EDGE);
     this.setSettingPath_(
         'duplexShortEdge.available', capsHasLongEdge && capsHasShortEdge);
     this.setSettingPath_(
         'duplex.available',
         (capsHasLongEdge || capsHasShortEdge) &&
-            caps!.duplex!.option.some(o => o.type === DuplexType.NO_DUPLEX));
+            caps.duplex!.option.some(o => o.type === DuplexType.NO_DUPLEX));
 
     this.setSettingPath_(
         'vendorItems.available', !!caps && !!caps.vendor_capability);
@@ -1128,8 +1128,8 @@
         caps.media_type && caps.media_type.option &&
         caps.media_type.option.length > 0) {
       const unavailableValue =
-          caps.media_type!.option.find(o => !!o.is_default) ||
-          caps.media_type!.option[0];
+          caps.media_type.option.find(o => !!o.is_default) ||
+          caps.media_type.option[0];
       this.setSettingPath_('mediaType.unavailableValue', unavailableValue);
     }
 
@@ -1145,7 +1145,7 @@
       this.setSetting('dpi', matchingOption || defaultOption, true);
     } else if (caps.dpi && caps.dpi.option && caps.dpi.option.length > 0) {
       const unavailableValue =
-          caps.dpi!.option.find(o => !!o.is_default) || caps.dpi!.option[0];
+          caps.dpi.option.find(o => !!o.is_default) || caps.dpi.option[0];
       this.setSettingPath_('dpi.unavailableValue', unavailableValue);
     }
 
@@ -1209,9 +1209,9 @@
         caps.duplex.option) {
       // In this case, there must only be one option.
       const hasLongEdge =
-          caps.duplex!.option.some(o => o.type === DuplexType.LONG_EDGE);
+          caps.duplex.option.some(o => o.type === DuplexType.LONG_EDGE);
       const hasShortEdge =
-          caps.duplex!.option.some(o => o.type === DuplexType.SHORT_EDGE);
+          caps.duplex.option.some(o => o.type === DuplexType.SHORT_EDGE);
       // If the only option available is long edge, the value should always be
       // true.
       this.setSettingPath_(
@@ -1737,7 +1737,7 @@
     if (!this.settings.mediaType.setFromUi &&
         managedPrintOptions.mediaType?.defaultValue) {
       const mediaType = this.destination.getMediaType(
-          managedPrintOptions.mediaType!.defaultValue);
+          managedPrintOptions.mediaType.defaultValue);
       if (mediaType) {
         this.setSetting('mediaType', mediaType, /*noSticky=*/ true);
       }
@@ -2066,7 +2066,7 @@
       } else {
         cjt.print.color = {type: selectedOption.type};
         if (selectedOption.hasOwnProperty('vendor_id')) {
-          cjt.print.color!.vendor_id = selectedOption.vendor_id;
+          cjt.print.color.vendor_id = selectedOption.vendor_id;
         }
       }
     } else {
@@ -2078,7 +2078,7 @@
       if (defaultOption) {
         cjt.print.color = {type: defaultOption.type};
         if (defaultOption.hasOwnProperty('vendor_id')) {
-          cjt.print.color!.vendor_id = defaultOption.vendor_id;
+          cjt.print.color.vendor_id = defaultOption.vendor_id;
         }
       }
     }
@@ -2103,8 +2103,8 @@
       // In this case "orientation" option is hidden from user, so user can't
       // adjust it for page content, see Landscape.isCapabilityAvailable().
       // We can improve results if we set AUTO here.
-      const capability = destination.capabilities!.printer ?
-          destination.capabilities!.printer.page_orientation :
+      const capability = destination.capabilities.printer ?
+          destination.capabilities.printer.page_orientation :
           null;
       if (capability && capability.option &&
           capability.option.some(option => option.type === 'AUTO')) {
diff --git a/chrome/browser/resources/ash/print_preview/ui/advanced_settings_dialog.ts b/chrome/browser/resources/ash/print_preview/ui/advanced_settings_dialog.ts
index 3b1ab68..1efbb77 100644
--- a/chrome/browser/resources/ash/print_preview/ui/advanced_settings_dialog.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/advanced_settings_dialog.ts
@@ -75,7 +75,7 @@
   override ready() {
     super.ready();
 
-    this.addEventListener('keydown', e => this.onKeydown_(e as KeyboardEvent));
+    this.addEventListener('keydown', e => this.onKeydown_(e));
   }
 
   override connectedCallback() {
@@ -127,7 +127,7 @@
     this.highlights_ = [];
     this.bubbles_.clear();
 
-    const listItems = this.shadowRoot!.querySelectorAll(
+    const listItems = this.shadowRoot.querySelectorAll(
         'print-preview-advanced-settings-item');
     let hasMatch = false;
     listItems.forEach(item => {
diff --git a/chrome/browser/resources/ash/print_preview/ui/advanced_settings_item.ts b/chrome/browser/resources/ash/print_preview/ui/advanced_settings_item.ts
index 86ea571..e4d3786 100644
--- a/chrome/browser/resources/ash/print_preview/ui/advanced_settings_item.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/advanced_settings_item.ts
@@ -81,7 +81,7 @@
                           VendorCapabilitySelectOption): string {
     let displayName = item.display_name;
     if (!displayName && item.display_name_localized) {
-      displayName = getStringForCurrentLocale(item.display_name_localized!);
+      displayName = getStringForCurrentLocale(item.display_name_localized);
     }
     return displayName || '';
   }
@@ -132,20 +132,20 @@
   private getCapabilityPlaceholder_(): string {
     if (this.capability.type === 'TYPED_VALUE' &&
         this.capability.typed_value_cap &&
-        this.capability.typed_value_cap!.default !== undefined) {
-      return this.capability.typed_value_cap!.default.toString() || '';
+        this.capability.typed_value_cap.default !== undefined) {
+      return this.capability.typed_value_cap.default.toString() || '';
     }
     if (this.capability.type === 'RANGE' && this.capability.range_cap &&
-        this.capability.range_cap!.default !== undefined) {
-      return this.capability.range_cap!.default.toString() || '';
+        this.capability.range_cap.default !== undefined) {
+      return this.capability.range_cap.default.toString() || '';
     }
     return '';
   }
 
   private hasOptionWithValue_(value: string): boolean {
     return !!this.capability.select_cap &&
-        !!this.capability.select_cap!.option &&
-        this.capability.select_cap!.option.some(
+        !!this.capability.select_cap.option &&
+        this.capability.select_cap.option.some(
             option => option.value === value);
   }
 
diff --git a/chrome/browser/resources/ash/print_preview/ui/destination_dialog_cros.ts b/chrome/browser/resources/ash/print_preview/ui/destination_dialog_cros.ts
index a665478..cfb87bf 100644
--- a/chrome/browser/resources/ash/print_preview/ui/destination_dialog_cros.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/destination_dialog_cros.ts
@@ -198,7 +198,7 @@
   override ready() {
     super.ready();
 
-    this.addEventListener('keydown', e => this.onKeydown_(e as KeyboardEvent));
+    this.addEventListener('keydown', e => this.onKeydown_(e));
     this.printServerStore_ = new PrintServerStore(
         (eventName: string, callback: (p: any) => void) =>
             this.addWebUiListener(eventName, callback));
diff --git a/chrome/browser/resources/ash/print_preview/ui/destination_dropdown_cros.ts b/chrome/browser/resources/ash/print_preview/ui/destination_dropdown_cros.ts
index e9068be..35b5a0d 100644
--- a/chrome/browser/resources/ash/print_preview/ui/destination_dropdown_cros.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/destination_dropdown_cros.ts
@@ -295,7 +295,7 @@
       return [];
     }
 
-    const dropdown = this.shadowRoot!.querySelector('iron-dropdown')!;
+    const dropdown = this.shadowRoot.querySelector('iron-dropdown')!;
     return Array
         .from(dropdown.querySelectorAll<HTMLButtonElement>('.list-item'))
         .filter(item => !item.hidden);
diff --git a/chrome/browser/resources/ash/print_preview/ui/margin_control.ts b/chrome/browser/resources/ash/print_preview/ui/margin_control.ts
index 47b93bd..9983dc9 100644
--- a/chrome/browser/resources/ash/print_preview/ui/margin_control.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/margin_control.ts
@@ -226,8 +226,8 @@
       return null;
     }
     assert(this.measurementSystem);
-    const decimal = this.measurementSystem!.decimalDelimiter;
-    const thousands = this.measurementSystem!.thousandsDelimiter;
+    const decimal = this.measurementSystem.decimalDelimiter;
+    const thousands = this.measurementSystem.thousandsDelimiter;
     const whole = `(?:0|[1-9]\\d*|[1-9]\\d{0,2}(?:[${thousands}]\\d{3})*)`;
     const fractional = `(?:[${decimal}]\\d+)`;
     const wholeDecimal = `(?:${whole}[${decimal}])`;
@@ -238,7 +238,7 @@
       // the dot symbol in order to use parseFloat() properly.
       value = value.replace(new RegExp(`\\${thousands}`, 'g'), '')
                   .replace(decimal, '.');
-      return this.measurementSystem!.convertToPoints(parseFloat(value));
+      return this.measurementSystem.convertToPoints(parseFloat(value));
     }
     return null;
   }
@@ -249,11 +249,11 @@
    */
   private serializeValueFromPts_(value: number): string {
     assert(this.measurementSystem);
-    value = this.measurementSystem!.convertFromPoints(value);
-    value = this.measurementSystem!.roundValue(value);
+    value = this.measurementSystem.convertFromPoints(value);
+    value = this.measurementSystem.roundValue(value);
     // Convert the dot symbol to the decimal delimiter for the locale.
     return value.toString().replace(
-        '.', this.measurementSystem!.decimalDelimiter);
+        '.', this.measurementSystem.decimalDelimiter);
   }
 
   private fire_(eventName: string, detail?: any) {
diff --git a/chrome/browser/resources/ash/print_preview/ui/pin_settings.ts b/chrome/browser/resources/ash/print_preview/ui/pin_settings.ts
index 46fc45f2..51bd95cc 100644
--- a/chrome/browser/resources/ash/print_preview/ui/pin_settings.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/pin_settings.ts
@@ -173,7 +173,7 @@
     // It's done because we don't permit multiple simultaneous validation errors
     // in Print Preview and we also don't want to set the value when sticky
     // settings may not yet have been set.
-    if (this.state !== State.READY && this.settings.pinValue!.valid) {
+    if (this.state !== State.READY && this.settings.pinValue.valid) {
       return;
     }
     this.isPinValid = this.computeValid_();
diff --git a/chrome/browser/resources/ash/print_preview/ui/plugin_proxy.ts b/chrome/browser/resources/ash/print_preview/ui/plugin_proxy.ts
index dded796..afbf6c8 100644
--- a/chrome/browser/resources/ash/print_preview/ui/plugin_proxy.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/plugin_proxy.ts
@@ -86,12 +86,12 @@
     const srcUrl = this.getPreviewUrl_(previewUid, index);
     this.plugin_ = pdfCreateOutOfProcessPlugin(
         srcUrl, 'chrome://print/pdf/index_print.html');
-    this.plugin_!.classList.add('preview-area-plugin');
+    this.plugin_.classList.add('preview-area-plugin');
     // NOTE: The plugin's 'id' field must be set to 'pdf-viewer' since
     // chrome/renderer/printing/print_render_frame_helper.cc actually
     // references it.
-    this.plugin_!.setAttribute('id', 'pdf-viewer');
-    return this.plugin_!;
+    this.plugin_.setAttribute('id', 'pdf-viewer');
+    return this.plugin_;
   }
 
   /**
diff --git a/chrome/browser/resources/ash/print_preview/ui/printer_setup_info_cros.ts b/chrome/browser/resources/ash/print_preview/ui/printer_setup_info_cros.ts
index 512009b..aa41f922 100644
--- a/chrome/browser/resources/ash/print_preview/ui/printer_setup_info_cros.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/printer_setup_info_cros.ts
@@ -127,14 +127,14 @@
     const messageData =
         MESSAGE_TYPE_LOCALIZED_STRINGS_MAP.get(this.messageType);
     assert(messageData);
-    return this.i18n(messageData!.detailKey);
+    return this.i18n(messageData.detailKey);
   }
 
   private getMessageHeading(): string {
     const messageData =
         MESSAGE_TYPE_LOCALIZED_STRINGS_MAP.get(this.messageType);
     assert(messageData);
-    return this.i18n(messageData!.headingKey);
+    return this.i18n(messageData.headingKey);
   }
 
   private onManagePrintersClicked(): void {
@@ -172,7 +172,7 @@
     const parentShadowRoot = this.shadowRoot!.host.getRootNode() as ShadowRoot;
     assert(parentShadowRoot);
     const previewContainer =
-        parentShadowRoot!.querySelector<HTMLElement>('.preview-area-message');
+        parentShadowRoot.querySelector<HTMLElement>('.preview-area-message');
     assert(previewContainer);
     return previewContainer;
   }
diff --git a/chrome/browser/resources/ash/print_preview/ui/provisional_destination_resolver.ts b/chrome/browser/resources/ash/print_preview/ui/provisional_destination_resolver.ts
index b0779f2..345fba6 100644
--- a/chrome/browser/resources/ash/print_preview/ui/provisional_destination_resolver.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/provisional_destination_resolver.ts
@@ -98,12 +98,12 @@
     const icon = this.shadowRoot!.querySelector<HTMLElement>('.extension-icon');
     assert(icon);
     icon.style.backgroundImage = 'image-set(' +
-        'url(chrome://extension-icon/' + this.destination_!.extensionId +
+        'url(chrome://extension-icon/' + this.destination_.extensionId +
         '/24/1) 1x,' +
-        'url(chrome://extension-icon/' + this.destination_!.extensionId +
+        'url(chrome://extension-icon/' + this.destination_.extensionId +
         '/48/1) 2x)';
     this.promiseResolver_ = new PromiseResolver();
-    return this.promiseResolver_!.promise;
+    return this.promiseResolver_.promise;
   }
 
   /**
@@ -130,7 +130,7 @@
 
           if (resolvedDestination) {
             this.state_ = ResolverState.DONE;
-            this.promiseResolver_!.resolve(resolvedDestination!);
+            this.promiseResolver_!.resolve(resolvedDestination);
             this.promiseResolver_ = null;
             this.$.dialog.close();
           } else {
diff --git a/chrome/browser/resources/ash/print_preview/ui/searchable_drop_down_cros.ts b/chrome/browser/resources/ash/print_preview/ui/searchable_drop_down_cros.ts
index abeeb0e..9806f01 100644
--- a/chrome/browser/resources/ash/print_preview/ui/searchable_drop_down_cros.ts
+++ b/chrome/browser/resources/ash/print_preview/ui/searchable_drop_down_cros.ts
@@ -386,12 +386,12 @@
     } else {
       const delta = moveDown ? 1 : -1;
       nextIndex = (numItems + currentIndex + delta) % numItems;
-      items[currentIndex]!.removeAttribute('selected_');
+      items[currentIndex].removeAttribute('selected_');
     }
-    items[nextIndex]!.setAttribute('selected_', '');
+    items[nextIndex].setAttribute('selected_', '');
     // The newly selected item might not be visible because the dropdown needs
     // to be scrolled. So scroll the dropdown if necessary.
-    items[nextIndex]!.scrollIntoViewIfNeeded();
+    items[nextIndex].scrollIntoViewIfNeeded();
   }
 
   private onInput_() {
diff --git a/chrome/browser/resources/ash/settings/common/app_management/reducers.ts b/chrome/browser/resources/ash/settings/common/app_management/reducers.ts
index b3b144b..eaa1746 100644
--- a/chrome/browser/resources/ash/settings/common/app_management/reducers.ts
+++ b/chrome/browser/resources/ash/settings/common/app_management/reducers.ts
@@ -50,11 +50,11 @@
 export function updateApps(apps: AppMap, action: AppManagementActions): AppMap {
   switch (action.name) {
     case 'add-app':
-      return addApp(apps, action as AddAppAction);
+      return addApp(apps, action);
     case 'change-app':
-      return changeApp(apps, action as ChangeAppAction);
+      return changeApp(apps, action);
     case 'remove-app':
-      return removeApp(apps, action as RemoveAppAction);
+      return removeApp(apps, action);
     default:
       return apps;
   }
diff --git a/chrome/browser/resources/ash/settings/crostini_page/crostini_browser_proxy.ts b/chrome/browser/resources/ash/settings/crostini_page/crostini_browser_proxy.ts
index 5bb6607..177abe0 100644
--- a/chrome/browser/resources/ash/settings/crostini_page/crostini_browser_proxy.ts
+++ b/chrome/browser/resources/ash/settings/crostini_page/crostini_browser_proxy.ts
@@ -73,9 +73,8 @@
 
 export const PortState = {
   VALID: '',
-  INVALID: loadTimeData.getString('crostiniPortForwardingAddError') as string,
-  DUPLICATE: loadTimeData.getString('crostiniPortForwardingAddExisting') as
-      string,
+  INVALID: loadTimeData.getString('crostiniPortForwardingAddError'),
+  DUPLICATE: loadTimeData.getString('crostiniPortForwardingAddExisting'),
 };
 
 export const MIN_VALID_PORT_NUMBER = 1024;   // Minimum 16-bit integer value.
diff --git a/chrome/browser/resources/ash/settings/device_page/customize_button_row.ts b/chrome/browser/resources/ash/settings/device_page/customize_button_row.ts
index 23d0b96e..408616d 100644
--- a/chrome/browser/resources/ash/settings/device_page/customize_button_row.ts
+++ b/chrome/browser/resources/ash/settings/device_page/customize_button_row.ts
@@ -140,9 +140,9 @@
     super.connectedCallback();
     this.observeButtonPresses();
     // Focus dropdown right away as this button was just pressed.
-    this.$.remappingActionDropdown!.focus();
+    this.$.remappingActionDropdown.focus();
 
-    this.$.reorderButton!.addEventListener(
+    this.$.reorderButton.addEventListener(
         'keydown', this.handleKeyDownReorderButton_);
     this.addEventListener(
         'reorder-button-direction', this.onButtonReorderDirectEvent_);
@@ -150,7 +150,7 @@
 
   override disconnectedCallback(): void {
     super.disconnectedCallback();
-    this.$.reorderButton!.removeEventListener(
+    this.$.reorderButton.removeEventListener(
         'keydown', this.handleKeyDownReorderButton_);
     this.removeEventListener(
         'reorder-button-direction', this.onButtonReorderDirectEvent_);
@@ -221,7 +221,7 @@
 
   onButtonPressed(button: Button): void {
     if (buttonsAreEqual(button, this.buttonRemapping_.button)) {
-      this.$.remappingActionDropdown!.focus();
+      this.$.remappingActionDropdown.focus();
     }
   }
 
diff --git a/chrome/browser/resources/ash/settings/device_page/customize_button_select.ts b/chrome/browser/resources/ash/settings/device_page/customize_button_select.ts
index 44dba69..ca65087d 100644
--- a/chrome/browser/resources/ash/settings/device_page/customize_button_select.ts
+++ b/chrome/browser/resources/ash/settings/device_page/customize_button_select.ts
@@ -546,7 +546,7 @@
     dropdownMenuOptions[indexOfNewRow]?.scrollIntoViewIfNeeded();
 
     // Update the highlighted value.
-    this.highlightedValue_ = this.menu[indexOfNewRow]!.value as string;
+    this.highlightedValue_ = this.menu[indexOfNewRow].value as string;
   }
 
   private updateDropdownSelection_(): void {
diff --git a/chrome/browser/resources/ash/settings/device_page/customize_mouse_buttons_subpage.ts b/chrome/browser/resources/ash/settings/device_page/customize_mouse_buttons_subpage.ts
index 75c350c..2350a30 100644
--- a/chrome/browser/resources/ash/settings/device_page/customize_mouse_buttons_subpage.ts
+++ b/chrome/browser/resources/ash/settings/device_page/customize_mouse_buttons_subpage.ts
@@ -197,9 +197,9 @@
       return;
     }
 
-    this.selectedMouse!.settings!.swapRight = this.primaryRightPref_.value;
+    this.selectedMouse.settings.swapRight = this.primaryRightPref_.value;
     this.inputDeviceSettingsProvider_.setMouseSettings(
-        this.selectedMouse!.id, this.selectedMouse!.settings);
+        this.selectedMouse.id, this.selectedMouse.settings);
   }
 
   private getDescription_(): string {
@@ -207,7 +207,7 @@
       return '';
     }
     return this.i18n(
-        'customizeButtonSubpageDescription', this.selectedMouse!.name);
+        'customizeButtonSubpageDescription', this.selectedMouse.name);
   }
 
   private getcustomizeMouseButtonsNudgeHeader_(): string {
diff --git a/chrome/browser/resources/ash/settings/device_page/customize_pen_buttons_subpage.ts b/chrome/browser/resources/ash/settings/device_page/customize_pen_buttons_subpage.ts
index fb87492..7bc0215 100644
--- a/chrome/browser/resources/ash/settings/device_page/customize_pen_buttons_subpage.ts
+++ b/chrome/browser/resources/ash/settings/device_page/customize_pen_buttons_subpage.ts
@@ -168,7 +168,7 @@
     }
 
     this.inputDeviceSettingsProvider_.setGraphicsTabletSettings(
-        this.selectedTablet!.id, this.selectedTablet!.settings);
+        this.selectedTablet.id, this.selectedTablet.settings);
   }
 
   private getDescription_(): string {
@@ -176,7 +176,7 @@
       return '';
     }
     return this.i18n(
-        'customizeTabletButtonSubpageDescription', this.selectedTablet!.name);
+        'customizeTabletButtonSubpageDescription', this.selectedTablet.name);
   }
 
   private getcustomizePenButtonsNudgeHeader_(): string {
diff --git a/chrome/browser/resources/ash/settings/device_page/customize_tablet_buttons_subpage.ts b/chrome/browser/resources/ash/settings/device_page/customize_tablet_buttons_subpage.ts
index 006e629..509c28b6 100644
--- a/chrome/browser/resources/ash/settings/device_page/customize_tablet_buttons_subpage.ts
+++ b/chrome/browser/resources/ash/settings/device_page/customize_tablet_buttons_subpage.ts
@@ -167,7 +167,7 @@
     }
 
     this.inputDeviceSettingsProvider_.setGraphicsTabletSettings(
-        this.selectedTablet!.id, this.selectedTablet!.settings);
+        this.selectedTablet.id, this.selectedTablet.settings);
   }
 
   private getDescription_(): string {
@@ -175,7 +175,7 @@
       return '';
     }
     return this.i18n(
-        'customizeTabletButtonSubpageDescription', this.selectedTablet!.name);
+        'customizeTabletButtonSubpageDescription', this.selectedTablet.name);
   }
 
   private getcustomizeTabletButtonsNudgeHeader_(): string {
diff --git a/chrome/browser/resources/ash/settings/device_page/key_combination_input_dialog.ts b/chrome/browser/resources/ash/settings/device_page/key_combination_input_dialog.ts
index c1c7423e..248b598 100644
--- a/chrome/browser/resources/ash/settings/device_page/key_combination_input_dialog.ts
+++ b/chrome/browser/resources/ash/settings/device_page/key_combination_input_dialog.ts
@@ -170,8 +170,7 @@
     }
     const prevKeyEvent: KeyEvent|undefined =
         this.buttonRemapping_.remappingAction?.keyEvent;
-    if (!prevKeyEvent ||
-        !keyEventsAreEqual(this.inputKeyEvent, prevKeyEvent!)) {
+    if (!prevKeyEvent || !keyEventsAreEqual(this.inputKeyEvent, prevKeyEvent)) {
       this.set(
           `buttonRemappingList.${this.remappingIndex}`,
           this.getUpdatedButtonRemapping_());
diff --git a/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_subsection.ts b/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_subsection.ts
index e575e9b..97af672 100644
--- a/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_subsection.ts
+++ b/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_subsection.ts
@@ -43,7 +43,7 @@
 import {Router, routes} from '../router.js';
 
 import {getInputDeviceSettingsProvider} from './input_device_mojo_interface_provider.js';
-import type {InputDeviceSettingsProviderInterface, Keyboard, KeyboardPolicies, KeyboardSettings, SixPackKeyInfo} from './input_device_settings_types.js';
+import type {InputDeviceSettingsProviderInterface, Keyboard, KeyboardPolicies, KeyboardSettings} from './input_device_settings_types.js';
 import {CompanionAppState, MetaKey, ModifierKey, SixPackShortcutModifier} from './input_device_settings_types.js';
 import {getPrefPolicyFields, settingsAreEqual} from './input_device_settings_utils.js';
 import {getTemplate} from './per_device_keyboard_subsection.html.js';
@@ -392,8 +392,7 @@
       return 0;
     }
 
-    return Object
-        .values(this.keyboard.settings.sixPackKeyRemappings as SixPackKeyInfo)
+    return Object.values(this.keyboard.settings.sixPackKeyRemappings)
         .filter(
             (modifier: SixPackShortcutModifier) =>
                 modifier !== SixPackShortcutModifier.kSearch)
diff --git a/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts b/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts
index cde3dc99..2d95eb9 100644
--- a/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/cellular_roaming_toggle_button.ts
@@ -144,7 +144,7 @@
 
   private managedPropertiesChanged_(): void {
     if (!this.managedProperties ||
-        !this.managedProperties!.typeProperties.cellular!.allowRoaming) {
+        !this.managedProperties.typeProperties.cellular!.allowRoaming) {
       return;
     }
 
diff --git a/chrome/browser/resources/ash/settings/internet_page/hotspot_config_dialog.ts b/chrome/browser/resources/ash/settings/internet_page/hotspot_config_dialog.ts
index 6fa06da..a5f9b792 100644
--- a/chrome/browser/resources/ash/settings/internet_page/hotspot_config_dialog.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/hotspot_config_dialog.ts
@@ -164,7 +164,7 @@
   }
 
   private getSecurityItems_(): string[] {
-    return this.hotspotInfo!.allowedWifiSecurityModes.map(security => {
+    return this.hotspotInfo.allowedWifiSecurityModes.map(security => {
       return this.getWifiSecurityTypeString_(security);
     });
   }
diff --git a/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts b/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts
index 2ae49284..31e81b7 100644
--- a/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/internet_detail_subpage.ts
@@ -709,9 +709,9 @@
     this.updateHiddenPref_();
 
     if (this.isCellular_(this.managedProperties_) &&
-        this.managedProperties_!.typeProperties.cellular!.allowTextMessages) {
+        this.managedProperties_.typeProperties.cellular!.allowTextMessages) {
       this.suppressTextMessagesOverride_ = !!OncMojo.getActiveValue(
-          this.managedProperties_!.typeProperties.cellular!.allowTextMessages);
+          this.managedProperties_.typeProperties.cellular!.allowTextMessages);
     }
 
     const metered = this.managedProperties_.metered;
diff --git a/chrome/browser/resources/ash/settings/internet_page/internet_page.ts b/chrome/browser/resources/ash/settings/internet_page/internet_page.ts
index 7a1e61f..1998358 100644
--- a/chrome/browser/resources/ash/settings/internet_page/internet_page.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/internet_page.ts
@@ -534,7 +534,7 @@
     afterNextRender(this, () => {
       const networkRow =
           this.shadowRoot!.querySelector('network-summary')!.getNetworkRow(
-              networkType!);
+              networkType);
       if (networkRow) {
         const toggleEl = networkRow.getDeviceEnabledToggle();
         if (toggleEl) {
diff --git a/chrome/browser/resources/ash/settings/internet_page/passpoint_subpage.ts b/chrome/browser/resources/ash/settings/internet_page/passpoint_subpage.ts
index 5609064..6d4cb18 100644
--- a/chrome/browser/resources/ash/settings/internet_page/passpoint_subpage.ts
+++ b/chrome/browser/resources/ash/settings/internet_page/passpoint_subpage.ts
@@ -175,7 +175,7 @@
     };
     const response = await this.networkConfig_.getNetworkStateList(filter);
     this.networks_ = response.result.filter(network => {
-      return network.typeState!.wifi!.passpointId === subscription.id;
+      return network.typeState.wifi!.passpointId === subscription.id;
     });
   }
 
diff --git a/chrome/browser/resources/ash/settings/kerberos_page/kerberos_accounts_browser_proxy.ts b/chrome/browser/resources/ash/settings/kerberos_page/kerberos_accounts_browser_proxy.ts
index 49a3074..6e0f02b5 100644
--- a/chrome/browser/resources/ash/settings/kerberos_page/kerberos_accounts_browser_proxy.ts
+++ b/chrome/browser/resources/ash/settings/kerberos_page/kerberos_accounts_browser_proxy.ts
@@ -140,7 +140,7 @@
   }
 
   removeAccount(account: KerberosAccount): Promise<KerberosErrorType> {
-    return sendWithPromise('removeKerberosAccount', account!.principalName);
+    return sendWithPromise('removeKerberosAccount', account.principalName);
   }
 
   validateConfig(krb5conf: string): Promise<ValidateKerberosConfigResult> {
@@ -148,6 +148,6 @@
   }
 
   setAsActiveAccount(account: KerberosAccount): void {
-    chrome.send('setAsActiveKerberosAccount', [account!.principalName]);
+    chrome.send('setAsActiveKerberosAccount', [account.principalName]);
   }
 }
diff --git a/chrome/browser/resources/ash/settings/kerberos_page/kerberos_add_account_dialog.ts b/chrome/browser/resources/ash/settings/kerberos_page/kerberos_add_account_dialog.ts
index 8aa7ffc..04fd246 100644
--- a/chrome/browser/resources/ash/settings/kerberos_page/kerberos_add_account_dialog.ts
+++ b/chrome/browser/resources/ash/settings/kerberos_page/kerberos_add_account_dialog.ts
@@ -241,7 +241,7 @@
         this.useStoredPassword_ = true;
       }
 
-      this.config_ = this.presetAccount!.config;
+      this.config_ = this.presetAccount.config;
     } else {
       // Add a new Kerberos account.
       this.title_ = this.i18n('addKerberosAccount');
diff --git a/chrome/browser/resources/ash/settings/multidevice_page/multidevice_smartlock_item.ts b/chrome/browser/resources/ash/settings/multidevice_page/multidevice_smartlock_item.ts
index 8cc0cb79..f4f2c0a 100644
--- a/chrome/browser/resources/ash/settings/multidevice_page/multidevice_smartlock_item.ts
+++ b/chrome/browser/resources/ash/settings/multidevice_page/multidevice_smartlock_item.ts
@@ -109,8 +109,7 @@
     const feature = event.detail.feature;
     const enabled = event.detail.enabled;
 
-    this.browserProxy_.setFeatureEnabledState(
-        feature, enabled, this.authToken!);
+    this.browserProxy_.setFeatureEnabledState(feature, enabled, this.authToken);
 
     recordSettingChange(Setting.kSmartLockOnOff);
   }
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/chromevox_subpage.ts b/chrome/browser/resources/ash/settings/os_a11y_page/chromevox_subpage.ts
index 2d79965..9a189d66 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/chromevox_subpage.ts
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/chromevox_subpage.ts
@@ -530,11 +530,11 @@
     }
     if (table.grade && !table.variant) {
       return this.i18n(
-          'chromeVoxBrailleTableNameWithGrade', baseName, table.grade!);
+          'chromeVoxBrailleTableNameWithGrade', baseName, table.grade);
     }
     if (!table.grade && table.variant) {
       return this.i18n(
-          'chromeVoxBrailleTableNameWithVariant', baseName, table.variant!);
+          'chromeVoxBrailleTableNameWithVariant', baseName, table.variant);
     }
 
     return this.i18n(
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_add_dialog.ts b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_add_dialog.ts
index 2280fc9..438dc09 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_add_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_add_dialog.ts
@@ -721,7 +721,7 @@
         video: {facingMode: 'user'},
       });
       this.streamTrack_ = this.stream_.getVideoTracks()[0];
-      videoElement!.srcObject = this.stream_;
+      videoElement.srcObject = this.stream_;
     }
   }
 
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts
index 3be998a..18e4023 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts
@@ -43,8 +43,7 @@
 }
 
 export class FaceGazeActionsCardElement extends FaceGazeActionsCardElementBase {
-  static readonly FACEGAZE_COMMAND_PAIRS_PROPERTY_NAME =
-      'commandPairs_' as const;
+  static readonly FACEGAZE_COMMAND_PAIRS_PROPERTY_NAME = 'commandPairs_';
   disabled: boolean;
 
   private showAddActionDialog_: boolean;
@@ -243,7 +242,7 @@
              assignedGestures)) {
       if (assignedMacro === removedCommandPair.action &&
           currentGesture === removedCommandPair.gesture) {
-        delete assignedGestures[currentGesture as FacialGesture];
+        delete assignedGestures[currentGesture];
         break;
       }
     }
@@ -395,7 +394,7 @@
              assignedKeyCombos)) {
       if (currentGesture === gesture &&
           keyCombo === removedKeyCombo.prefString) {
-        delete assignedKeyCombos[currentGesture as FacialGesture];
+        delete assignedKeyCombos[currentGesture];
         break;
       }
     }
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_constants.ts b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_constants.ts
index 94a82e8..48051aae 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_constants.ts
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_constants.ts
@@ -157,10 +157,10 @@
 }
 
 export const FACEGAZE_COMMAND_PAIR_ADDED_EVENT_NAME =
-    'facegaze-command-pair-added' as const;
+    'facegaze-command-pair-added';
 
 export const FACEGAZE_ACTION_ASSIGN_GESTURE_EVENT_NAME =
-    'facegaze-assign-gesture' as const;
+    'facegaze-assign-gesture';
 
 export class FaceGazeUtils {
   /**
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/live_caption_section.ts b/chrome/browser/resources/ash/settings/os_a11y_page/live_caption_section.ts
index 75fccbf..4f8c961 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/live_caption_section.ts
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/live_caption_section.ts
@@ -206,7 +206,7 @@
     this.$.menu.get().close();
     this.installedLanguagePacks_ = this.installedLanguagePacks_.filter(
         languagePack => languagePack.code !== this.detailLanguage_!.code);
-    this.browserProxy_.removeLanguagePack(this.detailLanguage_!.code);
+    this.browserProxy_.removeLanguagePack(this.detailLanguage_.code);
 
     if (this.installedLanguagePacks_.length === 0) {
       this.setPrefValue('accessibility.captions.live_caption_enabled', false);
diff --git a/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts b/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts
index 7dfc0ba..4e52af51 100644
--- a/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts
+++ b/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts
@@ -546,7 +546,7 @@
         return this.i18nAdvanced('aboutUpgradeUpToDate');
       case UpdateStatus.UPDATING:
         assert(typeof this.currentUpdateStatusEvent_.progress === 'number');
-        const progressPercent = this.currentUpdateStatusEvent_.progress! + '%';
+        const progressPercent = this.currentUpdateStatusEvent_.progress + '%';
 
         if (this.currentChannel_ !== this.targetChannel_) {
           return this.i18nAdvanced('aboutUpgradeUpdatingChannelSwitch', {
@@ -563,7 +563,7 @@
             substitutions: [this.deviceManager_, progressPercent],
           });
         }
-        if (this.currentUpdateStatusEvent_.progress! > 0) {
+        if (this.currentUpdateStatusEvent_.progress > 0) {
           // NOTE(dbeam): some platforms (i.e. Mac) always send 0% while
           // updating (they don't support incremental upgrade progress). Though
           // it's certainly quite possible to validly end up here with 0% on
diff --git a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/app_content_dialog.ts b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/app_content_dialog.ts
index 8c9cd21..86e488f 100644
--- a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/app_content_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/app_content_dialog.ts
@@ -34,7 +34,7 @@
 
   override ready(): void {
     super.ready();
-    this.addEventListener('keydown', e => this.trapFocus_(e as KeyboardEvent));
+    this.addEventListener('keydown', e => this.trapFocus_(e));
   }
 
   // The close button is the only tabbable element in the dialog, so focus
diff --git a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/permission_item.ts b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/permission_item.ts
index acdc9e7..31aaaf5 100644
--- a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/permission_item.ts
+++ b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/permission_item.ts
@@ -241,7 +241,7 @@
     }
 
     BrowserProxy.getInstance().handler.setPermission(
-        this.app.id, newPermission!);
+        this.app.id, newPermission);
 
     recordAppManagementUserAction(
         this.app.type,
diff --git a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_dialog.ts b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_dialog.ts
index 758ebe1..e0cedfa 100644
--- a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_dialog.ts
@@ -35,8 +35,7 @@
 
   override ready(): void {
     super.ready();
-    this.addEventListener(
-        'keydown', e => this.trapDialogFocus_(e as KeyboardEvent));
+    this.addEventListener('keydown', e => this.trapDialogFocus_(e));
   }
 
   // The close button is the only tabbable element in the dialog, so focus
diff --git a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_item.ts b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_item.ts
index e750d08..32ce9e163 100644
--- a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_item.ts
+++ b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_item.ts
@@ -28,7 +28,7 @@
 import type {AppManagementSupportedLinksOverlappingAppsDialogElement} from './supported_links_overlapping_apps_dialog.js';
 
 type PreferenceType = 'preferred'|'browser';
-const PREFERRED_APP_PREF = 'preferred' as const;
+const PREFERRED_APP_PREF = 'preferred';
 
 export interface AppManagementSupportedLinksItemElement {
   $: {
@@ -159,7 +159,7 @@
     }
     this.overlappingAppIds_ = overlappingAppIds;
 
-    const appNames = overlappingAppIds.map(appId => apps[appId]!.title!);
+    const appNames = overlappingAppIds.map(appId => apps[appId].title!);
     if (appNames.length === 0) {
       this.showOverlappingAppsWarning_ = false;
       return;
diff --git a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.ts b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.ts
index f0d3341..31ff953 100644
--- a/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.ts
@@ -52,7 +52,7 @@
 
   private getBodyText_(apps: AppMap): string {
     const appNames: string[] = this.overlappingAppIds.map(appId => {
-      return apps[appId]!.title!;
+      return apps[appId].title!;
     });
 
     const appTitle = castExists(this.app.title);
diff --git a/chrome/browser/resources/ash/settings/os_files_page/google_drive_subpage.ts b/chrome/browser/resources/ash/settings/os_files_page/google_drive_subpage.ts
index 579c51f..f0144128 100644
--- a/chrome/browser/resources/ash/settings/os_files_page/google_drive_subpage.ts
+++ b/chrome/browser/resources/ash/settings/os_files_page/google_drive_subpage.ts
@@ -494,8 +494,8 @@
     const {requiredSpace, freeSpace} = this.bulkPinningStatus_;
     return this.i18n(
         'googleDriveFileSyncSubtitleWithStorage',
-        requiredSpace!,
-        freeSpace!,
+        requiredSpace,
+        freeSpace,
     );
   }
 
@@ -594,7 +594,7 @@
     return this.i18nAdvanced('googleDriveOfflineCleanStorageDialogBody', {
       tags: ['a'],
       substitutions: [
-        this.contentCacheSize_!,
+        this.contentCacheSize_,
         this.i18n('googleDriveCleanUpStorageLearnMoreLink'),
       ],
     });
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/add_items_dialog.ts b/chrome/browser/resources/ash/settings/os_languages_page/add_items_dialog.ts
index e473684c..e4b9144 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/add_items_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/add_items_dialog.ts
@@ -28,7 +28,7 @@
 
 import {getTemplate} from './add_items_dialog.html.js';
 
-const ITEMS_ADDED_EVENT_NAME = 'items-added' as const;
+const ITEMS_ADDED_EVENT_NAME = 'items-added';
 
 /**
  * `id` must unique.
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/app_languages_page.ts b/chrome/browser/resources/ash/settings/os_languages_page/app_languages_page.ts
index 894c0074..afedec6c 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/app_languages_page.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/app_languages_page.ts
@@ -106,8 +106,8 @@
    */
   private getSelectedLocale_(app: App): string {
     if (app.selectedLocale?.localeTag) {
-      const displayName = app.selectedLocale!.displayName;
-      return displayName || app.selectedLocale!.localeTag;
+      const displayName = app.selectedLocale.displayName;
+      return displayName || app.selectedLocale.localeTag;
     }
     return this.i18n('appLanguageDeviceLanguageLabel');
   }
@@ -181,8 +181,8 @@
     });
 
     return filteredApps.sort((a, b) => {
-      assert(a!.title);
-      assert(b!.title);
+      assert(a.title);
+      assert(b.title);
       return alphabeticalSort(a.title, b.title);
     });
   }
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/input_method_options_page.ts b/chrome/browser/resources/ash/settings/os_languages_page/input_method_options_page.ts
index 99042a91..1d3a776 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/input_method_options_page.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/input_method_options_page.ts
@@ -448,7 +448,7 @@
     }
     // Safety: `updatedSettings[engineId]` is guaranteed to be defined as we
     // defined it above.
-    updatedSettings[engineId]![optionName] = newValue;
+    updatedSettings[engineId][optionName] = newValue;
 
     this.setPrefValue(PREFS_PATH, updatedSettings);
   }
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/input_method_util.ts b/chrome/browser/resources/ash/settings/os_languages_page/input_method_util.ts
index 093e2d08..7a660915 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/input_method_util.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/input_method_util.ts
@@ -535,7 +535,7 @@
             // `options.length`, and `options` is immediately pushed to, so the
             // values of `pushedOptions` must always be valid indices into
             // `options`.
-            options[optionsIndex]!.optionNames.push(...optionNames);
+            options[optionsIndex].optionNames.push(...optionNames);
           }
         }
       }
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/input_page.ts b/chrome/browser/resources/ash/settings/os_languages_page/input_page.ts
index 5ee13151..80494cf 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/input_page.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/input_page.ts
@@ -234,7 +234,7 @@
         this.metaKey_ = metaKey;
       });
 
-      this.acceleratorFetcher!.observeAcceleratorChanges(
+      this.acceleratorFetcher.observeAcceleratorChanges(
           [
             AcceleratorAction.kSwitchToLastUsedIme,
             AcceleratorAction.kSwitchToNextIme,
@@ -325,7 +325,7 @@
     }
     // Disable if all allowed input methods are already enabled.
     if (this.languages &&
-        !this.languages!.inputMethods!.supported
+        !this.languages.inputMethods!.supported
              .filter(
                  inputMethod =>
                      !this.languageHelper.isInputMethodEnabled(inputMethod.id))
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/languages.ts b/chrome/browser/resources/ash/settings/os_languages_page/languages.ts
index 6c7d9df..ace146d 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/languages.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/languages.ts
@@ -1117,7 +1117,7 @@
     const result = languageCode.match(/^([^-]+)-?/)!;
     // Safety: The regex above has one non-optional capturing group.
     assert(result.length === 2);
-    return result[1]!;
+    return result[1];
   }
 
   getLanguage(languageCode: string): chrome.languageSettingsPrivate.Language
diff --git a/chrome/browser/resources/ash/settings/os_people_page/os_sync_controls_subpage.ts b/chrome/browser/resources/ash/settings/os_people_page/os_sync_controls_subpage.ts
index 35cf20e8..35f87d5 100644
--- a/chrome/browser/resources/ash/settings/os_people_page/os_sync_controls_subpage.ts
+++ b/chrome/browser/resources/ash/settings/os_people_page/os_sync_controls_subpage.ts
@@ -224,7 +224,7 @@
    * Whether the sync data type toggles should be disabled.
    */
   private computeDataTypeTogglesDisabled_(): boolean {
-    return this.osSyncPrefs !== undefined && this.osSyncPrefs!.syncAllOsTypes;
+    return this.osSyncPrefs !== undefined && this.osSyncPrefs.syncAllOsTypes;
   }
 
   /**
diff --git a/chrome/browser/resources/ash/settings/os_people_page/user_list.ts b/chrome/browser/resources/ash/settings/os_people_page/user_list.ts
index b31ae57..9bb4e78 100644
--- a/chrome/browser/resources/ash/settings/os_people_page/user_list.ts
+++ b/chrome/browser/resources/ash/settings/os_people_page/user_list.ts
@@ -20,7 +20,6 @@
 import '../settings_shared.css.js';
 import '../settings_vars.css.js';
 
-import type {CrA11yAnnouncerElement} from 'chrome://resources/ash/common/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/ash/common/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {CrScrollableMixin} from 'chrome://resources/ash/common/cr_elements/cr_scrollable_mixin.js';
 import {I18nMixin} from 'chrome://resources/ash/common/cr_elements/i18n_mixin.js';
@@ -128,7 +127,7 @@
   }
 
   private removeUser_(e: DomRepeatEvent<chrome.usersPrivate.User>): void {
-    (getAnnouncerInstance() as CrA11yAnnouncerElement)
+    (getAnnouncerInstance())
         .announce(this.i18n('userRemovedMessage', e.model.item.name));
 
     // Focus the add user button since, after this removal, the only user left
diff --git a/chrome/browser/resources/ash/settings/os_printing_page/cups_add_printer_manually_dialog.ts b/chrome/browser/resources/ash/settings/os_printing_page/cups_add_printer_manually_dialog.ts
index ef10386..8ffc938 100644
--- a/chrome/browser/resources/ash/settings/os_printing_page/cups_add_printer_manually_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_printing_page/cups_add_printer_manually_dialog.ts
@@ -156,7 +156,7 @@
               this.onAddPrinterSucceeded_.bind(this),
               this.onAddPrinterFailed_.bind(this));
     } else {
-      this.getAddPrinterDialog_()!.close();
+      this.getAddPrinterDialog_().close();
       this.openManufacturerModelDialog_();
     }
   }
@@ -179,13 +179,13 @@
       this.browserProxy_.getPrinterInfo(this.newPrinter)
           .then(this.onPrinterFound_.bind(this), this.infoFailed_.bind(this));
     } else {
-      this.getAddPrinterDialog_()!.close();
+      this.getAddPrinterDialog_().close();
       this.openManufacturerModelDialog_();
     }
   }
 
   private onPrintServerClick_(): void {
-    this.getAddPrinterDialog_()!.close();
+    this.getAddPrinterDialog_().close();
 
     const openAddPrintServerDialogEvent =
         new CustomEvent('open-add-print-server-dialog', {
@@ -199,7 +199,7 @@
     // Queue input should be hidden when protocol is set to "App Socket".
     const selectEl = cast(event.target, HTMLSelectElement);
     this.showPrinterQueue_ = selectEl.value !== 'socket';
-    this.set('newPrinter.printerProtocol', selectEl!.value);
+    this.set('newPrinter.printerProtocol', selectEl.value);
   }
 
   private canAddPrinter_(): boolean {
diff --git a/chrome/browser/resources/ash/settings/os_printing_page/cups_edit_printer_dialog.ts b/chrome/browser/resources/ash/settings/os_printing_page/cups_edit_printer_dialog.ts
index 7c82b69..85a35d7 100644
--- a/chrome/browser/resources/ash/settings/os_printing_page/cups_edit_printer_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_printing_page/cups_edit_printer_dialog.ts
@@ -249,7 +249,7 @@
 
   private onProtocolChange_(event: Event): void {
     const selectEl = cast(event.target, HTMLSelectElement);
-    this.set('pendingPrinter_.printerProtocol', selectEl!.value);
+    this.set('pendingPrinter_.printerProtocol', selectEl.value);
     this.onPrinterInfoChange_();
   }
 
diff --git a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_camera_subpage.ts b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_camera_subpage.ts
index adf5bfe..0e6d432 100644
--- a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_camera_subpage.ts
+++ b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_camera_subpage.ts
@@ -183,7 +183,7 @@
    * The function is used for sorting app names alphabetically.
    */
   private alphabeticalSort_(first: App, second: App): number {
-    return first.name!.localeCompare(second.name!);
+    return first.name.localeCompare(second.name);
   }
 
   private isCameraPermissionEnabled_(app: App): boolean {
diff --git a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts
index 8190ad2..9ca67ed 100644
--- a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts
+++ b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts
@@ -178,7 +178,7 @@
    * The function is used for sorting app names alphabetically.
    */
   private alphabeticalSort_(first: App, second: App): number {
-    return first.name!.localeCompare(second.name!);
+    return first.name.localeCompare(second.name);
   }
 
   private async updateMicrophoneList_(): Promise<void> {
diff --git a/chrome/browser/resources/ash/settings/os_settings_search_box/os_search_result_row.ts b/chrome/browser/resources/ash/settings/os_settings_search_box/os_search_result_row.ts
index 98d578c..e57f3431 100644
--- a/chrome/browser/resources/ash/settings/os_settings_search_box/os_search_result_row.ts
+++ b/chrome/browser/resources/ash/settings/os_settings_search_box/os_search_result_row.ts
@@ -580,7 +580,7 @@
       return;
     }
 
-    const settingsSearchResult = this.searchResult as SettingsSearchResult;
+    const settingsSearchResult = this.searchResult;
     chrome.metricsPrivate.recordEnumerationValue(
         'ChromeOS.Settings.SearchResultTypeSelected', settingsSearchResult.type,
         SearchResultType.MAX_VALUE);
@@ -612,8 +612,7 @@
           }
         };
 
-    const args =
-        metricArgs(settingsSearchResult.type, settingsSearchResult.id)!;
+    const args = metricArgs(settingsSearchResult.type, settingsSearchResult.id);
     if (args.value) {
       chrome.metricsPrivate.recordSparseValue(args.metricName, args.value);
     }
@@ -632,7 +631,7 @@
       return;
     }
 
-    const settingsSearchResult = this.searchResult as SettingsSearchResult;
+    const settingsSearchResult = this.searchResult;
     assert(settingsSearchResult.urlPathWithParameters, 'Url path is empty.');
     this.recordSearchResultMetrics_();
 
@@ -669,7 +668,7 @@
       return 'os-settings:personalization';
     }
 
-    const settingsSearchResult = this.searchResult as SettingsSearchResult;
+    const settingsSearchResult = this.searchResult;
     switch (settingsSearchResult.icon) {
       case SearchResultIcon.kA11y:
         return 'os-settings:accessibility';
diff --git a/chrome/browser/resources/bookmarks/command_manager.ts b/chrome/browser/resources/bookmarks/command_manager.ts
index c20b698..b77e19dd 100644
--- a/chrome/browser/resources/bookmarks/command_manager.ts
+++ b/chrome/browser/resources/bookmarks/command_manager.ts
@@ -451,7 +451,7 @@
   handleKeyEvent(e: KeyboardEvent, itemIds: Set<string>): boolean {
     for (const commandTuple of this.shortcuts_) {
       const command = commandTuple[0];
-      const shortcut = commandTuple[1] as KeyboardShortcutList;
+      const shortcut = commandTuple[1];
       if (shortcut.matchesEvent(e) && this.canExecute(command, itemIds)) {
         this.handle(command, itemIds);
 
@@ -603,7 +603,7 @@
         }
 
         const id = Array.from(this.menuIds_)[0];
-        const itemUrl = this.getState().nodes[id]!.url;
+        const itemUrl = this.getState().nodes[id].url;
         label = itemUrl ? 'menuEdit' : 'menuRename';
         break;
       case Command.CUT:
diff --git a/chrome/browser/resources/bookmarks/dialog_focus_manager.ts b/chrome/browser/resources/bookmarks/dialog_focus_manager.ts
index dfec0d5..4090c9e9 100644
--- a/chrome/browser/resources/bookmarks/dialog_focus_manager.ts
+++ b/chrome/browser/resources/bookmarks/dialog_focus_manager.ts
@@ -60,7 +60,7 @@
   private getFocusedElement_(): HTMLElement {
     let focus = document.activeElement as HTMLElement;
     while (focus.shadowRoot && focus.shadowRoot.activeElement) {
-      focus = focus.shadowRoot!.activeElement as HTMLElement;
+      focus = focus.shadowRoot.activeElement as HTMLElement;
     }
 
     return focus;
diff --git a/chrome/browser/resources/bookmarks/dnd_manager.ts b/chrome/browser/resources/bookmarks/dnd_manager.ts
index 21033e28..b7a59e2 100644
--- a/chrome/browser/resources/bookmarks/dnd_manager.ts
+++ b/chrome/browser/resources/bookmarks/dnd_manager.ts
@@ -46,7 +46,7 @@
   }
 
   for (let i = 0; i < path.length; i++) {
-    const element = path![i] as Element;
+    const element = path[i] as Element;
     if (isBookmarkItem(element) || isBookmarkFolderNode(element) ||
         isBookmarkList(element)) {
       return path[i] as BookmarkElement;
@@ -351,7 +351,7 @@
       for (const itemId of displayingItems) {
         for (const element of dragData.elements) {
           if (element.id === itemId) {
-            draggedNodes.push(element!.id);
+            draggedNodes.push(element.id);
             break;
           }
         }
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
index cbc5035a..a1e20ed 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">অ'ল্ড লেচ</translation>
 <translation id="8326783648485765113">ঘাঁহনিৰ দৰে সেউজীয়া</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{পাউণ্ড}one{#টা পাউণ্ড চিহ্ন}other{#টা পাউণ্ড চিহ্ন}}</translation>
+<translation id="8351821207686449674">কেপশ্বন ট’গল কৰক</translation>
 <translation id="8378855320830505539">অঞ্চল</translation>
 <translation id="8382679411218029383">স্বয়ংক্রিয়ভাৱে সম্পূৰ্ণ হোৱা ইনলাইন আৰু তালিকা</translation>
 <translation id="8394908167088220973">মিডিয়া প্লে’/পজ</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb
index f755a1a1..44594f5 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">Açıq-sarı</translation>
 <translation id="8326783648485765113">Çəmən Yaşılı</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{funt}other{# funt işarəsi}}</translation>
+<translation id="8351821207686449674">Subtitrləri aktiv/deaktiv edin</translation>
 <translation id="8378855320830505539">Region</translation>
 <translation id="8382679411218029383">Avto tamamlama sətiriçi və siyahısı</translation>
 <translation id="8394908167088220973">Medianı Oxudun/Durdurun</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb
index b1bced20..572d8de 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">পুরনো লেস</translation>
 <translation id="8326783648485765113">ঘাসের সবুজ</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{পাউন্ড}one{#টি পাউন্ড চিহ্ন}other{#টি পাউন্ড চিহ্ন}}</translation>
+<translation id="8351821207686449674">ক্যাপশন টগল করুন</translation>
 <translation id="8378855320830505539">অঞ্চল</translation>
 <translation id="8382679411218029383">স্বতসম্পূর্ণ ইনলাইন এবং তালিকা</translation>
 <translation id="8394908167088220973">মিডিয়া প্লে করুন/বিরতি</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
index e0ea8cf..e07589d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">Altgold</translation>
 <translation id="8326783648485765113">Grasgrün</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{Doppelkreuz}other{# Doppelkreuze}}</translation>
+<translation id="8351821207686449674">Untertitel ein-/ausschalten</translation>
 <translation id="8378855320830505539">Region</translation>
 <translation id="8382679411218029383">Inline-Autovervollständigung und Liste</translation>
 <translation id="8394908167088220973">Medien – Wiedergabe/Pause</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_et.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_et.xtb
index 882b755..ddac31d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_et.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">Pitsvalge</translation>
 <translation id="8326783648485765113">Mururoheline</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{nael}other{# naelamärki}}</translation>
+<translation id="8351821207686449674">Subtiitrite sisse-/väljalülitamine</translation>
 <translation id="8378855320830505539">Piirkond</translation>
 <translation id="8382679411218029383">Rea ja loendi automaatne täitmine</translation>
 <translation id="8394908167088220973">Meediumi esitamine/peatamine</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
index 994d296..d4e9947 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">Vieille dentelle</translation>
 <translation id="8326783648485765113">Vert gazon</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{carré}one{# carré}other{# carrés}}</translation>
+<translation id="8351821207686449674">Activez/Désactivez les sous-titres</translation>
 <translation id="8378855320830505539">Région</translation>
 <translation id="8382679411218029383">Remplissage automatique de ligne et de liste</translation>
 <translation id="8394908167088220973">Contenu multimédia : lecture/pause</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
index 4aa1817..e1cfad0 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">Encaixe antigo</translation>
 <translation id="8326783648485765113">Verde herba</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{libra}other{# signos da libra}}</translation>
+<translation id="8351821207686449674">Activa ou desactiva os subtítulos</translation>
 <translation id="8378855320830505539">Rexión</translation>
 <translation id="8382679411218029383">Autocompletar en liña e lista</translation>
 <translation id="8394908167088220973">Reproducir/pausar ficheiro multimedia</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb
index 22ea7d5..e450db8 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb
@@ -1114,6 +1114,7 @@
 <translation id="8316881042119029234">ഓൾഡ് ലേസ്</translation>
 <translation id="8326783648485765113">ലോൺ ഗ്രീൻ</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{പൗണ്ട്}other{# പൗണ്ട് അടയാളങ്ങൾ}}</translation>
+<translation id="8351821207686449674">സബ്ടൈറ്റിലുകൾ ടോഗിൾ ചെയ്യുക</translation>
 <translation id="8378855320830505539">പ്രദേശം</translation>
 <translation id="8382679411218029383">സ്വയമേവയുള്ള പൂർത്തിയാക്കൽ ഇൻലൈനും ലിസ്റ്റും</translation>
 <translation id="8394908167088220973">മീഡിയ പ്ലേ ചെയ്യുക/താൽക്കാലികമായി നിർത്തുക</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb
index 0dbd978..697565d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">ஓல்டு லேஸ்</translation>
 <translation id="8326783648485765113">லான் கிரீன்</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{எண் குறியீடு}other{# எண் குறியீடுகள்}}</translation>
+<translation id="8351821207686449674">வசனங்களைக் காட்டுவதற்கான/மறைப்பதற்கான பட்டன்</translation>
 <translation id="8378855320830505539">பகுதி</translation>
 <translation id="8382679411218029383">தானே நிரப்புதல் இன்லைன் மற்றும் பட்டியல்</translation>
 <translation id="8394908167088220973">ஊடகத்தை இயக்கு/இடைநிறுத்து</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
index fb76b49..a508c716 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
@@ -1114,6 +1114,7 @@
 <translation id="8316881042119029234">Eski İplik</translation>
 <translation id="8326783648485765113">Çimen Yeşili</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{pound işareti}other{# pound işareti}}</translation>
+<translation id="8351821207686449674">Altyazıları aç/kapat</translation>
 <translation id="8378855320830505539">Bölge</translation>
 <translation id="8382679411218029383">Satır içi ve liste otomatik tamamlama</translation>
 <translation id="8394908167088220973">Medyayı Oynat/Duraklat</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb
index 1b6c13e..5c474410b 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb
@@ -1114,6 +1114,7 @@
 <translation id="8316881042119029234">Старе мереживо</translation>
 <translation id="8326783648485765113">Зелена галявина</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{фунт}one{# символ фунта}few{# символи фунта}many{# символів фунта}other{# pound signs}}</translation>
+<translation id="8351821207686449674">Увімкнути або вимкнути субтитри</translation>
 <translation id="8378855320830505539">Регіон</translation>
 <translation id="8382679411218029383">Вбудоване автозавершення та список</translation>
 <translation id="8394908167088220973">Відтворити чи призупинити</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb
index 6a37df7..3913b8d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb
@@ -1115,6 +1115,7 @@
 <translation id="8316881042119029234">I-Lace endala</translation>
 <translation id="8326783648485765113">Okuluhlaza okotshani</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{upondo}one{# izimpawu zopondo}other{# izimpawu zopondo}}</translation>
+<translation id="8351821207686449674">Guqula amagama-ncazo</translation>
 <translation id="8378855320830505539">Isifunda</translation>
 <translation id="8382679411218029383">Ukuqedela okuzenzakalelayo ngaphakathi kolayini nakuhlu</translation>
 <translation id="8394908167088220973">Ukudlala kwemidiya/ukumisa isikhashana</translation>
diff --git a/chrome/browser/resources/chromeos/app_install/app_install_dialog.ts b/chrome/browser/resources/chromeos/app_install/app_install_dialog.ts
index 1fda999..6c98c93e 100644
--- a/chrome/browser/resources/chromeos/app_install/app_install_dialog.ts
+++ b/chrome/browser/resources/chromeos/app_install/app_install_dialog.ts
@@ -276,7 +276,7 @@
   }
 
   private onScreenshotLoad(): void {
-    this.$<HTMLImageElement>('#screenshot')!.style.display = 'block';
+    this.$<HTMLImageElement>('#screenshot').style.display = 'block';
   }
 
   private onCancelButtonClick(): void {
@@ -314,7 +314,7 @@
   }
 
   private changeDialogState(state: DialogState) {
-    const data = this.dialogStateDataMap![state];
+    const data = this.dialogStateDataMap[state];
     assert(data);
 
     for (const icon of this.$$('.title-icon')) {
@@ -324,17 +324,17 @@
     this.$<HTMLElement>('#title').textContent =
         loadTimeData.getString(data.title.labelId);
 
-    const contentCard = this.$<HTMLElement>('#content-card')!;
+    const contentCard = this.$<HTMLElement>('#content-card');
     contentCard.style.display = data.content?.hidden ? 'none' : 'block';
 
-    const errorMessage = this.$<HTMLElement>('#error-message')!;
+    const errorMessage = this.$<HTMLElement>('#error-message');
     errorMessage.style.display = data.errorMessage?.visible ? 'block' : 'none';
     if (data.errorMessage) {
       errorMessage.textContent =
           loadTimeData.getString(data.errorMessage.textId);
     }
 
-    const actionButton = this.$<Button>('.action-button')!;
+    const actionButton = this.$<Button>('.action-button');
     assert(actionButton);
     actionButton.style.display = data.actionButton.hidden ? 'none' : 'block';
     actionButton.disabled = Boolean(data.actionButton.disabled);
diff --git a/chrome/browser/resources/chromeos/cloud_upload/connect_onedrive.ts b/chrome/browser/resources/chromeos/cloud_upload/connect_onedrive.ts
index 7f7ad9ee..8a1158bf 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/connect_onedrive.ts
+++ b/chrome/browser/resources/chromeos/cloud_upload/connect_onedrive.ts
@@ -31,8 +31,8 @@
     const shadowRoot = this.attachShadow({mode: 'open'});
 
     shadowRoot.innerHTML = getTemplate();
-    const connectButton = this.$('.action-button')!;
-    const closeButton = this.$('.cancel-button')!;
+    const connectButton = this.$('.action-button');
+    const closeButton = this.$('.cancel-button');
 
     connectButton.addEventListener('click', () => this.onConnectButtonClick());
     closeButton.addEventListener('click', () => this.onCloseButtonClick());
@@ -65,7 +65,7 @@
           loadTimeData.getString('oneDriveConnectedTitle');
       this.$('#body-text').innerText =
           loadTimeData.getString('oneDriveConnectedBodyText');
-      this.$('.action-button')!.remove();
+      this.$('.action-button').remove();
     } else {
       this.$('#error-message').toggleAttribute('hidden', false);
     }
diff --git a/chrome/browser/resources/chromeos/cloud_upload/file_handler_card.ts b/chrome/browser/resources/chromeos/cloud_upload/file_handler_card.ts
index e985995..bf39684 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/file_handler_card.ts
+++ b/chrome/browser/resources/chromeos/cloud_upload/file_handler_card.ts
@@ -24,8 +24,8 @@
   }
 
   addStyles() {
-    this.$('#container')!.classList.add(
-        'margin-top', 'round-top', 'round-bottom');
+    this.$('#container')
+        .classList.add('margin-top', 'round-top', 'round-bottom');
     this.tabIndex = 0;
   }
 
@@ -50,9 +50,9 @@
 
   override addStyles() {
     super.addStyles();
-    this.$('#icon')!.style.display = 'none';
-    this.$('#title')!.textContent = 'Other apps';
-    this.$('#right-icon')!.classList.add('chevron');
+    this.$('#icon').style.display = 'none';
+    this.$('#title').textContent = 'Other apps';
+    this.$('#right-icon').classList.add('chevron');
     this.ariaExpanded = 'false';
     this.role = 'button';
   }
@@ -60,14 +60,14 @@
   toggleExpandedState(): boolean {
     this.expanded_ = !this.expanded_;
     if (this.expanded_) {
-      this.$('#container')!.classList.add('separator-bottom');
-      this.$('#container')!.classList.remove('round-bottom');
-      this.$('#right-icon')!.setAttribute('expanded', '');
+      this.$('#container').classList.add('separator-bottom');
+      this.$('#container').classList.remove('round-bottom');
+      this.$('#right-icon').setAttribute('expanded', '');
       this.ariaExpanded = 'true';
     } else {
-      this.$('#container')!.classList.remove('separator-bottom');
-      this.$('#container')!.classList.add('round-bottom');
-      this.$('#right-icon')!.removeAttribute('expanded');
+      this.$('#container').classList.remove('separator-bottom');
+      this.$('#container').classList.add('round-bottom');
+      this.$('#right-icon').removeAttribute('expanded');
       this.ariaExpanded = 'false';
     }
     return this.expanded_;
@@ -95,11 +95,11 @@
   updateSelection(selected: boolean) {
     this.selected_ = selected;
     if (this.selected_) {
-      this.$('#card')!.setAttribute('selected', '');
+      this.$('#card').setAttribute('selected', '');
       this.ariaSelected = 'true';
       this.ariaCurrent = 'true';
     } else {
-      this.$('#card')!.removeAttribute('selected');
+      this.$('#card').removeAttribute('selected');
       this.ariaSelected = 'false';
       this.ariaCurrent = 'false';
     }
@@ -121,12 +121,12 @@
 
   setParameters(type: CloudProviderType, name: string, description: string) {
     this.type_ = type;
-    this.$('#title')!.textContent = name;
-    this.$('#description')!.textContent = description;
+    this.$('#title').textContent = name;
+    this.$('#description').textContent = description;
   }
 
   setIconClass(className: string) {
-    this.$('#icon')!.classList.add(className);
+    this.$('#icon').classList.add(className);
   }
 
   get type(): CloudProviderType {
@@ -141,12 +141,11 @@
 
   setParameters(taskPosition: number, name: string) {
     this.taskPosition_ = taskPosition;
-    this.$('#title')!.textContent = name;
+    this.$('#title').textContent = name;
   }
 
   setIconUrl(url: string) {
-    this.$('#icon')!.setAttribute(
-        'style', 'background-image: url(' + url + ')');
+    this.$('#icon').setAttribute('style', 'background-image: url(' + url + ')');
   }
 
   show() {
diff --git a/chrome/browser/resources/chromeos/cloud_upload/file_handler_page.ts b/chrome/browser/resources/chromeos/cloud_upload/file_handler_page.ts
index 6d0fe36..aeedac6 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/file_handler_page.ts
+++ b/chrome/browser/resources/chromeos/cloud_upload/file_handler_page.ts
@@ -59,7 +59,7 @@
 
   // Initialises the scrollable content styles and add document event listeners.
   connectedCallback(): void {
-    const contentElement = this.$<HTMLElement>('#content')!;
+    const contentElement = this.$<HTMLElement>('#content');
     window.requestAnimationFrame(() => {
       this.updateContentFade(contentElement);
     });
@@ -142,7 +142,7 @@
 
       // For each local file task, create a clickable label.
       for (let i = 0; i < localTasks.length; ++i) {
-        const task = localTasks[i]!;
+        const task = localTasks[i];
         assert(task);
         const localHandlerCard = new LocalHandlerCardElement();
         localHandlerCard.setParameters(task.position, task.title);
@@ -150,7 +150,7 @@
         localHandlerCard.id = this.toStringId(task.position);
         if (i === localTasks.length - 1) {
           // Round bottom for last card.
-          localHandlerCard.$('#container')!.classList.add('round-bottom');
+          localHandlerCard.$('#container').classList.add('round-bottom');
         }
         this.addLocalHandlerCard(localHandlerCard);
       }
@@ -187,7 +187,7 @@
           }
         }
       }
-      const contentElement = this.$<HTMLElement>('#content')!;
+      const contentElement = this.$<HTMLElement>('#content');
       if (expanded) {
         window.requestAnimationFrame(() => {
           // Scroll so that the top of the accordion aligns to where the top of
@@ -292,7 +292,7 @@
 
     // If no card is focused, select the first one.
     if (selectedIndex === -1) {
-      this.cards[0]!.focus();
+      this.cards[0].focus();
       return;
     }
 
@@ -301,7 +301,7 @@
         this.cards[newSelectedIndex]?.style.display === 'none') {
       return;
     }
-    this.cards[newSelectedIndex]!.focus();
+    this.cards[newSelectedIndex].focus();
   }
 
   // Invoked when the open file button is clicked. If the user previously
diff --git a/chrome/browser/resources/chromeos/cloud_upload/move_confirmation_page.ts b/chrome/browser/resources/chromeos/cloud_upload/move_confirmation_page.ts
index 055055a..2363a018 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/move_confirmation_page.ts
+++ b/chrome/browser/resources/chromeos/cloud_upload/move_confirmation_page.ts
@@ -41,9 +41,9 @@
     const shadowRoot = this.attachShadow({mode: 'open'});
 
     shadowRoot.innerHTML = getTemplate();
-    const actionButton = this.$('.action-button')!;
-    const cancelButton = this.$('.cancel-button')!;
-    this.playPauseButton = this.$('#playPauseIcon')!;
+    const actionButton = this.$('.action-button');
+    const cancelButton = this.$('.cancel-button');
+    this.playPauseButton = this.$('#playPauseIcon');
 
     actionButton.addEventListener('click', () => this.onActionButtonClick());
     cancelButton.addEventListener('click', () => this.onCancelButtonClick());
@@ -89,7 +89,7 @@
     this.updateAnimation();
 
     // Title.
-    const titleElement = this.$<HTMLElement>('#title')!;
+    const titleElement = this.$<HTMLElement>('#title');
     if (isCopyOperation) {
       titleElement.innerText = loadTimeData.getStringF(
           isPlural ? 'moveConfirmationCopyTitlePlural' :
@@ -117,7 +117,7 @@
       if (officeMoveConfirmationShownForOneDrive) {
         checkbox.checked = alwaysMoveToOneDrive;
       } else {
-        checkbox!.remove();
+        checkbox.remove();
       }
     } else {
       bodyText.innerText =
@@ -128,12 +128,12 @@
       if (officeMoveConfirmationShownForDrive) {
         checkbox.checked = alwaysMoveToDrive;
       } else {
-        checkbox!.remove();
+        checkbox.remove();
       }
     }
 
     // Action button.
-    const actionButton = this.$<HTMLElement>('.action-button')!;
+    const actionButton = this.$<HTMLElement>('.action-button');
     actionButton.innerText =
         loadTimeData.getString(isCopyOperation ? 'copyAndOpen' : 'moveAndOpen');
   }
@@ -152,8 +152,8 @@
     this.animationPlayer.setAttribute('dynamic', 'true');
     this.animationPlayer.setAttribute('aria-hidden', 'true');
     this.animationPlayer.autoplay = true;
-    const animationWrapper = this.$<HTMLElement>('.animation-wrapper')!;
-    const playPauseIcon = this.$<HTMLElement>('#playPauseIcon')!;
+    const animationWrapper = this.$<HTMLElement>('.animation-wrapper');
+    const playPauseIcon = this.$<HTMLElement>('#playPauseIcon');
     animationWrapper.insertBefore(this.animationPlayer, playPauseIcon);
   }
 
@@ -197,7 +197,7 @@
   }
 
   private onPlayPauseButtonClick(): void {
-    const animation = this.$<LottieRenderer>('#animation')!;
+    const animation = this.$<LottieRenderer>('#animation');
     const shouldPlay = this.playPauseButton!.className === 'play';
     if (shouldPlay) {
       animation.play();
diff --git a/chrome/browser/resources/chromeos/cloud_upload/setup_cancel_dialog.ts b/chrome/browser/resources/chromeos/cloud_upload/setup_cancel_dialog.ts
index 072a8b3c..6580996 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/setup_cancel_dialog.ts
+++ b/chrome/browser/resources/chromeos/cloud_upload/setup_cancel_dialog.ts
@@ -28,10 +28,10 @@
 
     this.attachShadow({mode: 'open'}).innerHTML = getTemplate();
     this.dialog = this.$('cr-dialog');
-    this.$('.action-button')!.addEventListener(
-        'click', () => this.onResumeButtonClick());
-    this.$('.cancel-button')!.addEventListener(
-        'click', () => this.onCancelButtonClick());
+    this.$('.action-button')
+        .addEventListener('click', () => this.onResumeButtonClick());
+    this.$('.cancel-button')
+        .addEventListener('click', () => this.onCancelButtonClick());
     this.boundKeyDownListener_ = this.onKeyDown.bind(this);
   }
 
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.ts b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.ts
index bf56e86..fc633cd 100644
--- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.ts
+++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.ts
@@ -117,19 +117,19 @@
     e.stopPropagation();
     const backButton = this.shadowRoot!.querySelector<EduCoexistenceButton>(
         '#gaia-back-button')!;
-    if (backButton!.disabled) {
+    if (backButton.disabled) {
       // This is a safeguard against this method getting called somehow
       // despite the button being disabled.
       return;
     }
-    backButton!.disabled = true;
+    backButton.disabled = true;
 
     this.webview.back(() => {
       // Wait a full second after the callback fires before processing another
       // click on the back button.  This delay is needed because the callback
       // fires before the content finishes navigating to the previous page.
       setTimeout(() => {
-        backButton!.disabled = false;
+        backButton.disabled = false;
       }, 1000 /* 1 second */);
       this.webview.focus();
     });
@@ -167,7 +167,7 @@
       contentContainer.style.height = '100%';
     }
 
-    template!.updateButtonFooterVisibility(this.showGaiaButtons);
+    template.updateButtonFooterVisibility(this.showGaiaButtons);
   }
 }
 
diff --git a/chrome/browser/resources/chromeos/emoji_picker/app.ts b/chrome/browser/resources/chromeos/emoji_picker/app.ts
index b1cffc08..490acdf 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/app.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/app.ts
@@ -319,7 +319,7 @@
     // Update UI and relevant features based on the initial data.
     this.updateCategoryData(
         // If we don't have 1 data URL, a crash probably isn't a bad idea
-        initialData, dataUrls[0]!.category, dataUrls[0]!.categoryLastPartition,
+        initialData, dataUrls[0].category, dataUrls[0].categoryLastPartition,
         false);
 
     // Show the UI after the initial data is rendered.
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.ts b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.ts
index c2312a5..ef374af 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.ts
@@ -391,8 +391,8 @@
 
     // Append more GIFs to show if user is near the bottom of the currently
     // rendered GIFs (300px is around the average height of 2 GIFs).
-    if (searchResultRect!.getBoundingClientRect().bottom -
-            thisRect!.getBoundingClientRect().bottom <=
+    if (searchResultRect.getBoundingClientRect().bottom -
+            thisRect.getBoundingClientRect().bottom <=
         300) {
       const gifIndex = this.searchResults.findIndex(
           group => group.category === CategoryEnum.GIF);
diff --git a/chrome/browser/resources/chromeos/healthd_internals/model/cpu_usage_helper.ts b/chrome/browser/resources/chromeos/healthd_internals/model/cpu_usage_helper.ts
index 1e53b76c..49ee13f 100644
--- a/chrome/browser/resources/chromeos/healthd_internals/model/cpu_usage_helper.ts
+++ b/chrome/browser/resources/chromeos/healthd_internals/model/cpu_usage_helper.ts
@@ -54,7 +54,7 @@
         assert(lastExecTime !== undefined);
 
         output[physicalCpuId].push(
-            this.getLogicalCpuUsage(logicalCpu.executionTime, lastExecTime!));
+            this.getLogicalCpuUsage(logicalCpu.executionTime, lastExecTime));
         this.lastExecutionTime[physicalCpuId][logicalCpuId] =
             logicalCpu.executionTime;
       }
diff --git a/chrome/browser/resources/chromeos/healthd_internals/view/settings/config_slider.ts b/chrome/browser/resources/chromeos/healthd_internals/view/settings/config_slider.ts
index 8ed0a37..c77944fb 100644
--- a/chrome/browser/resources/chromeos/healthd_internals/view/settings/config_slider.ts
+++ b/chrome/browser/resources/chromeos/healthd_internals/view/settings/config_slider.ts
@@ -74,7 +74,7 @@
   }
 
   getTickValue(): number {
-    return this.ticks[this.tickedIndex]!.value;
+    return this.ticks[this.tickedIndex].value;
   }
 
   private onTickedValueChanged() {
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.ts b/chrome/browser/resources/chromeos/login/debug/debug.ts
index f846111..be6c21ae 100644
--- a/chrome/browser/resources/chromeos/login/debug/debug.ts
+++ b/chrome/browser/resources/chromeos/login/debug/debug.ts
@@ -2229,10 +2229,10 @@
   private preProcessScreens(): void {
     KNOWN_SCREENS.forEach((screen, index) => {
       // Screen ordering
-      screen!.index = index;
+      screen.index = index;
       // Create a default state
       if (!('states' in screen)) {
-        screen!.states = [{
+        screen.states = [{
           id: 'default',
         }];
       }
@@ -2240,11 +2240,11 @@
       if (!screen.defaultState && screen.states) {
         screen.defaultState = screen.states[0].id;
       }
-      screen!.stateMap = {};
+      screen.stateMap = {};
       // For each state fall back to screen data if state data is not defined.
       for (const state of screen.states || []) {
         if (!('data' in state)) {
-          state!.data = screen.data;
+          state.data = screen.data;
         }
         screen.stateMap[state.id] = state;
       }
@@ -2369,7 +2369,7 @@
 
   private createScreensList(): void {
     for (const screen of KNOWN_SCREENS) {
-      this.screenMap[screen.id] = screen as ScreenDefType;
+      this.screenMap[screen.id] = screen;
     }
     this.knownScreens = [];
     this.screenButtons = {};
@@ -2400,8 +2400,8 @@
                 screen.setUIStep(step);
               },
             };
-            screenDef!.states!.push(state);
-            screenDef!.stateMap![state.id] = state;
+            screenDef.states!.push(state);
+            screenDef.stateMap![state.id] = state;
           }
           if (screenDef.defaultState === 'default' &&
               'defaultUIStep' in screenElement &&
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts
index 11d73c63..4a10a8fd 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts
+++ b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts
@@ -532,7 +532,7 @@
     const gaiaDialog =
         this.shadowRoot?.querySelector<GaiaDialog>('#signin-frame-dialog');
     assert(!!gaiaDialog);
-    return gaiaDialog.getFrame() as chrome.webviewTag.WebView;
+    return gaiaDialog.getFrame();
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/network_ui/network_state_ui.ts b/chrome/browser/resources/chromeos/network_ui/network_state_ui.ts
index febc91d..a9fa90df 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_state_ui.ts
+++ b/chrome/browser/resources/chromeos/network_ui/network_state_ui.ts
@@ -270,7 +270,7 @@
     } else {
       btn.textContent = '-';
       const expandedRow = this.createExpandedRow_(state, row);
-      row.parentNode!.insertBefore(expandedRow, row.nextSibling!);
+      row.parentNode!.insertBefore(expandedRow, row.nextSibling);
     }
   }
 
@@ -311,7 +311,7 @@
         this.getShillNetworkPropertiesResult_(response);
       });
     } else if (selectedId === 'state') {
-      this.networkConfig_!.getNetworkState(guid)
+      this.networkConfig_.getNetworkState(guid)
           .then((responseParams) => {
             if (responseParams && responseParams.result) {
               this.showDetail_(detailCell, responseParams.result);
@@ -324,7 +324,7 @@
             this.showDetailError_(detailCell, 'Mojo service failure: ' + error);
           });
     } else if (selectedId === 'managed') {
-      this.networkConfig_!.getManagedProperties(guid)
+      this.networkConfig_.getManagedProperties(guid)
           .then((responseParams) => {
             if (responseParams && responseParams.result) {
               this.showDetail_(detailCell, responseParams.result);
@@ -467,7 +467,7 @@
           this.onVisibleNetworksReceived_(responseParams.result);
         });
 
-    this.networkConfig_!
+    this.networkConfig_
         .getNetworkStateList({
           filter: FilterType.kConfigured,
           networkType: NetworkType.kAll,
@@ -477,7 +477,7 @@
           this.onFavoriteNetworksReceived_(responseParams.result);
         });
 
-    this.networkConfig_!.getDeviceStateList().then((responseParams) => {
+    this.networkConfig_.getDeviceStateList().then((responseParams) => {
       this.onDeviceStatesReceived_(responseParams.result);
     });
 
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.ts b/chrome/browser/resources/chromeos/network_ui/network_ui.ts
index e542d28..06c65a66 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.ts
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.ts
@@ -425,7 +425,7 @@
 
   private onCustomItemSelected_(event:
                                     CustomEvent<NetworkList.CustomItemState>) {
-    this.browserProxy_.addNetwork(event.detail!.customData as string);
+    this.browserProxy_.addNetwork(event.detail.customData as string);
   }
 }
 
diff --git a/chrome/browser/resources/data_sharing/dummy_data_sharing_sdk.ts b/chrome/browser/resources/data_sharing/dummy_data_sharing_sdk.ts
index 6990119..f6a2745 100644
--- a/chrome/browser/resources/data_sharing/dummy_data_sharing_sdk.ts
+++ b/chrome/browser/resources/data_sharing/dummy_data_sharing_sdk.ts
@@ -35,20 +35,20 @@
       resolve({
         status: Code.OK,
         result: {
-          groupData: _params.params!.map(param => ({
-                                           groupId: param.groupId,
-                                           displayName: 'GROUP_NAME',
-                                           members: [
-                                             {
-                                               focusObfuscatedGaiaId: 'GAIA_ID',
-                                               displayName: 'MEMBER_NAME',
-                                               email: 'test@gmail.com',
-                                               role: 'member',
-                                               avatarUrl: 'http://example.com',
-                                               givenName: 'MEMBER_NAME',
-                                             },
-                                           ],
-                                         })),
+          groupData: _params.params.map(param => ({
+                                          groupId: param.groupId,
+                                          displayName: 'GROUP_NAME',
+                                          members: [
+                                            {
+                                              focusObfuscatedGaiaId: 'GAIA_ID',
+                                              displayName: 'MEMBER_NAME',
+                                              email: 'test@gmail.com',
+                                              role: 'member',
+                                              avatarUrl: 'http://example.com',
+                                              givenName: 'MEMBER_NAME',
+                                            },
+                                          ],
+                                        })),
         },
       });
     });
diff --git a/chrome/browser/resources/discards/graph.ts b/chrome/browser/resources/discards/graph.ts
index cf8aa98..1089a29 100644
--- a/chrome/browser/resources/discards/graph.ts
+++ b/chrome/browser/resources/discards/graph.ts
@@ -679,14 +679,13 @@
   initialize() {
 
     // Create the simulation and set up the permanent forces.
-    const simulation =
-        d3.forceSimulation() as d3.Simulation<GraphNode, undefined>;
+    const simulation: d3.Simulation<GraphNode, undefined> =
+        d3.forceSimulation();
     simulation.on('tick', this.onTick_.bind(this));
 
     const linkForce =
-        (d3.forceLink() as
-         d3.ForceLink<GraphNode, d3.SimulationLinkDatum<GraphNode>>)
-            .id(d => d.id.toString());
+        d3.forceLink<GraphNode, d3.SimulationLinkDatum<GraphNode>>().id(
+            d => d.id.toString());
     const defaultStrength = linkForce.strength();
 
     // Override the default link strength function to apply scaling factors
@@ -704,8 +703,8 @@
     // negative number is repulsion).
     simulation.force(
         'charge',
-        (d3.forceManyBody() as d3.ForceManyBody<GraphNode>)
-            .strength(this.getManyBodyStrength_.bind(this)));
+        d3.forceManyBody<GraphNode>().strength(
+            this.getManyBodyStrength_.bind(this)));
 
     this.simulation_ = simulation;
 
@@ -933,9 +932,9 @@
 
     // Select the nodes, except for any dead ones that are still transitioning.
     const nodes = Array.from(this.nodes_.values());
-    const node = (this.nodeGroup_!.selectAll('g:not(.dead)') as
-                  d3.Selection<any, GraphNode, SVGGElement, unknown>)
-                     .data(nodes, d => d.id as unknown as number);
+    const node =
+        this.nodeGroup_!.selectAll<SVGGElement, GraphNode>('g:not(.dead)')
+            .data(nodes, d => d.id as unknown as number);
 
     // Add new nodes, if any.
     if (!node.enter().empty()) {
@@ -974,7 +973,7 @@
       // Turn down the node associated tooltips.
       deletedNodes.each(d => {
         if (d.tooltip) {
-          d.tooltip!.goAway();
+          d.tooltip.goAway();
         }
       });
 
@@ -1002,8 +1001,8 @@
         !dashedLink.enter().empty() || !dashedLink.exit().empty()) {
       this.simulation_!.nodes(nodes);
       const links = this.links_.concat(this.dashedLinks_);
-      (this.simulation_!.force('link')! as d3.ForceLink<GraphNode, any>)
-          .links(links);
+      this.simulation_!.force<d3.ForceLink<GraphNode, any>>('link')!.links(
+          links);
 
       this.restartSimulation_();
     }
@@ -1186,7 +1185,7 @@
 
     // Reset both X and Y attractive forces, as they're cached.
     const xForce = d3.forceX().x(this.width_ / 2).strength(0.1);
-    const yForce = (d3.forceY() as d3.ForceY<GraphNode>)
+    const yForce = d3.forceY<GraphNode>()
                        .y(this.getTargetPositionY_.bind(this))
                        .strength(this.getTargetPositionStrengthY_.bind(this));
     this.simulation_!.force('x_pos', xForce);
diff --git a/chrome/browser/resources/extensions/item.ts b/chrome/browser/resources/extensions/item.ts
index c6e1a05..837f79d0 100644
--- a/chrome/browser/resources/extensions/item.ts
+++ b/chrome/browser/resources/extensions/item.ts
@@ -30,7 +30,7 @@
   deleteItem(id: string): void;
   deleteItems(ids: string[]): Promise<void>;
   uninstallItem(id: string): Promise<void>;
-  setItemEnabled(id: string, isEnabled: boolean): void;
+  setItemEnabled(id: string, isEnabled: boolean): Promise<void>;
   setItemAllowedIncognito(id: string, isAllowedIncognito: boolean): void;
   setItemAllowedUserScripts(id: string, isAllowedUserScripts: boolean): void;
   setItemAllowedOnFileUrls(id: string, isAllowedOnFileUrls: boolean): void;
@@ -75,7 +75,9 @@
   uninstallItem(_id: string) {
     return Promise.resolve();
   }
-  setItemEnabled(_id: string, _isEnabled: boolean) {}
+  setItemEnabled(_id: string, _isEnabled: boolean) {
+    return Promise.resolve();
+  }
   setItemAllowedIncognito(_id: string, _isAllowedIncognito: boolean) {}
   setItemAllowedUserScripts(_id: string, _isAllowedUserScripts: boolean) {}
   setItemAllowedOnFileUrls(_id: string, _isAllowedOnFileUrls: boolean) {}
diff --git a/chrome/browser/resources/extensions/service.ts b/chrome/browser/resources/extensions/service.ts
index f8e005e9..887c1df 100644
--- a/chrome/browser/resources/extensions/service.ts
+++ b/chrome/browser/resources/extensions/service.ts
@@ -207,7 +207,13 @@
     chrome.metricsPrivate.recordUserAction(
         isEnabled ? 'Extensions.ExtensionEnabled' :
                     'Extensions.ExtensionDisabled');
-    chrome.management.setEnabled(id, isEnabled);
+    return chrome.management.setEnabled(id, isEnabled)
+        .catch(
+            _ => {
+                // The `setEnabled` call can reasonably fail for a number of
+                // reasons, including that the user chose to deny a re-enable
+                // dialog. Silently ignore these errors.
+            });
   }
 
   setItemAllowedIncognito(id: string, isAllowedIncognito: boolean) {
diff --git a/chrome/browser/resources/glic/BUILD.gn b/chrome/browser/resources/glic/BUILD.gn
index 4d26545..12ae2666 100644
--- a/chrome/browser/resources/glic/BUILD.gn
+++ b/chrome/browser/resources/glic/BUILD.gn
@@ -13,7 +13,6 @@
   static_files = [
     "glic.css",
     "glic.html",
-    "glic_fre/fre.html",
   ]
 
   non_web_component_files = [
@@ -25,7 +24,6 @@
     "glic_api_impl/request_types.ts",
     "glic_api/glic_api.ts",
     "glic_app_controller.ts",
-    "glic_fre/fre.ts",
     "icons.html.ts",
     "main.ts",
     "webview.ts",
diff --git a/chrome/browser/resources/glic/fre/BUILD.gn b/chrome/browser/resources/glic/fre/BUILD.gn
new file mode 100644
index 0000000..2572057
--- /dev/null
+++ b/chrome/browser/resources/glic/fre/BUILD.gn
@@ -0,0 +1,34 @@
+# 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("//ui/webui/resources/tools/build_webui.gni")
+
+assert(enable_glic)
+
+build_webui("build") {
+  grd_prefix = "glic_fre"
+
+  static_files = [ "fre.html" ]
+
+  non_web_component_files = [ "main.ts" ]
+
+  webui_context_type = "trusted"
+  ts_deps = [
+    "//ui/webui/resources/js:build_ts",
+    "//ui/webui/resources/mojo:build_ts",
+  ]
+
+  mojo_files_deps = [ "//chrome/browser/glic:mojo_bindings_ts__generator" ]
+  mojo_files = [ "$root_gen_dir/chrome/browser/glic/glic_fre.mojom-webui.ts" ]
+
+  ts_definitions = [
+    # These files are necessary for chrome.webviewTag:
+    "//tools/typescript/definitions/chrome_event.d.ts",
+    "//tools/typescript/definitions/context_menus.d.ts",
+    "//tools/typescript/definitions/extension_types.d.ts",
+    "//tools/typescript/definitions/tabs.d.ts",
+    "//tools/typescript/definitions/web_request.d.ts",
+    "//tools/typescript/definitions/webview_tag.d.ts",
+  ]
+}
diff --git a/chrome/browser/resources/glic/glic_fre/fre.html b/chrome/browser/resources/glic/fre/fre.html
similarity index 86%
rename from chrome/browser/resources/glic/glic_fre/fre.html
rename to chrome/browser/resources/glic/fre/fre.html
index 15fcb16..5d779f0 100644
--- a/chrome/browser/resources/glic/glic_fre/fre.html
+++ b/chrome/browser/resources/glic/fre/fre.html
@@ -12,7 +12,7 @@
       overflow: hidden;
     }
   </style>
-  <script type="module" src="fre.js"></script>
+  <script type="module" src="main.js"></script>
 </head>
 
 <body>
diff --git a/chrome/browser/resources/glic/glic_fre/fre.ts b/chrome/browser/resources/glic/fre/main.ts
similarity index 79%
rename from chrome/browser/resources/glic/glic_fre/fre.ts
rename to chrome/browser/resources/glic/fre/main.ts
index 7c5bd19a..5d30331 100644
--- a/chrome/browser/resources/glic/glic_fre/fre.ts
+++ b/chrome/browser/resources/glic/fre/main.ts
@@ -4,13 +4,13 @@
 
 import '/strings.m.js';
 
-import {loadTimeData} from '//resources/js/load_time_data.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 
-import {FrePageHandlerRemote, PageHandlerFactory} from '../glic.mojom-webui.js';
+import {FrePageHandlerFactory, FrePageHandlerRemote} from './glic_fre.mojom-webui.js';
 
 const freHandler = new FrePageHandlerRemote();
-PageHandlerFactory.getRemote().createFrePageHandler(
-    (freHandler).$.bindNewPipeAndPassReceiver());
+FrePageHandlerFactory.getRemote().createPageHandler(
+    (freHandler as FrePageHandlerRemote).$.bindNewPipeAndPassReceiver());
 
 const webview =
     document.getElementById('fre-guest-frame') as chrome.webviewTag.WebView;
diff --git a/chrome/browser/resources/glic/glic.css b/chrome/browser/resources/glic/glic.css
index 95886b5..e2ebe39 100644
--- a/chrome/browser/resources/glic/glic.css
+++ b/chrome/browser/resources/glic/glic.css
@@ -19,7 +19,6 @@
 .dialog {
   position: absolute;
   right: 0;
-  width: 300px;
   font-family: Roboto, sans-serif;
   font-size: 13px;
   font-weight: 300;
diff --git a/chrome/browser/resources/glic/glic_api/glic_api.ts b/chrome/browser/resources/glic/glic_api/glic_api.ts
index 613aba6..5fc9f9e 100644
--- a/chrome/browser/resources/glic/glic_api/glic_api.ts
+++ b/chrome/browser/resources/glic/glic_api/glic_api.ts
@@ -831,3 +831,59 @@
   type: 'glic-bootstrap';
   glicApiSource: string;
 }
+
+// Types used in presubmit check.
+export namespace checks {
+
+  // Types consumed by the client. These are subject to stricter checks than
+  // those in TypesConsumedByHost.
+  export interface TypesConsumedByClient {
+    hostRegistry: GlicHostRegistry;
+    browserHost: GlicBrowserHost;
+    tabContextResult: TabContextResult;
+    tabData: TabData;
+    imageOriginAnnotations: ImageOriginAnnotations;
+    screenshot: Screenshot;
+    userProfileInfo: UserProfileInfo;
+    chromeVersion: ChromeVersion;
+    focusedTabData: FocusedTabData;
+    focusedTabCandidate: FocusedTabCandidate;
+    pdfDocumentData: PdfDocumentData;
+    webPageData: WebPageData;
+    documentData: DocumentData;
+    panelState: PanelState;
+    annotatedPageData: AnnotatedPageData;
+  }
+
+  // Types consumed by the host.
+  export interface TypesConsumedByHost {
+    webClient: GlicWebClient;
+    resizeWindowOptions: ResizeWindowOptions;
+    createTabOptions: CreateTabOptions;
+    glicBrowserHostMetrics: GlicBrowserHostMetrics;
+    openPanelInfo: OpenPanelInfo;
+    tabContextOptions: TabContextOptions;
+    draggableArea: DraggableArea;
+    subscriber: Subscriber;
+    scrollToParams: ScrollToParams;
+    scrollToSelector: ScrollToSelector;
+    scrollToTextSelector: ScrollToTextSelector;
+    scrollToTextFragmentSelector: ScrollToTextFragmentSelector;
+  }
+
+  // Enums that should not be changed.
+  export interface ClosedEnums {
+    panelStateKind: typeof PanelStateKind;
+    webClientMode: typeof WebClientMode;
+  }
+
+  // Enums that can be extended.
+  export interface ExtensibleEnums {
+    getTabContextErrorReason: typeof GetTabContextErrorReason;
+    captureScreenshotErrorReason: typeof CaptureScreenshotErrorReason;
+    scrollToErrorReason: typeof ScrollToErrorReason;
+    invalidCandidateError: typeof InvalidCandidateError;
+    noCandidateTabError: typeof NoCandidateTabError;
+  }
+
+}
diff --git a/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts b/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts
index 49bc44d..598d01bb 100644
--- a/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts
+++ b/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts
@@ -448,15 +448,15 @@
       if (selector.exactText !== undefined) {
         return {
           exactTextSelector: {
-            text: selector.exactText!.text,
+            text: selector.exactText.text,
           },
         };
       }
       if (selector.textFragment !== undefined) {
         return {
           textFragmentSelector: {
-            textStart: selector.textFragment!.textStart,
-            textEnd: selector.textFragment!.textEnd,
+            textStart: selector.textFragment.textStart,
+            textEnd: selector.textFragment.textEnd,
           },
         };
       }
@@ -470,7 +470,7 @@
     };
     const {errorReason} = (await this.handler.scrollTo(mojoParams));
     if (errorReason !== null) {
-      throw new ErrorWithReasonImpl('scrollTo', errorReason! as number);
+      throw new ErrorWithReasonImpl('scrollTo', errorReason as number);
     }
     return {};
   }
diff --git a/chrome/browser/resources/glic/glic_app_controller.ts b/chrome/browser/resources/glic/glic_app_controller.ts
index 3f2665f6b..3bccaa6 100644
--- a/chrome/browser/resources/glic/glic_app_controller.ts
+++ b/chrome/browser/resources/glic/glic_app_controller.ts
@@ -115,7 +115,9 @@
       case 'login':
         this.lastWidth = 400;
         this.lastHeight = 800;
+        this.cancelTimeout();
         $.guestPanel.classList.toggle('show-header', true);
+        this.showPanel('guestPanel');
         break;
       case 'regular':
         $.guestPanel.classList.toggle('show-header', false);
diff --git a/chrome/browser/resources/history/BUILD.gn b/chrome/browser/resources/history/BUILD.gn
index b2fd483..d6302cc 100644
--- a/chrome/browser/resources/history/BUILD.gn
+++ b/chrome/browser/resources/history/BUILD.gn
@@ -48,7 +48,9 @@
   css_files = [
     "history_embeddings_promo.css",
     "shared_style.css",
+    "shared_style_lit.css",
     "shared_vars.css",
+    "synced_device_card.css",
   ]
 
   icons_html_files = [ "shared_icons.html" ]
diff --git a/chrome/browser/resources/history/shared_style.css b/chrome/browser/resources/history/shared_style.css
index 5db7e13..5f4da85 100644
--- a/chrome/browser/resources/history/shared_style.css
+++ b/chrome/browser/resources/history/shared_style.css
@@ -10,64 +10,5 @@
  * #include=cr-hidden-style
  * #css_wrapper_metadata_end */
 
-a {
-  color: var(--cr-link-color);
-}
-
-.history-cards {
-  margin: 0 auto;
-  max-width: var(--card-max-width);
-  min-width: var(--card-min-width);
-  padding: 0 var(--card-padding-side);
-  width: calc(100% - 2 * var(--card-padding-side));
-}
-
-.card-title {
-  align-items: center;
-  display: flex;
-  font-size: 16px;
-  font-weight: 500;
-  line-height: 24px;
-  overflow: hidden;
-  padding: 23px 24px 13px;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.centered-message {
-  align-items: center;
-  color: var(--md-loading-message-color);
-  display: flex;
-  flex: 1;
-  font-size: 108%;
-  font-weight: 500;
-  height: 100%;
-  justify-content: center;
-}
-
-.website-icon {
-  background-repeat: no-repeat;
-  background-size: 16px;
-  background-position: center center;
-  border-radius: 4px;
-  flex: none;
-  height: 24px;
-  width: 24px;
-}
-
-.website-link {
-  align-items: center;
-  color: var(--cr-primary-text-color);
-  display: flex;
-  overflow: hidden;
-  text-decoration: none;
-}
-
-.website-title {
-  font-size: 12px;
-  font-weight: 500;
-  margin-inline-start: 8px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
+/* Purposefully empty since this style is generated at build time from the
+ * equivalent Lit version. */
diff --git a/chrome/browser/resources/history/shared_style_lit.css b/chrome/browser/resources/history/shared_style_lit.css
new file mode 100644
index 0000000..1f6831c5f
--- /dev/null
+++ b/chrome/browser/resources/history/shared_style_lit.css
@@ -0,0 +1,73 @@
+/* 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. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #import=./shared_vars.css.js
+ * #import=chrome://resources/cr_elements/cr_hidden_style_lit.css.js
+ * #import=chrome://resources/cr_elements/cr_shared_vars.css.js
+ * #include=cr-hidden-style-lit
+ * #css_wrapper_metadata_end */
+
+a {
+  color: var(--cr-link-color);
+}
+
+.history-cards {
+  margin: 0 auto;
+  max-width: var(--card-max-width);
+  min-width: var(--card-min-width);
+  padding: 0 var(--card-padding-side);
+  width: calc(100% - 2 * var(--card-padding-side));
+}
+
+.card-title {
+  align-items: center;
+  display: flex;
+  font-size: 16px;
+  font-weight: 500;
+  line-height: 24px;
+  overflow: hidden;
+  padding: 23px 24px 13px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.centered-message {
+  align-items: center;
+  color: var(--md-loading-message-color);
+  display: flex;
+  flex: 1;
+  font-size: 108%;
+  font-weight: 500;
+  height: 100%;
+  justify-content: center;
+}
+
+.website-icon {
+  background-repeat: no-repeat;
+  background-size: 16px;
+  background-position: center center;
+  border-radius: 4px;
+  flex: none;
+  height: 24px;
+  width: 24px;
+}
+
+.website-link {
+  align-items: center;
+  color: var(--cr-primary-text-color);
+  display: flex;
+  overflow: hidden;
+  text-decoration: none;
+}
+
+.website-title {
+  font-size: 12px;
+  font-weight: 500;
+  margin-inline-start: 8px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
diff --git a/chrome/browser/resources/history/synced_device_card.css b/chrome/browser/resources/history/synced_device_card.css
new file mode 100644
index 0000000..4401246c
--- /dev/null
+++ b/chrome/browser/resources/history/synced_device_card.css
@@ -0,0 +1,69 @@
+/* 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. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #import=./shared_style_lit.css.js
+ * #scheme=relative
+ * #include=shared-style-lit
+ * #css_wrapper_metadata_end */
+
+:host {
+  -webkit-tap-highlight-color: transparent;
+  display: block;
+}
+
+#card-heading {
+  cursor: pointer;
+  justify-content: space-between;
+  padding-inline-end: 0;
+}
+
+#tab-item-list {
+  padding: 8px 0;
+}
+
+#last-update-time {
+  color: var(--cr-secondary-text-color);
+}
+
+#title-left-content {
+  display: flex;
+  overflow: hidden;
+}
+
+#device-name {
+  overflow: hidden;
+  padding-inline-end: 3px;
+  text-overflow: ellipsis;
+}
+
+#right-buttons {
+  color: var(--cr-secondary-text-color);
+  margin-inline-end: 24px;
+}
+
+#collapse {
+  overflow: hidden;
+}
+
+#history-item-container {
+  background-color: var(--cr-card-background-color);
+  border-radius: var(--cr-card-border-radius);
+  box-shadow: var(--cr-card-shadow);
+}
+
+.item-container {
+  align-items: center;
+  display: flex;
+  margin: 0 20px;
+  min-height: var(--item-height);
+}
+
+.window-separator {
+  background-color: var(--card-border-color);
+  height: 1px;
+  margin: 5px auto;
+  width: 80%;
+}
diff --git a/chrome/browser/resources/history/synced_device_card.html b/chrome/browser/resources/history/synced_device_card.html
index 2712f689a..4109b5a 100644
--- a/chrome/browser/resources/history/synced_device_card.html
+++ b/chrome/browser/resources/history/synced_device_card.html
@@ -1,98 +1,41 @@
-    <style include="shared-style">
-      :host {
-        -webkit-tap-highlight-color: transparent;
-        display: block;
-      }
-
-      #card-heading {
-        cursor: pointer;
-        justify-content: space-between;
-        padding-inline-end: 0;
-      }
-
-      #tab-item-list {
-        padding: 8px 0;
-      }
-
-      #last-update-time {
-        color: var(--cr-secondary-text-color);
-      }
-
-      #title-left-content {
-        display: flex;
-        overflow: hidden;
-      }
-
-      #device-name {
-        overflow: hidden;
-        padding-inline-end: 3px;
-        text-overflow: ellipsis;
-      }
-
-      #right-buttons {
-        color: var(--cr-secondary-text-color);
-        margin-inline-end: 24px;
-      }
-
-      #collapse {
-        overflow: hidden;
-      }
-
-      #history-item-container {
-        background-color: var(--cr-card-background-color);
-        border-radius: var(--cr-card-border-radius);
-        box-shadow: var(--cr-card-shadow);
-      }
-
-      .item-container {
-        align-items: center;
-        display: flex;
-        margin: 0 20px;
-        min-height: var(--item-height);
-      }
-
-      .window-separator {
-        background-color: var(--card-border-color);
-        height: 1px;
-        margin: 5px auto;
-        width: 80%;
-      }
-    </style>
-    <div id="history-item-container">
-      <div class="card-title" id="card-heading" aria-expanded$="[[opened]]"
-          aria-controls="collapse" on-click="toggleTabCard">
-        <div id="title-left-content">
-          <div id="device-name">
-            [[device]]
-          </div>
-          <span id="last-update-time">[[lastUpdateTime]]</span>
-        </div>
-        <div id="right-buttons">
-          <cr-icon-button id="menu-button" iron-icon="cr:more-vert"
-              on-click="onMenuButtonClick_" title="$i18n{actionMenuDescription}">
-          </cr-icon-button>
-          <cr-icon-button id="collapse-button"
-              iron-icon="[[getCollapseIcon_(opened)]]"
-              title$="[[getCollapseTitle_(opened)]]"></cr-icon-button>
-        </div>
-      </div>
-
-      <cr-collapse opened="{{opened}}" id="collapse">
-        <div id="tab-item-list">
-          <template is="dom-repeat" items="[[tabs]]" as="tab" id="tab-list">
-            <div class="item-container">
-              <a href="[[tab.url]]" class="website-link" title="[[tab.title]]"
-                  on-click="openTab_" on-contextmenu="onLinkRightClick_">
-              <div class="website-icon"></div>
-              <history-searched-label class="website-title"
-                  title="[[tab.title]]"
-                  search-term="[[searchTerm]]"></history-searched-label>
-              </a>
-            </div>
-            <div class="window-separator"
-                hidden$="[[!isWindowSeparatorIndex_(index, separatorIndexes)]]">
-            </div>
-          </template>
-        </div>
-      </cr-collapse>
+<div id="history-item-container">
+  <div class="card-title" id="card-heading" aria-expanded="${this.opened}"
+      aria-controls="collapse" @click="${this.toggleTabCard}">
+    <div id="title-left-content">
+      <div id="device-name">${this.device}</div>
+      <span id="last-update-time">${this.lastUpdateTime}</span>
     </div>
+    <div id="right-buttons">
+      <cr-icon-button id="menu-button" iron-icon="cr:more-vert"
+          @click="${this.onMenuButtonClick_}"
+          title="$i18n{actionMenuDescription}">
+      </cr-icon-button>
+      <cr-icon-button id="collapse-button"
+          iron-icon="${this.getCollapseIcon_()}"
+          title="${this.getCollapseTitle_()}">
+      </cr-icon-button>
+    </div>
+  </div>
+
+  <cr-collapse ?opened="${this.opened}" id="collapse">
+    <div id="tab-item-list">
+      ${this.tabs.map((tab, index) => html`
+        <div class="item-container">
+          <a href="${tab.url}" class="website-link" title="${tab.title}"
+              data-session-id="${tab.sessionId}"
+              @click="${this.openTab_}"
+              @contextmenu="${this.onLinkRightClick_}">
+            <div class="website-icon"></div>
+            <history-searched-label class="website-title"
+                title="${tab.title}"
+                search-term="${this.searchTerm}">
+            </history-searched-label>
+          </a>
+        </div>
+        <div class="window-separator"
+            ?hidden="${!this.isWindowSeparatorIndex_(index)}">
+        </div>
+      `)}
+    </div>
+  </cr-collapse>
+</div>
diff --git a/chrome/browser/resources/history/synced_device_card.ts b/chrome/browser/resources/history/synced_device_card.ts
index b143176..3508f1f8 100644
--- a/chrome/browser/resources/history/synced_device_card.ts
+++ b/chrome/browser/resources/history/synced_device_card.ts
@@ -15,16 +15,14 @@
 import {FocusRow} from 'chrome://resources/js/focus_row.js';
 import {getFaviconForPageURL} from 'chrome://resources/js/icon.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
-import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
+import type {PropertyValues} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
 import {BrowserServiceImpl} from './browser_service.js';
 import {SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram} from './constants.js';
 import type {ForeignSessionTab} from './externs.js';
-import {getTemplate} from './synced_device_card.html.js';
-
-interface OpenTabEvent {
-  model: {tab: ForeignSessionTab};
-}
+import {getCss} from './synced_device_card.css.js';
+import {getHtml} from './synced_device_card.html.js';
 
 declare global {
   interface HTMLElementTagNameMap {
@@ -41,58 +39,63 @@
   };
 }
 
-export class HistorySyncedDeviceCardElement extends PolymerElement {
+export class HistorySyncedDeviceCardElement extends CrLitElement {
   static get is() {
     return 'history-synced-device-card';
   }
 
-  static get template() {
-    return getTemplate();
+  static override get styles() {
+    return getCss();
   }
 
-  static get properties() {
+  override render() {
+    return getHtml.bind(this)();
+  }
+
+  static override get properties() {
     return {
       /**
        * The list of tabs open for this device.
        */
-      tabs: {type: Array, observer: 'updateIcons_'},
+      tabs: {type: Array},
 
       // Name of the synced device.
-      device: String,
+      device: {type: String},
 
       // When the device information was last updated.
-      lastUpdateTime: String,
+      lastUpdateTime: {type: String},
 
       // Whether the card is open.
-      opened: Boolean,
+      opened: {type: Boolean},
 
-      searchTerm: String,
+      searchTerm: {type: String},
 
       /**
        * The indexes where a window separator should be shown. The use of a
        * separate array here is necessary for window separators to appear
        * correctly in search. See http://crrev.com/2022003002 for more details.
        */
-      separatorIndexes: Array,
+      separatorIndexes: {type: Array},
 
       // Internal identifier for the device.
-      sessionTag: String,
+      sessionTag: {type: String},
     };
   }
 
+  device: string = '';
+  lastUpdateTime: string = '';
   tabs: ForeignSessionTab[] = [];
-  opened: boolean;
-  separatorIndexes: number[];
-  sessionTag: string;
+  opened: boolean = true;
+  searchTerm: string;
+  separatorIndexes: number[] = [];
+  sessionTag: string = '';
 
-  override ready() {
-    super.ready();
-    this.addEventListener('dom-change', this.notifyFocusUpdate_);
-  }
-
-  private fire_(eventName: string, detail?: any) {
-    this.dispatchEvent(
-        new CustomEvent(eventName, {bubbles: true, composed: true, detail}));
+  override updated(changedProperties: PropertyValues<this>) {
+    super.updated(changedProperties);
+    if (changedProperties.has('tabs')) {
+      this.notifyFocusUpdate_();
+      this.updateIcons_();
+    }
   }
 
   /**
@@ -116,36 +119,36 @@
   }
 
   /** Open a single synced tab. */
-  private openTab_(e: MouseEvent) {
-    const model = (e as unknown as OpenTabEvent).model;
-    const tab = model.tab;
+  protected openTab_(e: MouseEvent) {
     const browserService = BrowserServiceImpl.getInstance();
     browserService.recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.LINK_CLICKED,
         SyncedTabsHistogram.LIMIT);
-    browserService.openForeignSessionTab(this.sessionTag, tab.sessionId, e);
+    browserService.openForeignSessionTab(
+        this.sessionTag,
+        Number((e.currentTarget as HTMLElement).dataset['sessionId']), e);
     e.preventDefault();
   }
 
   /**
    * Toggles the dropdown display of synced tabs for each device card.
    */
-  toggleTabCard() {
-    const histogramValue = this.$.collapse.opened ?
-        SyncedTabsHistogram.COLLAPSE_SESSION :
-        SyncedTabsHistogram.EXPAND_SESSION;
+  async toggleTabCard() {
+    const histogramValue = this.opened ? SyncedTabsHistogram.COLLAPSE_SESSION :
+                                         SyncedTabsHistogram.EXPAND_SESSION;
 
     BrowserServiceImpl.getInstance().recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, histogramValue, SyncedTabsHistogram.LIMIT);
 
-    this.$.collapse.toggle();
+    this.opened = !this.opened;
 
-    this.fire_('update-focus-grid');
+    await this.updateComplete;  // Wait until focusable elements are updated.
+    this.fire('update-focus-grid');
   }
 
   private notifyFocusUpdate_() {
     // Refresh focus after all rows are rendered.
-    this.fire_('update-focus-grid');
+    this.fire('update-focus-grid');
   }
 
   /**
@@ -166,34 +169,37 @@
     }, 0);
   }
 
-  private isWindowSeparatorIndex_(index: number): boolean {
+  protected isWindowSeparatorIndex_(index: number): boolean {
     return this.separatorIndexes.indexOf(index) !== -1;
   }
 
-  private getCollapseIcon_(opened: boolean): string {
-    return opened ? 'cr:expand-less' : 'cr:expand-more';
+  protected getCollapseIcon_(): string {
+    return this.opened ? 'cr:expand-less' : 'cr:expand-more';
   }
 
-  private getCollapseTitle_(opened: boolean): string {
-    return opened ? loadTimeData.getString('collapseSessionButton') :
-                    loadTimeData.getString('expandSessionButton');
+  protected getCollapseTitle_(): string {
+    return this.opened ? loadTimeData.getString('collapseSessionButton') :
+                         loadTimeData.getString('expandSessionButton');
   }
 
-  private onMenuButtonClick_(e: Event) {
-    this.fire_('synced-device-card-open-menu', {
+  protected onMenuButtonClick_(e: Event) {
+    this.fire('synced-device-card-open-menu', {
       target: e.target,
       tag: this.sessionTag,
     });
     e.stopPropagation();  // Prevent cr-collapse.
   }
 
-  private onLinkRightClick_() {
+  protected onLinkRightClick_() {
     BrowserServiceImpl.getInstance().recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.LINK_RIGHT_CLICKED,
         SyncedTabsHistogram.LIMIT);
   }
 }
 
+// Exported to be used in the autogenerated Lit template file
+export type SyncedDeviceCardElement = HistorySyncedDeviceCardElement;
+
 declare global {
   interface HTMLElementTagNameMap {
     'history-synced-device-card': HistorySyncedDeviceCardElement;
diff --git a/chrome/browser/resources/media/media_engagement.ts b/chrome/browser/resources/media/media_engagement.ts
index 7acb1cc..0980112 100644
--- a/chrome/browser/resources/media/media_engagement.ts
+++ b/chrome/browser/resources/media/media_engagement.ts
@@ -43,12 +43,12 @@
 
   td[1].textContent = rowInfo.visits.toString();
   td[2].textContent = rowInfo.mediaPlaybacks.toString();
-  td[3]!.textContent = rowInfo.lastMediaPlaybackTime ?
+  td[3].textContent = rowInfo.lastMediaPlaybackTime ?
       new Date(rowInfo.lastMediaPlaybackTime).toISOString() :
       '';
   td[4].textContent = rowInfo.isHigh ? 'Yes' : 'No';
   td[5].textContent = rowInfo.totalScore ? rowInfo.totalScore.toFixed(2) : '0';
-  td[6]!.querySelectorAll<HTMLElement>('.engagement-bar')[0]!.style.width =
+  td[6].querySelectorAll<HTMLElement>('.engagement-bar')[0].style.width =
       (rowInfo.totalScore * 50) + 'px';
   return document.importNode(template.content, true);
 }
diff --git a/chrome/browser/resources/new_tab_page/app.ts b/chrome/browser/resources/new_tab_page/app.ts
index f1eaaff..d8ec260 100644
--- a/chrome/browser/resources/new_tab_page/app.ts
+++ b/chrome/browser/resources/new_tab_page/app.ts
@@ -390,7 +390,7 @@
             const toast = $$<CrToastElement>(this, '#webstoreToast');
             if (toast) {
               toast.hidden = false;
-              toast!.show();
+              toast.show();
             }
           }
         });
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts b/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts
index 604ab617..ec8791b2 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts
@@ -194,7 +194,7 @@
     }
     const scrollableRight =
         (attachmentList.scrollWidth - attachmentList.scrollLeft -
-         kAttachmentScrollFadeBuffer) > attachmentList!.clientWidth;
+         kAttachmentScrollFadeBuffer) > attachmentList.clientWidth;
     const scrollableLeft =
         attachmentList.scrollLeft - kAttachmentScrollFadeBuffer > 0;
 
diff --git a/chrome/browser/resources/password_manager/settings_section.ts b/chrome/browser/resources/password_manager/settings_section.ts
index c883121..b7e16b94 100644
--- a/chrome/browser/resources/password_manager/settings_section.ts
+++ b/chrome/browser/resources/password_manager/settings_section.ts
@@ -314,7 +314,7 @@
   // <if expr="is_win or is_macosx or is_chromeos">
   private switchBiometricAuthBeforeFillingState_(e: Event) {
     const biometricAuthenticationForFillingToggle =
-        e!.target as PrefToggleButtonElement;
+        e.target as PrefToggleButtonElement;
     assert(biometricAuthenticationForFillingToggle);
     PasswordManagerImpl.getInstance().switchBiometricAuthBeforeFillingState();
   }
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts
index bdbfcd1..5dca53b 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.ts
+++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -653,7 +653,7 @@
     this.pluginController_.setPresentationMode(false);
 
     // Ensure that directional keys still work after exiting.
-    this.shadowRoot!.querySelector('embed')!.focus();
+    this.shadowRoot.querySelector('embed')!.focus();
 
     // Set zoom back to original zoom before presentation mode.
     this.viewport.restoreZoomState();
@@ -755,9 +755,8 @@
       return;
     }
 
-    const errorDialog =
-        this.shadowRoot!.querySelector<ViewerErrorDialogElement>(
-            '#error-dialog')!;
+    const errorDialog = this.shadowRoot.querySelector<ViewerErrorDialogElement>(
+        '#error-dialog')!;
     errorDialog.reloadFn = () => {
       chrome.tabs.reload(this.browserApi!.getStreamInfo().tabId);
     };
@@ -765,7 +764,7 @@
 
   private closePasswordDialog_() {
     const passwordDialog =
-        this.shadowRoot!.querySelector<ViewerPasswordDialogElement>(
+        this.shadowRoot.querySelector<ViewerPasswordDialogElement>(
             '#password-dialog')!;
     if (passwordDialog) {
       passwordDialog.close();
@@ -1008,7 +1007,7 @@
       this.sendScriptingMessage({type: 'passwordPrompted'});
     } else {
       const passwordDialog =
-          this.shadowRoot!.querySelector<ViewerPasswordDialogElement>(
+          this.shadowRoot.querySelector<ViewerPasswordDialogElement>(
               '#password-dialog')!;
       assert(passwordDialog);
       passwordDialog.deny();
@@ -1207,7 +1206,7 @@
 
     // Workaround for crbug.com/1119944, so that the PDF plugin resizes only
     // once when the sidenav is opened/closed.
-    const container = this.shadowRoot!.querySelector('#sidenav-container')!;
+    const container = this.shadowRoot.querySelector('#sidenav-container')!;
     if (!this.sidenavCollapsed_) {
       container.classList.add('floating');
       container.addEventListener('transitionend', () => {
@@ -1346,7 +1345,7 @@
     }
 
     // Make sure file extension is .pdf, avoids dangerous extensions.
-    let fileName = result!.fileName;
+    let fileName = result.fileName;
     if (!fileName.toLowerCase().endsWith('.pdf')) {
       fileName = fileName + '.pdf';
     }
diff --git a/chrome/browser/resources/pdf/pdf_viewer_base.ts b/chrome/browser/resources/pdf/pdf_viewer_base.ts
index 7da59368..a86f76f 100644
--- a/chrome/browser/resources/pdf/pdf_viewer_base.ts
+++ b/chrome/browser/resources/pdf/pdf_viewer_base.ts
@@ -163,14 +163,14 @@
     // Create the viewport.
     const defaultZoom =
         this.browserApi.getZoomBehavior() === ZoomBehavior.MANAGE ?
-        this.browserApi!.getDefaultZoom() :
+        this.browserApi.getDefaultZoom() :
         1.0;
 
     assert(!this.viewport_);
     this.viewport_ = new Viewport(
         scroller, sizer, content, getScrollbarWidth(), defaultZoom);
     this.viewport_.setViewportChangedCallback(() => this.viewportChanged_());
-    this.viewport_!.setBeforeZoomCallback(
+    this.viewport_.setBeforeZoomCallback(
         () => this.currentController!.beforeZoom());
     this.viewport_.setAfterZoomCallback(() => {
       this.currentController!.afterZoom();
@@ -225,8 +225,8 @@
         this.browserApi.getZoomBehavior(), () => this.viewport_!.getZoom(),
         zoom => this.browserApi!.setZoom(zoom),
         this.browserApi.getInitialZoom());
-    this.viewport_!.setZoomManager(this.zoomManager_);
-    this.browserApi!.addZoomEventListener(
+    this.viewport_.setZoomManager(this.zoomManager_);
+    this.browserApi.addZoomEventListener(
         (zoom: number) => this.zoomManager_!.onBrowserZoomChange(zoom));
 
     // Request translated strings.
diff --git a/chrome/browser/resources/print_preview/data/model.ts b/chrome/browser/resources/print_preview/data/model.ts
index 7e4b343..32b499e 100644
--- a/chrome/browser/resources/print_preview/data/model.ts
+++ b/chrome/browser/resources/print_preview/data/model.ts
@@ -971,7 +971,7 @@
         caps.media_type.option.length > 0) {
       const unavailableValue =
           caps.media_type.option.find(o => !!o.is_default) ||
-          caps.media_type!.option[0];
+          caps.media_type.option[0];
       this.setSettingPath_('mediaType.unavailableValue', unavailableValue);
     }
 
@@ -987,7 +987,7 @@
       this.setSetting('dpi', matchingOption || defaultOption, true);
     } else if (caps.dpi && caps.dpi.option && caps.dpi.option.length > 0) {
       const unavailableValue =
-          caps.dpi!.option.find(o => !!o.is_default) || caps.dpi!.option[0];
+          caps.dpi.option.find(o => !!o.is_default) || caps.dpi.option[0];
       this.setSettingPath_('dpi.unavailableValue', unavailableValue);
     }
 
@@ -1039,9 +1039,9 @@
         caps.duplex.option) {
       // In this case, there must only be one option.
       const hasLongEdge =
-          caps.duplex!.option.some(o => o.type === DuplexType.LONG_EDGE);
+          caps.duplex.option.some(o => o.type === DuplexType.LONG_EDGE);
       const hasShortEdge =
-          caps.duplex!.option.some(o => o.type === DuplexType.SHORT_EDGE);
+          caps.duplex.option.some(o => o.type === DuplexType.SHORT_EDGE);
       // If the only option available is long edge, the value should always be
       // true.
       this.setSettingPath_(
@@ -1634,7 +1634,7 @@
       // adjust it for page content, see Landscape.isCapabilityAvailable().
       // We can improve results if we set AUTO here.
       const capability = destination.capabilities.printer ?
-          destination.capabilities!.printer.page_orientation :
+          destination.capabilities.printer.page_orientation :
           null;
       if (capability && capability.option &&
           capability.option.some(option => option.type === 'AUTO')) {
diff --git a/chrome/browser/resources/print_preview/ui/margin_control.ts b/chrome/browser/resources/print_preview/ui/margin_control.ts
index c6d6045..9983dc9 100644
--- a/chrome/browser/resources/print_preview/ui/margin_control.ts
+++ b/chrome/browser/resources/print_preview/ui/margin_control.ts
@@ -227,7 +227,7 @@
     }
     assert(this.measurementSystem);
     const decimal = this.measurementSystem.decimalDelimiter;
-    const thousands = this.measurementSystem!.thousandsDelimiter;
+    const thousands = this.measurementSystem.thousandsDelimiter;
     const whole = `(?:0|[1-9]\\d*|[1-9]\\d{0,2}(?:[${thousands}]\\d{3})*)`;
     const fractional = `(?:[${decimal}]\\d+)`;
     const wholeDecimal = `(?:${whole}[${decimal}])`;
@@ -250,7 +250,7 @@
   private serializeValueFromPts_(value: number): string {
     assert(this.measurementSystem);
     value = this.measurementSystem.convertFromPoints(value);
-    value = this.measurementSystem!.roundValue(value);
+    value = this.measurementSystem.roundValue(value);
     // Convert the dot symbol to the decimal delimiter for the locale.
     return value.toString().replace(
         '.', this.measurementSystem.decimalDelimiter);
diff --git a/chrome/browser/resources/print_preview/ui/plugin_proxy.ts b/chrome/browser/resources/print_preview/ui/plugin_proxy.ts
index e487824..afbf6c8 100644
--- a/chrome/browser/resources/print_preview/ui/plugin_proxy.ts
+++ b/chrome/browser/resources/print_preview/ui/plugin_proxy.ts
@@ -91,7 +91,7 @@
     // chrome/renderer/printing/print_render_frame_helper.cc actually
     // references it.
     this.plugin_.setAttribute('id', 'pdf-viewer');
-    return this.plugin_!;
+    return this.plugin_;
   }
 
   /**
diff --git a/chrome/browser/resources/settings/privacy_page/cr_lottie.ts b/chrome/browser/resources/settings/privacy_page/cr_lottie.ts
index 72eec90..df65d69 100644
--- a/chrome/browser/resources/settings/privacy_page/cr_lottie.ts
+++ b/chrome/browser/resources/settings/privacy_page/cr_lottie.ts
@@ -274,8 +274,8 @@
     this.xhr_ = new XMLHttpRequest();
     this.xhr_.open('GET', url, true);
     this.xhr_.responseType = responseType;
-    this.xhr_!.send();
-    this.xhr_!.onreadystatechange = () => {
+    this.xhr_.send();
+    this.xhr_.onreadystatechange = () => {
       assert(this.xhr_);
       if (this.xhr_.readyState === 4 && this.xhr_.status === 200) {
         // |successCallback| might trigger another xhr, so we set to null before
diff --git a/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts b/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts
index 7d520ec..1fc744e 100644
--- a/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts
+++ b/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts
@@ -193,7 +193,7 @@
     let removedAll = (origin === null);
     for (let i = 0; i < this.sites.length; ++i) {
       if (origin === null || origin === this.sites[i].origin) {
-        items[i]!.classList.add('hiding');
+        items[i].classList.add('hiding');
         if (origin) {
           // If this is the last site being removed, the visuals should be
           // the same as if all sites were removed.
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
index 0a4de1d..f92d597 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
@@ -209,7 +209,7 @@
     } else if (
         this.bookmarks_[0].parentId ===
             loadTimeData.getString('otherBookmarksId') ||
-        this.bookmarks_[0]!.parentId ===
+        this.bookmarks_[0].parentId ===
             loadTimeData.getString('mobileBookmarksId')) {
       menuItems.push({
         id: MenuItemId.ADD_TO_BOOKMARKS_BAR,
diff --git a/chrome/browser/resources/side_panel/read_anything/BUILD.gn b/chrome/browser/resources/side_panel/read_anything/BUILD.gn
index 9a847ad..89a4cfd 100644
--- a/chrome/browser/resources/side_panel/read_anything/BUILD.gn
+++ b/chrome/browser/resources/side_panel/read_anything/BUILD.gn
@@ -29,6 +29,7 @@
   non_web_component_files = [
     "app_style_updater.ts",
     "common.ts",
+    "keyboard_util.ts",
     "menus/menu_util.ts",
     "metrics_browser_proxy.ts",
     "read_anything.ts",
diff --git a/chrome/browser/resources/side_panel/read_anything/keyboard_util.ts b/chrome/browser/resources/side_panel/read_anything/keyboard_util.ts
new file mode 100644
index 0000000..cba7d87
--- /dev/null
+++ b/chrome/browser/resources/side_panel/read_anything/keyboard_util.ts
@@ -0,0 +1,43 @@
+// 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 {isRTL} from '//resources/js/util.js';
+
+const FORWARD_ARROWS = ['ArrowRight', 'ArrowDown'];
+const BACKWARD_ARROWS = ['ArrowLeft', 'ArrowUp'];
+const ALL_ARROWS = BACKWARD_ARROWS.concat(FORWARD_ARROWS);
+const HORIZONTAL_ARROWS = ['ArrowRight', 'ArrowLeft'];
+
+// Returns the next item to focus in the list of focusableElements, depending
+// on which key is used and whether the UI is LTR or RTL.
+export function getNewIndex(
+    key: string, target: HTMLElement,
+    focusableElements: HTMLElement[]): number {
+  let currentIndex = focusableElements.indexOf(target);
+  if (!isArrow(key)) {
+    return currentIndex;
+  }
+  const direction = isForwardArrow(key) ? 1 : -1;
+  // If target wasn't found in focusable elements, and we're going
+  // backwards, adjust currentIndex so we move to the last focusable element
+  if (currentIndex === -1 && direction === -1) {
+    currentIndex = focusableElements.length;
+  }
+  // Move to the next focusable item in the menu, wrapping around
+  // if we've reached the end or beginning.
+  return (currentIndex + direction + focusableElements.length) %
+      focusableElements.length;
+}
+
+export function isArrow(key: string): boolean {
+  return ALL_ARROWS.includes(key);
+}
+
+export function isForwardArrow(key: string): boolean {
+  return (isRTL() ? BACKWARD_ARROWS : FORWARD_ARROWS).includes(key);
+}
+
+export function isHorizontalArrow(key: string): boolean {
+  return HORIZONTAL_ARROWS.includes(key);
+}
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything.ts b/chrome/browser/resources/side_panel/read_anything/read_anything.ts
index 8910416e..5b29a74 100644
--- a/chrome/browser/resources/side_panel/read_anything/read_anything.ts
+++ b/chrome/browser/resources/side_panel/read_anything/read_anything.ts
@@ -13,6 +13,7 @@
 export {currentReadHighlightClass, PauseActionSource, previousReadHighlightClass, WordBoundaryMode} from './app.js';
 export {AppStyleUpdater} from './app_style_updater.js';
 export {getCurrentSpeechRate, playFromSelectionTimeout, spinnerDebounceTimeout, ToolbarEvent} from './common.js';
+export {getNewIndex, isArrow, isForwardArrow, isHorizontalArrow} from './keyboard_util.js';
 export type {LanguageMenuElement} from './language_menu.js';
 export type {LanguageToastElement} from './language_toast.js';
 export type {ColorMenu} from './menus/color_menu.js';
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html
index bd3a2e2..7b1db0b 100644
--- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html
+++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html
@@ -23,7 +23,7 @@
     border-radius: 18px;
     display: inline-block;
     height: fit-content;
-    margin-right: var(--audio-controls-right-margin);
+    margin-inline-end: var(--audio-controls-right-margin);
     padding: 4px var(--audio-controls-right-padding) 4px 2px;
   }
 
@@ -32,11 +32,11 @@
   }
 
   #font-size-decrease {
-    margin-left: 12px;
+    margin-inline-start: 12px;
   }
 
   #font-size-reset {
-    margin-right: 4px;
+    margin-inline-end: 4px;
   }
 
   .text-button {
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts
index 40e6737..e9b8b2a 100644
--- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts
+++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts
@@ -31,6 +31,7 @@
 
 import {emitEvent, getCurrentSpeechRate, minOverflowLengthToScroll, openMenu, spinnerDebounceTimeout, ToolbarEvent} from './common.js';
 import type {SettingsPrefs} from './common.js';
+import {getNewIndex, isArrow, isForwardArrow, isHorizontalArrow} from './keyboard_util.js';
 import type {ColorMenu} from './menus/color_menu.js';
 import type {HighlightMenu} from './menus/highlight_menu.js';
 import type {LetterSpacingMenu} from './menus/letter_spacing_menu.js';
@@ -780,34 +781,19 @@
     this.onKeyDown_(e, focusableElements);
   }
 
-  private getNewIndex_(e: KeyboardEvent, focusableElements: HTMLElement[]):
-      number {
-    let currentIndex = focusableElements.indexOf(e.target as HTMLElement);
-    const direction =
-        (e.key === 'ArrowRight' || e.key === 'ArrowDown') ? 1 : -1;
-    // If e.target wasn't found in focusable elements, and we're going
-    // backwards, adjust currentIndex so we move to the last focusable element
-    if (currentIndex === -1 && direction === -1) {
-      currentIndex = focusableElements.length;
-    }
-    // Move to the next focusable item in the menu, wrapping around
-    // if we've reached the end or beginning.
-    return (currentIndex + direction + focusableElements.length) %
-        focusableElements.length;
-  }
-
   private onFontSizeMenuKeyDown_(e: KeyboardEvent) {
     // The font size selection menu is laid out horizontally, so users should be
     // able to navigate it using either up and down arrows, or left and right
     // arrows.
-    if (!['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes(e.key)) {
+    if (!isArrow(e.key)) {
       return;
     }
     e.preventDefault();
     const focusableElements =
         Array.from(this.$.fontSizeMenu.get().children) as HTMLElement[];
+    assert(e.target instanceof HTMLElement);
     const elementToFocus =
-        focusableElements[this.getNewIndex_(e, focusableElements)];
+        focusableElements[getNewIndex(e.key, e.target, focusableElements)];
     assert(elementToFocus, 'no element to focus');
     elementToFocus.focus();
   }
@@ -818,15 +804,16 @@
   }
 
   private onKeyDown_(e: KeyboardEvent, focusableElements: HTMLElement[]) {
-    if (!['ArrowRight', 'ArrowLeft'].includes(e.key)) {
+    if (!isHorizontalArrow(e.key)) {
       return;
     }
 
     e.preventDefault();
     //  Move to the next focusable item in the toolbar, wrapping around
     //  if we've reached the end or beginning.
-    let newIndex = this.getNewIndex_(e, focusableElements);
-    const direction = e.key === 'ArrowRight' ? 1 : -1;
+    assert(e.target instanceof HTMLElement);
+    let newIndex = getNewIndex(e.key, e.target, focusableElements);
+    const direction = isForwardArrow(e.key) ? 1 : -1;
     // If the next item has overflowed, skip focusing the more options button
     // itself and go directly to the children. We still need this button in the
     // list of focusable elements because it can become focused by tabbing while
@@ -920,7 +907,7 @@
     // The default behavior goes to the next select option. However, we want
     // to instead go to the next toolbar button (handled in onToolbarKeyDown_).
     // ArrowDown and ArrowUp will still move to the next/previous option.
-    if (['ArrowRight', 'ArrowLeft'].includes(e.key)) {
+    if (isHorizontalArrow(e.key)) {
       e.preventDefault();
     }
   }
diff --git a/chrome/browser/resources/signin/signout_confirmation/BUILD.gn b/chrome/browser/resources/signin/signout_confirmation/BUILD.gn
index 9d72a1d..ea0fb1f 100644
--- a/chrome/browser/resources/signin/signout_confirmation/BUILD.gn
+++ b/chrome/browser/resources/signin/signout_confirmation/BUILD.gn
@@ -25,6 +25,7 @@
 
   webui_context_type = "trusted"
 
+  ts_composite = true
   ts_deps = [
     "//third_party/lit/v3_0:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
diff --git a/chrome/browser/resources/signin/signout_confirmation/signout_confirmation_app.ts b/chrome/browser/resources/signin/signout_confirmation/signout_confirmation_app.ts
index 6a7e949f..5ecfe3c 100644
--- a/chrome/browser/resources/signin/signout_confirmation/signout_confirmation_app.ts
+++ b/chrome/browser/resources/signin/signout_confirmation/signout_confirmation_app.ts
@@ -7,6 +7,7 @@
 import 'chrome://resources/cr_elements/icons.html.js';
 import '/strings.m.js';
 
+import type {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
 import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
@@ -18,18 +19,18 @@
 import {getCss} from './signout_confirmation_app.css.js';
 import {getHtml} from './signout_confirmation_app.html.js';
 
-function createDummySignoutConfirmationData(): SignoutConfirmationData {
-  return {
-    dialogTitle: '',
-    dialogSubtitle: '',
-    acceptButtonLabel: '',
-    cancelButtonLabel: '',
-  };
-}
+const SAMPLE_DATA: SignoutConfirmationData = {
+  dialogTitle: '',
+  dialogSubtitle: '',
+  acceptButtonLabel: '',
+  cancelButtonLabel: '',
+};
 
 export interface SignoutConfirmationAppElement {
   $: {
     signoutConfirmationDialog: HTMLElement,
+    acceptButton: CrButtonElement,
+    cancelButton: CrButtonElement,
   };
 }
 
@@ -52,8 +53,7 @@
     };
   }
 
-  protected data_: SignoutConfirmationData =
-      createDummySignoutConfirmationData();
+  protected data_: SignoutConfirmationData = SAMPLE_DATA;
 
   private eventTracker_: EventTracker = new EventTracker();
 
@@ -85,7 +85,17 @@
 
   override updated(changedProperties: PropertyValues<this>) {
     super.updated(changedProperties);
-    this.updateViewHeight_();
+
+    // Cast necessary since the properties are protected.
+    const changedPrivateProperties =
+        changedProperties as Map<PropertyKey, unknown>;
+
+    // Avoid requesting a view update if we are still using the sample data that
+    // was set at construction. Since the first view update will trigger showing
+    // the view, we should make sure to have valid data to show.
+    if (changedPrivateProperties.has('data_') && this.data_ !== SAMPLE_DATA) {
+      this.updateViewHeight_();
+    }
   }
 
   protected onAcceptButtonClick_() {
diff --git a/chrome/browser/resources/tab_search/auto_tab_groups/auto_tab_groups_page.ts b/chrome/browser/resources/tab_search/auto_tab_groups/auto_tab_groups_page.ts
index 7c1f096..e2b466b 100644
--- a/chrome/browser/resources/tab_search/auto_tab_groups/auto_tab_groups_page.ts
+++ b/chrome/browser/resources/tab_search/auto_tab_groups/auto_tab_groups_page.ts
@@ -234,7 +234,7 @@
 
   protected onBackClick_() {
     if (this.session_ && this.state_ !== TabOrganizationState.kNotStarted) {
-      this.apiProxy_.rejectSession(this.session_!.sessionId);
+      this.apiProxy_.rejectSession(this.session_.sessionId);
     } else {
       this.fire('back-click');
     }
diff --git a/chrome/browser/resources/tab_search/search.ts b/chrome/browser/resources/tab_search/search.ts
index 2d5bc95..c1a7a5c 100644
--- a/chrome/browser/resources/tab_search/search.ts
+++ b/chrome/browser/resources/tab_search/search.ts
@@ -70,7 +70,7 @@
   // Controls how heavily weighted the search field weights are relative to each
   // other in the scoring function.
   const searchFieldWeights = (options.keys).reduce((acc, {name, weight}) => {
-    acc[name as string] = weight;
+    acc[name] = weight;
     return acc;
   }, {} as {[key: string]: number});
 
diff --git a/chrome/browser/resources/web_app_internals/web_app_internals.ts b/chrome/browser/resources/web_app_internals/web_app_internals.ts
index 4f16ee4..7021609 100644
--- a/chrome/browser/resources/web_app_internals/web_app_internals.ts
+++ b/chrome/browser/resources/web_app_internals/web_app_internals.ts
@@ -21,28 +21,28 @@
         response => response.result);
 
 const iwaDevProxyInstallButton =
-    getRequiredElement('iwa-dev-install-proxy-button') as HTMLButtonElement;
+    getRequiredElement<HTMLButtonElement>('iwa-dev-install-proxy-button');
 
 const iwaDevProxyInstallUrl =
-    getRequiredElement('iwa-dev-install-proxy-url') as HTMLInputElement;
+    getRequiredElement<HTMLInputElement>('iwa-dev-install-proxy-url');
 
 const iwaDevUpdateManifestUrl =
-    getRequiredElement('iwa-dev-update-manifest-url') as HTMLInputElement;
+    getRequiredElement<HTMLInputElement>('iwa-dev-update-manifest-url');
 
 const iwaDevUpdateManifestDialog =
-    getRequiredElement('iwa-update-manifest-dialog') as HTMLDialogElement;
+    getRequiredElement<HTMLDialogElement>('iwa-update-manifest-dialog');
 
 const iwaSwitchChannelDialog =
-    getRequiredElement('iwa-switch-channel-input-dialog') as HTMLDialogElement;
+    getRequiredElement<HTMLDialogElement>('iwa-switch-channel-input-dialog');
 
 const switchChannelButton =
-    getRequiredElement('iwa-switch-channel-dialog-switch') as HTMLButtonElement;
+    getRequiredElement<HTMLButtonElement>('iwa-switch-channel-dialog-switch');
 
 const closeSwitchChannelDialogButton =
-    getRequiredElement('iwa-switch-channel-dialog-close') as HTMLButtonElement;
+    getRequiredElement<HTMLButtonElement>('iwa-switch-channel-dialog-close');
 
 const iwaPinnedVersionDialog =
-    getRequiredElement('iwa-pinned-version-input-dialog') as HTMLDialogElement;
+    getRequiredElement<HTMLDialogElement>('iwa-pinned-version-input-dialog');
 
 /**
  * Converts a mojo origin into a user-readable string, omitting default ports.
@@ -221,8 +221,8 @@
   const manifest: UpdateManifest = result.updateManifest!;
   const versions: VersionEntry[] = manifest.versions;
 
-  const select = getRequiredElement('iwa-update-manifest-version-select') as
-      HTMLSelectElement;
+  const select = getRequiredElement<HTMLSelectElement>(
+      'iwa-update-manifest-version-select');
   select.replaceChildren();
 
   for (const versionEntry of versions) {
@@ -232,9 +232,8 @@
     select.appendChild(option);
   }
 
-  const installButton =
-      getRequiredElement('iwa-update-manifest-dialog-install') as
-      HTMLButtonElement;
+  const installButton = getRequiredElement<HTMLButtonElement>(
+      'iwa-update-manifest-dialog-install');
 
   const installEventListener = async () => {
     installButton.removeEventListener('click', installEventListener);
@@ -286,7 +285,7 @@
 function showSwitchChannelDialog(appId: string, name: string) {
   switchChannelButton.addEventListener('click', async () => {
     const updateChannel =
-        getRequiredElement('iwa-update-channel') as HTMLInputElement;
+        getRequiredElement<HTMLInputElement>('iwa-update-channel');
 
     iwaSwitchChannelDialog.close();
 
@@ -329,12 +328,12 @@
 // Logic for handling the version pinning for IWAs.
 function showPinnedVersionDialog(appId: string, name: string) {
   const pinButton =
-      getRequiredElement('iwa-pinned-version-dialog-pin') as HTMLButtonElement;
-  const unpinButton = getRequiredElement('iwa-pinned-version-dialog-unpin') as
-      HTMLButtonElement;
+      getRequiredElement<HTMLButtonElement>('iwa-pinned-version-dialog-pin');
+  const unpinButton =
+      getRequiredElement<HTMLButtonElement>('iwa-pinned-version-dialog-unpin');
 
   const pinnedVersion =
-      getRequiredElement('iwa-pinned-version') as HTMLInputElement;
+      getRequiredElement<HTMLInputElement>('iwa-pinned-version');
 
   pinButton.addEventListener('click', () => {
     const version = pinnedVersion.value;
@@ -401,13 +400,13 @@
     });
 
 const iwaRotateKeyButton =
-    getRequiredElement('iwa-rotate-key-button') as HTMLButtonElement;
+    getRequiredElement<HTMLButtonElement>('iwa-rotate-key-button');
 
 iwaRotateKeyButton.addEventListener('click', () => {
   const webBundleId =
-      getRequiredElement('iwa-kr-web-bundle-id') as HTMLInputElement;
+      getRequiredElement<HTMLInputElement>('iwa-kr-web-bundle-id');
   const publicKeyBase64 =
-      getRequiredElement('iwa-kr-public-key-b64') as HTMLInputElement;
+      getRequiredElement<HTMLInputElement>('iwa-kr-public-key-b64');
 
   const keyRotationMessageDiv = getRequiredElement('iwa-kr-message');
   keyRotationMessageDiv.innerText = '';
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsDataSource.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsDataSource.java
index f9d55c4..c05a6ac 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsDataSource.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsDataSource.java
@@ -216,6 +216,11 @@
     }
 
     @Override
+    public void localPasswordCountsChanged() {
+        // no-op.
+    }
+
+    @Override
     public void onSavedPasswordsChanged(int count) {
         updateState();
     }
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java
index 71c72fb..273d4c86 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java
@@ -32,6 +32,8 @@
     interface Observer {
         void accountPasswordCountsChanged();
 
+        void localPasswordCountsChanged();
+
         void updateStatusChanged();
     }
 
@@ -57,6 +59,8 @@
      */
     private final SafetyHubPasswordsFetchService mAccountPasswordsFetchService;
 
+    private SafetyHubPasswordsFetchService mLocalPasswordsFetchService;
+
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
     SafetyHubFetchService(Profile profile) {
         assert profile != null;
@@ -75,6 +79,9 @@
                         prefService,
                         SafetyHubUtils.getAccountEmail(profile));
 
+        mLocalPasswordsFetchService =
+                new SafetyHubPasswordsFetchService(passwordManagerHelper, prefService, null);
+
         // Fetch latest update status.
         UpdateStatusProvider.getInstance().addObserver(mUpdateCallback);
 
@@ -173,6 +180,8 @@
      * to GMSCore have returned.
      */
     void fetchAccountCredentialsCount(Callback<Boolean> onFinishedCallback) {
+        // TODO(crbug.com/388789824): Consider letting the fetch fail in the `PasswordFetchService`
+        // instead.
         if (!checkConditionsForAccountPasswords()) {
             onFinishedCallback.onResult(/* needsReschedule */ false);
             cancelAccountPasswordsFetchJob();
@@ -204,12 +213,32 @@
         }
     }
 
+    /** Triggers a call to GMSCore to perform the local-level password checks in the background. */
+    public void runLocalPasswordCheckup() {
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SAFETY_HUB_LOCAL_PASSWORDS_MODULE)) {
+            mLocalPasswordsFetchService.clearPrefs();
+            return;
+        }
+
+        Callback<Boolean> onCheckupFinishedCallback =
+                (errorOccurred) -> notifyLocalPasswordCountsChanged();
+
+        // TODO(crbug.com/388789824): Add one hour timeout logic between fetches.
+        mLocalPasswordsFetchService.runPasswordCheckup(onCheckupFinishedCallback);
+    }
+
     private void notifyAccountPasswordCountsChanged() {
         for (Observer observer : mObservers) {
             observer.accountPasswordCountsChanged();
         }
     }
 
+    private void notifyLocalPasswordCountsChanged() {
+        for (Observer observer : mObservers) {
+            observer.localPasswordCountsChanged();
+        }
+    }
+
     private void notifyUpdateStatusChanged() {
         for (Observer observer : mObservers) {
             observer.updateStatusChanged();
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchService.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchService.java
index dcb3427..4baeffd 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchService.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchService.java
@@ -78,6 +78,34 @@
         fetchReusedPasswordsCount(onFinishedCallback);
     }
 
+    /**
+     * Makes a call to GMSCore to perform a password checkup in the background for `mAccount`. It
+     * also triggers several calls to GMSCore to fetch the compromised, weak and reuse password
+     * counts. `onFinishedCallback` runs either: (1) on success, when all password counts have
+     * successfully been returned and the appropriate preferences have been updated with the
+     * results; or (2) if any error has occurred either when running the checkup or fetching the
+     * counts.
+     */
+    public void runPasswordCheckup(Callback<Boolean> onFinishedCallback) {
+        if (!canPerformFetch()) {
+            clearPrefs();
+            onFinishedCallback.onResult(/* errorOccurred */ true);
+            return;
+        }
+
+        mPasswordManagerHelper.runPasswordCheckupInBackground(
+                PasswordCheckReferrer.SAFETY_CHECK,
+                mAccount,
+                success -> {
+                    fetchPasswordsCount(onFinishedCallback);
+                },
+                error -> {
+                    // TODO(crbug.com/388789824): Check if the prefs should be cleared on checkup
+                    // error.
+                    onFinishedCallback.onResult(/* errorOccurred */ true);
+                });
+    }
+
     /** Returns true if a password fetch can be performed, namely if GMSCore can be called. */
     public boolean canPerformFetch() {
         return ChromeFeatureList.isEnabled(ChromeFeatureList.SAFETY_HUB)
@@ -92,18 +120,19 @@
     }
 
     private String getBreachedPreference() {
-        // TODO(crbug.com/388789824): Add local preference if `mAccount` is null.
-        return Pref.BREACHED_CREDENTIALS_COUNT;
+        return mAccount == null
+                ? Pref.LOCAL_BREACHED_CREDENTIALS_COUNT
+                : Pref.BREACHED_CREDENTIALS_COUNT;
     }
 
     private String getWeakPreference() {
-        // TODO(crbug.com/388789824): Add local preference if `mAccount` is null.
-        return Pref.WEAK_CREDENTIALS_COUNT;
+        return mAccount == null ? Pref.LOCAL_WEAK_CREDENTIALS_COUNT : Pref.WEAK_CREDENTIALS_COUNT;
     }
 
     private String getReusedPreference() {
-        // TODO(crbug.com/388789824): Add local preference if `mAccount` is null.
-        return Pref.REUSED_CREDENTIALS_COUNT;
+        return mAccount == null
+                ? Pref.LOCAL_REUSED_CREDENTIALS_COUNT
+                : Pref.REUSED_CREDENTIALS_COUNT;
     }
 
     /** Makes a call to GMSCore to fetch the latest leaked passwords count for `mAccount`. */
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubUpdateCheckModuleMediator.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubUpdateCheckModuleMediator.java
index 07d1823..41b4968 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubUpdateCheckModuleMediator.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubUpdateCheckModuleMediator.java
@@ -71,6 +71,11 @@
     }
 
     @Override
+    public void localPasswordCountsChanged() {
+        // no-op.
+    }
+
+    @Override
     public void accountPasswordCountsChanged() {
         // no-op.
     }
diff --git a/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchServiceTest.java b/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchServiceTest.java
index 94de8af9..1932417 100644
--- a/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchServiceTest.java
+++ b/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchServiceTest.java
@@ -65,6 +65,7 @@
         mProfile = mSafetyHubTestRule.getProfile();
         mPrefService = mSafetyHubTestRule.getPrefService();
         mPasswordCheckupClientHelper = mSafetyHubTestRule.getPasswordCheckupClientHelper();
+        mSafetyHubTestRule.setSignedInState(true);
     }
 
     // Check next job is scheduled after the specified period.
@@ -84,7 +85,7 @@
 
     @Test
     @Features.EnableFeatures(ChromeFeatureList.SAFETY_HUB)
-    public void testTaskScheduledImmediately_WhenConditionsMet() {
+    public void testAccountPasswordsFetchJobScheduledImmediately_WhenConditionsMet() {
         new SafetyHubFetchService(mProfile).onForegroundSessionStart();
 
         verify(mTaskScheduler, times(1)).schedule(any(), mTaskInfoCaptor.capture());
@@ -101,7 +102,7 @@
         ChromeFeatureList.SAFETY_HUB,
         ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS
     })
-    public void testTaskCancelled_WhenConditionsNotMet() {
+    public void testAccountPasswordsFetchJobCancelled_WhenConditionsNotMet() {
         new SafetyHubFetchService(mProfile).onForegroundSessionStart();
 
         // Verify prefs are cleaned up when task is cancelled.
@@ -114,10 +115,10 @@
 
     @Test
     @Features.EnableFeatures(ChromeFeatureList.SAFETY_HUB)
-    public void testTaskCancelled_WhenSigninStatusChanged_SignOut() {
+    public void testAccountPasswordsFetchJobCancelled_WhenSigninStatusChanged_SignOut() {
+        SafetyHubFetchService fetchService = new SafetyHubFetchService(mProfile);
         mSafetyHubTestRule.setSignedInState(false);
-
-        new SafetyHubFetchService(mProfile).onSignedOut();
+        fetchService.onSignedOut();
 
         // Verify prefs are cleaned up when task is cancelled.
         verify(mPrefService, times(1)).clearPref(Pref.BREACHED_CREDENTIALS_COUNT);
@@ -129,7 +130,7 @@
 
     @Test
     @Features.EnableFeatures(ChromeFeatureList.SAFETY_HUB)
-    public void testTaskScheduled_WhenSigninStatusChanged_SignIn() {
+    public void testAccountPasswordsFetchJobScheduled_WhenSigninStatusChanged_SignIn() {
         mSafetyHubTestRule.setSignedInState(true);
 
         new SafetyHubFetchService(mProfile).onSignedIn();
@@ -143,7 +144,7 @@
 
     @Test
     @Features.EnableFeatures(ChromeFeatureList.SAFETY_HUB)
-    public void testTaskCancelled_WhenUPMDisabled() {
+    public void testAccountPasswordsFetchJobCancelled_WhenUPMDisabled() {
         mSafetyHubTestRule.setUPMStatus(false);
         new SafetyHubFetchService(mProfile).onForegroundSessionStart();
 
@@ -160,7 +161,7 @@
         ChromeFeatureList.SAFETY_HUB,
         ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS
     })
-    public void testTaskRescheduled_whenFetchFails() {
+    public void testAccountPasswordsFetchJobRescheduled_whenFetchFails() {
         mPasswordCheckupClientHelper.setError(new Exception());
 
         new SafetyHubFetchService(mProfile).fetchAccountCredentialsCount(mTaskFinishedCallback);
@@ -176,7 +177,7 @@
         ChromeFeatureList.SAFETY_HUB,
         ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS
     })
-    public void testTaskRescheduled_whenFetchFailsForOneCredentialType() {
+    public void testAccountPasswordsFetchJobRescheduled_whenFetchFailsForOneCredentialType() {
         mPasswordCheckupClientHelper.setWeakCredentialsError(new Exception());
         int breachedCredentialsCount = 5;
         int reusedCredentialsCount = 3;
@@ -222,4 +223,87 @@
         // Check next job is scheduled after the specified period.
         checkNextJobIsScheduled();
     }
+
+    @Test
+    @Features.EnableFeatures({
+        ChromeFeatureList.SAFETY_HUB,
+        ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS,
+        ChromeFeatureList.SAFETY_HUB_LOCAL_PASSWORDS_MODULE
+    })
+    public void testLocalPasswordsCheckup_whenFetchFails() {
+        mPasswordCheckupClientHelper.setError(new Exception());
+
+        new SafetyHubFetchService(mProfile).runLocalPasswordCheckup();
+
+        verify(mPrefService, never()).setInteger(eq(Pref.BREACHED_CREDENTIALS_COUNT), anyInt());
+        verify(mPrefService, never()).setInteger(eq(Pref.WEAK_CREDENTIALS_COUNT), anyInt());
+        verify(mPrefService, never()).setInteger(eq(Pref.REUSED_CREDENTIALS_COUNT), anyInt());
+    }
+
+    @Test
+    @Features.EnableFeatures({
+        ChromeFeatureList.SAFETY_HUB,
+        ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS,
+        ChromeFeatureList.SAFETY_HUB_LOCAL_PASSWORDS_MODULE
+    })
+    public void testLocalPasswordsCheckup_whenFetchFailsForOneCredentialType() {
+        mSafetyHubTestRule.setSignedInState(false);
+
+        mPasswordCheckupClientHelper.setWeakCredentialsError(new Exception());
+        int breachedCredentialsCount = 5;
+        int reusedCredentialsCount = 3;
+        mPasswordCheckupClientHelper.setBreachedCredentialsCount(breachedCredentialsCount);
+        mPasswordCheckupClientHelper.setReusedCredentialsCount(reusedCredentialsCount);
+
+        new SafetyHubFetchService(mProfile).runLocalPasswordCheckup();
+
+        verify(mPrefService, never()).setInteger(eq(Pref.LOCAL_WEAK_CREDENTIALS_COUNT), anyInt());
+        verify(mPrefService, times(1))
+                .setInteger(Pref.LOCAL_BREACHED_CREDENTIALS_COUNT, breachedCredentialsCount);
+        verify(mPrefService, times(1))
+                .setInteger(Pref.LOCAL_REUSED_CREDENTIALS_COUNT, reusedCredentialsCount);
+    }
+
+    @Test
+    @Features.EnableFeatures({
+        ChromeFeatureList.SAFETY_HUB,
+        ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS,
+        ChromeFeatureList.SAFETY_HUB_LOCAL_PASSWORDS_MODULE
+    })
+    public void testLocalPasswordsCheckup_whenCheckupFails() {
+        mPasswordCheckupClientHelper.setError(new Exception());
+
+        new SafetyHubFetchService(mProfile).runLocalPasswordCheckup();
+
+        verify(mPrefService, never())
+                .setInteger(eq(Pref.LOCAL_BREACHED_CREDENTIALS_COUNT), anyInt());
+        verify(mPrefService, never()).setInteger(eq(Pref.LOCAL_WEAK_CREDENTIALS_COUNT), anyInt());
+        verify(mPrefService, never()).setInteger(eq(Pref.LOCAL_REUSED_CREDENTIALS_COUNT), anyInt());
+    }
+
+    @Test
+    @Features.EnableFeatures({
+        ChromeFeatureList.SAFETY_HUB,
+        ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS,
+        ChromeFeatureList.SAFETY_HUB_LOCAL_PASSWORDS_MODULE
+    })
+    public void testLocalPasswordsCheckup_whenCheckupSucceeds() {
+        mSafetyHubTestRule.setSignedInState(false);
+
+        int breachedCredentialsCount = 5;
+        int weakCredentialsCount = 4;
+        int reusedCredentialsCount = 3;
+        mPasswordCheckupClientHelper.setBreachedCredentialsCount(breachedCredentialsCount);
+        mPasswordCheckupClientHelper.setWeakCredentialsCount(weakCredentialsCount);
+        mPasswordCheckupClientHelper.setReusedCredentialsCount(reusedCredentialsCount);
+
+        new SafetyHubFetchService(mProfile).runLocalPasswordCheckup();
+
+        verify(mPrefService, times(1))
+                .setInteger(Pref.LOCAL_BREACHED_CREDENTIALS_COUNT, breachedCredentialsCount);
+        verify(mPrefService, times(1))
+                .setInteger(Pref.LOCAL_WEAK_CREDENTIALS_COUNT, weakCredentialsCount);
+        verify(mPrefService, times(1))
+                .setInteger(Pref.LOCAL_REUSED_CREDENTIALS_COUNT, reusedCredentialsCount);
+    }
 }
diff --git a/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchServiceTest.java b/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchServiceTest.java
index dac0d694..f34a1254 100644
--- a/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchServiceTest.java
+++ b/chrome/browser/safety_hub/android/junit/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsFetchServiceTest.java
@@ -15,11 +15,13 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+import org.robolectric.ParameterizedRobolectricTestRunner.Parameter;
+import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
 
 import org.chromium.base.Callback;
-import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.BaseRobolectricTestRule;
 import org.chromium.base.test.util.Features;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.password_manager.FakePasswordCheckupClientHelper;
@@ -27,8 +29,11 @@
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.components.prefs.PrefService;
 
+import java.util.Arrays;
+import java.util.Collection;
+
 /** Unit tests for SafetyHubPasswordsFetchService. */
-@RunWith(BaseRobolectricTestRunner.class)
+@RunWith(ParameterizedRobolectricTestRunner.class)
 @Features.EnableFeatures({
     ChromeFeatureList.SAFETY_HUB,
     ChromeFeatureList.SAFETY_HUB_WEAK_AND_REUSED_PASSWORDS
@@ -38,7 +43,18 @@
 // invoked by these tests.
 @Features.DisableFeatures(ChromeFeatureList.LOGIN_DB_DEPRECATION_ANDROID)
 public class SafetyHubPasswordsFetchServiceTest {
-    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+    private static final String TEST_EMAIL_ADDRESS = "test@email.com";
+
+    @Parameters
+    public static Collection<Object> data() {
+        return Arrays.asList(new Object[] {true, false});
+    }
+
+    @Parameter public boolean hasAccount;
+
+    @Rule(order = -2)
+    public BaseRobolectricTestRule mBaseRule = new BaseRobolectricTestRule();
+
     @Rule public SafetyHubTestRule mSafetyHubTestRule = new SafetyHubTestRule();
 
     @Mock private Callback<Boolean> mTaskFinishedCallback;
@@ -49,36 +65,55 @@
 
     @Before
     public void setUp() {
+        // Needed because of BaseRobolectricTestRule.
+        MockitoAnnotations.openMocks(this);
+
         mPrefService = mSafetyHubTestRule.getPrefService();
         mPasswordCheckupClientHelper = mSafetyHubTestRule.getPasswordCheckupClientHelper();
         mPasswordManagerHelper =
                 PasswordManagerHelper.getForProfile(mSafetyHubTestRule.getProfile());
     }
 
+    private String getAccount() {
+        return hasAccount ? TEST_EMAIL_ADDRESS : null;
+    }
+
+    private String getBreachedPreference() {
+        return hasAccount ? Pref.BREACHED_CREDENTIALS_COUNT : Pref.LOCAL_BREACHED_CREDENTIALS_COUNT;
+    }
+
+    private String getWeakPreference() {
+        return hasAccount ? Pref.WEAK_CREDENTIALS_COUNT : Pref.LOCAL_WEAK_CREDENTIALS_COUNT;
+    }
+
+    private String getReusedPreference() {
+        return hasAccount ? Pref.REUSED_CREDENTIALS_COUNT : Pref.LOCAL_REUSED_CREDENTIALS_COUNT;
+    }
+
     @Test
     public void noPreferencesUpdated_whenUPMDisabled() {
         mSafetyHubTestRule.setUPMStatus(false);
 
-        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, null)
+        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, getAccount())
                 .fetchPasswordsCount(mTaskFinishedCallback);
 
-        verify(mPrefService, never()).setInteger(eq(Pref.BREACHED_CREDENTIALS_COUNT), anyInt());
-        verify(mPrefService, never()).setInteger(eq(Pref.WEAK_CREDENTIALS_COUNT), anyInt());
-        verify(mPrefService, never()).setInteger(eq(Pref.REUSED_CREDENTIALS_COUNT), anyInt());
-        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* onCheckupFinishedCallback= */ true));
+        verify(mPrefService, never()).setInteger(eq(getBreachedPreference()), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getWeakPreference()), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getReusedPreference()), anyInt());
+        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* errorOccurred */ true));
     }
 
     @Test
     public void noPreferencesUpdated_whenFetchFails() {
         mPasswordCheckupClientHelper.setError(new Exception());
 
-        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, null)
+        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, getAccount())
                 .fetchPasswordsCount(mTaskFinishedCallback);
 
-        verify(mPrefService, never()).setInteger(eq(Pref.BREACHED_CREDENTIALS_COUNT), anyInt());
-        verify(mPrefService, never()).setInteger(eq(Pref.WEAK_CREDENTIALS_COUNT), anyInt());
-        verify(mPrefService, never()).setInteger(eq(Pref.REUSED_CREDENTIALS_COUNT), anyInt());
-        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* onCheckupFinishedCallback= */ true));
+        verify(mPrefService, never()).setInteger(eq(getBreachedPreference()), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getWeakPreference()), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getReusedPreference()), anyInt());
+        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* errorOccurred */ true));
     }
 
     @Test
@@ -89,15 +124,14 @@
         mPasswordCheckupClientHelper.setBreachedCredentialsCount(breachedCredentialsCount);
         mPasswordCheckupClientHelper.setReusedCredentialsCount(reusedCredentialsCount);
 
-        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, null)
+        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, getAccount())
                 .fetchPasswordsCount(mTaskFinishedCallback);
 
-        verify(mPrefService, never()).setInteger(eq(Pref.WEAK_CREDENTIALS_COUNT), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getWeakPreference()), anyInt());
         verify(mPrefService, times(1))
-                .setInteger(Pref.BREACHED_CREDENTIALS_COUNT, breachedCredentialsCount);
-        verify(mPrefService, times(1))
-                .setInteger(Pref.REUSED_CREDENTIALS_COUNT, reusedCredentialsCount);
-        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* onCheckupFinishedCallback= */ true));
+                .setInteger(getBreachedPreference(), breachedCredentialsCount);
+        verify(mPrefService, times(1)).setInteger(getReusedPreference(), reusedCredentialsCount);
+        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* errorOccurred */ true));
     }
 
     @Test
@@ -109,16 +143,45 @@
         mPasswordCheckupClientHelper.setWeakCredentialsCount(weakCredentialsCount);
         mPasswordCheckupClientHelper.setReusedCredentialsCount(reusedCredentialsCount);
 
-        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, null)
+        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, getAccount())
                 .fetchPasswordsCount(mTaskFinishedCallback);
 
         verify(mPrefService, times(1))
-                .setInteger(Pref.BREACHED_CREDENTIALS_COUNT, breachedCredentialsCount);
+                .setInteger(getBreachedPreference(), breachedCredentialsCount);
+        verify(mPrefService, times(1)).setInteger(getWeakPreference(), weakCredentialsCount);
+        verify(mPrefService, times(1)).setInteger(getReusedPreference(), reusedCredentialsCount);
+        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* errorOccurred */ false));
+    }
+
+    @Test
+    public void noPreferencesUpdated_whenCheckupFails() {
+        mPasswordCheckupClientHelper.setError(new Exception());
+
+        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, getAccount())
+                .runPasswordCheckup(mTaskFinishedCallback);
+
+        verify(mPrefService, never()).setInteger(eq(getBreachedPreference()), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getWeakPreference()), anyInt());
+        verify(mPrefService, never()).setInteger(eq(getReusedPreference()), anyInt());
+        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* errorOccurred= */ true));
+    }
+
+    @Test
+    public void preferencesUpdated_whenCheckupSucceeds() {
+        int breachedCredentialsCount = 5;
+        int weakCredentialsCount = 4;
+        int reusedCredentialsCount = 3;
+        mPasswordCheckupClientHelper.setBreachedCredentialsCount(breachedCredentialsCount);
+        mPasswordCheckupClientHelper.setWeakCredentialsCount(weakCredentialsCount);
+        mPasswordCheckupClientHelper.setReusedCredentialsCount(reusedCredentialsCount);
+
+        new SafetyHubPasswordsFetchService(mPasswordManagerHelper, mPrefService, getAccount())
+                .runPasswordCheckup(mTaskFinishedCallback);
+
         verify(mPrefService, times(1))
-                .setInteger(Pref.WEAK_CREDENTIALS_COUNT, weakCredentialsCount);
-        verify(mPrefService, times(1))
-                .setInteger(Pref.REUSED_CREDENTIALS_COUNT, reusedCredentialsCount);
-        verify(mTaskFinishedCallback, times(1))
-                .onResult(eq(/* onCheckupFinishedCallback= */ false));
+                .setInteger(getBreachedPreference(), breachedCredentialsCount);
+        verify(mPrefService, times(1)).setInteger(getWeakPreference(), weakCredentialsCount);
+        verify(mPrefService, times(1)).setInteger(getReusedPreference(), reusedCredentialsCount);
+        verify(mTaskFinishedCallback, times(1)).onResult(eq(/* errorOccurred= */ false));
     }
 }
diff --git a/chrome/browser/screen_ai/BUILD.gn b/chrome/browser/screen_ai/BUILD.gn
index 6b1e8a9a..1603fdf 100644
--- a/chrome/browser/screen_ai/BUILD.gn
+++ b/chrome/browser/screen_ai/BUILD.gn
@@ -7,7 +7,7 @@
 
 assert(enable_screen_ai_service)
 
-if (is_chromeos_ash) {
+if (is_chromeos) {
   source_set("screen_ai_dlc_installer") {
     sources = [
       "screen_ai_dlc_installer.cc",
diff --git a/chrome/browser/screen_ai/screen_ai_downloader_chromeos.cc b/chrome/browser/screen_ai/screen_ai_downloader_chromeos.cc
index 8f41521..76bdc59 100644
--- a/chrome/browser/screen_ai/screen_ai_downloader_chromeos.cc
+++ b/chrome/browser/screen_ai/screen_ai_downloader_chromeos.cc
@@ -7,37 +7,17 @@
 #include "base/no_destructor.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/screen_ai/pref_names.h"
+#include "chrome/browser/screen_ai/screen_ai_dlc_installer.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_thread.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/screen_ai/screen_ai_dlc_installer.h"
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/files/file_path.h"
-#include "chromeos/lacros/lacros_service.h"
-#endif
-
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-void SetScreenAIComponentPath(
-    bool set_failed_state_if_not_available,
-    const std::optional<base::FilePath>& component_path) {
-  auto* install_state = screen_ai::ScreenAIInstallState::GetInstance();
-  if (component_path) {
-    install_state->SetComponentFolder(*component_path);
-  } else if (set_failed_state_if_not_available) {
-    install_state->SetState(
-        screen_ai::ScreenAIInstallState::State::kDownloadFailed);
-  }
-}
-#else
 void SetLastUsageTimeToNow() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   g_browser_process->local_state()->SetTime(
       prefs::kScreenAILastUsedTimePrefName, base::Time::Now());
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
 }  // namespace
 
@@ -54,102 +34,21 @@
   return install_state.get();
 }
 
-ScreenAIDownloaderChromeOS::ScreenAIDownloaderChromeOS() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // If component is already downloaded in Ash, update Lacros state.
-  // Ash may download the component in the startup steps as it was used in
-  // previous sessions, but that can be a bit after Lacros is created. Therefor
-  // we wait for 3 seconds to ask. This is a best effort, and if it does not get
-  // the state now, it will be done later on the first time that Lacros needs
-  // the library.
-  base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(
-          &ScreenAIDownloaderChromeOS::MaybeGetComponentFolderFromAsh,
-          weak_ptr_factory_.GetWeakPtr(),
-          /*download_if_needed=*/false),
-      base::Seconds(3));
-#endif
-}
-
+ScreenAIDownloaderChromeOS::ScreenAIDownloaderChromeOS() = default;
 ScreenAIDownloaderChromeOS::~ScreenAIDownloaderChromeOS() = default;
 
 void ScreenAIDownloaderChromeOS::DownloadComponentInternal() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   screen_ai::dlc_installer::Install();
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  MaybeGetComponentFolderFromAsh(/*download_if_needed=*/true);
-#endif
 }
 
 void ScreenAIDownloaderChromeOS::SetLastUsageTime() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // The last usage time should be sent to Ash as well for keeping track of the
-  // library usage, and either keeping it updated or deleting it when it is not
-  // used for a period of time.
-  MaybeSetLastUsageTimeInAsh();
-#else
   if (::content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
     SetLastUsageTimeToNow();
   } else {
     content::GetUIThreadTaskRunner()->PostTask(
         FROM_HERE, base::BindOnce(&SetLastUsageTimeToNow));
   }
-#endif
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-
-void ScreenAIDownloaderChromeOS::MaybeGetComponentFolderFromAsh(
-    bool download_if_needed) {
-  chromeos::LacrosService* impl = chromeos::LacrosService::Get();
-  if (!impl || !impl->IsAvailable<crosapi::mojom::ScreenAIDownloader>()) {
-    VLOG(0) << "ScreenAIDownloaderChromeOS is not available.";
-    ScreenAIInstallState::GetInstance()->SetState(
-        ScreenAIInstallState::State::kDownloadFailed);
-    return;
-  }
-
-  if (download_if_needed) {
-    ScreenAIInstallState::GetInstance()->SetState(
-        ScreenAIInstallState::State::kDownloading);
-  }
-
-  if (static_cast<uint32_t>(
-          impl->GetInterfaceVersion<crosapi::mojom::ScreenAIDownloader>()) <
-      crosapi::mojom::ScreenAIDownloader::kGetComponentFolderMinVersion) {
-    // Getting component folder without asking for download is not supported
-    // yet.
-    if (!download_if_needed) {
-      return;
-    }
-
-    impl->GetRemote<crosapi::mojom::ScreenAIDownloader>()
-        ->DownloadComponentDeprecated(
-            base::BindOnce(&SetScreenAIComponentPath,
-                           /*set_failed_state_if_not_available=*/true));
-
-  } else {
-    impl->GetRemote<crosapi::mojom::ScreenAIDownloader>()->GetComponentFolder(
-        download_if_needed,
-        base::BindOnce(
-            &SetScreenAIComponentPath,
-            /*set_failed_state_if_not_available=*/download_if_needed));
-  }
-}
-
-void ScreenAIDownloaderChromeOS::MaybeSetLastUsageTimeInAsh() {
-  chromeos::LacrosService* impl = chromeos::LacrosService::Get();
-  if (!impl || !impl->IsAvailable<crosapi::mojom::ScreenAIDownloader>()) {
-    VLOG(0) << "ScreenAIDownloaderChromeOS is not available.";
-    return;
-  }
-
-  impl->GetRemote<crosapi::mojom::ScreenAIDownloader>()->SetLastUsageTime();
-}
-
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 }  // namespace screen_ai
diff --git a/chrome/browser/screen_ai/screen_ai_downloader_chromeos.h b/chrome/browser/screen_ai/screen_ai_downloader_chromeos.h
index 777f44fd..9cfdba9 100644
--- a/chrome/browser/screen_ai/screen_ai_downloader_chromeos.h
+++ b/chrome/browser/screen_ai/screen_ai_downloader_chromeos.h
@@ -6,13 +6,8 @@
 #define CHROME_BROWSER_SCREEN_AI_SCREEN_AI_DOWNLOADER_CHROMEOS_H_
 
 #include "base/memory/weak_ptr.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/screen_ai/screen_ai_install_state.h"
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/screen_ai_downloader.mojom.h"
-#endif
-
 namespace screen_ai {
 
 class ScreenAIDownloaderChromeOS : public ScreenAIInstallState {
@@ -29,10 +24,6 @@
  private:
   // ScreenAIInstallState:
   void DownloadComponentInternal() override;
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  void MaybeGetComponentFolderFromAsh(bool download_if_needed);
-  void MaybeSetLastUsageTimeInAsh();
-#endif
 
   base::WeakPtrFactory<ScreenAIDownloaderChromeOS> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/search_engines/template_url_service_factory.cc b/chrome/browser/search_engines/template_url_service_factory.cc
index ed8c9e0..eeb1f40 100644
--- a/chrome/browser/search_engines/template_url_service_factory.cc
+++ b/chrome/browser/search_engines/template_url_service_factory.cc
@@ -11,7 +11,6 @@
 #include "base/functional/bind.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -31,7 +30,7 @@
 #include "components/search_engines/template_url_service.h"
 #include "rlz/buildflags/buildflags.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #endif
 
@@ -78,12 +77,7 @@
           new ChromeTemplateURLServiceClient(
               HistoryServiceFactory::GetForProfile(
                   profile, ServiceAccessType::EXPLICIT_ACCESS))),
-      dsp_change_callback
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-      ,
-      profile->IsMainProfile()
-#endif  // BUIDFLAG(IS_CHROMEOS_LACROS)
-  );
+      dsp_change_callback);
 }
 
 TemplateURLServiceFactory::TemplateURLServiceFactory()
@@ -111,7 +105,7 @@
 TemplateURLServiceFactory::BuildServiceInstanceForBrowserContext(
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // ChromeOS creates various unusual profiles (login, lock screen...) that do
   // not need a template URL service and cannot search.  The only non-regular
   // profile that needs a template URL is the signin profile.  The
diff --git a/chrome/browser/search_engines/template_url_service_test_util.cc b/chrome/browser/search_engines/template_url_service_test_util.cc
index b4f7658..4e3b3b96 100644
--- a/chrome/browser/search_engines/template_url_service_test_util.cc
+++ b/chrome/browser/search_engines/template_url_service_test_util.cc
@@ -15,7 +15,6 @@
 #include "base/strings/string_util.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/bind.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/regional_capabilities/regional_capabilities_service_factory.h"
diff --git a/chrome/browser/sessions/session_restore_stats_collector.cc b/chrome/browser/sessions/session_restore_stats_collector.cc
index 20d1a8eb..254da33 100644
--- a/chrome/browser/sessions/session_restore_stats_collector.cc
+++ b/chrome/browser/sessions/session_restore_stats_collector.cc
@@ -187,14 +187,10 @@
                        HasLowSiteEngagement(tab.contents()),
                        HasNotificationPermission(tab.contents()));
 
-    PerformanceManager::CallOnGraph(
-        FROM_HERE,
-        base::BindOnce(&performance_manager::WaitForSiteDataReader,
-                       PerformanceManager::GetPrimaryPageNodeForWebContents(
-                           tab.contents()),
-                       std::move(on_site_data_ready)
-                           .Then(base::BindPostTaskToCurrentDefault(
-                               std::move(on_tab_updates_in_background)))));
+    performance_manager::WaitForSiteDataReader(
+        PerformanceManager::GetPrimaryPageNodeForWebContents(tab.contents()),
+        std::move(on_site_data_ready)
+            .Then(std::move(on_tab_updates_in_background)));
   }
 
   // If we were not able to register observers for any tab, report stats.
diff --git a/chrome/browser/share/qr_code_generator_pixeltest.cc b/chrome/browser/share/qr_code_generator_pixeltest.cc
index 651b863..3a0af6cf 100644
--- a/chrome/browser/share/qr_code_generator_pixeltest.cc
+++ b/chrome/browser/share/qr_code_generator_pixeltest.cc
@@ -37,8 +37,7 @@
     // The QR code should be a square.
     ASSERT_EQ(response->width(), response->height());
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
     // Verify image contents through go/chrome-engprod-skia-gold.
     if (base::CommandLine::ForCurrentProcess()->HasSwitch(
             switches::kVerifyPixels)) {
diff --git a/chrome/browser/sharesheet/share_action/share_action.cc b/chrome/browser/sharesheet/share_action/share_action.cc
index 8faf66ce..9ce63740 100644
--- a/chrome/browser/sharesheet/share_action/share_action.cc
+++ b/chrome/browser/sharesheet/share_action/share_action.cc
@@ -4,9 +4,9 @@
 
 #include "chrome/browser/sharesheet/share_action/share_action.h"
 
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/drive/drive_api_util.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
 #endif
@@ -19,7 +19,7 @@
 
 bool ShareAction::ShouldShowAction(const apps::IntentPtr& intent,
                                    bool contains_hosted_document) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   for (const auto& file : intent->files) {
     if (file->mime_type &&
         drive::util::IsEncryptedMimeType(file->mime_type.value())) {
diff --git a/chrome/browser/sharesheet/share_action/share_action_cache.cc b/chrome/browser/sharesheet/share_action/share_action_cache.cc
index 79e551fd..a8b8a61 100644
--- a/chrome/browser/sharesheet/share_action/share_action_cache.cc
+++ b/chrome/browser/sharesheet/share_action/share_action_cache.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/sharesheet/share_action/share_action_cache.h"
 
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/about_flags.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sharesheet/share_action/example_action.h"
@@ -12,7 +12,7 @@
 #include "chrome/browser/sharesheet/sharesheet_types.h"
 #include "ui/gfx/vector_icon_types.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/sharesheet/copy_to_clipboard_share_action.h"
 #include "chrome/browser/ash/sharesheet/drive_share_action.h"
 #include "chrome/browser/nearby_sharing/nearby_sharing_service_factory.h"
@@ -23,7 +23,7 @@
 
 ShareActionCache::ShareActionCache(Profile* profile) {
   // ShareActions will be initialised here by calling AddShareAction.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (NearbySharingServiceFactory::IsNearbyShareSupportedForBrowserContext(
           profile)) {
     AddShareAction(std::make_unique<NearbyShareAction>(profile));
@@ -31,7 +31,7 @@
   AddShareAction(std::make_unique<ash::sharesheet::DriveShareAction>());
   AddShareAction(
       std::make_unique<ash::sharesheet::CopyToClipboardShareAction>(profile));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 ShareActionCache::~ShareActionCache() = default;
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc
index dc5cb7a..82ec2d3 100644
--- a/chrome/browser/sharesheet/sharesheet_service.cc
+++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -12,6 +12,7 @@
 #include "base/no_destructor.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/app_service/launch_utils.h"
@@ -99,7 +100,7 @@
   return delegator->GetSharesheetController();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void SharesheetService::ShowNearbyShareBubbleForArc(
     gfx::NativeWindow native_window,
     apps::IntentPtr intent,
@@ -129,7 +130,7 @@
       std::move(intent), std::move(delivered_callback),
       std::move(close_callback));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Cleanup delegator when bubble closes.
 void SharesheetService::OnBubbleClosed(
diff --git a/chrome/browser/sharesheet/sharesheet_service.h b/chrome/browser/sharesheet/sharesheet_service.h
index e58a49a..4a5708a 100644
--- a/chrome/browser/sharesheet/sharesheet_service.h
+++ b/chrome/browser/sharesheet/sharesheet_service.h
@@ -12,7 +12,7 @@
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
 #include "chrome/browser/sharesheet/share_action/share_action_cache.h"
 #include "chrome/browser/sharesheet/sharesheet_controller.h"
@@ -85,7 +85,7 @@
   // Gets the sharesheet controller for the given |native_window|.
   SharesheetController* GetSharesheetController(
       gfx::NativeWindow native_window);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Skips the generic Sharesheet bubble and directly displays the
   // NearbyShare bubble dialog for ARC.
   void ShowNearbyShareBubbleForArc(gfx::NativeWindow native_window,
@@ -94,7 +94,7 @@
                                    DeliveredCallback delivered_callback,
                                    CloseCallback close_callback,
                                    ActionCleanupCallback cleanup_callback);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   // |share_action_type| is set to null when testing, but should otherwise have
   // a valid value.
   void OnBubbleClosed(gfx::NativeWindow native_window,
diff --git a/chrome/browser/sharesheet/sharesheet_service_delegator.cc b/chrome/browser/sharesheet/sharesheet_service_delegator.cc
index e382c3f..af02f9a 100644
--- a/chrome/browser/sharesheet/sharesheet_service_delegator.cc
+++ b/chrome/browser/sharesheet/sharesheet_service_delegator.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/functional/callback.h"
+#include "build/build_config.h"
 #include "chrome/browser/sharesheet/sharesheet_service.h"
 #include "chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h"
 #include "chrome/browser/ui/ash/sharesheet/sharesheet_header_view.h"
@@ -19,13 +20,13 @@
     gfx::NativeWindow native_window,
     SharesheetService* sharesheet_service)
     : native_window_(native_window), sharesheet_service_(sharesheet_service) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   sharesheet_controller_ =
       std::make_unique<ash::sharesheet::SharesheetBubbleViewDelegate>(
           native_window_, this);
 #else
   NOTIMPLEMENTED();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 SharesheetServiceDelegator::~SharesheetServiceDelegator() = default;
@@ -63,7 +64,7 @@
   NOTREACHED();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Skips the generic Sharesheet bubble and directly displays the
 // NearbyShare bubble dialog.
 void SharesheetServiceDelegator::ShowNearbyShareBubbleForArc(
@@ -75,7 +76,7 @@
       std::move(intent), std::move(delivered_callback),
       std::move(close_callback));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Invoked immediately after an action has launched in the event that UI
 // changes need to occur at this point.
diff --git a/chrome/browser/sharesheet/sharesheet_service_delegator.h b/chrome/browser/sharesheet/sharesheet_service_delegator.h
index 9c39ada..1b4f550 100644
--- a/chrome/browser/sharesheet/sharesheet_service_delegator.h
+++ b/chrome/browser/sharesheet/sharesheet_service_delegator.h
@@ -10,7 +10,7 @@
 
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/sharesheet/sharesheet_types.h"
 #include "chrome/browser/sharesheet/sharesheet_ui_delegate.h"
 #include "chromeos/components/sharesheet/constants.h"
@@ -66,13 +66,13 @@
                   DeliveredCallback delivered_callback,
                   CloseCallback close_callback);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Skips the generic Sharesheet bubble and directly displays the
   // NearbyShare bubble dialog.
   void ShowNearbyShareBubbleForArc(apps::IntentPtr intent,
                                    DeliveredCallback delivered_callback,
                                    CloseCallback close_callback);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Invoked immediately after an action has launched in the event that UI
   // changes need to occur at this point.
diff --git a/chrome/browser/sharesheet/sharesheet_service_factory.cc b/chrome/browser/sharesheet/sharesheet_service_factory.cc
index 0b379a5..1b4772eb 100644
--- a/chrome/browser/sharesheet/sharesheet_service_factory.cc
+++ b/chrome/browser/sharesheet/sharesheet_service_factory.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "base/command_line.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/sharesheet/sharesheet_ui_delegate.h b/chrome/browser/sharesheet/sharesheet_ui_delegate.h
index 18a1006..e07d668 100644
--- a/chrome/browser/sharesheet/sharesheet_ui_delegate.h
+++ b/chrome/browser/sharesheet/sharesheet_ui_delegate.h
@@ -7,7 +7,7 @@
 
 #include <vector>
 
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/sharesheet/sharesheet_controller.h"
 #include "chrome/browser/sharesheet/sharesheet_types.h"
 #include "components/services/app_service/public/cpp/intent.h"
@@ -26,13 +26,13 @@
                           apps::IntentPtr intent,
                           DeliveredCallback delivered_callback,
                           CloseCallback close_callback) = 0;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Skips the generic Sharesheet bubble and directly displays the
   // NearbyShare bubble dialog.
   virtual void ShowNearbyShareBubbleForArc(apps::IntentPtr intent,
                                            DeliveredCallback delivered_callback,
                                            CloseCallback close_callback) = 0;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // Invoked immediately after an action has launched in the event that UI
   // changes need to occur at this point.
diff --git a/chrome/browser/sharing/sharing_handler_registry_impl.cc b/chrome/browser/sharing/sharing_handler_registry_impl.cc
index 8ccf122..add783d 100644
--- a/chrome/browser/sharing/sharing_handler_registry_impl.cc
+++ b/chrome/browser/sharing/sharing_handler_registry_impl.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/sharing/sharing_handler_registry_impl.h"
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/sharing/optimization_guide/optimization_guide_message_handler.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
 #include "components/sharing_message/ack_message_handler.h"
@@ -24,8 +23,7 @@
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/sharing/shared_clipboard/remote_copy_message_handler.h"
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS_LACROS)) BUILDFLAG(IS_CHROMEOS)
+#endif
 
 SharingHandlerRegistryImpl::SharingHandlerRegistryImpl(
     Profile* profile,
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java
index 5daec18..c177fa4 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java
@@ -6,9 +6,11 @@
 
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** Immutable holder for displayable profile data. */
+@NullMarked
 public class DisplayableProfileData {
     private final String mAccountEmail;
     private final Drawable mImage;
@@ -18,7 +20,7 @@
 
     public DisplayableProfileData(
             String accountEmail,
-            Drawable image,
+            @Nullable Drawable image,
             @Nullable String fullName,
             @Nullable String givenName,
             boolean hasDisplayableEmailAddress) {
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/IdentityServicesProvider.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/IdentityServicesProvider.java
index 1e3da20..0b000add 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/IdentityServicesProvider.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/IdentityServicesProvider.java
@@ -5,13 +5,14 @@
 package org.chromium.chrome.browser.signin.services;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.Nullable;
 
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.signin.identitymanager.IdentityManager;
 
@@ -19,8 +20,9 @@
  * Provides access to sign-in related services that are profile-keyed on the native side. Java
  * equivalent of AccountTrackerServiceFactory and similar classes.
  */
+@NullMarked
 public class IdentityServicesProvider {
-    private static IdentityServicesProvider sIdentityServicesProvider;
+    private static @Nullable IdentityServicesProvider sIdentityServicesProvider;
 
     private IdentityServicesProvider() {}
 
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
index 990c5a28..cbf1c82 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
@@ -20,8 +20,6 @@
 import androidx.annotation.DimenRes;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.Px;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -29,6 +27,8 @@
 import org.chromium.base.ObserverList;
 import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.util.AvatarGenerator;
 import org.chromium.components.signin.AccountEmailDisplayHook;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
@@ -46,6 +46,7 @@
  * Fetches and caches Google Account profile images and full names for the accounts on the device.
  */
 @MainThread
+@NullMarked
 public class ProfileDataCache implements AccountInfoService.Observer {
     /** Observer to get notifications about changes in profile data. */
     public interface Observer {
@@ -384,7 +385,7 @@
 
     private void updateCacheAndNotifyObservers(
             String email,
-            Bitmap avatar,
+            @Nullable Bitmap avatar,
             String fullName,
             String givenName,
             boolean hasDisplayableEmailAddress) {
@@ -458,7 +459,7 @@
         return new BitmapDrawable(context.getResources(), output);
     }
 
-    private @Nullable BadgeConfig getBadgeConfigForAccount(@NonNull String email) {
+    private @Nullable BadgeConfig getBadgeConfigForAccount(String email) {
         return mPerAccountBadgeConfig.get(email) != null
                 ? mPerAccountBadgeConfig.get(email)
                 : mDefaultBadgeConfig;
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
index 3a59d59..ae6f122 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
@@ -4,11 +4,11 @@
 
 package org.chromium.chrome.browser.signin.services;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Log;
 import org.chromium.base.Promise;
 import org.chromium.base.lifetime.Destroyable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.signin.services.SigninManager.SignInCallback;
 import org.chromium.components.signin.AccountManagerFacade;
@@ -23,6 +23,7 @@
 import java.util.List;
 
 /** This class regroups sign-in checks when chrome starts up and when accounts change on device */
+@NullMarked
 public class SigninChecker implements AccountsChangeObserver, Destroyable {
     private static final String TAG = "SigninChecker";
     private final AccountManagerFacade mAccountManagerFacade;
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java
index 99fb938..612619f 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java
@@ -6,10 +6,10 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.identitymanager.IdentityManager;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
@@ -20,14 +20,15 @@
 
 /**
  * Android wrapper of the SigninManager which provides access from the Java layer.
- * <p/>
- * This class handles common paths during the sign-in and sign-out flows.
- * <p/>
- * Only usable from the UI thread as the native SigninManager requires its access to be in the
- * UI thread.
- * <p/>
- * See chrome/browser/android/signin/signin_manager_android.h for more details.
+ *
+ * <p>This class handles common paths during the sign-in and sign-out flows.
+ *
+ * <p>Only usable from the UI thread as the native SigninManager requires its access to be in the UI
+ * thread.
+ *
+ * <p>See chrome/browser/android/signin/signin_manager_android.h for more details.
  */
+@NullMarked
 public interface SigninManager {
     /** What type of data to delete when data deletion is requested. */
     @IntDef({DataWipeOption.WIPE_SYNC_DATA, DataWipeOption.WIPE_ALL_PROFILE_DATA})
@@ -192,14 +193,14 @@
      * Signs out of Chrome. This method clears the signed-in username, stops sync and sends out a
      * sign-out notification on the native side.
      *
-     * @param signoutSource describes the event driving the signout (e.g.
-     *         {@link SignoutReason#USER_CLICKED_SIGNOUT_SETTINGS}).
+     * @param signoutSource describes the event driving the signout (e.g. {@link
+     *     SignoutReason#USER_CLICKED_SIGNOUT_SETTINGS}).
      * @param signOutCallback Callback to notify about the sign-out progress.
      * @param forceWipeUserData Whether user selected to wipe all device data.
      */
     void signOut(
             @SignoutReason int signoutSource,
-            SignOutCallback signOutCallback,
+            @Nullable SignOutCallback signOutCallback,
             boolean forceWipeUserData);
 
     /**
@@ -229,7 +230,7 @@
      * @param callback The callback that will receive true if the account is managed, false
      *     otherwise.
      */
-    void isAccountManaged(@NonNull CoreAccountInfo accountInfo, Callback<Boolean> callback);
+    void isAccountManaged(CoreAccountInfo accountInfo, Callback<Boolean> callback);
 
     /**
      * Wipes the user's bookmarks and sync data.
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninMetricsUtils.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninMetricsUtils.java
index 1c77be2..08c86c4 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninMetricsUtils.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninMetricsUtils.java
@@ -10,6 +10,7 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.signin.metrics.AccountConsistencyPromoAction;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
 import org.chromium.components.signin.metrics.SigninPromoAction;
@@ -20,6 +21,7 @@
 import java.lang.annotation.RetentionPolicy;
 
 /** Util methods for signin metrics logging. */
+@NullMarked
 public class SigninMetricsUtils {
     /** Used to record Signin.AddAccountState histogram. Do not change existing values. */
     @Retention(RetentionPolicy.SOURCE)
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManager.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManager.java
index 127042c..01fc54cf 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManager.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManager.java
@@ -4,11 +4,12 @@
 
 package org.chromium.chrome.browser.signin.services;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.StringDef;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.shared_preferences.SharedPreferencesManager;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
 
@@ -17,6 +18,7 @@
 import java.util.Set;
 
 /** SigninPreferencesManager stores the state of SharedPreferences related to account sign-in. */
+@NullMarked
 public class SigninPreferencesManager {
     private static final SigninPreferencesManager INSTANCE = new SigninPreferencesManager();
 
@@ -82,11 +84,10 @@
     }
 
     /**
-     * Returns a set of account emails on the device when signin promo was last shown,
-     * or null if promo hasn't been shown yet.
+     * Returns a set of account emails on the device when signin promo was last shown, or null if
+     * promo hasn't been shown yet.
      */
-    @Nullable
-    public Set<String> getSigninPromoLastAccountEmails() {
+    public @Nullable Set<String> getSigninPromoLastAccountEmails() {
         return mManager.readStringSet(
                 ChromePreferenceKeys.SIGNIN_PROMO_LAST_SHOWN_ACCOUNT_NAMES, null);
     }
@@ -179,13 +180,13 @@
     /** The email of the account for which sync was enabled. */
     // TODO(crbug.com/40697988): Remove this after migrating the legacy code that uses
     //                                  the sync account before the native is loaded.
-    public String getLegacyPrimaryAccountEmail() {
+    public @Nullable String getLegacyPrimaryAccountEmail() {
         return mManager.readString(ChromePreferenceKeys.SIGNIN_LEGACY_PRIMARY_ACCOUNT_EMAIL, null);
     }
 
     // TODO(crbug.com/337003667): Remove after fixing internal usages.
     @Deprecated
-    public String getLegacySyncAccountEmail() {
+    public @Nullable String getLegacySyncAccountEmail() {
         return getLegacyPrimaryAccountEmail();
     }
 
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/UnifiedConsentServiceBridge.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/UnifiedConsentServiceBridge.java
index b4d6036..151111a 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/UnifiedConsentServiceBridge.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/UnifiedConsentServiceBridge.java
@@ -10,11 +10,14 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ResettersForTesting;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 
 /** Bridge to UnifiedConsentService. */
+@NullMarked
 public class UnifiedConsentServiceBridge {
-    private static Boolean sUrlKeyedAnonymizedDataCollectionEnabledForTesting;
+    private static @Nullable Boolean sUrlKeyedAnonymizedDataCollectionEnabledForTesting;
 
     private UnifiedConsentServiceBridge() {}
 
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
index 498554b..9e128eb 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
@@ -12,6 +12,7 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.browser.WebSigninTrackerResult;
@@ -24,6 +25,7 @@
  * resources.
  */
 @MainThread
+@NullMarked
 public class WebSigninBridge {
     /** Factory to create WebSigninBridge object. */
     public static class Factory {
diff --git a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
index d978435..81b115c9 100644
--- a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
+++ b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/external_protocol/external_protocol_handler.h"
 #include "chrome/browser/profiles/profile.h"
@@ -67,7 +66,7 @@
 #include "pdf/pdf_features.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/screen.h"
@@ -1487,7 +1486,7 @@
   EXPECT_TRUE(watcher.did_exit_normally());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // This test verifies that an OOPIF created in a tab on a secondary display
 // doesn't initialize its device scale factor based on the primary display.
 // Note: This test could probably be expanded to run on all ASH platforms.
diff --git a/chrome/browser/site_isolation/site_per_process_interactive_browsertest.cc b/chrome/browser/site_isolation/site_per_process_interactive_browsertest.cc
index a0fb3730..098e7a29 100644
--- a/chrome/browser/site_isolation/site_per_process_interactive_browsertest.cc
+++ b/chrome/browser/site_isolation/site_per_process_interactive_browsertest.cc
@@ -15,7 +15,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h"
 #include "chrome/browser/ui/browser.h"
@@ -751,9 +750,7 @@
   EXPECT_EQ("\"child3-focused-input1\"", press_tab_and_wait_for_message(false));
 }
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
 // Ensures that renderers know to advance focus to sibling frames and parent
 // frames in the presence of mouse click initiated focus changes.
 // Verifies against regression of https://crbug.com/702330
diff --git a/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc b/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc
index 7518566..c07ee0a 100644
--- a/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc
+++ b/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
@@ -890,7 +889,7 @@
 // This test makes sure browser correctly tracks focused editable element inside
 // each RenderFrameHost.
 // Test is flaky on chromeOS; https://crbug.com/705203.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_TrackingFocusedElementForAllFrames \
   DISABLED_TrackingFocusedElementForAllFrames
 #else
@@ -937,7 +936,7 @@
 // in both cases the test verifies that WebContents is aware whether or not a
 // focused editable element exists on the page.
 // Test is flaky on ChromeOS. crbug.com/705289
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_TrackPageFocusEditableElement \
   DISABLED_TrackPageFocusEditableElement
 #else
@@ -979,7 +978,7 @@
 // WebContents to clear focused element and verifies that there is no longer
 // a focused editable element on the page.
 // Test is flaky on ChromeOS; https://crbug.com/705203.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_ClearFocusedElementOnPage DISABLED_ClearFocusedElementOnPage
 #else
 #define MAYBE_ClearFocusedElementOnPage ClearFocusedElementOnPage
diff --git a/chrome/browser/ssl/chrome_security_blocking_page_factory.cc b/chrome/browser/ssl/chrome_security_blocking_page_factory.cc
index 5fa71a6..2273f7e 100644
--- a/chrome/browser/ssl/chrome_security_blocking_page_factory.cc
+++ b/chrome/browser/ssl/chrome_security_blocking_page_factory.cc
@@ -9,7 +9,6 @@
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/history/history_service_factory.h"
@@ -40,7 +39,7 @@
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 #include "base/enterprise_util.h"
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #endif
@@ -412,13 +411,13 @@
   }
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   auto* connector =
       g_browser_process->platform_part()->browser_policy_connector_ash();
   if (connector && connector->IsDeviceEnterpriseManaged()) {
     return true;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   if (profile && profile->GetProfilePolicyConnector() &&
       profile->GetProfilePolicyConnector()->IsManaged()) {
diff --git a/chrome/browser/ssl/chrome_security_state_tab_helper.cc b/chrome/browser/ssl/chrome_security_state_tab_helper.cc
index 12b2a8a..7478f5a 100644
--- a/chrome/browser/ssl/chrome_security_state_tab_helper.cc
+++ b/chrome/browser/ssl/chrome_security_state_tab_helper.cc
@@ -12,7 +12,6 @@
 #include "base/strings/pattern.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/lookalikes/safety_tip_web_contents_observer.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ssl/https_first_mode_settings_tracker.cc b/chrome/browser/ssl/https_first_mode_settings_tracker.cc
index 5d38a60..306b7a8 100644
--- a/chrome/browser/ssl/https_first_mode_settings_tracker.cc
+++ b/chrome/browser/ssl/https_first_mode_settings_tracker.cc
@@ -13,7 +13,7 @@
 #include "base/task/thread_pool.h"
 #include "base/time/default_clock.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/profiles/profile.h"
@@ -32,9 +32,9 @@
 #include "content/public/browser/storage_partition.h"
 #include "net/base/url_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Minimum score of an HTTPS origin to enable HFM on its hostname.
 const base::FeatureParam<int> kHttpsAddThreshold{
@@ -185,14 +185,14 @@
 
 std::unique_ptr<KeyedService> BuildService(content::BrowserContext* context) {
   Profile* profile = Profile::FromBrowserContext(context);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Explicitly check for ChromeOS sign-in profiles (which would cause
   // double-counting of at-startup metrics for ChromeOS restarts) which are not
   // covered by the `IsRegularProfile()` check.
   if (ash::ProfileHelper::IsSigninProfile(profile)) {
     return nullptr;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   return std::make_unique<HttpsFirstModeService>(profile, GetClock());
 }
 
diff --git a/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc b/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc
index 1d0d0ff7..2700b96 100644
--- a/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc
+++ b/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc
@@ -5,7 +5,6 @@
 #include "base/files/file_util.h"
 #include "base/test/simple_test_clock.h"
 #include "base/threading/thread_restrictions.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ssl/known_interception_disclosure_infobar_delegate.h"
 #include "chrome/browser/ui/browser.h"
@@ -150,15 +149,8 @@
   EXPECT_EQ(0u, GetInfobarCount(tab));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_CooldownResetsOnBrowserRestartDesktop \
-  DISABLED_CooldownResetsOnBrowserRestartDesktop
-#else
-#define MAYBE_CooldownResetsOnBrowserRestartDesktop \
-  CooldownResetsOnBrowserRestartDesktop
-#endif
 IN_PROC_BROWSER_TEST_F(KnownInterceptionDisclosureInfobarTest,
-                       MAYBE_CooldownResetsOnBrowserRestartDesktop) {
+                       CooldownResetsOnBrowserRestartDesktop) {
   const GURL kInterceptedUrl(https_server_.GetURL("/ssl/google.html"));
 
   // On restart, no infobar should be shown initially.
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index 8132c11..56caf9f 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -46,7 +46,6 @@
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_content_browser_client.h"
@@ -220,7 +219,7 @@
 #include "net/cert/x509_util_nss.h"
 #endif  // BUILDFLAG(USE_NSS_CERTS)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_switches.h"
 #include "base/path_service.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
@@ -230,7 +229,7 @@
 #include "components/policy/core/common/policy_service.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/user_manager/test_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 using content::WebContents;
 namespace AuthState = ssl_test_util::AuthState;
@@ -1657,11 +1656,6 @@
   EXPECT_EQ(security_state::WARNING, helper->GetSecurityLevel());
 }
 
-// TODO(crbug.com/40156980): This class directly calls
-// `UnsafelyGetNSSCertDatabaseForTesting()` that causes crash at the moment
-// and is never called from Lacros-Chrome. This should be revisited when there
-// is a solution for the client certificates settings page on Lacros-Chrome.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 #if BUILDFLAG(USE_NSS_CERTS)
 class SSLUITestWithClientCert : public SSLUITestBase {
  public:
@@ -1755,7 +1749,6 @@
   EXPECT_TRUE(base::EqualsCaseInsensitiveASCII(result, "pass"));
 }
 #endif  // BUILDFLAG(USE_NSS_CERTS)
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
 // A stub ClientCertStore that returns a FakeClientCertIdentity.
 class ClientCertStoreStub : public net::ClientCertStore {
@@ -2595,8 +2588,7 @@
 // crash the browser (crbug.com/1966).
 // TODO(crbug.com/1119359, crbug.com/1338068): Test is flaky on Linux and Chrome
 // OS.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_TestCloseTabWithUnsafePopup DISABLED_TestCloseTabWithUnsafePopup
 #else
 #define MAYBE_TestCloseTabWithUnsafePopup TestCloseTabWithUnsafePopup
@@ -3701,7 +3693,7 @@
 // Visit a page and establish a WebSocket connection over bad https with
 // --ignore-certificate-errors-spki-list. The connection should be established
 // without interstitial page showing.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)  // Chrome OS does not support the flag.
+#if !BUILDFLAG(IS_CHROMEOS)  // Chrome OS does not support the flag.
 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, TestWSSExpired) {
   ASSERT_TRUE(wss_server_expired_.Start());
 
@@ -3724,11 +3716,11 @@
   const std::u16string result = watcher.WaitAndGetTitle();
   EXPECT_TRUE(base::EqualsCaseInsensitiveASCII(result, "pass"));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Test that HTTPS pages with a bad certificate don't show an interstitial if
 // the public key matches a value from --ignore-certificate-errors-spki-list.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)  // Chrome OS does not support the flag.
+#if !BUILDFLAG(IS_CHROMEOS)  // Chrome OS does not support the flag.
 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIHTTPS, TestHTTPS) {
   ASSERT_TRUE(https_server_mismatched_.Start());
 
@@ -3745,11 +3737,11 @@
   ui_test_utils::GetCurrentTabTitle(browser(), &title);
   EXPECT_EQ(title, u"This script has loaded");
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Test subresources from an origin with a bad certificate are loaded if the
 // public key matches a value from --ignore-certificate-errors-spki-list.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)  // Chrome OS does not support the flag.
+#if !BUILDFLAG(IS_CHROMEOS)  // Chrome OS does not support the flag.
 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIHTTPS,
                        TestInsecureSubresource) {
   ASSERT_TRUE(https_server_.Start());
@@ -3769,7 +3761,7 @@
   // The actual image (Google logo) is 276 pixels wide.
   EXPECT_GT(content::EvalJs(tab, "ImageWidth();"), 200);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Verifies that the interstitial can proceed, even if JavaScript is disabled.
 IN_PROC_BROWSER_TEST_F(SSLUITest, TestInterstitialJavaScriptProceeds) {
@@ -5572,7 +5564,7 @@
   ssl_test_util::CheckAuthenticatedState(tab, AuthState::NONE);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 
 class SSLUITestNoCert : public SSLUITest,
                         public CertificateManagerModel::Observer {
@@ -5851,7 +5843,7 @@
   ssl_test_util::CheckAuthenticatedState(tab_for_profile_2, AuthState::NONE);
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Regression test for http://crbug.com/635833 (crash when a window with no
 // NavigationEntry commits).
diff --git a/chrome/browser/ssl/ssl_config_service_manager.cc b/chrome/browser/ssl/ssl_config_service_manager.cc
index 6a7d4162..08793f9 100644
--- a/chrome/browser/ssl/ssl_config_service_manager.cc
+++ b/chrome/browser/ssl/ssl_config_service_manager.cc
@@ -16,7 +16,6 @@
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/ssl/ssl_error_controller_client.cc b/chrome/browser/ssl/ssl_error_controller_client.cc
index 0f7d3be..8239c2a 100644
--- a/chrome/browser/ssl/ssl_error_controller_client.cc
+++ b/chrome/browser/ssl/ssl_error_controller_client.cc
@@ -15,7 +15,6 @@
 #include "base/process/launch.h"
 #include "base/task/thread_pool.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/interstitials/enterprise_util.h"
 #include "chrome/browser/profiles/profile.h"
@@ -30,7 +29,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "ash/webui/settings/public/constants/routes.mojom.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -128,7 +127,7 @@
 void SSLErrorControllerClient::LaunchDateAndTimeSettings() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
       ProfileManager::GetActiveUserProfile(),
       chromeos::settings::mojom::kSystemPreferencesSectionPath);
diff --git a/chrome/browser/storage_access_api/api_browsertest.cc b/chrome/browser/storage_access_api/api_browsertest.cc
index 04d9f06..f45aaa6 100644
--- a/chrome/browser/storage_access_api/api_browsertest.cc
+++ b/chrome/browser/storage_access_api/api_browsertest.cc
@@ -323,6 +323,7 @@
           observed_request_headers_.emplace_back(request.relative_url,
                                                  request.headers);
         }));
+    net::test_server::InstallDefaultWebSocketHandlers(&https_server_);
     ASSERT_TRUE(https_server_.Start());
 
     // All the sites used during these tests should have a cookie.
@@ -573,12 +574,11 @@
         browser_ptr->tab_strip_model()->GetActiveWebContents(), ""));
   }
 
-  void OpenConnectToPage(content::RenderFrameHost* frame,
-                         const net::EmbeddedTestServer& wss_server) {
-    std::string query =
-        base::StrCat({"url=", net::test_server::GetWebSocketURL(
-                                  wss_server, kHostB, "/echo-request-headers")
-                                  .spec()});
+  void OpenConnectToPage(content::RenderFrameHost* frame) {
+    std::string query = base::StrCat(
+        {"url=", net::test_server::GetWebSocketURL(https_server_, kHostB,
+                                                   "/echo-request-headers")
+                     .spec()});
     GURL::Replacements replacements;
     replacements.SetQueryStr(query);
 
@@ -1808,12 +1808,6 @@
 
 IN_PROC_BROWSER_TEST_F(StorageAccessAPIBrowserTest,
                        WebsocketRequestsUseStorageAccessGrants) {
-  net::EmbeddedTestServer wss_server(net::EmbeddedTestServer::TYPE_HTTPS);
-  wss_server.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
-  net::test_server::InstallDefaultWebSocketHandlers(&wss_server);
-
-  ASSERT_TRUE(wss_server.Start());
-
   SetBlockThirdPartyCookies(true);
   prompt_factory()->set_response_type(
       permissions::PermissionRequestManager::ACCEPT_ALL);
@@ -1824,7 +1818,7 @@
   // Before the document opts into Storage Access, the WebSocket should not send
   // unpartitioned cookies during the connection.
   {
-    OpenConnectToPage(GetFrame(), wss_server);
+    OpenConnectToPage(GetFrame());
 
     std::string message;
     EXPECT_TRUE(message_queue.WaitForMessage(&message));
@@ -1840,7 +1834,7 @@
   // After the document opts into Storage Access, the WebSocket *should* send
   // unpartitioned cookies during the connection.
   {
-    OpenConnectToPage(GetFrame(), wss_server);
+    OpenConnectToPage(GetFrame());
     ASSERT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame()));
 
     std::string message;
@@ -2991,119 +2985,6 @@
   EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame()));
 }
 
-class StorageAccessAPIAutograntsWithFedCMOriginTrialBrowserTest
-    : public StorageAccessAPIAutograntsWithFedCMBrowserTest {
- public:
-  std::vector<base::test::FeatureRefAndParams> GetEnabledFeatures() override {
-    // We intentionally do not enable the kFedCmWithStorageAccessAPI feature,
-    // since overriding its state means we'd ignore the origin trial token.
-    return {};
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    // See
-    // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/origin_trials_integration.md#manual-testing.
-    command_line->AppendSwitchASCII(
-        "origin-trial-public-key",
-        "dRCs+TocuKkocNKa0AtZ4awrt9XKH2SQCI6o4FY6BNA=");
-  }
-
- protected:
-  bool OnRequest(content::URLLoaderInterceptor::RequestParams* params) {
-    if (params->url_request.url.path() != kPageWithOriginTrialHeader) {
-      return false;
-    }
-
-    CHECK_EQ(params->url_request.url.host_piece(), kHostB);
-    // Origin Trials key generated with:
-    //
-    // tools/origin_trials/generate_token.py --expire-timestamp 2000000000
-    // https://b.test FedCmWithStorageAccessAPI
-    content::URLLoaderInterceptor::WriteResponse(
-        "HTTP/1.1 200 OK\n"
-        "Content-type: text/html\n\n",
-
-        /*body=*/
-        "<meta http-equiv='origin-trial' "
-        "content='A4qD0M27fNpFkAe8cZ74fkY2Vfo6a+h9ZUbyG1E/nTooswOEp0LE/"
-        "uhVUCx6nH68NoK7GoYsmgw+"
-        "yigPZmay2ggAAABeeyJvcmlnaW4iOiAiaHR0cHM6Ly9iLnRlc3Q6NDQzIiwgImZlYXR1"
-        "cmUiOiAiRmVkQ21XaXRoU3RvcmFnZUFjY2Vzc0FQSSIsICJleHBpcnkiOiAyMDAwMDAw"
-        "MDAwfQ=='>",
-        params->client.get());
-    return true;
-  }
-
-  GURL OriginTrialPage() const {
-    return GURL(base::StrCat({"https://", kHostB, kPageWithOriginTrialHeader}));
-  }
-
- private:
-  static constexpr char kPageWithOriginTrialHeader[] = "/page_with_token.html";
-};
-
-IN_PROC_BROWSER_TEST_F(
-    StorageAccessAPIAutograntsWithFedCMOriginTrialBrowserTest,
-    FedCMGrantsAllowCookieAccessViaSAA) {
-  SetBlockThirdPartyCookies(true);
-  GrantFedCMPermission();
-
-  content::URLLoaderInterceptor interceptor(base::BindLambdaForTesting(
-      [this](content::URLLoaderInterceptor::RequestParams* params) {
-        return OnRequest(params);
-      }));
-
-  NavigateToPageWithPermissionsPolicyIframes({kHostA, kHostB});
-  NavigateFrameTo(OriginTrialPage(), browser(),
-                  /*iframe_id=*/"child-0");
-  EXPECT_EQ(ReadCookies(GetFrame(), kHostB), kNoCookies);
-  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
-
-  EXPECT_TRUE(storage::test::RequestAndCheckStorageAccessForFrame(GetFrame()));
-  EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame()));
-  EXPECT_EQ(prompt_factory()->TotalRequestCount(), 0);
-  EXPECT_EQ(ReadCookies(GetFrame(), kHostB), CookieBundle("cross-site=b.test"));
-
-  NavigateToPageWithPermissionsPolicyIframes({kHostA, kHostB});
-  NavigateFrameTo(OriginTrialPage(), browser(),
-                  /*iframe_id=*/"child-0");
-  EXPECT_EQ(ReadCookies(GetFrame(), kHostB), kNoCookies);
-  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
-}
-
-class StorageAccessAPIAutograntsWithFedCMOriginTrialKillswitchBrowserTest
-    : public StorageAccessAPIAutograntsWithFedCMOriginTrialBrowserTest {
- public:
-  std::vector<base::test::FeatureRef> GetDisabledFeatures() override {
-    return {blink::features::kFedCmWithStorageAccessAPI};
-  }
-};
-
-IN_PROC_BROWSER_TEST_F(
-    StorageAccessAPIAutograntsWithFedCMOriginTrialKillswitchBrowserTest,
-    KillswitchTakesPrecedenceOverOriginTrialToken) {
-  SetBlockThirdPartyCookies(true);
-  GrantFedCMPermission();
-  prompt_factory()->set_response_type(
-      permissions::PermissionRequestManager::AutoResponseType::DENY_ALL);
-
-  content::URLLoaderInterceptor interceptor(base::BindLambdaForTesting(
-      [this](content::URLLoaderInterceptor::RequestParams* params) {
-        return OnRequest(params);
-      }));
-
-  NavigateToPageWithPermissionsPolicyIframes({kHostA, kHostB});
-  NavigateFrameTo(OriginTrialPage(), browser(),
-                  /*iframe_id=*/"child-0");
-  EXPECT_EQ(ReadCookies(GetFrame(), kHostB), kNoCookies);
-  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
-
-  EXPECT_FALSE(content::ExecJs(GetFrame(), "document.requestStorageAccess()"));
-  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
-  EXPECT_EQ(prompt_factory()->TotalRequestCount(), 1);
-  EXPECT_EQ(ReadCookies(GetFrame(), kHostB), kNoCookies);
-}
-
 class StorageAccessHeadersDisabledBrowserTest
     : public StorageAccessAPIBrowserTest {
  public:
diff --git a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java
index 2cd4a071..f7b7082 100644
--- a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java
+++ b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java
@@ -4,19 +4,20 @@
 
 package org.chromium.chrome.browser.sync;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.sync.SyncService;
 
 /** Provides profile specific SyncService instances. */
+@NullMarked
 public class SyncServiceFactory {
-    @Nullable private static SyncService sSyncServiceForTest;
+    private static @Nullable SyncService sSyncServiceForTest;
 
     private SyncServiceFactory() {}
 
diff --git a/chrome/browser/sync/test/integration/single_client_history_sync_test.cc b/chrome/browser/sync/test/integration/single_client_history_sync_test.cc
index 989a461..93b636b6 100644
--- a/chrome/browser/sync/test/integration/single_client_history_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_history_sync_test.cc
@@ -35,6 +35,7 @@
 #include "url/gurl.h"
 
 #if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #endif
@@ -60,8 +61,15 @@
 
 namespace {
 
-const char kRedirectFromPath[] = "/redirect.html";
-const char kRedirectToPath[] = "/sync/simple.html";
+constexpr char kRedirectFromPath[] = "/redirect.html";
+constexpr char kRedirectToPath[] = "/sync/simple.html";
+
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
+constexpr char kMetricNameWithHistorySync[] =
+    "Session.TotalDurationMax1Day.WithHistorySync";
+constexpr char kMetricNameWithHistorySyncWithoutAuthError[] =
+    "Session.TotalDurationMax1Day.WithHistorySyncWithoutAuthError";
+#endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
 
 GURL GetFileUrl(const char* file) {
   base::ScopedAllowBlockingForTesting allow_blocking;
@@ -294,7 +302,7 @@
 }
 
 // TODO(crbug.com/40871747): EnterSyncPausedStateForPrimaryAccount is currently
-// not supported on Android. Enable this test once it is.
+// not supported on Android. Enable these tests once it is.
 #if !BUILDFLAG(IS_ANDROID)
 IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest, DoesNotUploadWhilePaused) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
@@ -338,6 +346,64 @@
       UnorderedElementsAre(UrlIs(synced_url1.spec()), UrlIs(synced_url2.spec()),
                            UrlIs(synced_url3.spec()))));
 }
+
+// Session total duration is not instrumented on ChromeOS.
+#if !BUILDFLAG(IS_CHROMEOS)
+IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest,
+                       PRE_ReportsSessionTotalDurationWhilePaused) {
+  {
+    ASSERT_TRUE(SetupSync());
+
+    base::HistogramTester histograms;
+    metrics::DesktopSessionDurationTracker::Get()->EndSessionForTesting();
+
+    histograms.ExpectTotalCount(kMetricNameWithHistorySync, 1);
+    histograms.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 1);
+  }
+
+  GetClient(0)->EnterSyncPausedStateForPrimaryAccount();
+  ASSERT_EQ(GetSyncService(0)->GetTransportState(),
+            syncer::SyncService::TransportState::PAUSED);
+  ASSERT_TRUE(GetSyncService(0)->HasCachedPersistentAuthErrorForMetrics());
+
+  base::HistogramTester histograms;
+  metrics::DesktopSessionDurationTracker::Get()->EndSessionForTesting();
+
+  histograms.ExpectTotalCount(kMetricNameWithHistorySync, 1);
+  histograms.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+}
+
+IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest,
+                       ReportsSessionTotalDurationWhilePaused) {
+  // Invoke the base class directly as this test doesn't need a tab, and it
+  // allows verifying that the very initial transport state is *not* PAUSED.
+  ASSERT_TRUE(SyncTest::SetupClients());
+
+  ASSERT_NE(GetSyncService(0)->GetTransportState(),
+            syncer::SyncService::TransportState::PAUSED);
+  ASSERT_TRUE(GetSyncService(0)->HasCachedPersistentAuthErrorForMetrics());
+
+  {
+    base::HistogramTester histograms;
+    metrics::DesktopSessionDurationTracker::Get()->EndSessionForTesting();
+
+    histograms.ExpectTotalCount(kMetricNameWithHistorySync, 1);
+    histograms.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+  }
+
+  GetClient(0)->ExitSyncPausedStateForPrimaryAccount();
+  ASSERT_EQ(GetSyncService(0)->GetTransportState(),
+            syncer::SyncService::TransportState::ACTIVE);
+
+  {
+    base::HistogramTester histograms;
+    metrics::DesktopSessionDurationTracker::Get()->EndSessionForTesting();
+
+    histograms.ExpectTotalCount(kMetricNameWithHistorySync, 1);
+    histograms.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 1);
+  }
+}
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest, UploadsAllFields) {
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncFeatures.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncFeatures.java
index 431e39108..f9eee9b 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncFeatures.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncFeatures.java
@@ -8,10 +8,12 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.profiles.Profile;
 
 /** Utility class for defining features and params related to tab group sync. */
 @JNINamespace("tab_groups")
+@NullMarked
 public final class TabGroupSyncFeatures {
     /** Whether tab group sync is enabled. */
     public static boolean isTabGroupSyncEnabled(Profile profile) {
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java
index 11728b1..57e3a47f 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java
@@ -651,8 +651,13 @@
 
         String umaPreExistingActivityDestroyed =
                 "Android.MultiWindowMode.AssertIndicesMatch.PreExistingActivityDestroyed";
+        String umaTimeToPreExistingActivityDestruction =
+                "Android.MultiWindowMode.MismatchedIndices.TimeToPreExistingActivityDestruction";
         try (var ignored =
-                HistogramWatcher.newSingleRecordWatcher(umaPreExistingActivityDestroyed)) {
+                HistogramWatcher.newBuilder()
+                        .expectAnyRecord(umaPreExistingActivityDestroyed)
+                        .expectAnyRecord(umaTimeToPreExistingActivityDestruction)
+                        .build()) {
             destroyActivity(activityController0);
         }
     }
diff --git a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java b/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
index 0c28de1..129f340 100644
--- a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
+++ b/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
@@ -21,6 +21,7 @@
 import org.chromium.base.ApplicationStatus.ActivityStateListener;
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
+import org.chromium.base.TimeUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.OneshotSupplier;
 import org.chromium.build.BuildConfig;
@@ -322,6 +323,7 @@
 
     private ActivityStateListener getActivityStateListenerForPreAssignedActivity(
             @PreAssignedActivityState int state) {
+        long mismatchReportTime = TimeUtils.elapsedRealtimeMillis();
         return (activityAtIndex, newState) -> {
             final int localTaskId = ApplicationStatus.getTaskId(activityAtIndex);
             Log.i(
@@ -336,6 +338,10 @@
                             + state);
 
             if (newState == ActivityState.DESTROYED) {
+                long timeToDestruction = TimeUtils.elapsedRealtimeMillis() - mismatchReportTime;
+                RecordHistogram.recordTimesHistogram(
+                        "Android.MultiWindowMode.MismatchedIndices.TimeToPreExistingActivityDestruction",
+                        timeToDestruction);
                 RecordHistogram.recordEnumeratedHistogram(
                         "Android.MultiWindowMode.AssertIndicesMatch.PreExistingActivityDestroyed",
                         state,
diff --git a/chrome/browser/task_manager/internal/android/BUILD.gn b/chrome/browser/task_manager/internal/android/BUILD.gn
index d0cf387..5b132c3 100644
--- a/chrome/browser/task_manager/internal/android/BUILD.gn
+++ b/chrome/browser/task_manager/internal/android/BUILD.gn
@@ -29,6 +29,7 @@
     ":java_resources",
     "//base:callback_java",
     "//base:log_java",
+    "//chrome/android:chrome_java",
     "//chrome/browser/task_manager/android:java",
     "//components/browser_ui/styles/android:java",
     "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chrome/browser/task_manager/internal/android/DEPS b/chrome/browser/task_manager/internal/android/DEPS
new file mode 100644
index 0000000..90687a27
--- /dev/null
+++ b/chrome/browser/task_manager/internal/android/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chrome/android",
+]
diff --git a/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/ui/TaskManagerActivity.java b/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/ui/TaskManagerActivity.java
index 0f429bc4..b9c31737 100644
--- a/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/ui/TaskManagerActivity.java
+++ b/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/ui/TaskManagerActivity.java
@@ -7,8 +7,7 @@
 import android.os.Bundle;
 import android.view.View;
 
-import androidx.appcompat.app.AppCompatActivity;
-
+import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -16,7 +15,7 @@
  * Entrypoint of the task manager UI. This activity instantiates the underlying model, the mediator
  * that keeps updating the model, and binds the model and the view.
  */
-public class TaskManagerActivity extends AppCompatActivity {
+public class TaskManagerActivity extends ChromeBaseAppCompatActivity {
     private static final int REFRESH_TIME_MS = 1000;
     private final PropertyModel mHeaderModel =
             new PropertyModel(TaskManagerProperties.HEADER_PROPERTY_KEYS);
diff --git a/chrome/browser/themes/BUILD.gn b/chrome/browser/themes/BUILD.gn
index f4f2956..9de4948 100644
--- a/chrome/browser/themes/BUILD.gn
+++ b/chrome/browser/themes/BUILD.gn
@@ -31,7 +31,6 @@
     "theme_syncable_service.cc",
   ]
   deps = [
-    "//build:chromeos_buildflags",
     "//chrome/app/theme:theme_resources",
     "//chrome/browser/new_tab_page/chrome_colors",
     "//chrome/browser/search/background:constants",
diff --git a/chrome/browser/themes/theme_helper.cc b/chrome/browser/themes/theme_helper.cc
index e6bb759..5605547 100644
--- a/chrome/browser/themes/theme_helper.cc
+++ b/chrome/browser/themes/theme_helper.cc
@@ -5,7 +5,6 @@
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/themes/browser_theme_pack.h"
 #include "chrome/browser/themes/custom_theme_supplier.h"
 #include "chrome/browser/themes/theme_properties.h"
diff --git a/chrome/browser/themes/theme_service_factory.cc b/chrome/browser/themes/theme_service_factory.cc
index 94f546b..1809d9f 100644
--- a/chrome/browser/themes/theme_service_factory.cc
+++ b/chrome/browser/themes/theme_service_factory.cc
@@ -8,7 +8,6 @@
 #include "base/no_destructor.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/chrome_extension_system_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/themes/theme_service.h"
@@ -25,13 +24,8 @@
 #include "chrome/browser/themes/theme_helper_win.h"
 #endif
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chrome/browser/themes/theme_service_aura_linux.h"
-#endif
-
 #if BUILDFLAG(IS_LINUX)
+#include "chrome/browser/themes/theme_service_aura_linux.h"
 #include "ui/linux/linux_ui_factory.h"
 #endif
 
@@ -121,15 +115,9 @@
 
 void ThemeServiceFactory::RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
-  ui::SystemTheme default_system_theme = ui::SystemTheme::kDefault;
 #if BUILDFLAG(IS_LINUX)
-  default_system_theme = ui::GetDefaultSystemTheme();
-#endif
   registry->RegisterIntegerPref(prefs::kSystemTheme,
-                                static_cast<int>(default_system_theme));
+                                static_cast<int>(ui::GetDefaultSystemTheme()));
 #endif
   registry->RegisterFilePathPref(prefs::kCurrentThemePackFilename,
                                  base::FilePath());
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc
index 4183ee31..e5d7743 100644
--- a/chrome/browser/themes/theme_service_unittest.cc
+++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -22,7 +22,6 @@
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
@@ -689,8 +688,8 @@
   for (const ui::ColorId* ids : contrasting_ids) {
     check_sufficient_contrast(ids[0], ids[1]);
   }
-#if !BUILDFLAG(USE_GTK) && !BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(crbug.com/40847971): GTK and LaCrOS do not have a sufficiently
+#if !BUILDFLAG(USE_GTK)
+  // TODO(crbug.com/40847971): GTK does not have a sufficiently
   // high-contrast selected row color to pass this test.
   if (std::get<ContrastMode>(GetParam()) == ContrastMode::kHighContrast) {
     check_sufficient_contrast(kColorOmniboxResultsBackgroundSelected,
diff --git a/chrome/browser/themes/theme_syncable_service_unittest.cc b/chrome/browser/themes/theme_syncable_service_unittest.cc
index f5ef2897..cf7daaa 100644
--- a/chrome/browser/themes/theme_syncable_service_unittest.cc
+++ b/chrome/browser/themes/theme_syncable_service_unittest.cc
@@ -25,7 +25,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
 #include "chrome/browser/extensions/pending_extension_manager.h"
@@ -64,7 +63,7 @@
 #include "extensions/common/permissions/permission_set.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/ash/login/users/user_manager_delegate_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/browser_process.h"
@@ -304,7 +303,7 @@
   // Needed for setting up extension service.
   content::BrowserTaskEnvironment task_environment_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
   user_manager::ScopedUserManager user_manager_{
       std::make_unique<user_manager::UserManagerImpl>(
diff --git a/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc b/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc
index 2481f6c..8881b71 100644
--- a/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc
+++ b/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc
@@ -23,11 +23,11 @@
 #include "chrome/browser/metrics/antivirus_metrics_provider_win.h"
 #endif  // BUILDFLAG(IS_WIN)
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/barrier_closure.h"
 #include "chrome/browser/metrics/chromeos_metrics_provider.h"
 #include "chrome/browser/metrics/chromeos_system_profile_provider.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace tracing {
 
@@ -50,7 +50,7 @@
   system_profile_providers_.emplace_back(
       std::make_unique<AntiVirusMetricsProvider>());
   av_metrics_provider_ = system_profile_providers_.back().get();
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
   // Collect system profile such as hardware class for ChromeOS. Note that
   // ChromeOSMetricsProvider is initialized asynchronously. It might not be
   // initialized when reporting metrics, in which case it'll just not add any
@@ -59,7 +59,7 @@
       std::make_unique<ChromeOSMetricsProvider>(
           metrics::MetricsLogUploader::UMA, cros_system_profile_provider_));
   chromeos_metrics_provider_ = system_profile_providers_.back().get();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   system_profile_providers_.emplace_back(
       std::make_unique<AccessibilityStateProvider>());
diff --git a/chrome/browser/tracing/chrome_background_tracing_metrics_provider_unittest.cc b/chrome/browser/tracing/chrome_background_tracing_metrics_provider_unittest.cc
index b6d6532..9a347599 100644
--- a/chrome/browser/tracing/chrome_background_tracing_metrics_provider_unittest.cc
+++ b/chrome/browser/tracing/chrome_background_tracing_metrics_provider_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/functional/bind.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
+#include "build/build_config.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "content/public/browser/background_tracing_manager.h"
@@ -21,7 +22,7 @@
 #include "third_party/metrics_proto/trace_log.pb.h"
 #include "third_party/zlib/google/compression_utils.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // "nogncheck" because of crbug.com/1125897.
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
 #include "chrome/browser/metrics/chromeos_system_profile_provider.h"
@@ -29,7 +30,7 @@
 #include "chromeos/ash/components/system/fake_statistics_provider.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/tpm_manager/tpm_manager_client.h"  // nogncheck
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace tracing {
 namespace {
@@ -131,7 +132,7 @@
   EXPECT_FALSE(provider.HasIndependentMetrics());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 class ChromeBackgroundTracingMetricsProviderChromeOSTest
     : public ChromeBackgroundTracingMetricsProviderTest {
  public:
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.cc b/chrome/browser/tracing/chrome_tracing_delegate.cc
index 10cacf8f..a589b41 100644
--- a/chrome/browser/tracing/chrome_tracing_delegate.cc
+++ b/chrome/browser/tracing/chrome_tracing_delegate.cc
@@ -19,7 +19,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_otr_state.h"
@@ -42,15 +41,11 @@
 #include "chrome/browser/ui/browser_list.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_pref_names.h"
 #include "chromeos/dbus/constants/dbus_switches.h"  // nogncheck
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/crosapi_pref_observer.h"
-#endif
-
 #if BUILDFLAG(IS_WIN)
 #include "base/task/thread_pool.h"
 #include "chrome/installer/util/system_tracing_util.h"
@@ -69,39 +64,6 @@
   return false;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Helper for reading the value of device policy from ash-chrome.
-class DevicePolicyObserver {
- public:
-  DevicePolicyObserver()
-      : pref_observer_(
-            crosapi::mojom::PrefPath::kDeviceSystemWideTracingEnabled,
-            base::BindRepeating(&DevicePolicyObserver::OnPrefChanged,
-                                base::Unretained(this))) {}
-
-  bool system_wide_tracing_enabled() const {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-    return system_wide_tracing_enabled_;
-  }
-
-  static const DevicePolicyObserver& GetInstance() {
-    static base::NoDestructor<DevicePolicyObserver> instance;
-    return *instance;
-  }
-
- private:
-  void OnPrefChanged(base::Value value) {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-    system_wide_tracing_enabled_ = value.GetBool();
-  }
-
-  ~DevicePolicyObserver() = default;
-
-  CrosapiPrefObserver pref_observer_;
-  bool system_wide_tracing_enabled_ = false;
-};
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
 }  // namespace
 
 ChromeTracingDelegate::ChromeTracingDelegate()
@@ -117,11 +79,6 @@
 #else
   TabModelList::AddObserver(this);
 #endif
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // This sets up the pref observer.
-  DevicePolicyObserver::GetInstance();
-#endif
 }
 
 ChromeTracingDelegate::~ChromeTracingDelegate() {
@@ -212,7 +169,7 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 bool ChromeTracingDelegate::IsSystemWideTracingEnabled() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Always allow system tracing in dev mode images.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           chromeos::switches::kSystemDevMode)) {
@@ -222,13 +179,6 @@
   PrefService* local_state = g_browser_process->local_state();
   DCHECK(local_state);
   return local_state->GetBoolean(ash::prefs::kDeviceSystemWideTracingEnabled);
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  // This is a temporary solution that observes the ash pref
-  // ash::prefs::kDeviceSystemWideTracingEnabled via mojo IPC provided by
-  // CrosapiPrefObserver.
-  // crbug.com/1201582 is a long term solution for this which assumes that
-  // device flags will be available to Lacros.
-  return DevicePolicyObserver::GetInstance().system_wide_tracing_enabled();
 #else
   return false;
 #endif
diff --git a/chrome/browser/trusted_vault/trusted_vault_encryption_keys_tab_helper_browsertest.cc b/chrome/browser/trusted_vault/trusted_vault_encryption_keys_tab_helper_browsertest.cc
index edd7d5b..452eb70 100644
--- a/chrome/browser/trusted_vault/trusted_vault_encryption_keys_tab_helper_browsertest.cc
+++ b/chrome/browser/trusted_vault/trusted_vault_encryption_keys_tab_helper_browsertest.cc
@@ -12,7 +12,6 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/trusted_vault/trusted_vault_service_factory.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/chrome_test_utils.h"
@@ -49,11 +48,6 @@
 #include "components/trusted_vault/standalone_trusted_vault_client.h"
 #endif  // BUILDFLAG(IS_ANDROID)
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/crosapi/mojom/trusted_vault.mojom.h"
-#include "chromeos/lacros/lacros_service.h"
-#endif
-
 namespace {
 
 using testing::ElementsAre;
diff --git a/chrome/browser/ui/android/favicon/DEPS b/chrome/browser/ui/android/favicon/DEPS
index 207fdcf4..f38681a 100644
--- a/chrome/browser/ui/android/favicon/DEPS
+++ b/chrome/browser/ui/android/favicon/DEPS
@@ -2,6 +2,7 @@
 include_rules = [
   "+base/android",
   "+base/test/android",
+  "+build/android",
   "+chrome/browser/profiles/android",
   "+chrome/browser/util",
   "+chrome/test/android",
diff --git a/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java b/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java
index 99189bf..fa6346a1 100644
--- a/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java
+++ b/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java
@@ -12,7 +12,6 @@
 import android.graphics.drawable.Drawable;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.content.res.AppCompatResources;
 
@@ -20,6 +19,8 @@
 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.profiles.Profile;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.url.GURL;
@@ -34,6 +35,7 @@
  * thread due to the C++ base::CancelableTaskTracker class
  * requirement.
  */
+@NullMarked
 public class FaviconHelper {
     private long mNativeFaviconHelper;
 
@@ -62,10 +64,10 @@
 
     /** Helper for generating default favicons and sharing the same icon between multiple views. */
     public static class DefaultFaviconHelper {
-        private Bitmap mChromeDarkBitmap;
-        private Bitmap mChromeLightBitmap;
-        private Bitmap mDefaultDarkBitmap;
-        private Bitmap mDefaultLightBitmap;
+        private @Nullable Bitmap mChromeDarkBitmap;
+        private @Nullable Bitmap mChromeLightBitmap;
+        private @Nullable Bitmap mDefaultDarkBitmap;
+        private @Nullable Bitmap mDefaultLightBitmap;
 
         private int getResourceId(GURL url) {
             return UrlUtilities.isInternalScheme(url)
@@ -224,7 +226,7 @@
      */
     public boolean getComposedFaviconImage(
             Profile profile,
-            @NonNull List<GURL> urls,
+            List<GURL> urls,
             int desiredSizeInPixel,
             ComposedFaviconImageCallback composedFaviconImageCallback) {
         assert mNativeFaviconHelper != 0;
diff --git a/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java b/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java
index f74c406..70a42ee 100644
--- a/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java
+++ b/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java
@@ -13,15 +13,18 @@
 import android.graphics.drawable.Drawable;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.graphics.drawable.RoundedBitmapDrawable;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.NullUnmarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
 import org.chromium.ui.base.ViewUtils;
 import org.chromium.url.GURL;
 
 /** Utilities to deal with favicons. */
+@NullMarked
 public class FaviconUtils {
     /**
      * Creates a {@link RoundedIconGenerator} to generate circular {@link Bitmap}s of favicons.
@@ -157,6 +160,7 @@
      * @param iconSize Width and height of the returned icon.
      * @return A {@link Drawable} to be displayed as the favicon.
      */
+    @NullUnmarked
     public static Drawable getIconDrawableWithFilter(
             @Nullable Bitmap icon,
             @Nullable GURL url,
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfContentProvider.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfContentProvider.java
index 99c134d..29f7bc5 100644
--- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfContentProvider.java
+++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfContentProvider.java
@@ -93,7 +93,7 @@
      *
      * @param uri Uri to be removed.
      */
-    public static void removeContentUri(String uri) {
+    public static void removeContentUri(@Nullable String uri) {
         if (uri == null) {
             return;
         }
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java
index 03fa923..c3225ec 100644
--- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java
+++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java
@@ -12,7 +12,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
@@ -24,6 +23,8 @@
 import org.json.JSONObject;
 
 import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.gsa.GSAUtils;
 import org.chromium.chrome.browser.pdf.PdfUtils.PdfLoadResult;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -37,6 +38,7 @@
  * support is enabled via PdfUtils#shouldOpenPdfInline.
  */
 @SuppressLint("NewApi")
+@NullMarked
 public class PdfCoordinator {
     private static final String TAG = "PdfCoordinator";
     private static boolean sSkipLoadPdfForTesting;
@@ -49,7 +51,7 @@
     private final int mFragmentContainerViewId;
 
     /** The filepath of the pdf. It is null before download complete. */
-    private String mPdfFilePath;
+    private @Nullable String mPdfFilePath;
 
     /**
      * Whether the pdf has been loaded, despite of success or failure. This is used to ensure we
@@ -58,7 +60,7 @@
     private boolean mIsPdfLoaded;
 
     /** Uri of the pdf document. Generated when the pdf is ready to load. */
-    private Uri mUri;
+    private @Nullable Uri mUri;
 
     @VisibleForTesting ChromePdfViewerFragment mChromePdfViewerFragment;
 
@@ -72,7 +74,8 @@
      * @param filepath The pdf filepath.
      * @param tabId The id of the tab.
      */
-    public PdfCoordinator(Profile profile, Activity activity, String filepath, int tabId) {
+    public PdfCoordinator(
+            Profile profile, Activity activity, @Nullable String filepath, int tabId) {
         mActivity = activity;
         mTabId = String.valueOf(tabId);
         mView = LayoutInflater.from(activity).inflate(R.layout.pdf_page, null);
@@ -133,7 +136,7 @@
         }
 
         @Override
-        public void onLoadDocumentError(@NonNull Throwable throwable) {
+        public void onLoadDocumentError(Throwable throwable) {
             PdfUtils.recordPdfLoadResult(false);
             if (mDocumentLoadStartTimestamp <= 0) {
                 return;
@@ -169,6 +172,7 @@
     /**
      * Called after a pdf page has been removed from the view hierarchy and will no longer be used.
      */
+    @SuppressWarnings({"NullAway"})
     void destroy() {
         if (mChromePdfViewerFragment == null) {
             Log.w(TAG, "Fragment is null when pdf page is destroyed.");
@@ -199,11 +203,11 @@
     }
 
     /** Returns the filepath of the pdf document. */
-    String getFilepath() {
+    @Nullable String getFilepath() {
         return mPdfFilePath;
     }
 
-    private void loadPdfFile(String pdfFilePath) {
+    private void loadPdfFile(@Nullable String pdfFilePath) {
         mPdfFilePath = pdfFilePath;
         loadPdfFile();
     }
@@ -244,7 +248,7 @@
         }
     }
 
-    String requestAssistContent(String filename, boolean isWorkProfile) {
+    @Nullable String requestAssistContent(String filename, boolean isWorkProfile) {
         if (mUri == null) {
             return null;
         }
@@ -269,7 +273,7 @@
         return structuredData;
     }
 
-    Uri getUri() {
+    @Nullable Uri getUri() {
         return mUri;
     }
 
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfInfo.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfInfo.java
index 48e40c6..eecf132 100644
--- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfInfo.java
+++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfInfo.java
@@ -4,13 +4,17 @@
 
 package org.chromium.chrome.browser.pdf;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
 /** Simple object representing important information of a pdf native page. */
+@NullMarked
 public class PdfInfo {
-    public final String filename;
-    public final String filepath;
+    public final @Nullable String filename;
+    public final @Nullable String filepath;
     public final boolean isDownloadSafe;
 
-    public PdfInfo(String filename, String filepath, boolean isDownloadSafe) {
+    public PdfInfo(String filename, @Nullable String filepath, boolean isDownloadSafe) {
         this.filename = filename;
         this.filepath = filepath;
         this.isDownloadSafe = isDownloadSafe;
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java
index 5a7590f..951acf5 100644
--- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java
+++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java
@@ -7,15 +7,17 @@
 import android.app.Activity;
 import android.net.Uri;
 
-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.profiles.Profile;
 import org.chromium.chrome.browser.ui.native_page.BasicNativePage;
 import org.chromium.chrome.browser.ui.native_page.NativePageHost;
 import org.chromium.components.embedder_support.util.UrlConstants;
 
 /** Native page that displays pdf file. */
+@NullMarked
 public class PdfPage extends BasicNativePage {
     @VisibleForTesting final PdfCoordinator mPdfCoordinator;
     private String mTitle;
@@ -81,7 +83,7 @@
     }
 
     @Override
-    public String getCanonicalFilepath() {
+    public @Nullable String getCanonicalFilepath() {
         return mPdfCoordinator.getFilepath();
     }
 
@@ -146,7 +148,7 @@
      *
      * @param isWorkProfile Whether Chrome is running in the Android work profile.
      */
-    public String requestAssistContent(boolean isWorkProfile) {
+    public @Nullable String requestAssistContent(boolean isWorkProfile) {
         return mPdfCoordinator.requestAssistContent(getTitle(), isWorkProfile);
     }
 }
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
index ef2141f..06dc9a0 100644
--- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
+++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
@@ -10,14 +10,14 @@
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import org.jni_zero.CalledByNative;
 
 import org.chromium.base.ContentUriUtils;
 import org.chromium.base.Log;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.native_page.NativePage;
 import org.chromium.chrome.browser.util.ChromeFileProvider;
@@ -33,6 +33,7 @@
 import java.net.URLEncoder;
 
 /** Utilities for inline pdf support. */
+@NullMarked
 public class PdfUtils {
     @IntDef({
         PdfPageType.NONE,
@@ -109,7 +110,7 @@
                 || scheme.equals(UrlConstants.CONTENT_SCHEME);
     }
 
-    private static String getDecodedScheme(String url) {
+    private static @Nullable String getDecodedScheme(String url) {
         String decodedUrl = PdfUtils.decodePdfPageUrl(url);
         if (decodedUrl == null) {
             return null;
@@ -164,7 +165,7 @@
      * @param nativePage The NativePage being used to retrieve pdf information.
      * @return Pdf information including filename, filepath etc.
      */
-    public static PdfInfo getPdfInfo(NativePage nativePage) {
+    public static @Nullable PdfInfo getPdfInfo(NativePage nativePage) {
         if (nativePage == null || !nativePage.isPdf()) {
             return null;
         }
@@ -174,7 +175,7 @@
                 nativePage.isDownloadSafe());
     }
 
-    static String getFileNameFromUrl(String url, String defaultTitle) {
+    static String getFileNameFromUrl(@Nullable String url, String defaultTitle) {
         if (url == null) {
             return defaultTitle;
         }
@@ -202,7 +203,7 @@
         return fileName;
     }
 
-    static String getFilePathFromUrl(String url) {
+    static @Nullable String getFilePathFromUrl(@Nullable String url) {
         if (url == null) {
             return null;
         }
@@ -247,7 +248,7 @@
         sShouldOpenPdfInlineForTesting = shouldOpenPdfInlineForTesting;
     }
 
-    static Uri getUriFromFilePath(@NonNull String pdfFilePath) {
+    static @Nullable Uri getUriFromFilePath(String pdfFilePath) {
         Uri uri = Uri.parse(pdfFilePath);
         String scheme = uri.getScheme();
         try {
@@ -289,7 +290,7 @@
      * @param downloadUrl The url which is interpreted as download.
      * @return The pdf page url including the encoded downloadUrl.
      */
-    public static String encodePdfPageUrl(String downloadUrl) {
+    public static @Nullable String encodePdfPageUrl(String downloadUrl) {
         try {
             String pdfPageUrl =
                     UrlConstants.PDF_URL
@@ -310,7 +311,7 @@
      * @param originalUrl The url to be decoded.
      * @return the decoded download url; or null if the original url is not a pdf page url.
      */
-    public static String decodePdfPageUrl(String originalUrl) {
+    public static @Nullable String decodePdfPageUrl(String originalUrl) {
         if (originalUrl == null || !originalUrl.startsWith(UrlConstants.PDF_URL)) {
             return null;
         }
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml
index 458ef2c..9bd905b 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml
@@ -7,6 +7,6 @@
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
-    <solid android:color="@color/default_bg_color_baseline" />
+    <solid android:color="@color/widget_bg" />
     <corners android:radius="@dimen/quick_action_search_widget_background_radius" />
 </shape>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_button_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_button_background.xml
index 03e6229..f60aaf5 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_button_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_button_background.xml
@@ -9,14 +9,14 @@
     android:color="?android:attr/colorControlHighlight">
     <item android:id="@android:id/mask">
         <shape android:shape="rectangle">
-            <corners android:radius="@dimen/quick_action_search_widget_medium_button_radius" />
             <solid android:color="@color/default_chip_ripple_color" />
+            <corners android:radius="@dimen/quick_action_search_widget_medium_button_radius" />
         </shape>
     </item>
     <item>
         <shape android:shape="rectangle">
+            <solid android:color="@color/widget_button_bg" />
             <corners android:radius="@dimen/quick_action_search_widget_medium_button_radius" />
-            <solid android:color="@color/default_bg_color_secondary" />
         </shape>
     </item>
 </ripple>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_search_bar_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_search_bar_background.xml
index 0123c25..bcb04174 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_search_bar_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_medium_search_bar_background.xml
@@ -9,16 +9,16 @@
     android:color="?android:attr/colorControlHighlight">
     <item android:id="@android:id/mask">
         <shape android:shape="rectangle">
-            <corners android:radius="@dimen/quick_action_search_widget_medium_search_bar_corner_radius" />
-            <size android:height="@dimen/quick_action_search_widget_medium_search_bar_height" />
             <solid android:color="@color/default_chip_ripple_color" />
+            <size android:height="@dimen/quick_action_search_widget_medium_search_bar_height" />
+            <corners android:radius="@dimen/quick_action_search_widget_medium_search_bar_corner_radius" />
         </shape>
     </item>
     <item>
         <shape android:shape="rectangle">
-            <corners android:radius="@dimen/quick_action_search_widget_medium_search_bar_corner_radius" />
+            <solid android:color="@color/widget_searchbox_bg" />
             <size android:height="@dimen/quick_action_search_widget_medium_search_bar_height" />
-            <solid android:color="@color/omnibox_bg_color" />
+            <corners android:radius="@dimen/quick_action_search_widget_medium_search_bar_corner_radius" />
         </shape>
     </item>
 </ripple>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_button_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_button_background.xml
index 35f8c34..54a6aa0 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_button_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_button_background.xml
@@ -15,7 +15,7 @@
     </item>
     <item>
         <shape android:shape="rectangle">
-            <solid android:color="@color/default_bg_color_secondary" />
+            <solid android:color="@color/widget_button_bg" />
             <corners android:radius="@dimen/quick_action_search_widget_small_button_radius" />
         </shape>
     </item>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_search_bar_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_search_bar_background.xml
index f6c1f6f..1d86187f 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_search_bar_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_small_search_bar_background.xml
@@ -16,7 +16,7 @@
     </item>
     <item>
         <shape android:shape="rectangle">
-            <solid android:color="@color/omnibox_bg_color" />
+            <solid android:color="@color/widget_searchbox_bg" />
             <size android:height="@dimen/quick_action_search_widget_small_search_bar_height" />
             <corners android:radius="@dimen/quick_action_search_widget_small_search_bar_corner_radius" />
         </shape>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_background.xml
index 41bdae8..0a8a489 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_background.xml
@@ -7,6 +7,6 @@
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
-    <solid android:color="@color/default_bg_color_baseline" />
+    <solid android:color="@color/widget_bg" />
     <corners android:radius="@dimen/quick_action_search_widget_xsmall_background_radius" />
 </shape>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_button_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_button_background.xml
index 3395ab6..b693ec0 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_button_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_button_background.xml
@@ -6,5 +6,5 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="?android:attr/colorControlHighlight">
+    android:color="@color/widget_button_bg">
 </ripple>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_search_bar_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_search_bar_background.xml
index c55dd08..c83ab8f 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_search_bar_background.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_xsmall_search_bar_background.xml
@@ -16,7 +16,7 @@
     </item>
     <item>
         <shape android:shape="rectangle">
-            <solid android:color="@color/omnibox_bg_color" />
+            <solid android:color="@color/widget_searchbox_bg" />
             <size android:height="@dimen/quick_action_search_widget_xsmall_search_bar_height" />
             <corners android:radius="@dimen/quick_action_search_widget_xsmall_search_bar_corner_radius" />
         </shape>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/values/styles.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/values/styles.xml
index cc6e3514..3daef74 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/values/styles.xml
+++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/values/styles.xml
@@ -11,7 +11,7 @@
         <item name="android:layout_height">@dimen/quick_action_search_widget_xsmall_button_height</item>
         <item name="android:background">@drawable/quick_action_search_widget_xsmall_button_background</item>
         <item name="android:padding">@dimen/quick_action_search_widget_xsmall_button_icon_padding</item>
-        <item name="android:tint">@color/default_icon_color_baseline</item>
+        <item name="android:tint">@macro/default_icon_color_secondary</item>
         <item name="android:scaleType">fitCenter</item>
     </style>
 
@@ -20,7 +20,7 @@
         <item name="android:layout_height">@dimen/quick_action_search_widget_small_button_height</item>
         <item name="android:background">@drawable/quick_action_search_widget_small_button_background</item>
         <item name="android:padding">@dimen/quick_action_search_widget_small_button_icon_padding</item>
-        <item name="android:tint">@color/default_icon_color_baseline</item>
+        <item name="android:tint">@macro/default_icon_color_secondary</item>
         <item name="android:scaleType">fitCenter</item>
     </style>
 
@@ -29,7 +29,7 @@
         <item name="android:layout_height">@dimen/quick_action_search_widget_medium_button_height</item>
         <item name="android:background">@drawable/quick_action_search_widget_medium_button_background</item>
         <item name="android:padding">@dimen/quick_action_search_widget_medium_button_icon_padding</item>
-        <item name="android:tint">@color/default_icon_color_baseline</item>
+        <item name="android:tint">@macro/default_icon_color_secondary</item>
         <item name="android:scaleType">fitCenter</item>
     </style>
 
diff --git a/chrome/browser/ui/aura/accessibility/automation_manager_aura.h b/chrome/browser/ui/aura/accessibility/automation_manager_aura.h
index 273167b6..392bfa0b 100644
--- a/chrome/browser/ui/aura/accessibility/automation_manager_aura.h
+++ b/chrome/browser/ui/aura/accessibility/automation_manager_aura.h
@@ -57,6 +57,8 @@
   FRIEND_TEST_ALL_PREFIXES(AutomationManagerAuraBrowserTest, WebAppearsOnce);
   FRIEND_TEST_ALL_PREFIXES(AutomationManagerAuraBrowserTest, EventFromAction);
   FRIEND_TEST_ALL_PREFIXES(AutomationManagerAuraBrowserTest,
+                           SerializeOnDataChanged);
+  FRIEND_TEST_ALL_PREFIXES(AutomationManagerAuraBrowserTest,
                            GetFocusOnChildTree);
   FRIEND_TEST_ALL_PREFIXES(AutomationManagerAuraBrowserTest,
                            TransientFocusChangesAreSuppressed);
diff --git a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
index 15330c4a..13a4f5c 100644
--- a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
+++ b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
@@ -20,6 +20,7 @@
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/scoped_accessibility_mode_override.h"
 #include "extensions/browser/api/automation_internal/automation_event_router_interface.h"
+#include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_mode.h"
 #include "ui/accessibility/ax_node_data.h"
@@ -118,6 +119,14 @@
     return std::move(matched_wait_for_event_);
   }
 
+  std::unique_ptr<ui::AXNodeData> WaitForDataChange(
+      ui::AXNodeID target_node_id) {
+    data_change_target_node_id_ = target_node_id;
+    run_loop_->Run();
+    run_loop_ = std::make_unique<base::RunLoop>();
+    return std::move(matched_wait_for_data_change_);
+  }
+
   bool WasNodeIdFocused(int node_id) {
     for (int focused_node_id : focused_node_ids_) {
       if (node_id == focused_node_id) {
@@ -150,6 +159,16 @@
           run_loop_->Quit();
         }
       }
+
+      if (data_change_target_node_id_ != ui::kInvalidAXNodeID) {
+        for (const auto& data : update.nodes) {
+          if (data.id == data_change_target_node_id_) {
+            matched_wait_for_data_change_ =
+                std::make_unique<ui::AXNodeData>(data);
+            run_loop_->Quit();
+          }
+        }
+      }
     }
 
     if (event_type_to_wait_for_ == ax::mojom::Event::kNone) {
@@ -189,6 +208,9 @@
   std::unique_ptr<ui::AXEvent> matched_wait_for_event_;
   ax::mojom::Event event_type_to_wait_for_ = ax::mojom::Event::kNone;
   ui::AXNodeID event_target_node_id_to_wait_for_ = ui::kInvalidAXNodeID;
+
+  std::unique_ptr<ui::AXNodeData> matched_wait_for_data_change_;
+  ui::AXNodeID data_change_target_node_id_ = ui::kInvalidAXNodeID;
 };
 
 ui::TableColumn TestTableColumn(int id, const std::string& title) {
@@ -414,6 +436,55 @@
   EXPECT_EQ(315, node_data.GetIntAttribute(ax::mojom::IntAttribute::kScrollY));
 }
 
+IN_PROC_BROWSER_TEST_F(AutomationManagerAuraBrowserTest,
+                       SerializeOnDataChanged) {
+  auto cache = std::make_unique<views::AXAuraObjCache>();
+  auto* cache_ptr = cache.get();
+  AutomationManagerAura* manager = AutomationManagerAura::GetInstance();
+  manager->set_ax_aura_obj_cache_for_testing(std::move(cache));
+  manager->send_window_state_on_enable_ = false;
+  manager->Enable();
+  AutomationEventWaiter waiter;
+  auto* tree = manager->GetTreeSource();
+
+  // Create a widget with size 200, 200.
+  views::Widget* widget = new views::Widget;
+  views::Widget::InitParams params(
+      views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET,
+      views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+  params.bounds = {0, 0, 200, 200};
+  widget->Init(std::move(params));
+
+  views::View* root_view = widget->GetRootView();
+  auto orig_label = std::make_unique<views::Label>();
+  root_view->SetLayoutManager(std::make_unique<views::FlexLayout>())
+      ->SetOrientation(views::LayoutOrientation::kVertical);
+  views::View* label_view = root_view->AddChildView(std::move(orig_label));
+  widget->Show();
+  widget->Activate();
+  root_view->GetLayoutManager()->Layout(root_view);
+
+  views::AXAuraObjWrapper* label_view_wrapper =
+      cache_ptr->GetOrCreate(label_view);
+  ui::AXNodeData node_data;
+  tree->SerializeNode(label_view_wrapper, &node_data);
+
+  ui::AXNodeData label_data;
+  label_view->GetViewAccessibility().GetAccessibleNodeData(&label_data);
+  ui::AXNodeID id = label_data.id;
+  EXPECT_NE(label_data.GetRestriction(), ax::mojom::Restriction::kReadOnly);
+
+  if (::features::IsViewsAccessibilitySerializeOnDataChangeEnabled()) {
+    label_view->GetViewAccessibility().SetReadOnly(true);
+    auto data_change_from_views = waiter.WaitForDataChange(id);
+    ASSERT_NE(nullptr, data_change_from_views.get());
+    ui::AXNodeData received_data = *data_change_from_views;
+    ASSERT_EQ(label_data.id, received_data.id);
+    EXPECT_EQ(received_data.GetRestriction(),
+              ax::mojom::Restriction::kReadOnly);
+  }
+}
+
 // Ensure that TableView accessibility works at the level of the
 // serialized accessibility tree generated by AutomationManagerAura.
 // TODO(crbug.com/40179066): Crashes on Ozone.
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.cc b/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.cc
index 3a01b13..14722e69 100644
--- a/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.cc
@@ -14,8 +14,8 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/integrators/autofill_ai_delegate.h"
 #include "components/autofill_ai/core/browser/autofill_ai_client.h"
 #include "components/strings/grit/components_strings.h"
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.h b/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.h
index a40b7082..24589d7 100644
--- a/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.h
+++ b/chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller_impl.h
@@ -14,7 +14,7 @@
 #include "base/types/optional_ref.h"
 #include "chrome/browser/ui/autofill/autofill_ai/save_autofill_ai_data_controller.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/integrators/autofill_ai_delegate.h"
 #include "components/autofill_ai/core/browser/autofill_ai_client.h"
 #include "components/optimization_guide/proto/features/common_quality_data.pb.h"
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
index c49b653..8a8cd03 100644
--- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
+++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
@@ -955,8 +955,7 @@
   return bnpl_manager_.get();
 }
 
-const PaymentsDataManager&
-ChromePaymentsAutofillClient::GetPaymentsDataManager() const {
+PaymentsDataManager& ChromePaymentsAutofillClient::GetPaymentsDataManager() {
   return client_->GetPersonalDataManager().payments_data_manager();
 }
 
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
index 9dc2f49b..cd45c53e 100644
--- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
+++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
@@ -214,7 +214,7 @@
   payments::MandatoryReauthManager* GetOrCreatePaymentsMandatoryReauthManager()
       override;
   payments::BnplManager* GetPaymentsBnplManager() override;
-  const PaymentsDataManager& GetPaymentsDataManager() const override;
+  PaymentsDataManager& GetPaymentsDataManager() final;
   void ShowCreditCardSaveAndFillDialog() override;
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 30981e3..121ce19 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1732,6 +1732,11 @@
   window_->SetFocusToLocationBar(false);
 }
 
+bool Browser::PreHandleMouseEvent(content::WebContents* source,
+                                  const blink::WebMouseEvent& event) {
+  return window()->PreHandleMouseEvent(event);
+}
+
 content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent(
     content::WebContents* source,
     const NativeWebKeyboardEvent& event) {
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index f3e48d5..dc94ad2 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -749,6 +749,8 @@
   bool CanOverscrollContent() override;
   bool ShouldPreserveAbortedURLs(content::WebContents* source) override;
   void SetFocusToLocationBar() override;
+  bool PreHandleMouseEvent(content::WebContents* source,
+                           const blink::WebMouseEvent& event) override;
   content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
       content::WebContents* source,
       const input::NativeWebKeyboardEvent& event) override;
diff --git a/chrome/browser/ui/browser_actions.cc b/chrome/browser/ui/browser_actions.cc
index fdc67816..0d9e5556 100644
--- a/chrome/browser/ui/browser_actions.cc
+++ b/chrome/browser/ui/browser_actions.cc
@@ -586,7 +586,9 @@
                                   actions::ActionInvocationContext context) {
                                  chrome::OpenFeedbackDialog(
                                      browser,
-                                     feedback::kFeedbackSourceDesktopTabGroups);
+                                     feedback::kFeedbackSourceDesktopTabGroups,
+                                     /*description_template=*/std::string(),
+                                     /*category_tag=*/"tab_group_share");
                                },
                                base::Unretained(browser)),
                            kActionSendSharedTabGroupFeedback,
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index e98b3be..4ab30b86 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -688,7 +688,9 @@
       ShowTabDeclutter(browser_);
       break;
     case IDC_SEND_SHARED_TAB_GROUP_FEEDBACK:
-      OpenFeedbackDialog(browser_, feedback::kFeedbackSourceDesktopTabGroups);
+      OpenFeedbackDialog(browser_, feedback::kFeedbackSourceDesktopTabGroups,
+                         /*description_template=*/std::string(),
+                         /*category_tag=*/"tab_group_share");
       break;
     case IDC_SHOW_TRANSLATE:
       ShowTranslateBubble(browser_);
@@ -1649,6 +1651,11 @@
       IsWebAppOrCustomTab(browser_) && !is_isolated_app && !is_pinned_home_tab);
 
   command_updater_.UpdateCommandEnabled(
+      IDC_READING_LIST_MENU_ADD_TAB,
+      browser_->tab_strip_model()->IsReadLaterSupportedForAny(
+          {browser_->tab_strip_model()->active_index()}));
+
+  command_updater_.UpdateCommandEnabled(
       IDC_TOGGLE_REQUEST_TABLET_SITE,
       CanRequestTabletSite(current_web_contents));
 
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index bbe5589..88427ffb 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -508,6 +508,10 @@
   // Shows the app menu (for accessibility).
   virtual void ShowAppMenu() = 0;
 
+  // Allows the BrowserWindow object to handle the specified mouse event
+  // before sending it to the renderer.
+  virtual bool PreHandleMouseEvent(const blink::WebMouseEvent& event) = 0;
+
   // Allows the BrowserWindow object to handle the specified keyboard event
   // before sending it to the renderer.
   virtual content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
diff --git a/chrome/browser/ui/safety_hub/safety_hub_prefs.cc b/chrome/browser/ui/safety_hub/safety_hub_prefs.cc
index 2d1acecd..1bdccb0 100644
--- a/chrome/browser/ui/safety_hub/safety_hub_prefs.cc
+++ b/chrome/browser/ui/safety_hub/safety_hub_prefs.cc
@@ -18,6 +18,12 @@
 
   registry->RegisterIntegerPref(safety_hub_prefs::kWeakCredentialsCount, -1);
   registry->RegisterIntegerPref(safety_hub_prefs::kReusedCredentialsCount, -1);
+  registry->RegisterIntegerPref(
+      safety_hub_prefs::kLocalBreachedCredentialsCount, -1);
+  registry->RegisterIntegerPref(safety_hub_prefs::kLocalWeakCredentialsCount,
+                                -1);
+  registry->RegisterIntegerPref(safety_hub_prefs::kLocalReusedCredentialsCount,
+                                -1);
 #endif  // !BUILDFLAG(IS_ANDROID)
   registry->RegisterDictionaryPref(
       safety_hub_prefs::kMenuNotificationsPrefsKey);
diff --git a/chrome/browser/ui/safety_hub/safety_hub_prefs.h b/chrome/browser/ui/safety_hub/safety_hub_prefs.h
index 08aa2b3..ccafd7f 100644
--- a/chrome/browser/ui/safety_hub/safety_hub_prefs.h
+++ b/chrome/browser/ui/safety_hub/safety_hub_prefs.h
@@ -39,6 +39,21 @@
 // by GMSCore.
 inline constexpr char kReusedCredentialsCount[] =
     "profile.safety_hub_reused_credentials_count";
+
+// An integer count of how many local-level breached credentials were detected
+// by GMSCore.
+inline constexpr char kLocalBreachedCredentialsCount[] =
+    "profile.safety_hub_local_breached_credentials_count";
+
+// An integer count of how many local-level weak credentials were detected by
+// GMSCore.
+inline constexpr char kLocalWeakCredentialsCount[] =
+    "profile.safety_hub_local_weak_credentials_count";
+
+// An integer count of how many local-level reused credentials were detected
+// by GMSCore.
+inline constexpr char kLocalReusedCredentialsCount[] =
+    "profile.safety_hub_reused_local_credentials_count";
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 // Dictionary that holds the notifications in the three-dot menu and their
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index cab8708b..6dc820c 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -444,8 +444,104 @@
 
 std::unique_ptr<DetachedTabGroup> TabStripModel::DetachTabGroupImpl(
     const tab_groups::TabGroupId& group_id) {
+  // TODO(392952244): Remove once observers have been migrated.
   NOTIMPLEMENTED();
-  return std::make_unique<DetachedTabGroup>(nullptr);
+
+  // Prepare for group to be removed.
+  const gfx::Range tabs_in_group =
+      group_model_->GetTabGroup(group_id)->ListTabs();
+
+  tabs::TabModel* active_tab_model = GetTabModelAtIndex(active_index());
+  ui::ListSelectionModel old_selection_model = selection_model_;
+
+  bool selected_tabs_removed = false;
+  bool active_tab_removed = false;
+
+  const bool closing_all_tabs =
+      static_cast<int>(tabs_in_group.length()) == GetTabCount();
+  TabStripModelChange::Remove remove;
+
+  for (int index = static_cast<int>(tabs_in_group.end()) - 1;
+       index >= static_cast<int>(tabs_in_group.start()); --index) {
+    tabs::TabModel* tab = GetTabModelAtIndex(index);
+
+    // If the tab is active, notify it that it's going to the background:
+    if (tab == active_tab_model) {
+      active_tab_removed = true;
+      active_tab_model->WillEnterBackground(base::PassKey<TabStripModel>());
+    }
+
+    // Track whether any of these tabs are selected.
+    if (IsTabSelected(index)) {
+      selected_tabs_removed = true;
+    }
+
+    // Tell the tab it’s being detached (inserted into another window).
+    tab->WillDetach(base::PassKey<TabStripModel>(),
+                    tabs::TabInterface::DetachReason::kInsertIntoOtherWindow);
+
+    // Notify observers that the tab will be removed.
+    for (auto& observer : observers_) {
+      observer.OnTabWillBeRemoved(tab->GetContents(), index);
+    }
+
+    // Fix opener relationships before removing the tab.
+    FixOpeners(index);
+
+    // Record this removal in the `Remove` event payload.
+    remove.contents.emplace_back(
+        tab, index,
+        TabStripModelChange::RemoveReason::kInsertedIntoOtherTabStrip,
+        tabs::TabInterface::DetachReason::kInsertIntoOtherWindow, std::nullopt);
+  }
+
+  // Selection model update should be done as a bulk operation.
+  if (closing_all_tabs) {
+    selection_model_.Clear();
+  } else {
+    std::optional<int> next_selected_index =
+        DetermineNewSelectedIndex(group_id);
+
+    // Remove all the selected tabs from the model.
+    for (int index = static_cast<int>(tabs_in_group.end()) - 1;
+         index >= static_cast<int>(tabs_in_group.start()); --index) {
+      selection_model_.DecrementFrom(index);
+    }
+
+    if (active_tab_removed) {
+      if (!selection_model_.empty()) {
+        selection_model_.set_active(
+            *selection_model_.selected_indices().begin());
+        selection_model_.set_anchor(selection_model_.active());
+      } else {
+        selection_model_.SetSelectedIndex(next_selected_index.value());
+      }
+    }
+  }
+
+  // Remove the group collection.
+  std::unique_ptr<tabs::TabGroupTabCollection> group_collection =
+      contents_data_->unpinned_collection()->RemoveGroup(
+          contents_data_->unpinned_collection()->GetTabGroupCollection(
+              group_id));
+
+  // Send group detach notification.
+  OnTabGroupDetached(*group_model_->GetTabGroup(group_id));
+  group_model_->RemoveTabGroup(group_id, base::PassKey<TabStripModel>());
+
+  // Send remove notifications for tabs. There is no need to send group
+  // notifications again since tabs are part of the same group.
+  TabStripModelChange change(std::move(remove));
+  TabStripSelectionChange selection(active_tab_model, old_selection_model);
+  selection.new_tab = GetActiveTab();
+  selection.new_contents = GetActiveWebContents();
+  selection.new_model = selection_model_;
+  selection.reason = TabStripModelObserver::CHANGE_REASON_NONE;
+  selection.selected_tabs_were_removed = selected_tabs_removed;
+
+  OnChange(change, selection);
+
+  return std::make_unique<DetachedTabGroup>(std::move(group_collection));
 }
 
 void TabStripModel::InsertDetachedTabGroupImpl(
@@ -3521,6 +3617,22 @@
 }
 
 std::optional<int> TabStripModel::DetermineNewSelectedIndex(
+    const tab_groups::TabGroupId& removed_group_id) const {
+  // TODO(396498447): Use opener and group information to compute this.
+  const gfx::Range tabs_in_group =
+      group_model_->GetTabGroup(removed_group_id)->ListTabs();
+
+  const int first_tab_in_group = static_cast<int>(tabs_in_group.start());
+  const int last_tab_in_group = static_cast<int>(tabs_in_group.end() - 1);
+
+  if (last_tab_in_group >= (count() - 1)) {
+    return first_tab_in_group - 1;
+  }
+
+  return last_tab_in_group + 1 - tabs_in_group.length();
+}
+
+std::optional<int> TabStripModel::DetermineNewSelectedIndex(
     int removing_index) const {
   DCHECK(ContainsIndex(removing_index));
 
diff --git a/chrome/browser/ui/tabs/tab_strip_model.h b/chrome/browser/ui/tabs/tab_strip_model.h
index 2c24d3f3..061ceb02 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.h
+++ b/chrome/browser/ui/tabs/tab_strip_model.h
@@ -1041,6 +1041,10 @@
   // Determine where to shift selection after a tab is closed.
   std::optional<int> DetermineNewSelectedIndex(int removed_index) const;
 
+  // Determine where to shift selection after a group is detached.
+  std::optional<int> DetermineNewSelectedIndex(
+      const tab_groups::TabGroupId& removed_group_id) const;
+
   // The WebContents data currently hosted within this TabStripModel. This must
   // be kept in sync with |selection_model_|.
   std::unique_ptr<tabs::TabStripCollection> contents_data_;
diff --git a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
index 9b6d4d92..554731c 100644
--- a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/browser_window/test/mock_browser_window_interface.h"
 #include "chrome/browser/ui/tabs/public/tab_interface.h"
+#include "chrome/browser/ui/tabs/tab_group_tab_collection.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "components/commerce/core/commerce_utils.h"
 #ifdef UNSAFE_BUFFERS_BUILD
@@ -900,6 +901,25 @@
   delegate.SetBrowserWindowInterface(nullptr);
 }
 
+TEST_F(TabStripModelTest, TestDetachGroupForInsertion) {
+  TestTabStripModelDelegate delegate;
+  TabStripModel tabstrip(&delegate, profile());
+  ASSERT_TRUE(tabstrip.empty());
+
+  tabstrip.AppendWebContents(CreateWebContentsWithID(1), false);
+  tabstrip.AppendWebContents(CreateWebContentsWithID(2), false);
+  tabstrip.AppendWebContents(CreateWebContentsWithID(3), true);
+
+  tab_groups::TabGroupId group_id =
+      tabstrip.AddToNewGroup(std::vector<int>{1, 2});
+  std::unique_ptr<DetachedTabGroup> detached_group =
+      tabstrip.DetachTabGroupForInsertion(group_id);
+
+  EXPECT_EQ(detached_group->collection_->TabCountRecursive(), 2u);
+  EXPECT_FALSE(tabstrip.group_model()->ContainsTabGroup(group_id));
+  EXPECT_EQ(tabstrip.count(), 1);
+}
+
 TEST_F(TabStripModelTest, TestBasicOpenerAPI) {
   TestTabStripModelDelegate delegate;
   TabStripModel tabstrip(&delegate, profile());
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
index 335c8a28..636efa16 100644
--- a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
+++ b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
@@ -1520,6 +1520,7 @@
       "bone with a bite four times their own weight.");
   ASSERT_EQ(u"Downloading French language pack\x2026 12%",
             GetDownloadProgressLabel()->GetText());
+  ASSERT_EQ(48, GetDownloadProgressLabel()->GetPreferredSize().height());
 
   OnSodaInstalled();
   ASSERT_TRUE(GetLabel()->GetVisible());
diff --git a/chrome/browser/ui/views/autofill/autofill_ai/save_autofill_ai_data_bubble_view.cc b/chrome/browser/ui/views/autofill/autofill_ai/save_autofill_ai_data_bubble_view.cc
index 32358aed..52013b2c 100644
--- a/chrome/browser/ui/views/autofill/autofill_ai/save_autofill_ai_data_bubble_view.cc
+++ b/chrome/browser/ui/views/autofill/autofill_ai/save_autofill_ai_data_bubble_view.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/ui/views/autofill/popup/autofill_ai/autofill_ai_icon_image_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/grit/theme_resources.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/optimization_guide/proto/features/common_quality_data.pb.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_interactive_uitest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_interactive_uitest.cc
index 0608bf2..eb8f956 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_interactive_uitest.cc
@@ -236,18 +236,19 @@
 #define MAYBE_DISABLED(test_name) test_name
 #endif
 
-void SkipIfMac11() {
+// TODO(crbug.com/391735476) Deflake on Mac11.
 #if BUILDFLAG(IS_MAC)
-  if (base::mac::MacOSMajorVersion() == 11) {
-    // TODO(crbug.com/391735476) Deflake on Mac11.
-    GTEST_SKIP() << "Test is flaky on Mac11 (crbug.com/391735476)";
+#define SKIP_IF_MAC11()                                             \
+  if (base::mac::MacOSMajorVersion() == 11) {                       \
+    GTEST_SKIP() << "Test is flaky on Mac11 (crbug.com/391735476)"; \
   }
+#else
+#define SKIP_IF_MAC11()
 #endif
-}
 
 IN_PROC_BROWSER_TEST_F(BookmarkBarDragAndDropInteractiveTest,
                        MAYBE_DISABLED(BookmarksDragAndDrop)) {
-  SkipIfMac11();
+  SKIP_IF_MAC11();
 
   // Add two bookmarks nodes to the bookmarks bar.
   bookmarks::BookmarkModel* const model =
@@ -281,7 +282,7 @@
 
 IN_PROC_BROWSER_TEST_F(BookmarkBarDragAndDropInteractiveTest,
                        MAYBE_DISABLED(BookmarksDragAndDropToNestedFolder)) {
-  SkipIfMac11();
+  SKIP_IF_MAC11();
 
   // Add two bookmarks nodes to the bookmarks bar.
   bookmarks::BookmarkModel* const model =
@@ -315,7 +316,7 @@
 
 IN_PROC_BROWSER_TEST_F(BookmarkBarDragAndDropInteractiveTest,
                        MAYBE_DISABLED(BookmarksDragAndDropFromNestedFolder)) {
-  SkipIfMac11();
+  SKIP_IF_MAC11();
 
   // Add two bookmarks nodes to the bookmarks bar.
   bookmarks::BookmarkModel* const model =
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 4c30cff9..8e7e0709 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1014,9 +1014,11 @@
 
   views::View* contents_view;
   if (base::FeatureList::IsEnabled(features::kSideBySide)) {
-    auto multi_contents_view =
-        std::make_unique<MultiContentsView>(browser_->profile());
-    contents_web_view_ = multi_contents_view->active_contents_view();
+    auto multi_contents_view = std::make_unique<MultiContentsView>(
+        browser_->profile(),
+        base::BindRepeating(&BrowserView::ActivateWebContents,
+                            base::Unretained(this)));
+    contents_web_view_ = multi_contents_view->GetActiveContentsView();
     multi_contents_view_ =
         contents_container->AddChildView(std::move(multi_contents_view));
     contents_view = multi_contents_view_;
@@ -1463,9 +1465,11 @@
   CHECK(inactive_index > -1);
   int active_index = browser_->tab_strip_model()->active_index();
   const int active_position = active_index < inactive_index ? 0 : 1;
-  multi_contents_view_->SetActivePosition(active_position);
+  contents_web_view_ = multi_contents_view_->SetActivePosition(active_position);
   multi_contents_view_->SetWebContents(
       browser_->tab_strip_model()->GetWebContentsAt(inactive_index), false);
+  multi_contents_view_->SetWebContents(
+      browser_->tab_strip_model()->GetWebContentsAt(active_index), true);
 }
 
 void BrowserView::HideSplitView() {
@@ -1473,6 +1477,14 @@
   multi_contents_view_->SetWebContents(nullptr, false);
 }
 
+void BrowserView::ActivateWebContents(content::WebContents* web_contents) {
+  int tab_index =
+      browser_->tab_strip_model()->GetIndexOfWebContents(web_contents);
+  if (tab_index != TabStripModel::kNoTab) {
+    browser_->tab_strip_model()->ActivateTabAt(tab_index);
+  }
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // BrowserView, BrowserWindow implementation:
 
@@ -1843,12 +1855,6 @@
                                      int reason) {
   DCHECK(new_contents);
   TRACE_EVENT0("ui", "BrowserView::OnActiveTabChanged");
-  // TODO(crbug.com/393451405): Remove in favor of multi_contents_view_
-  // handling any potential conflicts around setting a webcontents that is
-  // already set to a different ContentsWebView.
-  if (multi_contents_view_) {
-    multi_contents_view_->SetWebContents(nullptr, false);
-  }
 
   if (old_contents && !old_contents->IsBeingDestroyed()) {
     // We do not store the focus when closing the tab to work-around bug 4633.
@@ -1867,7 +1873,11 @@
   // some work.  This also prevents extra events from being reported by the
   // Visibility API under Windows, as ChangeWebContents will briefly hide
   // the WebContents window.
-  bool change_tab_contents = contents_web_view_->web_contents() != new_contents;
+  bool change_tab_contents =
+      contents_web_view_->web_contents() != new_contents &&
+      (!multi_contents_view_ ||
+       multi_contents_view_->GetInactiveContentsView()->GetWebContents() !=
+           new_contents);
 
 #if BUILDFLAG(IS_MAC)
   // Widget::IsActive is inconsistent between Mac and Aura, so don't check for
@@ -3428,6 +3438,13 @@
       ->Activate(nullptr);
 }
 
+bool BrowserView::PreHandleMouseEvent(const blink::WebMouseEvent& event) {
+  if (multi_contents_view_) {
+    return multi_contents_view_->PreHandleMouseEvent(event);
+  }
+  return false;
+}
+
 content::KeyboardEventProcessingResult BrowserView::PreHandleKeyboardEvent(
     const NativeWebKeyboardEvent& event) {
   if ((event.GetType() != blink::WebInputEvent::Type::kRawKeyDown) &&
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index f4be624..685c9710 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -482,6 +482,9 @@
   // side-by-side display.
   void HideSplitView();
 
+  // Activate the tab containing the given WebContents (if any).
+  void ActivateWebContents(content::WebContents* web_contents);
+
   // BrowserWindow:
   void Show() override;
   void ShowInactive() override;
@@ -635,6 +638,7 @@
       base::OnceCallback<void(bool)> callback) override;
   void UserChangedTheme(BrowserThemeChangeType theme_change_type) override;
   void ShowAppMenu() override;
+  bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override;
   content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
       const input::NativeWebKeyboardEvent& event) override;
   bool HandleKeyboardEvent(const input::NativeWebKeyboardEvent& event) override;
@@ -874,6 +878,10 @@
     return watermark_view_;
   }
 
+  MultiContentsView* multi_contents_view_for_testing() {
+    return multi_contents_view_;
+  }
+
   // This value is used in a common calculation in NonClientFrameView
   // subclasses. This must be added to the origin of the first painted pixel of
   // NonClientFrameView to get the correct offset. See
diff --git a/chrome/browser/ui/views/frame/multi_contents_view.cc b/chrome/browser/ui/views/frame/multi_contents_view.cc
index d38cfcb..025684391 100644
--- a/chrome/browser/ui/views/frame/multi_contents_view.cc
+++ b/chrome/browser/ui/views/frame/multi_contents_view.cc
@@ -9,18 +9,22 @@
 #include "chrome/browser/ui/views/frame/contents_web_view.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/events/types/event_type.h"
 #include "ui/views/layout/flex_layout.h"
 #include "ui/views/view_class_properties.h"
 
 DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(MultiContentsView,
                                       kMultiContentsViewElementId);
 
-MultiContentsView::MultiContentsView(content::BrowserContext* browser_context) {
-  active_contents_view_ =
+MultiContentsView::MultiContentsView(
+    content::BrowserContext* browser_context,
+    WebContentsPressedCallback inactive_view_pressed_callback)
+    : inactive_view_pressed_callback_(inactive_view_pressed_callback) {
+  start_contents_view_ =
       AddChildView(std::make_unique<ContentsWebView>(browser_context));
-  inactive_contents_view_ =
+  end_contents_view_ =
       AddChildView(std::make_unique<ContentsWebView>(browser_context));
-  inactive_contents_view_->SetVisible(false);
+  end_contents_view_->SetVisible(false);
 
   SetProperty(views::kElementIdentifierKey, kMultiContentsViewElementId);
   SetLayoutManager(std::make_unique<views::FlexLayout>())
@@ -33,19 +37,46 @@
 
 MultiContentsView::~MultiContentsView() = default;
 
+ContentsWebView* MultiContentsView::GetActiveContentsView() {
+  return active_position_ == 0 ? start_contents_view_ : end_contents_view_;
+}
+
+ContentsWebView* MultiContentsView::GetInactiveContentsView() {
+  return active_position_ == 0 ? end_contents_view_ : start_contents_view_;
+}
+
 void MultiContentsView::SetWebContents(content::WebContents* web_contents,
                                        bool active) {
   ContentsWebView* contents_view =
-      active ? active_contents_view_ : inactive_contents_view_;
+      active ? GetActiveContentsView() : GetInactiveContentsView();
   contents_view->SetWebContents(web_contents);
   contents_view->SetVisible(web_contents != nullptr);
 }
 
-void MultiContentsView::SetActivePosition(int position) {
+ContentsWebView* MultiContentsView::SetActivePosition(int position) {
   // Position should never be less than 0 or equal to or greater than the total
   // number of contents views.
   CHECK(position >= 0 && position < 2);
-  ReorderChildView(active_contents_view_, position);
+  active_position_ = position;
+  return GetActiveContentsView();
+}
+
+bool MultiContentsView::PreHandleMouseEvent(const blink::WebMouseEvent& event) {
+  ContentsWebView* inactive_contents_view = GetInactiveContentsView();
+  if (event.GetTypeAsUiEventType() == ui::EventType::kMousePressed &&
+      inactive_contents_view->GetVisible()) {
+    gfx::Rect inactive_contents_view_bounds =
+        inactive_contents_view->GetWebContents()->GetContainerBounds();
+    const gfx::PointF& event_position = event.PositionInScreen();
+    if (inactive_contents_view_bounds.Contains(event_position.x(),
+                                               event_position.y())) {
+      inactive_view_pressed_callback_.Run(
+          inactive_contents_view->GetWebContents());
+    }
+  }
+  // Always allow the event to propagate to the WebContents, regardless of
+  // whether it was also handled above.
+  return false;
 }
 
 BEGIN_METADATA(MultiContentsView)
diff --git a/chrome/browser/ui/views/frame/multi_contents_view.h b/chrome/browser/ui/views/frame/multi_contents_view.h
index a1fbd9677..1345ff46 100644
--- a/chrome/browser/ui/views/frame/multi_contents_view.h
+++ b/chrome/browser/ui/views/frame/multi_contents_view.h
@@ -5,12 +5,17 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_H_
 #define CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_H_
 
+#include "base/functional/callback_forward.h"
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/views/view.h"
 
 class ContentsWebView;
 
+namespace blink {
+class WebMouseEvent;
+}  // namespace blink
+
 namespace content {
 class BrowserContext;
 class WebContents;
@@ -24,27 +29,48 @@
  public:
   DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kMultiContentsViewElementId);
 
-  explicit MultiContentsView(content::BrowserContext* browser_context);
+  using WebContentsPressedCallback =
+      base::RepeatingCallback<void(content::WebContents*)>;
+
+  MultiContentsView(content::BrowserContext* browser_context,
+                    WebContentsPressedCallback inactive_view_pressed_callback);
   MultiContentsView(const MultiContentsView&) = delete;
   MultiContentsView& operator=(const MultiContentsView&) = delete;
   ~MultiContentsView() override;
 
-  ContentsWebView* active_contents_view() { return active_contents_view_; }
-  ContentsWebView* inactive_contents_view() { return inactive_contents_view_; }
+  // Returns the currently active ContentsWebView.
+  ContentsWebView* GetActiveContentsView();
+
+  // Returns the currently inactive ContentsWebView.
+  ContentsWebView* GetInactiveContentsView();
 
   // Assigns the given |web_contents| to a ContentsWebView. If |active| it will
-  // be assigned to active_contents_view_, else it will be assigned to
-  // inactive_contents_view_.
+  // be assigned to the active contents view, else it will be assigned to
+  // the inactive contents view.
   void SetWebContents(content::WebContents* web_contents, bool active);
 
   // Sets the index of the active contents view, as relative to the inactive
-  // contents view. In LTR, a value of 0 will place the active view on the
-  // left.
-  void SetActivePosition(int position);
+  // contents view. A value of 0 will activate start_contents_view_. Returns
+  // the newly active ContentsWebView.
+  ContentsWebView* SetActivePosition(int position);
+
+  // Handles a mouse event prior to it being passed along to the WebContents.
+  bool PreHandleMouseEvent(const blink::WebMouseEvent& event);
 
  private:
-  raw_ptr<ContentsWebView> active_contents_view_ = nullptr;
-  raw_ptr<ContentsWebView> inactive_contents_view_ = nullptr;
+  // The left contents view, in LTR.
+  raw_ptr<ContentsWebView> start_contents_view_ = nullptr;
+
+  // The right contents view, in LTR.
+  raw_ptr<ContentsWebView> end_contents_view_ = nullptr;
+
+  // The index of the active context view. A value of 0 corresponds to
+  // start_contents_view_.
+  int active_position_ = 0;
+
+  // Callback to be executed when the user clicks anywhere within the bounds of
+  // the inactive contents view.
+  WebContentsPressedCallback inactive_view_pressed_callback_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_H_
diff --git a/chrome/browser/ui/views/frame/multi_contents_view_browsertest.cc b/chrome/browser/ui/views/frame/multi_contents_view_browsertest.cc
new file mode 100644
index 0000000..900294e
--- /dev/null
+++ b/chrome/browser/ui/views/frame/multi_contents_view_browsertest.cc
@@ -0,0 +1,61 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/frame/multi_contents_view.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/test/interaction/interactive_browser_test.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "third_party/blink/public/common/input/web_mouse_event.h"
+
+DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kNewTab);
+
+class MultiContentsViewBrowserTest : public InteractiveBrowserTest {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    scoped_feature_list_.InitWithFeatures({features::kSideBySide}, {});
+  }
+
+ protected:
+  BrowserView* browser_view() {
+    return BrowserView::GetBrowserViewForBrowser(browser());
+  }
+
+  TabStripModel* tab_strip_model() { return browser()->tab_strip_model(); }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Check that MultiContentsView exists when the side by side flag is enabled
+IN_PROC_BROWSER_TEST_F(MultiContentsViewBrowserTest, ExistsWithFlag) {
+  RunTestSequence(
+      EnsurePresent(MultiContentsView::kMultiContentsViewElementId));
+}
+
+// Check that MultiContentsView executes its callback on inactive view mouse
+// down.
+IN_PROC_BROWSER_TEST_F(MultiContentsViewBrowserTest, ActivatesInactiveView) {
+  RunTestSequence(
+      AddInstrumentedTab(kNewTab, GURL(chrome::kChromeUISettingsURL), 0),
+      WaitForWebContentsReady(kNewTab),
+      Check([=, this]() { return tab_strip_model()->count() == 2u; }),
+      Check([=, this]() { return tab_strip_model()->active_index() == 0; }),
+      Do([&]() {
+        content::WebContents* inactive_contents =
+            tab_strip_model()->GetWebContentsAt(1);
+        browser_view()->multi_contents_view_for_testing()->SetWebContents(
+            inactive_contents, false);
+
+        // Simulate a mouse click event on the inactive contents, which should
+        // trigger the activation callback.
+        content::SimulateMouseClick(inactive_contents, 0,
+                                    blink::WebPointerProperties::Button::kLeft);
+      }),
+      Check([&]() { return tab_strip_model()->active_index() == 1; }));
+}
diff --git a/chrome/browser/ui/views/tabs/tab_close_button.cc b/chrome/browser/ui/views/tabs/tab_close_button.cc
index 281d6c6..ac335a68 100644
--- a/chrome/browser/ui/views/tabs/tab_close_button.cc
+++ b/chrome/browser/ui/views/tabs/tab_close_button.cc
@@ -18,7 +18,6 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/pointer/touch_ui_controller.h"
-#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/insets.h"
@@ -63,8 +62,6 @@
   views::InkDrop::Get(this)->GetInkDrop()->SetHoverHighlightFadeDuration(
       base::TimeDelta());
 
-  image_container_view()->DestroyLayer();
-
   // The ink drop highlight path is the same as the focus ring highlight path,
   // but needs to be explicitly mirrored for RTL.
   // TODO(http://crbug.com/1056490): Make ink drops in RTL work the same way as
@@ -145,20 +142,6 @@
   event->SetHandled();
 }
 
-void TabCloseButton::AddLayerToRegion(ui::Layer* new_layer,
-                                      views::LayerRegion region) {
-  image_container_view()->SetPaintToLayer();
-  image_container_view()->layer()->SetFillsBoundsOpaquely(false);
-  ink_drop_container()->SetVisible(true);
-  ink_drop_container()->AddLayerToRegion(new_layer, region);
-}
-
-void TabCloseButton::RemoveLayerFromRegions(ui::Layer* old_layer) {
-  ink_drop_container()->RemoveLayerFromRegions(old_layer);
-  ink_drop_container()->SetVisible(false);
-  image_container_view()->DestroyLayer();
-}
-
 gfx::Size TabCloseButton::CalculatePreferredSize(
     const views::SizeBounds& available_size) const {
   return kButtonSize;
diff --git a/chrome/browser/ui/views/tabs/tab_close_button.h b/chrome/browser/ui/views/tabs/tab_close_button.h
index f23bf86..f688214e 100644
--- a/chrome/browser/ui/views/tabs/tab_close_button.h
+++ b/chrome/browser/ui/views/tabs/tab_close_button.h
@@ -46,9 +46,6 @@
   void OnMouseReleased(const ui::MouseEvent& event) override;
   void OnMouseMoved(const ui::MouseEvent& event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
-  void AddLayerToRegion(ui::Layer* new_layer,
-                        views::LayerRegion region) override;
-  void RemoveLayerFromRegions(ui::Layer* old_layer) override;
 
  protected:
   // Set/reset the image models for the icon with new colors.
diff --git a/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc
index 3fc982a..16a893266 100644
--- a/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc
@@ -181,18 +181,19 @@
 #define MAYBE_DISABLED(test_name) test_name
 #endif
 
-void SkipIfMac11() {
+// TODO(crbug.com/391735476) Deflake on Mac11.
 #if BUILDFLAG(IS_MAC)
-  if (base::mac::MacOSMajorVersion() == 11) {
-    // TODO(crbug.com/391735476) Deflake on Mac11.
-    GTEST_SKIP() << "Test is flaky on Mac11 (crbug.com/391735476)";
+#define SKIP_IF_MAC11()                                             \
+  if (base::mac::MacOSMajorVersion() == 11) {                       \
+    GTEST_SKIP() << "Test is flaky on Mac11 (crbug.com/391735476)"; \
   }
+#else
+#define SKIP_IF_MAC11()
 #endif
-}
 
 IN_PROC_BROWSER_TEST_F(AppMenuDragAndDropInteractiveTest,
                        MAYBE_DISABLED(BookmarksDragAndDrop)) {
-  SkipIfMac11();
+  SKIP_IF_MAC11();
 
   // Add two bookmarks nodes to the bookmarks bar.
   bookmarks::BookmarkModel* const model =
@@ -226,7 +227,7 @@
 
 IN_PROC_BROWSER_TEST_F(AppMenuDragAndDropInteractiveTest,
                        MAYBE_DISABLED(BookmarksDragAndDropToNestedFolder)) {
-  SkipIfMac11();
+  SKIP_IF_MAC11();
 
   // Add two bookmarks nodes to the bookmarks bar.
   bookmarks::BookmarkModel* const model =
@@ -261,7 +262,7 @@
 
 IN_PROC_BROWSER_TEST_F(AppMenuDragAndDropInteractiveTest,
                        MAYBE_DISABLED(BookmarksDragAndDropFromNestedFolder)) {
-  SkipIfMac11();
+  SKIP_IF_MAC11();
 
   // Add one bookmark folder to the bookmarks bar, and add a bookmark node to
   // the new folder.
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.cc b/chrome/browser/ui/views/toolbar/toolbar_button.cc
index 02a6172..3af7a0e 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_button.cc
@@ -124,6 +124,13 @@
 
   SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
   views::FocusRing::Get(this)->SetOutsetFocusRingDisabled(true);
+
+#if BUILDFLAG(IS_WIN)
+  // Paint image(s) to a layer so that the canvas is snapped to pixel
+  // boundaries.
+  image_container_view()->SetPaintToLayer();
+  image_container_view()->layer()->SetFillsBoundsOpaquely(false);
+#endif
 }
 
 ToolbarButton::~ToolbarButton() = default;
@@ -753,6 +760,24 @@
   return std::make_unique<ToolbarButtonActionViewInterface>(this);
 }
 
+void ToolbarButton::AddLayerToRegion(ui::Layer* new_layer,
+                                     views::LayerRegion region) {
+#if !BUILDFLAG(IS_WIN)
+  image_container_view()->SetPaintToLayer();
+  image_container_view()->layer()->SetFillsBoundsOpaquely(false);
+#endif
+  ink_drop_container()->SetVisible(true);
+  ink_drop_container()->AddLayerToRegion(new_layer, region);
+}
+
+void ToolbarButton::RemoveLayerFromRegions(ui::Layer* old_layer) {
+  ink_drop_container()->RemoveLayerFromRegions(old_layer);
+  ink_drop_container()->SetVisible(false);
+#if !BUILDFLAG(IS_WIN)
+  image_container_view()->DestroyLayer();
+#endif
+}
+
 ToolbarButtonActionViewInterface::ToolbarButtonActionViewInterface(
     ToolbarButton* action_view)
     : views::LabelButtonActionViewInterface(action_view),
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.h b/chrome/browser/ui/views/toolbar/toolbar_button.h
index 12192cf..01ef9a7 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_button.h
@@ -131,6 +131,9 @@
   void OnMouseExited(const ui::MouseEvent& event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
   std::unique_ptr<views::ActionViewInterface> GetActionViewInterface() override;
+  void AddLayerToRegion(ui::Layer* new_layer,
+                        views::LayerRegion region) override;
+  void RemoveLayerFromRegions(ui::Layer* old_layer) override;
 
   // When IPH is showing we suppress the tooltip text. This means that we must
   // provide an alternative accessible name, when this is the case. This is
diff --git a/chrome/browser/ui/web_applications/navigation_capturing_process.cc b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
index 3df2eca..ea1eb1e 100644
--- a/chrome/browser/ui/web_applications/navigation_capturing_process.cc
+++ b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
@@ -187,10 +187,15 @@
   // process.
   const std::optional<ash::SystemWebAppType> capturing_system_app_type =
       ash::GetCapturingSystemAppForURL(profile, params.url);
-  if (capturing_system_app_type.has_value() && params.browser &&
-      ash::IsBrowserForSystemWebApp(params.browser,
-                                    capturing_system_app_type.value())) {
-    return nullptr;
+  if (capturing_system_app_type.has_value()) {
+    if (params.browser &&
+        ash::IsBrowserForSystemWebApp(params.browser,
+                                      capturing_system_app_type.value())) {
+      return nullptr;
+    }
+    // This process should never be called for URLS captured by system web apps
+    // from a non-system-web-app browser.
+    NOTREACHED();
   }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
diff --git a/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc b/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc
index caceccdb..9a6a1de 100644
--- a/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc
+++ b/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc
@@ -786,7 +786,7 @@
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
 
   // Incognito WebContents don't have app IDs.
-  // TODO(crbug.com/1135863): Decide what should happen with SWA URLs and
+  // TODO(crbug.com/40723875): Decide what should happen with SWA URLs and
   // incognito windows.
   if (!browser()->profile()->IsOffTheRecord()) {
     // Verifies the tab has an associated tab helper for System App's
diff --git a/chrome/browser/ui/web_applications/web_app_launch_utils.cc b/chrome/browser/ui/web_applications/web_app_launch_utils.cc
index a8ef4b4b..a91d5a2 100644
--- a/chrome/browser/ui/web_applications/web_app_launch_utils.cc
+++ b/chrome/browser/ui/web_applications/web_app_launch_utils.cc
@@ -739,7 +739,7 @@
     // This block safe guards against misuse of APIs (that can cause
     // GetCapturingSystemAppForURL returning the wrong value).
     //
-    // TODO(http://crbug.com/1408946): Remove this block when we find a better
+    // TODO(crbug.com/40253765): Remove this block when we find a better
     // way to prevent API misuse (e.g. by ensuring test coverage for new
     // features that could trigger this code) or this code path is no longer
     // possible.
diff --git a/chrome/browser/ui/web_applications/web_app_relaunch_notification.h b/chrome/browser/ui/web_applications/web_app_relaunch_notification.h
index 77939683..9f44a02a 100644
--- a/chrome/browser/ui/web_applications/web_app_relaunch_notification.h
+++ b/chrome/browser/ui/web_applications/web_app_relaunch_notification.h
@@ -17,7 +17,7 @@
 
 enum class AppRelaunchState;
 
-constexpr int kSecondsToShowNotificationPostAppRelaunch = 2;
+inline constexpr int kSecondsToShowNotificationPostAppRelaunch = 2;
 
 void NotifyAppRelaunchState(const webapps::AppId& placeholder_app_id,
                             const webapps::AppId& final_app_id,
diff --git a/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.cc b/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.cc
index 3bf08232..34e5f3d 100644
--- a/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.cc
+++ b/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.cc
@@ -39,7 +39,6 @@
 #include "components/password_manager/core/browser/password_sync_util.h"
 #include "components/sync/service/sync_service.h"
 #include "content/public/browser/browser_context.h"
-#include "content/public/browser/document_user_data.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "device/fido/fido_discovery_base.h"
@@ -48,19 +47,24 @@
 
 using RenderFrameHost = content::RenderFrameHost;
 
-DOCUMENT_USER_DATA_KEY_IMPL(PasskeyUpgradeRequestController);
+PasskeyUpgradeRequestController::PasskeyUpgradeRequestController(
+    RenderFrameHost* rfh,
+    EnclaveRequestCallback enclave_request_callback)
+    : frame_host_id_(rfh->GetGlobalId()),
+      enclave_manager_(
+          EnclaveManagerFactory::GetAsEnclaveManagerForProfile(profile())),
+      enclave_request_callback_(enclave_request_callback) {
+  if (enclave_manager_->is_loaded()) {
+    OnEnclaveLoaded();
+    return;
+  }
+  enclave_manager_->Load(
+      base::BindOnce(&PasskeyUpgradeRequestController::OnEnclaveLoaded,
+                     weak_factory_.GetWeakPtr()));
+}
 
 PasskeyUpgradeRequestController::~PasskeyUpgradeRequestController() = default;
 
-void PasskeyUpgradeRequestController::InitializeEnclaveRequestCallback(
-    device::FidoDiscoveryFactory* discovery_factory) {
-  using EnclaveEventStream = device::FidoDiscoveryBase::EventStream<
-      std::unique_ptr<device::enclave::CredentialRequest>>;
-  std::unique_ptr<EnclaveEventStream> event_stream;
-  std::tie(enclave_request_callback_, event_stream) = EnclaveEventStream::New();
-  discovery_factory->set_enclave_ui_request_stream(std::move(event_stream));
-}
-
 void PasskeyUpgradeRequestController::TryUpgradePasswordToPasskey(
     std::string rp_id,
     const std::string& user_name,
@@ -120,7 +124,7 @@
     return;
   }
 
-  GURL url = origin().GetURL();
+  GURL url = render_frame_host().GetLastCommittedOrigin().GetURL();
   password_manager::PasswordFormDigest form_digest(
       password_manager::PasswordForm::Scheme::kHtml,
       password_manager::GetSignonRealm(url), url);
@@ -211,6 +215,13 @@
   std::move(pending_callback_).Run(true);
 }
 
+content::RenderFrameHost& PasskeyUpgradeRequestController::render_frame_host()
+    const {
+  auto* rfh = content::RenderFrameHost::FromID(frame_host_id_);
+  CHECK(rfh);
+  return *rfh;
+}
+
 Profile* PasskeyUpgradeRequestController::profile() const {
   return Profile::FromBrowserContext(render_frame_host().GetBrowserContext());
 }
@@ -224,17 +235,3 @@
     ContinuePendingUpgradeRequest();
   }
 }
-
-PasskeyUpgradeRequestController::PasskeyUpgradeRequestController(
-    RenderFrameHost* rfh)
-    : content::DocumentUserData<PasskeyUpgradeRequestController>(rfh),
-      enclave_manager_(
-          EnclaveManagerFactory::GetAsEnclaveManagerForProfile(profile())) {
-  if (enclave_manager_->is_loaded()) {
-    OnEnclaveLoaded();
-    return;
-  }
-  enclave_manager_->Load(
-      base::BindOnce(&PasskeyUpgradeRequestController::OnEnclaveLoaded,
-                     weak_factory_.GetWeakPtr()));
-}
diff --git a/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.h b/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.h
index 835695ec..baaf240 100644
--- a/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.h
+++ b/chrome/browser/ui/webauthn/passkey_upgrade_request_controller.h
@@ -13,7 +13,6 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/webauthn/gpm_enclave_controller.h"
 #include "components/password_manager/core/browser/password_store/password_store_consumer.h"
-#include "content/public/browser/document_user_data.h"
 
 namespace content {
 class RenderFrameHost;
@@ -30,21 +29,20 @@
 
 // PasskeyUpgradeRequestController is responsible for handling a request to
 // silently create a passkey in GPM, effectively upgrading an existing password.
-// This is also known also "conditionalCreate" in WebAuthn spec terms.
+// This is also known as conditionalCreate in WebAuthn.
 class PasskeyUpgradeRequestController
-    : public content::DocumentUserData<PasskeyUpgradeRequestController>,
-      public password_manager::PasswordStoreConsumer,
+    : public password_manager::PasswordStoreConsumer,
       public GPMEnclaveTransaction::Delegate {
  public:
   using Callback = base::OnceCallback<void(bool success)>;
   using EnclaveRequestCallback = base::RepeatingCallback<void(
       std::unique_ptr<device::enclave::CredentialRequest>)>;
 
+  explicit PasskeyUpgradeRequestController(
+      content::RenderFrameHost* rfh,
+      EnclaveRequestCallback enclave_request_callback);
   ~PasskeyUpgradeRequestController() override;
 
-  void InitializeEnclaveRequestCallback(
-      device::FidoDiscoveryFactory* discovery_factory);
-
   // Attempts to create a passkey for the given WebAuthn RP ID and user name, if
   // a matching password exists.
   void TryUpgradePasswordToPasskey(std::string rp_id,
@@ -58,11 +56,6 @@
     kReady,
   };
 
-  explicit PasskeyUpgradeRequestController(content::RenderFrameHost* rfh);
-
-  friend DocumentUserData;
-  DOCUMENT_USER_DATA_KEY_DECL();
-
   // password_manager::PasswordStoreConsumer:
   void OnGetPasswordStoreResultsOrErrorFrom(
       password_manager::PasswordStoreInterface* store,
@@ -76,11 +69,14 @@
   void OnPasskeyCreated(
       const sync_pb::WebauthnCredentialSpecifics& passkey) override;
 
+  content::RenderFrameHost& render_frame_host() const;
   Profile* profile() const;
 
   void OnEnclaveLoaded();
   void ContinuePendingUpgradeRequest();
 
+  const content::GlobalRenderFrameHostId frame_host_id_;
+
   raw_ptr<EnclaveManager> enclave_manager_;
   EnclaveState enclave_state_ = EnclaveState::kUnknown;
   bool pending_upgrade_request_ = false;
diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/ui/webui/chrome_web_ui_configs.cc
index 7181b71..62c6f7b 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_configs.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_configs.cc
@@ -189,6 +189,7 @@
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
 #if BUILDFLAG(ENABLE_GLIC)
+#include "chrome/browser/glic/glic_fre_ui.h"
 #include "chrome/browser/glic/glic_ui.h"
 #endif
 
@@ -388,5 +389,6 @@
 #endif  //  !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
 #if BUILDFLAG(ENABLE_GLIC)
   map.AddWebUIConfig(std::make_unique<glic::GlicUIConfig>());
+  map.AddWebUIConfig(std::make_unique<glic::GlicFreUIConfig>());
 #endif
 }
diff --git a/chrome/browser/ui/webui/download_internals/download_internals_ui.h b/chrome/browser/ui/webui/download_internals/download_internals_ui.h
index 4e07a4d..a515ef4 100644
--- a/chrome/browser/ui/webui/download_internals/download_internals_ui.h
+++ b/chrome/browser/ui/webui/download_internals/download_internals_ui.h
@@ -6,17 +6,16 @@
 #define CHROME_BROWSER_UI_WEBUI_DOWNLOAD_INTERNALS_DOWNLOAD_INTERNALS_UI_H_
 
 #include "chrome/common/webui_url_constants.h"
+#include "content/public/browser/internal_webui_config.h"
 #include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/webui_config.h"
 
 class DownloadInternalsUI;
 
 class DownloadInternalsUIConfig
-    : public content::DefaultWebUIConfig<DownloadInternalsUI> {
+    : public content::DefaultInternalWebUIConfig<DownloadInternalsUI> {
  public:
   DownloadInternalsUIConfig()
-      : DefaultWebUIConfig(content::kChromeUIScheme,
-                           chrome::kChromeUIDownloadInternalsHost) {}
+      : DefaultInternalWebUIConfig(chrome::kChromeUIDownloadInternalsHost) {}
 };
 
 // The WebUI for chrome://download-internals.
diff --git a/chrome/browser/ui/webui/local_state/DIR_METADATA b/chrome/browser/ui/webui/local_state/DIR_METADATA
new file mode 100644
index 0000000..b0fc17e
--- /dev/null
+++ b/chrome/browser/ui/webui/local_state/DIR_METADATA
@@ -0,0 +1,7 @@
+monorail: {
+  component: "Internals>Metrics>Variations"
+}
+team_email: "chromium-dev@chromium.org"
+buganizer_public: {
+  component_id: 1456342
+}
diff --git a/chrome/browser/ui/webui/local_state/OWNERS b/chrome/browser/ui/webui/local_state/OWNERS
new file mode 100644
index 0000000..9795904
--- /dev/null
+++ b/chrome/browser/ui/webui/local_state/OWNERS
@@ -0,0 +1 @@
+file://base/metrics/OWNERS
diff --git a/chrome/browser/ui/webui/local_state/local_state_ui.h b/chrome/browser/ui/webui/local_state/local_state_ui.h
index f0a7a8ea..f1d263e04 100644
--- a/chrome/browser/ui/webui/local_state/local_state_ui.h
+++ b/chrome/browser/ui/webui/local_state/local_state_ui.h
@@ -6,18 +6,18 @@
 #define CHROME_BROWSER_UI_WEBUI_LOCAL_STATE_LOCAL_STATE_UI_H_
 
 #include "chrome/common/webui_url_constants.h"
+#include "content/public/browser/internal_webui_config.h"
 #include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/webui_config.h"
 #include "content/public/common/url_constants.h"
 
 class LocalStateUI;
 
 // WebUIConfig for chrome://local-state
-class LocalStateUIConfig : public content::DefaultWebUIConfig<LocalStateUI> {
+class LocalStateUIConfig
+    : public content::DefaultInternalWebUIConfig<LocalStateUI> {
  public:
   LocalStateUIConfig()
-      : DefaultWebUIConfig(content::kChromeUIScheme,
-                           chrome::kChromeUILocalStateHost) {}
+      : DefaultInternalWebUIConfig(chrome::kChromeUILocalStateHost) {}
 };
 
 // Controller for chrome://local-state/ page.
diff --git a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
index f086f96..f6013ae 100644
--- a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
@@ -1165,7 +1165,15 @@
   EXPECT_EQ(result, kBannerHidden);
 }
 
-IN_PROC_BROWSER_TEST_P(PolicyUIManagedStatusTest, HandleLocaleNotEnUSHidden) {
+// Test is flaky on macOS. <https://crbug.com/394767577>
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_HandleLocaleNotEnUSHidden DISABLED_HandleLocaleNotEnUSHidden
+#else
+#define MAYBE_HandleLocaleNotEnUSHidden HandleLocaleNotEnUSHidden
+#endif
+
+IN_PROC_BROWSER_TEST_P(PolicyUIManagedStatusTest,
+                       MAYBE_HandleLocaleNotEnUSHidden) {
   policy::ScopedManagementServiceOverrideForTesting browser_management(
       policy::ManagementServiceFactory::GetForProfile(browser()->profile()),
       policy::EnterpriseManagementAuthority::CLOUD);
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.cc
index 2c453766..9474a8a 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.cc
@@ -18,8 +18,7 @@
       prefs::kAccessibilityReadAnythingFontName,
       string_constants::kReadAnythingPlaceholderFontName,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
-  registry->RegisterDoublePref(prefs::kAccessibilityReadAnythingFontScale,
-                               kReadAnythingDefaultFontScale,
+  registry->RegisterDoublePref(prefs::kAccessibilityReadAnythingFontScale, 1.0f,
                                user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterIntegerPref(
       prefs::kAccessibilityReadAnythingColorInfo,
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
index d0ddd0f..2f683d9 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.h"
 #include "chrome/common/read_anything/read_anything.mojom-forward.h"
 #include "chrome/common/read_anything/read_anything.mojom.h"
+#include "chrome/common/read_anything/read_anything_util.h"
 #include "components/language/core/browser/language_model.h"
 #include "components/language/core/browser/language_model_manager.h"
 #include "components/language/core/common/locale_util.h"
@@ -99,13 +100,6 @@
 constexpr ui::AXMode kReadAnythingAXMode =
     ui::kAXModeWebContentsOnly | ui::AXMode::kHTML;
 
-int GetNormalizedFontScale(double font_scale) {
-  DCHECK(font_scale >= kReadAnythingMinimumFontScale &&
-         font_scale <= kReadAnythingMaximumFontScale);
-  return (font_scale - kReadAnythingMinimumFontScale) *
-         (1 / kReadAnythingFontScaleIncrement);
-}
-
 #if BUILDFLAG(IS_CHROMEOS)
 
 InstallationState GetInstallationStateFromStatusCode(
@@ -608,9 +602,8 @@
 }
 
 void ReadAnythingUntrustedPageHandler::OnFontSizeChange(double font_size) {
-  double saved_font_size = std::min(font_size, kReadAnythingMaximumFontScale);
   profile_->GetPrefs()->SetDouble(prefs::kAccessibilityReadAnythingFontScale,
-                                  saved_font_size);
+                                  AdjustFontScale(font_size, 0));
 }
 
 void ReadAnythingUntrustedPageHandler::OnLinksEnabledChanged(bool enabled) {
@@ -927,20 +920,8 @@
   // This is called when the side panel closes, so retrieving the values from
   // preferences won't happen very often.
   PrefService* prefs = profile_->GetPrefs();
-  int maximum_font_scale_logging =
-      GetNormalizedFontScale(kReadAnythingMaximumFontScale);
-  double font_scale =
-      prefs->GetDouble(prefs::kAccessibilityReadAnythingFontScale);
-  base::UmaHistogramExactLinear(string_constants::kFontScaleHistogramName,
-                                GetNormalizedFontScale(font_scale),
-                                maximum_font_scale_logging + 1);
-  std::string font_name =
-      prefs->GetString(prefs::kAccessibilityReadAnythingFontName);
-  if (fonts::kFontInfos.contains(font_name)) {
-    base::UmaHistogramEnumeration(
-        string_constants::kFontNameHistogramName,
-        fonts::kFontInfos.at(font_name).logging_value);
-  }
+  LogFontScale(prefs->GetDouble(prefs::kAccessibilityReadAnythingFontScale));
+  LogFontName(prefs->GetString(prefs::kAccessibilityReadAnythingFontName));
   read_anything::mojom::Colors color =
       static_cast<read_anything::mojom::Colors>(
           prefs->GetInteger(prefs::kAccessibilityReadAnythingColorInfo));
diff --git a/chrome/browser/upgrade_detector/upgrade_detector.h b/chrome/browser/upgrade_detector/upgrade_detector.h
index 58055da..7487228 100644
--- a/chrome/browser/upgrade_detector/upgrade_detector.h
+++ b/chrome/browser/upgrade_detector/upgrade_detector.h
@@ -15,7 +15,7 @@
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "build/chromeos_buildflags.h"
+#include "build/build_config.h"
 #include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/prefs/pref_change_registrar.h"
 
@@ -137,7 +137,7 @@
     return critical_update_acknowledged_;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   bool is_factory_reset_required() const {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     return is_factory_reset_required_;
@@ -147,7 +147,7 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     return is_rollback_;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   UpgradeNotificationAnnoyanceLevel upgrade_notification_stage() const {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -320,7 +320,7 @@
     upgrade_notification_stage_ = stage;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void set_is_factory_reset_required(bool is_factory_reset_required) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     is_factory_reset_required_ = is_factory_reset_required;
@@ -330,7 +330,7 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     is_rollback_ = is_rollback;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
  private:
   FRIEND_TEST_ALL_PREFIXES(AppMenuModelTest, Basics);
@@ -384,7 +384,7 @@
   // for execution.
   bool pref_change_task_pending_ = false;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Whether a factory reset is needed to complete an update.
   bool is_factory_reset_required_ = false;
 
@@ -392,7 +392,7 @@
   // to an earlier version of Chrome OS, which results in the device being
   // wiped when it's rebooted.
   bool is_rollback_ = false;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   // A timer to check to see if we've been idle for long enough to show the
   // critical warning. Should only be set if |upgrade_available_| is
diff --git a/chrome/browser/upgrade_detector/upgrade_detector_impl_unittest.cc b/chrome/browser/upgrade_detector/upgrade_detector_impl_unittest.cc
index c3d3b82..8e881e3 100644
--- a/chrome/browser/upgrade_detector/upgrade_detector_impl_unittest.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector_impl_unittest.cc
@@ -17,7 +17,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/google/google_brand.h"
 #include "chrome/browser/upgrade_detector/installed_version_poller.h"
 #include "chrome/browser/upgrade_detector/upgrade_observer.h"
@@ -29,13 +28,9 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/lacros/lacros_test_helper.h"
-#endif
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_WIN)
 #include "chrome/install_static/install_modes.h"
@@ -209,13 +204,9 @@
   ScopedTestingLocalState scoped_local_state_;
   InstalledVersionPoller::ScopedDisableForTesting scoped_poller_disabler_;
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  chromeos::ScopedLacrosServiceTestHelper lacros_service_test_helper_;
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   policy::FakeBrowserDMTokenStorage dm_token_storage_;
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 };
 
 TEST_F(UpgradeDetectorImplTest, VariationsChanges) {
@@ -495,9 +486,9 @@
   }
 
  private:
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   policy::FakeBrowserDMTokenStorage dm_token_storage_;
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 };
 
 INSTANTIATE_TEST_SUITE_P(All,
diff --git a/chrome/browser/upgrade_detector/version_history_client.cc b/chrome/browser/upgrade_detector/version_history_client.cc
new file mode 100644
index 0000000..c6b9828
--- /dev/null
+++ b/chrome/browser/upgrade_detector/version_history_client.cc
@@ -0,0 +1,183 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/upgrade_detector/version_history_client.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/functional/callback.h"
+#include "base/json/json_reader.h"
+#include "base/strings/escape.h"
+#include "base/strings/stringprintf.h"
+#include "base/version_info/version_info.h"
+#include "build/build_config.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/common/channel_info.h"
+#include "net/base/load_flags.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "url/gurl.h"
+
+namespace {
+
+// Returns the name of the current channel, as ingested by the VersionHistory
+// API.
+std::string GetChannelString() {
+  if (auto name = chrome::GetChannelName(chrome::WithExtendedStable(true));
+      !name.empty() && name != "unknown") {
+    return name;
+  }
+  return "stable";
+}
+
+// Returns the URL to get version info of `version` on the current platform
+// and channel. The response contains the single release with the most recent
+// `serving.endTime`.
+GURL GetVersionReleasesUrl(base::Version version) {
+// CURRENT_PLATFORM is the platform name, as ingested by the VersionHistory API.
+// Use #define instead of a constant, so it concatenates at compile-time.
+#if BUILDFLAG(IS_WIN)
+
+#if defined(ARCH_CPU_ARM64)
+#define CURRENT_PLATFORM "win_arm64"
+#elif defined(ARCH_CPU_X86_64)
+#define CURRENT_PLATFORM "win64"
+#else
+#define CURRENT_PLATFORM "win"
+#endif
+
+#elif BUILDFLAG(IS_LINUX)
+
+#define CURRENT_PLATFORM "linux"
+
+#elif BUILDFLAG(IS_MAC)
+
+#if defined(ARCH_CPU_ARM64)
+#define CURRENT_PLATFORM "mac_arm64"
+#else
+#define CURRENT_PLATFORM "mac"
+#endif
+
+#else
+
+#error Unsupported platform
+
+#endif  // BUILDFLAG(IS_WIN)
+
+  return GURL(base::StringPrintf(
+      "https://versionhistory.googleapis.com/v1/chrome/"
+      "platforms/" CURRENT_PLATFORM
+      "/channels/%s/versions/%s/releases/?order_by=endtime%%20desc&page_size=1",
+      GetChannelString(), version.GetString()));
+#undef CURRENT_PLATFORM
+}
+
+constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+    net::DefineNetworkTrafficAnnotation("version_history", R"(
+        semantics {
+          sender: "VersionHistory Client"
+          description:
+            "Queries the VersionHistory API to know how old the "
+            "currently-running version of Chrome is. If it's older than a "
+            "threshold configured by the admin, Chrome forces a relaunch to "
+            "apply the update. Desktop Chrome only."
+          trigger:
+            "When Chrome detects that an update is available, if the "
+            "OutdatedBuildThreshold policy is set."
+          data: "The version number of the currently-running Chrome, the "
+            "update channel name, and an identifier of the platform."
+          destination: GOOGLE_OWNED_SERVICE
+          user_data {
+            type: NONE
+          }
+          internal {
+             contacts {
+               email: "cec-growth-eng@google.com"
+             }
+          }
+          last_reviewed: "2025-01-29"
+        }
+        policy {
+          cookies_allowed: NO
+          setting: "This feature cannot be disabled by settings."
+          policy_exception_justification:
+            "Feature not fully implemented yet."
+        })");
+
+// Sends a GET to `url`, and calls `callback` with the response.
+void FetchUrl(GURL url,
+              base::OnceCallback<void(std::unique_ptr<network::SimpleURLLoader>,
+                                      std::optional<std::string>)> callback) {
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory =
+      g_browser_process->shared_url_loader_factory();
+
+  auto request = std::make_unique<network::ResourceRequest>();
+  request->url = std::move(url);
+  request->load_flags = net::LOAD_DISABLE_CACHE | net::LOAD_BYPASS_CACHE;
+  request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+  request->priority = net::IDLE;
+
+  std::unique_ptr<network::SimpleURLLoader> url_loader =
+      network::SimpleURLLoader::Create(std::move(request), kTrafficAnnotation);
+  url_loader->SetRetryOptions(
+      /*max_retries=*/3,
+      network::SimpleURLLoader::RetryMode::RETRY_ON_NETWORK_CHANGE);
+
+  network::SimpleURLLoader* url_loader_raw = url_loader.get();
+  // Move `url_loader` to the callback so the request can finish.
+  url_loader_raw->DownloadToString(
+      url_loader_factory.get(),
+      base::BindOnce(std::move(callback), std::move(url_loader)),
+      /*max_body_size=*/1024 * 1024);
+}
+
+// Parses and extract the most recent `serving.endTime` from `raw_data` JSON.
+std::optional<base::Time> OnVersionReleasesFetched(
+    std::unique_ptr<network::SimpleURLLoader> url_loader,
+    std::optional<std::string> raw_data) {
+  if (!raw_data) {
+    return std::nullopt;
+  }
+
+  std::optional<base::Value::Dict> json = base::JSONReader::ReadDict(*raw_data);
+  if (!json) {
+    return std::nullopt;
+  }
+
+  const base::Value::List* releases = json->FindList("releases");
+  if (!releases || releases->empty()) {
+    return std::nullopt;
+  }
+
+  // The first element is always the most recent, due to the "order_by" query
+  // parameter.
+  const base::Value& most_recent_release = releases->front();
+  if (!most_recent_release.is_dict()) {
+    return std::nullopt;
+  }
+
+  const std::string* end_time =
+      most_recent_release.GetDict().FindStringByDottedPath("serving.endTime");
+  if (!end_time) {
+    // Builds with no end-time are still serving, so they're not outdated.
+    return std::nullopt;
+  }
+
+  base::Time time;
+  if (!base::Time::FromUTCString(end_time->c_str(), &time)) {
+    return std::nullopt;
+  }
+
+  return time;
+}
+
+}  // namespace
+
+void GetLastServedDate(base::Version version, LastServedDateCallback callback) {
+  FetchUrl(GetVersionReleasesUrl(std::move(version)),
+           base::BindOnce(&OnVersionReleasesFetched).Then(std::move(callback)));
+}
diff --git a/chrome/browser/upgrade_detector/version_history_client.h b/chrome/browser/upgrade_detector/version_history_client.h
new file mode 100644
index 0000000..d585da5b
--- /dev/null
+++ b/chrome/browser/upgrade_detector/version_history_client.h
@@ -0,0 +1,21 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_VERSION_HISTORY_CLIENT_H_
+#define CHROME_BROWSER_UPGRADE_DETECTOR_VERSION_HISTORY_CLIENT_H_
+
+#include <optional>
+
+#include "base/functional/callback_forward.h"
+#include "base/time/time.h"
+#include "base/version.h"
+
+using LastServedDateCallback =
+    base::OnceCallback<void(std::optional<base::Time>)>;
+
+// Returns the most recent time `version` was still served to anyone, based on
+// the VersionHistory API.
+void GetLastServedDate(base::Version version, LastServedDateCallback callback);
+
+#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_VERSION_HISTORY_CLIENT_H_
diff --git a/chrome/browser/upgrade_detector/version_history_client_unittest.cc b/chrome/browser/upgrade_detector/version_history_client_unittest.cc
new file mode 100644
index 0000000..0861cfd2
--- /dev/null
+++ b/chrome/browser/upgrade_detector/version_history_client_unittest.cc
@@ -0,0 +1,198 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/upgrade_detector/version_history_client.h"
+
+#include <string_view>
+#include <utility>
+
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "build/build_config.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class VersionHistoryClientTest : public ::testing::Test {
+ protected:
+  void SetUp() override {
+    TestingBrowserProcess::GetGlobal()->SetSharedURLLoaderFactory(
+        url_loader_factory_.GetSafeWeakWrapper());
+  }
+
+  network::TestURLLoaderFactory& url_loader_factory() {
+    return url_loader_factory_;
+  }
+
+  void SetAPIResponse(const GURL& url,
+                      net::HttpStatusCode status_code,
+                      std::string_view content) {
+    network::mojom::URLResponseHeadPtr head =
+        network::CreateURLResponseHead(status_code);
+    head->mime_type = "application/json";
+    network::URLLoaderCompletionStatus status;
+    url_loader_factory().AddResponse(url, std::move(head), content, status);
+  }
+
+ private:
+  base::test::TaskEnvironment task_environment_;
+
+  network::TestURLLoaderFactory url_loader_factory_;
+};
+
+#if BUILDFLAG(IS_WIN)
+
+#if defined(ARCH_CPU_ARM64)
+#define CURRENT_PLATFORM "win_arm64"
+#elif defined(ARCH_CPU_X86_64)
+#define CURRENT_PLATFORM "win64"
+#else
+#define CURRENT_PLATFORM "win"
+#endif
+
+#elif BUILDFLAG(IS_LINUX)
+
+#define CURRENT_PLATFORM "linux"
+
+#elif BUILDFLAG(IS_MAC)
+
+#if defined(ARCH_CPU_ARM64)
+#define CURRENT_PLATFORM "mac_arm64"
+#else
+#define CURRENT_PLATFORM "mac"
+#endif
+
+#else
+
+#error Unsupported platform
+
+#endif  // BUILDFLAG(IS_WIN)
+
+// Tests that GetLastServedDate() returns the correct date when the server is
+// responsive.
+TEST_F(VersionHistoryClientTest, GetLastServedDateSimple) {
+  SetAPIResponse(GURL("https://versionhistory.googleapis.com/v1/chrome/"
+                      "platforms/" CURRENT_PLATFORM
+                      "/channels/stable/versions/131.0.6778.205/releases/"
+                      "?order_by=endtime%20desc&page_size=1"),
+                 net::HTTP_OK, R"({
+        "releases": [
+          {
+            "name": "chrome/platforms/win/channels/stable/versions/131.0.6778.205/releases/1736364451",
+            "serving": {
+              "startTime": "2025-01-08T19:27:31.216008Z",
+              "endTime": "2025-01-09T21:01:31.167025Z"
+            },
+            "fraction": 0.4975,
+            "version": "131.0.6778.205",
+            "fractionGroup": "144",
+            "pinnable": false
+          }
+        ]
+      })");
+
+  base::Time expected_time;
+  ASSERT_TRUE(
+      base::Time::FromUTCString("2025-01-09T21:01:31.167025Z", &expected_time));
+
+  base::RunLoop run_loop;
+  LastServedDateCallback callback =
+      base::BindLambdaForTesting([&](std::optional<base::Time> last_served) {
+        EXPECT_EQ(expected_time, last_served);
+        run_loop.Quit();
+      });
+  GetLastServedDate(base::Version("131.0.6778.205"), std::move(callback));
+  run_loop.Run();
+}
+
+// Tests that GetLastServedDate() returns nullopt when the server returns a 404.
+TEST_F(VersionHistoryClientTest, GetLastServedDate404) {
+  SetAPIResponse(GURL("https://versionhistory.googleapis.com/v1/chrome/"
+                      "platforms/" CURRENT_PLATFORM
+                      "/channels/stable/versions/131.0.6778.205/releases/"
+                      "?order_by=endtime%20desc&page_size=1"),
+                 net::HTTP_NOT_FOUND, "");
+
+  base::RunLoop run_loop;
+  LastServedDateCallback callback =
+      base::BindLambdaForTesting([&](std::optional<base::Time> last_served) {
+        EXPECT_EQ(std::nullopt, last_served);
+        run_loop.Quit();
+      });
+  GetLastServedDate(base::Version("131.0.6778.205"), std::move(callback));
+  run_loop.Run();
+}
+
+// Tests that GetLastServedDate() returns nullopt when the server returns
+// invalid JSON.
+TEST_F(VersionHistoryClientTest, GetLastServedDateInvalidJSON) {
+  SetAPIResponse(GURL("https://versionhistory.googleapis.com/v1/chrome/"
+                      "platforms/" CURRENT_PLATFORM
+                      "/channels/stable/versions/131.0.6778.205/releases/"
+                      "?order_by=endtime%20desc&page_size=1"),
+                 net::HTTP_OK, "invalid JSON");
+
+  base::RunLoop run_loop;
+  LastServedDateCallback callback =
+      base::BindLambdaForTesting([&](std::optional<base::Time> last_served) {
+        EXPECT_EQ(std::nullopt, last_served);
+        run_loop.Quit();
+      });
+  GetLastServedDate(base::Version("131.0.6778.205"), std::move(callback));
+  run_loop.Run();
+}
+
+// Tests that GetLastServedDate() returns nullopt when the server returns a
+// response with a missing endTime.
+TEST_F(VersionHistoryClientTest, GetLastServedDateMissingEndTime) {
+  SetAPIResponse(GURL("https://versionhistory.googleapis.com/v1/chrome/"
+                      "platforms/" CURRENT_PLATFORM
+                      "/channels/stable/versions/131.0.6778.205/releases/"
+                      "?order_by=endtime%20desc&page_size=1"),
+                 net::HTTP_OK, R"({
+        "releases": [
+          {
+            "name": "chrome/platforms/win/channels/stable/versions/131.0.6778.205/releases/1736364451",
+            "serving": {
+              "startTime": "2025-01-08T19:27:31.216008Z"
+            },
+            "fraction": 0.4975,
+            "version": "131.0.6778.205",
+            "fractionGroup": "144",
+            "pinnable": false
+          }
+        ]
+      })");
+
+  base::RunLoop run_loop;
+  LastServedDateCallback callback =
+      base::BindLambdaForTesting([&](std::optional<base::Time> last_served) {
+        EXPECT_EQ(std::nullopt, last_served);
+        run_loop.Quit();
+      });
+  GetLastServedDate(base::Version("131.0.6778.205"), std::move(callback));
+  run_loop.Run();
+}
+
+// Tests that GetLastServedDate() returns nullopt when the server returns a
+// response with an empty releases array.
+TEST_F(VersionHistoryClientTest, GetLastServedDateEmptyReleases) {
+  SetAPIResponse(GURL("https://versionhistory.googleapis.com/v1/chrome/"
+                      "platforms/" CURRENT_PLATFORM
+                      "/channels/stable/versions/131.0.6778.205/releases/"
+                      "?order_by=endtime%20desc&page_size=1"),
+                 net::HTTP_OK, R"({"releases":[]})");
+
+  base::RunLoop run_loop;
+  LastServedDateCallback callback =
+      base::BindLambdaForTesting([&](std::optional<base::Time> last_served) {
+        EXPECT_EQ(std::nullopt, last_served);
+        run_loop.Quit();
+      });
+  GetLastServedDate(base::Version("131.0.6778.205"), std::move(callback));
+  run_loop.Run();
+}
diff --git a/chrome/browser/user_education/user_education_service_factory.cc b/chrome/browser/user_education/user_education_service_factory.cc
index 49b86954..db606fd 100644
--- a/chrome/browser/user_education/user_education_service_factory.cc
+++ b/chrome/browser/user_education/user_education_service_factory.cc
@@ -124,11 +124,6 @@
     return false;
   }
 #endif
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (profiles::IsWebKioskSession()) {
-    return false;
-  }
-#endif
   if (headless::IsHeadlessMode()) {
     return false;
   }
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager.h
index 5612e0d..109333c 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager.h
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager.h
@@ -51,7 +51,8 @@
 class WebAppProvider;
 
 namespace {
-constexpr base::TimeDelta kDefaultUpdateDiscoveryFrequency = base::Hours(5);
+inline constexpr base::TimeDelta kDefaultUpdateDiscoveryFrequency =
+    base::Hours(5);
 }
 
 // This enum lists the error types that can occur during the update of an
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_server_mixin.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_server_mixin.h
index c4359e6..524683c 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_server_mixin.h
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_server_mixin.h
@@ -18,8 +18,6 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "url/gurl.h"
 
-class InProcessBrowserTest;
-
 namespace web_app {
 
 class BundledIsolatedWebApp;
diff --git a/chrome/browser/web_applications/isolated_web_apps/key_distribution/iwa_key_distribution_info_provider.h b/chrome/browser/web_applications/isolated_web_apps/key_distribution/iwa_key_distribution_info_provider.h
index f800955ce..66ff4c6 100644
--- a/chrome/browser/web_applications/isolated_web_apps/key_distribution/iwa_key_distribution_info_provider.h
+++ b/chrome/browser/web_applications/isolated_web_apps/key_distribution/iwa_key_distribution_info_provider.h
@@ -29,7 +29,6 @@
 
 namespace web_app {
 
-class IsolatedWebAppPolicyManager;
 class IwaInternalsHandler;
 
 // Enables the key distribution dev mode UI on chrome://web-app-internals.
diff --git a/chrome/browser/web_applications/manifest_update_utils.h b/chrome/browser/web_applications/manifest_update_utils.h
index 44237c5..b2dd14b 100644
--- a/chrome/browser/web_applications/manifest_update_utils.h
+++ b/chrome/browser/web_applications/manifest_update_utils.h
@@ -19,7 +19,8 @@
 class WebApp;
 class WebAppRegistrar;
 
-constexpr SquareSizePx kIdentitySizes[] = {kInstallIconSize, kLauncherIconSize};
+inline constexpr SquareSizePx kIdentitySizes[] = {kInstallIconSize,
+                                                  kLauncherIconSize};
 
 // This enum is recorded by UMA, the numeric values must not change.
 enum class ManifestUpdateResult {
diff --git a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc
index f681f898..e654e2fd 100644
--- a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc
+++ b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc
@@ -71,7 +71,8 @@
   }
 
   // Ensures that URLAssociations entries are created for a given protocol.
-  // "HKEY_CURRENT_USER\Software\<prog_id>\Capabilities\URLAssociations\<protocol>".
+  // "HKEY_CURRENT_USER\Software\<prog_id>\Capabilities\
+  // URLAssociations\<protocol>".
   bool ProgIdRegisteredForProtocol(const std::string& protocol,
                                    const webapps::AppId& app_id,
                                    Profile* profile) {
diff --git a/chrome/browser/web_applications/web_app_constants.h b/chrome/browser/web_applications/web_app_constants.h
index 74afe9c3..6e6a7b3 100644
--- a/chrome/browser/web_applications/web_app_constants.h
+++ b/chrome/browser/web_applications/web_app_constants.h
@@ -111,10 +111,10 @@
 
 // Icon size in pixels.
 // Small icons are used in confirmation dialogs and app windows.
-constexpr int kWebAppIconSmall = 32;
+inline constexpr int kWebAppIconSmall = 32;
 
 // Limit on the number of jump list entries per web app.
-constexpr size_t kMaxApplicationDockMenuItems = 10;
+inline constexpr size_t kMaxApplicationDockMenuItems = 10;
 
 using DisplayMode = blink::mojom::DisplayMode;
 
@@ -151,7 +151,7 @@
 
 // Default threshold for site engagement score if it's not set by field trial
 // param.
-constexpr int kIphFieldTrialParamDefaultSiteEngagementThreshold = 10;
+inline constexpr int kIphFieldTrialParamDefaultSiteEngagementThreshold = 10;
 
 // Expected file handler update actions to be taken by OsIntegrationManager
 // during UpdateOsHooks.
diff --git a/chrome/browser/web_applications/web_app_icon_generator.h b/chrome/browser/web_applications/web_app_icon_generator.h
index b87cd0c..9640c64c 100644
--- a/chrome/browser/web_applications/web_app_icon_generator.h
+++ b/chrome/browser/web_applications/web_app_icon_generator.h
@@ -39,14 +39,14 @@
 }  // namespace icon_size
 
 #if BUILDFLAG(IS_MAC)
-constexpr int kInstallIconSize = icon_size::k96;
-constexpr int kLauncherIconSize = icon_size::k256;
+inline constexpr int kInstallIconSize = icon_size::k96;
+inline constexpr int kLauncherIconSize = icon_size::k256;
 #elif BUILDFLAG(IS_CHROMEOS)
-constexpr int kInstallIconSize = icon_size::k96;
-constexpr int kLauncherIconSize = icon_size::k128;
+inline constexpr int kInstallIconSize = icon_size::k96;
+inline constexpr int kLauncherIconSize = icon_size::k128;
 #else
-constexpr int kInstallIconSize = icon_size::k48;
-constexpr int kLauncherIconSize = icon_size::k128;
+inline constexpr int kInstallIconSize = icon_size::k48;
+inline constexpr int kLauncherIconSize = icon_size::k128;
 #endif
 
 using SizeToBitmap = std::map<SquareSizePx, SkBitmap>;
diff --git a/chrome/browser/web_applications/web_app_utils.h b/chrome/browser/web_applications/web_app_utils.h
index 1e49f14..2dcd328d 100644
--- a/chrome/browser/web_applications/web_app_utils.h
+++ b/chrome/browser/web_applications/web_app_utils.h
@@ -152,7 +152,7 @@
 // Returns whether the `login_mode` should force a start at OS login.
 bool IsRunOnOsLoginModeEnabledForAutostart(RunOnOsLoginMode login_mode);
 
-constexpr char kAppSettingsPageEntryPointsHistogramName[] =
+inline constexpr char kAppSettingsPageEntryPointsHistogramName[] =
     "WebApp.AppSettingsPage.EntryPoints";
 
 // These are used in histograms, do not remove/renumber entries. If you're
diff --git a/chrome/browser/webapps/web_app_offline_browsertest.cc b/chrome/browser/webapps/web_app_offline_browsertest.cc
index 4dc1470..e4cbde5 100644
--- a/chrome/browser/webapps/web_app_offline_browsertest.cc
+++ b/chrome/browser/webapps/web_app_offline_browsertest.cc
@@ -39,7 +39,7 @@
 #include "base/win/windows_version.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/public/cpp/style/dark_light_mode_controller.h"
 #endif
 
@@ -376,7 +376,7 @@
 
   void SetUpOnMainThread() override {
     WebAppOfflineTest::SetUpOnMainThread();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // Explicitly set dark mode in ChromeOS or we can't get light mode after
     // sunset (due to dark mode auto-scheduling).
     ash::DarkLightModeController::Get()->SetDarkModeEnabledForTest(
@@ -396,8 +396,8 @@
 
 // Testing offline page in dark mode for a web app with a manifest and no
 // service worker.
-// TODO(crbug.com/40871921): tests are flaky on Lacros and Linux.
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+// TODO(crbug.com/40871921): tests are flaky on Linux.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_WebAppOfflineDarkModeNoServiceWorker \
   DISABLED_WebAppOfflineDarkModeNoServiceWorker
 #else
@@ -457,8 +457,8 @@
 
 // Testing offline page in dark mode for a web app with a manifest and service
 // worker that does not handle offline error.
-// TODO(crbug.com/40871921): tests are flaky on Lacros and Linux.
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+// TODO(crbug.com/40871921): tests are flaky on Linux.
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_WebAppOfflineDarkModeEmptyServiceWorker \
   DISABLED_WebAppOfflineDarkModeEmptyServiceWorker
 #else
diff --git a/chrome/browser/webauthn/android/cable_module_android.cc b/chrome/browser/webauthn/android/cable_module_android.cc
index 56b40fc..ca4af51 100644
--- a/chrome/browser/webauthn/android/cable_module_android.cc
+++ b/chrome/browser/webauthn/android/cable_module_android.cc
@@ -58,10 +58,6 @@
 
 namespace {
 
-// kRootSecretPrefName is the name of a string preference that is kept in the
-// browser's local state and which stores the base64-encoded root secret for
-// the authenticator.
-const char kRootSecretPrefName[] = "webauthn.authenticator_root_secret";
 const char kSerializedPaaskFieldsName[] = "webauthn.authenticator_info";
 
 const char kWorkProfilePrefName[] = "webauthn.in_work_profile";
@@ -88,17 +84,6 @@
         GetDriver(), type, std::move(on_ready), std::move(event_callback));
   }
 
-  std::string GetRootSecret() override {
-    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-    return g_browser_process->local_state()->GetString(kRootSecretPrefName);
-  }
-
-  void SetRootSecret(std::string secret) override {
-    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-    g_browser_process->local_state()->SetString(kRootSecretPrefName,
-                                                std::move(secret));
-  }
-
   void CanDeviceSupportCable(base::OnceCallback<void(bool)> callback) override {
     DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     base::ThreadPool::PostTaskAndReplyWithResult(
@@ -414,7 +399,6 @@
 }
 
 void RegisterLocalState(PrefRegistrySimple* registry) {
-  registry->RegisterStringPref(kRootSecretPrefName, std::string());
   registry->RegisterStringPref(kSerializedPaaskFieldsName, std::string());
   registry->RegisterStringPref(kWorkProfilePrefName, std::string());
 }
diff --git a/chrome/browser/webauthn/android/cable_registration_state.cc b/chrome/browser/webauthn/android/cable_registration_state.cc
index a31d98b..1a95db7 100644
--- a/chrome/browser/webauthn/android/cable_registration_state.cc
+++ b/chrome/browser/webauthn/android/cable_registration_state.cc
@@ -43,23 +43,6 @@
       &RegistrationState::OnDeviceSupportResult, base::Unretained(this)));
   interface_->AmInWorkProfile(base::BindOnce(
       &RegistrationState::OnWorkProfileResult, base::Unretained(this)));
-
-  std::string secret_base64 = interface_->GetRootSecret();
-
-  if (!secret_base64.empty()) {
-    std::string secret_str;
-    if (base::Base64Decode(secret_base64, &secret_str) &&
-        secret_str.size() == secret_.size()) {
-      memcpy(secret_.data(), secret_str.data(), secret_.size());
-    } else {
-      secret_base64.clear();
-    }
-  }
-
-  if (secret_base64.empty()) {
-    crypto::RandBytes(secret_);
-    interface_->SetRootSecret(base::Base64Encode(secret_));
-  }
 }
 
 // have_data_for_sync returns true if this object has loaded enough state to
diff --git a/chrome/browser/webauthn/android/cable_registration_state.h b/chrome/browser/webauthn/android/cable_registration_state.h
index c066caf4..1db0de6 100644
--- a/chrome/browser/webauthn/android/cable_registration_state.h
+++ b/chrome/browser/webauthn/android/cable_registration_state.h
@@ -15,15 +15,15 @@
 
 namespace webauthn::authenticator {
 
-// RegistrationState is a singleton object that loads an install-wide secret at
-// startup and holds two FCM registrations. One registration, the "linking"
-// registration, is used when the user links with another device by scanning a
-// QR code. The second is advertised via Sync for other devices signed into the
-// same account. The reason for having two registrations is that the linking
-// registration can be rotated if the user wishes to unlink all QR-linked
-// devices. But we don't want to break synced peers when that happens. Instead,
-// for synced peers we require that they have received a recent sync status from
-// this device, i.e. we rotate them automatically.
+// RegistrationState is a singleton object that holds two FCM registrations when
+// required. One registration, the "linking" registration, is used when the user
+// links with another device by scanning a QR code. The second is advertised via
+// Sync for other devices signed into the same account. The reason for having
+// two registrations is that the linking registration can be rotated if the user
+// wishes to unlink all QR-linked devices. But we don't want to break synced
+// peers when that happens. Instead, for synced peers we require that they have
+// received a recent sync status from this device, i.e. we rotate them
+// automatically.
 class RegistrationState {
  public:
   // SystemInterface abstracts the rest of the system. This is mocked out for
@@ -42,13 +42,6 @@
                  device::cablev2::authenticator::Registration::Event>)>
             event_callback) = 0;
 
-    // Returns the previous value passed to `SetRootSecret`.
-    virtual std::string GetRootSecret() = 0;
-
-    // Persist a short opaque string on disk, such that other applications
-    // cannot access it.
-    virtual void SetRootSecret(std::string secret) = 0;
-
     // Test whether the current device is suitable for prelinking.
     virtual void CanDeviceSupportCable(
         base::OnceCallback<void(bool)> callback) = 0;
@@ -80,7 +73,6 @@
   device::cablev2::authenticator::Registration* sync_registration() const {
     return sync_registration_.get();
   }
-  const std::array<uint8_t, 32>& secret() const { return secret_; }
   bool device_supports_cable() const { return *device_supports_cable_; }
   bool am_in_work_profile() const { return *am_in_work_profile_; }
   const std::optional<std::vector<uint8_t>>& link_data_from_play_services()
@@ -129,7 +121,6 @@
       linking_registration_;
   std::unique_ptr<device::cablev2::authenticator::Registration>
       sync_registration_;
-  std::array<uint8_t, 32> secret_;
   std::unique_ptr<device::cablev2::authenticator::Registration::Event>
       pending_event_;
   // device_supports_cable_ caches the result of a Java function that checks
diff --git a/chrome/browser/webauthn/android/cable_registration_state_unittest.cc b/chrome/browser/webauthn/android/cable_registration_state_unittest.cc
index cfb20d2..11b4b8c 100644
--- a/chrome/browser/webauthn/android/cable_registration_state_unittest.cc
+++ b/chrome/browser/webauthn/android/cable_registration_state_unittest.cc
@@ -60,12 +60,6 @@
     return registration;
   }
 
-  std::string GetRootSecret() override { return root_secret_; }
-
-  void SetRootSecret(std::string secret) override {
-    root_secret_ = std::move(secret);
-  }
-
   void CanDeviceSupportCable(base::OnceCallback<void(bool)> callback) override {
     CHECK(!support_callback_);
     support_callback_ = std::move(callback);
@@ -87,7 +81,6 @@
     prelink_callback_ = std::move(callback);
   }
 
-  std::string root_secret_;
   raw_ptr<TestRegistration> linking_registration_ = nullptr;
   raw_ptr<TestRegistration> syncing_registration_ = nullptr;
   bool refresh_local_device_info_called_ = false;
@@ -117,27 +110,6 @@
   std::unique_ptr<RegistrationState> state_;
 };
 
-constexpr unsigned kLengthOf32BytesBase64Encoded = 44;
-
-TEST_F(CableRegistrationStateTest, EmptySecret) {
-  state_->Register();
-  // 44 is the length of a 32-byte secret, base64-encoded.
-  EXPECT_EQ(interface_->root_secret_.size(), kLengthOf32BytesBase64Encoded);
-}
-
-TEST_F(CableRegistrationStateTest, WrongLengthSecret) {
-  interface_->root_secret_ = "AAAA";
-  state_->Register();
-  EXPECT_EQ(interface_->root_secret_.size(), kLengthOf32BytesBase64Encoded);
-}
-
-TEST_F(CableRegistrationStateTest, SecretMaintained) {
-  const std::string secret = "zs0gi/qLipq53eg24sccdaPKcpSEgSwE0Jd9kZLj4DU=";
-  interface_->root_secret_ = secret;
-  state_->Register();
-  EXPECT_EQ(interface_->root_secret_, secret);
-}
-
 TEST_F(CableRegistrationStateTest, HaveDataForSync) {
   state_->Register();
   EXPECT_FALSE(state_->have_data_for_sync());
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_controller.cc b/chrome/browser/webauthn/authenticator_request_dialog_controller.cc
index e386b54..a5a6b2d3 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_controller.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_controller.cc
@@ -74,6 +74,7 @@
 #include "device/fido/features.h"
 #include "device/fido/fido_authenticator.h"
 #include "device/fido/fido_constants.h"
+#include "device/fido/fido_discovery_factory.h"
 #include "device/fido/fido_request_handler_base.h"
 #include "device/fido/fido_transport_protocol.h"
 #include "device/fido/fido_types.h"
@@ -1735,6 +1736,17 @@
   }
 }
 
+void AuthenticatorRequestDialogController::InitializeEnclaveRequestCallback(
+    device::FidoDiscoveryFactory* discovery_factory) {
+  CHECK(!enclave_request_callback_);
+
+  using EnclaveEventStream = device::FidoDiscoveryBase::EventStream<
+      std::unique_ptr<device::enclave::CredentialRequest>>;
+  std::unique_ptr<EnclaveEventStream> event_stream;
+  std::tie(enclave_request_callback_, event_stream) = EnclaveEventStream::New();
+  discovery_factory->set_enclave_ui_request_stream(std::move(event_stream));
+}
+
 void AuthenticatorRequestDialogController::MaybeStartChallengeFetch() {
   if (!challenge_callback_) {
     return;
@@ -2560,14 +2572,15 @@
 }
 
 void AuthenticatorRequestDialogController::StartPasskeyUpgradeRequest() {
-  auto* controller =
-      PasskeyUpgradeRequestController::GetOrCreateForCurrentDocument(
-          GetRenderFrameHost());
+  CHECK(enclave_request_callback_);
   if (!model_->user_entity.name) {
     FIDO_LOG(ERROR) << "Ignoring passkey upgrade request: empty username";
     return;
   }
-  controller->TryUpgradePasswordToPasskey(
+  passkey_upgrade_request_controller_ =
+      std::make_unique<PasskeyUpgradeRequestController>(
+          GetRenderFrameHost(), std::move(enclave_request_callback_));
+  passkey_upgrade_request_controller_->TryUpgradePasswordToPasskey(
       model_->relying_party_id, *model_->user_entity.name,
       base::BindOnce(
           [](base::WeakPtr<AuthenticatorRequestDialogController> controller,
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_controller.h b/chrome/browser/webauthn/authenticator_request_dialog_controller.h
index a1b689b..99ad53e 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_controller.h
+++ b/chrome/browser/webauthn/authenticator_request_dialog_controller.h
@@ -16,6 +16,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/ui/webauthn/passkey_upgrade_request_controller.h"
 #include "chrome/browser/webauthn/authenticator_request_dialog_model.h"
 #include "chrome/browser/webauthn/authenticator_transport.h"
 #include "chrome/browser/webauthn/password_credential_controller.h"
@@ -27,6 +28,7 @@
 #include "url/gurl.h"
 
 class ChallengeUrlFetcher;
+class PasskeyUpgradeRequestController;
 class Profile;
 
 namespace content {
@@ -43,6 +45,8 @@
   using RequestCallback = device::FidoRequestHandlerBase::RequestCallback;
   using BlePermissionCallback = base::RepeatingCallback<void(
       device::FidoRequestHandlerBase::BlePermissionCallback)>;
+  using EnclaveRequestCallback = base::RepeatingCallback<void(
+      std::unique_ptr<device::enclave::CredentialRequest>)>;
 
   AuthenticatorRequestDialogController(
       AuthenticatorRequestDialogModel* model,
@@ -359,6 +363,9 @@
       base::OnceCallback<void(std::optional<base::span<const uint8_t>>)>
           callback);
 
+  void InitializeEnclaveRequestCallback(
+      device::FidoDiscoveryFactory* discovery_factory);
+
   base::WeakPtr<AuthenticatorRequestDialogController> GetWeakPtr();
 
  private:
@@ -623,6 +630,10 @@
                           webauthn::PasskeyModel::Observer>
       passkey_model_observation_{this};
 
+  EnclaveRequestCallback enclave_request_callback_;
+  std::unique_ptr<PasskeyUpgradeRequestController>
+      passkey_upgrade_request_controller_;
+
   base::WeakPtrFactory<AuthenticatorRequestDialogController> weak_factory_{
       this};
 };
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index 0294d3df..93318dc 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -527,12 +527,10 @@
     if (dialog_controller_->ui_presentation() ==
             UIPresentation::kPasskeyUpgrade &&
         enclave_create_enabled) {
-      // Set up the upgrade request controller. This handles enclave
-      // transactions in place of the "regular" GPMEnclaveController.
+      // PasskeyUpgradeRequestController will handle enclave transactions in
+      // place of the "regular" GPMEnclaveController.
       CHECK(!enclave_controller_);
-      PasskeyUpgradeRequestController::GetOrCreateForCurrentDocument(
-          GetRenderFrameHost())
-          ->InitializeEnclaveRequestCallback(discovery_factory);
+      dialog_controller_->InitializeEnclaveRequestCallback(discovery_factory);
       discovery_factory->set_network_context_factory(base::BindRepeating([]() {
         return SystemNetworkContextManager::GetInstance()->GetContext();
       }));
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index d1721114..d77649b 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1739966264-2777c96d424e8786f1a1b775b572b12005090db1-4b5fcdcc5c6858aa332584d26ee4a5c9599fce6e.profdata
+chrome-android32-main-1740031060-259a1d9dda5b20448fb5662328a91fb80f4020e3-681114348069231d7bb907a423a2405bb90fa70b.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 96e77fe..f157252 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1739980124-108c9c9f617f738d301f291de94897b3d50eb6a2-2aa27639429f31fdcbd7bb3fbfa13d42bd447c5c.profdata
+chrome-android64-main-1740035894-31b460e1ae2432d3f7cc20f59a01b015929424ac-1ea997a1c6c77394a7805c3cbf2891a060da810b.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index ea6d3db..5bee74d 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1739966264-e1af1fc2a0fe6538194f62bca377867963a94896-4b5fcdcc5c6858aa332584d26ee4a5c9599fce6e.profdata
+chrome-linux-main-1740031060-c65459afd33104db5c74d5f963835a55c3f31490-681114348069231d7bb907a423a2405bb90fa70b.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 867b6a0..7c769f0 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1739966264-ea92ed3c38f639e72e246224557d20a3a8f34809-4b5fcdcc5c6858aa332584d26ee4a5c9599fce6e.profdata
+chrome-mac-main-1740031060-98b190414563ee8d772afe9bef23df1e91b93a9f-681114348069231d7bb907a423a2405bb90fa70b.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 9059573..6f25e9b 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1739966264-08e873c4e1a905851de5b1c242ab265ab5790609-4b5fcdcc5c6858aa332584d26ee4a5c9599fce6e.profdata
+chrome-win-arm64-main-1740031060-7d01e8f8b1ac45668f2ff91849ec51c345d1ba66-681114348069231d7bb907a423a2405bb90fa70b.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index c7f4d28..ee442ce 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1739955385-8ece9eb063b0978f35b6f12dd711e73bc636a780-b61f8745c0588198029e2d9f6a888d6aeb9f748d.profdata
+chrome-win32-main-1740009497-83c8dad6fb0c7ec0ad530fef46c09f2d82e0f9aa-4856eb27578cd33fba82b644cd8651ad7170eccc.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 59851ea..b624cb7b 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1739966264-94907b96308725d0f8d056842830f54c30fc2792-4b5fcdcc5c6858aa332584d26ee4a5c9599fce6e.profdata
+chrome-win64-main-1740009497-d13556214096f99790bb1910aaaa915043638c84-4856eb27578cd33fba82b644cd8651ad7170eccc.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index 0e505cee..98745f8 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -520,11 +520,13 @@
     if (enable_glic) {
       sources += [
         "$root_gen_dir/chrome/browser/glic/resources/glic_browser_resources.pak",
+        "$root_gen_dir/chrome/glic_fre_resources.pak",
         "$root_gen_dir/chrome/glic_resources.pak",
       ]
       deps += [
         "//chrome/browser/glic/resources:browser_resources",
         "//chrome/browser/resources/glic:resources",
+        "//chrome/browser/resources/glic/fre:resources",
       ]
     }
 
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index d783213..a85c3b1 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -365,6 +365,8 @@
     sources += [
       "read_anything/read_anything_constants.cc",
       "read_anything/read_anything_constants.h",
+      "read_anything/read_anything_util.cc",
+      "read_anything/read_anything_util.h",
     ]
   }
 
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index b783379..620bfc5 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -335,6 +335,11 @@
 const base::FeatureParam<int> kGlicMaxLoadingTimeMs{
     &kGlic, "glic-max-loading-time-ms", 15000};
 
+const base::FeatureParam<int> kGlicInitialWidth{&kGlic, "glic-initial-width",
+                                                350};
+const base::FeatureParam<int> kGlicInitialHeight{&kGlic, "glic-initial-height",
+                                                 48};
+
 BASE_FEATURE(kGlicURLConfig,
              "GlicURLConfig",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 908663c..7c7332d 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -213,6 +213,10 @@
 extern const base::FeatureParam<int> kGlicMinLoadingTimeMs;
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::FeatureParam<int> kGlicMaxLoadingTimeMs;
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::FeatureParam<int> kGlicInitialWidth;
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::FeatureParam<int> kGlicInitialHeight;
 
 COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kGlicURLConfig);
 COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json
index b287843..ab97149 100644
--- a/chrome/common/extensions/api/_api_features.json
+++ b/chrome/common/extensions/api/_api_features.json
@@ -220,6 +220,7 @@
       "chrome://add-supervision/*",
       "chrome://chrome-signin/*",
       "chrome://glic/*",
+      "chrome://glic-fre/*",
       "chrome://graduation/*",
       "chrome://mobilesetup/*",
       "chrome://oobe/*",
@@ -440,9 +441,6 @@
   "enterprise.reportingPrivate.getHotfixes": {
     "platforms": ["win"]
   },
-  "enterprise.reportingPrivate.reportDataMaskingEvent": {
-    "feature_flag": "ApiEnterpriseReportingPrivateReportDataMaskingEvent"
-  },
   "experimental.devtools.audits": {
     "nocompile": true,
     "dependencies": ["permission:experimental", "manifest:devtools_page"],
diff --git a/chrome/common/read_anything/read_anything_constants.cc b/chrome/common/read_anything/read_anything_constants.cc
index 75cda20d..1406fe4 100644
--- a/chrome/common/read_anything/read_anything_constants.cc
+++ b/chrome/common/read_anything/read_anything_constants.cc
@@ -32,20 +32,3 @@
 
 const char kReadingModeName[] = "Reading mode";
 }  // namespace string_constants
-
-namespace fonts {
-
-const base::fixed_flat_map<std::string_view, FontInfo, 9> kFontInfos =
-    base::MakeFixedFlatMap<std::string_view, FontInfo>({
-        {"Poppins", kPoppinsFontInfo},
-        {"Sans-serif", kSansSerifFontInfo},
-        {"Serif", kSerifFontInfo},
-        {"Comic Neue", kComicNeueFontInfo},
-        {"Lexend Deca", kLexendDecaFontInfo},
-        {"EB Garamond", kEbGaramondFontInfo},
-        {"STIX Two Text", kStixTwoTextFontInfo},
-        {"Andika", kAndikaFontInfo},
-        {"Atkinson Hyperlegible", kAtkinsonHyperlegibleFontInfo},
-    });
-
-}  // namespace fonts
diff --git a/chrome/common/read_anything/read_anything_constants.h b/chrome/common/read_anything/read_anything_constants.h
index 6072ac2..e6f0dd0d 100644
--- a/chrome/common/read_anything/read_anything_constants.h
+++ b/chrome/common/read_anything/read_anything_constants.h
@@ -5,12 +5,6 @@
 #ifndef CHROME_COMMON_READ_ANYTHING_READ_ANYTHING_CONSTANTS_H_
 #define CHROME_COMMON_READ_ANYTHING_READ_ANYTHING_CONSTANTS_H_
 
-#include <string>
-#include <string_view>
-
-#include "base/containers/fixed_flat_map.h"
-#include "ui/accessibility/ax_mode.h"
-
 // Various constants used throughout the Read Anything feature.
 namespace string_constants {
 
@@ -28,102 +22,6 @@
 extern const char kReadingModeName[];
 }  // namespace string_constants
 
-// When adding a new font, add info to ReadAnythingFont, kReadAnythingFonts,
-// and GetFontInfos() below.
-namespace fonts {
-// Enum for logging the user-chosen font.
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-//
-// LINT.IfChange(ReadAnythingFont)
-enum class ReadAnythingFont {
-  kPoppins = 0,
-  kSansSerif = 1,
-  kSerif = 2,
-  kComicNeue = 3,
-  kLexendDeca = 4,
-  kEbGaramond = 5,
-  kStixTwoText = 6,
-  kAndika = 7,
-  kAtkinsonHyperlegible = 8,
-  kMaxValue = kAtkinsonHyperlegible,
-};
-// LINT.ThenChange(/tools/metrics/histograms/metadata/accessibility/enums.xml:ReadAnythingFontName)
-
-// Holds compile-time known information about each of Read Anything's supported
-// fonts. If num_langs_supported is 0, then that font supports all languages.
-struct FontInfo {
-  ReadAnythingFont logging_value;
-  const char* css_name;
-  const char* langs_supported[40];
-  size_t num_langs_supported;
-};
-
-inline const char* kReadAnythingFonts[] = {
-    "Poppins",       "Sans-serif",  "Serif",
-    "Comic Neue",    "Lexend Deca", "EB Garamond",
-    "STIX Two Text", "Andika",      "Atkinson Hyperlegible",
-};
-inline constexpr FontInfo kPoppinsFontInfo = {
-    ReadAnythingFont::kPoppins,
-    /*css_name=*/"Poppins",
-    {"af", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
-     "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "mr", "ms",
-     "nl", "pl", "pt", "ro", "sk", "sl", "sv", "sw", "tr"},
-    /*num_langs_supported=*/29};
-inline constexpr FontInfo kSansSerifFontInfo = {ReadAnythingFont::kSansSerif,
-                                                /*css_name=*/"sans-serif",
-                                                {},
-                                                /*num_langs_supported=*/0};
-inline constexpr FontInfo kSerifFontInfo = {ReadAnythingFont::kSerif,
-                                            /*css_name=*/"serif",
-                                            {},
-                                            /*num_langs_supported=*/0};
-inline constexpr FontInfo kComicNeueFontInfo = {
-    ReadAnythingFont::kComicNeue,
-    /*css_name=*/"\"Comic Neue\"",
-    {"af", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil", "fr", "hr",
-     "hu", "id", "it", "ms", "nl", "pl", "pt", "sk", "sl", "sv",  "sw"},
-    /*num_langs_supported=*/23};
-inline constexpr FontInfo kLexendDecaFontInfo = {
-    ReadAnythingFont::kLexendDeca,
-    /*css_name=*/"\"Lexend Deca\"",
-    {"af", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
-     "fr", "hr", "hu", "id", "it", "lt", "lv", "ms", "nl", "pl",
-     "pt", "ro", "sk", "sl", "sv", "sw", "tr", "vi"},
-    /*num_langs_supported=*/28};
-inline constexpr FontInfo kEbGaramondFontInfo = {
-    ReadAnythingFont::kEbGaramond,
-    /*css_name=*/"\"EB Garamond\"",
-    {"af", "bg", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
-     "fr", "hr", "hu", "id", "it", "lt", "lv", "ms", "nl", "pl", "pt",
-     "ro", "ru", "sk", "sl", "sr", "sv", "sw", "tr", "uk", "vi"},
-    /*num_langs_supported=*/32};
-inline constexpr FontInfo kStixTwoTextFontInfo = {
-    ReadAnythingFont::kStixTwoText,
-    /*css_name=*/"STIX \"Two Text\"",
-    {"af", "bg", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
-     "fr", "hr", "hu", "id", "it", "lt", "lv", "ms", "nl", "pl", "pt",
-     "ro", "ru", "sk", "sl", "sr", "sv", "sw", "tr", "uk", "vi"},
-    /*num_langs_supported=*/32};
-inline constexpr FontInfo kAndikaFontInfo = {
-    ReadAnythingFont::kAndika,
-    /*css_name=*/"Andika",
-    {"af", "bg", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil", "fr",
-     "hr", "hu", "id", "it", "kr", "lt", "lu", "lv", "ms", "nd", "nl",  "nr",
-     "pl", "pt", "ro", "ru", "sk", "sl", "sr", "sv", "sw", "tr", "uk",  "vi"},
-    /*num_langs_supported=*/36};
-inline constexpr FontInfo kAtkinsonHyperlegibleFontInfo = {
-    ReadAnythingFont::kAtkinsonHyperlegible,
-    /*css_name=*/"Atkinson Hyperlegible",
-    {"af", "ca", "cs", "da", "de", "en", "es", "et", "eu", "fi", "fil", "fr",
-     "gl", "hr", "hu", "id", "is", "it", "kk", "lt", "ms", "nl", "no",  "pl",
-     "pt", "pt", "ro", "sl", "sq", "sr", "sr", "sv", "sw", "zu"},
-    /*num_langs_supported=*/34};
-extern const base::fixed_flat_map<std::string_view, FontInfo, 9> kFontInfos;
-
-}  // namespace fonts
-
 namespace {
 
 // Used for text formatting correction in PDFs. This value should match the line
@@ -134,12 +32,6 @@
 // Speech rate is a multiplicative scale where 1 is the baseline.
 inline constexpr double kReadAnythingDefaultSpeechRate = 1;
 
-// Font size in em
-inline constexpr double kReadAnythingDefaultFontScale = 1;
-inline constexpr double kReadAnythingMinimumFontScale = 0.5;
-inline constexpr double kReadAnythingMaximumFontScale = 4.5;
-inline constexpr double kReadAnythingFontScaleIncrement = 0.25;
-
 // Display settings.
 inline constexpr bool kReadAnythingDefaultLinksEnabled = true;
 inline constexpr bool kReadAnythingDefaultImagesEnabled = false;
diff --git a/chrome/common/read_anything/read_anything_util.cc b/chrome/common/read_anything/read_anything_util.cc
new file mode 100644
index 0000000..f6dbccf
--- /dev/null
+++ b/chrome/common/read_anything/read_anything_util.cc
@@ -0,0 +1,141 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/read_anything/read_anything_util.h"
+
+#include <algorithm>
+#include <string>
+#include <string_view>
+#include <vector>
+
+#include "base/containers/fixed_flat_map.h"
+#include "base/containers/fixed_flat_set.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/numerics/safe_conversions.h"
+
+namespace {
+
+// All values are in em.
+constexpr double kMinScale = 0.5;
+constexpr double kMaxScale = 4.5;
+constexpr double kScaleStepSize = 0.25;
+
+int AsSteps(double font_scale) {
+  return base::ClampRound((font_scale - kMinScale) / kScaleStepSize);
+}
+
+}  // namespace
+
+std::vector<std::string> GetSupportedFonts(std::string_view language_code) {
+  // If you modify the set of fonts here, also change `LogFontName()` below.
+  static constexpr auto kPoppinsLangs =
+      base::MakeFixedFlatSet<std::string_view>(
+          {"af", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
+           "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "mr", "ms",
+           "nl", "pl", "pt", "ro", "sk", "sl", "sv", "sw", "tr"});
+  static constexpr auto kComicNeueLangs =
+      base::MakeFixedFlatSet<std::string_view>(
+          {"af", "ca",  "cs", "da", "de", "en", "es", "et",
+           "fi", "fil", "fr", "hr", "hu", "id", "it", "ms",
+           "nl", "pl",  "pt", "sk", "sl", "sv", "sw"});
+  static constexpr auto kLexendDecaLangs =
+      base::MakeFixedFlatSet<std::string_view>(
+          {"af", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
+           "fr", "hr", "hu", "id", "it", "lt", "lv", "ms", "nl", "pl",
+           "pt", "ro", "sk", "sl", "sv", "sw", "tr", "vi"});
+  static constexpr auto kEbGaramondLangs =
+      base::MakeFixedFlatSet<std::string_view>(
+          {"af", "bg", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
+           "fr", "hr", "hu", "id", "it", "lt", "lv", "ms", "nl", "pl", "pt",
+           "ro", "ru", "sk", "sl", "sr", "sv", "sw", "tr", "uk", "vi"});
+  static constexpr auto kStixTwoTextLangs =
+      base::MakeFixedFlatSet<std::string_view>(
+          {"af", "bg", "ca", "cs", "da", "de", "en", "es", "et", "fi", "fil",
+           "fr", "hr", "hu", "id", "it", "lt", "lv", "ms", "nl", "pl", "pt",
+           "ro", "ru", "sk", "sl", "sr", "sv", "sw", "tr", "uk", "vi"});
+  static constexpr auto kAndikaLangs = base::MakeFixedFlatSet<std::string_view>(
+      {"af", "bg",  "ca", "cs", "da", "de", "en", "es", "et",
+       "fi", "fil", "fr", "hr", "hu", "id", "it", "kr", "lt",
+       "lu", "lv",  "ms", "nd", "nl", "nr", "pl", "pt", "ro",
+       "ru", "sk",  "sl", "sr", "sv", "sw", "tr", "uk", "vi"});
+  static constexpr auto kAtkinsonHyperlegibleLangs =
+      base::MakeFixedFlatSet<std::string_view>(
+          {"af", "ca", "cs", "da", "de", "en", "es", "et", "eu", "fi", "fil",
+           "fr", "gl", "hr", "hu", "id", "is", "it", "kk", "lt", "ms", "nl",
+           "no", "pl", "pt", "ro", "sl", "sq", "sr", "sv", "sw", "zu"});
+
+  std::vector<std::string> font_choices = {"Sans-serif", "Serif"};
+  if (language_code.empty() || kPoppinsLangs.contains(language_code)) {
+    // Make this default by putting it first.
+    font_choices.insert(font_choices.begin(), "Poppins");
+  }
+  if (language_code.empty() || kComicNeueLangs.contains(language_code)) {
+    font_choices.push_back("Comic Neue");
+  }
+  if (language_code.empty() || kLexendDecaLangs.contains(language_code)) {
+    font_choices.push_back("Lexend Deca");
+  }
+  if (language_code.empty() || kEbGaramondLangs.contains(language_code)) {
+    font_choices.push_back("EB Garamond");
+  }
+  if (language_code.empty() || kStixTwoTextLangs.contains(language_code)) {
+    font_choices.push_back("STIX Two Text");
+  }
+  if (language_code.empty() || kAndikaLangs.contains(language_code)) {
+    font_choices.push_back("Andika");
+  }
+  if (language_code.empty() ||
+      kAtkinsonHyperlegibleLangs.contains(language_code)) {
+    font_choices.push_back("Atkinson Hyperlegible");
+  }
+
+  return font_choices;
+}
+
+void LogFontName(std::string_view font_name) {
+  // These values are persisted to logs. Entries should not be renumbered and
+  // numeric values should never be reused.
+  // If you modify the set of fonts here, also change `GetSupportedFonts()`
+  // above.
+  // LINT.IfChange(ReadAnythingFont)
+  enum class ReadAnythingFont {
+    kPoppins = 0,
+    kSansSerif = 1,
+    kSerif = 2,
+    kComicNeue = 3,
+    kLexendDeca = 4,
+    kEbGaramond = 5,
+    kStixTwoText = 6,
+    kAndika = 7,
+    kAtkinsonHyperlegible = 8,
+    kMaxValue = kAtkinsonHyperlegible,
+  };
+  // LINT.ThenChange(//tools/metrics/histograms/metadata/accessibility/enums.xml:ReadAnythingFontName)
+  static constexpr auto kFontMap =
+      base::MakeFixedFlatMap<std::string_view, ReadAnythingFont>(
+          {{"Poppins", ReadAnythingFont::kPoppins},
+           {"Sans-serif", ReadAnythingFont::kSansSerif},
+           {"Serif", ReadAnythingFont::kSerif},
+           {"Comic Neue", ReadAnythingFont::kComicNeue},
+           {"Lexend Deca", ReadAnythingFont::kLexendDeca},
+           {"EB Garamond", ReadAnythingFont::kEbGaramond},
+           {"STIX Two Text", ReadAnythingFont::kStixTwoText},
+           {"Andika", ReadAnythingFont::kAndika},
+           {"Atkinson Hyperlegible", ReadAnythingFont::kAtkinsonHyperlegible}});
+  if (const auto it = kFontMap.find(font_name); it != kFontMap.end()) {
+    base::UmaHistogramEnumeration("Accessibility.ReadAnything.FontName",
+                                  it->second);
+  }
+}
+
+double AdjustFontScale(double font_scale, int increment) {
+  return std::clamp(
+      kMinScale + (AsSteps(font_scale) + increment) * kScaleStepSize, kMinScale,
+      kMaxScale);
+}
+
+void LogFontScale(double font_scale) {
+  base::UmaHistogramExactLinear("Accessibility.ReadAnything.FontScale",
+                                AsSteps(font_scale), AsSteps(kMaxScale) + 1);
+}
diff --git a/chrome/common/read_anything/read_anything_util.h b/chrome/common/read_anything/read_anything_util.h
new file mode 100644
index 0000000..6ad0a62f
--- /dev/null
+++ b/chrome/common/read_anything/read_anything_util.h
@@ -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.
+
+#ifndef CHROME_COMMON_READ_ANYTHING_READ_ANYTHING_UTIL_H_
+#define CHROME_COMMON_READ_ANYTHING_READ_ANYTHING_UTIL_H_
+
+#include <string>
+#include <string_view>
+#include <vector>
+
+// Returns font names, in order, that should be shown to the user as choices
+// based on the provided `language_code`. If `language_code` is empty, returns
+// all fonts.
+[[nodiscard]] std::vector<std::string> GetSupportedFonts(
+    std::string_view language_code);
+
+// Records `font_name` in histograms.
+void LogFontName(std::string_view font_name);
+
+// Adjusts `font_scale` up or down by `increment` steps and returns the
+// nearest valid font scale.
+[[nodiscard]] double AdjustFontScale(double font_scale, int increment);
+
+// Records `font_scale` in histograms.
+void LogFontScale(double font_scale);
+
+#endif  // CHROME_COMMON_READ_ANYTHING_READ_ANYTHING_UTIL_H_
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 7d1f513..c84ca37 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -127,7 +127,8 @@
 inline constexpr char kChromeUIGCMInternalsHost[] = "gcm-internals";
 inline constexpr char kChromeUIGlicHost[] = "glic";
 inline constexpr char kChromeUIGlicURL[] = "chrome://glic/";
-inline constexpr char kChromeUIGlicFreURL[] = "chrome://glic/glic_fre/fre.html";
+inline constexpr char kChromeUIGlicFreHost[] = "glic-fre";
+inline constexpr char kChromeUIGlicFreURL[] = "chrome://glic-fre";
 inline constexpr char kChromeUIHangUIHost[] = "uithreadhang";
 inline constexpr char kChromeUIHelpHost[] = "help";
 inline constexpr char kChromeUIHelpURL[] = "chrome://help/";
diff --git a/chrome/release_scripts b/chrome/release_scripts
index f67cfc0..bfa066d 160000
--- a/chrome/release_scripts
+++ b/chrome/release_scripts
@@ -1 +1 @@
-Subproject commit f67cfc0d2d342127d3e2572d400d3d8f9e93dc81
+Subproject commit bfa066d3ee8c712861cb563cbe1297628523bde7
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything/read_anything_app_controller.cc
index 09b5008d..07c90fd 100644
--- a/chrome/renderer/accessibility/read_anything/read_anything_app_controller.cc
+++ b/chrome/renderer/accessibility/read_anything/read_anything_app_controller.cc
@@ -21,10 +21,12 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/metrics_hashes.h"
 #include "base/notreached.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "base/strings/to_string.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/common/read_anything/read_anything_constants.h"
+#include "chrome/common/read_anything/read_anything_util.h"
 #include "chrome/renderer/accessibility/ax_tree_distiller.h"
 #include "chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.h"
 #include "chrome/renderer/accessibility/read_anything/read_aloud_traversal_utils.h"
@@ -1290,19 +1292,22 @@
 }
 
 std::vector<std::string> ReadAnythingAppController::GetSupportedFonts() {
-  return model_.GetSupportedFonts();
+  return model_.supported_fonts();
 }
 
 std::string ReadAnythingAppController::GetValidatedFontName(
     const std::string& font) const {
-  bool is_valid = base::Contains(fonts::kReadAnythingFonts, font);
-  return is_valid ? fonts::kFontInfos.at(font).css_name
-                  : string_constants::kReadAnythingDefaultFont;
+  if (!base::Contains(GetAllFonts(), font)) {
+    return string_constants::kReadAnythingDefaultFont;
+  }
+  if (font == "Serif" || font == "Sans-serif") {
+    return base::ToLowerASCII(font);
+  }
+  return base::Contains(font, ' ') ? base::StrCat({"\"", font, "\""}) : font;
 }
 
-std::vector<std::string> ReadAnythingAppController::GetAllFonts() {
-  return std::vector<std::string>(std::begin(fonts::kReadAnythingFonts),
-                                  std::end(fonts::kReadAnythingFonts));
+std::vector<std::string> ReadAnythingAppController::GetAllFonts() const {
+  return ::GetSupportedFonts({});
 }
 
 void ReadAnythingAppController::RequestImageDataUrl(
@@ -1467,12 +1472,7 @@
 }
 
 void ReadAnythingAppController::OnFontSizeChanged(bool increase) {
-  if (increase) {
-    model_.IncreaseTextSize();
-  } else {
-    model_.DecreaseTextSize();
-  }
-
+  model_.AdjustTextSize(increase ? 1 : -1);
   page_handler_->OnFontSizeChange(model_.font_size());
 }
 
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything/read_anything_app_controller.h
index 64b7f557..5cbfa37 100644
--- a/chrome/renderer/accessibility/read_anything/read_anything_app_controller.h
+++ b/chrome/renderer/accessibility/read_anything/read_anything_app_controller.h
@@ -95,67 +95,6 @@
   void OnTreeAdded(ui::AXTree* tree) override;
   void OnTreeRemoved(ui::AXTree* tree) override;
 
- private:
-  friend ReadAnythingAppControllerTest;
-  friend ReadAnythingAppControllerScreen2xDataCollectionModeTest;
-
-  explicit ReadAnythingAppController(content::RenderFrame* render_frame);
-  ~ReadAnythingAppController() override;
-
-  // gin::WrappableBase:
-  gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
-      v8::Isolate* isolate) override;
-
-  // ui::AXTreeObserver:
-  void OnNodeDataChanged(ui::AXTree* tree,
-                         const ui::AXNodeData& old_node_data,
-                         const ui::AXNodeData& new_node_data) override;
-
-  void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override;
-
-  void OnNodeDeleted(ui::AXTree* tree, ui::AXNodeID node) override;
-
-  // read_anything::mojom::UntrustedPage:
-  void AccessibilityEventReceived(
-      const ui::AXTreeID& tree_id,
-      const std::vector<ui::AXTreeUpdate>& updates,
-      const std::vector<ui::AXEvent>& events) override;
-  void AccessibilityLocationChangesReceived(
-      const ui::AXTreeID& tree_id,
-      ui::AXLocationAndScrollUpdates& details) override;
-  void AccessibilityLocationChangesReceived(
-      const ui::AXTreeID& tree_id,
-      const ui::AXLocationAndScrollUpdates& details) override;
-  void OnActiveAXTreeIDChanged(const ui::AXTreeID& tree_id,
-                               ukm::SourceId ukm_source_id,
-                               bool is_pdf) override;
-  void OnAXTreeDestroyed(const ui::AXTreeID& tree_id) override;
-  void OnImageDataDownloaded(const ui::AXTreeID& tree_id,
-                             ui::AXNodeID node_id,
-                             const SkBitmap& image) override;
-  void OnSettingsRestoredFromPrefs(
-      read_anything::mojom::LineSpacing line_spacing,
-      read_anything::mojom::LetterSpacing letter_spacing,
-      const std::string& font,
-      double font_size,
-      bool links_enabled,
-      bool images_enabled,
-      read_anything::mojom::Colors color,
-      double speech_rate,
-      base::Value::Dict voices,
-      base::Value::List languages_enabled_in_pref,
-      read_anything::mojom::HighlightGranularity granularity) override;
-  void SetLanguageCode(const std::string& code) override;
-  void SetDefaultLanguageCode(const std::string& code) override;
-  void ScreenAIServiceReady() override;
-  void OnGetVoicePackInfo(
-      read_anything::mojom::VoicePackInfoPtr voice_pack_info) override;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  void OnDeviceLocked() override;
-#else
-  void OnTtsEngineInstalled() override;
-#endif
-
   // gin templates:
   ui::AXNodeID RootId() const;
   ui::AXNodeID StartNodeId() const;
@@ -241,10 +180,71 @@
   v8::Local<v8::Value> GetImageBitmap(ui::AXNodeID node_id);
   void OnSpeechPlayingStateChanged(bool is_speech_active);
   std::string GetValidatedFontName(const std::string& font) const;
-  std::vector<std::string> GetAllFonts();
+  std::vector<std::string> GetAllFonts() const;
   void OnScrolledToBottom();
   bool IsDocsLoadMoreButtonVisible() const;
 
+ private:
+  friend ReadAnythingAppControllerTest;
+  friend ReadAnythingAppControllerScreen2xDataCollectionModeTest;
+
+  explicit ReadAnythingAppController(content::RenderFrame* render_frame);
+  ~ReadAnythingAppController() override;
+
+  // gin::WrappableBase:
+  gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
+      v8::Isolate* isolate) override;
+
+  // ui::AXTreeObserver:
+  void OnNodeDataChanged(ui::AXTree* tree,
+                         const ui::AXNodeData& old_node_data,
+                         const ui::AXNodeData& new_node_data) override;
+
+  void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override;
+
+  void OnNodeDeleted(ui::AXTree* tree, ui::AXNodeID node) override;
+
+  // read_anything::mojom::UntrustedPage:
+  void AccessibilityEventReceived(
+      const ui::AXTreeID& tree_id,
+      const std::vector<ui::AXTreeUpdate>& updates,
+      const std::vector<ui::AXEvent>& events) override;
+  void AccessibilityLocationChangesReceived(
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) override;
+  void AccessibilityLocationChangesReceived(
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationAndScrollUpdates& details) override;
+  void OnActiveAXTreeIDChanged(const ui::AXTreeID& tree_id,
+                               ukm::SourceId ukm_source_id,
+                               bool is_pdf) override;
+  void OnAXTreeDestroyed(const ui::AXTreeID& tree_id) override;
+  void OnImageDataDownloaded(const ui::AXTreeID& tree_id,
+                             ui::AXNodeID node_id,
+                             const SkBitmap& image) override;
+  void OnSettingsRestoredFromPrefs(
+      read_anything::mojom::LineSpacing line_spacing,
+      read_anything::mojom::LetterSpacing letter_spacing,
+      const std::string& font,
+      double font_size,
+      bool links_enabled,
+      bool images_enabled,
+      read_anything::mojom::Colors color,
+      double speech_rate,
+      base::Value::Dict voices,
+      base::Value::List languages_enabled_in_pref,
+      read_anything::mojom::HighlightGranularity granularity) override;
+  void SetLanguageCode(const std::string& code) override;
+  void SetDefaultLanguageCode(const std::string& code) override;
+  void ScreenAIServiceReady() override;
+  void OnGetVoicePackInfo(
+      read_anything::mojom::VoicePackInfoPtr voice_pack_info) override;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  void OnDeviceLocked() override;
+#else
+  void OnTtsEngineInstalled() override;
+#endif
+
   // The language code that should be used to determine which voices are
   // supported for speech.
   const std::string& GetLanguageCodeForSpeech() const;
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_controller_browsertest.cc b/chrome/renderer/accessibility/read_anything/read_anything_app_controller_browsertest.cc
index 74b8da2..2d5dd51 100644
--- a/chrome/renderer/accessibility/read_anything/read_anything_app_controller_browsertest.cc
+++ b/chrome/renderer/accessibility/read_anything/read_anything_app_controller_browsertest.cc
@@ -206,6 +206,9 @@
     Mock::VerifyAndClearExpectations(distiller_);
   }
 
+  ReadAnythingAppController& controller() { return *controller_; }
+  ReadAnythingAppModel& model() { return controller_->model_; }
+
   void SetIsPdf() {
     // Call OnActiveAXTreeIDChanged() to set is_pdf_ state.
     OnActiveAXTreeIDChanged(tree_id_, true /* is_pdf */);
@@ -394,8 +397,6 @@
 
   int ColorTheme() { return controller_->ColorTheme(); }
 
-  void OnFontSizeReset() { controller_->OnFontSizeReset(); }
-
   void OnLinksEnabledToggled() { controller_->OnLinksEnabledToggled(); }
 
   void OnImagesEnabledToggled() { controller_->OnImagesEnabledToggled(); }
@@ -845,7 +846,7 @@
   auto line_spacing = read_anything::mojom::LineSpacing::kVeryLoose;
   auto letter_spacing = read_anything::mojom::LetterSpacing::kVeryWide;
   std::string font_name = "Roboto";
-  double font_size = 18.0;
+  double font_size = 3.0;
   bool links_enabled = false;
   bool images_enabled = true;
   auto color = read_anything::mojom::Colors::kDefaultValue;
@@ -2398,9 +2399,10 @@
 }
 
 TEST_F(ReadAnythingAppControllerTest, OnFontSizeReset_SetsFontSizeToDefault) {
-  EXPECT_CALL(page_handler_, OnFontSizeChange(kReadAnythingDefaultFontScale))
-      .Times(1);
-  OnFontSizeReset();
+  model().ResetTextSize();
+  const double default_font_size = model().font_size();
+  EXPECT_CALL(page_handler_, OnFontSizeChange(default_font_size)).Times(1);
+  controller().OnFontSizeReset();
 }
 
 TEST_F(ReadAnythingAppControllerTest,
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc
index bcf0288a..cf7f4cd 100644
--- a/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc
+++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc
@@ -16,6 +16,7 @@
 #include "base/containers/contains.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/stringprintf.h"
+#include "chrome/common/read_anything/read_anything_util.h"
 #include "chrome/renderer/accessibility/read_anything/read_aloud_traversal_utils.h"
 #include "chrome/renderer/accessibility/read_anything/read_anything_node_utils.h"
 #include "content/public/renderer/render_thread.h"
@@ -60,11 +61,7 @@
 }  // namespace
 
 ReadAnythingAppModel::ReadAnythingAppModel() {
-  // We default to true since base_language_code_ is en by default and that
-  // supports all these fonts.
-  for (const auto* font : fonts::kReadAnythingFonts) {
-    supported_fonts_[font] = true;
-  }
+  ResetTextSize();
 }
 
 ReadAnythingAppModel::~ReadAnythingAppModel() = default;
@@ -87,7 +84,7 @@
   line_spacing_ = static_cast<size_t>(line_spacing);
   letter_spacing_ = static_cast<size_t>(letter_spacing);
   font_name_ = font;
-  font_size_ = font_size;
+  SetFontSize(font_size);
   links_enabled_ = links_enabled;
   images_enabled_ = images_enabled;
   color_theme_ = static_cast<size_t>(color);
@@ -681,6 +678,14 @@
   }
 }
 
+void ReadAnythingAppModel::AdjustTextSize(int increment) {
+  SetFontSize(font_size_, increment);
+}
+
+void ReadAnythingAppModel::ResetTextSize() {
+  SetFontSize(1.0f);
+}
+
 std::map<ui::AXTreeID, std::vector<ui::AXTreeUpdate>>&
 ReadAnythingAppModel::GetPendingUpdatesForTesting() {
   return pending_updates_map_;
@@ -1046,24 +1051,6 @@
   std::move(data_collection_for_screen2x_callback_).Run();
 }
 
-void ReadAnythingAppModel::IncreaseTextSize() {
-  font_size_ += kReadAnythingFontScaleIncrement;
-  if (font_size_ > kReadAnythingMaximumFontScale) {
-    font_size_ = kReadAnythingMaximumFontScale;
-  }
-}
-
-void ReadAnythingAppModel::DecreaseTextSize() {
-  font_size_ -= kReadAnythingFontScaleIncrement;
-  if (font_size_ < kReadAnythingMinimumFontScale) {
-    font_size_ = kReadAnythingMinimumFontScale;
-  }
-}
-
-void ReadAnythingAppModel::ResetTextSize() {
-  font_size_ = kReadAnythingDefaultFontScale;
-}
-
 void ReadAnythingAppModel::ToggleLinksEnabled() {
   links_enabled_ = !links_enabled_;
 }
@@ -1075,26 +1062,7 @@
 void ReadAnythingAppModel::SetBaseLanguageCode(const std::string& code) {
   DCHECK(!code.empty());
   base_language_code_ = code;
-  // Update whether each font is supported by the new language code.
-  for (const auto& [font, font_info] : fonts::kFontInfos) {
-    if (font_info.num_langs_supported > 0) {
-      supported_fonts_[font] =
-          (std::find(font_info.langs_supported,
-                     font_info.langs_supported + font_info.num_langs_supported,
-                     code) !=
-           font_info.langs_supported + font_info.num_langs_supported);
-    }
-  }
-}
-
-std::vector<std::string> ReadAnythingAppModel::GetSupportedFonts() {
-  std::vector<std::string> font_choices_;
-  for (const auto* font : fonts::kReadAnythingFonts) {
-    if (supported_fonts_[font]) {
-      font_choices_.emplace_back(font);
-    }
-  }
-  return font_choices_;
+  supported_fonts_ = GetSupportedFonts(base_language_code_);
 }
 
 void ReadAnythingAppModel::AddObserver(ModelObserver* observer) {
@@ -1104,3 +1072,7 @@
 void ReadAnythingAppModel::RemoveObserver(ModelObserver* observer) {
   observers_.RemoveObserver(observer);
 }
+
+void ReadAnythingAppModel::SetFontSize(double font_size, int increment) {
+  font_size_ = AdjustFontScale(font_size, increment);
+}
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything/read_anything_app_model.h
index 00a2e7c..0fa35bf 100644
--- a/chrome/renderer/accessibility/read_anything/read_anything_app_model.h
+++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model.h
@@ -14,6 +14,7 @@
 #include "base/values.h"
 #include "chrome/common/read_anything/read_anything.mojom.h"
 #include "chrome/common/read_anything/read_anything_constants.h"
+#include "chrome/common/read_anything/read_anything_util.h"
 #include "chrome/renderer/accessibility/read_anything/read_aloud_traversal_utils.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/accessibility/ax_event_generator.h"
@@ -111,13 +112,14 @@
 
   void SetBaseLanguageCode(const std::string& code);
 
-  std::vector<std::string> GetSupportedFonts();
+  const std::vector<std::string>& supported_fonts() const {
+    return supported_fonts_;
+  }
 
   // Theme
   const std::string& font_name() const { return font_name_; }
   void set_font_name(const std::string& font) { font_name_ = font; }
   float font_size() const { return font_size_; }
-  void set_font_size(float font_size) { font_size_ = font_size; }
   bool links_enabled() const { return links_enabled_; }
   bool images_enabled() const { return images_enabled_; }
   int letter_spacing() const { return letter_spacing_; }
@@ -239,8 +241,7 @@
   double GetLetterSpacingValue(
       read_anything::mojom::LetterSpacing letter_spacing) const;
 
-  void IncreaseTextSize();
-  void DecreaseTextSize();
+  void AdjustTextSize(int increment);
   void ResetTextSize();
   void ToggleLinksEnabled();
   void ToggleImagesEnabled();
@@ -286,6 +287,8 @@
   void OnPageLoadTimerTriggered();
   void OnTreeChangeTimerTriggered();
 
+  void SetFontSize(double font_size, int increment = 0);
+
   // State.
   std::map<ui::AXTreeID, std::unique_ptr<ReadAnythingAppModel::AXTreeInfo>>
       tree_infos_;
@@ -339,7 +342,7 @@
 
   // Theme information.
   std::string font_name_ = string_constants::kReadAnythingPlaceholderFontName;
-  float font_size_ = kReadAnythingDefaultFontScale;
+  float font_size_;
   bool links_enabled_ = kReadAnythingDefaultLinksEnabled;
   bool images_enabled_ = kReadAnythingDefaultImagesEnabled;
   int letter_spacing_ = (int)read_anything::mojom::LetterSpacing::kDefaultValue;
@@ -371,8 +374,11 @@
   // Whether the webpage has finished loading or not.
   bool page_finished_loading_ = false;
 
-  // Maps fonts to whether the current base_language_code_ supports that font.
-  std::map<std::string_view, bool> supported_fonts_;
+  // Cached set of fonts that support `base_language_code_`, updated whenever
+  // that is changed.
+  std::vector<std::string> supported_fonts_ =
+      GetSupportedFonts(base_language_code_);
+
   // If the page language can't be determined by the model, we can check the
   // AX tree to see if it has that information, but the ax tree is created
   // asynchronously from the language determination so we need to keep track of
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc b/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc
index 2739027..d228140 100644
--- a/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc
+++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc
@@ -14,6 +14,7 @@
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "read_anything_test_utils.h"
 #include "services/strings/grit/services_strings.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
 #include "ui/accessibility/ax_event.h"
 #include "ui/accessibility/ax_node_id_forward.h"
@@ -21,6 +22,8 @@
 #include "ui/accessibility/ax_updates_and_events.h"
 #include "ui/base/l10n/l10n_util.h"
 
+using ::testing::ElementsAre;
+
 class ReadAnythingAppModelTest : public ChromeRenderViewTest {
  public:
   ReadAnythingAppModelTest() = default;
@@ -48,6 +51,9 @@
     model_ = std::make_unique<ReadAnythingAppModel>();
   }
 
+  ReadAnythingAppModel& model() { return *model_; }
+  const ReadAnythingAppModel& model() const { return *model_; }
+
   void SetUpdateTreeID(ui::AXTreeUpdate* update) {
     test::SetUpdateTreeID(update, tree_id_);
   }
@@ -214,19 +220,9 @@
 
   bool IsDocs() { return model_->IsDocs(); }
 
-  void IncreaseTextSize() { model_->IncreaseTextSize(); }
-
-  void DecreaseTextSize() { model_->DecreaseTextSize(); }
-
-  void ResetTextSize() { model_->ResetTextSize(); }
-
   std::string LanguageCode() { return model_->base_language_code(); }
   void SetLanguageCode(std::string code) { model_->SetBaseLanguageCode(code); }
 
-  std::vector<std::string> GetSupportedFonts() {
-    return model_->GetSupportedFonts();
-  }
-
   void set_is_pdf(bool is_pdf) { return model_->set_is_pdf(is_pdf); }
 
   std::vector<int> SendSimpleUpdateAndGetChildIds() {
@@ -274,7 +270,7 @@
   auto line_spacing = read_anything::mojom::LineSpacing::kDefaultValue;
   auto letter_spacing = read_anything::mojom::LetterSpacing::kDefaultValue;
   std::string font_name = "Roboto";
-  double font_size = 18.0;
+  double font_size = 3.0;
   bool links_enabled = false;
   bool images_enabled = true;
   auto color = read_anything::mojom::Colors::kDefaultValue;
@@ -1658,21 +1654,19 @@
 }
 
 TEST_F(ReadAnythingAppModelTest, ResetTextSize_ReturnsTextSizeToDefault) {
-  IncreaseTextSize();
-  IncreaseTextSize();
-  IncreaseTextSize();
-  ASSERT_GT(FontSize(), kReadAnythingDefaultFontScale);
+  const double default_font_size = model().font_size();
 
-  ResetTextSize();
-  ASSERT_EQ(FontSize(), kReadAnythingDefaultFontScale);
+  model().AdjustTextSize(3);
+  EXPECT_GT(model().font_size(), default_font_size);
 
-  DecreaseTextSize();
-  DecreaseTextSize();
-  DecreaseTextSize();
-  ASSERT_LT(FontSize(), kReadAnythingDefaultFontScale);
+  model().ResetTextSize();
+  EXPECT_EQ(model().font_size(), default_font_size);
 
-  ResetTextSize();
-  ASSERT_EQ(FontSize(), kReadAnythingDefaultFontScale);
+  model().AdjustTextSize(-3);
+  EXPECT_LT(model().font_size(), default_font_size);
+
+  model().ResetTextSize();
+  EXPECT_EQ(model().font_size(), default_font_size);
 }
 
 TEST_F(ReadAnythingAppModelTest, LanguageCode_ReturnsCorrectCode) {
@@ -1685,64 +1679,36 @@
 TEST_F(ReadAnythingAppModelTest,
        SupportedFonts_InvalidLanguageCode_ReturnsDefaultFonts) {
   SetLanguageCode("qr");
-  std::vector<std::string> expectedFonts = {"Sans-serif", "Serif"};
-  std::vector<std::string> fonts = GetSupportedFonts();
-
-  EXPECT_EQ(fonts.size(), expectedFonts.size());
-  for (size_t i = 0; i < fonts.size(); i++) {
-    ASSERT_EQ(fonts[i], expectedFonts[i]);
-  }
+  EXPECT_THAT(model().supported_fonts(), ElementsAre("Sans-serif", "Serif"));
 }
 
 TEST_F(ReadAnythingAppModelTest,
        SupportedFonts_BeforeLanguageSet_ReturnsDefaultFonts) {
-  std::vector<std::string> expectedFonts = {
-      "Poppins",       "Sans-serif",  "Serif",
-      "Comic Neue",    "Lexend Deca", "EB Garamond",
-      "STIX Two Text", "Andika",      "Atkinson Hyperlegible"};
-  std::vector<std::string> fonts = GetSupportedFonts();
-
-  EXPECT_EQ(fonts.size(), expectedFonts.size());
-  for (size_t i = 0; i < fonts.size(); i++) {
-    ASSERT_EQ(fonts[i], expectedFonts[i]);
-  }
+  EXPECT_THAT(model().supported_fonts(),
+              ElementsAre("Poppins", "Sans-serif", "Serif", "Comic Neue",
+                          "Lexend Deca", "EB Garamond", "STIX Two Text",
+                          "Andika", "Atkinson Hyperlegible"));
 }
 
 TEST_F(ReadAnythingAppModelTest,
        SupportedFonts_SetLanguageCode_ReturnsExpectedDefaultFonts) {
   // Spanish
   SetLanguageCode("es");
-  std::vector<std::string> expectedFonts = {
-      "Poppins",       "Sans-serif",  "Serif",
-      "Comic Neue",    "Lexend Deca", "EB Garamond",
-      "STIX Two Text", "Andika",      "Atkinson Hyperlegible"};
-  std::vector<std::string> fonts = GetSupportedFonts();
-
-  EXPECT_EQ(fonts.size(), expectedFonts.size());
-  for (size_t i = 0; i < fonts.size(); i++) {
-    ASSERT_EQ(fonts[i], expectedFonts[i]);
-  }
+  EXPECT_THAT(model().supported_fonts(),
+              ElementsAre("Poppins", "Sans-serif", "Serif", "Comic Neue",
+                          "Lexend Deca", "EB Garamond", "STIX Two Text",
+                          "Andika", "Atkinson Hyperlegible"));
 
   // Bulgarian
   SetLanguageCode("bg");
-  expectedFonts = {"Sans-serif", "Serif", "EB Garamond", "STIX Two Text",
-                   "Andika"};
-  fonts = GetSupportedFonts();
-
-  EXPECT_EQ(fonts.size(), expectedFonts.size());
-  for (size_t i = 0; i < fonts.size(); i++) {
-    ASSERT_EQ(fonts[i], expectedFonts[i]);
-  }
+  EXPECT_THAT(model().supported_fonts(),
+              ElementsAre("Sans-serif", "Serif", "EB Garamond", "STIX Two Text",
+                          "Andika"));
 
   // Hindi
   SetLanguageCode("hi");
-  expectedFonts = {"Poppins", "Sans-serif", "Serif"};
-  fonts = GetSupportedFonts();
-
-  EXPECT_EQ(fonts.size(), expectedFonts.size());
-  for (size_t i = 0; i < fonts.size(); i++) {
-    ASSERT_EQ(fonts[i], expectedFonts[i]);
-  }
+  EXPECT_THAT(model().supported_fonts(),
+              ElementsAre("Poppins", "Sans-serif", "Serif"));
 }
 
 TEST_F(ReadAnythingAppModelTest, PdfEvents_SetRequiresDistillation) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 1a823a7..8bf1c9d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4633,6 +4633,7 @@
         "../browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc",
         "../browser/ui/views/frame/browser_root_view_browsertest.cc",
         "../browser/ui/views/frame/browser_view_browsertest.cc",
+        "../browser/ui/views/frame/multi_contents_view_browsertest.cc",
         "../browser/ui/views/hung_renderer_view_browsertest.cc",
         "../browser/ui/views/importer/import_lock_dialog_view_browsertest.cc",
         "../browser/ui/views/javascript_tab_modal_dialog_view_views_browsertest.cc",
@@ -5893,6 +5894,7 @@
     "../browser/component_updater/origin_trials_component_installer_unittest.cc",
     "../browser/component_updater/pki_metadata_component_installer_unittest.cc",
     "../browser/component_updater/privacy_sandbox_attestations_component_installer_unittest.cc",
+    "../browser/component_updater/probabilistic_reveal_token_component_installer_unittest.cc",
     "../browser/component_updater/subresource_filter_component_installer_unittest.cc",
     "../browser/component_updater/tpcd_metadata_component_installer_unittest.cc",
     "../browser/content_index/content_index_provider_unittest.cc",
@@ -9778,6 +9780,7 @@
       "../browser/ui/views/sharing/sharing_icon_view_unittest.cc",
       "../browser/upgrade_detector/installed_version_poller_unittest.cc",
       "../browser/upgrade_detector/upgrade_detector_impl_unittest.cc",
+      "../browser/upgrade_detector/version_history_client_unittest.cc",
       "../common/channel_info_unittest.cc",
     ]
 
@@ -11911,6 +11914,7 @@
       "//chrome/app:command_ids",
       "//chrome/browser/apps/link_capturing",
       "//chrome/browser/browsing_data:constants",
+      "//chrome/browser/metrics/desktop_session_duration",
       "//chrome/browser/prefs",
       "//chrome/browser/reading_list",
       "//chrome/browser/search_engines",
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn
index 2dbd26b..ca675e16 100644
--- a/chrome/test/android/BUILD.gn
+++ b/chrome/test/android/BUILD.gn
@@ -394,6 +394,7 @@
     "//chrome/android:chrome_app_java_resources",
     "//chrome/android:chrome_java",
     "//chrome/browser/android/browserservices/intents:java",
+    "//chrome/browser/bookmarks/android:java",
     "//chrome/browser/first_run/android:java",
     "//chrome/browser/flags:java",
     "//chrome/browser/language/android:java",
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc
index 688517e..b5d2dd9 100644
--- a/chrome/test/base/test_browser_window.cc
+++ b/chrome/test/base/test_browser_window.cc
@@ -200,6 +200,10 @@
   return nullptr;
 }
 
+bool TestBrowserWindow::PreHandleMouseEvent(const blink::WebMouseEvent& event) {
+  return false;
+}
+
 content::KeyboardEventProcessingResult
 TestBrowserWindow::PreHandleKeyboardEvent(
     const input::NativeWebKeyboardEvent& event) {
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index e1002b8..85a0850 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -142,6 +142,7 @@
   void RotatePaneFocus(bool forwards) override {}
   void FocusWebContentsPane() override {}
   void ShowAppMenu() override {}
+  bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override;
   content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
       const input::NativeWebKeyboardEvent& event) override;
   bool HandleKeyboardEvent(const input::NativeWebKeyboardEvent& event) override;
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index fe7256f..ec8dec2e 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -154,6 +154,11 @@
       "signin/profile_picker_browsertest.cc",
       "signin/signin_browsertest.cc",
     ]
+
+    if (enable_dice_support) {
+      sources +=
+          [ "signin/signout_confirmation/signout_confirmation_browsertest.cc" ]
+    }
   }
 
   if (enable_dice_support || is_chromeos) {
@@ -721,6 +726,12 @@
       "$target_gen_dir/intro/resources.grdp",
       "$target_gen_dir/signin/resources.grdp",
     ]
+
+    if (enable_dice_support) {
+      deps += [ "signin/signout_confirmation:build_grdp" ]
+      grdp_files +=
+          [ "$target_gen_dir/signin/signout_confirmation/resources.grdp" ]
+    }
   }
 
   if (enable_compose) {
diff --git a/chrome/test/data/webui/extensions/BUILD.gn b/chrome/test/data/webui/extensions/BUILD.gn
index 284012a0..2d62c60 100644
--- a/chrome/test/data/webui/extensions/BUILD.gn
+++ b/chrome/test/data/webui/extensions/BUILD.gn
@@ -30,6 +30,7 @@
     "manager_test_with_activity_log_flag.ts",
     "manager_test_with_id_query_param.ts",
     "manager_unit_test.ts",
+    "service_unit_test.ts",
     "manager_unit_test_with_activity_log_flag.ts",
     "mv2_deprecation_panel_disabled_test.ts",
     "mv2_deprecation_panel_unsupported_test.ts",
diff --git a/chrome/test/data/webui/extensions/extensions_browsertest.cc b/chrome/test/data/webui/extensions/extensions_browsertest.cc
index 98a05164..3fce9635 100644
--- a/chrome/test/data/webui/extensions/extensions_browsertest.cc
+++ b/chrome/test/data/webui/extensions/extensions_browsertest.cc
@@ -666,6 +666,24 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
+// Extension Service Tests
+
+class CrExtensionsServiceUnitTest : public ExtensionsBrowserTest {
+ protected:
+  void RunTestCase(const std::string& test_case) {
+    ExtensionsBrowserTest::RunTest(
+        "extensions/service_unit_test.js",
+        base::StringPrintf("runMochaTest('ExtensionServiceUnitTest', '%s');",
+                           test_case.c_str()));
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(CrExtensionsServiceUnitTest,
+                       CallingSetEnabledDoesNotGenerateARuntimeError) {
+  RunTestCase("Calling setEnabled() does not cause a runtime error");
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // Extension Options Dialog Tests
 
 class CrExtensionsOptionsDialogTest : public ExtensionSettingsTestBase {
diff --git a/chrome/test/data/webui/extensions/service_unit_test.ts b/chrome/test/data/webui/extensions/service_unit_test.ts
new file mode 100644
index 0000000..298a05e
--- /dev/null
+++ b/chrome/test/data/webui/extensions/service_unit_test.ts
@@ -0,0 +1,35 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Suite of tests for service unit tests. Unlike
+ * other tests, these tests are not interacting with the real
+ * extension APIs (and not mocking them out via a TestService).
+ */
+
+import {Service} from 'chrome://extensions/extensions.js';
+import type {ServiceInterface} from 'chrome://extensions/extensions.js';
+
+suite('ExtensionServiceUnitTest', function() {
+  let service: ServiceInterface;
+
+  setup(function() {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+
+    service = Service.getInstance();
+  });
+
+  // Tests that calling `setEnabled()` in a manner that will cause the
+  // management API to return an error doesn't result in a JS runtime error.
+  // Regression test for https://crbug.com/397619884.
+  test('Calling setEnabled() does not cause a runtime error', async () => {
+    // Call `setItemEnabled` with an arbitrary ID. There's no extension with
+    // this ID installed, so the call will fail. This should *not* throw a
+    // runtime error, since the underlying `setEnabled()` call can legitimately
+    // fail for valid reasons (such as the extension being removed in the time
+    // between the click and the call, or the user canceling a re-enable
+    // dialog).
+    await service.setItemEnabled('a'.repeat(32), true);
+  });
+});
diff --git a/chrome/test/data/webui/extensions/test_service.ts b/chrome/test/data/webui/extensions/test_service.ts
index f6050ac0..55ae3c8 100644
--- a/chrome/test/data/webui/extensions/test_service.ts
+++ b/chrome/test/data/webui/extensions/test_service.ts
@@ -172,6 +172,7 @@
 
   setItemEnabled(id: string, isEnabled: boolean) {
     this.methodCalled('setItemEnabled', [id, isEnabled]);
+    return Promise.resolve();
   }
 
   setItemCollectsErrors(id: string, collectsErrors: boolean) {
diff --git a/chrome/test/data/webui/extensions/test_util.ts b/chrome/test/data/webui/extensions/test_util.ts
index f3e8c7b5..652dcbb 100644
--- a/chrome/test/data/webui/extensions/test_util.ts
+++ b/chrome/test/data/webui/extensions/test_util.ts
@@ -98,7 +98,9 @@
     return Promise.resolve();
   }
   setItemSafetyCheckWarningAcknowledged(_id: string) {}
-  setItemEnabled(_id: string, _isEnabled: boolean) {}
+  setItemEnabled(_id: string, _isEnabled: boolean) {
+    return Promise.resolve();
+  }
   setItemAllowedIncognito(_id: string, _isAllowedIncognito: boolean) {}
   setItemAllowedUserScripts(_id: string, _isAllowedUserScripts: boolean) {}
   setItemAllowedOnFileUrls(_id: string, _isAllowedOnFileUrls: boolean) {}
diff --git a/chrome/test/data/webui/glic/test_client/serve.py b/chrome/test/data/webui/glic/test_client/serve.py
index 702ee4e3..2e424229 100755
--- a/chrome/test/data/webui/glic/test_client/serve.py
+++ b/chrome/test/data/webui/glic/test_client/serve.py
@@ -71,7 +71,8 @@
               file=sys.stderr)
         sys.exit(1)
 
-    with socketserver.TCPServer(("", args.port), RequestHandler) as httpd:
+    with socketserver.ForkingTCPServer(("", args.port),
+                                       RequestHandler) as httpd:
         print("Server started at localhost:" + str(args.port))
         httpd.serve_forever()
 
diff --git a/chrome/test/data/webui/history/history_metrics_test.ts b/chrome/test/data/webui/history/history_metrics_test.ts
index c987c08..e2f6c9b 100644
--- a/chrome/test/data/webui/history/history_metrics_test.ts
+++ b/chrome/test/data/webui/history/history_metrics_test.ts
@@ -11,6 +11,7 @@
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
+import {microtasksFinished} from 'chrome://webui-test/test_util.js';
 
 import {TestBrowserService} from './test_browser_service.js';
 import {createHistoryEntry, createHistoryInfo, createSession, createWindow, disableLinkClicks, navigateTo} from './test_util.js';
@@ -211,14 +212,14 @@
 
     const menuButton = cards[0].$['menu-button'];
     menuButton.click();
-    await flushTasks();
+    await microtasksFinished();
 
     syncedDeviceManager.shadowRoot!
         .querySelector<HTMLElement>('#menuOpenButton')!.click();
     assertEquals(1, histogram[SyncedTabsHistogram.OPEN_ALL]);
 
     menuButton.click();
-    await flushTasks();
+    await microtasksFinished();
 
     syncedDeviceManager!.shadowRoot!
         .querySelector<HTMLElement>('#menuDeleteButton')!.click();
diff --git a/chrome/test/data/webui/history/history_synced_tabs_test.ts b/chrome/test/data/webui/history/history_synced_tabs_test.ts
index a6a90d7..2c88e776 100644
--- a/chrome/test/data/webui/history/history_synced_tabs_test.ts
+++ b/chrome/test/data/webui/history/history_synced_tabs_test.ts
@@ -252,24 +252,20 @@
     assertTrue(cards[0]!.opened);
   });
 
-  test('click synced tab', function() {
+  test('click synced tab', async () => {
     setForeignSessions(
         [createSession('Chromebook', [createWindow(['https://example.com'])])]);
-    return flushTasks()
-        .then(function() {
-          const cards = getCards(element);
-          const anchor = cards[0]!.shadowRoot!.querySelector('a')!;
-          anchor.click();
-          return testService.whenCalled('openForeignSessionTab');
-        })
-        .then(args => {
-          assertEquals('Chromebook', args.sessionTag, 'sessionTag is correct');
-          assertEquals(456, args.tabId, 'tabId is correct');
-          assertFalse(args.e.altKey, 'altKey is defined');
-          assertFalse(args.e.ctrlKey, 'ctrlKey is defined');
-          assertFalse(args.e.metaKey, 'metaKey is defined');
-          assertFalse(args.e.shiftKey, 'shiftKey is defined');
-        });
+    await microtasksFinished();
+    const cards = getCards(element);
+    const anchor = cards[0]!.shadowRoot!.querySelector('a')!;
+    anchor.click();
+    const args = await testService.whenCalled('openForeignSessionTab');
+    assertEquals('Chromebook', args.sessionTag, 'sessionTag is correct');
+    assertEquals(456, args.tabId, 'tabId is correct');
+    assertFalse(args.e.altKey, 'altKey is defined');
+    assertFalse(args.e.ctrlKey, 'ctrlKey is defined');
+    assertFalse(args.e.metaKey, 'metaKey is defined');
+    assertFalse(args.e.shiftKey, 'shiftKey is defined');
   });
 
   test('show actions menu', function() {
diff --git a/chrome/test/data/webui/side_panel/read_anything/BUILD.gn b/chrome/test/data/webui/side_panel/read_anything/BUILD.gn
index 450374d3..16d7629 100644
--- a/chrome/test/data/webui/side_panel/read_anything/BUILD.gn
+++ b/chrome/test/data/webui/side_panel/read_anything/BUILD.gn
@@ -24,6 +24,7 @@
     "highlight_menu_test.ts",
     "highlight_toggle_test.ts",
     "image_test.ts",
+    "keyboard_util_test.ts",
     "language_change_test.ts",
     "language_menu_test.ts",
     "language_toast_test.ts",
diff --git a/chrome/test/data/webui/side_panel/read_anything/keyboard_util_test.ts b/chrome/test/data/webui/side_panel/read_anything/keyboard_util_test.ts
new file mode 100644
index 0000000..dbe642a
--- /dev/null
+++ b/chrome/test/data/webui/side_panel/read_anything/keyboard_util_test.ts
@@ -0,0 +1,186 @@
+// 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 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js';
+
+import {getNewIndex, isArrow, isForwardArrow, isHorizontalArrow} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome-untrusted://webui-test/chai_assert.js';
+
+suite('Keyboard utils', () => {
+  test('isArrow', () => {
+    assertTrue(isArrow('ArrowRight'));
+    assertTrue(isArrow('ArrowUp'));
+    assertTrue(isArrow('ArrowLeft'));
+    assertTrue(isArrow('ArrowDown'));
+    assertFalse(isArrow('not a key'));
+    assertFalse(isArrow('w'));
+    assertFalse(isArrow('Tab'));
+    assertFalse(isArrow('Space'));
+  });
+
+  test('isForwardArrow ltr', () => {
+    document.documentElement.dir = 'ltr';
+
+    assertTrue(isForwardArrow('ArrowRight'));
+    assertTrue(isForwardArrow('ArrowDown'));
+    assertFalse(isForwardArrow('ArrowUp'));
+    assertFalse(isForwardArrow('ArrowLeft'));
+    assertFalse(isForwardArrow('not a key'));
+    assertFalse(isForwardArrow('w'));
+    assertFalse(isForwardArrow('Tab'));
+    assertFalse(isForwardArrow('Space'));
+  });
+
+  test('isForwardArrow rtl', () => {
+    document.documentElement.dir = 'rtl';
+
+    assertFalse(isForwardArrow('ArrowRight'));
+    assertFalse(isForwardArrow('ArrowDown'));
+    assertTrue(isForwardArrow('ArrowUp'));
+    assertTrue(isForwardArrow('ArrowLeft'));
+    assertFalse(isForwardArrow('not a key'));
+    assertFalse(isForwardArrow('w'));
+    assertFalse(isForwardArrow('Tab'));
+    assertFalse(isForwardArrow('Space'));
+  });
+
+  test('isHorizontalArrow', () => {
+    assertTrue(isHorizontalArrow('ArrowRight'));
+    assertTrue(isHorizontalArrow('ArrowLeft'));
+    assertFalse(isHorizontalArrow('ArrowUp'));
+    assertFalse(isHorizontalArrow('ArrowDown'));
+    assertFalse(isHorizontalArrow('not a key'));
+    assertFalse(isHorizontalArrow('w'));
+    assertFalse(isHorizontalArrow('Tab'));
+    assertFalse(isHorizontalArrow('Space'));
+  });
+
+  suite('getNewIndex', () => {
+    let focusableElements: HTMLElement[];
+
+    setup(() => {
+      focusableElements = [
+        document.createElement('p'),
+        document.createElement('button'),
+        document.createElement('div'),
+        document.createElement('span'),
+        document.createElement('button'),
+        document.createElement('link'),
+      ];
+    });
+
+    test('non-arrow key returns current index', () => {
+      const expectedIndex = 2;
+      const target = focusableElements[expectedIndex];
+
+      assertTrue(!!target);
+      assertEquals(expectedIndex, getNewIndex('s', target, focusableElements));
+      assertEquals(
+          expectedIndex, getNewIndex('fake key', target, focusableElements));
+      assertEquals(
+          expectedIndex, getNewIndex('Shift', target, focusableElements));
+    });
+
+    test('with ltr returns next element', () => {
+      document.documentElement.dir = 'ltr';
+      const index = 2;
+      const target = focusableElements[index];
+
+      assertTrue(!!target);
+      assertEquals(
+          index + 1, getNewIndex('ArrowRight', target, focusableElements));
+      assertEquals(
+          index + 1, getNewIndex('ArrowDown', target, focusableElements));
+      assertEquals(
+          index - 1, getNewIndex('ArrowLeft', target, focusableElements));
+      assertEquals(
+          index - 1, getNewIndex('ArrowUp', target, focusableElements));
+    });
+
+    test('with ltr wraps around', () => {
+      document.documentElement.dir = 'ltr';
+
+      let index = 0;
+      let target = focusableElements[index];
+      assertTrue(!!target);
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowLeft', target, focusableElements));
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowUp', target, focusableElements));
+
+      index = focusableElements.length - 1;
+      target = focusableElements[index];
+      assertTrue(!!target);
+      assertEquals(0, getNewIndex('ArrowRight', target, focusableElements));
+      assertEquals(0, getNewIndex('ArrowDown', target, focusableElements));
+    });
+
+    test('with ltr and element is not in the list', () => {
+      document.documentElement.dir = 'ltr';
+      const target = document.createElement('a');
+
+      assertTrue(!!target);
+      assertEquals(0, getNewIndex('ArrowRight', target, focusableElements));
+      assertEquals(0, getNewIndex('ArrowDown', target, focusableElements));
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowLeft', target, focusableElements));
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowUp', target, focusableElements));
+    });
+
+    test('with rtl returns next element', () => {
+      document.documentElement.dir = 'rtl';
+      const index = 2;
+      const target = focusableElements[index];
+
+      assertTrue(!!target);
+      assertEquals(
+          index - 1, getNewIndex('ArrowRight', target, focusableElements));
+      assertEquals(
+          index - 1, getNewIndex('ArrowDown', target, focusableElements));
+      assertEquals(
+          index + 1, getNewIndex('ArrowLeft', target, focusableElements));
+      assertEquals(
+          index + 1, getNewIndex('ArrowUp', target, focusableElements));
+    });
+
+    test('with rtl wraps around', () => {
+      document.documentElement.dir = 'rtl';
+
+      let index = 0;
+      let target = focusableElements[index];
+      assertTrue(!!target);
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowRight', target, focusableElements));
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowDown', target, focusableElements));
+
+      index = focusableElements.length - 1;
+      target = focusableElements[index];
+      assertTrue(!!target);
+      assertEquals(0, getNewIndex('ArrowLeft', target, focusableElements));
+      assertEquals(0, getNewIndex('ArrowUp', target, focusableElements));
+    });
+
+    test('with rtl and element is not in the list', () => {
+      document.documentElement.dir = 'rtl';
+      const target = document.createElement('a');
+
+      assertTrue(!!target);
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowRight', target, focusableElements));
+      assertEquals(
+          focusableElements.length - 1,
+          getNewIndex('ArrowDown', target, focusableElements));
+      assertEquals(0, getNewIndex('ArrowLeft', target, focusableElements));
+      assertEquals(0, getNewIndex('ArrowUp', target, focusableElements));
+    });
+  });
+});
diff --git a/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc b/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc
index 2620454..d612bdf 100644
--- a/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc
+++ b/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc
@@ -79,6 +79,11 @@
                    "mocha.run()");
 }
 
+IN_PROC_BROWSER_TEST_F(ReadAnythingMochaTest, KeyboardUtil) {
+  RunSidePanelTest("side_panel/read_anything/keyboard_util_test.js",
+                   "mocha.run()");
+}
+
 IN_PROC_BROWSER_TEST_F(ReadAnythingMochaTest, VoiceNotificationManager) {
   RunSidePanelTest(
       "side_panel/read_anything/voice_notification_manager_test.js",
diff --git a/chrome/test/data/webui/signin/signout_confirmation/BUILD.gn b/chrome/test/data/webui/signin/signout_confirmation/BUILD.gn
new file mode 100644
index 0000000..198ea99d
--- /dev/null
+++ b/chrome/test/data/webui/signin/signout_confirmation/BUILD.gn
@@ -0,0 +1,27 @@
+# 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/chromeos/ui_mode.gni")
+import("//components/signin/features.gni")
+import("../../build_webui_tests.gni")
+
+assert(!is_chromeos && enable_dice_support)
+
+build_webui_tests("build") {
+  files = [
+    "signout_confirmation_view_test.ts",
+    "test_signout_confirmation_browser_proxy.ts",
+  ]
+
+  ts_path_mappings = [ "chrome://signout-confirmation/signout_confirmation.js|" + rebase_path(
+                           "$root_gen_dir/chrome/browser/resources/signin/signout_confirmation/tsc/signout_confirmation.d.ts",
+                           target_gen_dir) ]
+
+  ts_deps = [
+    "//chrome/browser/resources/signin/signout_confirmation:build_ts",
+    "//third_party/lit/v3_0:build_ts",
+    "//ui/webui/resources/cr_elements:build_ts",
+    "//ui/webui/resources/js:build_ts",
+  ]
+}
diff --git a/chrome/test/data/webui/signin/signout_confirmation/signout_confirmation_browsertest.cc b/chrome/test/data/webui/signin/signout_confirmation/signout_confirmation_browsertest.cc
new file mode 100644
index 0000000..f020c28
--- /dev/null
+++ b/chrome/test/data/webui/signin/signout_confirmation/signout_confirmation_browsertest.cc
@@ -0,0 +1,19 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/test/base/web_ui_mocha_browser_test.h"
+#include "content/public/test/browser_test.h"
+
+class SignoutConfirmationBrowserTest : public WebUIMochaBrowserTest {
+ public:
+  SignoutConfirmationBrowserTest() {
+    set_test_loader_host(chrome::kChromeUISignoutConfirmationHost);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(SignoutConfirmationBrowserTest, MainView) {
+  RunTest("signin/signout_confirmation/signout_confirmation_view_test.js",
+          "mocha.run()");
+}
diff --git a/chrome/test/data/webui/signin/signout_confirmation/signout_confirmation_view_test.ts b/chrome/test/data/webui/signin/signout_confirmation/signout_confirmation_view_test.ts
new file mode 100644
index 0000000..18748cc4
--- /dev/null
+++ b/chrome/test/data/webui/signin/signout_confirmation/signout_confirmation_view_test.ts
@@ -0,0 +1,76 @@
+// 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 'chrome://signout-confirmation/signout_confirmation.js';
+
+import {SignoutConfirmationBrowserProxyImpl} from 'chrome://signout-confirmation/signout_confirmation.js';
+import type {PageRemote, SignoutConfirmationAppElement} from 'chrome://signout-confirmation/signout_confirmation.js';
+import {assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {keyDownOn} from 'chrome://webui-test/keyboard_mock_interactions.js';
+import type {ModifiersParam} from 'chrome://webui-test/keyboard_mock_interactions.js';
+import {isChildVisible, isVisible, microtasksFinished} from 'chrome://webui-test/test_util.js';
+
+import {TestSignoutConfirmationBrowserProxy} from './test_signout_confirmation_browser_proxy.js';
+
+suite('SignoutConfirmationViewTest', function() {
+  let signoutConfirmationApp: SignoutConfirmationAppElement;
+  let testProxy: TestSignoutConfirmationBrowserProxy;
+  let callbackRouterRemote: PageRemote;
+
+  function keyDown(item: HTMLElement, key: string, modifiers?: ModifiersParam) {
+    keyDownOn(item, 0, modifiers, key);
+  }
+
+  setup(function() {
+    testProxy = new TestSignoutConfirmationBrowserProxy();
+    callbackRouterRemote =
+        testProxy.callbackRouter.$.bindNewPipeAndPassRemote();
+    SignoutConfirmationBrowserProxyImpl.setInstance(testProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    signoutConfirmationApp = document.createElement('signout-confirmation-app');
+    document.body.append(signoutConfirmationApp);
+
+    callbackRouterRemote.sendSignoutConfirmationData({
+      dialogTitle: 'title',
+      dialogSubtitle: 'subtitle',
+      acceptButtonLabel: 'accept',
+      cancelButtonLabel: 'cancel',
+    });
+
+    return testProxy.handler.whenCalled('updateViewHeight');
+  });
+
+  test('HeaderContent', async function() {
+    assertTrue(isVisible(signoutConfirmationApp));
+    await microtasksFinished();
+
+    // Header.
+    assertTrue(isChildVisible(signoutConfirmationApp, '#header'));
+    assertTrue(isChildVisible(signoutConfirmationApp, '#title'));
+    assertTrue(isChildVisible(signoutConfirmationApp, '#subtitle'));
+
+    // Buttons.
+    assertTrue(isChildVisible(signoutConfirmationApp, '#acceptButton'));
+    assertTrue(isChildVisible(signoutConfirmationApp, '#cancelButton'));
+  });
+
+  test('ClickAccept', function() {
+    assertTrue(isVisible(signoutConfirmationApp));
+    signoutConfirmationApp.$.acceptButton.click();
+    return testProxy.handler.whenCalled('accept');
+  });
+
+  test('ClickCancel', function() {
+    assertTrue(isVisible(signoutConfirmationApp));
+    signoutConfirmationApp.$.cancelButton.click();
+    return testProxy.handler.whenCalled('cancel');
+  });
+
+  test('CloseDialog', function() {
+    assertTrue(isVisible(signoutConfirmationApp));
+    keyDown(signoutConfirmationApp, 'Escape');
+    return testProxy.handler.whenCalled('close');
+  });
+});
diff --git a/chrome/test/data/webui/signin/signout_confirmation/test_signout_confirmation_browser_proxy.ts b/chrome/test/data/webui/signin/signout_confirmation/test_signout_confirmation_browser_proxy.ts
new file mode 100644
index 0000000..a74559e
--- /dev/null
+++ b/chrome/test/data/webui/signin/signout_confirmation/test_signout_confirmation_browser_proxy.ts
@@ -0,0 +1,42 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {PageCallbackRouter} from 'chrome://signout-confirmation/signout_confirmation.js';
+import type {PageHandlerInterface, SignoutConfirmationBrowserProxy} from 'chrome://signout-confirmation/signout_confirmation.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+
+class TestSignoutConfirmationHandler extends TestBrowserProxy implements
+    PageHandlerInterface {
+  constructor() {
+    super([
+      'updateViewHeight',
+      'accept',
+      'cancel',
+      'close',
+    ]);
+  }
+
+  updateViewHeight(height: number) {
+    this.methodCalled('updateViewHeight', height);
+  }
+
+  accept() {
+    this.methodCalled('accept');
+  }
+
+  cancel() {
+    this.methodCalled('cancel');
+  }
+
+  close() {
+    this.methodCalled('close');
+  }
+}
+
+export class TestSignoutConfirmationBrowserProxy implements
+    SignoutConfirmationBrowserProxy {
+  callbackRouter: PageCallbackRouter = new PageCallbackRouter();
+  handler: TestSignoutConfirmationHandler =
+      new TestSignoutConfirmationHandler();
+}
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn
index c90ced1..01f4745d 100644
--- a/chromecast/base/BUILD.gn
+++ b/chromecast/base/BUILD.gn
@@ -250,12 +250,10 @@
   } else {
     public_deps = [ ":dummy_create_sys_info" ]
   }
-
-#  The shlib might be needed for Linux, but was never picked up for 'public' builds.
-#  } else {
-#    public_deps = [ ":shlib_create_sys_info" ]
-#  }
-
+  #  The shlib might be needed for Linux, but was never picked up for 'public' builds.
+  #  } else {
+  #    public_deps = [ ":shlib_create_sys_info" ]
+  #  }
 }
 
 cast_source_set("thread_health_checker") {
@@ -315,11 +313,14 @@
       "$java_src_dir/org/chromium/chromecast/base/Box.java",
       "$java_src_dir/org/chromium/chromecast/base/Cell.java",
       "$java_src_dir/org/chromium/chromecast/base/Controller.java",
+      "$java_src_dir/org/chromium/chromecast/base/LocalService.java",
       "$java_src_dir/org/chromium/chromecast/base/Observable.java",
       "$java_src_dir/org/chromium/chromecast/base/Observer.java",
       "$java_src_dir/org/chromium/chromecast/base/OwnedScope.java",
+      "$java_src_dir/org/chromium/chromecast/base/Pool.java",
       "$java_src_dir/org/chromium/chromecast/base/Scope.java",
       "$java_src_dir/org/chromium/chromecast/base/Sequencer.java",
+      "$java_src_dir/org/chromium/chromecast/base/SharedObservable.java",
       "$java_src_dir/org/chromium/chromecast/base/Unit.java",
 
       # TODO(sanfin): Move these files to another target.
@@ -362,6 +363,7 @@
       "$java_test_dir/org/chromium/chromecast/base/CastSettingsManagerTest.java",
       "$java_test_dir/org/chromium/chromecast/base/CellTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ControllerTest.java",
+      "$java_test_dir/org/chromium/chromecast/base/LocalServiceTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ObservableAfterTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ObservableAlarmTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ObservableAndTest.java",
@@ -379,6 +381,7 @@
       "$java_test_dir/org/chromium/chromecast/base/ObservableOrTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ObserverTest.java",
       "$java_test_dir/org/chromium/chromecast/base/OwnedScopeTest.java",
+      "$java_test_dir/org/chromium/chromecast/base/PoolTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ReactiveRecorderTest.java",
       "$java_test_dir/org/chromium/chromecast/base/ScopeTest.java",
       "$java_test_dir/org/chromium/chromecast/base/SequencerTest.java",
@@ -391,6 +394,7 @@
       "//base:base_java_test_support",
       "//base:base_junit_test_support",
       "//build/android:build_java",
+      "//third_party/androidx:androidx_test_core_java",
       "//third_party/hamcrest:hamcrest_java",
       "//third_party/jni_zero:jni_zero_java",
       "//third_party/mockito:mockito_java",
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Both.java b/chromecast/base/java/src/org/chromium/chromecast/base/Both.java
index a265100..0f7a6cd5 100644
--- a/chromecast/base/java/src/org/chromium/chromecast/base/Both.java
+++ b/chromecast/base/java/src/org/chromium/chromecast/base/Both.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chromecast.base;
 
+import androidx.annotation.NonNull;
+
 import java.util.Objects;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
@@ -63,20 +65,14 @@
         return Objects.hash(this.first, this.second);
     }
 
-    /**
-     * Constructs a Both object containing both `a` and `b`.
-     */
-    public static <A, B> Both<A, B> both(A a, B b) {
-        assert a != null;
-        assert b != null;
+    /** Constructs a Both object containing both `a` and `b`. */
+    public static <A, B> Both<A, B> of(@NonNull A a, @NonNull B b) {
         return new Both<>(a, b);
     }
 
-    /**
-     * Turns a function of two arguments into a function of a single Both argument.
-     */
-    public static <A, B, R> Function<Both<A, B>, R> adapt(
-            BiFunction<? super A, ? super B, ? extends R> function) {
+    /** Turns a function of two arguments into a function of a single Both argument. */
+    public static <A, B, C> Function<Both<A, B>, C> adapt(
+            BiFunction<? super A, ? super B, ? extends C> function) {
         return (Both<A, B> data) -> function.apply(data.first, data.second);
     }
 
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/LocalService.java b/chromecast/base/java/src/org/chromium/chromecast/base/LocalService.java
new file mode 100644
index 0000000..fa5103d
--- /dev/null
+++ b/chromecast/base/java/src/org/chromium/chromecast/base/LocalService.java
@@ -0,0 +1,114 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chromecast.base;
+
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Binder;
+import android.os.IBinder;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Base class for services that are only bound to by other clients in the same application, running
+ * in the same process.
+ *
+ * <p>Implementing this gives a way to establish a many-to-one relationship between components that
+ * "share" some resource. The lifetime of the resource itself can be managed by the implementation's
+ * bind() method, cleaning up the resource when the last observer unsubscribes.
+ *
+ * <p>Services that extend this class must NOT be exported (android:exported="false" in the
+ * manifest).
+ *
+ * @param <T> Data type to observe.
+ */
+public abstract class LocalService<T> extends Service {
+    private static final Map<Intent, IBinder> sIntentMap = new HashMap<>();
+    private static final Map<IBinder, Observable<?>> sBinderMap = new HashMap<>();
+
+    /**
+     * Returns an Observable that is notified when the service is bound, and is closed when the
+     * service is unbound.
+     *
+     * <p>This method is called when the service is bound, and the Observable returned is subscribed
+     * to by the local clients that are bound to the service.
+     *
+     * <p>The Observable returned by this method will be unsubscribed when the service is unbound.
+     *
+     * <p>If multiple clients bind with identical Intents, this method will only be called once. If
+     * multiple clients bind with different Intents, this method will be called once for each unique
+     * Intent, with a different Observable returned each time.
+     */
+    protected abstract Observable<T> bind(Intent intent);
+
+    private static Observable<IBinder> connect(Context context, Intent intent) {
+        return observer -> {
+            OwnedScope scope = new OwnedScope();
+            ServiceConnection connection =
+                    new ServiceConnection() {
+                        @Override
+                        public void onServiceConnected(ComponentName name, IBinder service) {
+                            scope.set(observer.open(service));
+                        }
+
+                        @Override
+                        public void onServiceDisconnected(ComponentName name) {
+                            scope.close();
+                        }
+                    };
+            context.bindService(intent, connection, Context.BIND_AUTO_CREATE);
+            return scope.and(() -> context.unbindService(connection));
+        };
+    }
+
+    /**
+     * Each implementation of LocalService should create a public static connect() method that takes
+     * the input arguments for the service and returns an Observable<T> that serves as a proxy to
+     * the Observable<T> returned by the service's bind() method.
+     *
+     * <p>This static method helps LocalService implementations implement such methods by doing the
+     * heavy lifting of adapting the result of bind() to a proxy Observable<T> and making it
+     * available to the client.
+     *
+     * <p>Example:
+     *
+     * <pre>{@code
+     * public class FooService extends LocalService<Foo> {
+     *   @Override
+     *   protected Observable<Foo> bind(Intent intent) {
+     *     return ...;
+     *   }
+     *
+     *   public static SharedObservable<Foo> connect(Context context) {
+     *     return LocalService.connect(Foo.class, context, new Intent(context, FooService.class));
+     *   }
+     * }
+     * }</pre>
+     */
+    protected static <T> SharedObservable<T> connect(
+            Class<T> clazz, Context context, Intent intent) {
+        return connect(context, intent).flatMap(sBinderMap::get).map(clazz::cast).share();
+    }
+
+    @Override
+    public final IBinder onBind(Intent intent) {
+        IBinder binder = new Binder();
+        Observable<T> observable = bind(intent);
+        sIntentMap.put(intent, binder);
+        sBinderMap.put(binder, observable);
+        return binder;
+    }
+
+    @Override
+    public final boolean onUnbind(Intent intent) {
+        IBinder binder = sIntentMap.remove(intent);
+        sBinderMap.remove(binder);
+        return false;
+    }
+}
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java b/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java
index 945c638..41b3cfbf 100644
--- a/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java
+++ b/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java
@@ -8,13 +8,12 @@
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
-
 import java.util.function.Supplier;
 
 /**
  * Interface for Observable state.
  *
- * Observables can have some data associated with them, which is provided to observers when the
+ * <p>Observables can have some data associated with them, which is provided to observers when the
  * Observable activates.
  *
  * @param <T> The type of the activation data.
@@ -24,10 +23,10 @@
     /**
      * Tracks this Observable with the given observer.
      *
-     * When this Observable is activated, the observer will be opened with the activation data to
+     * <p>When this Observable is activated, the observer will be opened with the activation data to
      * produce a scope. When this Observable is deactivated, that scope will be closed.
      *
-     * When the returned Scope (referred to as a "subscription") is closed, the observer's scopes
+     * <p>When the returned Scope (referred to as a "subscription") is closed, the observer's scopes
      * will be closed and the observer will no longer be notified of updates.
      */
     Scope subscribe(Observer<? super T> observer);
@@ -36,23 +35,24 @@
      * Creates an Observable that opens observers's scopes only if both `this` and `other` are
      * activated, and closes those scopes if either of `this` or `other` are deactivated.
      *
-     * This is useful for creating an event handler that should only activate when two events
+     * <p>This is useful for creating an event handler that should only activate when two events
      * have occurred, but those events may occur in any order.
      */
     default <U> Observable<Both<T, U>> and(Observable<U> other) {
-        return flatMap(t -> other.flatMap(u -> just(Both.both(t, u))));
+        return flatMap(t -> other.flatMap(u -> just(Both.of(t, u))));
     }
 
     /**
      * Creates an Observable out of the activations of `this` and `other`. An observer that is
      * subscribed to the result will be subscribed to both `this` and `other` at the same time.
      *
-     * This combines Observables in the same way that concatenation combines lists. This operation
-     * forms a monoid over Observables with empty() as the identity element. I.e. for all
+     * <p>This combines Observables in the same way that concatenation combines lists. This
+     * operation forms a monoid over Observables with empty() as the identity element. I.e. for all
      * Observables `x`:
      *
-     *   x.or(empty()) == x
-     *   empty().or(x) == x
+     * <pre>{@code
+     * x.or(empty()) == x empty().or(x) == x
+     * }</pre>
      */
     default Observable<T> or(Observable<T> other) {
         return observer -> subscribe(observer).and(other.subscribe(observer));
@@ -61,7 +61,7 @@
     /**
      * Returns an Observable that is only activated with the values added after subscription.
      *
-     * Some Observables synchronously notify observers of their current state the moment they are
+     * <p>Some Observables synchronously notify observers of their current state the moment they are
      * subscribed. This operator filters these out and only notifies the observer of changes that
      * occur after the moment of subscription.
      */
@@ -77,7 +77,7 @@
     /**
      * Returns an Observable that is activated when `this` and `other` are activated in order.
      *
-     * This is similar to `and()`, but does not activate if `other` is activated before `this`.
+     * <p>This is similar to `and()`, but does not activate if `other` is activated before `this`.
      */
     default <U> Observable<Both<T, U>> andThen(Observable<U> other) {
         return and(other.after());
@@ -86,7 +86,7 @@
     /**
      * Returns an Observable that applies the given Function to this Observable's activation values.
      */
-    default <R> Observable<R> map(Function<? super T, ? extends R> f) {
+    default <U> Observable<U> map(Function<? super T, ? extends U> f) {
         return flatMap(t -> just(f.apply(t)));
     }
 
@@ -94,24 +94,24 @@
      * Returns an Observable that applies the given Function to this Observable's activation data,
      * and notifies observers with the activation data of the Observable returned by the Function.
      *
-     * If you have a function that returns an Observable, you can use this to avoid using map() to
-     * create an Observable of Observables.
+     * <p>If you have a function that returns an Observable, you can use this to avoid using map()
+     * to create an Observable of Observables.
      *
-     * This is an extremely powerful operation! Observables are a monad where flatMap() is the
+     * <p>This is an extremely powerful operation! Observables are a monad where flatMap() is the
      * "bind" operation that combines an Observable with a function that returns an Observable to
      * create a new Observable.
      *
-     * One use case could be using Observables as "promises" and using flatMap() with "async
+     * <p>One use case could be using Observables as "promises" and using flatMap() with "async
      * functions" that return Observables to create asynchronous programs:
      *
-     *   Observable<Foo> getFooAsync();
-     *   Observable<Bar> getBarAsync(Foo foo);
-     *   Scope useBar(Bar bar);
-     *
-     *   getFooAsync().flatMap(foo -> getBarAsync(foo)).subscribe(bar -> useBar(bar));
+     * <pre>{@code
+     * Observable<Foo> getFoo();
+     * Observable<Bar> getBar(Foo foo);
+     * Scope useBar(Bar bar);
+     * getFoo().flatMap(foo -> getBar(foo)).subscribe(bar -> useBar(bar));
+     * }</pre>
      */
-    default <R> Observable<R> flatMap(
-            Function<? super T, ? extends Observable<? extends R>> f) {
+    default <U> Observable<U> flatMap(Function<? super T, ? extends Observable<? extends U>> f) {
         return observer -> subscribe(t -> f.apply(t).subscribe(r -> observer.open(r)));
     }
 
@@ -123,40 +123,39 @@
         return flatMap(t -> predicate.test(t) ? just(t) : empty());
     }
 
-    /**
-     * Returns an Observable with its type mapped to Unit.
-     */
+    /** Returns an Observable with its type mapped to Unit. */
     default Observable<Unit> opaque() {
         return map(x -> Unit.unit());
     }
 
     /**
      * Returns an Observable that accumulates this Observable's data into another Observable by
-     * invoking |acc| whenever data are added to this, and closing the Scope it returns whenever
-     * the data that added it is removed from this.
+     * invoking |acc| whenever data are added to this, and closing the Scope it returns whenever the
+     * data that added it is removed from this.
      *
-     * The |factory| must create some object that extends Observable. Typically, this is a mutable
-     * object like Cell (used in the implementation of fold()). This mutable Observable is passed
-     * alongside the data from this Observable to the |acc| function, which can decide to mutate the
-     * mutable Observable with whatever transformation of the data it chooses. The |acc| function
-     * then returns a Scope which can defer another mutation operation until when the data are
-     * removed from this Observable.
+     * <p>The |factory| must create some object that extends Observable. Typically, this is a
+     * mutable object like Cell (used in the implementation of fold()). This mutable Observable is
+     * passed alongside the data from this Observable to the |acc| function, which can decide to
+     * mutate the mutable Observable with whatever transformation of the data it chooses. The |acc|
+     * function then returns a Scope which can defer another mutation operation until when the data
+     * are removed from this Observable.
      *
-     * This has a number of use cases. The fold() operator uses this with Cell to aggregate all the
-     * simultaneous activations of the source into an Observable of a single value, which is useful
-     * for computing sums or counts of the data (which in turn is used by the not() operator).
+     * <p>This has a number of use cases. The fold() operator uses this with Cell to aggregate all
+     * the simultaneous activations of the source into an Observable of a single value, which is
+     * useful for computing sums or counts of the data (which in turn is used by the not()
+     * operator).
      *
-     * Another use case is taking the most recent activation from the source Observable and
+     * <p>Another use case is taking the most recent activation from the source Observable and
      * deduplicating equal activations.
      *
-     *   Observable<Foo> source = ...;
-     *   // |deduped| will have only one activation at a time, will not drop those activations if
-     *   // the |source| revokes them, and will not deactivate and reactivate if |source| produces
-     *   // data that .equals() the most recent data that preceded it.
-     *   Observable<Foo> deduped = source.accumulate(() -> new Controller<Foo>(), (a, foo) -> {
-     *       a.set(foo);
-     *       return Scope.NO_OP;
-     *   });
+     * <pre>{@code
+     * Observable<Foo> source = ...; // |deduped| will have only one activation at a time, will not
+     *                               // drop those activations if the |source| revokes them, and
+     *                               // will not deactivate and reactivate if |source| produces data
+     *                               // that .equals() the most recent data that preceded it.
+     * Observable<Foo> deduped = source.accumulate(() -> new Controller<Foo>(), (a, foo) -> {
+     *   a.set(foo); return Scope.NO_OP; });
+     * }</pre>
      */
     default <U, A extends Observable<U>> Observable<U> accumulate(
             Supplier<A> factory, BiFunction<A, T, ? extends Scope> acc) {
@@ -172,40 +171,44 @@
      * do so once it receives a new *distinct* activation from |this|. If a new activation is
      * equivalent to the previous one, it is ignored.
      *
-     * This provides a way to conveniently "break seams" in streams of data. If, for example, an
+     * <p>This provides a way to conveniently "break seams" in streams of data. If, for example, an
      * Observable emits `true`, `true`, `false`, `true`, in that order, the distinctUntilChanged()
      * Observable will emit `true`, `false`, `true` (dropping the redundant `true`).
      */
     default Observable<T> distinctUntilChanged() {
-        return accumulate(Controller::new, (c, t) -> {
-            c.set(t);
-            return Scope.NO_OP;
-        });
+        return accumulate(
+                Controller::new,
+                (c, t) -> {
+                    c.set(t);
+                    return Scope.NO_OP;
+                });
     }
 
     /**
-     * Returns an Observable that combines the state of all of this Observable's data into
-     * a single activation of type A, where the state is combined by successively applying |acc|
-     * when this Observable adds data, and |dim| when this Observable removes data.
+     * Returns an Observable that combines the state of all of this Observable's data into a single
+     * activation of type A, where the state is combined by successively applying |acc| when this
+     * Observable adds data, and |dim| when this Observable removes data.
      *
-     * By default, if |this| is empty, then the result Observable will be activated with the value
-     * of |start|. If |this| is activated with data, then that T-typed data and the current A-typed
-     * data from the result Observable will be fed to |acc| to calculate the new A-typed data for
-     * the result Observable. If |this| has data deactivated, then that data, along with the current
-     * A-typed data from the result Observable, will be fed to |dim| to calculate the new A-typed
-     * data for the result Observable.
+     * <p>By default, if |this| is empty, then the result Observable will be activated with the
+     * value of |start|. If |this| is activated with data, then that T-typed data and the current
+     * A-typed data from the result Observable will be fed to |acc| to calculate the new A-typed
+     * data for the result Observable. If |this| has data deactivated, then that data, along with
+     * the current A-typed data from the result Observable, will be fed to |dim| to calculate the
+     * new A-typed data for the result Observable.
      *
-     * There is always exactly one activation in the result Observable.
+     * <p>There is always exactly one activation in the result Observable.
      *
-     * This method provides a generic way to combine the state of multiple activations, "remember"
-     * previous activations, or keep track of ordering in a way that can't be done with pure monadic
-     * operations.
+     * <p>This method provides a generic way to combine the state of multiple activations,
+     * "remember" previous activations, or keep track of ordering in a way that can't be done with
+     * pure monadic operations.
      */
     default <A> Observable<A> fold(A start, BiFunction<A, T, A> acc, BiFunction<A, T, A> dim) {
-        return accumulate(() -> new Cell<A>(start), (current, t) -> {
-            current.mutate(a -> acc.apply(a, t));
-            return () -> current.mutate(a -> dim.apply(a, t));
-        });
+        return accumulate(
+                () -> new Cell<A>(start),
+                (current, t) -> {
+                    current.mutate(a -> acc.apply(a, t));
+                    return () -> current.mutate(a -> dim.apply(a, t));
+                });
     }
 
     /**
@@ -216,16 +219,12 @@
         return fold(0, (n, x) -> n + 1, (n, x) -> n - 1);
     }
 
-    /**
-     * Returns an Observable that is activated only when the given Observable is not activated.
-     */
+    /** Returns an Observable that is activated only when the given Observable is not activated. */
     static Observable<?> not(Observable<?> observable) {
         return observable.count().filter(n -> n == 0);
     }
 
-    /**
-     * A degenerate Observable that has no data.
-     */
+    /** A degenerate Observable that has no data. */
     static <T> Observable<T> empty() {
         return observer -> Scope.NO_OP;
     }
@@ -233,33 +232,37 @@
     /**
      * Creates an Observable that notifies subscribers with a single immutable value.
      *
-     * This is the "return" operation in the Observable monad.
+     * <p>This is the "return" operation in the Observable monad.
      */
     static <T> Observable<T> just(T value) {
-        if (value == null) return empty();
+        if (value == null) {
+            return empty();
+        }
         return observer -> observer.open(value);
     }
 
     /**
      * Push debug info about subscriptions and state transitions to a logger.
      *
-     * The logger is a consumer of strings. Typically, the consumer should be a lambda that prints
-     * the input using org.chromium.base.Log with any extra info you want to include. See
+     * <p>The logger is a consumer of strings. Typically, the consumer should be a lambda that
+     * prints the input using org.chromium.base.Log with any extra info you want to include. See
      * chromium/base/reactive_java.md for an example.
      *
-     * By passing a Consumer instead of having debug() call logger methods directly, you can 1)
+     * <p>By passing a Consumer instead of having debug() call logger methods directly, you can 1)
      * control the logging level, or use alternative loggers, and 2) when using chromium's logger,
      * see the right file name and line number in the logs.
      */
     default Observable<T> debug(Consumer<String> logger) {
         return observer -> {
             logger.accept("subscribe");
-            Scope subscription = subscribe(data -> {
-                logger.accept("open " + data);
-                Scope scope = observer.open(data);
-                Scope debugClose = () -> logger.accept("close " + data);
-                return scope.and(debugClose);
-            });
+            Scope subscription =
+                    subscribe(
+                            data -> {
+                                logger.accept("open " + data.toString());
+                                Scope scope = observer.open(data);
+                                Scope debugClose = () -> logger.accept("close " + data.toString());
+                                return scope.and(debugClose);
+                            });
             Scope debugUnsubscribe = () -> logger.accept("unsubscribe");
             return subscription.and(debugUnsubscribe);
         };
@@ -278,13 +281,13 @@
      * Return an Observable that activates a given amount of time (in milliseconds) after it is
      * subscribed to.
      *
-     * Note that the alarm countdown starts when subscribed, not when the Observable is constructed.
-     * Therefore, if there are multiple observers, each will have its own timer.
+     * <p>Note that the alarm countdown starts when subscribed, not when the Observable is
+     * constructed. Therefore, if there are multiple observers, each will have its own timer.
      *
-     * If you use an alarm as the argument to an `.and()` operator, for example, a unique timer will
-     * start for each activation of the left-hand side of the `.and()` call.
+     * <p>If you use an alarm as the argument to an `.and()` operator, for example, a unique timer
+     * will start for each activation of the left-hand side of the `.and()` call.
      *
-     * The Scheduler is responsible for executing a Runnable after the given delay has elapsed,
+     * <p>The Scheduler is responsible for executing a Runnable after the given delay has elapsed,
      * preferably on the same thread that invoked its postDelayed() method, unless the observers of
      * this Observable are thread-safe.
      */
@@ -299,14 +302,42 @@
     /**
      * An Observable that delays any activations by the given amount of time.
      *
-     * If the activation is revoked before the given amount of time elapses, the activation is
+     * <p>If the activation is revoked before the given amount of time elapses, the activation is
      * effectively "canceled" from the perspective of observers.
      *
-     * The Scheduler is responsible for executing a Runnable after the given delay has elapsed,
+     * <p>The Scheduler is responsible for executing a Runnable after the given delay has elapsed,
      * preferably on the same thread that invoked its postDelayed() method, unless the observers of
      * this Observable are thread-safe.
      */
     default Observable<T> delay(Scheduler scheduler, long ms) {
         return flatMap(t -> alarm(scheduler, ms).map(x -> t));
     }
+
+    /**
+     * Returns an Observable that allows multiple observers to be subscribed while only subscribing
+     * to the source Observable once (for as long as anything is subscribed to the result).
+     *
+     * <p>Data is cached in a Pool, which adds a O(n) overhead where n is the number of concurrent
+     * activations in the source Observable.
+     *
+     * <p>The source Observable is only subscribed to when the Pool has nonzero observers. When an
+     * observer is subscribed, they are given all of the current data in the Pool, which is first
+     * populated from the contents of the source Observable through the unique intermediate
+     * observer. The scopes the Observers of the result return are closed when the data is removed
+     * from the Pool, which happens when data is removed from the source Observable.
+     *
+     * <p>This means that the "observable" behavior of an Observable should be the same for a shared
+     * Observable as it is for a non-shared Observable, but if subscription has side-effects, or
+     * does expensive work, the shared Observable "caches" the result of that work.
+     *
+     * <p>The main use case for this is implementing Observables for expensive asynchronous
+     * operations or "hot" CPU-intensive computations that should not be duplicated, but may be
+     * subscribed to by multiple observers.
+     *
+     * <p>In particular, this is useful for implementing LocalService.connect(), which needs to
+     * return a shared Observable that only binds to the service once.
+     */
+    default SharedObservable<T> share() {
+        return SharedObservable.from(this);
+    }
 }
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Pool.java b/chromecast/base/java/src/org/chromium/chromecast/base/Pool.java
new file mode 100644
index 0000000..1fccf6b6
--- /dev/null
+++ b/chromecast/base/java/src/org/chromium/chromecast/base/Pool.java
@@ -0,0 +1,117 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chromecast.base;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An Observable with at any number of activations at a time, with mutators that add or remove
+ * activation data.
+ *
+ * <p>Unlike a Controller, a Pool can have any number of activations at a time. When an observer is
+ * subscribed, it will be notified of all current activations, and the Scopes returned by the
+ * observer will only be closed when the data is removed, even if more data is added earlier.
+ *
+ * <p>Mutator methods on this class are sequenced: if calling one causes an Observer to call another
+ * sequenced mutator method synchronously, the nested call will be deferred until the outer call is
+ * finished. This ensures that all subscribed Observers are notified of all state changes.
+ *
+ * @param <T> The type of the activation data.
+ */
+public class Pool<T> implements Observable<T> {
+    private static class InsertionId {}
+
+    private final Sequencer mSequencer = new Sequencer();
+    private final List<Observer<? super T>> mObservers = new ArrayList<>();
+    private final Map<Both<Observer<? super T>, InsertionId>, Scope> mScopeMap = new HashMap<>();
+    private final Map<InsertionId, T> mData = new HashMap<>();
+    private final List<InsertionId> mInsertionOrder = new ArrayList<>();
+
+    /**
+     * Tracks this Pool with the given observer.
+     *
+     * <p>An Observer of a Pool may be activated with multiple items at a time. Items may be freely
+     * added or removed from the Pool in any order, and duplicate items are allowed.
+     *
+     * <p>It is possible for multiple identical items to be added to the Pool, so make sure that if
+     * you are keeping track of activations in some data structure like a Set or a Map, you are
+     * taking this possibility into account. For example, if you are adding activation data to a
+     * HashSet in an Observer's open() method and removing it in the respective Scope's close()
+     * method, you may end up with double-removes and/or idempotent adds if the Pool contains
+     * duplicate items.
+     *
+     * <p>When the returned Scope (referred to as a "subscription") is closed, the observer's scopes
+     * will be closed in the reverse order that they were opened, and the observer will no longer be
+     * notified of updates.
+     */
+    @Override
+    public Scope subscribe(Observer<? super T> observer) {
+        mSequencer.sequence(
+                () -> {
+                    mObservers.add(observer);
+                    for (InsertionId id : mInsertionOrder) {
+                        notifyEnter(observer, id);
+                    }
+                });
+        return () ->
+                mSequencer.sequence(
+                        () -> {
+                            for (int i = mData.size() - 1; i >= 0; i--) {
+                                var id = mInsertionOrder.get(i);
+                                notifyExit(observer, id);
+                            }
+                            mObservers.remove(observer);
+                        });
+    }
+
+    /**
+     * Adds data to the Pool, and returns a Scope that removes the data when closed.
+     *
+     * <p>You can add the same data (by equals() or identity) multiple times. The returned Scope
+     * will remove the exact occurrence of the data that was added in its originating call to add().
+     */
+    public Scope add(@NonNull T data) {
+        var id = new InsertionId();
+        mSequencer.sequence(
+                () -> {
+                    mInsertionOrder.add(id);
+                    mData.put(id, data);
+                    for (Observer<? super T> observer : mObservers) {
+                        notifyEnter(observer, id);
+                    }
+                });
+        return () ->
+                mSequencer.sequence(
+                        () -> {
+                            for (int i = mObservers.size() - 1; i >= 0; i--) {
+                                notifyExit(mObservers.get(i), id);
+                            }
+                            mData.remove(id);
+                            mInsertionOrder.remove(id);
+                        });
+    }
+
+    @SuppressWarnings("Assertion")
+    private void notifyEnter(Observer<? super T> observer, InsertionId id) {
+        assert mSequencer.inSequence();
+        T data = mData.get(id);
+        Scope scope = observer.open(data);
+        assert scope != null;
+        mScopeMap.put(Both.of(observer, id), scope);
+    }
+
+    @SuppressWarnings("Assertion")
+    private void notifyExit(Observer<? super T> observer, InsertionId id) {
+        assert mSequencer.inSequence();
+        try (Scope scope = mScopeMap.remove(Both.of(observer, id))) {
+            assert scope != null;
+        }
+    }
+}
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/SharedObservable.java b/chromecast/base/java/src/org/chromium/chromecast/base/SharedObservable.java
new file mode 100644
index 0000000..77cd42a
--- /dev/null
+++ b/chromecast/base/java/src/org/chromium/chromecast/base/SharedObservable.java
@@ -0,0 +1,77 @@
+// 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.chromecast.base;
+
+/**
+ * An Observable that can be subscribed to multiple times.
+ *
+ * <p>This is a marker class that allows statically checking that an Observable is shared. A shared
+ * Observable can be subscribed to arbitrarily many times, but will only do "work" for the first
+ * subscription. See the share() method of Observable for more details.
+ *
+ * @param <T> Type of the observable.
+ */
+public final class SharedObservable<T> implements Observable<T> {
+    private final Observable<T> mSrc;
+    private final Pool<T> mCache = new Pool<>();
+    private final OwnedScope mLiveness = new OwnedScope();
+    private int mNumObservers;
+
+    /**
+     * Creates a SharedObservable from an Observable. Returns the original Observable if it is
+     * already a SharedObservable.
+     *
+     * <p>Prefer to use Observable.share() instead of this method.
+     */
+    public static <T> SharedObservable<T> from(Observable<T> mSrc) {
+        if (mSrc instanceof SharedObservable) {
+            return (SharedObservable<T>) mSrc;
+        }
+        return new SharedObservable<>(mSrc);
+    }
+
+    private SharedObservable(Observable<T> mSrc) {
+        this.mSrc = mSrc;
+    }
+
+    /**
+     * Does the same thing as Observable.subscribe(), but ensures that the wrapped Observable is
+     * only subscribed to once.
+     *
+     * <p>Observers are subscribed to a mCached copy of the data from |mSrc|, which is actively
+     * updated only as long as there are any observers subscribed to |this|.
+     */
+    @Override
+    public final Scope subscribe(Observer<? super T> observer) {
+        addObserver();
+        return mCache.subscribe(observer).and(this::removeObserver);
+    }
+
+    /**
+     * Returns this SharedObservable.
+     *
+     * <p>This makes share() an idempotent operation on any Observable, making it safe to call
+     * share() on a given Observable that may happen to be a SharedObservable without worrying about
+     * incurring extra overhead by adding more layers of caching and subscription-counting.
+     */
+    @Override
+    public final SharedObservable<T> share() {
+        return this;
+    }
+
+    private void addObserver() {
+        if (mNumObservers == 0) {
+            mLiveness.set(mSrc.subscribe(mCache::add));
+        }
+        mNumObservers++;
+    }
+
+    private void removeObserver() {
+        mNumObservers--;
+        if (mNumObservers == 0) {
+            mLiveness.close();
+        }
+    }
+}
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java
index 90e329d5..ff5294c 100644
--- a/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java
+++ b/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -8,12 +8,14 @@
 import static org.hamcrest.Matchers.contains;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.BlockJUnit4ClassRunner;
 
+import org.chromium.base.test.util.Batch;
 import org.chromium.chromecast.base.Inheritance.Base;
 import org.chromium.chromecast.base.Inheritance.Derived;
 
@@ -23,23 +25,22 @@
 import java.util.function.Function;
 import java.util.function.Predicate;
 
-/**
- * Tests for Both.
- */
+/** Tests for Both. */
 @RunWith(BlockJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
 public class BothTest {
     @Test
     public void testAccessMembersOfBoth() {
-        Both<Integer, Boolean> x = Both.both(10, true);
+        Both<Integer, Boolean> x = Both.of(10, true);
         assertEquals(10, (int) x.first);
-        assertEquals(true, (boolean) x.second);
+        assertTrue((boolean) x.second);
     }
 
     @Test
     public void testDeeplyNestedBothType() {
         // Yes you can do this.
         Both<Both<Both<String, String>, String>, String> x =
-                Both.both(Both.both(Both.both("A", "B"), "C"), "D");
+                Both.of(Both.of(Both.of("A", "B"), "C"), "D");
         assertEquals("A", x.first.first.first);
         assertEquals("B", x.first.first.second);
         assertEquals("C", x.first.second);
@@ -48,36 +49,37 @@
 
     @Test
     public void testBothToString() {
-        Both<String, String> x = Both.both("a", "b");
+        Both<String, String> x = Both.of("a", "b");
         assertEquals("a, b", x.toString());
     }
 
+    @SuppressWarnings("JUnitIncompatibleType")
     @Test
     public void testBothEquals() {
-        assertTrue(Both.both("a", "b").equals(Both.both("a", "b")));
-        assertFalse(Both.both("a", "b").equals(Both.both("b", "b")));
-        assertFalse(Both.both("a", "b").equals(Both.both("a", "a")));
-        assertFalse(Both.both(1, 2).equals(Both.both("a", "b")));
-        assertFalse(Both.both("hi", 0).equals(new Object()));
+        assertEquals(Both.of("a", "b"), Both.of("a", "b"));
+        assertNotEquals(Both.of("a", "b"), Both.of("b", "b"));
+        assertNotEquals(Both.of("a", "b"), Both.of("a", "a"));
+        assertNotEquals(Both.of(1, 2), Both.of("a", "b"));
+        assertNotEquals(Both.of("hi", 0), new Object());
     }
 
     @Test
     public void testUseGetFirstAsMethodReference() {
-        Both<Integer, String> x = Both.both(1, "one");
+        Both<Integer, String> x = Both.of(1, "one");
         Function<Both<Integer, String>, Integer> getFirst = Both::getFirst;
         assertEquals(1, (int) getFirst.apply(x));
     }
 
     @Test
     public void testUseGetSecondAsMethodReference() {
-        Both<Integer, String> x = Both.both(2, "two");
+        Both<Integer, String> x = Both.of(2, "two");
         Function<Both<Integer, String>, String> getSecond = Both::getSecond;
         assertEquals("two", getSecond.apply(x));
     }
 
     @Test
     public void testAdaptBiFunction() {
-        String result = Both.adapt((String a, String b) -> a + b).apply(Both.both("a", "b"));
+        String result = Both.adapt((String a, String b) -> a + b).apply(Both.of("a", "b"));
         assertEquals("ab", result);
     }
 
@@ -85,7 +87,7 @@
     public void testAdaptBiFunctionBaseArguments() {
         // Compile error if generics are wrong.
         Function<Both<Derived, Derived>, String> f = Both.adapt((Base a, Base b) -> "success");
-        assertEquals("success", f.apply(Both.both(new Derived(), new Derived())));
+        assertEquals("success", f.apply(Both.of(new Derived(), new Derived())));
     }
 
     @Test
@@ -93,13 +95,17 @@
         // Compile error if generics are wrong.
         Derived derived = new Derived();
         Function<Both<String, String>, Base> f = Both.adapt((String a, String b) -> derived);
-        assertEquals(f.apply(Both.both("a", "b")), derived);
+        assertEquals(derived, f.apply(Both.of("a", "b")));
     }
 
     @Test
     public void testAdaptBiConsumer() {
         List<String> result = new ArrayList<>();
-        Both.adapt((String a, String b) -> { result.add(a + b); }).accept(Both.both("A", "B"));
+        Both.adapt(
+                        (String a, String b) -> {
+                            result.add(a + b);
+                        })
+                .accept(Both.of("A", "B"));
         assertThat(result, contains("AB"));
     }
 
@@ -108,16 +114,19 @@
         // Compile error if generics are wrong.
         List<String> result = new ArrayList<>();
         Consumer<Both<Derived, Derived>> c =
-                Both.adapt((Base a, Base b) -> { result.add("success"); });
-        c.accept(Both.both(new Derived(), new Derived()));
+                Both.adapt(
+                        (Base a, Base b) -> {
+                            result.add("success");
+                        });
+        c.accept(Both.of(new Derived(), new Derived()));
         assertThat(result, contains("success"));
     }
 
     @Test
     public void testAdaptBiPredicate() {
         Predicate<Both<String, String>> p = Both.adapt(String::equals);
-        assertTrue(p.test(Both.both("a", "a")));
-        assertFalse(p.test(Both.both("a", "b")));
+        assertTrue(p.test(Both.of("a", "a")));
+        assertFalse(p.test(Both.of("a", "b")));
     }
 
     @Test
@@ -126,9 +135,9 @@
         Predicate<Both<Derived, Derived>> p = Both.adapt((Base a, Base b) -> a.equals(b));
         Derived derived1 = new Derived();
         Derived derived2 = new Derived();
-        assertTrue(p.test(Both.both(derived1, derived1)));
-        assertTrue(p.test(Both.both(derived2, derived2)));
-        assertFalse(p.test(Both.both(derived1, derived2)));
-        assertFalse(p.test(Both.both(derived2, derived1)));
+        assertTrue(p.test(Both.of(derived1, derived1)));
+        assertTrue(p.test(Both.of(derived2, derived2)));
+        assertFalse(p.test(Both.of(derived1, derived2)));
+        assertFalse(p.test(Both.of(derived2, derived1)));
     }
 }
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/LocalServiceTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/LocalServiceTest.java
new file mode 100644
index 0000000..10e12d9
--- /dev/null
+++ b/chromecast/base/java/test/org/chromium/chromecast/base/LocalServiceTest.java
@@ -0,0 +1,187 @@
+// 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.chromecast.base;
+
+import static org.robolectric.Shadows.shadowOf;
+
+import static org.chromium.chromecast.base.Observable.just;
+
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.android.controller.ServiceController;
+import org.robolectric.shadows.ShadowApplication;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+@RunWith(BaseRobolectricTestRunner.class)
+public final class LocalServiceTest {
+    private static final class Foo {}
+
+    private static final class FooService extends LocalService<Foo> {
+        Observable<Foo> mImpl;
+
+        public static Observable<Foo> connect(Context context) {
+            return LocalService.connect(Foo.class, context, new Intent(context, FooService.class));
+        }
+
+        @Override
+        protected Observable<Foo> bind(Intent intent) {
+            return mImpl;
+        }
+    }
+
+    @Test
+    public void implReturnedImmediately() {
+        Foo foo = new Foo();
+        Controller<Foo> fooController = new Controller<>();
+        fooController.set(foo);
+
+        Application context = ApplicationProvider.getApplicationContext();
+        ShadowApplication app = shadowOf(context);
+        app.setBindServiceCallsOnServiceConnectedDirectly(false);
+        ComponentName componentName = new ComponentName(context, FooService.class);
+        ServiceController<FooService> fooService = Robolectric.buildService(FooService.class);
+        fooService.get().mImpl = fooController;
+        var fooConnection = FooService.connect(fooService.get());
+        ReactiveRecorder recorder = ReactiveRecorder.record(fooConnection);
+        IBinder binder = fooService.get().onBind(app.getNextStartedService());
+        app.getBoundServiceConnections().get(0).onServiceConnected(componentName, binder);
+
+        recorder.verify().opened(foo).end();
+    }
+
+    @Test
+    public void implReturnedAsynchronouslyAfterBind() {
+        Foo foo = new Foo();
+        Controller<Foo> fooController = new Controller<>();
+
+        Application context = ApplicationProvider.getApplicationContext();
+        ShadowApplication app = shadowOf(context);
+        app.setBindServiceCallsOnServiceConnectedDirectly(false);
+        ComponentName componentName = new ComponentName(context, FooService.class);
+        ServiceController<FooService> fooService = Robolectric.buildService(FooService.class);
+        fooService.get().mImpl = fooController;
+        var fooConnection = FooService.connect(fooService.get());
+        ReactiveRecorder recorder = ReactiveRecorder.record(fooConnection);
+        IBinder binder = fooService.get().onBind(app.getNextStartedService());
+        app.getBoundServiceConnections().get(0).onServiceConnected(componentName, binder);
+
+        recorder.verify().end();
+        fooController.set(foo);
+        recorder.verify().opened(foo).end();
+    }
+
+    @Test
+    public void revokeImplIfServiceDisconnected() {
+        Foo foo = new Foo();
+        Controller<Foo> fooController = new Controller<>();
+        fooController.set(foo);
+
+        Application context = ApplicationProvider.getApplicationContext();
+        ShadowApplication app = shadowOf(context);
+        app.setBindServiceCallsOnServiceConnectedDirectly(false);
+        ComponentName componentName = new ComponentName(context, FooService.class);
+        ServiceController<FooService> fooService = Robolectric.buildService(FooService.class);
+        fooService.get().mImpl = fooController;
+        var fooConnection = FooService.connect(fooService.get());
+        ReactiveRecorder recorder = ReactiveRecorder.record(fooConnection);
+        IBinder binder = fooService.get().onBind(app.getNextStartedService());
+        app.getBoundServiceConnections().get(0).onServiceConnected(componentName, binder);
+
+        recorder.verify().opened(foo).end();
+
+        app.getBoundServiceConnections().get(0).onServiceDisconnected(componentName);
+        recorder.verify().closed(foo).end();
+    }
+
+    @Test
+    public void revokeImplIfServiceRevoked() {
+        Foo foo = new Foo();
+        Controller<Foo> fooController = new Controller<>();
+        fooController.set(foo);
+
+        Application context = ApplicationProvider.getApplicationContext();
+        ShadowApplication app = shadowOf(context);
+        app.setBindServiceCallsOnServiceConnectedDirectly(false);
+        ComponentName componentName = new ComponentName(context, FooService.class);
+        ServiceController<FooService> fooService = Robolectric.buildService(FooService.class);
+        fooService.get().mImpl = fooController;
+        var fooConnection = FooService.connect(fooService.get());
+        ReactiveRecorder recorder = ReactiveRecorder.record(fooConnection);
+        IBinder binder = fooService.get().onBind(app.getNextStartedService());
+        app.getBoundServiceConnections().get(0).onServiceConnected(componentName, binder);
+
+        recorder.verify().opened(foo).end();
+
+        fooController.reset();
+        recorder.verify().closed(foo).end();
+    }
+
+    @Test
+    public void multipleData() {
+        Foo a = new Foo();
+        Foo b = new Foo();
+        Foo c = new Foo();
+        Observable<Foo> foos = just(a).or(just(b)).or(just(c));
+
+        Application context = ApplicationProvider.getApplicationContext();
+        ShadowApplication app = shadowOf(context);
+        app.setBindServiceCallsOnServiceConnectedDirectly(false);
+        ComponentName componentName = new ComponentName(context, FooService.class);
+        ServiceController<FooService> fooService = Robolectric.buildService(FooService.class);
+        fooService.get().mImpl = foos;
+        var fooConnection = FooService.connect(fooService.get());
+        ReactiveRecorder recorder = ReactiveRecorder.record(fooConnection);
+        IBinder binder = fooService.get().onBind(app.getNextStartedService());
+        app.getBoundServiceConnections().get(0).onServiceConnected(componentName, binder);
+
+        recorder.verify().opened(a).opened(b).opened(c).end();
+
+        app.getBoundServiceConnections().get(0).onServiceDisconnected(componentName);
+
+        recorder.verify().closed(c).closed(b).closed(a).end();
+    }
+
+    @Test
+    public void multipleObservers() {
+        Foo foo = new Foo();
+        Controller<Foo> fooController = new Controller<>();
+        fooController.set(foo);
+
+        Application context = ApplicationProvider.getApplicationContext();
+        ShadowApplication app = shadowOf(context);
+        app.setBindServiceCallsOnServiceConnectedDirectly(false);
+        ComponentName componentName = new ComponentName(context, FooService.class);
+        ServiceController<FooService> fooService = Robolectric.buildService(FooService.class);
+        fooService.get().mImpl = fooController;
+        var fooConnection = FooService.connect(fooService.get());
+        ReactiveRecorder recorder1 = ReactiveRecorder.record(fooConnection);
+        ReactiveRecorder recorder2 = ReactiveRecorder.record(fooConnection);
+        IBinder binder = fooService.get().onBind(app.getNextStartedService());
+        app.getBoundServiceConnections().get(0).onServiceConnected(componentName, binder);
+
+        recorder1.verify().opened(foo).end();
+        recorder2.verify().opened(foo).end();
+
+        // Unsubscribe one recorder but not the other.
+        recorder1.unsubscribe();
+        recorder1.verify().closed(foo).end();
+        recorder2.verify().end();
+
+        // Disconnect the service. This should only notify the remaining observer.
+        app.getBoundServiceConnections().get(0).onServiceDisconnected(componentName);
+        recorder1.verify().end();
+        recorder2.verify().closed(foo).end();
+    }
+}
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAndTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAndTest.java
index 871f8a80..f882ae1 100644
--- a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAndTest.java
+++ b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAndTest.java
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -10,9 +10,7 @@
 
 import org.chromium.base.test.util.Batch;
 
-/**
- * Tests for Observable#and().
- */
+/** Tests for Observable#and(). */
 @RunWith(BlockJUnit4ClassRunner.class)
 @Batch(Batch.UNIT_TESTS)
 public class ObservableAndTest {
@@ -41,7 +39,7 @@
         ReactiveRecorder recorder = ReactiveRecorder.record(a.and(b));
         a.set("A");
         b.set("B");
-        recorder.verify().opened(Both.both("A", "B")).end();
+        recorder.verify().opened(Both.of("A", "B")).end();
     }
 
     @Test
@@ -52,7 +50,7 @@
         a.set("A");
         b.set("B");
         a.reset();
-        recorder.verify().opened(Both.both("A", "B")).closed(Both.both("A", "B")).end();
+        recorder.verify().opened(Both.of("A", "B")).closed(Both.of("A", "B")).end();
     }
 
     @Test
@@ -63,7 +61,7 @@
         a.set("A");
         b.set("B");
         b.reset();
-        recorder.verify().opened(Both.both("A", "B")).closed(Both.both("A", "B")).end();
+        recorder.verify().opened(Both.of("A", "B")).closed(Both.of("A", "B")).end();
     }
 
     @Test
@@ -98,11 +96,11 @@
         a.set("A2");
         b.set("B2");
         recorder.verify()
-                .opened(Both.both("A1", "B1"))
-                .closed(Both.both("A1", "B1"))
-                .opened(Both.both("A2", "B1"))
-                .closed(Both.both("A2", "B1"))
-                .opened(Both.both("A2", "B2"))
+                .opened(Both.of("A1", "B1"))
+                .closed(Both.of("A1", "B1"))
+                .opened(Both.of("A2", "B1"))
+                .closed(Both.of("A2", "B1"))
+                .opened(Both.of("A2", "B2"))
                 .end();
     }
 
@@ -119,8 +117,8 @@
         d.set("d");
         a.reset();
         recorder.verify()
-                .opened(Both.both(Both.both(Both.both("a", "b"), "c"), "d"))
-                .closed(Both.both(Both.both(Both.both("a", "b"), "c"), "d"))
+                .opened(Both.of(Both.of(Both.of("a", "b"), "c"), "d"))
+                .closed(Both.of(Both.of(Both.of("a", "b"), "c"), "d"))
                 .end();
     }
 
@@ -132,27 +130,27 @@
                 observer -> observer.open("a").and(observer.open("b")).and(observer.open("c"));
         ReactiveRecorder r = ReactiveRecorder.record(numbers.and(letters));
         r.verify()
-                .opened(Both.both(1, "a"))
-                .opened(Both.both(1, "b"))
-                .opened(Both.both(1, "c"))
-                .opened(Both.both(2, "a"))
-                .opened(Both.both(2, "b"))
-                .opened(Both.both(2, "c"))
-                .opened(Both.both(3, "a"))
-                .opened(Both.both(3, "b"))
-                .opened(Both.both(3, "c"))
+                .opened(Both.of(1, "a"))
+                .opened(Both.of(1, "b"))
+                .opened(Both.of(1, "c"))
+                .opened(Both.of(2, "a"))
+                .opened(Both.of(2, "b"))
+                .opened(Both.of(2, "c"))
+                .opened(Both.of(3, "a"))
+                .opened(Both.of(3, "b"))
+                .opened(Both.of(3, "c"))
                 .end();
         r.unsubscribe();
         r.verify()
-                .closed(Both.both(3, "c"))
-                .closed(Both.both(3, "b"))
-                .closed(Both.both(3, "a"))
-                .closed(Both.both(2, "c"))
-                .closed(Both.both(2, "b"))
-                .closed(Both.both(2, "a"))
-                .closed(Both.both(1, "c"))
-                .closed(Both.both(1, "b"))
-                .closed(Both.both(1, "a"))
+                .closed(Both.of(3, "c"))
+                .closed(Both.of(3, "b"))
+                .closed(Both.of(3, "a"))
+                .closed(Both.of(2, "c"))
+                .closed(Both.of(2, "b"))
+                .closed(Both.of(2, "a"))
+                .closed(Both.of(1, "c"))
+                .closed(Both.of(1, "b"))
+                .closed(Both.of(1, "a"))
                 .end();
     }
 }
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableFlatMapTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableFlatMapTest.java
index 88e1863..f261204 100644
--- a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableFlatMapTest.java
+++ b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableFlatMapTest.java
@@ -8,10 +8,11 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.BlockJUnit4ClassRunner;
 
-/**
- * Tests for Observable#flatMap().
- */
+import org.chromium.base.test.util.Batch;
+
+/** Tests for Observable#flatMap(). */
 @RunWith(BlockJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
 public class ObservableFlatMapTest {
     @Test
     public void testFlatMapWithIdentity() {
@@ -51,8 +52,8 @@
                 ReactiveRecorder.record(src.flatMap(person -> person.name.and(person.age)));
         r.verify().end();
         src.set(new Person(Observable.just("Alice"), Observable.just(30)));
-        r.verify().opened(Both.both("Alice", 30)).end();
+        r.verify().opened(Both.of("Alice", 30)).end();
         src.set(new Person(Observable.just("Bob"), Observable.just(29)));
-        r.verify().closed(Both.both("Alice", 30)).opened(Both.both("Bob", 29)).end();
+        r.verify().closed(Both.of("Alice", 30)).opened(Both.of("Bob", 29)).end();
     }
 }
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/PoolTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/PoolTest.java
new file mode 100644
index 0000000..9b4732a
--- /dev/null
+++ b/chromecast/base/java/test/org/chromium/chromecast/base/PoolTest.java
@@ -0,0 +1,90 @@
+// 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.chromecast.base;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+
+import org.chromium.base.test.util.Batch;
+
+@RunWith(BlockJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
+public final class PoolTest {
+    @Test
+    public void emptyPool() {
+        Pool<String> pool = new Pool<>();
+        ReactiveRecorder recorder = ReactiveRecorder.record(pool);
+        recorder.verify().end();
+    }
+
+    @Test
+    public void addAndRemove() {
+        Pool<String> pool = new Pool<>();
+        ReactiveRecorder recorder = ReactiveRecorder.record(pool);
+        recorder.verify().end();
+        var a = pool.add("a");
+        recorder.verify().opened("a").end();
+        var b = pool.add("b");
+        recorder.verify().opened("b").end();
+        a.close();
+        recorder.verify().closed("a").end();
+        b.close();
+        recorder.verify().closed("b").end();
+    }
+
+    @Test
+    public void addAndRemove_withMultipleObservers() {
+        Pool<String> pool = new Pool<>();
+        ReactiveRecorder recorder1 = ReactiveRecorder.record(pool);
+        ReactiveRecorder recorder2 = ReactiveRecorder.record(pool);
+        recorder1.verify().end();
+        recorder2.verify().end();
+        var a = pool.add("a");
+        recorder1.verify().opened("a").end();
+        recorder2.verify().opened("a").end();
+        var b = pool.add("b");
+        recorder1.verify().opened("b").end();
+        recorder2.verify().opened("b").end();
+        a.close();
+        recorder1.verify().closed("a").end();
+        recorder2.verify().closed("a").end();
+        b.close();
+        recorder1.verify().closed("b").end();
+        recorder2.verify().closed("b").end();
+    }
+
+    @Test
+    public void dataRemovedInfReverseOrderWhenUnsubscribed() {
+        Pool<String> pool = new Pool<>();
+        ReactiveRecorder recorder = ReactiveRecorder.record(pool);
+        recorder.verify().end();
+        var a = pool.add("a");
+        var b = pool.add("b");
+        var c = pool.add("c");
+        recorder.verify().opened("a").opened("b").opened("c").end();
+        recorder.unsubscribe();
+        recorder.verify().closed("c").closed("b").closed("a").end();
+        a.close();
+        b.close();
+        c.close();
+        recorder.verify().end();
+    }
+
+    @Test
+    public void addSameDataTwice() {
+        Pool<String> pool = new Pool<>();
+        ReactiveRecorder recorder = ReactiveRecorder.record(pool);
+        recorder.verify().end();
+        var a1 = pool.add("a");
+        // This is valid! Each activation is unique, even if the data is the same.
+        var a2 = pool.add("a");
+        recorder.verify().opened("a").opened("a").end();
+        a1.close();
+        recorder.verify().closed("a").end();
+        a2.close();
+        recorder.verify().closed("a").end();
+    }
+}
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 0a682002..02ef99f 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16198.0.0-1066927
\ No newline at end of file
+16198.0.0-1066947
\ No newline at end of file
diff --git a/chromeos/ash/components/dbus/concierge/concierge_client.cc b/chromeos/ash/components/dbus/concierge/concierge_client.cc
index fa5db2f3..6c0d4cf1 100644
--- a/chromeos/ash/components/dbus/concierge/concierge_client.cc
+++ b/chromeos/ash/components/dbus/concierge/concierge_client.cc
@@ -303,6 +303,13 @@
                std::move(callback));
   }
 
+  void MuteVmAudio(
+      const vm_tools::concierge::MuteVmAudioRequest& request,
+      chromeos::DBusMethodCallback<vm_tools::concierge::SuccessFailureResponse>
+          callback) override {
+    CallMethod(concierge::kMuteVmAudioMethod, request, std::move(callback));
+  }
+
   void Init(dbus::Bus* bus) override {
     concierge_proxy_ = bus->GetObjectProxy(
         concierge::kVmConciergeServiceName,
diff --git a/chromeos/ash/components/dbus/concierge/concierge_client.h b/chromeos/ash/components/dbus/concierge/concierge_client.h
index 9c73ae72..8747d15 100644
--- a/chromeos/ash/components/dbus/concierge/concierge_client.h
+++ b/chromeos/ash/components/dbus/concierge/concierge_client.h
@@ -311,6 +311,13 @@
       chromeos::DBusMethodCallback<vm_tools::concierge::SuccessFailureResponse>
           callback) = 0;
 
+  // Mutes or unmutes the audio of the given VM.
+  // |callback| is called after the method call finishes.
+  virtual void MuteVmAudio(
+      const vm_tools::concierge::MuteVmAudioRequest& request,
+      chromeos::DBusMethodCallback<vm_tools::concierge::SuccessFailureResponse>
+          callback) = 0;
+
   // Creates and initializes the global instance. |bus| must not be null.
   static void Initialize(dbus::Bus* bus);
 
diff --git a/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc b/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc
index 637a91c47..21f9305 100644
--- a/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc
+++ b/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc
@@ -445,6 +445,14 @@
       base::BindOnce(std::move(callback), aggressive_balloon_response_));
 }
 
+void FakeConciergeClient::MuteVmAudio(
+    const vm_tools::concierge::MuteVmAudioRequest& request,
+    chromeos::DBusMethodCallback<vm_tools::concierge::SuccessFailureResponse>
+        callback) {
+  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), mute_vm_audio_response_));
+}
+
 void FakeConciergeClient::NotifyVmStarted(
     const vm_tools::concierge::VmStartedSignal& signal) {
   // Now GetVmInfo can return success.
diff --git a/chromeos/ash/components/dbus/concierge/fake_concierge_client.h b/chromeos/ash/components/dbus/concierge/fake_concierge_client.h
index 9d44f37..8769f6f 100644
--- a/chromeos/ash/components/dbus/concierge/fake_concierge_client.h
+++ b/chromeos/ash/components/dbus/concierge/fake_concierge_client.h
@@ -174,6 +174,11 @@
       chromeos::DBusMethodCallback<vm_tools::concierge::SuccessFailureResponse>
           callback) override;
 
+  void MuteVmAudio(
+      const vm_tools::concierge::MuteVmAudioRequest& request,
+      chromeos::DBusMethodCallback<vm_tools::concierge::SuccessFailureResponse>
+          callback) override;
+
   const base::ObserverList<Observer>& observer_list() const {
     return observer_list_;
   }
@@ -368,6 +373,11 @@
           aggressive_balloon_response) {
     aggressive_balloon_response_ = aggressive_balloon_response;
   }
+  void set_mute_vm_audio_response(
+      std::optional<vm_tools::concierge::SuccessFailureResponse>
+          mute_vm_audio_response) {
+    mute_vm_audio_response_ = mute_vm_audio_response;
+  }
 
   void set_send_create_disk_image_response_delay(base::TimeDelta delay) {
     send_create_disk_image_response_delay_ = delay;
@@ -487,6 +497,8 @@
       install_pflash_response_;
   std::optional<vm_tools::concierge::SuccessFailureResponse>
       aggressive_balloon_response_;
+  std::optional<vm_tools::concierge::SuccessFailureResponse>
+      mute_vm_audio_response_;
 
   base::TimeDelta send_create_disk_image_response_delay_;
   base::TimeDelta send_start_vm_response_delay_;
diff --git a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.cc b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.cc
index dd95eb5..ce8150e8 100644
--- a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.cc
+++ b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.cc
@@ -53,6 +53,14 @@
   processor_->Inpainting(image, mask, seed, std::move(callback));
 }
 
+void MantisUntrustedService::OutpaintImage(const std::vector<uint8_t>& image,
+                                           const std::vector<uint8_t>& mask,
+                                           uint32_t seed,
+                                           OutpaintImageCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  processor_->Outpainting(image, mask, seed, std::move(callback));
+}
+
 void MantisUntrustedService::ClassifyImageSafety(
     const std::vector<uint8_t>& image,
     ClassifyImageSafetyCallback callback) {
diff --git a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.h b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.h
index f3b73a6..d1703cd 100644
--- a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.h
+++ b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service.h
@@ -54,6 +54,11 @@
   void ClassifyImageSafety(const std::vector<uint8_t>& image,
                            ClassifyImageSafetyCallback callback) override;
 
+  void OutpaintImage(const std::vector<uint8_t>& image,
+                     const std::vector<uint8_t>& mask,
+                     uint32_t seed,
+                     OutpaintImageCallback callback) override;
+
  private:
   mojo::Receiver<media_app_ui::mojom::MantisUntrustedService> receiver_;
   mojo::Remote<mantis::mojom::MantisProcessor> processor_;
diff --git a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_unittest.cc b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_unittest.cc
index 4b1204fe..b3d562a8 100644
--- a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_unittest.cc
+++ b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_unittest.cc
@@ -92,6 +92,13 @@
               (const std::vector<uint8_t>& image,
                ClassifyImageSafetyCallback callback),
               (override));
+  MOCK_METHOD(void,
+              Outpainting,
+              (const std::vector<uint8_t>& image,
+               const std::vector<uint8_t>& mask,
+               uint32_t seed,
+               InpaintingCallback callback),
+              (override));
 
  private:
   mojo::Receiver<mantis::mojom::MantisProcessor> receiver_;
@@ -176,6 +183,18 @@
   EXPECT_EQ(result_future.Take(), result);
 }
 
+TEST_P(ImageInferenceTest, OutpaintImage) {
+  MantisResultPtr result = GetMantisResult(GetParam());
+
+  EXPECT_CALL(mojo_mantis_processor_, Outpainting)
+      .WillOnce(RunOnceCallback<3>(result.Clone()));
+
+  base::test::TestFuture<mantis::mojom::MantisResultPtr> result_future;
+  service_.OutpaintImage(GetFakeImage(), GetFakeMask(), GetFakeSeed(),
+                         result_future.GetCallback());
+  EXPECT_EQ(result_future.Take(), result);
+}
+
 INSTANTIATE_TEST_SUITE_P(
     MantisMediaApp,
     ImageInferenceTest,
diff --git a/chromeos/ash/components/mantis/mojom/mantis_processor.mojom b/chromeos/ash/components/mantis/mojom/mantis_processor.mojom
index 5a05bf9..044be6ac 100644
--- a/chromeos/ash/components/mantis/mojom/mantis_processor.mojom
+++ b/chromeos/ash/components/mantis/mojom/mantis_processor.mojom
@@ -34,6 +34,8 @@
   [Default] kFail,
   [MinVersion=3] kFailedText,
   [MinVersion=3] kFailedImage,
+  [MinVersion=4] kServiceNotAvailable,
+  [MinVersion=5] kNoInternetConnection,
 };
 
 // Interface for processing images. The processor should already be initialized
@@ -68,4 +70,11 @@
   [MinVersion=2]
   ClassifyImageSafety@3(array<uint8> image)
       => (SafetyClassifierVerdict verdict);
+
+  // Outpaints the image based on the mask and seed. Pass the same `seed` across
+  // method calls to get identical result. The `image`, `mask`, and `result` are
+  // byte arrays containing the encoded format of an image (e.g., PNG, JPEG).
+  [MinVersion=6]
+  Outpainting@4(array<uint8> image, array<uint8> mask, uint32 seed)
+      => (MantisResult result);
 };
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index c0e2673..aa3c7c94 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -3549,6 +3549,9 @@
         <message name="IDS_SEA_PEN_INTRODUCTION_DIALOG_CLOSE_BUTTON" desc="The button to close the introduction dialog.">
           Got it
         </message>
+        <message name="IDS_SEA_PEN_ARIA_DESCRIPTION_GENERATED_IMAGE" desc="Informational text presented to screen readers to inform users that an image is generated">
+          Generated image
+        </message>
 
         <!-- Freeform prompts -->
         <message name="IDS_SEA_PEN_FREEFORM_WALLPAPER_LABEL" desc="Label for the Wallpaper AI freeform feature.">
@@ -3608,6 +3611,12 @@
         <message name="IDS_SEA_PEN_FREEFORM_ARIA_LABEL_SHUFFLE_SUGGESTIONS" desc="Aria label for a button that shuffles a list of suggestions (IDS_SEA_PEN_FREEFORM_ARIA_LABEL_SUGGESTIONS)">
           Shuffle suggestions
         </message>
+        <message name="IDS_SEA_PEN_ARIA_ANNOUNCE_SAMPLE_PROMPTS_SHUFFLED" desc="Text read out by the screen reader after the sample prompts are shuffled.">
+          Sample prompts shuffled
+        </message>
+        <message name="IDS_SEA_PEN_ARIA_ANNOUNCE_SUGGESTIONS_SHUFFLED" desc="Text read out by the screen reader after the prompt suggestions are shuffled.">
+          Suggestions shuffled
+        </message>
 
         <!-- Sea Pen Templates (AUTOGENERATED - contact assistive-eng@google.com before editing) -->
         <!-- Wallpaper template glowscapes -->
@@ -7002,6 +7011,11 @@
         Your teacher has removed content in School Tools
       </message>
 
+      <!-- Strings for the OnTask pod -->
+      <message name="IDS_ON_TASK_POD_RELOAD_ACCESSIBLE_NAME" desc="Accessible name for the Reload tab button in the OnTask pod.">
+        Reload tab
+      </message>
+
       <!-- Strings for School Tools -->
       <message name="IDS_SCHOOL_TOOLS_TITLE" desc="Title of the School Tools App">
         School Tools
diff --git a/chromeos/chromeos_strings_grd/IDS_ON_TASK_POD_RELOAD_ACCESSIBLE_NAME.png.sha1 b/chromeos/chromeos_strings_grd/IDS_ON_TASK_POD_RELOAD_ACCESSIBLE_NAME.png.sha1
new file mode 100644
index 0000000..8531ae7
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_ON_TASK_POD_RELOAD_ACCESSIBLE_NAME.png.sha1
@@ -0,0 +1 @@
+964fd10724b544a40589753816888ec8d26d5e05
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_ANNOUNCE_SAMPLE_PROMPTS_SHUFFLED.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_ANNOUNCE_SAMPLE_PROMPTS_SHUFFLED.png.sha1
new file mode 100644
index 0000000..47dfe82e
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_ANNOUNCE_SAMPLE_PROMPTS_SHUFFLED.png.sha1
@@ -0,0 +1 @@
+00c12c906595aa7729ed321e5eb088744c2a6f29
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_ANNOUNCE_SUGGESTIONS_SHUFFLED.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_ANNOUNCE_SUGGESTIONS_SHUFFLED.png.sha1
new file mode 100644
index 0000000..6a5fbe5f
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_ANNOUNCE_SUGGESTIONS_SHUFFLED.png.sha1
@@ -0,0 +1 @@
+157839d46b750dd3b15af458bbe7543c79dcf76b
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_DESCRIPTION_GENERATED_IMAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_DESCRIPTION_GENERATED_IMAGE.png.sha1
new file mode 100644
index 0000000..ca86d60
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SEA_PEN_ARIA_DESCRIPTION_GENERATED_IMAGE.png.sha1
@@ -0,0 +1 @@
+f081bc678171f682e274203ed56ea2b64e47c8d3
\ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index 25796885..b7394d71 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057">এখন <ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /> কেফে</translation>
 <translation id="7841134249932030522">গাঢ় ম’ড সক্ষম কৰক</translation>
 <translation id="7846634333498149051">কীব'ৰ্ড</translation>
+<translation id="7847923465436619066">ট্ৰেন্সক্ৰিপশ্বনৰ ভাষা বাছনিকৰ্তা</translation>
 <translation id="7849030488395653706">নৰ্ডাৰ্ন লাইট</translation>
 <translation id="7849737607196682401">জৰি</translation>
 <translation id="7850320739366109486">অসুবিধা নিদিব ম’ড</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">কেমেৰাৰ পটভূমি</translation>
 <translation id="8755946156089753497">টাৱাৰ</translation>
 <translation id="8760616037557661287">পূৰ্বৱৰ্তী প্ৰম্প্‌ট</translation>
+<translation id="876280838467039397"><ph name="LANGUAGE_NAME" />ৰ ট্ৰেন্সক্ৰিপশ্বনৰ মডেল ডাউনল’ড আৰু বাছনি কৰক</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Photosৰ এলবাম</translation>
 <translation id="8775713578693478175">আধুনিক এপিএন</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index 28dd01d..b2a6ba0a 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /> kafe</translation>
 <translation id="7841134249932030522">Qaranlıq rejimi aktiv edin</translation>
 <translation id="7846634333498149051">Klaviatura</translation>
+<translation id="7847923465436619066">Transkripsiya dilseçəni</translation>
 <translation id="7849030488395653706">şimal parıltısı</translation>
 <translation id="7849737607196682401">krujeva</translation>
 <translation id="7850320739366109486">Narahat Etməyin</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Kamera arxa fonu</translation>
 <translation id="8755946156089753497">qüllə</translation>
 <translation id="8760616037557661287">Əvvəlki ipucular</translation>
+<translation id="876280838467039397">Endirin və <ph name="LANGUAGE_NAME" /> transkripsiya modeli seçin</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Foto albomu</translation>
 <translation id="8775713578693478175">Modem APN-i</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb
index b0ec8d09..df654a8 100644
--- a/chromeos/strings/chromeos_strings_bn.xtb
+++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057">একটি <ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /> ক্যাফে</translation>
 <translation id="7841134249932030522">'ডার্ক মোড' চালু করুন</translation>
 <translation id="7846634333498149051">কীবোর্ড</translation>
+<translation id="7847923465436619066">ট্রান্সক্রিপশনের ভাষা বাছাইকারী</translation>
 <translation id="7849030488395653706">সুমেরুপ্রভা</translation>
 <translation id="7849737607196682401">লেস</translation>
 <translation id="7850320739366109486">বিরক্ত করবে না</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">ক্যামেরা ব্যাকগ্রাউন্ড</translation>
 <translation id="8755946156089753497">টাওয়ার</translation>
 <translation id="8760616037557661287">আগের প্রম্পট</translation>
+<translation id="876280838467039397">ডাউনলোড করুন এবং <ph name="LANGUAGE_NAME" /> ট্রান্সক্রিপশন মডেল বেছে নিন</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Photos অ্যালবাম</translation>
 <translation id="8775713578693478175">মোডেম APN</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index fe9199ef..50c5ec59 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" />es <ph name="CAFE_TYPE" />-Café</translation>
 <translation id="7841134249932030522">Dunklen Modus aktivieren</translation>
 <translation id="7846634333498149051">Tastatur</translation>
+<translation id="7847923465436619066">Sprachauswahl für das Transkript</translation>
 <translation id="7849030488395653706">Polarlichter</translation>
 <translation id="7849737607196682401">Spitze</translation>
 <translation id="7850320739366109486">Bitte nicht stören</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Kamerahintergrund</translation>
 <translation id="8755946156089753497">Turm</translation>
 <translation id="8760616037557661287">Vorherige Prompts</translation>
+<translation id="876280838467039397">Transkriptionsmodell für <ph name="LANGUAGE_NAME" /> herunterladen und auswählen</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Fotos-Album</translation>
 <translation id="8775713578693478175">Modem‑APN</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb
index f14b24d..229bf2d 100644
--- a/chromeos/strings/chromeos_strings_et.xtb
+++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" />-kohvik</translation>
 <translation id="7841134249932030522">Tumeda režiimi lubamine</translation>
 <translation id="7846634333498149051">Klaviatuur</translation>
+<translation id="7847923465436619066">Transkribeerimise keele valija</translation>
 <translation id="7849030488395653706">virmalised</translation>
 <translation id="7849737607196682401">pitsist</translation>
 <translation id="7850320739366109486">Mitte segada</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Kaamera taust</translation>
 <translation id="8755946156089753497">torn</translation>
 <translation id="8760616037557661287">Eelmised päringud</translation>
+<translation id="876280838467039397">Transkriptsiooni mudeli (<ph name="LANGUAGE_NAME" />) allalaadimine ja valimine</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Teenuse Google Photos album</translation>
 <translation id="8775713578693478175">Modemi APN</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb
index 8a78ea4..f6e43deae 100644
--- a/chromeos/strings/chromeos_strings_fr-CA.xtb
+++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057">Un café <ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /></translation>
 <translation id="7841134249932030522">Activer le mode sombre</translation>
 <translation id="7846634333498149051">Clavier</translation>
+<translation id="7847923465436619066">Sélecteur de langue de transcription</translation>
 <translation id="7849030488395653706">aurores boréales</translation>
 <translation id="7849737607196682401">dentelle</translation>
 <translation id="7850320739366109486">Ne pas déranger</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Arrière-plan de caméra</translation>
 <translation id="8755946156089753497">tour</translation>
 <translation id="8760616037557661287">Requêtes précédentes</translation>
+<translation id="876280838467039397">Télécharger et sélectionner le modèle de transcription pour la langue suivante : <ph name="LANGUAGE_NAME" /></translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Album Google Photos</translation>
 <translation id="8775713578693478175">Nom de point d'accès du modem</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index aff60e5..be25e7c 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057">Unha cafetaría <ph name="CAFE_TYPE" /> <ph name="CAFE_STYLE" /></translation>
 <translation id="7841134249932030522">Activar modo escuro</translation>
 <translation id="7846634333498149051">Teclado</translation>
+<translation id="7847923465436619066">Selector de idioma da transcrición</translation>
 <translation id="7849030488395653706">auroras boreais</translation>
 <translation id="7849737607196682401">encaixe</translation>
 <translation id="7850320739366109486">Non molestar</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Fondo da cámara</translation>
 <translation id="8755946156089753497">torre</translation>
 <translation id="8760616037557661287">Solicitudes anteriores</translation>
+<translation id="876280838467039397">Descargar e seleccionar o modelo de transcrición de <ph name="LANGUAGE_NAME" /></translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Álbums de Google Fotos</translation>
 <translation id="8775713578693478175">APN do módem</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index d5e65b0..4814bc46 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /> കഫേ</translation>
 <translation id="7841134249932030522">ഡാർക്ക് മോഡ് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="7846634333498149051">കീബോർഡ്</translation>
+<translation id="7847923465436619066">ട്രാൻസ്‌ക്രിപ്ഷൻ ഭാഷാ പിക്കർ</translation>
 <translation id="7849030488395653706">നോർത്തേൺ ലൈറ്റുകൾ</translation>
 <translation id="7849737607196682401">ലേസ്</translation>
 <translation id="7850320739366109486">ശല്യം ചെയ്യരുത്</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">ക്യാമറയുടെ പശ്ചാത്തലം</translation>
 <translation id="8755946156089753497">ടവർ</translation>
 <translation id="8760616037557661287">മുമ്പത്തെ പ്രോംപ്റ്റുകൾ</translation>
+<translation id="876280838467039397"><ph name="LANGUAGE_NAME" /> ട്രാൻസ്‌ക്രിപ്ഷൻ മോഡൽ ഡൗൺലോഡ് ചെയ്ത് തിരഞ്ഞെടുക്കുക</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Photos ആൽബം</translation>
 <translation id="8775713578693478175">മോഡം APN</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index d3efd2c..3505a470 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /> கஃபே</translation>
 <translation id="7841134249932030522">டார்க் பயன்முறையை இயக்குதல்</translation>
 <translation id="7846634333498149051">கீபோர்டு</translation>
+<translation id="7847923465436619066">டிரான்ஸ்கிரிப்ஷன் மொழித் தேர்வுப் பட்டியல்</translation>
 <translation id="7849030488395653706">வடதுருவ ஒளிகள்</translation>
 <translation id="7849737607196682401">லேஸ்</translation>
 <translation id="7850320739366109486">தொந்தரவு செய்யாதே</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">கேமராவின் பின்புலம்</translation>
 <translation id="8755946156089753497">கோபுரம்</translation>
 <translation id="8760616037557661287">முந்தைய ப்ராம்ப்ட்டுகள்</translation>
+<translation id="876280838467039397"><ph name="LANGUAGE_NAME" /> டிரான்ஸ்கிரிப்ஷன் மாடலைத் தேர்ந்தெடுத்துப் பதிவிறக்கும்</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Photos ஆல்பம்</translation>
 <translation id="8775713578693478175">மோடம் APN</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index af4b40f..253f9d1 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /> kafe</translation>
 <translation id="7841134249932030522">Koyu modu etkinleştir</translation>
 <translation id="7846634333498149051">Klavye</translation>
+<translation id="7847923465436619066">Metne dönüştürme dil seçici</translation>
 <translation id="7849030488395653706">kuzey ışıkları</translation>
 <translation id="7849737607196682401">bağcık</translation>
 <translation id="7850320739366109486">Rahatsız Etmeyin</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Kamera Arka Planı</translation>
 <translation id="8755946156089753497">kule</translation>
 <translation id="8760616037557661287">Önceki istemler</translation>
+<translation id="876280838467039397"><ph name="LANGUAGE_NAME" /> metne dönüştürme modelini indirip seç</translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Google Fotoğraflar albümü</translation>
 <translation id="8775713578693478175">Modem APN'si</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb
index 6f113d8..9201649 100644
--- a/chromeos/strings/chromeos_strings_uk.xtb
+++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057"><ph name="CAFE_STYLE" /> кафе <ph name="CAFE_TYPE" /></translation>
 <translation id="7841134249932030522">Увімкнути темний режим</translation>
 <translation id="7846634333498149051">Клавіатура</translation>
+<translation id="7847923465436619066">Засіб вибору мови транскрипції</translation>
 <translation id="7849030488395653706">полярне сяйво</translation>
 <translation id="7849737607196682401">мережива</translation>
 <translation id="7850320739366109486">Не турбувати</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Фонове зображення для камери</translation>
 <translation id="8755946156089753497">Вежа</translation>
 <translation id="8760616037557661287">Попередні запити</translation>
+<translation id="876280838467039397">Завантажити й вибрати модель транскрипції для такої мови: <ph name="LANGUAGE_NAME" /></translation>
 <translation id="8764414543112028321">WireGuard</translation>
 <translation id="87646919272181953">Альбом Google Фото</translation>
 <translation id="8775713578693478175">APN модема</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index cfc5900..1d8405f2 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -1468,6 +1468,7 @@
 <translation id="7828503206075800057">Ikhefi e-<ph name="CAFE_STYLE" /> <ph name="CAFE_TYPE" /></translation>
 <translation id="7841134249932030522">Nika amandla imodi emnyama</translation>
 <translation id="7846634333498149051">Ikhibhodi</translation>
+<translation id="7847923465436619066">Isikhethi solimi sokubhala</translation>
 <translation id="7849030488395653706">izibani zasenyakatho</translation>
 <translation id="7849737607196682401">i-lace</translation>
 <translation id="7850320739366109486">Ungaphazamisi</translation>
@@ -1654,6 +1655,7 @@
 <translation id="8749478549112817787">Ingemuva Lekhamera</translation>
 <translation id="8755946156089753497">isilindo</translation>
 <translation id="8760616037557661287">Imiyalelo yangaphambilini</translation>
+<translation id="876280838467039397">Dawuniloda bese ukhetha imodeli yokubhala ngesi-<ph name="LANGUAGE_NAME" /></translation>
 <translation id="8764414543112028321">I-WireGuard</translation>
 <translation id="87646919272181953">I-albhamu Yezithombe ze-Google</translation>
 <translation id="8775713578693478175">I-APN Yemodemu</translation>
diff --git a/clank b/clank
index 36ec427..cf15a04 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 36ec4270ac455591e49ebc3c455f222539b62e59
+Subproject commit cf15a048c9ae45b95192ce794bea6fc1f78db869
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 5485788d..7917474 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -60,12 +60,12 @@
 action("entity_schema_enums_and_functions") {
   visibility = [ ":*" ]
 
-  sources = [ "data_model/entity_schema.json" ]
+  sources = [ "data_model/autofill_ai/entity_schema.json" ]
 
-  script = "data_model/transpile_entity_schema.py"
+  script = "data_model/autofill_ai/transpile_entity_schema.py"
   outputs = [
-    "$target_gen_dir/data_model/entity_type_names.h",
-    "$target_gen_dir/data_model/entity_type_funcs.cc",
+    "$target_gen_dir/data_model/autofill_ai/entity_type_names.h",
+    "$target_gen_dir/data_model/autofill_ai/entity_type_funcs.cc",
   ]
   args = [ "--input" ] + rebase_path(sources, root_build_dir) + [ "--output" ] +
          rebase_path(outputs, root_build_dir)
@@ -104,8 +104,8 @@
     "data_manager/addresses/address_data_cleaner.h",
     "data_manager/addresses/address_data_manager.cc",
     "data_manager/addresses/address_data_manager.h",
-    "data_manager/entities/entity_data_manager.cc",
-    "data_manager/entities/entity_data_manager.h",
+    "data_manager/autofill_ai/entity_data_manager.cc",
+    "data_manager/autofill_ai/entity_data_manager.h",
     "data_manager/payments/payments_data_manager.cc",
     "data_manager/payments/payments_data_manager.h",
     "data_manager/personal_data_manager.cc",
@@ -113,6 +113,10 @@
     "data_manager/personal_data_manager_observer.h",
     "data_model/address.cc",
     "data_model/address.h",
+    "data_model/autofill_ai/entity_instance.cc",
+    "data_model/autofill_ai/entity_instance.h",
+    "data_model/autofill_ai/entity_type.cc",
+    "data_model/autofill_ai/entity_type.h",
     "data_model/autofill_feature_guarded_address_component.cc",
     "data_model/autofill_feature_guarded_address_component.h",
     "data_model/autofill_i18n_api.cc",
@@ -164,18 +168,14 @@
     "data_model/credit_card_cloud_token_data.h",
     "data_model/data_model_utils.cc",
     "data_model/data_model_utils.h",
-    "data_model/entity_instance.cc",
-    "data_model/entity_instance.h",
-    "data_model/entity_type.cc",
-    "data_model/entity_type.h",
     "data_model/ewallet.cc",
     "data_model/ewallet.h",
     "data_model/form_group.cc",
     "data_model/form_group.h",
     "data_model/iban.cc",
     "data_model/iban.h",
-    "data_model/loyalty_card.cc",
-    "data_model/loyalty_card.h",
+    "data_model/passes/loyalty_card.cc",
+    "data_model/passes/loyalty_card.h",
     "data_model/payment_instrument.cc",
     "data_model/payment_instrument.h",
     "data_model/payments_metadata.cc",
@@ -653,6 +653,8 @@
     "webdata/autocomplete/autocomplete_sync_bridge.h",
     "webdata/autocomplete/autocomplete_table.cc",
     "webdata/autocomplete/autocomplete_table.h",
+    "webdata/autofill_ai/entity_table.cc",
+    "webdata/autofill_ai/entity_table.h",
     "webdata/autofill_change.cc",
     "webdata/autofill_change.h",
     "webdata/autofill_sync_metadata_table.cc",
@@ -665,8 +667,6 @@
     "webdata/autofill_webdata_service.cc",
     "webdata/autofill_webdata_service.h",
     "webdata/autofill_webdata_service_observer.h",
-    "webdata/entities/entity_table.cc",
-    "webdata/entities/entity_table.h",
     "webdata/passes/passes_table.cc",
     "webdata/passes/passes_table.h",
     "webdata/payments/autofill_wallet_credential_sync_bridge.cc",
@@ -1059,9 +1059,9 @@
     "ui/payments/virtual_card_enroll_ui_model_test_api.h",
     "ui/test_autofill_external_delegate.cc",
     "ui/test_autofill_external_delegate.h",
+    "webdata/autofill_ai/entity_table_test_api.h",
     "webdata/autofill_webdata_service_test_helper.cc",
     "webdata/autofill_webdata_service_test_helper.h",
-    "webdata/entities/entity_table_test_api.h",
     "webdata/mock_autofill_webdata_backend.cc",
     "webdata/mock_autofill_webdata_backend.h",
     "webdata/mock_autofill_webdata_service.cc",
@@ -1193,11 +1193,13 @@
     "crowdsourcing/randomized_encoder_unittest.cc",
     "data_manager/addresses/address_data_cleaner_unittest.cc",
     "data_manager/addresses/address_data_manager_unittest.cc",
-    "data_manager/entities/entity_data_manager_unittest.cc",
+    "data_manager/autofill_ai/entity_data_manager_unittest.cc",
     "data_manager/payments/payments_data_manager_test_base.cc",
     "data_manager/payments/payments_data_manager_test_base.h",
     "data_manager/payments/payments_data_manager_unittest.cc",
     "data_model/address_unittest.cc",
+    "data_model/autofill_ai/entity_instance_unittest.cc",
+    "data_model/autofill_ai/entity_type_unittest.cc",
     "data_model/autofill_i18n_api_unittest.cc",
     "data_model/autofill_i18n_parsing_expression_components_unittest.cc",
     "data_model/autofill_profile_comparator_unittest.cc",
@@ -1213,8 +1215,6 @@
     "data_model/contact_info_unittest.cc",
     "data_model/credit_card_benefit_unittest.cc",
     "data_model/credit_card_unittest.cc",
-    "data_model/entity_instance_unittest.cc",
-    "data_model/entity_type_unittest.cc",
     "data_model/ewallet_unittest.cc",
     "data_model/iban_unittest.cc",
     "data_model/payment_instrument_unittest.cc",
@@ -1375,8 +1375,8 @@
     "webdata/addresses/contact_info_sync_util_unittest.cc",
     "webdata/autocomplete/autocomplete_sync_bridge_unittest.cc",
     "webdata/autocomplete/autocomplete_table_unittest.cc",
+    "webdata/autofill_ai/entity_table_unittest.cc",
     "webdata/autofill_sync_metadata_table_unittest.cc",
-    "webdata/entities/entity_table_unittest.cc",
     "webdata/passes/passes_table_unittest.cc",
     "webdata/payments/autofill_wallet_credential_sync_bridge_unittest.cc",
     "webdata/payments/autofill_wallet_metadata_sync_bridge_unittest.cc",
diff --git a/components/autofill/core/browser/data_manager/entities/entity_data_manager.cc b/components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.cc
similarity index 96%
rename from components/autofill/core/browser/data_manager/entities/entity_data_manager.cc
rename to components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.cc
index 66cebed2..5411efe7 100644
--- a/components/autofill/core/browser/data_manager/entities/entity_data_manager.cc
+++ b/components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 
 #include <memory>
 
diff --git a/components/autofill/core/browser/data_manager/entities/entity_data_manager.h b/components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h
similarity index 89%
rename from components/autofill/core/browser/data_manager/entities/entity_data_manager.h
rename to components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h
index 1ebcf2d..bc298ef 100644
--- a/components/autofill/core/browser/data_manager/entities/entity_data_manager.h
+++ b/components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MANAGER_ENTITIES_ENTITY_DATA_MANAGER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MANAGER_ENTITIES_ENTITY_DATA_MANAGER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MANAGER_AUTOFILL_AI_ENTITY_DATA_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MANAGER_AUTOFILL_AI_ENTITY_DATA_MANAGER_H_
 
 #include "base/containers/flat_set.h"
 #include "base/containers/span.h"
 #include "base/types/optional_ref.h"
 #include "base/uuid.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/webdata/common/web_data_service_consumer.h"
@@ -81,4 +81,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MANAGER_ENTITIES_ENTITY_DATA_MANAGER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MANAGER_AUTOFILL_AI_ENTITY_DATA_MANAGER_H_
diff --git a/components/autofill/core/browser/data_manager/entities/entity_data_manager_unittest.cc b/components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager_unittest.cc
similarity index 94%
rename from components/autofill/core/browser/data_manager/entities/entity_data_manager_unittest.cc
rename to components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager_unittest.cc
index 2200e5a9..1d5df24 100644
--- a/components/autofill/core/browser/data_manager/entities/entity_data_manager_unittest.cc
+++ b/components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 
 #include <memory>
 #include <vector>
@@ -12,11 +12,11 @@
 #include "base/test/test_future.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_test_helper.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/os_crypt/async/browser/test_utils.h"
 #include "components/webdata/common/web_database.h"
diff --git a/components/autofill/core/browser/data_model/entity_instance.cc b/components/autofill/core/browser/data_model/autofill_ai/entity_instance.cc
similarity index 98%
rename from components/autofill/core/browser/data_model/entity_instance.cc
rename to components/autofill/core/browser/data_model/autofill_ai/entity_instance.cc
index 8584f153..04bf408 100644
--- a/components/autofill/core/browser/data_model/entity_instance.cc
+++ b/components/autofill/core/browser/data_model/autofill_ai/entity_instance.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 
 #include <algorithm>
 #include <ranges>
 
 #include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile_comparator.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/data_model/entity_instance.h b/components/autofill/core/browser/data_model/autofill_ai/entity_instance.h
similarity index 96%
rename from components/autofill/core/browser/data_model/entity_instance.h
rename to components/autofill/core/browser/data_model/autofill_ai/entity_instance.h
index a372412f..089836f 100644
--- a/components/autofill/core/browser/data_model/entity_instance.h
+++ b/components/autofill/core/browser/data_model/autofill_ai/entity_instance.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 COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_INSTANCE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_INSTANCE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_AI_ENTITY_INSTANCE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_AI_ENTITY_INSTANCE_H_
 
 #include <ostream>
 #include <string>
@@ -15,7 +15,7 @@
 #include "base/types/cxx23_to_underlying.h"
 #include "base/types/optional_ref.h"
 #include "base/uuid.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/data_model/form_group.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/common/dense_set.h"
@@ -253,4 +253,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_INSTANCE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_AI_ENTITY_INSTANCE_H_
diff --git a/components/autofill/core/browser/data_model/entity_instance_unittest.cc b/components/autofill/core/browser/data_model/autofill_ai/entity_instance_unittest.cc
similarity index 96%
rename from components/autofill/core/browser/data_model/entity_instance_unittest.cc
rename to components/autofill/core/browser/data_model/autofill_ai/entity_instance_unittest.cc
index 9f6324f2..7307255 100644
--- a/components/autofill/core/browser/data_model/entity_instance_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_ai/entity_instance_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 
 #include "base/types/optional_ref.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/autofill/core/browser/data_model/entity_schema.json b/components/autofill/core/browser/data_model/autofill_ai/entity_schema.json
similarity index 100%
rename from components/autofill/core/browser/data_model/entity_schema.json
rename to components/autofill/core/browser/data_model/autofill_ai/entity_schema.json
diff --git a/components/autofill/core/browser/data_model/entity_type.cc b/components/autofill/core/browser/data_model/autofill_ai/entity_type.cc
similarity index 98%
rename from components/autofill/core/browser/data_model/entity_type.cc
rename to components/autofill/core/browser/data_model/autofill_ai/entity_type.cc
index 4c3762e..43a5422 100644
--- a/components/autofill/core/browser/data_model/entity_type.cc
+++ b/components/autofill/core/browser/data_model/autofill_ai/entity_type.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 
 #include <optional>
 
diff --git a/components/autofill/core/browser/data_model/entity_type.h b/components/autofill/core/browser/data_model/autofill_ai/entity_type.h
similarity index 96%
rename from components/autofill/core/browser/data_model/entity_type.h
rename to components/autofill/core/browser/data_model/autofill_ai/entity_type.h
index 0b05c53..12e2ba16 100644
--- a/components/autofill/core/browser/data_model/entity_type.h
+++ b/components/autofill/core/browser/data_model/autofill_ai/entity_type.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_TYPE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_TYPE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_AI_ENTITY_TYPE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_AI_ENTITY_TYPE_H_
 
 #include <ostream>
 #include <string_view>
 
 #include "base/containers/span.h"
-#include "components/autofill/core/browser/data_model/entity_type_names.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/common/dense_set.h"
 
@@ -294,4 +294,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_TYPE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_AI_ENTITY_TYPE_H_
diff --git a/components/autofill/core/browser/data_model/entity_type_unittest.cc b/components/autofill/core/browser/data_model/autofill_ai/entity_type_unittest.cc
similarity index 95%
rename from components/autofill/core/browser/data_model/entity_type_unittest.cc
rename to components/autofill/core/browser/data_model/autofill_ai/entity_type_unittest.cc
index bf5ea5e1..dec8c2c2 100644
--- a/components/autofill/core/browser/data_model/entity_type_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_ai/entity_type_unittest.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 
-#include "components/autofill/core/browser/data_model/entity_type_names.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/components/autofill/core/browser/data_model/transpile_entity_schema.py b/components/autofill/core/browser/data_model/autofill_ai/transpile_entity_schema.py
similarity index 98%
rename from components/autofill/core/browser/data_model/transpile_entity_schema.py
rename to components/autofill/core/browser/data_model/autofill_ai/transpile_entity_schema.py
index 622fbef..9ff8355 100755
--- a/components/autofill/core/browser/data_model/transpile_entity_schema.py
+++ b/components/autofill/core/browser/data_model/autofill_ai/transpile_entity_schema.py
@@ -207,7 +207,7 @@
 #include "base/notreached.h"
 #include "base/types/cxx23_to_underlying.h"
 #include "base/types/pass_key.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/common/dense_set.h"
 
 namespace autofill {{
diff --git a/components/autofill/core/browser/data_model/loyalty_card.cc b/components/autofill/core/browser/data_model/passes/loyalty_card.cc
similarity index 91%
rename from components/autofill/core/browser/data_model/loyalty_card.cc
rename to components/autofill/core/browser/data_model/passes/loyalty_card.cc
index 106ad610..8311249f 100644
--- a/components/autofill/core/browser/data_model/loyalty_card.cc
+++ b/components/autofill/core/browser/data_model/passes/loyalty_card.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/data_model/loyalty_card.h"
+#include "components/autofill/core/browser/data_model/passes/loyalty_card.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/data_model/loyalty_card.h b/components/autofill/core/browser/data_model/passes/loyalty_card.h
similarity index 84%
rename from components/autofill/core/browser/data_model/loyalty_card.h
rename to components/autofill/core/browser/data_model/passes/loyalty_card.h
index 81332d86..913eefcd 100644
--- a/components/autofill/core/browser/data_model/loyalty_card.h
+++ b/components/autofill/core/browser/data_model/passes/loyalty_card.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 COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_LOYALTY_CARD_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_LOYALTY_CARD_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_PASSES_LOYALTY_CARD_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_PASSES_LOYALTY_CARD_H_
 
 #include <string>
 
@@ -42,4 +42,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_LOYALTY_CARD_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_PASSES_LOYALTY_CARD_H_
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h
index cbf51409..a35bc68 100644
--- a/components/autofill/core/browser/field_types.h
+++ b/components/autofill/core/browser/field_types.h
@@ -480,7 +480,7 @@
   NAME_LAST_CORE = 167,
 
   // Types corresponding to the "Passport" entity from
-  // components/autofill/core/browser/data_model/entity_schema.json.
+  // components/autofill/core/browser/data_model/autofill_ai/entity_schema.json.
   // *TAG field types are merely placeholder tagging that the type belongs to
   // the passport entity, but that the existing Autofill classification or logic
   // should be used.
@@ -491,13 +491,13 @@
   PASSPORT_ISSUE_DATE_TAG = 172,
 
   // Types corresponding to the "Loyalty card" entity from
-  // components/autofill/core/browser/data_model/entity_schema.json.
+  // components/autofill/core/browser/data_model/autofill_ai/entity_schema.json.
   LOYALTY_MEMBERSHIP_PROGRAM = 173,
   LOYALTY_MEMBERSHIP_PROVIDER = 174,
   // The member ID is represented by LOYALTY_MEMBERSHIP_ID.
 
   // Types corresponding to the "Car" entity from
-  // components/autofill/core/browser/data_model/entity_schema.json.
+  // components/autofill/core/browser/data_model/autofill_ai/entity_schema.json.
   VEHICLE_OWNER_TAG = 175,
   VEHICLE_LICENSE_PLATE = 176,
   VEHICLE_VIN = 177,
@@ -505,7 +505,7 @@
   VEHICLE_MODEL = 179,
 
   // Types corresponding to the "Drivers license" entity from
-  // components/autofill/core/browser/data_model/entity_schema.json.
+  // components/autofill/core/browser/data_model/autofill_ai/entity_schema.json.
   DRIVERS_LICENSE_NAME_TAG = 180,
   DRIVERS_LICENSE_REGION = 181,
   DRIVERS_LICENSE_NUMBER = 182,
diff --git a/components/autofill/core/browser/filling/entities/field_filling_entity_util.cc b/components/autofill/core/browser/filling/entities/field_filling_entity_util.cc
index 7c75cfa..36c885ce 100644
--- a/components/autofill/core/browser/filling/entities/field_filling_entity_util.cc
+++ b/components/autofill/core/browser/filling/entities/field_filling_entity_util.cc
@@ -6,8 +6,8 @@
 
 #include "base/containers/flat_set.h"
 #include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 
diff --git a/components/autofill/core/browser/filling/entities/field_filling_entity_util_unittest.cc b/components/autofill/core/browser/filling/entities/field_filling_entity_util_unittest.cc
index 80d16740..ceed12c9 100644
--- a/components/autofill/core/browser/filling/entities/field_filling_entity_util_unittest.cc
+++ b/components/autofill/core/browser/filling/entities/field_filling_entity_util_unittest.cc
@@ -5,12 +5,12 @@
 #include "components/autofill/core/browser/filling/entities/field_filling_entity_util.h"
 
 #include "base/test/task_environment.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_test_helper.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/components/autofill/core/browser/filling/form_filler.cc b/components/autofill/core/browser/filling/form_filler.cc
index cb90bdad..57b43c26 100644
--- a/components/autofill/core/browser/filling/form_filler.cc
+++ b/components/autofill/core/browser/filling/form_filler.cc
@@ -18,9 +18,9 @@
 #include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
 #include "components/autofill/core/browser/data_quality/autofill_data_util.h"
 #include "components/autofill/core/browser/field_type_utils.h"
 #include "components/autofill/core/browser/field_types.h"
diff --git a/components/autofill/core/browser/foundations/autofill_client.h b/components/autofill/core/browser/foundations/autofill_client.h
index 6258e50..c375d10 100644
--- a/components/autofill/core/browser/foundations/autofill_client.h
+++ b/components/autofill/core/browser/foundations/autofill_client.h
@@ -21,7 +21,7 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_trigger_source.h"
 #include "components/autofill/core/browser/country_type.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/filling/filling_product.h"
 #include "components/autofill/core/browser/integrators/fast_checkout_client.h"
 #include "components/autofill/core/browser/integrators/password_form_classification.h"
diff --git a/components/autofill/core/browser/foundations/test_autofill_client.h b/components/autofill/core/browser/foundations/test_autofill_client.h
index 9e973af..6d3d33f 100644
--- a/components/autofill/core/browser/foundations/test_autofill_client.h
+++ b/components/autofill/core/browser/foundations/test_autofill_client.h
@@ -24,7 +24,7 @@
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h"
 #include "components/autofill/core/browser/crowdsourcing/mock_autofill_crowdsourcing_manager.h"
 #include "components/autofill/core/browser/crowdsourcing/test_votes_uploader.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/data_manager/test_personal_data_manager.h"
 #include "components/autofill/core/browser/data_quality/addresses/test_address_normalizer.h"
 #include "components/autofill/core/browser/foundations/autofill_client.h"
diff --git a/components/autofill/core/browser/payments/bnpl_manager.h b/components/autofill/core/browser/payments/bnpl_manager.h
index 9c881f3..4490eb65 100644
--- a/components/autofill/core/browser/payments/bnpl_manager.h
+++ b/components/autofill/core/browser/payments/bnpl_manager.h
@@ -8,6 +8,7 @@
 #include <cstdint>
 #include <optional>
 #include <string>
+#include <variant>
 
 #include "base/memory/raw_ref.h"
 #include "base/memory/weak_ptr.h"
diff --git a/components/autofill/core/browser/payments/payments_autofill_client.cc b/components/autofill/core/browser/payments/payments_autofill_client.cc
index da04932..95ed9bb 100644
--- a/components/autofill/core/browser/payments/payments_autofill_client.cc
+++ b/components/autofill/core/browser/payments/payments_autofill_client.cc
@@ -234,6 +234,11 @@
 
 void PaymentsAutofillClient::HideTouchToFillPaymentMethod() {}
 
+const PaymentsDataManager& PaymentsAutofillClient::GetPaymentsDataManager()
+    const {
+  return const_cast<PaymentsAutofillClient*>(this)->GetPaymentsDataManager();
+}
+
 #if !BUILDFLAG(IS_IOS)
 std::unique_ptr<webauthn::InternalAuthenticator>
 PaymentsAutofillClient::CreateCreditCardInternalAuthenticator(
diff --git a/components/autofill/core/browser/payments/payments_autofill_client.h b/components/autofill/core/browser/payments/payments_autofill_client.h
index 18ee7eb..f5f5817 100644
--- a/components/autofill/core/browser/payments/payments_autofill_client.h
+++ b/components/autofill/core/browser/payments/payments_autofill_client.h
@@ -578,7 +578,8 @@
   // synchronous retrieval.
   // - Posting changes to `AutofillTable` via the `AutofillWebDataService`
   //   and updating its state accordingly.
-  virtual const PaymentsDataManager& GetPaymentsDataManager() const = 0;
+  virtual PaymentsDataManager& GetPaymentsDataManager() = 0;
+  const PaymentsDataManager& GetPaymentsDataManager() const;
 
 #if !BUILDFLAG(IS_IOS)
   // Creates the appropriate implementation of InternalAuthenticator. May be
diff --git a/components/autofill/core/browser/payments/test_payments_autofill_client.cc b/components/autofill/core/browser/payments/test_payments_autofill_client.cc
index e726d9f9..9a5e472 100644
--- a/components/autofill/core/browser/payments/test_payments_autofill_client.cc
+++ b/components/autofill/core/browser/payments/test_payments_autofill_client.cc
@@ -260,8 +260,7 @@
   return mock_payments_mandatory_reauth_manager_.get();
 }
 
-const PaymentsDataManager& TestPaymentsAutofillClient::GetPaymentsDataManager()
-    const {
+PaymentsDataManager& TestPaymentsAutofillClient::GetPaymentsDataManager() {
   return client_->GetPersonalDataManager().payments_data_manager();
 }
 
diff --git a/components/autofill/core/browser/payments/test_payments_autofill_client.h b/components/autofill/core/browser/payments/test_payments_autofill_client.h
index 36084636..8fbb586 100644
--- a/components/autofill/core/browser/payments/test_payments_autofill_client.h
+++ b/components/autofill/core/browser/payments/test_payments_autofill_client.h
@@ -122,7 +122,7 @@
 #endif
   MockMandatoryReauthManager* GetOrCreatePaymentsMandatoryReauthManager()
       override;
-  const PaymentsDataManager& GetPaymentsDataManager() const override;
+  PaymentsDataManager& GetPaymentsDataManager() final;
   void ShowUnmaskAuthenticatorSelectionDialog(
       const std::vector<CardUnmaskChallengeOption>& challenge_options,
       base::OnceCallback<void(const std::string&)>
diff --git a/components/autofill/core/browser/test_utils/autofill_test_utils.cc b/components/autofill/core/browser/test_utils/autofill_test_utils.cc
index 10434b2..2cf6f15 100644
--- a/components/autofill/core/browser/test_utils/autofill_test_utils.cc
+++ b/components/autofill/core/browser/test_utils/autofill_test_utils.cc
@@ -22,13 +22,13 @@
 #include "components/autofill/core/browser/crowdsourcing/randomized_encoder.h"
 #include "components/autofill/core/browser/data_manager/payments/payments_data_manager.h"
 #include "components/autofill/core/browser/data_manager/test_personal_data_manager.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/autofill_profile_test_api.h"
 #include "components/autofill/core/browser/data_model/bank_account.h"
 #include "components/autofill/core/browser/data_model/bnpl_issuer.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
 #include "components/autofill/core/browser/data_model/credit_card_test_api.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
 #include "components/autofill/core/browser/data_model/ewallet.h"
 #include "components/autofill/core/browser/data_model/iban.h"
 #include "components/autofill/core/browser/data_model/payment_instrument.h"
diff --git a/components/autofill/core/browser/test_utils/autofill_test_utils.h b/components/autofill/core/browser/test_utils/autofill_test_utils.h
index d87bc55..cdecbb7 100644
--- a/components/autofill/core/browser/test_utils/autofill_test_utils.h
+++ b/components/autofill/core/browser/test_utils/autofill_test_utils.h
@@ -12,6 +12,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/autofill_field.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/data_model/autofill_offer_data.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/autofill_wallet_usage_data.h"
@@ -19,7 +20,6 @@
 #include "components/autofill/core/browser/data_model/credit_card.h"
 #include "components/autofill/core/browser/data_model/credit_card_benefit.h"
 #include "components/autofill/core/browser/data_model/credit_card_cloud_token_data.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
 #include "components/autofill/core/browser/data_model/ewallet.h"
 #include "components/autofill/core/browser/data_model/iban.h"
 #include "components/autofill/core/browser/field_types.h"
diff --git a/components/autofill/core/browser/test_utils/passes_data_test_utils.cc b/components/autofill/core/browser/test_utils/passes_data_test_utils.cc
index 83c71130..a48f979e 100644
--- a/components/autofill/core/browser/test_utils/passes_data_test_utils.cc
+++ b/components/autofill/core/browser/test_utils/passes_data_test_utils.cc
@@ -4,7 +4,7 @@
 
 #include "components/autofill/core/browser/test_utils/passes_data_test_utils.h"
 
-#include "components/autofill/core/browser/data_model/loyalty_card.h"
+#include "components/autofill/core/browser/data_model/passes/loyalty_card.h"
 
 namespace autofill::test {
 
diff --git a/components/autofill/core/browser/test_utils/passes_data_test_utils.h b/components/autofill/core/browser/test_utils/passes_data_test_utils.h
index b260ecc..f6cbdc0 100644
--- a/components/autofill/core/browser/test_utils/passes_data_test_utils.h
+++ b/components/autofill/core/browser/test_utils/passes_data_test_utils.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_UTILS_PASSES_DATA_TEST_UTILS_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_UTILS_PASSES_DATA_TEST_UTILS_H_
 
-#include "components/autofill/core/browser/data_model/loyalty_card.h"
+#include "components/autofill/core/browser/data_model/passes/loyalty_card.h"
 
 namespace autofill::test {
 
diff --git a/components/autofill/core/browser/webdata/entities/entity_table.cc b/components/autofill/core/browser/webdata/autofill_ai/entity_table.cc
similarity index 98%
rename from components/autofill/core/browser/webdata/entities/entity_table.cc
rename to components/autofill/core/browser/webdata/autofill_ai/entity_table.cc
index 216cc05f..cd4ad07 100644
--- a/components/autofill/core/browser/webdata/entities/entity_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_ai/entity_table.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 
 #include <map>
 #include <optional>
@@ -16,7 +16,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/webdata/autofill_table_utils.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/os_crypt/async/common/encryptor.h"
diff --git a/components/autofill/core/browser/webdata/entities/entity_table.h b/components/autofill/core/browser/webdata/autofill_ai/entity_table.h
similarity index 94%
rename from components/autofill/core/browser/webdata/entities/entity_table.h
rename to components/autofill/core/browser/webdata/autofill_ai/entity_table.h
index 2583cdf..684b19c 100644
--- a/components/autofill/core/browser/webdata/entities/entity_table.h
+++ b/components/autofill/core/browser/webdata/autofill_ai/entity_table.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 COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_ENTITIES_ENTITY_TABLE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_ENTITIES_ENTITY_TABLE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_AI_ENTITY_TABLE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_AI_ENTITY_TABLE_H_
 
 #include <vector>
 
@@ -93,4 +93,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_ENTITIES_ENTITY_TABLE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_AI_ENTITY_TABLE_H_
diff --git a/components/autofill/core/browser/webdata/entities/entity_table_test_api.h b/components/autofill/core/browser/webdata/autofill_ai/entity_table_test_api.h
similarity index 66%
rename from components/autofill/core/browser/webdata/entities/entity_table_test_api.h
rename to components/autofill/core/browser/webdata/autofill_ai/entity_table_test_api.h
index bf6f72aa..24d14cc 100644
--- a/components/autofill/core/browser/webdata/entities/entity_table_test_api.h
+++ b/components/autofill/core/browser/webdata/autofill_ai/entity_table_test_api.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_ENTITIES_ENTITY_TABLE_TEST_API_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_ENTITIES_ENTITY_TABLE_TEST_API_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_AI_ENTITY_TABLE_TEST_API_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_AI_ENTITY_TABLE_TEST_API_H_
 
 #include "base/memory/raw_ref.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "sql/database.h"
 
 namespace autofill {
@@ -28,4 +28,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_ENTITIES_ENTITY_TABLE_TEST_API_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_AI_ENTITY_TABLE_TEST_API_H_
diff --git a/components/autofill/core/browser/webdata/entities/entity_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_ai/entity_table_unittest.cc
similarity index 94%
rename from components/autofill/core/browser/webdata/entities/entity_table_unittest.cc
rename to components/autofill/core/browser/webdata/autofill_ai/entity_table_unittest.cc
index a26a9bf..69f80bac 100644
--- a/components/autofill/core/browser/webdata/entities/entity_table_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_ai/entity_table_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 
 #include <memory>
 
@@ -11,11 +11,11 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table_test_api.h"
 #include "components/autofill/core/browser/webdata/autofill_table_utils.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table_test_api.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/os_crypt/async/browser/test_utils.h"
 #include "components/webdata/common/web_database.h"
diff --git a/components/autofill/core/browser/webdata/autofill_change.h b/components/autofill/core/browser/webdata/autofill_change.h
index ea63ae72..acfe317 100644
--- a/components/autofill/core/browser/webdata/autofill_change.h
+++ b/components/autofill/core/browser/webdata/autofill_change.h
@@ -10,9 +10,9 @@
 #include <vector>
 
 #include "base/check.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
 #include "components/autofill/core/browser/data_model/iban.h"
 #include "components/autofill/core/browser/webdata/autocomplete/autocomplete_entry.h"
 #include "components/autofill/core/browser/webdata/payments/payments_autofill_table.h"
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
index 63b0663..3e8ce393 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
@@ -16,13 +16,13 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/types/cxx23_to_underlying.h"
 #include "base/uuid.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/data_model/autofill_offer_data.h"
 #include "components/autofill/core/browser/data_model/autofill_wallet_usage_data.h"
 #include "components/autofill/core/browser/data_model/bank_account.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
 #include "components/autofill/core/browser/data_model/credit_card_benefit.h"
 #include "components/autofill/core/browser/data_model/credit_card_cloud_token_data.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
 #include "components/autofill/core/browser/data_model/iban.h"
 #include "components/autofill/core/browser/data_model/payments_metadata.h"
 #include "components/autofill/core/browser/geo/autofill_country.h"
@@ -30,10 +30,10 @@
 #include "components/autofill/core/browser/webdata/addresses/address_autofill_table.h"
 #include "components/autofill/core/browser/webdata/autocomplete/autocomplete_entry.h"
 #include "components/autofill/core/browser/webdata/autocomplete/autocomplete_table.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_change.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/browser/webdata/payments/payments_autofill_table.h"
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/dense_set.h"
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
index f5a4161..e6d1800 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
@@ -15,8 +15,8 @@
 #include "base/observer_list.h"
 #include "base/supports_user_data.h"
 #include "base/uuid.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/webdata/common/web_data_results.h"
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.cc b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
index ec62ff2..7fb9804 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
@@ -11,9 +11,9 @@
 #include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/uuid.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/data_model/autofill_offer_data.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
 #include "components/autofill/core/browser/data_model/iban.h"
 #include "components/autofill/core/browser/geo/autofill_country.h"
 #include "components/autofill/core/browser/webdata/autocomplete/autocomplete_entry.h"
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.h b/components/autofill/core/browser/webdata/autofill_webdata_service.h
index f472850..255f1bc 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service.h
@@ -13,8 +13,8 @@
 #include "base/observer_list.h"
 #include "base/supports_user_data.h"
 #include "base/uuid.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
 #include "components/autofill/core/browser/webdata/autofill_change.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/sync/base/data_type.h"
diff --git a/components/autofill/core/browser/webdata/passes/passes_table.cc b/components/autofill/core/browser/webdata/passes/passes_table.cc
index 15303e0..49577f23 100644
--- a/components/autofill/core/browser/webdata/passes/passes_table.cc
+++ b/components/autofill/core/browser/webdata/passes/passes_table.cc
@@ -7,7 +7,7 @@
 #include <optional>
 #include <string_view>
 
-#include "components/autofill/core/browser/data_model/loyalty_card.h"
+#include "components/autofill/core/browser/data_model/passes/loyalty_card.h"
 #include "components/autofill/core/browser/webdata/autofill_table_utils.h"
 #include "components/webdata/common/web_database.h"
 #include "sql/database.h"
diff --git a/components/autofill/core/browser/webdata/passes/passes_table.h b/components/autofill/core/browser/webdata/passes/passes_table.h
index 96e457a5..42dfa9b03 100644
--- a/components/autofill/core/browser/webdata/passes/passes_table.h
+++ b/components/autofill/core/browser/webdata/passes/passes_table.h
@@ -8,7 +8,7 @@
 #include <string_view>
 #include <vector>
 
-#include "components/autofill/core/browser/data_model/loyalty_card.h"
+#include "components/autofill/core/browser/data_model/passes/loyalty_card.h"
 #include "components/webdata/common/web_database_table.h"
 
 class WebDatabase;
diff --git a/components/autofill/core/browser/webdata/passes/passes_table_unittest.cc b/components/autofill/core/browser/webdata/passes/passes_table_unittest.cc
index a438180..5a2b2eaf 100644
--- a/components/autofill/core/browser/webdata/passes/passes_table_unittest.cc
+++ b/components/autofill/core/browser/webdata/passes/passes_table_unittest.cc
@@ -5,7 +5,7 @@
 #include "components/autofill/core/browser/webdata/passes/passes_table.h"
 
 #include "base/files/scoped_temp_dir.h"
-#include "components/autofill/core/browser/data_model/loyalty_card.h"
+#include "components/autofill/core/browser/data_model/passes/loyalty_card.h"
 #include "components/autofill/core/browser/test_utils/passes_data_test_utils.h"
 #include "components/webdata/common/web_database.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index fcb9ba3..05c378e 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -72,6 +72,10 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
+BASE_FEATURE(kAutofillEnableCardExpiredText,
+             "AutofillEnableCardExpiredText",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 // When enabled, runtime retrieval of CVC along with card number and expiry
 // from issuer for enrolled cards will be enabled during form fill.
 BASE_FEATURE(kAutofillEnableCardInfoRuntimeRetrieval,
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index b57eaef1..3c18a26 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -33,6 +33,7 @@
 BASE_DECLARE_FEATURE(kAutofillEnableCardBenefitsIph);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableCardBenefitsSync);
+COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillEnableCardExpiredText);
 COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillEnableCardProductName);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableCardInfoRuntimeRetrieval);
diff --git a/components/autofill_ai/core/browser/autofill_ai_client.cc b/components/autofill_ai/core/browser/autofill_ai_client.cc
index cc5e7f2a..0deccac4 100644
--- a/components/autofill_ai/core/browser/autofill_ai_client.cc
+++ b/components/autofill_ai/core/browser/autofill_ai_client.cc
@@ -7,7 +7,7 @@
 #include <optional>
 #include <utility>
 
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 
 namespace autofill_ai {
 
diff --git a/components/autofill_ai/core/browser/autofill_ai_client.h b/components/autofill_ai/core/browser/autofill_ai_client.h
index 747d0bd..38e52599 100644
--- a/components/autofill_ai/core/browser/autofill_ai_client.h
+++ b/components/autofill_ai/core/browser/autofill_ai_client.h
@@ -8,7 +8,7 @@
 #include <optional>
 
 #include "base/functional/callback_forward.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/foundations/autofill_client.h"
 #include "components/autofill/core/browser/integrators/autofill_ai_delegate.h"
 #include "components/autofill/core/common/unique_ids.h"
diff --git a/components/autofill_ai/core/browser/autofill_ai_logger_unittest.cc b/components/autofill_ai/core/browser/autofill_ai_logger_unittest.cc
index 0e03715..7fa2b43 100644
--- a/components/autofill_ai/core/browser/autofill_ai_logger_unittest.cc
+++ b/components/autofill_ai/core/browser/autofill_ai_logger_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
@@ -19,8 +19,8 @@
 #include "components/autofill/core/browser/suggestions/suggestion_type.h"
 #include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_test_helper.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/common/autofill_test_utils.h"
 #include "components/autofill_ai/core/browser/autofill_ai_manager.h"
 #include "components/autofill_ai/core/browser/autofill_ai_manager_test_api.h"
diff --git a/components/autofill_ai/core/browser/autofill_ai_manager.cc b/components/autofill_ai/core/browser/autofill_ai_manager.cc
index dae4c8d1..e9977f5 100644
--- a/components/autofill_ai/core/browser/autofill_ai_manager.cc
+++ b/components/autofill_ai/core/browser/autofill_ai_manager.cc
@@ -24,11 +24,11 @@
 #include "base/timer/timer.h"
 #include "base/types/expected.h"
 #include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_utils.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
-#include "components/autofill/core/browser/data_model/entity_type_names.h"
 #include "components/autofill/core/browser/field_type_utils.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/filling/field_filling_skip_reason.h"
diff --git a/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc b/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc
index 0d8a48a..af3210d5 100644
--- a/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc
+++ b/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc
@@ -13,10 +13,10 @@
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/time/time.h"
-#include "components/autofill/core/browser/data_manager/entities/entity_data_manager.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
-#include "components/autofill/core/browser/data_model/entity_type_names.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
@@ -25,8 +25,8 @@
 #include "components/autofill/core/browser/suggestions/suggestion_type.h"
 #include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_test_helper.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_test_utils.h"
 #include "components/autofill/core/common/form_data.h"
diff --git a/components/autofill_ai/core/browser/mock_autofill_ai_client.h b/components/autofill_ai/core/browser/mock_autofill_ai_client.h
index b6213d91..8a2c4e8 100644
--- a/components/autofill_ai/core/browser/mock_autofill_ai_client.h
+++ b/components/autofill_ai/core/browser/mock_autofill_ai_client.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_AUTOFILL_AI_CORE_BROWSER_MOCK_AUTOFILL_AI_CLIENT_H_
 #define COMPONENTS_AUTOFILL_AI_CORE_BROWSER_MOCK_AUTOFILL_AI_CLIENT_H_
 
-#include "components/autofill/core/browser/data_model/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
 #include "components/autofill_ai/core/browser/autofill_ai_client.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
diff --git a/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions.cc b/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions.cc
index fb878dc..647fc62 100644
--- a/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions.cc
+++ b/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions.cc
@@ -15,11 +15,11 @@
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/autofill_field.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "components/autofill/core/browser/data_model/autofill_profile_comparator.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_utils.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
-#include "components/autofill/core/browser/data_model/entity_type_names.h"
 #include "components/autofill/core/browser/field_type_utils.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_structure.h"
diff --git a/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions_unittest.cc b/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions_unittest.cc
index 7b9dab7..4fea07d 100644
--- a/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions_unittest.cc
+++ b/components/autofill_ai/core/browser/suggestion/autofill_ai_suggestions_unittest.cc
@@ -11,9 +11,9 @@
 #include "base/containers/span.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/data_model/entity_instance.h"
-#include "components/autofill/core/browser/data_model/entity_type.h"
-#include "components/autofill/core/browser/data_model/entity_type_names.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/suggestions/suggestion_type.h"
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperBuilder.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperBuilder.java
index fcc0c10..46093ca 100644
--- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperBuilder.java
+++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperBuilder.java
@@ -28,9 +28,9 @@
 
     NotificationWrapperBuilder setContentIntent(@Nullable PendingIntentProvider contentIntent);
 
-    NotificationWrapperBuilder setContentTitle(CharSequence title);
+    NotificationWrapperBuilder setContentTitle(@Nullable CharSequence title);
 
-    NotificationWrapperBuilder setContentText(CharSequence text);
+    NotificationWrapperBuilder setContentText(@Nullable CharSequence text);
 
     NotificationWrapperBuilder setSmallIcon(int icon);
 
@@ -38,7 +38,7 @@
 
     NotificationWrapperBuilder setColor(int argb);
 
-    NotificationWrapperBuilder setTicker(CharSequence text);
+    NotificationWrapperBuilder setTicker(@Nullable CharSequence text);
 
     NotificationWrapperBuilder setLocalOnly(boolean localOnly);
 
@@ -76,11 +76,12 @@
             NotificationCompat.Action action, int flags, int actionType, int requestCode);
 
     @Deprecated
-    NotificationWrapperBuilder setDeleteIntent(PendingIntent intent);
+    NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntent intent);
 
-    NotificationWrapperBuilder setDeleteIntent(PendingIntentProvider intent);
+    NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntentProvider intent);
 
-    NotificationWrapperBuilder setDeleteIntent(PendingIntentProvider intent, int actionType);
+    NotificationWrapperBuilder setDeleteIntent(
+            @Nullable PendingIntentProvider intent, int actionType);
 
     /**
      * Sets the priority of single notification on Android versions prior to Oreo.
@@ -90,11 +91,11 @@
 
     NotificationWrapperBuilder setProgress(int max, int percentage, boolean indeterminate);
 
-    NotificationWrapperBuilder setSubText(CharSequence text);
+    NotificationWrapperBuilder setSubText(@Nullable CharSequence text);
 
     NotificationWrapperBuilder setWhen(long time);
 
-    NotificationWrapperBuilder setLargeIcon(Bitmap icon);
+    NotificationWrapperBuilder setLargeIcon(@Nullable Bitmap icon);
 
     NotificationWrapperBuilder setVibrate(long[] vibratePattern);
 
@@ -106,13 +107,14 @@
 
     NotificationWrapperBuilder setOnlyAlertOnce(boolean onlyAlertOnce);
 
-    NotificationWrapperBuilder setPublicVersion(Notification publicNotification);
+    NotificationWrapperBuilder setPublicVersion(@Nullable Notification publicNotification);
 
     NotificationWrapperBuilder setContent(RemoteViews views);
 
-    NotificationWrapperBuilder setBigPictureStyle(Bitmap bigPicture, CharSequence summaryText);
+    NotificationWrapperBuilder setBigPictureStyle(
+            Bitmap bigPicture, @Nullable CharSequence summaryText);
 
-    NotificationWrapperBuilder setBigTextStyle(CharSequence bigText);
+    NotificationWrapperBuilder setBigTextStyle(@Nullable CharSequence bigText);
 
     NotificationWrapperBuilder setMediaStyle(MediaSessionCompat session, int[] actions);
 
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperCompatBuilder.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperCompatBuilder.java
index 68ea3816a..afd253f 100644
--- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperCompatBuilder.java
+++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperCompatBuilder.java
@@ -28,14 +28,14 @@
 public class NotificationWrapperCompatBuilder implements NotificationWrapperBuilder {
     private static final String TAG = "NotifCompatBuilder";
     private final NotificationCompat.Builder mBuilder;
-    private final NotificationMetadata mMetadata;
+    private final @Nullable NotificationMetadata mMetadata;
     private final Context mContext;
 
     public NotificationWrapperCompatBuilder(
             Context context,
             String channelId,
             ChannelsInitializer channelsInitializer,
-            NotificationMetadata metadata) {
+            @Nullable NotificationMetadata metadata) {
         channelsInitializer.safeInitialize(channelId);
         mBuilder = new NotificationCompat.Builder(context, channelId);
         mMetadata = metadata;
@@ -62,13 +62,13 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setContentTitle(CharSequence title) {
+    public NotificationWrapperBuilder setContentTitle(@Nullable CharSequence title) {
         mBuilder.setContentTitle(title);
         return this;
     }
 
     @Override
-    public NotificationWrapperBuilder setContentText(CharSequence text) {
+    public NotificationWrapperBuilder setContentText(@Nullable CharSequence text) {
         mBuilder.setContentText(text);
         return this;
     }
@@ -92,7 +92,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setTicker(CharSequence text) {
+    public NotificationWrapperBuilder setTicker(@Nullable CharSequence text) {
         mBuilder.setTicker(text);
         return this;
     }
@@ -193,20 +193,20 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setDeleteIntent(PendingIntent intent) {
+    public NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntent intent) {
         mBuilder.setDeleteIntent(intent);
         return this;
     }
 
     @Override
-    public NotificationWrapperBuilder setDeleteIntent(PendingIntentProvider intent) {
-        mBuilder.setDeleteIntent(intent.getPendingIntent());
+    public NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntentProvider intent) {
+        mBuilder.setDeleteIntent(intent != null ? intent.getPendingIntent() : null);
         return this;
     }
 
     @Override
     public NotificationWrapperBuilder setDeleteIntent(
-            PendingIntentProvider intent, int ignoredActionType) {
+            @Nullable PendingIntentProvider intent, int ignoredActionType) {
         return setDeleteIntent(intent);
     }
 
@@ -223,7 +223,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setSubText(CharSequence text) {
+    public NotificationWrapperBuilder setSubText(@Nullable CharSequence text) {
         mBuilder.setSubText(text);
         return this;
     }
@@ -235,7 +235,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setLargeIcon(Bitmap icon) {
+    public NotificationWrapperBuilder setLargeIcon(@Nullable Bitmap icon) {
         mBuilder.setLargeIcon(icon);
         return this;
     }
@@ -271,7 +271,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setPublicVersion(Notification publicNotification) {
+    public NotificationWrapperBuilder setPublicVersion(@Nullable Notification publicNotification) {
         mBuilder.setPublicVersion(publicNotification);
         return this;
     }
@@ -284,7 +284,7 @@
 
     @Override
     public NotificationWrapperBuilder setBigPictureStyle(
-            Bitmap bigPicture, CharSequence summaryText) {
+            Bitmap bigPicture, @Nullable CharSequence summaryText) {
         NotificationCompat.BigPictureStyle style =
                 new NotificationCompat.BigPictureStyle().bigPicture(bigPicture);
         // Android N doesn't show content text when expanded, so duplicate body text as a  summary
@@ -295,7 +295,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setBigTextStyle(CharSequence bigText) {
+    public NotificationWrapperBuilder setBigTextStyle(@Nullable CharSequence bigText) {
         mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(bigText));
         return this;
     }
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperStandardBuilder.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperStandardBuilder.java
index 263e18b..7b308f7 100644
--- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperStandardBuilder.java
+++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationWrapperStandardBuilder.java
@@ -34,7 +34,7 @@
 
     public NotificationWrapperStandardBuilder(
             Context context,
-            String channelId,
+            @Nullable String channelId,
             ChannelsInitializer channelsInitializer,
             NotificationMetadata metadata) {
         mContext = context;
@@ -64,13 +64,13 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setContentTitle(CharSequence title) {
+    public NotificationWrapperBuilder setContentTitle(@Nullable CharSequence title) {
         mBuilder.setContentTitle(title);
         return this;
     }
 
     @Override
-    public NotificationWrapperBuilder setContentText(CharSequence text) {
+    public NotificationWrapperBuilder setContentText(@Nullable CharSequence text) {
         mBuilder.setContentText(text);
         return this;
     }
@@ -94,7 +94,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setTicker(CharSequence text) {
+    public NotificationWrapperBuilder setTicker(@Nullable CharSequence text) {
         mBuilder.setTicker(text);
         return this;
     }
@@ -196,20 +196,20 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setDeleteIntent(PendingIntent intent) {
+    public NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntent intent) {
         mBuilder.setDeleteIntent(intent);
         return this;
     }
 
     @Override
-    public NotificationWrapperBuilder setDeleteIntent(PendingIntentProvider intent) {
-        mBuilder.setDeleteIntent(intent.getPendingIntent());
+    public NotificationWrapperBuilder setDeleteIntent(@Nullable PendingIntentProvider intent) {
+        mBuilder.setDeleteIntent(intent != null ? intent.getPendingIntent() : null);
         return this;
     }
 
     @Override
     public NotificationWrapperBuilder setDeleteIntent(
-            PendingIntentProvider intent, int ignoredActionType) {
+            @Nullable PendingIntentProvider intent, int ignoredActionType) {
         return setDeleteIntent(intent);
     }
 
@@ -226,7 +226,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setSubText(CharSequence text) {
+    public NotificationWrapperBuilder setSubText(@Nullable CharSequence text) {
         mBuilder.setSubText(text);
         return this;
     }
@@ -238,7 +238,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setLargeIcon(Bitmap icon) {
+    public NotificationWrapperBuilder setLargeIcon(@Nullable Bitmap icon) {
         mBuilder.setLargeIcon(icon);
         return this;
     }
@@ -274,7 +274,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setPublicVersion(Notification publicNotification) {
+    public NotificationWrapperBuilder setPublicVersion(@Nullable Notification publicNotification) {
         mBuilder.setPublicVersion(publicNotification);
         return this;
     }
@@ -288,7 +288,7 @@
 
     @Override
     public NotificationWrapperBuilder setBigPictureStyle(
-            Bitmap bigPicture, CharSequence summaryText) {
+            Bitmap bigPicture, @Nullable CharSequence summaryText) {
         Notification.BigPictureStyle style =
                 new Notification.BigPictureStyle().bigPicture(bigPicture);
 
@@ -301,7 +301,7 @@
     }
 
     @Override
-    public NotificationWrapperBuilder setBigTextStyle(CharSequence bigText) {
+    public NotificationWrapperBuilder setBigTextStyle(@Nullable CharSequence bigText) {
         mBuilder.setStyle(new Notification.BigTextStyle().bigText(bigText));
         return this;
     }
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelDefinitions.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelDefinitions.java
index 6a8fe5ba..ce9c625 100644
--- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelDefinitions.java
+++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelDefinitions.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.notifications.channels;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
 import android.content.res.Resources;
@@ -11,6 +13,7 @@
 import android.net.Uri;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.HashSet;
 import java.util.List;
@@ -46,7 +49,7 @@
     public Set<String> getStartupChannelGroupIds() {
         Set<String> groupIds = new HashSet<>();
         for (String id : getStartupChannelIds()) {
-            groupIds.add(getChannelFromId(id).mGroupId);
+            groupIds.add(assumeNonNull(getChannelFromId(id)).mGroupId);
         }
         return groupIds;
     }
@@ -58,12 +61,12 @@
     public abstract List<String> getLegacyChannelIds();
 
     public PredefinedChannelGroup getChannelGroupForChannel(PredefinedChannel channel) {
-        return getChannelGroup(channel.mGroupId);
+        return assumeNonNull(getChannelGroup(channel.mGroupId));
     }
 
-    public abstract PredefinedChannelGroup getChannelGroup(String groupId);
+    public abstract @Nullable PredefinedChannelGroup getChannelGroup(String groupId);
 
-    public abstract PredefinedChannel getChannelFromId(String channelId);
+    public abstract @Nullable PredefinedChannel getChannelFromId(String channelId);
 
     /**
      * @param channelId a channel ID which may or may not correlate to a PredefinedChannel.
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelsInitializer.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelsInitializer.java
index 22c596f..b6a34a9 100644
--- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelsInitializer.java
+++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/channels/ChannelsInitializer.java
@@ -206,7 +206,7 @@
      * This calls ensureInitialized after checking this isn't null.
      * @param channelId Id of the channel to be initialized.
      */
-    public void safeInitialize(String channelId) {
+    public void safeInitialize(@Nullable String channelId) {
         // The channelId may be null if the notification will be posted by another app that
         // does not target O or sets its own channels, e.g. WebAPK notifications.
         if (channelId == null) {
diff --git a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/TextMessagePreference.java b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/TextMessagePreference.java
index f308231a..424815a 100644
--- a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/TextMessagePreference.java
+++ b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/TextMessagePreference.java
@@ -26,7 +26,7 @@
     private @Nullable CharSequence mSummaryContentDescription;
 
     /** Constructor for inflating from XML. */
-    public TextMessagePreference(Context context, AttributeSet attrs) {
+    public TextMessagePreference(Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         setSelectable(false);
         setSingleLineTitle(false);
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java
index ce2e087..23128a3 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 
 import android.content.Context;
@@ -19,7 +20,6 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -27,12 +27,14 @@
 import androidx.preference.PreferenceViewHolder;
 
 import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.components.browser_ui.widget.CheckBoxWithDescription;
 import org.chromium.ui.KeyboardVisibilityDelegate;
 import org.chromium.ui.text.EmptyTextWatcher;
 
 /** A utility class for the UI recording exceptions to the blocked list for site settings. */
+@NullMarked
 public class AddExceptionPreference extends Preference
         implements Preference.OnPreferenceClickListener {
     // The callback to notify when the user adds a site.
@@ -105,6 +107,7 @@
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         TextView titleView = (TextView) holder.findViewById(android.R.id.title);
+        assumeNonNull(titleView);
         titleView.setTextColor(mPrefAccentColor);
     }
 
@@ -204,7 +207,7 @@
     }
 
     @VisibleForTesting
-    static String updatePatternIfNeeded(@NonNull String pattern, int type, boolean isChecked) {
+    static String updatePatternIfNeeded(String pattern, int type, boolean isChecked) {
         if (type == SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE) {
             if (isChecked) {
                 return WebsitePreferenceBridge.toDomainWildcardPattern(pattern);
@@ -216,7 +219,7 @@
     }
 
     @VisibleForTesting
-    static String getPrimaryPattern(@NonNull String pattern, int type, boolean isChecked) {
+    static String getPrimaryPattern(String pattern, int type, boolean isChecked) {
         if (type == SiteSettingsCategory.Type.THIRD_PARTY_COOKIES) {
             return SITE_WILDCARD;
         }
@@ -224,7 +227,7 @@
     }
 
     @VisibleForTesting
-    static String getSecondaryPattern(@NonNull String pattern, int type, boolean isChecked) {
+    static String getSecondaryPattern(String pattern, int type, boolean isChecked) {
         if (type == SiteSettingsCategory.Type.THIRD_PARTY_COOKIES) {
             return pattern;
         }
@@ -232,7 +235,7 @@
     }
 
     @VisibleForTesting
-    static boolean isPatternValid(@NonNull String pattern, int type) {
+    static boolean isPatternValid(String pattern, int type) {
         if (pattern.length() == 0) {
             return true;
         }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java
index 101f8a4..180d6f11 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.settings.SearchUtils.handleSearchNavigation;
 
 import android.content.Context;
@@ -23,7 +25,6 @@
 import android.widget.Button;
 import android.widget.TextView;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceManager;
@@ -32,6 +33,9 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.build.annotations.UsedByReflection;
 import org.chromium.components.browser_ui.accessibility.PageZoomUtils;
 import org.chromium.components.browser_ui.modaldialog.AppModalPresenter;
@@ -63,6 +67,7 @@
  * allow the user to see or modify the settings for that particular website.
  */
 @UsedByReflection("all_site_preferences.xml")
+@NullMarked
 public class AllSiteSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage,
                 PreferenceManager.OnPreferenceTreeClickListener,
@@ -85,23 +90,23 @@
     public static final String RWS_SEARCH_PREFIX = "related:";
 
     // The clear button displayed in the Storage view.
-    private Button mClearButton;
+    private @Nullable Button mClearButton;
     // The list that contains preferences.
     private RecyclerView mListView;
     // The view to show when the list is empty.
-    private TextView mEmptyView;
+    private @Nullable TextView mEmptyView;
     // The item for searching the list of items.
-    private MenuItem mSearchItem;
+    private @Nullable MenuItem mSearchItem;
     // The Site Settings Category we are showing.
     private SiteSettingsCategory mCategory;
     // If not blank, represents a substring to use to search for site names.
-    private String mSearch;
+    private @Nullable String mSearch;
     // The websites that are currently displayed to the user.
-    private List<WebsitePreference> mWebsites;
+    private @Nullable List<WebsitePreference> mWebsites;
     private PropertyModel mDialogModel;
     private ModalDialogManager mDialogManager;
 
-    @Nullable private Set<String> mSelectedDomains;
+    private @Nullable Set<String> mSelectedDomains;
 
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
@@ -131,20 +136,24 @@
 
     @Override
     public View onCreateView(
-            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+            LayoutInflater inflater,
+            @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
         // Read which category we should be showing.
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
+        SiteSettingsCategory category = null;
         if (getArguments() != null) {
-            mCategory =
+            category =
                     SiteSettingsCategory.createFromPreferenceKey(
                             browserContextHandle, getArguments().getString(EXTRA_CATEGORY, ""));
         }
-        if (mCategory == null) {
-            mCategory =
+        if (category == null) {
+            category =
                     SiteSettingsCategory.createFromType(
                             browserContextHandle, SiteSettingsCategory.Type.ALL_SITES);
         }
+        mCategory = category;
         if (mCategory.getType() == SiteSettingsCategory.Type.ZOOM) {
             mCategory =
                     SiteSettingsCategory.createFromType(
@@ -214,6 +223,7 @@
 
     /** This resets the zooms for all websites to the default zoom set in Chrome Site Settings. */
     public void clearZooms() {
+        assumeNonNull(mWebsites);
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
         double defaultZoomFactor =
@@ -222,7 +232,7 @@
             // Propagate the change through HostZoomMap.
             HostZoomMap.setZoomLevelForHost(
                     browserContextHandle,
-                    preference.site().getAddress().getHost(),
+                    assumeNonNull(preference.site().getAddress().getHost()),
                     defaultZoomFactor);
         }
         // Refresh this fragment to trigger UI change.
@@ -230,6 +240,7 @@
     }
 
     /** OnClickListener for the zoom button **/
+    @Initializer
     public void handleZoomClearAll(View v) {
         Resources resources = getContext().getResources();
         mDialogModel =
@@ -335,13 +346,13 @@
     }
 
     @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
         // Handled in onActivityCreated. Moving the addPreferencesFromResource call up to here
         // causes animation jank (crbug.com/985734).
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
         addPreferencesFromXml();
 
         String title = getArguments().getString(EXTRA_TITLE);
@@ -403,6 +414,7 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
+        assumeNonNull(mSearchItem);
         if (item.getItemId() == R.id.menu_id_site_settings_help) {
             getSiteSettingsDelegate().launchSettingsHelpAndFeedbackActivity(getActivity());
 
@@ -458,6 +470,7 @@
         if (mCategory.getType() == SiteSettingsCategory.Type.ALL_SITES) {
             SettingsUtils.addPreferencesFromResource(this, R.xml.all_site_preferences_v2);
             ChromeBasePreference clearBrowsingDataLink = findPreference(PREF_CLEAR_BROWSING_DATA);
+            assertNonNull(clearBrowsingDataLink);
             if (!getSiteSettingsDelegate().canLaunchClearBrowsingDataDialog()) {
                 getPreferenceScreen().removePreference(clearBrowsingDataLink);
                 return;
@@ -534,7 +547,7 @@
                 && mSearch != null
                 && mSearch.startsWith(RWS_SEARCH_PREFIX)) {
             return entry.isPartOfRws()
-                    && entry.getRwsOwner()
+                    && assumeNonNull(entry.getRwsOwner())
                             .contains(
                                     mSearch.replace(
                                             RWS_SEARCH_PREFIX,
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AutoDarkMetrics.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AutoDarkMetrics.java
index 15b1343..b4bdf91f 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AutoDarkMetrics.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AutoDarkMetrics.java
@@ -7,12 +7,14 @@
 import androidx.annotation.IntDef;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 /** Metrics recording functions for {@link ContentSettingsType.AUTO_DARK_WEB_CONTENT}. */
+@NullMarked
 public final class AutoDarkMetrics {
     /**
      * Source from which auto dark web content settings changed. This includes both changes to the
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BaseSiteSettingsFragment.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BaseSiteSettingsFragment.java
index b36405eb..b59a244c 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BaseSiteSettingsFragment.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BaseSiteSettingsFragment.java
@@ -6,14 +6,17 @@
 
 import androidx.preference.PreferenceFragmentCompat;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.FragmentSettingsNavigation;
 import org.chromium.components.browser_ui.settings.SettingsNavigation;
 
 /** Preference fragment for showing the Site Settings UI. */
+@NullMarked
 public abstract class BaseSiteSettingsFragment extends PreferenceFragmentCompat
         implements FragmentSettingsNavigation {
-    private SiteSettingsDelegate mSiteSettingsDelegate;
-    private SettingsNavigation mSettingsNavigation;
+    private @Nullable SiteSettingsDelegate mSiteSettingsDelegate;
+    private @Nullable SettingsNavigation mSettingsNavigation;
 
     /**
      * Sets the SiteSettingsDelegate instance this Fragment should use.
@@ -50,7 +53,7 @@
     }
 
     /** Returns the associated {@link SettingsNavigation}. */
-    public SettingsNavigation getSettingsNavigation() {
+    public @Nullable SettingsNavigation getSettingsNavigation() {
         return mSettingsNavigation;
     }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectInfo.java
index 15971f47..05988c5 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectInfo.java
@@ -6,6 +6,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
@@ -15,6 +16,7 @@
  * Information about an object (such as a USB device) the user has granted permission for an origin
  * to access.
  */
+@NullMarked
 public class ChosenObjectInfo implements Serializable {
     private final @ContentSettingsType.EnumType int mContentSettingsType;
     private final String mOrigin;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java
index bb76d688..d60a457 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java
@@ -4,6 +4,9 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -22,6 +25,8 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
 import org.chromium.components.browser_ui.settings.EmbeddableSettingsPage;
@@ -36,6 +41,7 @@
  * Shows a particular chosen object (e.g. a USB device) and the list of sites that have been granted
  * access to it by the user.
  */
+@NullMarked
 public class ChosenObjectSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage, CustomDividerFragment {
     public static final String EXTRA_OBJECT_INFOS = "org.chromium.chrome.preferences.object_infos";
@@ -45,19 +51,22 @@
 
     // The site settings category we are showing.
     private SiteSettingsCategory mCategory;
+
     // The set of object permissions being examined.
+    @SuppressWarnings("NullAway.Init")
     private ArrayList<ChosenObjectInfo> mObjectInfos;
+
     // The set of sites to display.
-    private ArrayList<Website> mSites;
+    private @Nullable ArrayList<Website> mSites;
     // The view for searching the list of items.
-    private SearchView mSearchView;
+    private @Nullable SearchView mSearchView;
     // If not blank, represents a substring to use to search for site names.
     private String mSearch = "";
 
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
     @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
         // Set empty preferences screen.
         PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getStyledContext());
         setPreferenceScreen(screen);
@@ -65,13 +74,15 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public void onActivityCreated(Bundle savedInstanceState) {
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
         int contentSettingsType = getArguments().getInt(EXTRA_CATEGORY);
-        mCategory =
+        SiteSettingsCategory category =
                 SiteSettingsCategory.createFromContentSettingsType(
                         getSiteSettingsDelegate().getBrowserContextHandle(), contentSettingsType);
+        mCategory = assertNonNull(category);
         mObjectInfos =
-                (ArrayList<ChosenObjectInfo>) getArguments().getSerializable(EXTRA_OBJECT_INFOS);
+                (ArrayList<ChosenObjectInfo>)
+                        assertNonNull(getArguments().getSerializable(EXTRA_OBJECT_INFOS));
         checkObjectConsistency();
         mSites = (ArrayList<Website>) getArguments().getSerializable(EXTRA_SITES);
         String title = getArguments().getString(SingleCategorySettings.EXTRA_TITLE);
@@ -192,7 +203,7 @@
         if (hasManagedObject) {
             ManagedPreferencesUtils.showManagedSettingsCannotBeResetToast(getContext());
         } else {
-            getSettingsNavigation().finishCurrentSettings(this);
+            assumeNonNull(getSettingsNavigation()).finishCurrentSettings(this);
         }
     }
 
@@ -229,7 +240,8 @@
             // them back to SingleCategorySettings which will now no longer offer the option to
             // examine the permissions for this object.
             if (mObjectInfos.isEmpty()) {
-                getSettingsNavigation().finishCurrentSettings(ChosenObjectSettings.this);
+                assumeNonNull(getSettingsNavigation())
+                        .finishCurrentSettings(ChosenObjectSettings.this);
             } else {
                 resetList();
             }
@@ -257,7 +269,7 @@
         ChromeImageViewPreference header = new ChromeImageViewPreference(getStyledContext());
         String titleText = mObjectInfos.get(0).getName();
         String dialogMsg =
-                getView()
+                assumeNonNull(getView())
                         .getContext()
                         .getString(
                                 R.string.chosen_object_website_reset_confirmation_for, titleText);
@@ -299,6 +311,7 @@
         preferenceScreen.removeAll();
         createHeader();
 
+        assumeNonNull(mSites);
         // Each item |i| in |mSites| and |mObjectInfos| correspond to each other.
         // See SingleCategorySettings.addChosenObjects().
         for (int i = 0; i < mSites.size() && i < mObjectInfos.size(); ++i) {
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorage.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorage.java
index 5e6f8fe..4efbd460 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorage.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorage.java
@@ -10,12 +10,16 @@
 import androidx.preference.DialogPreference;
 import androidx.preference.PreferenceViewHolder;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
 /** Dialog that prompts the user to clear website storage on the device. */
+@NullMarked
 public class ClearWebsiteStorage extends DialogPreference {
     Context mContext;
 
     // The host to show in the dialog.
-    String mHost;
+    @Nullable String mHost;
 
     // Whether to warn that apps will also be deleted.
     boolean mClearingApps;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorageDialog.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorageDialog.java
index 1da211a..edea789e 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorageDialog.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorageDialog.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.view.View;
@@ -13,17 +15,20 @@
 import androidx.preference.PreferenceDialogFragmentCompat;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.ViewUtils;
 
 /** The fragment used to display the clear website storage confirmation dialog. */
+@NullMarked
 public class ClearWebsiteStorageDialog extends PreferenceDialogFragmentCompat {
     public static final String TAG = "ClearWebsiteStorageDialog";
     private static final String IS_GROUP = "is_group";
 
-    private static Callback<Boolean> sCallback;
+    private static @Nullable Callback<Boolean> sCallback;
 
     // The view containing the dialog ui elements.
-    private View mDialogView;
+    private @Nullable View mDialogView;
 
     public static ClearWebsiteStorageDialog newInstance(
             Preference preference, Callback<Boolean> callback, boolean isGroup) {
@@ -56,19 +61,19 @@
             // When the device switches to multi-window in landscape mode, the height of the
             // offlineTextView is not calculated correctly (its height gets truncated) and a layout
             // pass is needed to fix it. See https://crbug.com/1072922.
-            mDialogView
-                    .getHandler()
+            assumeNonNull(mDialogView.getHandler())
                     .post(
                             () -> {
                                 ViewUtils.requestLayout(
-                                        mDialogView,
-                                        "ClearWebsiteStorageDialog.onConfigurationChanged Runnable");
+                                        assumeNonNull(mDialogView),
+                                        "ClearWebsiteStorageDialog.onConfigurationChanged"
+                                                + " Runnable");
                             });
         }
     }
 
     @Override
     public void onDialogClosed(boolean positiveResult) {
-        sCallback.onResult(positiveResult);
+        assumeNonNull(sCallback).onResult(positiveResult);
     }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingException.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingException.java
index 353fe3c..bbc978d 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingException.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingException.java
@@ -6,9 +6,8 @@
 
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.content_settings.ProviderType;
@@ -17,16 +16,17 @@
 import java.io.Serializable;
 
 /** Exception information for a given origin. */
+@NullMarked
 public class ContentSettingException implements Serializable {
     private final @ContentSettingsType.EnumType int mContentSettingType;
     private final String mPrimaryPattern;
-    private final String mSecondaryPattern;
+    private final @Nullable String mSecondaryPattern;
     // TODO(crbug.com/40231949): Convert {@link #mSource} to enum to enable merging {@link #mSource}
     // and {@link #mIsEmbargoed}.
     private final @ProviderType.EnumType int mSource;
-    private final Integer mExpirationInDays;
+    private final @Nullable Integer mExpirationInDays;
     private final boolean mIsEmbargoed;
-    private @ContentSettingValues @Nullable Integer mContentSetting;
+    private @ContentSettingValues int mContentSetting;
 
     /**
      * Construct a ContentSettingException.
@@ -41,10 +41,10 @@
     public ContentSettingException(
             @ContentSettingsType.EnumType int type,
             String primaryPattern,
-            String secondaryPattern,
-            @ContentSettingValues @Nullable Integer setting,
+            @Nullable String secondaryPattern,
+            @ContentSettingValues int setting,
             @ProviderType.EnumType int source,
-            final Integer expirationInDays,
+            final @Nullable Integer expirationInDays,
             boolean isEmbargoed) {
         mContentSettingType = type;
         mPrimaryPattern = primaryPattern;
@@ -61,7 +61,7 @@
     public ContentSettingException(
             @ContentSettingsType.EnumType int type,
             String primaryPattern,
-            @ContentSettingValues @Nullable Integer setting,
+            @ContentSettingValues int setting,
             @ProviderType.EnumType int source,
             boolean isEmbargoed) {
         this(
@@ -78,11 +78,11 @@
         return mPrimaryPattern;
     }
 
-    public String getSecondaryPattern() {
+    public @Nullable String getSecondaryPattern() {
         return mSecondaryPattern;
     }
 
-    private @NonNull String getSecondaryPatternSafe() {
+    private String getSecondaryPatternSafe() {
         return (mSecondaryPattern == null) ? SITE_WILDCARD : mSecondaryPattern;
     }
 
@@ -90,7 +90,7 @@
         return mSource;
     }
 
-    public @ContentSettingValues @Nullable Integer getContentSetting() {
+    public @ContentSettingValues int getContentSetting() {
         return mContentSetting;
     }
 
@@ -102,7 +102,7 @@
         return mExpirationInDays != null;
     }
 
-    public Integer getExpirationInDays() {
+    public @Nullable Integer getExpirationInDays() {
         return mExpirationInDays;
     }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java
index 40fcf84..422524563 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.Resources;
@@ -17,9 +19,9 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.FeatureList;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.SettingsUtils;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
@@ -35,6 +37,7 @@
 // because our key is an int but we're changing the key to a string soon so
 // suppress the lint warning for now.
 @SuppressLint("UseSparseArrays")
+@NullMarked
 public class ContentSettingsResources {
     /** An inner class contains all the resources for a ContentSettingsType */
     private static class ResourceItem {
@@ -80,12 +83,14 @@
         }
 
         private int getEnabledSummary() {
+            assumeNonNull(mDefaultEnabledValue);
             return mEnabledSummary == 0
                     ? getCategorySummary(mDefaultEnabledValue, /* isOneTime= */ false)
                     : mEnabledSummary;
         }
 
         private int getDisabledSummary() {
+            assumeNonNull(mDefaultDisabledValue);
             return mDisabledSummary == 0
                     ? getCategorySummary(mDefaultDisabledValue, /* isOneTime= */ false)
                     : mDisabledSummary;
@@ -446,7 +451,7 @@
                         R.string.website_settings_category_vr_a11y);
         }
         assert false; // NOTREACHED
-        return null;
+        return assumeNonNull(null);
     }
 
     /** Returns the resource id of the 24dp icon for a content type. */
@@ -464,7 +469,7 @@
      *     returned icon will have a strike through it.
      * @return A grey 24dp {@link Drawable} for this content setting.
      */
-    public static Drawable getContentSettingsIcon(
+    public static @Nullable Drawable getContentSettingsIcon(
             Context context,
             @ContentSettingsType.EnumType int contentSettingsType,
             @ContentSettingValues @Nullable Integer value) {
@@ -486,7 +491,7 @@
      * @param isIncognito Whether this icon should use the incognito color scheme.
      * @return A blue 24dp {@link Drawable} for this content setting.
      */
-    public static Drawable getIconForOmnibox(
+    public static @Nullable Drawable getIconForOmnibox(
             Context context,
             @ContentSettingsType.EnumType int contentSettingsType,
             @ContentSettingValues @Nullable Integer value,
@@ -506,7 +511,7 @@
      * @return A {@link Drawable} that is the blocked version of the square icon passed in.
      *         Achieved by adding a diagonal strike through the icon.
      */
-    private static Drawable getBlockedSquareIcon(Resources resources, Drawable icon) {
+    private static @Nullable Drawable getBlockedSquareIcon(Resources resources, Drawable icon) {
         if (icon == null) return null;
         // Save color filter in order to re-apply later
         ColorFilter filter = icon.getColorFilter();
@@ -631,7 +636,7 @@
      * @param contentSettingsType The ContentSettingsType for this string resource id.
      */
     public static int getSiteSummary(
-            @ContentSettingValues @Nullable Integer value,
+            @ContentSettingValues Integer value,
             @ContentSettingsType.EnumType int contentSettingsType) {
         switch (value) {
             case ContentSettingValues.ALLOW:
@@ -775,7 +780,7 @@
      * @return An array of 3 resource IDs for descriptions for Allowed, Ask and
      *         Blocked states, in that order.
      */
-    public static int[] getTriStateSettingDescriptionIDs(int contentType) {
+    public static int @Nullable [] getTriStateSettingDescriptionIDs(int contentType) {
         if (contentType == ContentSettingsType.PROTECTED_MEDIA_IDENTIFIER) {
             int[] descriptionIDs = {
                 R.string.website_settings_category_protected_content_allowed_recommended,
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/CookiesInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/CookiesInfo.java
index 8ab3e6c..3f4a739 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/CookiesInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/CookiesInfo.java
@@ -4,9 +4,12 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.io.Serializable;
 
 /** Cookies information for a given origin. */
+@NullMarked
 public class CookiesInfo implements Serializable {
     private int mCookies;
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java
index 94bf28b3..17ebdc4 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java
@@ -7,9 +7,11 @@
 import static org.chromium.components.browser_ui.site_settings.WebsiteAddress.ANY_SUBDOMAIN_PATTERN;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.content_settings.ContentSettingValues;
 
 /** Metrics recording functions for {@link SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE}. */
+@NullMarked
 public final class DesktopSiteMetrics {
     /**
      * Records when a user manually adds a domain or subdomain level Request Desktop Setting from
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/FileEditingInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/FileEditingInfo.java
index e398ac0..6fa504b 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/FileEditingInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/FileEditingInfo.java
@@ -4,11 +4,14 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
 /** File editing information for a given origin. */
+@NullMarked
 public class FileEditingInfo implements Serializable {
 
     public static class Grant implements Serializable {
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ForwardingManagedPreferenceDelegate.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ForwardingManagedPreferenceDelegate.java
index 6b532aa0..8cf5135 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ForwardingManagedPreferenceDelegate.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ForwardingManagedPreferenceDelegate.java
@@ -7,6 +7,7 @@
 import androidx.annotation.LayoutRes;
 import androidx.preference.Preference;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
 
 /**
@@ -17,6 +18,7 @@
  * will forward to the base implementation, which will typically be the embedder-provided
  * ManagedPreferenceDelegate instance.
  */
+@NullMarked
 public class ForwardingManagedPreferenceDelegate implements ManagedPreferenceDelegate {
     private final ManagedPreferenceDelegate mBase;
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
index b4b8ba60..3da24a8 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.app.Dialog;
 import android.os.Bundle;
@@ -20,6 +22,9 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
 import org.chromium.components.browser_ui.settings.EmbeddableSettingsPage;
 import org.chromium.components.browser_ui.settings.SettingsUtils;
@@ -27,6 +32,7 @@
 import org.chromium.components.browsing_data.DeleteBrowsingDataAction;
 
 /** Shows the permissions and other settings for a group of websites. */
+@NullMarked
 public class GroupedWebsitesSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage,
                 Preference.OnPreferenceClickListener,
@@ -40,11 +46,11 @@
     public static final String PREF_SITES_IN_GROUP = "sites_in_group";
     public static final String PREF_RESET_GROUP = "reset_group_button";
 
-    private static GroupedWebsitesSettings sPausedInstance;
+    private static @Nullable GroupedWebsitesSettings sPausedInstance;
 
     private WebsiteGroup mSiteGroup;
 
-    private Dialog mConfirmationDialog;
+    private @Nullable Dialog mConfirmationDialog;
 
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
@@ -54,13 +60,14 @@
      * <p>This is used by {@link SingleWebsiteSettings} to go to the 'All Sites' level when clearing
      * data.
      */
-    public static GroupedWebsitesSettings getPausedInstance() {
+    public static @Nullable GroupedWebsitesSettings getPausedInstance() {
         ThreadUtils.assertOnUiThread();
         return sPausedInstance;
     }
 
     @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    @Initializer
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
         // Remove this Preference if it gets restored without a valid SiteSettingsDelegate. This
         // can happen e.g. when it is included in PageInfo.
         if (!hasSiteSettingsDelegate()) {
@@ -79,11 +86,11 @@
 
         // Preferences screen
         SettingsUtils.addPreferencesFromResource(this, R.xml.grouped_websites_preferences);
-        findPreference(PREF_SITE_TITLE).setTitle(domainAndRegistry);
-        findPreference(PREF_SITES_IN_GROUP)
-                .setTitle(
-                        activity.getString(
-                                R.string.domain_settings_sites_in_group, domainAndRegistry));
+        Preference siteTitlePref = assumeNonNull(findPreference(PREF_SITE_TITLE));
+        siteTitlePref.setTitle(domainAndRegistry);
+        Preference siteInGroupPref = assumeNonNull(findPreference(PREF_SITES_IN_GROUP));
+        siteInGroupPref.setTitle(
+                activity.getString(R.string.domain_settings_sites_in_group, domainAndRegistry));
         setUpClearDataPreference();
         setUpResetGroupPreference();
         setUpRelatedSitesPreferences();
@@ -160,7 +167,7 @@
     public void onDisplayPreferenceDialog(Preference preference) {
         if (preference instanceof ClearWebsiteStorage) {
             // If the activity is getting destroyed or saved, it is not allowed to modify fragments.
-            if (getFragmentManager().isStateSaved()) {
+            if (assumeNonNull(getFragmentManager()).isStateSaved()) {
                 return;
             }
             Callback<Boolean> onDialogClosed =
@@ -193,7 +200,7 @@
                 // place for a slightly smoother user experience. However, due to the complexity
                 // involved in refreshing the already fetched data and a very marginal benefit, it
                 // may not be worth it.
-                getSettingsNavigation().finishCurrentSettings(this);
+                assumeNonNull(getSettingsNavigation()).finishCurrentSettings(this);
             };
 
     @VisibleForTesting
@@ -212,6 +219,7 @@
 
     private void setUpClearDataPreference() {
         ClearWebsiteStorage preference = findPreference(PREF_CLEAR_DATA);
+        assumeNonNull(preference);
         long storage = mSiteGroup.getTotalUsage();
         int cookies = mSiteGroup.getNumberOfCookies();
         if (storage > 0 || cookies > 0) {
@@ -234,6 +242,7 @@
 
     private void setUpResetGroupPreference() {
         Preference preference = findPreference(PREF_RESET_GROUP);
+        assumeNonNull(preference);
         if (mSiteGroup.isCookieDeletionDisabled(
                 getSiteSettingsDelegate().getBrowserContextHandle())) {
             preference.setEnabled(false);
@@ -243,24 +252,26 @@
 
     private void setUpRelatedSitesPreferences() {
         PreferenceCategory relatedSitesHeader = findPreference(PREF_RELATED_SITES);
+        assumeNonNull(relatedSitesHeader);
         TextMessagePreference relatedSitesText = new TextMessagePreference(getContext(), null);
+        var rwsInfo = mSiteGroup.getRwsInfo();
         boolean shouldRelatedSitesPrefBeVisible =
                 getSiteSettingsDelegate().isPrivacySandboxFirstPartySetsUiFeatureEnabled()
                         && getSiteSettingsDelegate().isRelatedWebsiteSetsDataAccessEnabled()
-                        && mSiteGroup.getRwsInfo() != null;
+                        && rwsInfo != null;
         relatedSitesText.setVisible(shouldRelatedSitesPrefBeVisible);
         relatedSitesHeader.setVisible(shouldRelatedSitesPrefBeVisible);
 
         if (shouldRelatedSitesPrefBeVisible) {
-            var rwsInfo = mSiteGroup.getRwsInfo();
+            assumeNonNull(rwsInfo);
 
             relatedSitesText.setTitle(
                     getContext()
                             .getResources()
                             .getQuantityString(
                                     R.plurals.allsites_rws_summary,
-                                    mSiteGroup.getRwsInfo().getMembersCount(),
-                                    Integer.toString(mSiteGroup.getRwsInfo().getMembersCount()),
+                                    rwsInfo.getMembersCount(),
+                                    Integer.toString(rwsInfo.getMembersCount()),
                                     rwsInfo.getOwner()));
             relatedSitesText.setManagedPreferenceDelegate(
                     new ForwardingManagedPreferenceDelegate(
@@ -282,7 +293,7 @@
             if (getSiteSettingsDelegate().shouldShowPrivacySandboxRwsUi()) {
                 relatedSitesHeader.removeAll();
                 relatedSitesHeader.addPreference(relatedSitesText);
-                for (Website site : mSiteGroup.getRwsInfo().getMembers()) {
+                for (Website site : rwsInfo.getMembers()) {
                     WebsiteRowPreference preference =
                             new RwsRowPreference(
                                     relatedSitesHeader.getContext(),
@@ -297,6 +308,7 @@
 
     private void updateSitesInGroup() {
         PreferenceCategory category = findPreference(PREF_SITES_IN_GROUP);
+        assumeNonNull(category);
         category.removeAll();
         for (Website site : mSiteGroup.getWebsites()) {
             WebsiteRowPreference preference =
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocalStorageInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocalStorageInfo.java
index 79a9d0e0..1795f26 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocalStorageInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocalStorageInfo.java
@@ -6,12 +6,14 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.StorageInfoClearedCallback;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 import java.io.Serializable;
 
 /** Local Storage information for a given origin. */
+@NullMarked
 public class LocalStorageInfo implements Serializable {
     private final String mOrigin;
     private final long mSize;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocationCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocationCategory.java
index 1123ed5..abfaf61 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocationCategory.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/LocationCategory.java
@@ -8,11 +8,14 @@
 import android.content.Intent;
 import android.content.res.Resources;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.location.LocationUtils;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 /** A class for dealing with the Geolocation category. */
+@NullMarked
 public class LocationCategory extends SiteSettingsCategory {
     public LocationCategory(BrowserContextHandle browserContextHandle) {
         super(
@@ -42,7 +45,7 @@
     }
 
     @Override
-    protected Intent getIntentToEnableOsGlobalPermission(Context context) {
+    protected @Nullable Intent getIntentToEnableOsGlobalPermission(Context context) {
         if (enabledGlobally()) return null;
         return LocationUtils.getInstance().getSystemLocationSettingsIntent();
     }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NfcCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NfcCategory.java
index f8f910ef..1d91296 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NfcCategory.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NfcCategory.java
@@ -7,10 +7,13 @@
 import android.content.Context;
 import android.content.Intent;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.permissions.nfc.NfcSystemLevelSetting;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 /** A class for dealing with the NFC category. */
+@NullMarked
 public class NfcCategory extends SiteSettingsCategory {
     public NfcCategory(BrowserContextHandle browserContextHandle) {
         // As NFC is not a per-app permission, passing an empty string means the NFC permission is
@@ -34,7 +37,7 @@
     }
 
     @Override
-    protected Intent getIntentToEnableOsGlobalPermission(Context context) {
+    protected @Nullable Intent getIntentToEnableOsGlobalPermission(Context context) {
         return NfcSystemLevelSetting.getNfcSystemLevelSettingIntent();
     }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NotificationCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NotificationCategory.java
index c479e79..144be65 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NotificationCategory.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/NotificationCategory.java
@@ -4,12 +4,14 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 /**
  * Enables custom implementation for the notification site settings category, similar to
  * {@link LocationCategory}.
  */
+@NullMarked
 public class NotificationCategory extends SiteSettingsCategory {
     NotificationCategory(BrowserContextHandle browserContextHandle) {
         // Android does not treat notifications as a 'permission', i.e. notification status cannot
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
index 4100ab65..8a769fe 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
@@ -4,8 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.content_settings.SessionModel;
@@ -14,9 +14,10 @@
 import java.io.Serializable;
 
 /** Permission information for a given origin. */
+@NullMarked
 public class PermissionInfo implements Serializable {
     private final boolean mIsEmbargoed;
-    private final String mEmbedder;
+    private final @Nullable String mEmbedder;
     private final String mOrigin;
     private final @ContentSettingsType.EnumType int mContentSettingsType;
     private final @SessionModel.EnumType int mSessionModel;
@@ -24,7 +25,7 @@
     public PermissionInfo(
             @ContentSettingsType.EnumType int type,
             String origin,
-            String embedder,
+            @Nullable String embedder,
             boolean isEmbargoed,
             @SessionModel.EnumType int sessionModel) {
         assert WebsitePermissionsFetcher.getPermissionsType(type)
@@ -45,7 +46,7 @@
         return mOrigin;
     }
 
-    public String getEmbedder() {
+    public @Nullable String getEmbedder() {
         return mEmbedder;
     }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieInfo.java
index f21ac8a..3d00643 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieInfo.java
@@ -6,10 +6,13 @@
 
 import com.google.common.collect.ImmutableList;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.io.Serializable;
 import java.util.List;
 
 /** Related Website Sets information for a given website. */
+@NullMarked
 public class RwsCookieInfo implements Serializable {
     private final String mOwnerHost;
     private final List<Website> mMembers;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieSettings.java
index 6d2e64d..53d53053 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsCookieSettings.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assertNonNull;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
 
 import android.os.Bundle;
@@ -12,6 +13,9 @@
 
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
 import org.chromium.components.browser_ui.settings.EmbeddableSettingsPage;
 import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
@@ -23,6 +27,7 @@
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 /** Related Website Sets preference page. It's a TriStateCookieSettingsPreference subpage. */
+@NullMarked
 public class RwsCookieSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage, Preference.OnPreferenceChangeListener {
     public static final String ALLOW_RWS_COOKIE_PREFERENCE = "allow_rws";
@@ -43,15 +48,17 @@
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
     @Override
-    public void onCreatePreferences(Bundle bundle, String s) {
+    @Initializer
+    public void onCreatePreferences(@Nullable Bundle bundle, @Nullable String s) {
         SettingsUtils.addPreferencesFromResource(this, R.xml.rws_cookie_settings);
 
         mPageTitle.set(getContext().getString(R.string.cookies_title));
-        mSubtitle = (TextMessagePreference) findPreference(SUBTITLE);
-        mBulletOne = (TextMessagePreference) findPreference(BULLET_ONE);
-        mBulletTwo = (TextMessagePreference) findPreference(BULLET_TWO);
-        mBulletThree = (TextMessagePreference) findPreference(BULLET_THREE);
-        mAllowRwsPreference = (ChromeSwitchPreference) findPreference(ALLOW_RWS_COOKIE_PREFERENCE);
+        mSubtitle = (TextMessagePreference) assertNonNull(findPreference(SUBTITLE));
+        mBulletOne = (TextMessagePreference) assertNonNull(findPreference(BULLET_ONE));
+        mBulletTwo = (TextMessagePreference) assertNonNull(findPreference(BULLET_TWO));
+        mBulletThree = (TextMessagePreference) assertNonNull(findPreference(BULLET_THREE));
+        mAllowRwsPreference =
+                (ChromeSwitchPreference) assertNonNull(findPreference(ALLOW_RWS_COOKIE_PREFERENCE));
 
         @CookieControlsMode
         int pageState = getArguments().getInt(RwsCookieSettings.EXTRA_COOKIE_PAGE_STATE);
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsRowPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsRowPreference.java
index 14d7e916..996bf2b 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsRowPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RwsRowPreference.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -11,6 +13,8 @@
 
 import androidx.preference.PreferenceViewHolder;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Preference for websites which belongs to the RWS (Related website sets).
  *
@@ -19,6 +23,7 @@
  * <p>Note: We leverage the existing implementation of the {@link WebsiteRowPreference} limiting its
  * functionality for now (remove delete button) + make it not selectable.
  */
+@NullMarked
 public class RwsRowPreference extends WebsiteRowPreference {
 
     RwsRowPreference(
@@ -34,7 +39,8 @@
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        ImageView mButton = (ImageView) holder.findViewById(R.id.image_view_widget);
-        mButton.setVisibility(View.INVISIBLE);
+        ImageView button = (ImageView) holder.findViewById(R.id.image_view_widget);
+        assumeNonNull(button);
+        button.setVisibility(View.INVISIBLE);
     }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SharedDictionaryInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SharedDictionaryInfo.java
index 464a7ad1..ae4821ff 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SharedDictionaryInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SharedDictionaryInfo.java
@@ -4,12 +4,14 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.StorageInfoClearedCallback;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 import java.io.Serializable;
 
 /** Shared dictionary information for a given frame origin and a top level site. */
+@NullMarked
 public class SharedDictionaryInfo implements Serializable {
     private final String mOrigin;
     private final String mTopLevelSite;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
index 1a07b89d..40a5d79 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.settings.SearchUtils.handleSearchNavigation;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
@@ -32,7 +33,6 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
@@ -47,6 +47,8 @@
 import org.chromium.base.metrics.RecordUserAction;
 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.build.annotations.UsedByReflection;
 import org.chromium.components.browser_ui.modaldialog.AppModalPresenter;
 import org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference;
@@ -105,6 +107,7 @@
  * launched to allow the user to see or modify the settings for that particular website.
  */
 @UsedByReflection("site_settings_preferences.xml")
+@NullMarked
 public class SingleCategorySettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage,
                 OnPreferenceChangeListener,
@@ -133,6 +136,7 @@
     public static final String EXTRA_TITLE = "title";
     public static final String POLICY = "policy";
 
+    @SuppressWarnings("NullAway.Init")
     private SettingsNavigation mSettingsNavigation;
 
     @Override
@@ -149,11 +153,11 @@
     // The list that contains preferences.
     private RecyclerView mListView;
     // The item for searching the list of items.
-    private MenuItem mSearchItem;
+    private @Nullable MenuItem mSearchItem;
     // The Site Settings Category we are showing.
     private SiteSettingsCategory mCategory;
     // If not blank, represents a substring to use to search for site names.
-    private String mSearch;
+    private @Nullable String mSearch;
     // Whether to group by allowed/blocked list.
     private boolean mGroupByAllowBlock;
     // Whether the Blocked list should be shown expanded.
@@ -176,7 +180,7 @@
     // The "desktop_site_window" preference to allow hiding/showing it.
     private ChromeBaseCheckBoxPreference mDesktopSiteWindowPref;
 
-    @Nullable private Set<String> mSelectedDomains;
+    private @Nullable Set<String> mSelectedDomains;
 
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
@@ -380,6 +384,7 @@
         } else {
             resourceId = R.string.website_settings_blocked_group_heading;
         }
+        assumeNonNull(blockedGroup);
         blockedGroup.setTitle(getHeaderTitle(resourceId, numBlocked));
         blockedGroup.setExpanded(mBlockListExpanded);
     }
@@ -395,6 +400,7 @@
 
         // Set the title and arrow icons for the header.
         int resourceId = R.string.website_settings_managed_group_heading;
+        assumeNonNull(managedGroup);
         managedGroup.setTitle(getHeaderTitle(resourceId, numManaged));
         managedGroup.setExpanded(mManagedListExpanded);
     }
@@ -426,14 +432,17 @@
 
     @Override
     public View onCreateView(
-            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+            LayoutInflater inflater,
+            @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
         // Read which category we should be showing.
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
         if (getArguments() != null) {
-            mCategory =
+            SiteSettingsCategory category =
                     SiteSettingsCategory.createFromPreferenceKey(
                             browserContextHandle, getArguments().getString(EXTRA_CATEGORY, ""));
+            mCategory = assumeNonNull(category);
         }
 
         if (mCategory.getType() == SiteSettingsCategory.Type.ALL_SITES
@@ -471,13 +480,13 @@
     }
 
     @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
         // Handled in onActivityCreated. Moving the addPreferencesFromResource call up to here
         // causes animation jank (crbug.com/985734).
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
         SettingsUtils.addPreferencesFromResource(this, R.xml.website_preferences);
 
         String title = getArguments().getString(EXTRA_TITLE);
@@ -549,6 +558,7 @@
             }
             return true;
         }
+        assumeNonNull(mSearchItem);
         if (handleSearchNavigation(item, mSearchItem, mSearch, getActivity())) {
             boolean queryHasChanged = mSearch != null && !mSearch.isEmpty();
             mSearch = null;
@@ -574,7 +584,7 @@
                 return false;
             }
 
-            if (websitePreference.getParent().getKey().equals(MANAGED_GROUP)) {
+            if (assumeNonNull(websitePreference.getParent()).getKey().equals(MANAGED_GROUP)) {
                 websitePreference.setFragment(SingleWebsiteSettings.class.getName());
                 websitePreference.putSiteAddressIntoExtras(
                         SingleWebsiteSettings.EXTRA_SITE_ADDRESS);
@@ -963,8 +973,11 @@
         } else {
             // Group sites into Allowed/Blocked lists.
             PreferenceGroup allowedGroup = getPreferenceScreen().findPreference(ALLOWED_GROUP);
+            assumeNonNull(allowedGroup);
             PreferenceGroup blockedGroup = getPreferenceScreen().findPreference(BLOCKED_GROUP);
+            assumeNonNull(blockedGroup);
             PreferenceGroup managedGroup = getPreferenceScreen().findPreference(MANAGED_GROUP);
+            assumeNonNull(managedGroup);
 
             Set<String> delegatedOrigins =
                     mCategory.getType() == SiteSettingsCategory.Type.NOTIFICATIONS
@@ -1093,11 +1106,14 @@
             case GlobalToggleLayout.TRI_STATE_TOGGLE:
                 TriStateSiteSettingsPreference triStateToggle =
                         getPreferenceScreen().findPreference(TRI_STATE_TOGGLE_KEY);
+                assumeNonNull(triStateToggle);
                 return (triStateToggle.getCheckedSetting() == ContentSettingValues.BLOCK);
             case GlobalToggleLayout.TRI_STATE_COOKIE_TOGGLE:
                 TriStateCookieSettingsPreference triStateCookieToggle =
                         getPreferenceScreen().findPreference(TRI_STATE_COOKIE_TOGGLE);
-                return triStateCookieToggle.getState() != CookieControlsMode.OFF;
+                assumeNonNull(triStateCookieToggle);
+                Integer state = assumeNonNull(triStateCookieToggle.getState());
+                return state != CookieControlsMode.OFF;
             case GlobalToggleLayout.BINARY_TOGGLE:
                 ChromeSwitchPreference binaryToggle =
                         getPreferenceScreen().findPreference(BINARY_TOGGLE_KEY);
@@ -1115,19 +1131,26 @@
 
         // Find all preferences on the current preference screen. Some preferences are
         // not needed for the current category and will be removed in the steps below.
-        ChromeSwitchPreference binaryToggle = screen.findPreference(BINARY_TOGGLE_KEY);
-        TriStateSiteSettingsPreference triStateToggle = screen.findPreference(TRI_STATE_TOGGLE_KEY);
+        ChromeSwitchPreference binaryToggle =
+                assumeNonNull(screen.findPreference(BINARY_TOGGLE_KEY));
+        TriStateSiteSettingsPreference triStateToggle =
+                assumeNonNull(screen.findPreference(TRI_STATE_TOGGLE_KEY));
         TriStateCookieSettingsPreference triStateCookieToggle =
-                screen.findPreference(TRI_STATE_COOKIE_TOGGLE);
-        Preference notificationsVibrate = screen.findPreference(NOTIFICATIONS_VIBRATE_TOGGLE_KEY);
-        mNotificationsQuietUiPref = screen.findPreference(NOTIFICATIONS_QUIET_UI_TOGGLE_KEY);
-        mNotificationsTriStatePref = screen.findPreference(NOTIFICATIONS_TRI_STATE_PREF_KEY);
-        mLocationTriStatePref = screen.findPreference(LOCATION_TRI_STATE_PREF_KEY);
-        mDesktopSiteWindowPref = screen.findPreference(DESKTOP_SITE_WINDOW_TOGGLE_KEY);
-        Preference explainProtectedMediaKey = screen.findPreference(EXPLAIN_PROTECTED_MEDIA_KEY);
-        PreferenceGroup allowedGroup = screen.findPreference(ALLOWED_GROUP);
-        PreferenceGroup blockedGroup = screen.findPreference(BLOCKED_GROUP);
-        PreferenceGroup managedGroup = screen.findPreference(MANAGED_GROUP);
+                assumeNonNull(screen.findPreference(TRI_STATE_COOKIE_TOGGLE));
+        Preference notificationsVibrate =
+                assumeNonNull(screen.findPreference(NOTIFICATIONS_VIBRATE_TOGGLE_KEY));
+        mNotificationsQuietUiPref =
+                assumeNonNull(screen.findPreference(NOTIFICATIONS_QUIET_UI_TOGGLE_KEY));
+        mNotificationsTriStatePref =
+                assumeNonNull(screen.findPreference(NOTIFICATIONS_TRI_STATE_PREF_KEY));
+        mLocationTriStatePref = assumeNonNull(screen.findPreference(LOCATION_TRI_STATE_PREF_KEY));
+        mDesktopSiteWindowPref =
+                assumeNonNull(screen.findPreference(DESKTOP_SITE_WINDOW_TOGGLE_KEY));
+        Preference explainProtectedMediaKey =
+                assumeNonNull(screen.findPreference(EXPLAIN_PROTECTED_MEDIA_KEY));
+        PreferenceGroup allowedGroup = assumeNonNull(screen.findPreference(ALLOWED_GROUP));
+        PreferenceGroup blockedGroup = assumeNonNull(screen.findPreference(BLOCKED_GROUP));
+        PreferenceGroup managedGroup = assumeNonNull(screen.findPreference(MANAGED_GROUP));
         boolean permissionBlockedByOs = mCategory.showPermissionBlockedMessage(getContext());
 
         if (mGlobalToggleLayout != GlobalToggleLayout.BINARY_TOGGLE) {
@@ -1151,7 +1174,7 @@
                 break;
         }
 
-        Preference infoText = screen.findPreference(INFO_TEXT_KEY);
+        Preference infoText = assumeNonNull(screen.findPreference(INFO_TEXT_KEY));
         if (mCategory.getType() == SiteSettingsCategory.Type.SITE_DATA) {
             infoText.setSummary(R.string.website_settings_site_data_page_description);
         } else if (mCategory.getType() == SiteSettingsCategory.Type.THIRD_PARTY_COOKIES) {
@@ -1168,16 +1191,22 @@
         // Hide the anti-abuse text preferences, as needed.
         if (mCategory.getType() != SiteSettingsCategory.Type.ANTI_ABUSE) {
             Preference antiAbuseWhenOnHeader = screen.findPreference(ANTI_ABUSE_WHEN_ON_HEADER);
+            assumeNonNull(antiAbuseWhenOnHeader);
             Preference antiAbuseWhenOnSectionOne =
                     screen.findPreference(ANTI_ABUSE_WHEN_ON_SECTION_ONE);
+            assumeNonNull(antiAbuseWhenOnSectionOne);
             Preference antiAbuseWhenOnSectionTwo =
                     screen.findPreference(ANTI_ABUSE_WHEN_ON_SECTION_TWO);
+            assumeNonNull(antiAbuseWhenOnSectionTwo);
             Preference antiAbuseWhenOnSectionThree =
                     screen.findPreference(ANTI_ABUSE_WHEN_ON_SECTION_THREE);
+            assumeNonNull(antiAbuseWhenOnSectionThree);
             Preference antiAbuseThingsToConsiderHeader =
                     screen.findPreference(ANTI_ABUSE_THINGS_TO_CONSIDER_HEADER);
+            assumeNonNull(antiAbuseThingsToConsiderHeader);
             Preference antiAbuseThingsToConsiderSectionOne =
                     screen.findPreference(ANTI_ABUSE_THINGS_TO_CONSIDER_SECTION_ONE);
+            assumeNonNull(antiAbuseThingsToConsiderSectionOne);
 
             screen.removePreference(antiAbuseWhenOnHeader);
             screen.removePreference(antiAbuseWhenOnSectionOne);
@@ -1540,7 +1569,7 @@
                         ContentSettingsResources.getSiteSummary(
                                 ContentSettingValues.BLOCK, contentSettingsType)));
 
-        if (value == ContentSettingValues.ALLOW) {
+        if (assumeNonNull(value) == ContentSettingValues.ALLOW) {
             allowButton.setChecked(true);
         } else {
             blockButton.setChecked(true);
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
index 087fd45..05d4623 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 
 import android.app.Activity;
@@ -19,7 +20,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.ColorRes;
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
@@ -32,6 +32,9 @@
 import org.chromium.base.metrics.RecordHistogram;
 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.build.annotations.RequiresNonNull;
 import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
 import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
@@ -53,6 +56,7 @@
 import java.util.Map;
 
 /** Shows the permissions and other settings for a particular website. */
+@NullMarked
 public class SingleWebsiteSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage,
                 Preference.OnPreferenceChangeListener,
@@ -212,10 +216,10 @@
     @ColorRes private int mHighlightColor;
 
     // The callback to be run after this site is reset.
-    private Observer mWebsiteSettingsObserver;
+    private @Nullable Observer mWebsiteSettingsObserver;
 
     // The website this page is displaying details about.
-    private Website mSite;
+    private @Nullable Website mSite;
 
     // Whether these settings were opened from GroupedWebsitesSettings.
     private boolean mFromGrouped;
@@ -229,9 +233,9 @@
     private @ContentSettingValues @Nullable Integer mPreviousNotificationPermission;
 
     // Map from preference key to ContentSettingsType.
-    private Map<String, Integer> mPreferenceMap;
+    private @Nullable Map<String, Integer> mPreferenceMap;
 
-    private Dialog mConfirmationDialog;
+    private @Nullable Dialog mConfirmationDialog;
 
     // Maximum value used for the order of the permissions
     private int mMaxPermissionOrder;
@@ -289,7 +293,7 @@
     }
 
     @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
         mPageTitle.set(getContext().getString(R.string.prefs_site_settings));
 
         // Remove this Preference if it gets restored without a valid SiteSettingsDelegate. This
@@ -333,7 +337,7 @@
     }
 
     @Override
-    public void onViewStateRestored(Bundle savedInstanceState) {
+    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
         super.onViewStateRestored(savedInstanceState);
 
         if (savedInstanceState == null) return;
@@ -366,7 +370,7 @@
     public void onDisplayPreferenceDialog(Preference preference) {
         if (preference instanceof ClearWebsiteStorage) {
             // If the activity is getting destroyed or saved, it is not allowed to modify fragments.
-            if (getFragmentManager().isStateSaved()) {
+            if (assumeNonNull(getFragmentManager()).isStateSaved()) {
                 return;
             }
             Callback<Boolean> onDialogClosed =
@@ -378,7 +382,9 @@
                                     DeleteBrowsingDataAction.MAX_VALUE);
 
                             SiteDataCleaner.clearData(
-                                    getSiteSettingsDelegate(), mSite, mDataClearedCallback);
+                                    getSiteSettingsDelegate(),
+                                    assumeNonNull(mSite),
+                                    mDataClearedCallback);
                         }
                     };
             ClearWebsiteStorageDialog dialogFragment =
@@ -425,8 +431,8 @@
     public static Website mergePermissionAndStorageInfoForTopLevelOrigin(
             WebsiteAddress address, Collection<Website> websites) {
         String origin = address.getOrigin();
-        String host = Uri.parse(origin).getHost();
-        String domainAndRegistry = address.getDomainAndRegistry();
+        String host = assumeNonNull(Uri.parse(origin).getHost());
+        String domainAndRegistry = assumeNonNull(address.getDomainAndRegistry());
         Website merged = new Website(address, null);
         // This loop looks expensive, but the amount of data is likely to be relatively small
         // because most sites have very few permissions.
@@ -451,7 +457,8 @@
                                     && org.chromium.components.browser_ui.site_settings
                                             .WebsitePreferenceBridgeJni.get()
                                             .urlMatchesContentSettingsPattern(
-                                                    origin, exception.getSecondaryPattern());
+                                                    origin,
+                                                    assumeNonNull(exception.getSecondaryPattern()));
                     if (matchesOrigin) {
                         merged.addEmbeddedPermission(exception);
                     }
@@ -517,7 +524,7 @@
                         || SITE_WILDCARD.equals(info.getEmbedderSafe()));
     }
 
-    private Drawable getContentSettingsIcon(
+    private @Nullable Drawable getContentSettingsIcon(
             @ContentSettingsType.EnumType int contentSettingsType,
             @ContentSettingValues @Nullable Integer value) {
         return ContentSettingsResources.getContentSettingsIcon(
@@ -528,13 +535,15 @@
      * Updates the permissions displayed in the UI by fetching them from mSite. Must only be called
      * once mSite is set.
      */
+    @RequiresNonNull({"mSite"})
     private void displaySitePermissions() {
         if (getPreferenceScreen() != null) {
             getPreferenceScreen().removeAll();
         }
         SettingsUtils.addPreferencesFromResource(this, R.xml.single_website_preferences);
 
-        findPreference(PREF_SITE_TITLE).setTitle(mSite.getTitle());
+        Preference siteTitlePref = assumeNonNull(findPreference(PREF_SITE_TITLE));
+        siteTitlePref.setTitle(mSite.getTitle());
         setupContentSettingsPreferences();
         setUpEmbeddedContentSettingPreferences();
         setUpChosenObjectPreferences();
@@ -564,8 +573,10 @@
         }
     }
 
+    @RequiresNonNull({"mSite"})
     private void setupContentSettingsPreferences() {
-        mMaxPermissionOrder = findPreference(PREF_PERMISSIONS_HEADER).getOrder();
+        Preference permissionsHeaderPref = assumeNonNull(findPreference(PREF_PERMISSIONS_HEADER));
+        mMaxPermissionOrder = permissionsHeaderPref.getOrder();
         for (@ContentSettingsType.EnumType int type : SiteSettingsUtil.SETTINGS_ORDER) {
             Preference preference = new ChromeSwitchPreference(getStyledContext());
             preference.setKey(getPreferenceKey(type));
@@ -591,8 +602,10 @@
         }
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpClearDataPreference() {
         ClearWebsiteStorage preference = findPreference(PREF_CLEAR_DATA);
+        assumeNonNull(preference);
         long usage = mSite.getTotalUsage();
         int cookies = mSite.getNumberOfCookies();
         // Only take cookies into account when the new UI is enabled.
@@ -613,8 +626,10 @@
         }
     }
 
+    @RequiresNonNull({"mSite"})
     private void setupResetSitePreference() {
         Preference preference = findPreference(PREF_RESET_SITE);
+        assumeNonNull(preference);
         preference.setTitle(
                 mHideNonPermissionPreferences
                         ? R.string.page_info_permissions_reset
@@ -626,7 +641,8 @@
         }
     }
 
-    private Intent getSettingsIntent(String packageName, @ContentSettingsType.EnumType int type) {
+    private Intent getSettingsIntent(
+            @Nullable String packageName, @ContentSettingsType.EnumType int type) {
         Intent intent = new Intent();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
                 && type == ContentSettingsType.NOTIFICATIONS) {
@@ -668,6 +684,7 @@
      * Notifications could be controlled by PWA, however for a Weblayer variant, Location could be
      * controlled by the DSE.
      */
+    @RequiresNonNull({"mSite"})
     private boolean setupAppDelegatePreference(
             Preference preference,
             @StringRes int contentDescriptionRes,
@@ -704,6 +721,7 @@
         return true;
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpNotificationsPreference(Preference preference, boolean isEmbargoed) {
         @ContentSettingsType.EnumType int notificationType = ContentSettingsType.NOTIFICATIONS;
         final @ContentSettingValues @Nullable Integer value =
@@ -760,7 +778,7 @@
     public void launchOsChannelSettingsFromPreference(Preference preference) {
         // There is no notification channel if the origin is merely embargoed. Create it
         // just-in-time if the user tries to change to setting.
-        if (mSite.isEmbargoed(ContentSettingsType.NOTIFICATIONS)) {
+        if (assumeNonNull(mSite).isEmbargoed(ContentSettingsType.NOTIFICATIONS)) {
             mSite.setContentSetting(
                     getSiteSettingsDelegate().getBrowserContextHandle(),
                     ContentSettingsType.NOTIFICATIONS,
@@ -778,6 +796,7 @@
         launchOsChannelSettings(preference.getContext(), channelId);
     }
 
+    @RequiresNonNull({"mSite"})
     private void launchOsChannelSettings(Context context, String channelId) {
         // Store current value of permission to allow comparison against new value at return.
         mPreviousNotificationPermission =
@@ -796,7 +815,7 @@
      * out of date. Here we refresh any we suspect may have changed.
      */
     @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         // The preference screen and mSite may be null if this activity was killed in the
         // background, and the tasks scheduled from onActivityCreated haven't completed yet. Those
@@ -806,16 +825,18 @@
         }
         if (requestCode == REQUEST_CODE_NOTIFICATION_CHANNEL_SETTINGS) {
             @ContentSettingValues
-            int newPermission =
+            Integer newPermission =
                     mSite.getContentSetting(
                             getSiteSettingsDelegate().getBrowserContextHandle(),
                             ContentSettingsType.NOTIFICATIONS);
+            assumeNonNull(newPermission);
             // User has navigated back from system channel settings on O+. Ensure notification
             // preference is up to date, since they might have toggled it from channel settings.
             Preference notificationsPreference =
-                    findPreference(getPreferenceKey(ContentSettingsType.NOTIFICATIONS));
+                    findPreference(
+                            assumeNonNull(getPreferenceKey(ContentSettingsType.NOTIFICATIONS)));
             if (notificationsPreference != null) {
-                onPreferenceChange(notificationsPreference, (Object) newPermission);
+                onPreferenceChange(notificationsPreference, newPermission);
             }
 
             // To ensure UMA receives notification revocations, we detect if the setting has changed
@@ -823,7 +844,7 @@
             // permission, but do not return immediately to Chrome (e.g. they close the permissions
             // activity, instead of hitting the back button), but prevents us from having to check
             // for changes each time Chrome becomes active.
-            if (mPreviousNotificationPermission == ContentSettingValues.ALLOW
+            if (assumeNonNull(mPreviousNotificationPermission) == ContentSettingValues.ALLOW
                     && newPermission != ContentSettingValues.ALLOW) {
                 org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni.get()
                         .reportNotificationRevokedForOrigin(
@@ -841,6 +862,7 @@
      * and show a toast if a managed permission is clicked. The preferences are added to the
      * preference screen using |maxPermissionOrder| to order the preferences in the list.
      */
+    @RequiresNonNull({"mSite"})
     private void setUpChosenObjectPreferences() {
         PreferenceScreen preferenceScreen = getPreferenceScreen();
 
@@ -882,7 +904,8 @@
         }
     }
 
-    String getEmbeddedPermissionSummary(String embeddedHost, @ContentSettingValues int setting) {
+    String getEmbeddedPermissionSummary(
+            @Nullable String embeddedHost, @ContentSettingValues int setting) {
         int id =
                 setting == ContentSettingValues.ALLOW
                         ? R.string.website_settings_site_allowed
@@ -890,40 +913,41 @@
         return getContext().getString(id, embeddedHost);
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpEmbeddedContentSettingPreferences() {
         PreferenceScreen preferenceScreen = getPreferenceScreen();
         BrowserContextHandle handle = getSiteSettingsDelegate().getBrowserContextHandle();
 
         for (List<ContentSettingException> entries : mSite.getEmbeddedPermissions().values()) {
             for (ContentSettingException info : entries) {
+                @ContentSettingValues int contentSetting = info.getContentSetting();
                 assert arrayContains(
                         SiteSettingsUtil.EMBEDDED_PERMISSIONS, info.getContentSettingType());
                 var preference = new ChromeSwitchPreference(getStyledContext());
                 mEmbeddedPermissionPreferences.add(preference);
                 preference.setIcon(
-                        getContentSettingsIcon(
-                                info.getContentSettingType(), info.getContentSetting()));
+                        getContentSettingsIcon(info.getContentSettingType(), contentSetting));
                 preference.setTitle(
                         ContentSettingsResources.getTitle(info.getContentSettingType()));
-                var pattern = WebsiteAddress.create(info.getPrimaryPattern());
+                var pattern = assumeNonNull(WebsiteAddress.create(info.getPrimaryPattern()));
                 preference.setSummary(
-                        getEmbeddedPermissionSummary(pattern.getHost(), info.getContentSetting()));
+                        getEmbeddedPermissionSummary(pattern.getHost(), contentSetting));
 
-                preference.setChecked(info.getContentSetting() == ContentSettingValues.ALLOW);
+                preference.setChecked(contentSetting == ContentSettingValues.ALLOW);
                 preference.setOnPreferenceChangeListener(
                         (pref, newValue) -> {
                             @ContentSettingValues
-                            int contentSetting =
+                            int newContentSetting =
                                     (boolean) newValue
                                             ? ContentSettingValues.ALLOW
                                             : ContentSettingValues.BLOCK;
-                            info.setContentSetting(handle, contentSetting);
+                            info.setContentSetting(handle, newContentSetting);
                             preference.setSummary(
                                     getEmbeddedPermissionSummary(
-                                            pattern.getHost(), contentSetting));
+                                            pattern.getHost(), newContentSetting));
                             preference.setIcon(
                                     getContentSettingsIcon(
-                                            info.getContentSettingType(), contentSetting));
+                                            info.getContentSettingType(), newContentSetting));
 
                             if (mWebsiteSettingsObserver != null) {
                                 mWebsiteSettingsObserver.onPermissionChanged();
@@ -946,6 +970,7 @@
         return getPreferenceManager().getContext();
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpOsWarningPreferences() {
         PreferenceScreen preferenceScreen = getPreferenceScreen();
         SiteSettingsCategory categoryWithWarning = getWarningCategory();
@@ -956,7 +981,9 @@
             removePreferenceSafely(PREF_OS_PERMISSIONS_WARNING_DIVIDER);
         } else {
             Preference osWarning = findPreference(PREF_OS_PERMISSIONS_WARNING);
+            assumeNonNull(osWarning);
             Preference osWarningExtra = findPreference(PREF_OS_PERMISSIONS_WARNING_EXTRA);
+            assumeNonNull(osWarningExtra);
             categoryWithWarning.configurePermissionIsOffPreferences(
                     osWarning,
                     osWarningExtra,
@@ -971,18 +998,21 @@
         }
     }
 
+    @RequiresNonNull({"mSite"})
     private void setupRelatedSitesPreferences() {
         PreferenceCategory relatedSitesHeader = findPreference(PREF_RELATED_SITES_HEADER);
+        assumeNonNull(relatedSitesHeader);
         TextMessagePreference relatedSitesText = new TextMessagePreference(getContext(), null);
+        var rwsInfo = mSite.getRwsCookieInfo();
         boolean shouldRelatedSitesPrefBeVisible =
                 getSiteSettingsDelegate().isPrivacySandboxFirstPartySetsUiFeatureEnabled()
                         && getSiteSettingsDelegate().isRelatedWebsiteSetsDataAccessEnabled()
-                        && mSite.getRwsCookieInfo() != null;
+                        && rwsInfo != null;
         relatedSitesHeader.setVisible(shouldRelatedSitesPrefBeVisible);
         relatedSitesText.setVisible(shouldRelatedSitesPrefBeVisible);
 
         if (shouldRelatedSitesPrefBeVisible) {
-            var rwsInfo = mSite.getRwsCookieInfo();
+            assumeNonNull(rwsInfo);
             relatedSitesText.setTitle(
                     getContext()
                             .getResources()
@@ -998,7 +1028,7 @@
                         public boolean isPreferenceControlledByPolicy(Preference preference) {
                             return getSiteSettingsDelegate()
                                     .isPartOfManagedRelatedWebsiteSet(
-                                            mSite.getAddress().getOrigin());
+                                            assumeNonNull(mSite).getAddress().getOrigin());
                         }
                     });
             relatedSitesHeader.addPreference(relatedSitesText);
@@ -1006,7 +1036,7 @@
             if (getSiteSettingsDelegate().shouldShowPrivacySandboxRwsUi()) {
                 relatedSitesHeader.removeAll();
                 relatedSitesHeader.addPreference(relatedSitesText);
-                for (Website site : mSite.getRwsCookieInfo().getMembers()) {
+                for (Website site : rwsInfo.getMembers()) {
                     WebsiteRowPreference preference =
                             new RwsRowPreference(
                                     relatedSitesHeader.getContext(),
@@ -1020,6 +1050,7 @@
     }
 
     private void setupFileEditingGrants(boolean setOrder) {
+        assumeNonNull(mSite);
         FileEditingInfo info = mSite.getFileEditingInfo();
         if (info == null || info.getGrants() == null || info.getGrants().isEmpty()) {
             removePreferenceSafely(PREF_FILE_EDITING_GRANTS);
@@ -1027,6 +1058,7 @@
         }
 
         PreferenceCategory header = findPreference(PREF_FILE_EDITING_GRANTS);
+        assumeNonNull(header);
         if (setOrder) {
             header.setOrder(++mMaxPermissionOrder);
         }
@@ -1050,6 +1082,7 @@
         }
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpAdsInformationalBanner() {
         // Add the informational banner which shows at the top of the UI if ad blocking is
         // activated on this site.
@@ -1058,7 +1091,8 @@
                         && WebsitePreferenceBridge.getAdBlockingActivated(
                                 getSiteSettingsDelegate().getBrowserContextHandle(),
                                 mSite.getAddress().getOrigin())
-                        && findPreference(getPreferenceKey(ContentSettingsType.ADS)) != null;
+                        && findPreference(assumeNonNull(getPreferenceKey(ContentSettingsType.ADS)))
+                                != null;
 
         if (!adBlockingActivated) {
             removePreferenceSafely(PREF_INTRUSIVE_ADS_INFO);
@@ -1066,7 +1100,8 @@
         }
     }
 
-    private SiteSettingsCategory getWarningCategory() {
+    @RequiresNonNull({"mSite"})
+    private @Nullable SiteSettingsCategory getWarningCategory() {
         // If more than one per-app permission is disabled in Android, we can pick any category to
         // show the warning, because they will all show the same warning and all take the user to
         // the user to the same location. It is preferrable, however, that we give Geolocation some
@@ -1099,6 +1134,7 @@
         return null;
     }
 
+    @RequiresNonNull({"mSite"})
     private boolean showWarningFor(@SiteSettingsCategory.Type int type) {
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
@@ -1192,10 +1228,10 @@
         getPreferenceScreen().addPreference(preference);
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpLocationPreference(Preference preference) {
         @ContentSettingValues
-        @Nullable
-        Integer permission =
+        @Nullable Integer permission =
                 mSite.getContentSetting(
                         getSiteSettingsDelegate().getBrowserContextHandle(),
                         ContentSettingsType.GEOLOCATION);
@@ -1214,6 +1250,7 @@
                 isOneTime(ContentSettingsType.GEOLOCATION));
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpSoundPreference(Preference preference) {
         if (!getArguments().getBoolean(EXTRA_SHOW_SOUND, true)) {
             return;
@@ -1222,8 +1259,7 @@
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
         @ContentSettingValues
-        @Nullable
-        Integer currentValue =
+        @Nullable Integer currentValue =
                 mSite.getContentSetting(browserContextHandle, ContentSettingsType.SOUND);
         // In order to always show the sound permission, set it up with the default value if it
         // doesn't have a current value.
@@ -1242,12 +1278,12 @@
                 isOneTime(ContentSettingsType.SOUND));
     }
 
+    @RequiresNonNull({"mSite"})
     private void setUpJavascriptPreference(Preference preference) {
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
         @ContentSettingValues
-        @Nullable
-        Integer currentValue =
+        @Nullable Integer currentValue =
                 mSite.getContentSetting(browserContextHandle, ContentSettingsType.JAVASCRIPT);
         // If Javascript is blocked by default, then always show a Javascript permission.
         // To do this, set it to the default value (blocked).
@@ -1271,6 +1307,7 @@
      *    is set as the default (e.g. |preference| is null).
      * 2. The BLOCK string is custom.
      */
+    @RequiresNonNull({"mSite"})
     private void setUpAdsPreference(Preference preference) {
         BrowserContextHandle browserContextHandle =
                 getSiteSettingsDelegate().getBrowserContextHandle();
@@ -1286,8 +1323,8 @@
                 WebsitePreferenceBridge.getAdBlockingActivated(
                         browserContextHandle, mSite.getAddress().getOrigin());
         @ContentSettingValues
-        @Nullable
-        Integer permission = mSite.getContentSetting(browserContextHandle, ContentSettingsType.ADS);
+        @Nullable Integer permission =
+                mSite.getContentSetting(browserContextHandle, ContentSettingsType.ADS);
 
         // If |permission| is null, there is no explicit (non-default) permission set for this site.
         // If the site is not considered a candidate for blocking, do the standard thing and remove
@@ -1340,10 +1377,11 @@
             GroupedWebsitesSettings groupFragment = GroupedWebsitesSettings.getPausedInstance();
             Activity activity = getActivity();
             if (activity != null) {
-                getSettingsNavigation().finishCurrentSettings(this);
+                var settingsNavigation = assumeNonNull(getSettingsNavigation());
+                settingsNavigation.finishCurrentSettings(this);
                 if (mFromGrouped && groupFragment != null) {
-                    getSettingsNavigation().executePendingNavigations(activity);
-                    getSettingsNavigation().finishCurrentSettings(groupFragment);
+                    settingsNavigation.executePendingNavigations(activity);
+                    settingsNavigation.finishCurrentSettings(groupFragment);
                 }
             }
         }
@@ -1366,7 +1404,7 @@
             permission = (Integer) newValue;
         }
 
-        mSite.setContentSetting(browserContextHandle, type, permission);
+        assumeNonNull(mSite).setContentSetting(browserContextHandle, type, permission);
         // In Clank, one time grants are only possible via prompt, not via page
         // info.
         preference.setSummary(
@@ -1382,6 +1420,7 @@
 
     @Override
     public boolean onPreferenceClick(Preference preference) {
+        assumeNonNull(mSite);
         if (mHideNonPermissionPreferences) {
             showResetPermissionsOnlyDialog();
         } else {
@@ -1416,7 +1455,7 @@
         // to begin with. The only exception to this is if there are policy managed permissions as
         // those cannot be reset and will always show.
         boolean finishActivityImmediately =
-                mSite.getTotalUsage() == 0 && !hasManagedChooserPermissions();
+                assumeNonNull(mSite).getTotalUsage() == 0 && !hasManagedChooserPermissions();
 
         SiteDataCleaner.resetPermissions(
                 getSiteSettingsDelegate().getBrowserContextHandle(), mSite);
@@ -1432,17 +1471,18 @@
             GroupedWebsitesSettings groupFragment = GroupedWebsitesSettings.getPausedInstance();
             Activity activity = getActivity();
             if (activity != null) {
-                getSettingsNavigation().finishCurrentSettings(this);
+                var settingsNavigation = assumeNonNull(getSettingsNavigation());
+                settingsNavigation.finishCurrentSettings(this);
                 if (mFromGrouped && groupFragment != null) {
-                    getSettingsNavigation().executePendingNavigations(activity);
-                    getSettingsNavigation().finishCurrentSettings(groupFragment);
+                    settingsNavigation.executePendingNavigations(activity);
+                    settingsNavigation.finishCurrentSettings(groupFragment);
                 }
             }
         }
     }
 
     public boolean isOneTime(@ContentSettingsType.EnumType int type) {
-        PermissionInfo permissionInfo = mSite.getPermissionInfo(type);
+        PermissionInfo permissionInfo = assumeNonNull(mSite).getPermissionInfo(type);
         return permissionInfo != null && permissionInfo.getSessionModel() == SessionModel.ONE_TIME;
     }
 
@@ -1471,6 +1511,7 @@
         }
     }
 
+    @RequiresNonNull({"mSite"})
     private void showResetPermissionsOnlyDialog() {
         // Handle the reset preference click by showing a confirmation.
         mConfirmationDialog =
@@ -1485,7 +1526,7 @@
                                 (dialog, which) -> {
                                     SiteDataCleaner.resetPermissions(
                                             getSiteSettingsDelegate().getBrowserContextHandle(),
-                                            mSite);
+                                            assumeNonNull(mSite));
                                     if (mWebsiteSettingsObserver != null) {
                                         mWebsiteSettingsObserver.onPermissionsReset();
                                     }
@@ -1495,6 +1536,7 @@
                         .show();
     }
 
+    @RequiresNonNull({"mSite"})
     private void showClearAndResetDialog() {
         // Handle a click on the Clear & Reset button.
         View dialogView =
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteDataCleaner.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteDataCleaner.java
index bdc42e77..58ce21f 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteDataCleaner.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteDataCleaner.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
@@ -14,6 +15,7 @@
  * Encapsulates clearing the data of {@link Website}s and {@link WebsiteGroup}s.
  * Requires native library to be initialized.
  */
+@NullMarked
 public class SiteDataCleaner {
     /**
      * Clears the data of the specified site.
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettings.java
index 960dcce1..9c17b34 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettings.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
 
 import android.os.Bundle;
@@ -14,6 +15,8 @@
 import org.chromium.base.metrics.RecordHistogram;
 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.components.browser_ui.settings.ChromeSwitchPreference;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
 import org.chromium.components.browser_ui.settings.EmbeddableSettingsPage;
@@ -30,6 +33,7 @@
  * permissions that have been granted to websites, as well as enable or disable permissions
  * browser-wide.
  */
+@NullMarked
 public class SiteSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage,
                 Preference.OnPreferenceClickListener,
@@ -49,7 +53,7 @@
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
     @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
         SettingsUtils.addPreferencesFromResource(this, R.xml.site_settings_preferences);
         mPageTitle.set(getContext().getString(R.string.prefs_site_settings));
 
@@ -67,14 +71,18 @@
         return false;
     }
 
-    private Preference findPreference(@Type int type) {
+    private @Nullable Preference findPreference(@Type int type) {
         return findPreference(SiteSettingsCategory.preferenceKey(type));
     }
 
     private void configurePreferences() {
         if (getSiteSettingsDelegate().shouldShowTrackingProtectionUi()) {
-            findPreference(Type.THIRD_PARTY_COOKIES).setVisible(false);
-            findPreference(Type.TRACKING_PROTECTION).setVisible(true);
+            Preference thirdPartyCookiesPref =
+                    assumeNonNull(findPreference(Type.THIRD_PARTY_COOKIES));
+            thirdPartyCookiesPref.setVisible(false);
+            Preference trackingProtectionPref =
+                    assumeNonNull(findPreference(Type.TRACKING_PROTECTION));
+            trackingProtectionPref.setVisible(true);
         }
 
         // Remove unsupported settings categories.
@@ -82,14 +90,18 @@
                 type < SiteSettingsCategory.Type.NUM_ENTRIES;
                 type++) {
             if (!getSiteSettingsDelegate().isCategoryVisible(type)) {
-                getPreferenceScreen().removePreference(findPreference(type));
+                Preference pref = assumeNonNull(findPreference(type));
+                getPreferenceScreen().removePreference(pref);
             }
         }
 
         // Remove the permission autorevocation preference if Safety Hub is not enabled.
         if (!getSiteSettingsDelegate().isSafetyHubEnabled()) {
-            getPreferenceScreen().removePreference(findPreference(PERMISSION_AUTOREVOCATION_PREF));
-            getPreferenceScreen().removePreference(findPreference(DIVIDER_PREF));
+            Preference autorevocationPref =
+                    assumeNonNull(findPreference(PERMISSION_AUTOREVOCATION_PREF));
+            getPreferenceScreen().removePreference(autorevocationPref);
+            Preference dividerPref = assumeNonNull(findPreference(DIVIDER_PREF));
+            getPreferenceScreen().removePreference(dividerPref);
         }
     }
 
@@ -144,10 +156,13 @@
                                     prefCategory)
                             .showPermissionBlockedMessage(getContext())) {
                 // Show 'disabled' message when permission is not granted in Android.
+                @ContentSettingValues
+                Integer defaultDisabledValue =
+                        assumeNonNull(
+                                ContentSettingsResources.getDefaultDisabledValue(contentType));
                 p.setSummary(
                         ContentSettingsResources.getCategorySummary(
-                                ContentSettingsResources.getDefaultDisabledValue(contentType),
-                                /* isOneTime= */ false));
+                                defaultDisabledValue, /* isOneTime= */ false));
             } else if (Type.SITE_DATA == prefCategory) {
                 p.setSummary(ContentSettingsResources.getSiteDataListSummary(checked));
             } else if (Type.THIRD_PARTY_COOKIES == prefCategory) {
@@ -182,10 +197,11 @@
                                 setting, /* isOneTime= */ false));
             } else {
                 @ContentSettingValues
-                int defaultForToggle =
+                Integer defaultForToggle =
                         checked
                                 ? ContentSettingsResources.getDefaultEnabledValue(contentType)
                                 : ContentSettingsResources.getDefaultDisabledValue(contentType);
+                assumeNonNull(defaultForToggle);
                 p.setSummary(
                         ContentSettingsResources.getCategorySummary(
                                 defaultForToggle, /* isOneTime= */ false));
@@ -248,7 +264,9 @@
                 .putString(SingleCategorySettings.EXTRA_CATEGORY, preference.getKey());
         preference
                 .getExtras()
-                .putString(SingleCategorySettings.EXTRA_TITLE, preference.getTitle().toString());
+                .putString(
+                        SingleCategorySettings.EXTRA_TITLE,
+                        assumeNonNull(preference.getTitle()).toString());
         return false;
     }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
index 9215e06..a572950 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
 
 import android.content.Context;
@@ -20,11 +21,12 @@
 import android.text.style.ForegroundColorSpan;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.preference.Preference;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.PackageManagerUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.permissions.PermissionUtil;
@@ -39,6 +41,7 @@
 import java.lang.annotation.RetentionPolicy;
 
 /** A base class for dealing with website settings categories. */
+@NullMarked
 public class SiteSettingsCategory {
     @IntDef({
         Type.ALL_SITES,
@@ -169,7 +172,7 @@
         return new SiteSettingsCategory(browserContextHandle, type, permission);
     }
 
-    public static SiteSettingsCategory createFromContentSettingsType(
+    public static @Nullable SiteSettingsCategory createFromContentSettingsType(
             BrowserContextHandle browserContextHandle,
             @ContentSettingsType.EnumType int contentSettingsType) {
         assert contentSettingsType != -1;
@@ -182,7 +185,7 @@
         return null;
     }
 
-    public static SiteSettingsCategory createFromPreferenceKey(
+    public static @Nullable SiteSettingsCategory createFromPreferenceKey(
             BrowserContextHandle browserContextHandle, String preferenceKey) {
         assert Type.ALL_SITES == 0;
         for (@Type int i = Type.ALL_SITES; i < Type.NUM_ENTRIES; i++) {
@@ -470,6 +473,7 @@
             osWarningExtra.setTitle(unsupportedMessage);
             osWarningExtra.setIcon(getDisabledInAndroidIcon(context));
         } else if (globalIntent != null) {
+            assumeNonNull(globalMessage);
             SpannableString messageWithLink =
                     SpanApplier.applySpans(
                             globalMessage, new SpanInfo("<link>", "</link>", linkSpan));
@@ -512,8 +516,7 @@
     }
 
     /** Returns the message to display when permission is not supported. */
-    @Nullable
-    protected String getMessageIfNotSupported(Context context) {
+    protected @Nullable String getMessageIfNotSupported(Context context) {
         return null;
     }
 
@@ -554,7 +557,7 @@
      * already enabled. Android M and above provides two ways of doing this for some permissions,
      * most notably Location, one that is per-app and another that is global.
      */
-    private Intent getIntentToEnableOsPerAppPermission(Context context) {
+    private @Nullable Intent getIntentToEnableOsPerAppPermission(Context context) {
         if (enabledForChrome(context)) return null;
         return getAppInfoIntent(context);
     }
@@ -564,7 +567,7 @@
      * permission. Android M and above provides two ways of doing this for some permissions, most
      * notably Location, one that is per-app and another that is global.
      */
-    protected Intent getIntentToEnableOsGlobalPermission(Context context) {
+    protected @Nullable Intent getIntentToEnableOsGlobalPermission(Context context) {
         return null;
     }
 
@@ -595,7 +598,7 @@
     }
 
     /** Returns the message to display when per-app permission is blocked. */
-    protected String getMessageForEnablingOsGlobalPermission(Context context) {
+    protected @Nullable String getMessageForEnablingOsGlobalPermission(Context context) {
         return null;
     }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsDelegate.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsDelegate.java
index e6b5fe0..36648b9 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsDelegate.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsDelegate.java
@@ -7,9 +7,9 @@
 import android.app.Activity;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
 import org.chromium.components.browsing_data.content.BrowsingDataModel;
 import org.chromium.components.content_settings.ContentSettingsType;
@@ -24,6 +24,7 @@
  * An interface implemented by the embedder that allows the Site Settings UI to access
  * embedder-specific logic.
  */
+@NullMarked
 public interface SiteSettingsDelegate {
     /**
      * @return The BrowserContextHandle that should be used to read and update settings.
@@ -94,15 +95,15 @@
      * @return The user visible name of the app that will handle permission delegation for the
      *     origin and content setting type.
      */
-    @Nullable
-    String getDelegateAppNameForOrigin(Origin origin, @ContentSettingsType.EnumType int type);
+    @Nullable String getDelegateAppNameForOrigin(
+            Origin origin, @ContentSettingsType.EnumType int type);
 
     /**
      * @return The package name of the app that should handle permission delegation for the origin
      *     and content setting type.
      */
-    @Nullable
-    String getDelegatePackageNameForOrigin(Origin origin, @ContentSettingsType.EnumType int type);
+    @Nullable String getDelegatePackageNameForOrigin(
+            Origin origin, @ContentSettingsType.EnumType int type);
 
     /**
      * @return true if Help and Feedback links and menu items should be shown to the user.
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsUtil.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsUtil.java
index 901f3d4..5d0b3d9 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsUtil.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsUtil.java
@@ -4,12 +4,14 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+
 import android.content.Context;
 import android.text.format.Formatter;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.accessibility.PageZoomUtils;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.content_public.browser.BrowserContextHandle;
@@ -18,6 +20,7 @@
 import org.chromium.content_public.browser.HostZoomMap;
 
 /** Util class for site settings UI. */
+@NullMarked
 public class SiteSettingsUtil {
     // Defining the order for content settings based on http://crbug.com/610358
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
@@ -66,7 +69,7 @@
      *     when called with empty list or only with entries not represented in this UI.
      */
     public static @ContentSettingsType.EnumType int getHighestPriorityPermission(
-            @ContentSettingsType.EnumType @NonNull int[] types) {
+            @ContentSettingsType.EnumType int[] types) {
         for (@ContentSettingsType.EnumType int setting : SETTINGS_ORDER) {
             for (@ContentSettingsType.EnumType int type : types) {
                 if (setting == type) {
@@ -137,6 +140,8 @@
                 PageZoomUtils.getDefaultZoomLevelAsZoomFactor(browserContextHandle);
         // Propagate the change through HostZoomMap.
         HostZoomMap.setZoomLevelForHost(
-                browserContextHandle, site.getAddress().getHost(), defaultZoomFactor);
+                browserContextHandle,
+                assertNonNull(site.getAddress().getHost()),
+                defaultZoomFactor);
     }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessSubpageSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessSubpageSettings.java
index bc86a81c..f282c7ff 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessSubpageSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessSubpageSettings.java
@@ -4,12 +4,17 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.os.Bundle;
 
 import androidx.preference.PreferenceScreen;
 
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
 import org.chromium.components.browser_ui.settings.EmbeddableSettingsPage;
 import org.chromium.components.browser_ui.settings.SettingsUtils;
@@ -22,6 +27,7 @@
  * Shows a list of Storage Access permissions grouped by their origin and of the same type, that is,
  * if they are allowed or blocked. This fragment is opened on top of {@link SingleCategorySettings}.
  */
+@NullMarked
 public class StorageAccessSubpageSettings extends BaseSiteSettingsFragment
         implements EmbeddableSettingsPage,
                 CustomDividerFragment,
@@ -33,7 +39,7 @@
 
     private Website mSite;
     private Boolean mIsAllowed;
-    private TextMessagePreference mSubtitle;
+    private @Nullable TextMessagePreference mSubtitle;
     private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
 
     @Override
@@ -41,8 +47,9 @@
         return false;
     }
 
+    @Initializer
     @Override
-    public void onCreatePreferences(Bundle bundle, String s) {
+    public void onCreatePreferences(@Nullable Bundle bundle, @Nullable String s) {
         resetList();
 
         Object extraSite = getArguments().getSerializable(EXTRA_STORAGE_ACCESS_STATE);
@@ -52,6 +59,7 @@
 
         mIsAllowed = getArguments().getBoolean(StorageAccessSubpageSettings.EXTRA_ALLOWED);
         mSubtitle = (TextMessagePreference) findPreference(SUBTITLE_KEY);
+        assumeNonNull(mSubtitle);
 
         mSubtitle.setTitle(
                 getContext()
@@ -82,8 +90,9 @@
 
         List<ContentSettingException> exceptions =
                 mSite.getEmbeddedContentSettings(ContentSettingsType.STORAGE_ACCESS);
-        for (ContentSettingException exception : exceptions) {
+        for (ContentSettingException exception : assumeNonNull(exceptions)) {
             WebsiteAddress permissionOrigin = WebsiteAddress.create(exception.getPrimaryPattern());
+            assumeNonNull(permissionOrigin);
             WebsiteAddress permissionEmbedder =
                     WebsiteAddress.create(exception.getSecondaryPattern());
             Website site = new Website(permissionOrigin, permissionEmbedder);
@@ -101,16 +110,19 @@
 
         List<ContentSettingException> exceptions =
                 mSite.getEmbeddedContentSettings(ContentSettingsType.STORAGE_ACCESS);
+        assumeNonNull(exceptions);
         ContentSettingException exception =
-                preference
-                        .site()
-                        .getEmbeddedContentSettings(ContentSettingsType.STORAGE_ACCESS)
+                assumeNonNull(
+                                preference
+                                        .site()
+                                        .getEmbeddedContentSettings(
+                                                ContentSettingsType.STORAGE_ACCESS))
                         .get(0);
         exceptions.remove(exception);
 
         if (exceptions.isEmpty()) {
             // Return to parent fragment if there are no embedded exceptions.
-            getSettingsNavigation().finishCurrentSettings(this);
+            assumeNonNull(getSettingsNavigation()).finishCurrentSettings(this);
             return;
         }
     }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessWebsitePreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessWebsitePreference.java
index d0e5ff3..d33710c 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessWebsitePreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageAccessWebsitePreference.java
@@ -4,9 +4,13 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.view.View.OnClickListener;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
 
@@ -17,6 +21,7 @@
  * and URL, and an icon on the RHS to reset the permission. See {@link WebsitePreference} for more
  * details on how this preference can be used.
  */
+@NullMarked
 class StorageAccessWebsitePreference extends WebsitePreference {
 
     private final OnStorageAccessWebsiteReset mOnStorageAccessWebsiteResetListener;
@@ -49,11 +54,11 @@
     }
 
     @Override
-    protected String buildSummary() {
+    protected @Nullable String buildSummary() {
 
         List<ContentSettingException> exceptions =
                 mSite.getEmbeddedContentSettings(ContentSettingsType.STORAGE_ACCESS);
-        assert exceptions.size() == 1;
+        assert assumeNonNull(exceptions).size() == 1;
 
         ContentSettingException exception = exceptions.get(0);
         if (exception.isEmbargoed()) {
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageInfo.java
index 4ca7383..bff03f0 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/StorageInfo.java
@@ -6,12 +6,14 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.StorageInfoClearedCallback;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 import java.io.Serializable;
 
 /** Storage information for a given host URL. */
+@NullMarked
 public class StorageInfo implements Serializable {
     private final String mHost;
     private final int mType;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateCookieSettingsPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateCookieSettingsPreference.java
index 6a92d66..f23caf0 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateCookieSettingsPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateCookieSettingsPreference.java
@@ -4,26 +4,34 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.RadioGroup;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.NullUnmarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionAndAuxButton;
 import org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables;
 import org.chromium.components.content_settings.CookieControlsMode;
 
 /** A 3-state radio group Preference used for the Third-Party Cookies subpage of SiteSettings. */
+@NullMarked
 public class TriStateCookieSettingsPreference extends Preference
         implements RadioGroup.OnCheckedChangeListener,
                 RadioButtonWithDescriptionAndAuxButton.OnAuxButtonClickedListener {
+    @SuppressWarnings("NullAway.Init")
     private OnCookiesDetailsRequested mListener;
 
     /** Used to notify cookie details subpages requests. */
@@ -52,13 +60,13 @@
     }
 
     // Keeps the params that are applied to the UI if the params are set before the UI is ready.
-    private Params mInitializationParams;
+    private @Nullable Params mInitializationParams;
 
     // UI Elements.
     private RadioButtonWithDescription mAllowButton;
     private RadioButtonWithDescription mBlockThirdPartyIncognitoButton;
     private RadioButtonWithDescription mBlockThirdPartyButton;
-    private RadioGroup mRadioGroup;
+    private @Nullable RadioGroup mRadioGroup;
     private TextViewWithCompoundDrawables mManagedView;
 
     // Sometimes UI is initialized before the initializationParams are set. We keep this viewHolder
@@ -88,7 +96,7 @@
     }
 
     /** @return The state that is currently selected. */
-    public @CookieControlsMode Integer getState() {
+    public @CookieControlsMode @Nullable Integer getState() {
         if (mRadioGroup == null && mInitializationParams == null) {
             return null;
         }
@@ -114,16 +122,21 @@
     }
 
     @Override
-    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
+    @Initializer
+    // mBlockThirdPartyButton is assumed to be non-null in the rest of this
+    // class but it is not actually guaranteed to be inited here.
+    @NullUnmarked
+    public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
         mViewHolder = holder;
-        mAllowButton = (RadioButtonWithDescription) holder.findViewById(R.id.allow);
-        mRadioGroup = (RadioGroup) holder.findViewById(R.id.radio_button_layout);
+        mAllowButton = (RadioButtonWithDescription) assertNonNull(holder.findViewById(R.id.allow));
+        mRadioGroup = (RadioGroup) assumeNonNull(holder.findViewById(R.id.radio_button_layout));
         mRadioGroup.setOnCheckedChangeListener(this);
 
         mManagedView =
-                (TextViewWithCompoundDrawables) holder.findViewById(R.id.managed_disclaimer_text);
+                (TextViewWithCompoundDrawables)
+                        assertNonNull(holder.findViewById(R.id.managed_disclaimer_text));
 
         if (mInitializationParams != null) {
             setRadioButtonsVisibility(mInitializationParams);
@@ -137,8 +150,10 @@
 
     private void setRadioButtonsVisibility(Params params) {
         if (params.isPrivacySandboxFirstPartySetsUiEnabled) {
-            mViewHolder.findViewById(R.id.block_third_party_incognito).setVisibility(View.GONE);
-            mViewHolder.findViewById(R.id.block_third_party).setVisibility(View.GONE);
+            assumeNonNull(mViewHolder.findViewById(R.id.block_third_party_incognito))
+                    .setVisibility(View.GONE);
+            assumeNonNull(mViewHolder.findViewById(R.id.block_third_party))
+                    .setVisibility(View.GONE);
 
             // TODO(crbug.com/40233724): Change the buttons class into a
             // RadioButtonWithDescriptionAndAuxButton and remove the following casts when the
@@ -146,9 +161,11 @@
             var blockTPIncognitoBtnWithDescAndAux =
                     (RadioButtonWithDescriptionAndAuxButton)
                             mViewHolder.findViewById(R.id.block_third_party_incognito_with_aux);
+            assumeNonNull(blockTPIncognitoBtnWithDescAndAux);
             var blockTPButtonWithDescAndAux =
                     (RadioButtonWithDescriptionAndAuxButton)
                             mViewHolder.findViewById(R.id.block_third_party_with_aux);
+            assumeNonNull(blockTPButtonWithDescAndAux);
 
             blockTPIncognitoBtnWithDescAndAux.setVisibility(View.VISIBLE);
             blockTPButtonWithDescAndAux.setVisibility(View.VISIBLE);
@@ -159,11 +176,13 @@
             mBlockThirdPartyButton = blockTPButtonWithDescAndAux;
             setBlockThirdPartyCookieDescription(params);
         } else {
-            mBlockThirdPartyIncognitoButton =
+            var blockThirdPartyIncognitoButton =
                     (RadioButtonWithDescription)
                             mViewHolder.findViewById(R.id.block_third_party_incognito);
-            mBlockThirdPartyButton =
+            mBlockThirdPartyIncognitoButton = assumeNonNull(blockThirdPartyIncognitoButton);
+            var blockThirdPartyButton =
                     (RadioButtonWithDescription) mViewHolder.findViewById(R.id.block_third_party);
+            mBlockThirdPartyButton = assumeNonNull(blockThirdPartyButton);
         }
     }
 
@@ -255,7 +274,7 @@
                 return mBlockThirdPartyButton;
         }
         assert false;
-        return null;
+        return assumeNonNull(null);
     }
 
     /**
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStatePermissionPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStatePermissionPreference.java
index 690a2c2..3d70b02 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStatePermissionPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStatePermissionPreference.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.content_settings.PrefNames.ENABLE_GEOLOCATION_CPSS;
 import static org.chromium.components.content_settings.PrefNames.ENABLE_NOTIFICATION_CPSS;
 import static org.chromium.components.content_settings.PrefNames.ENABLE_QUIET_GEOLOCATION_PERMISSION_UI;
@@ -19,11 +20,15 @@
 import androidx.preference.PreferenceViewHolder;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.prefs.PrefService;
 
 /** A three state(loud, cpss, quiet) radio group preference for notifications and geolocation */
+@NullMarked
 public class TriStatePermissionPreference extends Preference
         implements RadioGroup.OnCheckedChangeListener {
 
@@ -32,8 +37,13 @@
     private RadioButtonWithDescription mLoud;
     private RadioGroup mRadioGroup;
     private PrefService mPrefService;
+
+    @SuppressWarnings("NullAway.Init")
     private String mQuietUiPref;
+
+    @SuppressWarnings("NullAway.Init")
     private String mCpssPref;
+
     private boolean mShowTitle;
     private TextView mTitleView;
 
@@ -51,6 +61,7 @@
      * @param prefService Instance of the PrefService to update the backing prefs for CPSS and Quiet
      *     UI settings.
      */
+    @Initializer
     public void initialize(PrefService prefService, boolean showTitle) {
         mPrefService = prefService;
         mShowTitle = showTitle;
@@ -66,17 +77,23 @@
     }
 
     @Override
+    @Initializer
+    @SuppressWarnings("NullAway")
     public void onBindViewHolder(PreferenceViewHolder holder) {
         mQuiet = (RadioButtonWithDescription) holder.findViewById(R.id.quiet);
+        assumeNonNull(mQuiet);
         mCpss = (RadioButtonWithDescription) holder.findViewById(R.id.cpss);
+        assumeNonNull(mCpss);
         mLoud = (RadioButtonWithDescription) holder.findViewById(R.id.loud);
-        mRadioGroup = (RadioGroup) holder.findViewById(R.id.radio_button_layout);
+        assumeNonNull(mLoud);
         mTitleView = (TextView) holder.findViewById(R.id.radio_button_title);
         if (mShowTitle) {
             mTitleView.setVisibility(View.VISIBLE);
         } else {
-            mTitleView.setVisibility(View.INVISIBLE);
+            mTitleView.setVisibility(View.GONE);
         }
+        mRadioGroup = (RadioGroup) holder.findViewById(R.id.radio_button_layout);
+        assumeNonNull(mRadioGroup);
         mRadioGroup.setOnCheckedChangeListener(this);
         RadioButtonWithDescription selectedRadioButton = getSelectedRadioButton();
         if (selectedRadioButton != null) selectedRadioButton.setChecked(true);
@@ -120,7 +137,7 @@
      * @return The radiobutton that should be selected based on the state of the QuietUI and CPSS
      *     settings preferences.
      */
-    private RadioButtonWithDescription getSelectedRadioButton() {
+    private @Nullable RadioButtonWithDescription getSelectedRadioButton() {
         if (mPrefService == null) {
             return null;
         }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateSiteSettingsPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateSiteSettingsPreference.java
index 7f43be07..a49f669 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateSiteSettingsPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/TriStateSiteSettingsPreference.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.util.AttributeSet;
 import android.widget.RadioGroup;
@@ -11,14 +13,18 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
 import org.chromium.components.content_settings.ContentSettingValues;
 
 /** A 3-state Allowed/Ask/Blocked radio group Preference used for SiteSettings. */
+@NullMarked
 public class TriStateSiteSettingsPreference extends Preference
         implements RadioGroup.OnCheckedChangeListener {
     private @ContentSettingValues int mSetting = ContentSettingValues.DEFAULT;
-    private int[] mDescriptionIds;
+    private int @Nullable [] mDescriptionIds;
     private RadioButtonWithDescription mAllowed;
     private RadioButtonWithDescription mAsk;
     private RadioButtonWithDescription mBlocked;
@@ -42,7 +48,7 @@
      * @param descriptionIds An array of 3 resource IDs for descriptions for
      *                       Allowed, Ask and Blocked states, in that order.
      */
-    public void initialize(@ContentSettingValues int setting, int[] descriptionIds) {
+    public void initialize(@ContentSettingValues int setting, int @Nullable [] descriptionIds) {
         mSetting = setting;
         mDescriptionIds = descriptionIds;
     }
@@ -66,13 +72,18 @@
     }
 
     @Override
+    @Initializer
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        mAllowed = (RadioButtonWithDescription) holder.findViewById(R.id.allowed);
-        mAsk = (RadioButtonWithDescription) holder.findViewById(R.id.ask);
-        mBlocked = (RadioButtonWithDescription) holder.findViewById(R.id.blocked);
-        mRadioGroup = (RadioGroup) holder.findViewById(R.id.radio_button_layout);
+        var allowed = (RadioButtonWithDescription) holder.findViewById(R.id.allowed);
+        mAllowed = assumeNonNull(allowed);
+        var ask = (RadioButtonWithDescription) holder.findViewById(R.id.ask);
+        mAsk = assumeNonNull(ask);
+        var blocked = (RadioButtonWithDescription) holder.findViewById(R.id.blocked);
+        mBlocked = assumeNonNull(blocked);
+        var radioGroup = (RadioGroup) holder.findViewById(R.id.radio_button_layout);
+        mRadioGroup = assumeNonNull(radioGroup);
         mRadioGroup.setOnCheckedChangeListener(this);
 
         if (mDescriptionIds != null) {
@@ -86,7 +97,8 @@
     }
 
     /** @param setting The setting to find RadioButton for. */
-    private RadioButtonWithDescription findRadioButton(@ContentSettingValues int setting) {
+    private @Nullable RadioButtonWithDescription findRadioButton(
+            @ContentSettingValues int setting) {
         if (setting == ContentSettingValues.ALLOW) {
             return mAllowed;
         } else if (setting == ContentSettingValues.ASK) {
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
index ff0f4010..fc7ab727 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
@@ -4,11 +4,14 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.build.annotations.EnsuresNonNullIf;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.StorageInfoClearedCallback;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
@@ -24,9 +27,10 @@
 import java.util.Map;
 
 /** Website is a class for storing information about a website and its associated permissions. */
+@NullMarked
 public final class Website implements WebsiteEntry {
     private final WebsiteAddress mOrigin;
-    private final WebsiteAddress mEmbedder;
+    private final @Nullable WebsiteAddress mEmbedder;
 
     /** Indexed by ContentSettingsType. */
     private Map<Integer, ContentSettingException> mContentSettingExceptions = new HashMap<>();
@@ -40,10 +44,10 @@
      */
     private Map<Integer, List<ContentSettingException>> mEmbeddedPermissionInfos = new HashMap<>();
 
-    private LocalStorageInfo mLocalStorageInfo;
-    private RwsCookieInfo mRwsCookieInfo;
-    private CookiesInfo mCookiesInfo;
-    private FileEditingInfo mFileEditingInfo;
+    private @Nullable LocalStorageInfo mLocalStorageInfo;
+    private @Nullable RwsCookieInfo mRwsCookieInfo;
+    private @Nullable CookiesInfo mCookiesInfo;
+    private @Nullable FileEditingInfo mFileEditingInfo;
     private double mZoomFactor;
     private final List<StorageInfo> mStorageInfo = new ArrayList<>();
     private final List<SharedDictionaryInfo> mSharedDictionaryInfo = new ArrayList<>();
@@ -73,7 +77,7 @@
         return type == ContentSettingsType.STORAGE_ACCESS;
     }
 
-    public Website(WebsiteAddress origin, WebsiteAddress embedder) {
+    public Website(WebsiteAddress origin, @Nullable WebsiteAddress embedder) {
         mOrigin = origin;
         mEmbedder = embedder;
     }
@@ -82,7 +86,7 @@
         return mOrigin;
     }
 
-    public WebsiteAddress getEmbedder() {
+    public @Nullable WebsiteAddress getEmbedder() {
         return mEmbedder;
     }
 
@@ -98,7 +102,7 @@
 
     public WebsiteAddress getMainAddress() {
         if (representsThirdPartiesOnSite()) {
-            return mEmbedder;
+            return assumeNonNull(mEmbedder);
         }
         return mOrigin;
     }
@@ -108,7 +112,7 @@
      * either return null (representing the wildcard) if it a 3P exception, or the mEmbedder
      * (which may not be null, such as in the "a.com, b.com" origin combination).
      */
-    private WebsiteAddress getAdditionalInformationAddress() {
+    private @Nullable WebsiteAddress getAdditionalInformationAddress() {
         if (representsThirdPartiesOnSite()) return null;
         return mEmbedder;
     }
@@ -153,7 +157,7 @@
     /**
      * @return PermissionInfo with permission details of specified type (Camera, Clipboard, etc.).
      */
-    public PermissionInfo getPermissionInfo(@ContentSettingsType.EnumType int type) {
+    public @Nullable PermissionInfo getPermissionInfo(@ContentSettingsType.EnumType int type) {
         return mPermissionInfos.get(type);
     }
 
@@ -180,7 +184,8 @@
         for (var existing_info : list) {
             if (existing_info.getContentSettingType() == info.getContentSettingType()
                     && existing_info.getPrimaryPattern().equals(info.getPrimaryPattern())
-                    && existing_info.getSecondaryPattern().equals(info.getSecondaryPattern())) {
+                    && assumeNonNull(existing_info.getSecondaryPattern())
+                            .equals(info.getSecondaryPattern())) {
                 // In incognito mode we can have two exceptions with the same pattern. Only keep
                 // the first one.
                 return;
@@ -194,7 +199,7 @@
     }
 
     /** Returns the exception info for this Website for specified type. */
-    public ContentSettingException getContentSettingException(
+    public @Nullable ContentSettingException getContentSettingException(
             @ContentSettingsType.EnumType int type) {
         return mContentSettingExceptions.get(type);
     }
@@ -213,22 +218,20 @@
      * @param exceptions Website embedded exceptions.
      * @return the ContentSettingValue of the list of |exceptions|.
      */
-    private @ContentSettingValues @Nullable Integer getContentSetting(
+    private @ContentSettingValues Integer getContentSetting(
             List<ContentSettingException> exceptions) {
         assert !exceptions.isEmpty();
 
-        @ContentSettingValues
-        @Nullable
-        Integer contentSetting = exceptions.get(0).getContentSetting();
+        @ContentSettingValues int contentSetting = exceptions.get(0).getContentSetting();
 
         for (ContentSettingException exception : exceptions) {
-            assert exception.getContentSetting().equals(contentSetting);
+            assert exception.getContentSetting() == contentSetting;
         }
 
         return contentSetting;
     }
 
-    public List<ContentSettingException> getEmbeddedContentSettings(
+    public @Nullable List<ContentSettingException> getEmbeddedContentSettings(
             @ContentSettingsType.EnumType int type) {
         assert isEmbeddedPermission(type);
         return getEmbeddedPermissions().get(type);
@@ -248,9 +251,9 @@
             // have been grouped by content setting.
             return getContentSetting(exceptions);
         } else if (getPermissionInfo(type) != null) {
-            return getPermissionInfo(type).getContentSetting(browserContextHandle);
+            return assumeNonNull(getPermissionInfo(type)).getContentSetting(browserContextHandle);
         } else if (getContentSettingException(type) != null) {
-            return getContentSettingException(type).getContentSetting();
+            return assumeNonNull(getContentSettingException(type)).getContentSetting();
         }
 
         return null;
@@ -261,8 +264,9 @@
             BrowserContextHandle browserContextHandle,
             @ContentSettingsType.EnumType int type,
             @ContentSettingValues int value) {
-        if (getPermissionInfo(type) != null) {
-            getPermissionInfo(type).setContentSetting(browserContextHandle, value);
+        PermissionInfo permissionInfo = getPermissionInfo(type);
+        if (permissionInfo != null) {
+            permissionInfo.setContentSetting(browserContextHandle, value);
             return;
         }
 
@@ -295,7 +299,7 @@
                 exception =
                         new ContentSettingException(
                                 ContentSettingsType.JAVASCRIPT,
-                                getAddress().getHost(),
+                                assumeNonNull(getAddress().getHost()),
                                 value,
                                 ProviderType.NONE,
                                 /* isEmbargoed= */ false);
@@ -315,7 +319,7 @@
                 exception =
                         new ContentSettingException(
                                 ContentSettingsType.SOUND,
-                                getAddress().getHost(),
+                                assumeNonNull(getAddress().getHost()),
                                 value,
                                 ProviderType.NONE,
                                 /* isEmbargoed= */ false);
@@ -357,6 +361,7 @@
     public boolean isEmbargoed(@ContentSettingsType.EnumType int type) {
         if (isEmbeddedPermission(type)) {
             List<ContentSettingException> exceptions = getEmbeddedContentSettings(type);
+            assumeNonNull(exceptions);
             assert exceptions.size() == 1;
 
             return exceptions.get(0).isEmbargoed();
@@ -373,11 +378,11 @@
         mLocalStorageInfo = info;
     }
 
-    public LocalStorageInfo getLocalStorageInfo() {
+    public @Nullable LocalStorageInfo getLocalStorageInfo() {
         return mLocalStorageInfo;
     }
 
-    public RwsCookieInfo getRwsCookieInfo() {
+    public @Nullable RwsCookieInfo getRwsCookieInfo() {
         return mRwsCookieInfo;
     }
 
@@ -414,7 +419,7 @@
         mCookiesInfo = info;
     }
 
-    public CookiesInfo getCookiesInfo() {
+    public @Nullable CookiesInfo getCookiesInfo() {
         return mCookiesInfo;
     }
 
@@ -422,7 +427,7 @@
         mFileEditingInfo = info;
     }
 
-    public FileEditingInfo getFileEditingInfo() {
+    public @Nullable FileEditingInfo getFileEditingInfo() {
         return mFileEditingInfo;
     }
 
@@ -434,6 +439,7 @@
             siteSettingsDelegate.getBrowsingDataModel(
                     (model) -> {
                         String host = getAddress().getHost();
+                        assertNonNull(host);
                         model.removeBrowsingData(
                                 host,
                                 () -> {
@@ -485,7 +491,7 @@
     }
 
     public String getTitleForEmbeddedPreferenceRow() {
-        return omitProtocolIfPresent(mEmbedder.getTitle());
+        return omitProtocolIfPresent(assumeNonNull(mEmbedder).getTitle());
     }
 
     public void setDomainImportant(boolean isImportant) {
@@ -533,20 +539,21 @@
 
     /** {@inheritDoc} */
     @Override
+    @EnsuresNonNullIf({"mRwsCookieInfo"})
     public boolean isPartOfRws() {
-        return getRwsCookieInfo() != null;
+        return mRwsCookieInfo != null;
     }
 
     /** {@inheritDoc} */
     @Override
-    public String getRwsOwner() {
-        return isPartOfRws() ? getRwsCookieInfo().getOwner() : null;
+    public @Nullable String getRwsOwner() {
+        return isPartOfRws() ? mRwsCookieInfo.getOwner() : null;
     }
 
     /** {@inheritDoc} */
     @Override
     public int getRwsSize() {
-        return isPartOfRws() ? getRwsCookieInfo().getMembersCount() : 0;
+        return isPartOfRws() ? mRwsCookieInfo.getMembersCount() : 0;
     }
 
     @Override
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java
index a95ea35..9b301b0c 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java
@@ -4,10 +4,13 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.net.Uri;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.Contract;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.url_formatter.SchemeDisplay;
@@ -22,13 +25,14 @@
  *
  * This is roughly equivalent to C++'s ContentSettingsPattern, though more limited.
  */
+@NullMarked
 public class WebsiteAddress implements Comparable<WebsiteAddress>, Serializable {
     private final String mOriginOrHostPattern;
-    private final String mOrigin;
-    private final String mScheme;
-    private final String mHost;
+    private final @Nullable String mOrigin;
+    private final @Nullable String mScheme;
+    private final @Nullable String mHost;
     private final boolean mOmitProtocolAndPort;
-    private String mDomainAndRegistry;
+    private @Nullable String mDomainAndRegistry;
 
     private static final String SCHEME_SUFFIX = "://";
     static final String ANY_SUBDOMAIN_PATTERN = "[*.]";
@@ -38,8 +42,8 @@
      *
      * @return A new WebsiteAddress, or null if |originOrHostOrPattern| was null or empty.
      */
-    @Nullable
-    public static WebsiteAddress create(String originOrHostOrPattern) {
+    @Contract("null -> null")
+    public static @Nullable WebsiteAddress create(@Nullable String originOrHostOrPattern) {
         // TODO(mvanouwerkerk): Define the behavior of this method if a url with path, query, or
         // fragment is passed in.
 
@@ -88,9 +92,9 @@
 
     private WebsiteAddress(
             String originOrHostPattern,
-            String origin,
-            String scheme,
-            String host,
+            @Nullable String origin,
+            @Nullable String scheme,
+            @Nullable String host,
             boolean omitProtocolAndPort) {
         mOriginOrHostPattern = originOrHostPattern;
         mOrigin = origin;
@@ -104,11 +108,11 @@
         if (mHost != null && mOmitProtocolAndPort) {
             return UrlConstants.HTTP_URL_PREFIX + mHost;
         } else {
-            return mOrigin;
+            return assumeNonNull(mOrigin);
         }
     }
 
-    public String getHost() {
+    public @Nullable String getHost() {
         return mHost;
     }
 
@@ -117,7 +121,7 @@
     }
 
     public String getTitle() {
-        if (mOrigin == null) return mHost;
+        if (mOrigin == null) return assumeNonNull(mHost);
         return UrlFormatter.formatUrlForSecurityDisplay(
                 mOrigin.contains(ANY_SUBDOMAIN_PATTERN)
                         ? mOrigin.replace(ANY_SUBDOMAIN_PATTERN, "")
@@ -135,7 +139,7 @@
      * @return Domain and registry if those are defined; origin/host otherwise (for things like IP
      *.        addresses and "localhost") with the scheme omitted.
      */
-    public String getDomainAndRegistry() {
+    public @Nullable String getDomainAndRegistry() {
         if (mDomainAndRegistry == null) {
             // getDomainAndRegistry works better having a protocol prefix.
             mDomainAndRegistry =
@@ -172,7 +176,7 @@
     @Override
     public int compareTo(WebsiteAddress to) {
         if (this == to) return 0;
-        String domainAndRegistry1 = getDomainAndRegistry();
+        String domainAndRegistry1 = assumeNonNull(getDomainAndRegistry());
         String domainAndRegistry2 = to.getDomainAndRegistry();
         int domainComparison = domainAndRegistry1.compareTo(domainAndRegistry2);
         if (domainComparison != 0) return domainComparison;
@@ -196,19 +200,20 @@
 
     private String[] getSubdomainsList() {
         int startIndex;
-        String mAddress;
+        String address;
         if (mOrigin != null) {
             startIndex = mOrigin.indexOf(SCHEME_SUFFIX);
             if (startIndex == -1) return new String[0];
             startIndex += SCHEME_SUFFIX.length();
-            mAddress = mOrigin;
+            address = mOrigin;
         } else {
             startIndex = 0;
-            mAddress = mHost;
+            address = mHost;
         }
-        int endIndex = mAddress.indexOf(getDomainAndRegistry());
+        assumeNonNull(address);
+        int endIndex = address.indexOf(getDomainAndRegistry());
         return --endIndex > startIndex
-                ? mAddress.substring(startIndex, endIndex).split("\\.")
+                ? address.substring(startIndex, endIndex).split("\\.")
                 : new String[0];
     }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java
index 30454bd..5807e3d 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java
@@ -4,12 +4,15 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.BrowserContextHandle;
 import org.chromium.url.GURL;
 
 import java.io.Serializable;
 
 /** Used by {@link WebsiteRowPreference} to display various information about one or multiple sites. */
+@NullMarked
 public interface WebsiteEntry extends Serializable {
     /** @return the title to display in a {@link WebsiteRowPreference}. */
     String getTitleForPreferenceRow();
@@ -38,7 +41,7 @@
      * @return the owner of the RWS and null if the {@link WebsiteEntry} is not part of the RWS
      *     (related website sets).
      */
-    String getRwsOwner();
+    @Nullable String getRwsOwner();
 
     /**
      * @return the size of the RWS and 0 if the {@link WebsiteEntry} is not part of the RWS (related
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java
index a81d1585..ab96ee9 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java
@@ -4,6 +4,9 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import org.chromium.build.annotations.EnsuresNonNullIf;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.BrowserContextHandle;
 import org.chromium.url.GURL;
@@ -16,6 +19,7 @@
 import java.util.Set;
 
 /** Represents a group of Websites that either share the same eTLD+1 or are embedded on it. */
+@NullMarked
 public class WebsiteGroup implements WebsiteEntry {
     // The common eTLD+1.
     private final String mDomainAndRegistry;
@@ -26,7 +30,7 @@
     // Total number of cookies associated with the websites.
     private final int mCookiesCount;
     // Related Website Sets info relative to the eTLD+1.
-    private RwsCookieInfo mRwsInfo;
+    private @Nullable RwsCookieInfo mRwsInfo;
 
     /**
      * Groups the websites by eTLD+1.
@@ -118,20 +122,21 @@
 
     /** {@inheritDoc} */
     @Override
+    @EnsuresNonNullIf({"mRwsInfo"})
     public boolean isPartOfRws() {
-        return getRwsInfo() != null;
+        return mRwsInfo != null;
     }
 
     /** {@inheritDoc} */
     @Override
-    public String getRwsOwner() {
-        return isPartOfRws() ? getRwsInfo().getOwner() : null;
+    public @Nullable String getRwsOwner() {
+        return isPartOfRws() ? mRwsInfo.getOwner() : null;
     }
 
     /** {@inheritDoc} */
     @Override
     public int getRwsSize() {
-        return isPartOfRws() ? getRwsInfo().getMembersCount() : 0;
+        return isPartOfRws() ? mRwsInfo.getMembersCount() : 0;
     }
 
     /**
@@ -151,7 +156,7 @@
         return true;
     }
 
-    public RwsCookieInfo getRwsInfo() {
+    public @Nullable RwsCookieInfo getRwsInfo() {
         return mRwsInfo;
     }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePermissionsFetcher.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePermissionsFetcher.java
index 58227c10..d8caa7ca 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePermissionsFetcher.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePermissionsFetcher.java
@@ -4,16 +4,16 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.site_settings.WebsiteAddress.ANY_SUBDOMAIN_PATTERN;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 
 import android.util.Pair;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Callback;
 import org.chromium.base.CommandLine;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browsing_data.content.BrowsingDataInfo;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
@@ -38,6 +38,7 @@
  * Utility class that asynchronously fetches any Websites and the permissions that the user has set
  * for them.
  */
+@NullMarked
 public class WebsitePermissionsFetcher {
     /** An enum describing the types of permissions that exist in website settings. */
     public enum WebsitePermissionsType {
@@ -51,7 +52,7 @@
     private final BrowserContextHandle mBrowserContextHandle;
     private WebsitePreferenceBridge mWebsitePreferenceBridge;
 
-    private SiteSettingsCategory mSiteSettingsCategory;
+    private @Nullable SiteSettingsCategory mSiteSettingsCategory;
     private static final String SCHEME_SUFFIX = "://";
     // This regex check comes from google3/java/com/google/net/bns/HostPortName.java which checks
     // for valid DNS name patterns
@@ -71,7 +72,7 @@
      *
      * @param contentSettingsType The ContentSettingsType int of the permission.
      */
-    public static WebsitePermissionsType getPermissionsType(
+    public static @Nullable WebsitePermissionsType getPermissionsType(
             @ContentSettingsType.EnumType int contentSettingsType) {
         switch (contentSettingsType) {
             case ContentSettingsType.ADS:
@@ -122,11 +123,13 @@
      * crbug.com/732907.
      */
     public static class OriginAndEmbedder extends Pair<WebsiteAddress, WebsiteAddress> {
-        public OriginAndEmbedder(WebsiteAddress origin, WebsiteAddress embedder) {
+        public OriginAndEmbedder(
+                @Nullable WebsiteAddress origin, @Nullable WebsiteAddress embedder) {
             super(origin, embedder);
         }
 
-        public static OriginAndEmbedder create(WebsiteAddress origin, WebsiteAddress embedder) {
+        public static OriginAndEmbedder create(
+                @Nullable WebsiteAddress origin, @Nullable WebsiteAddress embedder) {
             return new OriginAndEmbedder(origin, embedder);
         }
 
@@ -166,7 +169,7 @@
      *
      * @param callback The callback to run when the fetch is complete.
      */
-    public void fetchAllPreferences(@NonNull WebsitePermissionsCallback callback) {
+    public void fetchAllPreferences(WebsitePermissionsCallback callback) {
         var fetcherInternal = new WebsitePermissionFetcherInternal();
         fetcherInternal.fetchAllPreferences(callback);
     }
@@ -178,7 +181,7 @@
      * @param callback The callback to run when the fetch is complete.
      */
     public void fetchPreferencesForCategory(
-            SiteSettingsCategory category, @NonNull WebsitePermissionsCallback callback) {
+            SiteSettingsCategory category, WebsitePermissionsCallback callback) {
         var fetcherInternal = new WebsitePermissionFetcherInternal();
         fetcherInternal.fetchPreferencesForCategory(category, callback);
     }
@@ -191,7 +194,7 @@
      * @param callback The callback to run when the fetch is complete.
      */
     public void fetchPreferencesForCategoryAndPopulateRwsInfo(
-            SiteSettingsCategory category, @NonNull WebsitePermissionsCallback callback) {
+            SiteSettingsCategory category, WebsitePermissionsCallback callback) {
         var fetcherInternal = new WebsitePermissionFetcherInternal();
         fetcherInternal.fetchPreferencesForCategoryAndPopulateRwsInfo(category, callback);
     }
@@ -212,7 +215,7 @@
          *
          * @param callback The callback to run when the fetch is complete.
          */
-        public void fetchAllPreferences(@NonNull WebsitePermissionsCallback callback) {
+        public void fetchAllPreferences(WebsitePermissionsCallback callback) {
             TaskQueue queue = new TaskQueue();
 
             addAllFetchers(queue);
@@ -241,14 +244,13 @@
          * @param callback The callback to run when the fetch is complete.
          */
         public void fetchPreferencesForCategory(
-                SiteSettingsCategory category, @NonNull WebsitePermissionsCallback callback) {
+                SiteSettingsCategory category, WebsitePermissionsCallback callback) {
             TaskQueue queue = createFetchersForCategory(category);
 
             queue.add(new PermissionsAvailableCallbackRunner(callback));
             queue.next();
         }
 
-        @NonNull
         private TaskQueue createFetchersForCategory(SiteSettingsCategory category) {
             TaskQueue queue = new TaskQueue();
             mSiteSettingsCategory = category;
@@ -275,7 +277,7 @@
          * @param callback The callback to run when the fetch is complete.
          */
         public void fetchPreferencesForCategoryAndPopulateRwsInfo(
-                SiteSettingsCategory category, @NonNull WebsitePermissionsCallback callback) {
+                SiteSettingsCategory category, WebsitePermissionsCallback callback) {
             TaskQueue queue = createFetchersForCategory(category);
             queue.add(new RelatedWebsiteSetsInfoFetcher());
 
@@ -348,13 +350,13 @@
             }
         }
 
-        private Website findOrCreateSite(String origin, String embedder) {
+        private Website findOrCreateSite(String origin, @Nullable String embedder) {
             return findOrCreateSite(origin, embedder, null);
         }
 
         private Website findOrCreateSite(
                 String origin,
-                String embedder,
+                @Nullable String embedder,
                 @ContentSettingValues @Nullable Integer contentSetting) {
             // Ensure that the origin parameter is actually an origin or a wildcard.
             // The purpose of the check is to prevent duplicate entries in the list when getting a
@@ -376,7 +378,7 @@
                 embedder = null;
             }
 
-            WebsiteAddress permissionOrigin = WebsiteAddress.create(origin);
+            WebsiteAddress permissionOrigin = assumeNonNull(WebsiteAddress.create(origin));
             WebsiteAddress permissionEmbedder = WebsiteAddress.create(embedder);
 
             Pair<OriginAndEmbedder, Integer> key =
@@ -402,8 +404,7 @@
                 String address = exception.getPrimaryPattern();
                 String embedder = exception.getSecondaryPattern();
                 @ContentSettingValues
-                @Nullable
-                Integer contentSetting = null;
+                @Nullable Integer contentSetting = null;
 
                 if (isEmbeddedPermission
                         && embedder != null
@@ -430,7 +431,7 @@
                 String origin =
                         containsPatternWildcards(address)
                                 ? address
-                                : WebsiteAddress.create(address).getOrigin();
+                                : assumeNonNull(WebsiteAddress.create(address)).getOrigin();
                 Website site = findOrCreateSite(origin, embedder, contentSetting);
                 if (isEmbeddedPermission) {
                     site.addEmbeddedPermission(exception);
@@ -596,7 +597,9 @@
                                     // UI.
                                     // TODO(crbug.com/40231223): Use BrowsingDataModel to avoid this
                                     // conversion.
-                                    String origin = WebsiteAddress.create(address).getOrigin();
+                                    String origin =
+                                            assumeNonNull(WebsiteAddress.create(address))
+                                                    .getOrigin();
                                     findOrCreateSite(origin, null).addStorageInfo(info);
                                 }
                                 queue.next();
@@ -680,7 +683,6 @@
              * Builds a {@link Map<String, List <Website>>} of RWS Owner - Set of RWS Members from
              * the fetched websites.
              */
-            @NonNull
             private Map<String, List<Website>> buildOwnerToMembersMapFromFetchedSites() {
                 // set to avoid equals implementation for Website object
                 Set<String> domainAndRegistryToWebsite = new HashSet<>();
@@ -738,10 +740,9 @@
         }
 
         private class PermissionsAvailableCallbackRunner extends Task {
-            private final @NonNull WebsitePermissionsCallback mCallback;
+            private final WebsitePermissionsCallback mCallback;
 
-            private PermissionsAvailableCallbackRunner(
-                    @NonNull WebsitePermissionsCallback callback) {
+            private PermissionsAvailableCallbackRunner(WebsitePermissionsCallback callback) {
                 mCallback = callback;
             }
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreference.java
index 526ee9aa..d9f768d 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreference.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 
 import android.content.Context;
@@ -19,6 +20,8 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.accessibility.PageZoomUtils;
 import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
 import org.chromium.components.browser_ui.settings.FaviconViewUtils;
@@ -32,16 +35,17 @@
  * of the preference. See {@link ChromeImageViewPreference} for more details on how this icon
  * can be used.
  */
+@NullMarked
 class WebsitePreference extends ChromeImageViewPreference {
     protected final SiteSettingsDelegate mSiteSettingsDelegate;
     protected final Website mSite;
     protected final SiteSettingsCategory mCategory;
-    private Runnable mRefreshZoomsListFunction;
+    private @Nullable Runnable mRefreshZoomsListFunction;
 
     // Whether the favicon has been fetched already.
     private boolean mFaviconFetched;
 
-    private OnStorageAccessWebsiteDetailsRequested mStorageAccessSettingsPageListener;
+    private @Nullable OnStorageAccessWebsiteDetailsRequested mStorageAccessSettingsPageListener;
 
     /** Used to notify storage access website details subpage requests. */
     public interface OnStorageAccessWebsiteDetailsRequested {
@@ -111,7 +115,7 @@
             return false;
         }
 
-        int numberSites = mSite.getEmbeddedContentSettings(type).size();
+        int numberSites = assumeNonNull(mSite.getEmbeddedContentSettings(type)).size();
         return numberSites != 1 || !mSite.isEmbargoed(type);
     }
 
@@ -125,7 +129,7 @@
 
     protected String buildExpirationSummary(ContentSettingException exception) {
         assert exception != null && exception.hasExpiration();
-        var expirationInDays = exception.getExpirationInDays();
+        var expirationInDays = assumeNonNull(exception.getExpirationInDays());
         return expirationInDays == 0
                 ? getContext().getString(R.string.site_settings_expires_today_label)
                 : getContext()
@@ -136,7 +140,7 @@
                                 expirationInDays);
     }
 
-    protected String buildSummary() {
+    protected @Nullable String buildSummary() {
         if (mSiteSettingsDelegate.isPrivacySandboxFirstPartySetsUiFeatureEnabled()
                 && mSiteSettingsDelegate.isRelatedWebsiteSetsDataAccessEnabled()
                 && mSite.getRwsCookieInfo() != null) {
@@ -152,7 +156,10 @@
 
         if (hasSubPage()) {
             int numberSites =
-                    mSite.getEmbeddedContentSettings(mCategory.getContentSettingsType()).size();
+                    assumeNonNull(
+                                    mSite.getEmbeddedContentSettings(
+                                            mCategory.getContentSettingsType()))
+                            .size();
             return getContext()
                     .getResources()
                     .getQuantityString(
@@ -209,7 +216,7 @@
                             view -> {
                                 SiteSettingsUtil.resetZoomLevel(
                                         mSite, mSiteSettingsDelegate.getBrowserContextHandle());
-                                mRefreshZoomsListFunction.run();
+                                assumeNonNull(mRefreshZoomsListFunction).run();
                             });
             setImageViewEnabled(true);
             setImagePadding(25, 0, 0, 0);
@@ -225,7 +232,7 @@
                                     buildTitle()),
                     (OnClickListener)
                             view -> {
-                                mStorageAccessSettingsPageListener
+                                assumeNonNull(mStorageAccessSettingsPageListener)
                                         .onStorageAccessWebsiteDetailsRequested(this);
                             });
             setImageViewEnabled(true);
@@ -257,6 +264,7 @@
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         TextView usageText = (TextView) holder.findViewById(R.id.usage_text);
+        assumeNonNull(usageText);
         usageText.setVisibility(View.GONE);
         if (mCategory.getType() == SiteSettingsCategory.Type.USE_STORAGE) {
             long totalUsage = mSite.getTotalUsage();
@@ -267,6 +275,7 @@
         }
         if (mCategory.getType() == SiteSettingsCategory.Type.ZOOM) {
             TextView summaryText = (TextView) holder.findViewById(android.R.id.summary);
+            assumeNonNull(summaryText);
             long readableZoomLevel =
                     Math.round(
                             100
@@ -280,6 +289,7 @@
 
         // Manually apply ListItemStartIcon style to draw the outer circle in the right size.
         ImageView icon = (ImageView) holder.findViewById(android.R.id.icon);
+        assumeNonNull(icon);
         FaviconViewUtils.formatIconForFavicon(getContext().getResources(), icon);
 
         if (!mFaviconFetched && faviconUrl().isValid()) {
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java
index 06988ed..ae5b503 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java
@@ -4,10 +4,13 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import org.jni_zero.CalledByNative;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.content_settings.ProviderType;
@@ -22,6 +25,7 @@
 import java.util.Map;
 
 /** Utility class that interacts with native to retrieve and set website settings. */
+@NullMarked
 public class WebsitePreferenceBridge {
     public static final String SITE_WILDCARD = "*";
 
@@ -63,7 +67,8 @@
         if (type == ContentSettingsType.MEDIASTREAM_CAMERA
                 || type == ContentSettingsType.MEDIASTREAM_MIC) {
             for (PermissionInfo info : list) {
-                if (info.getOrigin().equals(origin) && info.getEmbedder().equals(embedder)) {
+                if (info.getOrigin().equals(origin)
+                        && assumeNonNull(info.getEmbedder()).equals(embedder)) {
                     return;
                 }
             }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
index 38eb9729..d320649 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.browser_ui.site_settings;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Dialog;
 import android.content.Context;
 import android.graphics.Color;
@@ -21,11 +23,14 @@
 import androidx.preference.PreferenceViewHolder;
 
 import org.chromium.base.CallbackUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
 import org.chromium.components.browser_ui.settings.FaviconViewUtils;
 import org.chromium.components.embedder_support.util.UrlConstants;
 
 /** Used by {@link AllSiteSettings} to display a row for a group of sites or a single site. */
+@NullMarked
 public class WebsiteRowPreference extends ChromeImageViewPreference {
     private final SiteSettingsDelegate mSiteSettingsDelegate;
     private final WebsiteEntry mSiteEntry;
@@ -35,7 +40,7 @@
     // Whether the favicon has been fetched already.
     private boolean mFaviconFetched;
 
-    private Dialog mConfirmationDialog;
+    private @Nullable Dialog mConfirmationDialog;
 
     private LayoutInflater mLayoutInflater;
 
@@ -99,6 +104,7 @@
 
         // Manually apply ListItemStartIcon style to draw the outer circle in the right size.
         ImageView icon = (ImageView) holder.findViewById(android.R.id.icon);
+        assumeNonNull(icon);
         FaviconViewUtils.formatIconForFavicon(getContext().getResources(), icon);
 
         if (!mFaviconFetched) {
diff --git a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AvatarGenerator.java b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AvatarGenerator.java
index 500b767..3e0262b 100644
--- a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AvatarGenerator.java
+++ b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AvatarGenerator.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.Px;
 
+import org.chromium.build.annotations.Contract;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
@@ -37,6 +38,7 @@
      * @param imageSize the target image size in pixels.
      * @return the scaled and cropped avatar.
      */
+    @Contract("_, !null, _ -> !null")
     public static @Nullable Drawable makeRoundAvatar(
             Resources resources, Bitmap avatar, @Px int imageSize) {
         if (avatar == null) return null;
diff --git a/components/component_updater/installer_policies/BUILD.gn b/components/component_updater/installer_policies/BUILD.gn
index b76d62c9..8efd060 100644
--- a/components/component_updater/installer_policies/BUILD.gn
+++ b/components/component_updater/installer_policies/BUILD.gn
@@ -26,6 +26,8 @@
     "origin_trials_component_installer.h",
     "plus_address_blocklist_component_installer.cc",
     "plus_address_blocklist_component_installer.h",
+    "probabilistic_reveal_token_component_installer_policy.cc",
+    "probabilistic_reveal_token_component_installer_policy.h",
     "safety_tips_component_installer.cc",
     "safety_tips_component_installer.h",
     "tpcd_metadata_component_installer_policy.cc",
@@ -89,6 +91,7 @@
     "open_cookie_database_component_installer_policy_unittest.cc",
     "optimization_hints_component_installer_unittest.cc",
     "plus_address_blocklist_component_installer_unittest.cc",
+    "probabilistic_reveal_token_component_installer_policy_unittest.cc",
     "tpcd_metadata_component_installer_policy_unittest.cc",
     "trust_token_key_commitments_component_installer_policy_unittest.cc",
   ]
diff --git a/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.cc b/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.cc
new file mode 100644
index 0000000..baa4cde
--- /dev/null
+++ b/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.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 "components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.h"
+
+#include <cstdint>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/check.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/functional/bind.h"
+#include "base/logging.h"
+#include "base/task/thread_pool.h"
+#include "base/values.h"
+#include "base/version.h"
+
+namespace {
+using RegistryReadyRepeatingCallback =
+    component_updater::ProbabilisticRevealTokenComponentInstallerPolicy::
+        RegistryReadyRepeatingCallback;
+
+// The SHA256 of the SubjectPublicKeyInfo used to sign the component.
+// The extension id is: ldfkbgjbencjpgjfleiooeldhjdapggh
+constexpr uint8_t kProbabilisticRevealTokenPublicKeySha256[32] = {
+    0xb3, 0x5a, 0x16, 0x91, 0x4d, 0x29, 0xf6, 0x95, 0xb4, 0x8e, 0xe4,
+    0xb3, 0x79, 0x30, 0xf6, 0x67, 0xe1, 0x08, 0xb3, 0x65, 0x42, 0xff,
+    0xa5, 0x63, 0x4e, 0xbd, 0x44, 0xbc, 0x25, 0xb2, 0xae, 0x77};
+
+constexpr char kProbabilisticRevealTokenManifestName[] =
+    "Probabilistic Reveal Tokens";
+
+constexpr base::FilePath::CharType
+    kProbabilisticRevealTokenRegistryJsonFileName[] =
+        FILE_PATH_LITERAL("prt_domains.json");
+
+constexpr base::FilePath::CharType
+    kProbabilisticRevealTokenRelativeInstallDir[] =
+        FILE_PATH_LITERAL("ProbabilisticRevealTokenRegistry");
+
+std::optional<std::string> LoadProbabilisticRevealTokenRegistryFromDisk(
+    const base::FilePath& json_path) {
+  CHECK(!json_path.empty());
+
+  VLOG(1) << "Reading Probabilistic Reveal Token Registry from file: "
+          << json_path.value();
+  std::string json_content;
+  if (!base::ReadFileToString(json_path, &json_content)) {
+    // The file won't exist on new installations, so this is not always an
+    // error.
+    VLOG(1) << "Failed reading from " << json_path.value();
+    return std::nullopt;
+  }
+  return json_content;
+}
+
+base::FilePath GetInstalledPath(const base::FilePath& install_dir) {
+  return install_dir.Append(kProbabilisticRevealTokenRegistryJsonFileName);
+}
+
+}  // namespace
+
+namespace component_updater {
+
+ProbabilisticRevealTokenComponentInstallerPolicy::
+    ProbabilisticRevealTokenComponentInstallerPolicy(
+        RegistryReadyRepeatingCallback on_registry_ready)
+    : on_registry_ready_(std::move(on_registry_ready)) {}
+
+ProbabilisticRevealTokenComponentInstallerPolicy::
+    ProbabilisticRevealTokenComponentInstallerPolicy() = default;
+
+ProbabilisticRevealTokenComponentInstallerPolicy::
+    ~ProbabilisticRevealTokenComponentInstallerPolicy() = default;
+
+bool ProbabilisticRevealTokenComponentInstallerPolicy::
+    SupportsGroupPolicyEnabledComponentUpdates() const {
+  return true;
+}
+
+bool ProbabilisticRevealTokenComponentInstallerPolicy::
+    RequiresNetworkEncryption() const {
+  return false;
+}
+
+update_client::CrxInstaller::Result
+ProbabilisticRevealTokenComponentInstallerPolicy::OnCustomInstall(
+    const base::Value::Dict& manifest,
+    const base::FilePath& install_dir) {
+  return update_client::CrxInstaller::Result(0);  // Nothing custom here.
+}
+
+void ProbabilisticRevealTokenComponentInstallerPolicy::OnCustomUninstall() {}
+
+void ProbabilisticRevealTokenComponentInstallerPolicy::ComponentReady(
+    const base::Version& version,
+    const base::FilePath& install_dir,
+    base::Value::Dict manifest) {
+  VLOG(1) << "Component ready, version " << version.GetString() << " in "
+          << install_dir.value();
+
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE, {base::MayBlock()},
+      base::BindOnce(&LoadProbabilisticRevealTokenRegistryFromDisk,
+                     GetInstalledPath(install_dir)),
+      base::BindOnce(on_registry_ready_));
+}
+
+// Called during startup and installation before ComponentReady().
+bool ProbabilisticRevealTokenComponentInstallerPolicy::VerifyInstallation(
+    const base::Value::Dict& manifest,
+    const base::FilePath& install_dir) const {
+  return base::PathExists(GetInstalledPath(install_dir));
+}
+
+base::FilePath
+ProbabilisticRevealTokenComponentInstallerPolicy::GetRelativeInstallDir()
+    const {
+  return base::FilePath(kProbabilisticRevealTokenRelativeInstallDir);
+}
+
+void ProbabilisticRevealTokenComponentInstallerPolicy::GetHash(
+    std::vector<uint8_t>* hash) const {
+  hash->assign(std::begin(kProbabilisticRevealTokenPublicKeySha256),
+               std::end(kProbabilisticRevealTokenPublicKeySha256));
+}
+
+std::string ProbabilisticRevealTokenComponentInstallerPolicy::GetName() const {
+  return kProbabilisticRevealTokenManifestName;
+}
+
+update_client::InstallerAttributes
+ProbabilisticRevealTokenComponentInstallerPolicy::GetInstallerAttributes()
+    const {
+  return {};
+}
+
+// static
+base::FilePath
+ProbabilisticRevealTokenComponentInstallerPolicy::GetInstalledPathForTesting(
+    const base::FilePath& base) {
+  return GetInstalledPath(base);
+}
+
+}  // namespace component_updater
diff --git a/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.h b/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.h
new file mode 100644
index 0000000..ccddd17
--- /dev/null
+++ b/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.h
@@ -0,0 +1,72 @@
+// 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_COMPONENT_UPDATER_INSTALLER_POLICIES_PROBABILISTIC_REVEAL_TOKEN_COMPONENT_INSTALLER_POLICY_H_
+#define COMPONENTS_COMPONENT_UPDATER_INSTALLER_POLICIES_PROBABILISTIC_REVEAL_TOKEN_COMPONENT_INSTALLER_POLICY_H_
+
+#include <cstdint>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/functional/callback.h"
+#include "base/values.h"
+#include "components/component_updater/component_installer.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace component_updater {
+
+class ProbabilisticRevealTokenComponentInstallerPolicy
+    : public ComponentInstallerPolicy {
+ public:
+  using RegistryReadyRepeatingCallback =
+      base::RepeatingCallback<void(const std::optional<std::string>)>;
+
+  explicit ProbabilisticRevealTokenComponentInstallerPolicy(
+      RegistryReadyRepeatingCallback on_registry_ready);
+  ProbabilisticRevealTokenComponentInstallerPolicy();
+  ProbabilisticRevealTokenComponentInstallerPolicy(
+      const ProbabilisticRevealTokenComponentInstallerPolicy&) = delete;
+  ProbabilisticRevealTokenComponentInstallerPolicy& operator=(
+      const ProbabilisticRevealTokenComponentInstallerPolicy&) = delete;
+  ~ProbabilisticRevealTokenComponentInstallerPolicy() override;
+
+  void ComponentReadyForTesting(const base::Version& version,
+                                const base::FilePath& install_dir,
+                                base::Value::Dict manifest) {
+    ComponentReady(version, install_dir, std::move(manifest));
+  }
+
+  static base::FilePath GetInstalledPathForTesting(const base::FilePath& base);
+
+  // ComponentInstallerPolicy:
+  bool VerifyInstallation(const base::Value::Dict& manifest,
+                          const base::FilePath& install_dir) const override;
+
+ private:
+  // ComponentInstallerPolicy:
+  bool SupportsGroupPolicyEnabledComponentUpdates() const override;
+  bool RequiresNetworkEncryption() const override;
+  update_client::CrxInstaller::Result OnCustomInstall(
+      const base::Value::Dict& manifest,
+      const base::FilePath& install_dir) override;
+  void OnCustomUninstall() override;
+  void ComponentReady(const base::Version& version,
+                      const base::FilePath& install_dir,
+                      base::Value::Dict manifest) override;
+  base::FilePath GetRelativeInstallDir() const override;
+  void GetHash(std::vector<uint8_t>* hash) const override;
+  std::string GetName() const override;
+  update_client::InstallerAttributes GetInstallerAttributes() const override;
+
+  RegistryReadyRepeatingCallback on_registry_ready_;
+};
+
+}  // namespace component_updater
+
+#endif  // COMPONENTS_COMPONENT_UPDATER_INSTALLER_POLICIES_PROBABILISTIC_REVEAL_TOKEN_COMPONENT_INSTALLER_POLICY_H_
diff --git a/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy_unittest.cc b/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy_unittest.cc
new file mode 100644
index 0000000..f3fdbe7
--- /dev/null
+++ b/components/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy_unittest.cc
@@ -0,0 +1,134 @@
+// 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/component_updater/installer_policies/probabilistic_reveal_token_component_installer_policy.h"
+
+#include <optional>
+#include <string>
+
+#include "base/check.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "base/values.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace component_updater {
+
+namespace {
+constexpr base::FilePath::CharType kProbabilisticRevealTokenRegistryFileName[] =
+    FILE_PATH_LITERAL("prt_domains.json");
+}  // namespace
+
+class ProbabilisticRevealTokenComponentInstallerPolicyTest
+    : public ::testing::Test {
+ public:
+  ProbabilisticRevealTokenComponentInstallerPolicyTest() {
+    EXPECT_TRUE(component_install_dir_.CreateUniqueTempDir());
+    EXPECT_TRUE(component_install_dir_.IsValid());
+  }
+
+ protected:
+  base::test::TaskEnvironment env_;
+  base::ScopedTempDir component_install_dir_;
+};
+
+TEST_F(ProbabilisticRevealTokenComponentInstallerPolicyTest,
+       VerifyInstallation_ValidDir) {
+  ProbabilisticRevealTokenComponentInstallerPolicy policy;
+
+  EXPECT_FALSE(policy.VerifyInstallation(base::Value::Dict(),
+                                         component_install_dir_.GetPath()));
+  ASSERT_TRUE(base::WriteFile(component_install_dir_.GetPath().Append(
+                                  kProbabilisticRevealTokenRegistryFileName),
+                              ""));
+  EXPECT_TRUE(policy.VerifyInstallation(base::Value::Dict(),
+                                        component_install_dir_.GetPath()));
+}
+
+TEST_F(ProbabilisticRevealTokenComponentInstallerPolicyTest,
+       VerifyInstallation_InvalidDir) {
+  ProbabilisticRevealTokenComponentInstallerPolicy policy;
+
+  EXPECT_FALSE(policy.VerifyInstallation(base::Value::Dict(),
+                                         component_install_dir_.GetPath()));
+  ASSERT_TRUE(base::WriteFile(component_install_dir_.GetPath().Append(
+                                  base::FilePath(FILE_PATH_LITERAL("invalid"))),
+                              ""));
+  EXPECT_FALSE(policy.VerifyInstallation(base::Value::Dict(),
+                                         component_install_dir_.GetPath()));
+}
+
+TEST_F(ProbabilisticRevealTokenComponentInstallerPolicyTest,
+       ComponentReady_NonexistentFile) {
+  base::test::TestFuture<const std::optional<std::string>> future;
+  ProbabilisticRevealTokenComponentInstallerPolicy policy(
+      future.GetRepeatingCallback());
+
+  policy.ComponentReadyForTesting(base::Version("0.0.1"),
+                                  base::FilePath(FILE_PATH_LITERAL("invalid")),
+                                  base::Value::Dict());
+
+  EXPECT_EQ(future.Take(), std::nullopt);
+}
+
+TEST_F(ProbabilisticRevealTokenComponentInstallerPolicyTest,
+       ComponentReady_ValidFile) {
+  const std::string expectation = "json";
+  ASSERT_TRUE(base::WriteFile(
+      ProbabilisticRevealTokenComponentInstallerPolicy::
+          GetInstalledPathForTesting(component_install_dir_.GetPath()),
+      expectation));
+
+  base::test::TestFuture<const std::optional<std::string>> future;
+  ProbabilisticRevealTokenComponentInstallerPolicy policy(
+      future.GetRepeatingCallback());
+
+  policy.ComponentReadyForTesting(base::Version("0.0.1"),
+                                  component_install_dir_.GetPath(),
+                                  base::Value::Dict());
+
+  EXPECT_EQ(future.Take().value(), expectation);
+}
+
+TEST_F(ProbabilisticRevealTokenComponentInstallerPolicyTest,
+       ComponentReady_ComponentUpdate) {
+  base::ScopedTempDir dir_v1;
+  ASSERT_TRUE(
+      dir_v1.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
+
+  const std::string expectation_v1 = "json";
+  ASSERT_TRUE(base::WriteFile(ProbabilisticRevealTokenComponentInstallerPolicy::
+                                  GetInstalledPathForTesting(dir_v1.GetPath()),
+                              expectation_v1));
+
+  base::test::TestFuture<const std::optional<std::string>> future;
+  ProbabilisticRevealTokenComponentInstallerPolicy policy(
+      future.GetRepeatingCallback());
+
+  policy.ComponentReadyForTesting(base::Version("0.0.1"), dir_v1.GetPath(),
+                                  base::Value::Dict());
+
+  EXPECT_EQ(future.Take().value(), expectation_v1);
+
+  // Install newer component, which should be read by the policy.
+  base::ScopedTempDir dir_v2;
+  ASSERT_TRUE(
+      dir_v2.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
+
+  const std::string expectation_v2 = "new json";
+  ASSERT_TRUE(base::WriteFile(ProbabilisticRevealTokenComponentInstallerPolicy::
+                                  GetInstalledPathForTesting(dir_v2.GetPath()),
+                              expectation_v2));
+
+  policy.ComponentReadyForTesting(base::Version("0.0.2"), dir_v2.GetPath(),
+                                  base::Value::Dict());
+
+  EXPECT_EQ(future.Take(), expectation_v2);
+}
+
+}  // namespace component_updater
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlUtilities.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlUtilities.java
index 68e66cb..1f13d575 100644
--- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlUtilities.java
+++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlUtilities.java
@@ -13,6 +13,7 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.build.annotations.Contract;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.components.url_formatter.UrlFormatter;
@@ -95,7 +96,7 @@
      *
      * @return True if the GURL's scheme is one that ContentView can handle.
      */
-    public static boolean isAcceptedScheme(GURL url) {
+    public static boolean isAcceptedScheme(@Nullable GURL url) {
         if (GURL.isEmptyOrInvalid(url)) return false;
         return SUPPORTED_SCHEMES.contains(url.getScheme());
     }
@@ -213,7 +214,9 @@
      *     registry identifier.
      */
     // TODO(crbug.com/40549331): Convert to GURL.
-    public static String getDomainAndRegistry(String uri, boolean includePrivateRegistries) {
+    @Contract("null, _ -> null")
+    public static @Nullable String getDomainAndRegistry(
+            @Nullable String uri, boolean includePrivateRegistries) {
         if (TextUtils.isEmpty(uri)) return uri;
         return UrlUtilitiesJni.get().getDomainAndRegistry(uri, includePrivateRegistries);
     }
diff --git a/components/enterprise/client_certificates/core/BUILD.gn b/components/enterprise/client_certificates/core/BUILD.gn
index bd39472..c784af8 100644
--- a/components/enterprise/client_certificates/core/BUILD.gn
+++ b/components/enterprise/client_certificates/core/BUILD.gn
@@ -24,6 +24,7 @@
     "leveldb_certificate_store.h",
     "metrics_util.h",
     "prefs.h",
+    "prefs_certificate_store.h",
     "private_key.h",
     "private_key_factory.h",
     "private_key_types.h",
@@ -49,6 +50,7 @@
     "leveldb_certificate_store.cc",
     "metrics_util.cc",
     "prefs.cc",
+    "prefs_certificate_store.cc",
     "private_key.cc",
     "private_key_factory.cc",
     "private_key_types.cc",
@@ -135,6 +137,7 @@
     "ec_private_key_unittest.cc",
     "key_upload_client_unittest.cc",
     "leveldb_certificate_store_unittest.cc",
+    "prefs_certificate_store_unittest.cc",
     "private_key_factory_unittest.cc",
     "ssl_client_cert_identity_wrapper_unittest.cc",
     "unexportable_private_key_factory_unittest.cc",
diff --git a/components/enterprise/client_certificates/core/constants.cc b/components/enterprise/client_certificates/core/constants.cc
index 06e4925..d17d710 100644
--- a/components/enterprise/client_certificates/core/constants.cc
+++ b/components/enterprise/client_certificates/core/constants.cc
@@ -20,4 +20,8 @@
 
 const char kKeySource[] = "PrivateKeySource";
 
+const char kKeyDetails[] = "KeyDetails";
+
+const char kCertificate[] = "Certificate";
+
 }  // namespace client_certificates
diff --git a/components/enterprise/client_certificates/core/constants.h b/components/enterprise/client_certificates/core/constants.h
index e729d3dd..6d807aa 100644
--- a/components/enterprise/client_certificates/core/constants.h
+++ b/components/enterprise/client_certificates/core/constants.h
@@ -31,6 +31,13 @@
 // Key name used within a key-value context for the private key source.
 extern const char kKeySource[];
 
+// Key name used within a key-value context for encompassing the signing key and
+// key source.
+extern const char kKeyDetails[];
+
+// Key name used within a key-value context for a certificate.
+extern const char kCertificate[];
+
 }  // namespace client_certificates
 
 #endif  // COMPONENTS_ENTERPRISE_CLIENT_CERTIFICATES_CORE_CONSTANTS_H_
diff --git a/components/enterprise/client_certificates/core/prefs.cc b/components/enterprise/client_certificates/core/prefs.cc
index 1ad9089..178962c 100644
--- a/components/enterprise/client_certificates/core/prefs.cc
+++ b/components/enterprise/client_certificates/core/prefs.cc
@@ -4,6 +4,7 @@
 
 #include "components/enterprise/client_certificates/core/prefs.h"
 
+#include "components/enterprise/client_certificates/core/constants.h"
 #include "components/prefs/pref_registry_simple.h"
 
 namespace client_certificates {
@@ -25,6 +26,8 @@
   registry->RegisterIntegerPref(
       prefs::kProvisionManagedClientCertificateForBrowserPrefs,
       /*default_value=*/0);
+  registry->RegisterDictionaryPref(kManagedBrowserIdentityName);
+  registry->RegisterDictionaryPref(kTemporaryManagedBrowserIdentityName);
 }
 
 }  // namespace client_certificates
diff --git a/components/enterprise/client_certificates/core/prefs_certificate_store.cc b/components/enterprise/client_certificates/core/prefs_certificate_store.cc
new file mode 100644
index 0000000..8286121
--- /dev/null
+++ b/components/enterprise/client_certificates/core/prefs_certificate_store.cc
@@ -0,0 +1,206 @@
+// 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/enterprise/client_certificates/core/prefs_certificate_store.h"
+
+#include "base/containers/span.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/values.h"
+#include "components/enterprise/client_certificates/core/client_identity.h"
+#include "components/enterprise/client_certificates/core/constants.h"
+#include "components/enterprise/client_certificates/core/private_key.h"
+#include "components/enterprise/client_certificates/core/private_key_factory.h"
+#include "components/enterprise/client_certificates/core/private_key_types.h"
+#include "components/prefs/pref_service.h"
+#include "net/cert/x509_certificate.h"
+
+namespace client_certificates {
+
+namespace {
+
+// Called from `GetIdentity` when a private key was loaded into a
+// PrivateKey instance from its dict format. `private_key` will contain the
+// PrivateKey instance when successful, or nullptr when not. `identity_name` and
+// `certificate` are forwarded along as they are required to construct a
+// `ClientIdentity` object. `callback` is used to return the end result to the
+// original caller.
+void OnKeyLoaded(
+    const std::string& identity_name,
+    scoped_refptr<net::X509Certificate> certificate,
+    base::OnceCallback<void(StoreErrorOr<std::optional<ClientIdentity>>)>
+        callback,
+    scoped_refptr<PrivateKey> private_key) {
+  if (!private_key) {
+    // Loading of the private key has failed, so return an overall failure.
+    std::move(callback).Run(base::unexpected(StoreError::kLoadKeyFailed));
+    return;
+  }
+  std::move(callback).Run(ClientIdentity(identity_name, std::move(private_key),
+                                         std::move(certificate)));
+}
+
+std::string GetEncodedCertificate(net::X509Certificate& certificate) {
+  std::string pem_encoded_certificate;
+  if (!net::X509Certificate::GetPEMEncoded(certificate.cert_buffer(),
+                                           &pem_encoded_certificate)) {
+    return std::string();
+  }
+
+  return pem_encoded_certificate;
+}
+
+scoped_refptr<net::X509Certificate> GetX509CertFromPem(
+    std::string pem_encoded_certificate) {
+  net::CertificateList certs =
+      net::X509Certificate::CreateCertificateListFromBytes(
+          base::as_byte_span(pem_encoded_certificate),
+          net::X509Certificate::FORMAT_AUTO);
+  if (!certs.empty()) {
+    return certs[0];
+  }
+
+  return nullptr;
+}
+
+}  // namespace
+
+PrefsCertificateStore::PrefsCertificateStore(
+    PrefService* pref_service,
+    std::unique_ptr<PrivateKeyFactory> key_factory)
+    : pref_service_(pref_service), key_factory_(std::move(key_factory)) {
+  CHECK(pref_service_);
+  CHECK(key_factory_);
+}
+PrefsCertificateStore::~PrefsCertificateStore() = default;
+
+void PrefsCertificateStore::CreatePrivateKey(
+    const std::string& identity_name,
+    base::OnceCallback<void(StoreErrorOr<scoped_refptr<PrivateKey>>)>
+        callback) {
+  const base::Value::Dict& identity = pref_service_->GetDict(identity_name);
+  if (identity.size() && identity.FindDict(kKeyDetails)->size()) {
+    // A private key already exists, this request is therefore treated as a
+    // conflict. Only check for the private key, as certificates can be
+    // replaced as long as the trusted private key is not lost.
+    std::move(callback).Run(base::unexpected(StoreError::kConflictingIdentity));
+    return;
+  }
+
+  // In order:
+  // 1) Create a private key,
+  // 2) Serialize the private key,
+  // 3) Save the private key,
+  // 4) Reply to the original callback.
+  key_factory_->CreatePrivateKey(base::BindOnce(
+      &PrefsCertificateStore::OnPrivateKeyCreated, weak_factory_.GetWeakPtr(),
+      identity_name, std::move(callback)));
+}
+
+void PrefsCertificateStore::CommitCertificate(
+    const std::string& identity_name,
+    scoped_refptr<net::X509Certificate> certificate,
+    base::OnceCallback<void(std::optional<StoreError>)> callback) {
+  if (!certificate) {
+    std::move(callback).Run(StoreError::kInvalidCertificateInput);
+    return;
+  }
+
+  auto identity = pref_service_->GetDict(identity_name).Clone();
+  identity.Set(kCertificate, GetEncodedCertificate(*certificate));
+  pref_service_->SetDict(identity_name, std::move(identity));
+
+  std::move(callback).Run(std::nullopt);
+}
+
+void PrefsCertificateStore::CommitIdentity(
+    const std::string& temporary_identity_name,
+    const std::string& final_identity_name,
+    scoped_refptr<net::X509Certificate> certificate,
+    base::OnceCallback<void(std::optional<StoreError>)> callback) {
+  // Typical flow where the private key was created in the temporary location,
+  // and will be moved to the permanent location along with its newly created
+  // certificate.
+  if (!pref_service_->HasPrefPath(temporary_identity_name)) {
+    std::move(callback).Run(StoreError::kIdentityNotFound);
+    return;
+  }
+
+  if (!certificate) {
+    std::move(callback).Run(StoreError::kInvalidCertificateInput);
+    return;
+  }
+
+  if (final_identity_name.empty()) {
+    std::move(callback).Run(StoreError::kInvalidFinalIdentityName);
+    return;
+  }
+
+  // In order:
+  // 1) Retrieve the identity from temporary storage,
+  // 2) Serialize the certificate + Update identity with the new certificate,
+  // 3) Save the identity in permanent storage,
+  // 4) Clear the temporary storage,
+  // 5) Reply to the original callback.
+  auto identity = pref_service_->GetDict(temporary_identity_name).Clone();
+  identity.Set(kCertificate, GetEncodedCertificate(*certificate));
+  pref_service_->SetDict(final_identity_name, std::move(identity));
+  pref_service_->ClearPref(temporary_identity_name);
+  std::move(callback).Run(std::nullopt);
+}
+
+void PrefsCertificateStore::GetIdentity(
+    const std::string& identity_name,
+    base::OnceCallback<void(StoreErrorOr<std::optional<ClientIdentity>>)>
+        callback) {
+  auto identity = pref_service_->GetDict(identity_name).Clone();
+  if (!identity.size()) {
+    // Not finding identity details indicates none existed before.
+    std::move(callback).Run(std::nullopt);
+    return;
+  }
+
+  scoped_refptr<net::X509Certificate> certificate;
+  auto* stored_cert = identity.FindString(kCertificate);
+  if (stored_cert) {
+    certificate = GetX509CertFromPem(*stored_cert);
+  }
+
+  auto* key_details = identity.FindDict(kKeyDetails);
+  if (!key_details) {
+    std::move(callback).Run(ClientIdentity(
+        identity_name, /*private_key=*/nullptr, std::move(certificate)));
+    return;
+  }
+
+  key_factory_->LoadPrivateKeyFromDict(
+      key_details->Clone(),
+      base::BindOnce(OnKeyLoaded, identity_name, std::move(certificate),
+                     std::move(callback)));
+}
+
+void PrefsCertificateStore::OnPrivateKeyCreated(
+    const std::string& identity_name,
+    base::OnceCallback<void(StoreErrorOr<scoped_refptr<PrivateKey>>)> callback,
+    scoped_refptr<PrivateKey> private_key) {
+  if (!private_key) {
+    // Failed to create a private key.
+    std::move(callback).Run(base::unexpected(StoreError::kCreateKeyFailed));
+    return;
+  }
+
+  // Create the stored identity and commit it to the prefs.
+  auto serialized_private_key = private_key->ToDict();
+  if (!serialized_private_key.size()) {
+    std::move(callback).Run(base::unexpected(StoreError::kSaveKeyFailed));
+    return;
+  }
+
+  base::Value::Dict identity_to_save;
+  identity_to_save.Set(kKeyDetails, std::move(serialized_private_key));
+  pref_service_->SetDict(identity_name, std::move(identity_to_save));
+  std::move(callback).Run(private_key);
+}
+
+}  // namespace client_certificates
diff --git a/components/enterprise/client_certificates/core/prefs_certificate_store.h b/components/enterprise/client_certificates/core/prefs_certificate_store.h
new file mode 100644
index 0000000..9a16cab
--- /dev/null
+++ b/components/enterprise/client_certificates/core/prefs_certificate_store.h
@@ -0,0 +1,79 @@
+// 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_ENTERPRISE_CLIENT_CERTIFICATES_CORE_PREFS_CERTIFICATE_STORE_H_
+#define COMPONENTS_ENTERPRISE_CLIENT_CERTIFICATES_CORE_PREFS_CERTIFICATE_STORE_H_
+
+#include <memory>
+#include <optional>
+#include <string>
+
+#include "base/functional/callback_forward.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "components/enterprise/client_certificates/core/certificate_store.h"
+#include "components/enterprise/client_certificates/core/store_error.h"
+
+class PrefService;
+
+namespace client_certificates_pb {
+class ClientIdentity;
+}
+
+namespace net {
+class X509Certificate;
+}  // namespace net
+
+namespace client_certificates {
+
+class PrivateKeyFactory;
+class PrivateKey;
+
+// Implementation of the CertificateStore backed by a
+// the prefs service for storage.
+class PrefsCertificateStore : public CertificateStore {
+ public:
+  PrefsCertificateStore(PrefService* pref_service,
+                        std::unique_ptr<PrivateKeyFactory> key_factory);
+
+  ~PrefsCertificateStore() override;
+
+  // CertificateStore:
+  void CreatePrivateKey(
+      const std::string& identity_name,
+      base::OnceCallback<void(StoreErrorOr<scoped_refptr<PrivateKey>>)>
+          callback) override;
+  void CommitCertificate(
+      const std::string& identity_name,
+      scoped_refptr<net::X509Certificate> certificate,
+      base::OnceCallback<void(std::optional<StoreError>)> callback) override;
+  void CommitIdentity(
+      const std::string& temporary_identity_name,
+      const std::string& final_identity_name,
+      scoped_refptr<net::X509Certificate> certificate,
+      base::OnceCallback<void(std::optional<StoreError>)> callback) override;
+  void GetIdentity(
+      const std::string& identity_name,
+      base::OnceCallback<void(StoreErrorOr<std::optional<ClientIdentity>>)>
+          callback) override;
+
+ private:
+  // Called when a private key was created from `CreatePrivateKeyInner`.
+  // `private_key` will contain the created private key when successful, or
+  // nullptr when not.
+  void OnPrivateKeyCreated(
+      const std::string& identity_name,
+      base::OnceCallback<void(StoreErrorOr<scoped_refptr<PrivateKey>>)>
+          callback,
+      scoped_refptr<PrivateKey> private_key);
+
+  raw_ptr<PrefService> pref_service_;
+  std::unique_ptr<PrivateKeyFactory> key_factory_;
+
+  base::WeakPtrFactory<PrefsCertificateStore> weak_factory_{this};
+};
+
+}  // namespace client_certificates
+
+#endif  // COMPONENTS_ENTERPRISE_CLIENT_CERTIFICATES_CORE_PREFS_CERTIFICATE_STORE_H_
diff --git a/components/enterprise/client_certificates/core/prefs_certificate_store_unittest.cc b/components/enterprise/client_certificates/core/prefs_certificate_store_unittest.cc
new file mode 100644
index 0000000..418e729
--- /dev/null
+++ b/components/enterprise/client_certificates/core/prefs_certificate_store_unittest.cc
@@ -0,0 +1,378 @@
+// 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/enterprise/client_certificates/core/prefs_certificate_store.h"
+
+#include <map>
+#include <memory>
+#include <optional>
+#include <string>
+#include <utility>
+
+#include "base/base64.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/memory/raw_ptr.h"
+#include "base/pickle.h"
+#include "base/test/gmock_callback_support.h"
+#include "base/test/gmock_expected_support.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "base/types/expected.h"
+#include "base/values.h"
+#include "components/enterprise/client_certificates/core/client_identity.h"
+#include "components/enterprise/client_certificates/core/constants.h"
+#include "components/enterprise/client_certificates/core/mock_private_key.h"
+#include "components/enterprise/client_certificates/core/mock_private_key_factory.h"
+#include "components/enterprise/client_certificates/core/private_key.h"
+#include "components/enterprise/client_certificates/core/private_key_factory.h"
+#include "components/enterprise/client_certificates/core/private_key_types.h"
+#include "components/enterprise/client_certificates/core/store_error.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "net/cert/x509_certificate.h"
+#include "net/test/cert_test_util.h"
+#include "net/test/test_data_directory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace client_certificates {
+
+namespace {
+
+constexpr char kTestIdentityName[] = "identity_name";
+constexpr char kOtherTestIdentityName[] = "other_identity_name";
+constexpr char kFakeWrappedValue[] = "some_wrapped_value";
+constexpr char kInvalidKey[] = "invalid_key";
+
+scoped_refptr<net::X509Certificate> LoadTestCert() {
+  static constexpr char kTestCertFileName[] = "client_1.pem";
+  return net::ImportCertFromFile(net::GetTestCertsDirectory(),
+                                 kTestCertFileName);
+}
+
+base::Value::Dict CreateFakeDictKey() {
+  base::Value::Dict key_dict;
+  key_dict.Set(kKey, base::Base64Encode(kFakeWrappedValue));
+  key_dict.Set(kKeySource,
+               static_cast<int>(PrivateKeySource::kUnexportableKey));
+  return key_dict;
+}
+
+std::string GetEncodedCertificate(net::X509Certificate& certificate) {
+  std::string pem_encoded_certificate;
+  net::X509Certificate::GetPEMEncoded(certificate.cert_buffer(),
+                                      &pem_encoded_certificate);
+  return pem_encoded_certificate;
+}
+
+base::Value::Dict CreateValidIdentity() {
+  base::Value::Dict identity;
+  identity.Set(kKeyDetails, CreateFakeDictKey());
+  return identity;
+}
+
+base::Value::Dict CreateValidIdentity(net::X509Certificate& certificate) {
+  base::Value::Dict identity = CreateValidIdentity();
+  identity.Set(kCertificate, GetEncodedCertificate(certificate));
+  return identity;
+}
+
+}  // namespace
+
+using base::test::ErrorIs;
+using base::test::RunOnceCallback;
+using base::test::ValueIs;
+using testing::_;
+using testing::Return;
+using testing::StrictMock;
+
+class PrefsCertificateStoreTest : public testing::Test {
+ protected:
+  void SetUp() override {
+    prefs_.registry()->RegisterDictionaryPref(kTestIdentityName);
+    prefs_.registry()->RegisterDictionaryPref(kOtherTestIdentityName);
+
+    auto mock_key_factory =
+        std::make_unique<StrictMock<MockPrivateKeyFactory>>();
+    mock_key_factory_ = mock_key_factory.get();
+
+    store_ = std::make_unique<PrefsCertificateStore>(
+        &prefs_, std::move(mock_key_factory));
+  }
+
+  base::test::TaskEnvironment task_environment_;
+  TestingPrefServiceSimple prefs_;
+  std::unique_ptr<PrefsCertificateStore> store_;
+  raw_ptr<MockPrivateKeyFactory> mock_key_factory_;
+};
+
+// Tests the success path of the CreatePrivateKey function:
+// - Parameters are valid,
+// - There is no preexisting valid identity with key details,
+// - Private key creation succeeds,
+// - Private key serialization succeeds.
+TEST_F(PrefsCertificateStoreTest, CreatePrivateKey_Success) {
+  auto mocked_private_key = base::MakeRefCounted<StrictMock<MockPrivateKey>>();
+  EXPECT_CALL(*mocked_private_key, ToDict())
+      .WillOnce(Return(CreateFakeDictKey()));
+
+  EXPECT_CALL(*mock_key_factory_, CreatePrivateKey(_))
+      .WillOnce(RunOnceCallback<0>(mocked_private_key));
+
+  base::test::TestFuture<StoreErrorOr<scoped_refptr<PrivateKey>>> test_future;
+  store_->CreatePrivateKey(kTestIdentityName, test_future.GetCallback());
+
+  EXPECT_THAT(test_future.Get(), ValueIs(mocked_private_key));
+
+  auto* key_details = prefs_.GetDict(kTestIdentityName).FindDict(kKeyDetails);
+  EXPECT_GT(key_details->size(), 0U);
+  EXPECT_EQ(*key_details->FindString(kKey),
+            base::Base64Encode(kFakeWrappedValue));
+  EXPECT_EQ(*key_details->FindInt(kKeySource),
+            static_cast<int>(PrivateKeySource::kUnexportableKey));
+}
+
+// Tests that no key is returned and the prefs are not modified when
+// attempting to create a private key using an identity name that is already
+// used.
+TEST_F(PrefsCertificateStoreTest, CreatePrivateKey_ConflictFailure) {
+  base::Value::Dict key_dict;
+  key_dict.Set(kKey, kInvalidKey);
+  base::Value::Dict identity;
+  identity.Set(kKeyDetails, std::move(key_dict));
+  prefs_.SetDict(kTestIdentityName, std::move(identity));
+
+  base::test::TestFuture<StoreErrorOr<scoped_refptr<PrivateKey>>> test_future;
+  store_->CreatePrivateKey(kTestIdentityName, test_future.GetCallback());
+
+  EXPECT_THAT(test_future.Get(), ErrorIs(StoreError::kConflictingIdentity));
+  EXPECT_EQ(*prefs_.GetDict(kTestIdentityName)
+                 .FindDict(kKeyDetails)
+                 ->FindString(kKey),
+            kInvalidKey);
+}
+
+// Tests that no key is returned and the prefs is not modified when
+// the create key call fails.
+TEST_F(PrefsCertificateStoreTest, CreatePrivateKey_CreateKeyFailure) {
+  EXPECT_CALL(*mock_key_factory_, CreatePrivateKey(_))
+      .WillOnce(RunOnceCallback<0>(nullptr));
+
+  base::test::TestFuture<StoreErrorOr<scoped_refptr<PrivateKey>>> test_future;
+  store_->CreatePrivateKey(kTestIdentityName, test_future.GetCallback());
+
+  EXPECT_THAT(test_future.Get(), ErrorIs(StoreError::kCreateKeyFailed));
+  EXPECT_EQ(prefs_.GetDict(kTestIdentityName).size(), 0U);
+}
+
+// Tests that a certificate can be saved to the prefs when a private key
+// already exists.
+TEST_F(PrefsCertificateStoreTest, CommitCertificate_SuccessWithPrivateKey) {
+  auto test_cert = LoadTestCert();
+  prefs_.SetDict(kTestIdentityName, CreateValidIdentity());
+
+  base::test::TestFuture<std::optional<StoreError>> test_future;
+  store_->CommitCertificate(kTestIdentityName, test_cert,
+                            test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), std::nullopt);
+
+  EXPECT_EQ(*prefs_.GetDict(kTestIdentityName).FindString(kCertificate),
+            GetEncodedCertificate(*test_cert));
+}
+
+// Tests that a certificate can be saved to the prefs even when a private key
+// does not already exist.
+TEST_F(PrefsCertificateStoreTest, CommitCertificate_SuccessWithoutPrivateKey) {
+  auto test_cert = LoadTestCert();
+
+  base::test::TestFuture<std::optional<StoreError>> test_future;
+  store_->CommitCertificate(kTestIdentityName, test_cert,
+                            test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), std::nullopt);
+
+  EXPECT_EQ(*prefs_.GetDict(kTestIdentityName).FindString(kCertificate),
+            GetEncodedCertificate(*test_cert));
+}
+
+// Tests that a certificate won't be saved to the prefs when the given
+// certificate instance is invalid (nullptr).
+TEST_F(PrefsCertificateStoreTest, CommitCertificate_InvalidCertificateFailure) {
+  base::test::TestFuture<std::optional<StoreError>> test_future;
+  store_->CommitCertificate(kTestIdentityName, /*certificate=*/nullptr,
+                            test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), StoreError::kInvalidCertificateInput);
+  EXPECT_EQ(prefs_.GetDict(kTestIdentityName).size(), 0U);
+}
+
+// Tests that an existing private key is moved and a certificate can be saved
+// to the prefs.
+TEST_F(PrefsCertificateStoreTest, CommitIdentity_SuccessWithPrivateKey) {
+  auto test_cert = LoadTestCert();
+  prefs_.SetDict(kOtherTestIdentityName, CreateValidIdentity());
+
+  base::test::TestFuture<std::optional<StoreError>> test_future;
+  store_->CommitIdentity(kOtherTestIdentityName, kTestIdentityName, test_cert,
+                         test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), std::nullopt);
+
+  EXPECT_EQ(*prefs_.GetDict(kTestIdentityName).FindString(kCertificate),
+            GetEncodedCertificate(*test_cert));
+  EXPECT_EQ(prefs_.GetDict(kOtherTestIdentityName).size(), 0U);
+}
+
+// Tests that a certificate cannot be saved to the prefs when the temporary
+// identity does not already exist i.e contains details.
+TEST_F(PrefsCertificateStoreTest, CommitIdentity_FailWithoutIdentity) {
+  auto test_cert = LoadTestCert();
+
+  base::test::TestFuture<std::optional<StoreError>> test_future;
+  store_->CommitIdentity(kOtherTestIdentityName, kTestIdentityName, test_cert,
+                         test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), StoreError::kIdentityNotFound);
+
+  EXPECT_EQ(prefs_.GetDict(kTestIdentityName).size(), 0U);
+  EXPECT_EQ(prefs_.GetDict(kOtherTestIdentityName).size(), 0U);
+}
+
+// Tests that a certificate won't be saved to the prefs when the given
+// certificate instance is invalid (nullptr).
+TEST_F(PrefsCertificateStoreTest, CommitIdentity_InvalidCertificateFailure) {
+  prefs_.SetDict(kOtherTestIdentityName, CreateValidIdentity());
+
+  base::test::TestFuture<std::optional<StoreError>> test_future;
+  store_->CommitIdentity(kOtherTestIdentityName, kTestIdentityName,
+                         /*certificate=*/nullptr, test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), StoreError::kInvalidCertificateInput);
+
+  EXPECT_EQ(prefs_.GetDict(kTestIdentityName).size(), 0U);
+}
+
+// Tests that an identity stored in the prefs with a private key and
+// certificate can be properly loaded into memory and returned.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_FullIdentitySuccess) {
+  auto test_cert = LoadTestCert();
+  prefs_.SetDict(kTestIdentityName, CreateValidIdentity(*test_cert));
+
+  auto mocked_private_key = base::MakeRefCounted<StrictMock<MockPrivateKey>>();
+  EXPECT_CALL(*mock_key_factory_, LoadPrivateKeyFromDict(_, _))
+      .WillOnce((RunOnceCallback<1>(mocked_private_key)));
+
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kTestIdentityName, test_future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::optional<ClientIdentity> identity,
+                       test_future.Get());
+  ASSERT_TRUE(identity.has_value());
+  EXPECT_EQ(identity->name, kTestIdentityName);
+  EXPECT_EQ(identity->private_key, mocked_private_key);
+  EXPECT_TRUE(test_cert->EqualsIncludingChain(identity->certificate.get()));
+}
+
+// Tests that an identity stored in the prefs with only a private key can be
+// properly loaded into memory and returned.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_OnlyPrivateKeySuccess) {
+  prefs_.SetDict(kTestIdentityName, CreateValidIdentity());
+
+  auto mocked_private_key = base::MakeRefCounted<StrictMock<MockPrivateKey>>();
+  EXPECT_CALL(*mock_key_factory_, LoadPrivateKeyFromDict(_, _))
+      .WillOnce((RunOnceCallback<1>(mocked_private_key)));
+
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kTestIdentityName, test_future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::optional<ClientIdentity> identity,
+                       test_future.Get());
+  ASSERT_TRUE(identity.has_value());
+  EXPECT_EQ(identity->name, kTestIdentityName);
+  EXPECT_EQ(identity->private_key, mocked_private_key);
+  EXPECT_FALSE(identity->certificate);
+}
+
+// Tests that an identity stored in the prefs with only a certificate can be
+// properly loaded into memory and returned.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_OnlyCertificateSuccess) {
+  auto test_cert = LoadTestCert();
+  base::Value::Dict identity_dict;
+  identity_dict.Set(kCertificate, GetEncodedCertificate(*test_cert));
+  prefs_.SetDict(kTestIdentityName, std::move(identity_dict));
+
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kTestIdentityName, test_future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::optional<ClientIdentity> identity,
+                       test_future.Get());
+  ASSERT_TRUE(identity.has_value());
+  EXPECT_EQ(identity->name, kTestIdentityName);
+  EXPECT_FALSE(identity->private_key);
+  EXPECT_TRUE(test_cert->EqualsIncludingChain(identity->certificate.get()));
+}
+
+// Tests that an identity stored in the prefs with no private key nor
+// certificate can be properly loaded into memory and returned.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_MissingKeyAndCertSuccess) {
+  base::Value::Dict identity_dict;
+  identity_dict.Set("test", 1);
+  prefs_.SetDict(kTestIdentityName, std::move(identity_dict));
+
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kTestIdentityName, test_future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::optional<ClientIdentity> identity,
+                       test_future.Get());
+  ASSERT_TRUE(identity.has_value());
+  EXPECT_EQ(identity->name, kTestIdentityName);
+  EXPECT_FALSE(identity->private_key);
+  EXPECT_FALSE(identity->certificate);
+}
+
+// Tests that an identity stored in the prefs with no details
+// can not be properly loaded into memory and returned.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_NoDetails_Fails) {
+  prefs_.SetDict(kTestIdentityName, base::Value::Dict());
+
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kTestIdentityName, test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), std::nullopt);
+}
+
+// Tests that attempting to retrieve an identity using an invalid identity name
+// does not return an actual identity.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_InvalidIdentityName_Fails) {
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kOtherTestIdentityName, test_future.GetCallback());
+
+  EXPECT_EQ(test_future.Get(), std::nullopt);
+}
+
+// Tests that attempting to retrieve an identity when failing to load a private
+// key into memory does not return an actual identity.
+TEST_F(PrefsCertificateStoreTest, GetIdentity_LoadPrivateKeyFailure) {
+  auto test_cert = LoadTestCert();
+  prefs_.SetDict(kTestIdentityName, CreateValidIdentity(*test_cert));
+
+  EXPECT_CALL(*mock_key_factory_, LoadPrivateKeyFromDict(_, _))
+      .WillOnce(RunOnceCallback<1>(nullptr));
+
+  base::test::TestFuture<StoreErrorOr<std::optional<ClientIdentity>>>
+      test_future;
+  store_->GetIdentity(kTestIdentityName, test_future.GetCallback());
+
+  EXPECT_THAT(test_future.Get(), ErrorIs(StoreError::kLoadKeyFailed));
+}
+
+}  // namespace client_certificates
diff --git a/components/enterprise/connectors/core/BUILD.gn b/components/enterprise/connectors/core/BUILD.gn
index 7d633a04..2e585f7 100644
--- a/components/enterprise/connectors/core/BUILD.gn
+++ b/components/enterprise/connectors/core/BUILD.gn
@@ -27,7 +27,6 @@
     "features.h",
     "realtime_reporting_client_base.cc",
     "realtime_reporting_client_base.h",
-    "reporting_constants.h",
     "reporting_service_settings.cc",
     "reporting_service_settings.h",
     "reporting_utils.cc",
@@ -36,7 +35,10 @@
     "service_provider_config.h",
   ]
 
-  public_deps = [ "//components/enterprise/common/proto:connectors_proto" ]
+  public_deps = [
+    ":constants",
+    "//components/enterprise/common/proto:connectors_proto",
+  ]
 
   deps = [
     "//base",
@@ -71,6 +73,17 @@
   }
 }
 
+source_set("constants") {
+  sources = [
+    "reporting_constants.cc",
+    "reporting_constants.h",
+  ]
+  deps = [
+    "//base",
+    "//components/enterprise/common/proto:chrome_reporting_entity",
+  ]
+}
+
 source_set("test_support") {
   testonly = true
 
diff --git a/components/enterprise/connectors/core/reporting_constants.cc b/components/enterprise/connectors/core/reporting_constants.cc
new file mode 100644
index 0000000..27a734ad
--- /dev/null
+++ b/components/enterprise/connectors/core/reporting_constants.cc
@@ -0,0 +1,23 @@
+// 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/enterprise/connectors/core/reporting_constants.h"
+
+#include "base/containers/map_util.h"
+
+namespace enterprise_connectors {
+
+std::string_view GetPayloadSizeUmaMetricName(std::string_view eventName) {
+  auto* metric_name =
+      base::FindOrNull(kEventNameToUmaUploadSizeMetricNameMap, eventName);
+  return metric_name ? *metric_name : kUnknownUploadSizeUmaMetricName;
+}
+
+std::string_view GetPayloadSizeUmaMetricName(EventCase eventCase) {
+  auto* metric_name =
+      base::FindOrNull(kEventCaseToUmaUploadSizeMetricNameMap, eventCase);
+  return metric_name ? *metric_name : kUnknownUploadSizeUmaMetricName;
+}
+
+}  // namespace enterprise_connectors
diff --git a/components/enterprise/connectors/core/reporting_constants.h b/components/enterprise/connectors/core/reporting_constants.h
index 02b3038..db830a8 100644
--- a/components/enterprise/connectors/core/reporting_constants.h
+++ b/components/enterprise/connectors/core/reporting_constants.h
@@ -6,9 +6,16 @@
 #define COMPONENTS_ENTERPRISE_CONNECTORS_CORE_REPORTING_CONSTANTS_H_
 
 #include <array>
+#include <string_view>
+
+#include "base/containers/fixed_flat_map.h"
+#include "components/enterprise/common/proto/synced_from_google3/chrome_reporting_entity.pb.h"
 
 namespace enterprise_connectors {
 
+// Alias to reduce verbosity when using Event::EventCase.
+using EventCase = ::chrome::cros::reporting::proto::Event::EventCase;
+
 inline constexpr char kExtensionInstallEvent[] = "browserExtensionInstallEvent";
 inline constexpr char kExtensionTelemetryEvent[] = "extensionTelemetryEvent";
 inline constexpr char kBrowserCrashEvent[] = "browserCrashEvent";
@@ -39,6 +46,83 @@
     kBrowserCrashEvent,
 };
 
+inline constexpr char kAllUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.All.UploadSize";
+inline constexpr char kPasswordReuseUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.PasswordReuse.UploadSize";
+inline constexpr char kPasswordChangedUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.PasswordChanged.UploadSize";
+inline constexpr char kDangerousDownloadUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.DangerousDownload.UploadSize";
+inline constexpr char kInterstitialUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.Interstitial.UploadSize";
+inline constexpr char kSensitiveDataUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.SensitiveData.UploadSize";
+inline constexpr char kUnscannedFileUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.UnscannedFile.UploadSize";
+inline constexpr char kLoginUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.Login.UploadSize";
+inline constexpr char kPasswordBreachUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.PasswordBreach.UploadSize";
+inline constexpr char kUrlFilteringInterstitialUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.UrlFilteringInterstitial.UploadSize";
+inline constexpr char kExtensionInstallUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.BrowserExtensionInstallEvent.UploadSize";
+inline constexpr char kBrowserCrashUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.BrowserCrash.UploadSize";
+inline constexpr char kExtensionTelemetryUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.ExtensionTelemetry.UploadSize";
+inline constexpr char kUnknownUploadSizeUmaMetricName[] =
+    "Enterprise.ReportingEvent.Unknown.UploadSize";
+
+// Mapping from event name to UMA metric name for the payload size histogram.
+inline constexpr auto kEventNameToUmaUploadSizeMetricNameMap =
+    base::MakeFixedFlatMap<std::string_view, std::string_view>(
+        {{kKeyPasswordReuseEvent, kPasswordReuseUploadSizeUmaMetricName},
+         {kKeyPasswordChangedEvent, kPasswordChangedUploadSizeUmaMetricName},
+         {kKeyDangerousDownloadEvent,
+          kDangerousDownloadUploadSizeUmaMetricName},
+         {kKeyInterstitialEvent, kInterstitialUploadSizeUmaMetricName},
+         {kKeySensitiveDataEvent, kSensitiveDataUploadSizeUmaMetricName},
+         {kKeyUnscannedFileEvent, kUnscannedFileUploadSizeUmaMetricName},
+         {kKeyLoginEvent, kLoginUploadSizeUmaMetricName},
+         {kKeyPasswordBreachEvent, kPasswordBreachUploadSizeUmaMetricName},
+         {kKeyUrlFilteringInterstitialEvent,
+          kUrlFilteringInterstitialUploadSizeUmaMetricName},
+         {kExtensionInstallEvent, kExtensionInstallUploadSizeUmaMetricName},
+         {kBrowserCrashEvent, kBrowserCrashUploadSizeUmaMetricName},
+         {kExtensionTelemetryEvent,
+          kExtensionTelemetryUploadSizeUmaMetricName}});
+
+// Mapping from event case to UMA metric name for the payload size histogram.
+inline constexpr auto kEventCaseToUmaUploadSizeMetricNameMap =
+    base::MakeFixedFlatMap<EventCase, std::string_view>(
+        {{EventCase::kPasswordReuseEvent,
+          kPasswordReuseUploadSizeUmaMetricName},
+         {EventCase::kPasswordChangedEvent,
+          kPasswordChangedUploadSizeUmaMetricName},
+         {EventCase::kDangerousDownloadEvent,
+          kDangerousDownloadUploadSizeUmaMetricName},
+         {EventCase::kInterstitialEvent, kInterstitialUploadSizeUmaMetricName},
+         {EventCase::kSensitiveDataEvent,
+          kSensitiveDataUploadSizeUmaMetricName},
+         {EventCase::kUnscannedFileEvent,
+          kUnscannedFileUploadSizeUmaMetricName},
+         {EventCase::kLoginEvent, kLoginUploadSizeUmaMetricName},
+         {EventCase::kPasswordBreachEvent,
+          kPasswordBreachUploadSizeUmaMetricName},
+         {EventCase::kUrlFilteringInterstitialEvent,
+          kUrlFilteringInterstitialUploadSizeUmaMetricName},
+         {EventCase::kBrowserExtensionInstallEvent,
+          kExtensionInstallUploadSizeUmaMetricName},
+         {EventCase::kBrowserCrashEvent, kBrowserCrashUploadSizeUmaMetricName},
+         {EventCase::kExtensionTelemetryEvent,
+          kExtensionTelemetryUploadSizeUmaMetricName}});
+
+std::string_view GetPayloadSizeUmaMetricName(std::string_view eventName);
+
+std::string_view GetPayloadSizeUmaMetricName(EventCase eventCase);
+
 }  // namespace enterprise_connectors
 
 #endif  // COMPONENTS_ENTERPRISE_CONNECTORS_CORE_REPORTING_CONSTANTS_H_
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
index 9c1cec6..e2e4578 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
@@ -8,6 +8,7 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Features;
+import org.chromium.build.annotations.NullMarked;
 
 /**
  * Java accessor for base/feature_list.h state.
@@ -17,6 +18,7 @@
  *
  */
 @JNINamespace("external_intents")
+@NullMarked
 public class ExternalIntentsFeatures extends Features {
     public static final String EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME = "ExternalNavigationDebugLogs";
     public static final String BLOCK_FRAME_RENAVIGATIONS_NAME = "BlockFrameRenavigations3";
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsSwitches.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsSwitches.java
index ffa0fbbe..fcf4253a 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsSwitches.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsSwitches.java
@@ -4,7 +4,10 @@
 
 package org.chromium.components.external_intents;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Contains all of the command line switches for external intent launching. */
+@NullMarked
 public abstract class ExternalIntentsSwitches {
     /** Never forward URL requests to external intents. */
     public static final String DISABLE_EXTERNAL_INTENT_REQUESTS =
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationDelegate.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationDelegate.java
index bad58c8..0919185 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationDelegate.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationDelegate.java
@@ -8,10 +8,10 @@
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
 
-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.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.GURL;
@@ -19,6 +19,7 @@
 import java.util.List;
 
 /** A delegate for {@link ExternalNavigationHandler}. */
+@NullMarked
 public interface ExternalNavigationDelegate {
     /**
      * Returns the Context with which this delegate is associated, or null if there is no such
@@ -131,8 +132,7 @@
      * Returns the scheme (or null) used by web pages to start up the browser (Chrome Stable for
      * Chrome) without an explicit Intent.
      */
-    @Nullable
-    String getSelfScheme();
+    @Nullable String getSelfScheme();
 
     /** Returns whether all the external intents are supposed to be disabled per embedder. */
     boolean shouldDisableAllExternalIntents();
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
index 8ac56f4..4c6296b 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.external_intents;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Context;
@@ -28,8 +30,6 @@
 import android.webkit.WebView;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.CommandLine;
@@ -43,6 +43,8 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.embedder_support.util.UrlUtilitiesJni;
@@ -85,6 +87,7 @@
  * This feature supports conversion of certain navigations to Android Intents allowing
  * applications like Youtube to direct users clicking on a http(s) link to their native app.
  */
+@NullMarked
 public class ExternalNavigationHandler {
     private static final String TAG = "UrlHandler";
 
@@ -144,28 +147,27 @@
 
     // Helper class to return a boolean by reference.
     private static class MutableBoolean {
-        private Boolean mValue;
+        private @Nullable Boolean mValue;
 
         public void set(boolean value) {
             mValue = value;
         }
 
-        public Boolean get() {
+        public @Nullable Boolean get() {
             return mValue;
         }
     }
 
     // A Supplier that only evaluates when needed then caches the value.
     protected static class LazySupplier<T> implements Supplier<T> {
-        private T mValue;
-        private Supplier<T> mInnerSupplier;
+        private @Nullable T mValue;
+        private @Nullable Supplier<T> mInnerSupplier;
 
         public LazySupplier(Supplier<T> innerSupplier) {
             assert innerSupplier != null : "innerSupplier cannot be null";
             mInnerSupplier = innerSupplier;
         }
 
-        @Nullable
         @Override
         public T get() {
             if (mInnerSupplier != null) {
@@ -175,7 +177,7 @@
                 // references it may have held.
                 mInnerSupplier = null;
             }
-            return mValue;
+            return assumeNonNull(mValue);
         }
 
         @Override
@@ -186,7 +188,7 @@
 
     private static class IntentBasedSupplier<T> extends LazySupplier<T> {
         protected final Intent mIntent;
-        private Intent mIntentCopy;
+        private @Nullable Intent mIntentCopy;
 
         public IntentBasedSupplier(Intent intent, Supplier<T> innerSupplier) {
             super(innerSupplier);
@@ -204,7 +206,6 @@
             }
         }
 
-        @Nullable
         @Override
         public T get() {
             assertIntentMatches();
@@ -224,13 +225,10 @@
         // with multiple results chosen.
         private final AtomicBoolean mDialogResultChosen = new AtomicBoolean(false);
 
-        private PropertyModel mPropertyModel;
+        private @Nullable PropertyModel mPropertyModel;
 
         IncognitoDialogDelegate(
-                @NonNull Context context,
-                @NonNull ExternalNavigationParams params,
-                @NonNull Intent intent,
-                @NonNull GURL fallbackUrl) {
+                Context context, ExternalNavigationParams params, Intent intent, GURL fallbackUrl) {
             mContext = context;
             mParams = params;
             mIntent = intent;
@@ -239,7 +237,7 @@
 
         @Override
         public void onClick(
-                @NonNull PropertyModel model, @ModalDialogProperties.ButtonType int buttonType) {
+                @Nullable PropertyModel model, @ModalDialogProperties.ButtonType int buttonType) {
             if (ModalDialogProperties.ButtonType.POSITIVE == buttonType) {
                 if (mDialogResultChosen.get()) return;
                 mDialogResultChosen.set(true);
@@ -428,8 +426,8 @@
 
         boolean mWasExternalFallbackUrlLaunch;
 
-        GURL mTargetUrl;
-        ExternalNavigationParams mExternalNavigationParams;
+        @Nullable GURL mTargetUrl;
+        @Nullable ExternalNavigationParams mExternalNavigationParams;
 
         private OverrideUrlLoadingResult(@OverrideUrlLoadingResultType int resultType) {
             this(resultType, false);
@@ -461,12 +459,12 @@
 
         public GURL getTargetUrl() {
             assert mResultType == OverrideUrlLoadingResultType.OVERRIDE_WITH_NAVIGATE_TAB;
-            return mTargetUrl;
+            return assumeNonNull(mTargetUrl);
         }
 
         public ExternalNavigationParams getExternalNavigationParams() {
             assert mResultType == OverrideUrlLoadingResultType.OVERRIDE_WITH_NAVIGATE_TAB;
-            return mExternalNavigationParams;
+            return assumeNonNull(mExternalNavigationParams);
         }
 
         /**
@@ -520,7 +518,7 @@
     public static boolean sAllowIntentsToSelfForTesting;
     private final ExternalNavigationDelegate mDelegate;
     private final ModalDialogManager mModalDialogManager;
-    @VisibleForTesting protected IncognitoDialogDelegate mIncognitoDialogDelegate;
+    @VisibleForTesting protected @Nullable IncognitoDialogDelegate mIncognitoDialogDelegate;
 
     /**
      * Constructs a new instance of {@link ExternalNavigationHandler}, using the injected {@link
@@ -528,7 +526,7 @@
      */
     public ExternalNavigationHandler(ExternalNavigationDelegate delegate) {
         mDelegate = delegate;
-        mModalDialogManager = mDelegate.getWindowAndroid().getModalDialogManager();
+        mModalDialogManager = assumeNonNull(mDelegate.getWindowAndroid().getModalDialogManager());
     }
 
     private static boolean debug() {
@@ -665,7 +663,8 @@
         Log.i(TAG, "shouldOverrideUrlLoading result: " + resultString);
     }
 
-    private boolean resolversSubsetOf(List<ResolveInfo> infos, List<ResolveInfo> container) {
+    private boolean resolversSubsetOf(
+            List<ResolveInfo> infos, @Nullable List<ResolveInfo> container) {
         if (container == null) return false;
         HashSet<ComponentName> containerSet = new HashSet<>();
         for (ResolveInfo info : container) {
@@ -874,7 +873,7 @@
         return false;
     }
 
-    private static boolean isInternalScheme(String scheme) {
+    private static boolean isInternalScheme(@Nullable String scheme) {
         if (TextUtils.isEmpty(scheme)) return false;
         return scheme.equals(ContentUrlConstants.ABOUT_SCHEME)
                 || scheme.equals(UrlConstants.CHROME_SCHEME)
@@ -1823,8 +1822,8 @@
      *     NO_OVERRIDE otherwise.
      */
     private OverrideUrlLoadingResult sendIntentToMarket(
-            String packageName,
-            String marketReferrer,
+            @Nullable String packageName,
+            @Nullable String marketReferrer,
             ExternalNavigationParams params,
             GURL fallbackUrl) {
         Uri.Builder builder = new Uri.Builder().scheme("market").authority("details");
@@ -1880,7 +1879,7 @@
      * If the given URL is to Google Play, extracts the package name and referrer tracking code from
      * the {@param url} and returns as a Pair in that order. Otherwise returns null.
      */
-    private String maybeGetPlayStoreAppId(GURL url) {
+    private @Nullable String maybeGetPlayStoreAppId(GURL url) {
         if (!PLAY_HOSTNAME.equals(url.getHost()) || !url.getPath().startsWith(PLAY_APP_PATH)) {
             return null;
         }
@@ -1915,7 +1914,7 @@
      *
      * @param resolvingComponentNames The list of ComponentName that resolves the current intent.
      */
-    private String getDefaultSmsPackageName(List<ResolveInfo> resolvingComponentNames) {
+    private @Nullable String getDefaultSmsPackageName(List<ResolveInfo> resolvingComponentNames) {
         String defaultSmsPackageName = getDefaultSmsPackageNameFromSystem();
         if (defaultSmsPackageName == null) return null;
         // Makes sure that the default SMS app actually resolves the intent.
@@ -1961,8 +1960,7 @@
         return resolvingInfos.get();
     }
 
-    @Nullable
-    private String pickWebApkIfSoleIntentHandler(
+    private @Nullable String pickWebApkIfSoleIntentHandler(
             ExternalNavigationParams params, QueryIntentActivitiesSupplier resolvingInfos) {
         ArrayList<String> packages =
                 getSpecializedHandlers(getResolveInfosForWebApks(params, resolvingInfos));
@@ -1977,7 +1975,6 @@
     }
 
     /** See {@link PackageManagerUtils#queryIntentActivities(Intent, int)} */
-    @NonNull
     private List<ResolveInfo> queryIntentActivities(Intent intent) {
         return PackageManagerUtils.queryIntentActivities(
                 intent, PackageManager.GET_RESOLVED_FILTER | PackageManager.MATCH_DEFAULT_ONLY);
@@ -1986,7 +1983,7 @@
     private static boolean intentResolutionMatches(Intent intent, Intent other) {
         return intent.filterEquals(other)
                 && (intent.getSelector() == other.getSelector()
-                        || intent.getSelector().filterEquals(other.getSelector()));
+                        || assumeNonNull(intent.getSelector()).filterEquals(other.getSelector()));
     }
 
     /** @return Whether the URL is a file download. */
@@ -2102,10 +2099,10 @@
             Intent intent,
             ExternalNavigationParams params,
             boolean requiresIntentChooser,
-            QueryIntentActivitiesSupplier resolvingInfos,
-            ResolveActivitySupplier resolveActivity,
-            GURL browserFallbackUrl,
-            GURL intentTargetUrl) {
+            @Nullable QueryIntentActivitiesSupplier resolvingInfos,
+            @Nullable ResolveActivitySupplier resolveActivity,
+            @Nullable GURL browserFallbackUrl,
+            @Nullable GURL intentTargetUrl) {
         // https://crbug.com/330555390. If we've launched an app on the current redirect chain, we
         // should never launch a second one.
         if (params.getRedirectHandler().isOnNavigation()) {
@@ -2122,6 +2119,8 @@
                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             }
             if (requiresIntentChooser) {
+                assumeNonNull(resolvingInfos);
+                assumeNonNull(resolveActivity);
                 return startActivityWithChooser(
                         intent,
                         resolvingInfos,
@@ -2164,7 +2163,7 @@
     // If the |resolvingInfos| from queryIntentActivities don't contain the result of
     // resolveActivity, it means the intent is resolving to the ResolverActivity.
     private boolean resolvesToChooser(
-            @NonNull ResolveInfo resolveActivity, QueryIntentActivitiesSupplier resolvingInfos) {
+            ResolveInfo resolveActivity, QueryIntentActivitiesSupplier resolvingInfos) {
         return !resolversSubsetOf(Arrays.asList(resolveActivity), resolvingInfos.get());
     }
 
@@ -2174,8 +2173,8 @@
             final Intent intent,
             QueryIntentActivitiesSupplier resolvingInfos,
             ResolveActivitySupplier resolveActivity,
-            GURL browserFallbackUrl,
-            GURL intentTargetUrl,
+            @Nullable GURL browserFallbackUrl,
+            @Nullable GURL intentTargetUrl,
             final ExternalNavigationParams params,
             Context context) {
         ResolveInfo intentResolveInfo = resolveActivity.get();
@@ -2248,7 +2247,8 @@
 
                                 // Quirk of how we use the ActivityChooser - if the embedding app is
                                 // chosen we get an intent back with ACTION_CREATE_SHORTCUT.
-                                if (data.getAction().equals(Intent.ACTION_CREATE_SHORTCUT)) {
+                                if (assumeNonNull(data.getAction())
+                                        .equals(Intent.ACTION_CREATE_SHORTCUT)) {
                                     // Ensure we don't loop asking the user to choose an app, then
                                     // re-asking when we navigate to the same URL.
                                     if (params.getRedirectHandler().isOnNavigation()) {
@@ -2267,7 +2267,7 @@
                                         callback.onResult(
                                                 AsyncActionTakenParams.forNavigate(
                                                         intentTargetUrl, params));
-                                    } else if (!browserFallbackUrl.isEmpty()) {
+                                    } else if (!assumeNonNull(browserFallbackUrl).isEmpty()) {
                                         callback.onResult(
                                                 AsyncActionTakenParams.forNavigate(
                                                         browserFallbackUrl, params));
@@ -2281,7 +2281,8 @@
                                 // start it. Note that a selector cannot be set at the same time
                                 // as a package.
                                 intent.setSelector(null);
-                                intent.setPackage(data.getComponent().getPackageName());
+                                intent.setPackage(
+                                        assumeNonNull(data.getComponent()).getPackageName());
                                 startActivity(intent, params);
                                 callback.onResult(
                                         AsyncActionTakenParams.forExternalIntentLaunched(
@@ -2401,12 +2402,12 @@
     }
 
     /** Returns the subset of {@params infos} that are specialized intent handlers. */
-    private ArrayList<String> getSpecializedHandlers(List<ResolveInfo> infos) {
+    private ArrayList<String> getSpecializedHandlers(@Nullable List<ResolveInfo> infos) {
         return getSpecializedHandlersWithFilter(infos, null);
     }
 
     private static boolean matchResolveInfoExceptWildCardHost(
-            ResolveInfo info, String filterPackageName) {
+            ResolveInfo info, @Nullable String filterPackageName) {
         IntentFilter intentFilter = info.filter;
         if (intentFilter == null) {
             // Error on the side of classifying ResolveInfo as generic.
@@ -2450,7 +2451,7 @@
     }
 
     public static ArrayList<String> getSpecializedHandlersWithFilter(
-            List<ResolveInfo> infos, String filterPackageName) {
+            @Nullable List<ResolveInfo> infos, @Nullable String filterPackageName) {
         ArrayList<String> result = new ArrayList<>();
         if (infos == null) {
             return result;
@@ -2507,7 +2508,7 @@
 
     /** @return The last committed URL from the WebContents. */
     @VisibleForTesting
-    protected GURL getLastCommittedUrl() {
+    protected @Nullable GURL getLastCommittedUrl() {
         if (mDelegate.getWebContents() == null) return null;
         return mDelegate.getWebContents().getLastCommittedUrl();
     }
@@ -2570,7 +2571,7 @@
      * @return The string with the scheme and prefixes chopped off, if a valid prefix was used.
      *         Otherwise returns null.
      */
-    public static String getUrlFromSelfSchemeUrl(String selfScheme, String url) {
+    public static @Nullable String getUrlFromSelfSchemeUrl(String selfScheme, String url) {
         String prefix = selfScheme + SELF_SCHEME_NAVIGATE_PREFIX;
         if (url.toLowerCase(Locale.US).startsWith(prefix)) {
             String parsedUrl = url.substring(prefix.length());
@@ -2593,7 +2594,7 @@
      * "j$a$r". See: http://crbug.com/248398
      * @return The sanitized URL scheme or null if no scheme is specified.
      */
-    public static String getSanitizedUrlScheme(String url) {
+    public static @Nullable String getSanitizedUrlScheme(String url) {
         if (url == null) {
             return null;
         }
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java
index ad85034..05cab31 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java
@@ -4,12 +4,14 @@
 
 package org.chromium.components.external_intents;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
 import org.chromium.base.RequiredCallback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.PageTransition;
 import org.chromium.url.GURL;
 import org.chromium.url.Origin;
@@ -18,6 +20,7 @@
 import java.lang.annotation.RetentionPolicy;
 
 /** A container object for passing navigation parameters to {@link ExternalNavigationHandler}. */
+@NullMarked
 public class ExternalNavigationParams {
     /** A container for parameters passed to the AsyncActionTakenCallback. */
     public static class AsyncActionTakenParams {
@@ -41,15 +44,16 @@
         // Whether the async action taken allows the tab to be closed.
         public boolean canCloseTab;
 
+        @SuppressWarnings("NullAway.Init")
         public ExternalNavigationParams externalNavigationParams;
 
-        public GURL targetUrl;
+        public @Nullable GURL targetUrl;
 
         private AsyncActionTakenParams() {
             this.actionType = AsyncActionTakenType.NO_ACTION;
         }
 
-        private AsyncActionTakenParams(GURL targetUrl, ExternalNavigationParams params) {
+        private AsyncActionTakenParams(@Nullable GURL targetUrl, ExternalNavigationParams params) {
             this.actionType = AsyncActionTakenType.NAVIGATE;
             this.targetUrl = targetUrl;
             this.externalNavigationParams = params;
@@ -66,7 +70,7 @@
         }
 
         public static AsyncActionTakenParams forNavigate(
-                GURL targetUrl, ExternalNavigationParams params) {
+                @Nullable GURL targetUrl, ExternalNavigationParams params) {
             return new AsyncActionTakenParams(targetUrl, params);
         }
 
@@ -86,33 +90,33 @@
     private final boolean mOpenInNewTab;
     private final boolean mIsBackgroundTabNavigation;
     private final boolean mIsMainFrame;
-    private final String mNativeClientPackageName;
+    private final @Nullable String mNativeClientPackageName;
     private final boolean mHasUserGesture;
     private final boolean mIsInitialNavigationInFrame;
     private final boolean mIsHiddenCrossFrameNavigation;
     private final boolean mIsSandboxedMainFrame;
-    private final Callback<AsyncActionTakenParams> mAsyncActionTakenCallback;
+    private final @Nullable Callback<AsyncActionTakenParams> mAsyncActionTakenCallback;
     private boolean mIsRendererInitiated;
-    private Origin mInitiatorOrigin;
+    private @Nullable Origin mInitiatorOrigin;
     private final long mNavigationId;
 
     // Populated when an async action is taken, ensuring the callback gets called.
-    private RequiredCallback<AsyncActionTakenParams> mRequiredAsyncActionTakenCallback;
+    private @Nullable RequiredCallback<AsyncActionTakenParams> mRequiredAsyncActionTakenCallback;
 
     private ExternalNavigationParams(
-            @NonNull GURL url,
+            GURL url,
             boolean isIncognito,
-            GURL referrerUrl,
+            @Nullable GURL referrerUrl,
             int pageTransition,
             boolean isRedirect,
             boolean appMustBeInForeground,
-            @NonNull RedirectHandler redirectHandler,
+            RedirectHandler redirectHandler,
             boolean openInNewTab,
             boolean isBackgroundTabNavigation,
             boolean isMainFrame,
-            String nativeClientPackageName,
+            @Nullable String nativeClientPackageName,
             boolean hasUserGesture,
-            Callback<AsyncActionTakenParams> asyncActionTakenCallback,
+            @Nullable Callback<AsyncActionTakenParams> asyncActionTakenCallback,
             boolean isRendererInitiated,
             @Nullable Origin initiatorOrigin,
             boolean isInitialNavigationInFrame,
@@ -147,7 +151,7 @@
     }
 
     /** @return The URL to potentially open externally. */
-    public @NonNull GURL getUrl() {
+    public GURL getUrl() {
         return mUrl;
     }
 
@@ -157,7 +161,7 @@
     }
 
     /** @return The referrer URL. */
-    public @NonNull GURL getReferrerUrl() {
+    public GURL getReferrerUrl() {
         return mReferrerUrl;
     }
 
@@ -177,7 +181,7 @@
     }
 
     /** @return The redirect handler. */
-    public @NonNull RedirectHandler getRedirectHandler() {
+    public RedirectHandler getRedirectHandler() {
         return mRedirectHandler;
     }
 
@@ -205,7 +209,7 @@
      * @return The package name of the TWA or WebAPK within which the navigation is happening.
      *         Null if the navigation is not within one of these wrapping APKs.
      */
-    public String nativeClientPackageName() {
+    public @Nullable String nativeClientPackageName() {
         return mNativeClientPackageName;
     }
 
@@ -215,7 +219,8 @@
     }
 
     /** @return A callback to be run when an async action is taken. */
-    public RequiredCallback<AsyncActionTakenParams> getRequiredAsyncActionTakenCallback() {
+    public @Nullable
+            RequiredCallback<AsyncActionTakenParams> getRequiredAsyncActionTakenCallback() {
         return mRequiredAsyncActionTakenCallback;
     }
 
@@ -225,8 +230,7 @@
     }
 
     /** @return The origin that initiates the navigation. */
-    @Nullable
-    public Origin getInitiatorOrigin() {
+    public @Nullable Origin getInitiatorOrigin() {
         return mInitiatorOrigin;
     }
 
@@ -261,19 +265,19 @@
     public static class Builder {
         private GURL mUrl;
         private boolean mIsIncognito;
-        private GURL mReferrerUrl;
+        private @Nullable GURL mReferrerUrl;
         private int mPageTransition;
         private boolean mIsRedirect;
         private boolean mApplicationMustBeInForeground;
-        private RedirectHandler mRedirectHandler;
+        private @Nullable RedirectHandler mRedirectHandler;
         private boolean mOpenInNewTab;
         private boolean mIsBackgroundTabNavigation;
         private boolean mIsMainFrame;
-        private String mNativeClientPackageName;
+        private @Nullable String mNativeClientPackageName;
         private boolean mHasUserGesture;
-        private Callback<AsyncActionTakenParams> mAsyncActionTakenCallback;
+        private @Nullable Callback<AsyncActionTakenParams> mAsyncActionTakenCallback;
         private boolean mIsRendererInitiated;
-        private Origin mInitiatorOrigin;
+        private @Nullable Origin mInitiatorOrigin;
         private boolean mIsInitialNavigationInFrame;
         private boolean mIsHiddenCrossFrameNavigation;
         private boolean mIsSandboxedMainFrame;
@@ -391,7 +395,7 @@
                     mPageTransition,
                     mIsRedirect,
                     mApplicationMustBeInForeground,
-                    mRedirectHandler,
+                    assertNonNull(mRedirectHandler),
                     mOpenInNewTab,
                     mIsBackgroundTabNavigation,
                     mIsMainFrame,
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
index 844895d..9d661d3 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
@@ -6,6 +6,7 @@
 
 import android.app.Activity;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
 
@@ -13,6 +14,7 @@
  * An interface via which the embedder provides the context information that
  * InterceptNavigationDelegateImpl needs.
  */
+@NullMarked
 public interface InterceptNavigationDelegateClient {
     /* Returns the WebContents in the context of which this InterceptNavigationDelegateImpl instance
      * is operating. */
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
index 220299a..733ac1d7c 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.external_intents;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.util.Pair;
 
 import androidx.annotation.IntDef;
@@ -20,6 +22,8 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
 import org.chromium.blink.mojom.WebFeature;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult;
 import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResultType;
@@ -50,6 +54,7 @@
  * done in an asynchronous fashion to avoid it. See https://crbug.com/732260.
  */
 @JNINamespace("external_intents")
+@NullMarked
 public class InterceptNavigationDelegateImpl extends InterceptNavigationDelegate {
     /**
      * Histogram for the source of a main frame intent launch. This enum is used in UMA, do not
@@ -118,18 +123,24 @@
     private static final long DEFER_NAVIGATION_TIMEOUT_MILLIS = 5000;
 
     private InterceptNavigationDelegateClient mClient;
-    private static Callback<Pair<GURL, OverrideUrlLoadingResult>> sResultCallbackForTesting;
+    private static @Nullable Callback<Pair<GURL, OverrideUrlLoadingResult>>
+            sResultCallbackForTesting;
+
+    @SuppressWarnings("NullAway.Init")
     private WebContents mWebContents;
+
+    @SuppressWarnings("NullAway.Init")
     private ExternalNavigationHandler mExternalNavHandler;
-    private WebContentsObserver mWebContentsObserver;
+
+    private @Nullable WebContentsObserver mWebContentsObserver;
 
     /** Whether forward history should be cleared after navigation is committed. */
     private boolean mClearAllForwardHistoryRequired;
 
     private boolean mShouldClearRedirectHistoryForTabClobbering;
 
-    private CancelableRunnable mPendingShouldIgnore;
-    private RequiredCallback<Boolean> mShouldIgnoreResultCallback;
+    private @Nullable CancelableRunnable mPendingShouldIgnore;
+    private @Nullable RequiredCallback<Boolean> mShouldIgnoreResultCallback;
     private boolean mHasAttachedToActivity;
     private boolean mTimedOutWaitingForActivity;
 
@@ -171,7 +182,7 @@
         cancelPendingShouldIgnoreCheck();
 
         if (mWebContents != null) {
-            mWebContentsObserver.observe(null);
+            assumeNonNull(mWebContentsObserver).observe(null);
             mWebContentsObserver = null;
         }
         mWebContents = webContents;
@@ -264,7 +275,7 @@
                         shouldRunAsync);
         if (!shouldRunAsync) {
             onMainFrameShouldIgnoreNavigationResult(
-                    result, escapedUrl, navigationHandle.isExternalProtocol());
+                    assumeNonNull(result), escapedUrl, navigationHandle.isExternalProtocol());
         }
     }
 
@@ -317,12 +328,12 @@
     }
 
     private void runResultCallback(boolean shouldIgnore) {
-        mShouldIgnoreResultCallback.onResult(shouldIgnore);
+        assumeNonNull(mShouldIgnoreResultCallback).onResult(shouldIgnore);
         mShouldIgnoreResultCallback = null;
     }
 
     @Override
-    public GURL handleSubframeExternalProtocol(
+    public @Nullable GURL handleSubframeExternalProtocol(
             GURL escapedUrl,
             @PageTransition int transition,
             boolean hasUserGesture,
@@ -368,7 +379,7 @@
                         /* navigationId= */ -1,
                         /* shouldRunAsync= */ false);
 
-        switch (result.getResultType()) {
+        switch (assumeNonNull(result).getResultType()) {
             case OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT:
                 return null;
             case OverrideUrlLoadingResultType.OVERRIDE_WITH_NAVIGATE_TAB:
@@ -384,7 +395,7 @@
         }
     }
 
-    private OverrideUrlLoadingResult shouldOverrideUrlLoading(
+    private @Nullable OverrideUrlLoadingResult shouldOverrideUrlLoading(
             RedirectHandler redirectHandler,
             GURL escapedUrl,
             @PageTransition int pageTransition,
@@ -393,7 +404,7 @@
             boolean isRendererInitiated,
             GURL referrerUrl,
             boolean isInPrimaryMainFrame,
-            Origin initiatorOrigin,
+            @Nullable Origin initiatorOrigin,
             boolean isExternalProtocol,
             Callback<AsyncActionTakenParams> asyncActionTakenCallback,
             boolean hiddenCrossFrame,
@@ -541,12 +552,13 @@
      */
     public void maybeUpdateNavigationHistory() {
         WebContents webContents = mClient.getWebContents();
+        NavigationController navigationController = webContents.getNavigationController();
+        assumeNonNull(navigationController);
         if (mClearAllForwardHistoryRequired && webContents != null) {
-            webContents.getNavigationController().pruneForwardEntries();
+            navigationController.pruneForwardEntries();
         } else if (mShouldClearRedirectHistoryForTabClobbering && webContents != null) {
             // http://crbug/479056: Even if we clobber the current tab, we want to remove
             // redirect history to be consistent.
-            NavigationController navigationController = webContents.getNavigationController();
             int indexBeforeRedirection =
                     mClient.getOrCreateRedirectHandler()
                             .getLastCommittedEntryIndexBeforeStartingNavigation();
@@ -562,12 +574,14 @@
 
     private int getLastCommittedEntryIndex() {
         if (mClient.getWebContents() == null) return -1;
-        return mClient.getWebContents().getNavigationController().getLastCommittedEntryIndex();
+        return assumeNonNull(mClient.getWebContents().getNavigationController())
+                .getLastCommittedEntryIndex();
     }
 
     private boolean isInitialNavigation() {
         if (mClient.getWebContents() == null) return true;
-        return mClient.getWebContents().getNavigationController().isInitialNavigation();
+        return assumeNonNull(mClient.getWebContents().getNavigationController())
+                .isInitialNavigation();
     }
 
     private boolean isTabOnInitialNavigationChain() {
@@ -586,7 +600,7 @@
     private void onDidAsyncActionInMainFrame(AsyncActionTakenParams params) {
         switch (params.actionType) {
             case AsyncActionTakenParams.AsyncActionTakenType.NAVIGATE:
-                clobberMainFrame(params.targetUrl, params.externalNavigationParams);
+                clobberMainFrame(assumeNonNull(params.targetUrl), params.externalNavigationParams);
                 break;
             case AsyncActionTakenParams.AsyncActionTakenType.EXTERNAL_INTENT_LAUNCHED:
                 onDidFinishMainFrameIntentLaunch(
@@ -688,8 +702,7 @@
                         // index which was saved before this navigation, and remove the empty
                         // entries from the navigation history.
                         mClearAllForwardHistoryRequired = true;
-                        mClient.getWebContents()
-                                .getNavigationController()
+                        assumeNonNull(mClient.getWebContents().getNavigationController())
                                 .goToNavigationIndex(lastCommittedEntryIndexBeforeNavigation);
                     }
                 });
@@ -754,6 +767,6 @@
                 InterceptNavigationDelegateImpl nativeInterceptNavigationDelegateImpl,
                 WebContents webContents);
 
-        void onSubframeAsyncActionTaken(WebContents webContents, GURL url);
+        void onSubframeAsyncActionTaken(WebContents webContents, @Nullable GURL url);
     }
 }
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java
index ae98ea6..548bcf4 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.external_intents;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
@@ -15,6 +17,10 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
+import org.chromium.build.annotations.EnsuresNonNull;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.build.annotations.RequiresNonNull;
 import org.chromium.ui.base.PageTransition;
 
 import java.util.HashSet;
@@ -22,6 +28,7 @@
 import java.util.function.Function;
 
 /** This class contains the logic to determine effective navigation/redirect. */
+@NullMarked
 public class RedirectHandler {
     private static final String TAG = "RedirectHandler";
 
@@ -103,9 +110,9 @@
         }
     }
 
-    private IntentState mIntentState;
+    private @Nullable IntentState mIntentState;
     private boolean mIsPrefetchLoadForIntent;
-    private NavigationChainState mNavigationChainState;
+    private @Nullable NavigationChainState mNavigationChainState;
 
     // Not part of NavigationChainState as this should persist through resetting of the
     // NavigationChain so that the history state can be correctly set even after the tab is hidden.
@@ -174,7 +181,8 @@
      * occurs.
      */
     public void setShouldNotOverrideUrlLoadingOnCurrentRedirectChain() {
-        mNavigationChainState.mShouldNotOverrideUrlLoadingOnCurrentNavigationChain = true;
+        assumeNonNull(mNavigationChainState).mShouldNotOverrideUrlLoadingOnCurrentNavigationChain =
+                true;
     }
 
     /**
@@ -228,10 +236,12 @@
         if (isBackOrForward) mNavigationChainState.mUsedBackOrForward = true;
     }
 
+    @RequiresNonNull({"mNavigationChainState"})
     private void updateNavigationChainState() {
         mNavigationChainState.mIsOnFirstLoadInChain = false;
     }
 
+    @EnsuresNonNull({"mNavigationChainState"})
     private void resetNavigationChainState(
             int pageTransType,
             boolean hasUserGesture,
@@ -269,12 +279,14 @@
      *         navigation (eg. has followed a client or server redirect).
      */
     public boolean isOnNoninitialLoadForIntentNavigationChain() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mInitialNavigationState.isFromIntent
                 && !mNavigationChainState.mIsOnFirstLoadInChain;
     }
 
     /** @return whether we're on the first load in the current navigation chain. */
     public boolean isOnFirstLoadInNavigationChain() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mIsOnFirstLoadInChain;
     }
 
@@ -285,11 +297,13 @@
 
     /** @return whether navigation is from a user's typing or not. */
     public boolean isNavigationFromUserTyping() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mInitialNavigationState.isFromTyping;
     }
 
     /** @return whether we should stay in Chrome or not. */
     public boolean shouldNotOverrideUrlLoading() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mShouldNotOverrideUrlLoadingOnCurrentNavigationChain;
     }
 
@@ -335,7 +349,7 @@
     }
 
     /** @return The initial intent of the navigation chain, if available. */
-    public Intent getInitialIntent() {
+    public @Nullable Intent getInitialIntent() {
         return mIntentState != null ? mIntentState.mInitialIntent : null;
     }
 
@@ -345,15 +359,18 @@
      * the user was started.
      */
     public boolean isNavigationChainExpired() {
+        assumeNonNull(mNavigationChainState);
         return currentRealtime() - mNavigationChainState.mNavigationChainStartTime
                 > NAVIGATION_CHAIN_TIMEOUT_MILLIS;
     }
 
     public boolean navigationChainUsedBackOrForward() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mUsedBackOrForward;
     }
 
     public InitialNavigationState getInitialNavigationState() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mInitialNavigationState;
     }
 
@@ -362,10 +379,12 @@
     }
 
     public void setPerformedHiddenCrossFrameNavigation() {
+        assumeNonNull(mNavigationChainState);
         mNavigationChainState.mPerformedHiddenCrossFrameNavigation = true;
     }
 
     public boolean navigationChainPerformedHiddenCrossFrameNavigation() {
+        assumeNonNull(mNavigationChainState);
         return mNavigationChainState.mPerformedHiddenCrossFrameNavigation;
     }
 
diff --git a/components/feature_engagement/public/event_constants.cc b/components/feature_engagement/public/event_constants.cc
index 1e21d40..fbd7e6b 100644
--- a/components/feature_engagement/public/event_constants.cc
+++ b/components/feature_engagement/public/event_constants.cc
@@ -101,6 +101,8 @@
 const char kIOSPullToRefreshIPHDismissButtonTapped[] =
     "pull_to_refresh_feature_iph_dismiss_button_tapped";
 const char kIOSIncognitoPageControlTapped[] = "incognito_page_control_tapped";
+const char kIOSSigninFullscreenPromoTrigger[] =
+    "signin_fullscreen_promo_trigger";
 const char kIOSSwipeRightForIncognitoUsed[] = "swipe_right_for_incognito_used";
 const char kIOSSwipeRightForIncognitoIPHDismissButtonTapped[] =
     "swipe_right_for_incognito_iph_dismiss_button_tapped";
diff --git a/components/feature_engagement/public/event_constants.h b/components/feature_engagement/public/event_constants.h
index 670cba3..1e6b5b7 100644
--- a/components/feature_engagement/public/event_constants.h
+++ b/components/feature_engagement/public/event_constants.h
@@ -184,6 +184,9 @@
 // The user has tapped "incognito" on the page control in the tab grid.
 extern const char kIOSIncognitoPageControlTapped[];
 
+// The sign-in fullscreen promo was triggered.
+extern const char kIOSSigninFullscreenPromoTrigger[];
+
 // The user has swiped right from regular tab grid to the incognito tab grid.
 extern const char kIOSSwipeRightForIncognitoUsed[];
 
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 329a235..16338534 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -235,7 +235,7 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHAndroidTabDeclutter,
              "IPH_AndroidTabDeclutter",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHAdaptiveButtonInTopToolbarCustomizationNewTabFeature,
              "IPH_AdaptiveButtonInTopToolbarCustomization_NewTab",
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -563,6 +563,9 @@
 BASE_FEATURE(kIPHiOSPromoWhatsNewFeature,
              "IPH_iOSPromoWhatsNew",
              base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kIPHiOSPromoSigninFullscreenFeature,
+             "IPH_iOSPromoSigninFullscreen",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHiOSPromoPostRestoreFeature,
              "IPH_iOSPromoPostRestore",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index 85761568..d4a8637b 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -242,6 +242,7 @@
 FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSLensKeyboardFeature);
 FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSPromoAppStoreFeature);
 FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSPromoWhatsNewFeature);
+FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSPromoSigninFullscreenFeature);
 FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSPromoPostRestoreFeature);
 FEATURE_CONSTANTS_DECLARE_FEATURE(
     kIPHiOSPromoCredentialProviderExtensionFeature);
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index b528b94..549cf23 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -133,6 +133,7 @@
     &kIPHiOSLensKeyboardFeature,
     &kIPHiOSPromoAppStoreFeature,
     &kIPHiOSPromoWhatsNewFeature,
+    &kIPHiOSPromoSigninFullscreenFeature,
     &kIPHiOSPromoPostRestoreFeature,
     &kIPHiOSPromoCredentialProviderExtensionFeature,
     &kIPHiOSPromoDefaultBrowserReminderFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index 803feb7..287fddc 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -233,6 +233,8 @@
 DEFINE_VARIATION_PARAM(kIPHiOSPromoAppStoreFeature, "IPH_iOSPromoAppStore");
 DEFINE_VARIATION_PARAM(kIPHiOSLensKeyboardFeature, "IPH_iOSLensKeyboard");
 DEFINE_VARIATION_PARAM(kIPHiOSPromoWhatsNewFeature, "IPH_iOSPromoWhatsNew");
+DEFINE_VARIATION_PARAM(kIPHiOSPromoSigninFullscreenFeature,
+                       "IPH_iOSPromoSigninFullscreen");
 DEFINE_VARIATION_PARAM(kIPHiOSPromoPostRestoreFeature,
                        "IPH_iOSPromoPostRestore");
 DEFINE_VARIATION_PARAM(kIPHiOSPromoCredentialProviderExtensionFeature,
diff --git a/components/feature_engagement/public/ios_promo_feature_configuration.cc b/components/feature_engagement/public/ios_promo_feature_configuration.cc
index 073deac..32ee65c 100644
--- a/components/feature_engagement/public/ios_promo_feature_configuration.cc
+++ b/components/feature_engagement/public/ios_promo_feature_configuration.cc
@@ -211,6 +211,22 @@
     return config;
   }
 
+  if (kIPHiOSPromoSigninFullscreenFeature.name == feature->name) {
+    config = FeatureConfig();
+    config->valid = true;
+    config->availability = Comparator(ANY, 0);
+    config->session_rate = Comparator(ANY, 0);
+    config->used =
+        EventConfig("signin_fullscreen_promo_used", Comparator(ANY, 0),
+                    feature_engagement::kMaxStoragePeriod,
+                    feature_engagement::kMaxStoragePeriod);
+    config->trigger = EventConfig(
+        feature_engagement::events::kIOSSigninFullscreenPromoTrigger,
+        Comparator(ANY, 0), feature_engagement::kMaxStoragePeriod,
+        feature_engagement::kMaxStoragePeriod);
+    return config;
+  }
+
   return std::nullopt;
 }
 
diff --git a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindInPageBridge.java b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindInPageBridge.java
index 10c3221b..cd9f17dd 100644
--- a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindInPageBridge.java
+++ b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindInPageBridge.java
@@ -7,10 +7,12 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 
 /** Allows issuing find in page related requests for a given WebContents. */
 @JNINamespace("find_in_page")
+@NullMarked
 public class FindInPageBridge {
     private long mNativeFindInPageBridge;
 
diff --git a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindMatchRectsDetails.java b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindMatchRectsDetails.java
index 53361b8d..6c2fdc25 100644
--- a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindMatchRectsDetails.java
+++ b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindMatchRectsDetails.java
@@ -6,7 +6,10 @@
 
 import android.graphics.RectF;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Holds the result details of a RequestFindMatchRects reply. */
+@NullMarked
 public class FindMatchRectsDetails {
     /** Version of the the rects in this result. */
     public final int version;
diff --git a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindNotificationDetails.java b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindNotificationDetails.java
index 55c78ec..77eb34f 100644
--- a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindNotificationDetails.java
+++ b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindNotificationDetails.java
@@ -6,10 +6,13 @@
 
 import android.graphics.Rect;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Java equivalent to the C++ FindNotificationDetails class
  * defined in components/find_in_page/find_notification_details.h
  */
+@NullMarked
 public class FindNotificationDetails {
     /** How many matches were found. */
     public final int numberOfMatches;
diff --git a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java
index 316df9af..22d9efc0 100644
--- a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java
+++ b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.find_in_page;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
@@ -20,6 +22,8 @@
 import android.widget.FrameLayout;
 
 import org.chromium.base.MathUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.LocalizationUtils;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.interpolators.Interpolators;
@@ -34,6 +38,7 @@
  * The view that shows the positions of the find in page matches and allows scrubbing
  * between the entries.
  */
+@NullMarked
 public class FindResultBar extends View {
     private static final int VISIBILITY_ANIMATION_DURATION_MS = 200;
 
@@ -52,12 +57,12 @@
     private final int mMinGapBetweenStacks;
     private final int mStackedResultHeight;
 
-    private FindInPageBridge mFindInPageBridge;
+    private @Nullable FindInPageBridge mFindInPageBridge;
     private final WindowAndroid mWindowAndroid;
 
     private int mRectsVersion = -1;
     private RectF[] mMatches = new RectF[0];
-    private RectF mActiveMatch;
+    private @Nullable RectF mActiveMatch;
 
     private ArrayList<Tickmark> mTickmarks = new ArrayList<Tickmark>(0);
     private int mBarHeightForWhichTickmarksWereCached = -1;
@@ -171,7 +176,7 @@
     }
 
     /** Setup the tickmarks to draw using the rects of the find results. */
-    public void setMatchRects(int version, RectF[] rects, RectF activeRect) {
+    public void setMatchRects(int version, RectF[] rects, @Nullable RectF activeRect) {
         if (mRectsVersion != version) {
             mRectsVersion = version;
             assert rects != null;
@@ -238,6 +243,7 @@
             // it will activate whatever find result is currently closest to
             // that point (which will usually be the same one).
             mWaitingForActivateAck = true;
+            assumeNonNull(mFindInPageBridge);
             mFindInPageBridge.activateNearestFindResult(
                     mMatches[closest].centerX(), mMatches[closest].centerY());
         }
@@ -249,6 +255,7 @@
         super.onSizeChanged(w, h, oldw, oldh);
         // Check for new rects, as they may move if the document size changes.
         if (!mDismissing && mMatches.length > 0) {
+            assumeNonNull(mFindInPageBridge);
             mFindInPageBridge.requestFindMatchRects(mRectsVersion);
         }
     }
diff --git a/components/input/input_router.h b/components/input/input_router.h
index 28fdd02..f4b8014 100644
--- a/components/input/input_router.h
+++ b/components/input/input_router.h
@@ -38,6 +38,12 @@
 
   virtual ~InputRouter() = default;
 
+  // The input router starts in an inactive state and becomes active when the
+  // browser gets the notification that the renderer has produced content.  All
+  // input events are dropped during the inactive state.
+  bool IsActive() const { return active_; }
+  void MakeActive() { active_ = true; }
+
   // Note: if the event is processed immediately, the supplied callback is run
   // *synchronously*. If |this| is destroyed while waiting on a result from
   // the renderer, then callbacks are *not* run.
@@ -113,6 +119,9 @@
   // OOPIF hit-testing will need to wait until updated CompositorFrames have
   // been submitted to the browser.
   virtual void WaitForInputProcessed(base::OnceClosure callback) = 0;
+
+ private:
+  bool active_ = false;
 };
 
 }  // namespace input
diff --git a/components/input/input_router_impl.cc b/components/input/input_router_impl.cc
index cc952d5..e32531a 100644
--- a/components/input/input_router_impl.cc
+++ b/components/input/input_router_impl.cc
@@ -21,6 +21,7 @@
 #include "components/input/utils.h"
 #include "components/input/web_touch_event_traits.h"
 #include "services/tracing/public/cpp/perfetto/flow_event_utils.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/input/web_coalesced_input_event.h"
 #include "third_party/blink/public/mojom/input/input_event_result.mojom-shared.h"
 #include "third_party/blink/public/mojom/input/input_handler.mojom-shared.h"
@@ -103,7 +104,10 @@
     const MouseEventWithLatencyInfo& mouse_event,
     MouseEventCallback event_result_callback,
     DispatchToRendererCallback& dispatch_callback) {
-  if ((mouse_event.event.GetType() == WebInputEvent::Type::kMouseDown &&
+  if ((!IsActive() &&
+       base::FeatureList::IsEnabled(
+           blink::features::kDropInputEventsWhilePaintHolding)) ||
+      (mouse_event.event.GetType() == WebInputEvent::Type::kMouseDown &&
        gesture_event_queue_.GetTouchpadTapSuppressionController()
            ->ShouldSuppressMouseDown(mouse_event)) ||
       (mouse_event.event.GetType() == WebInputEvent::Type::kMouseUp &&
@@ -125,6 +129,13 @@
 void InputRouterImpl::SendWheelEvent(
     const MouseWheelEventWithLatencyInfo& wheel_event,
     DispatchToRendererCallback& dispatch_callback) {
+  if (!IsActive() && base::FeatureList::IsEnabled(
+                         blink::features::kDropInputEventsWhilePaintHolding)) {
+    std::move(dispatch_callback)
+        .Run(wheel_event.event, DispatchToRendererResult::kNotDispatched);
+    return;
+  }
+
   wheel_event_queue_.QueueEvent(wheel_event, dispatch_callback);
 }
 
@@ -132,6 +143,17 @@
     const NativeWebKeyboardEventWithLatencyInfo& key_event,
     KeyboardEventCallback event_result_callback,
     DispatchToRendererCallback& dispatch_callback) {
+  if (!IsActive() && base::FeatureList::IsEnabled(
+                         blink::features::kDropInputEventsWhilePaintHolding)) {
+    std::move(event_result_callback)
+        .Run(key_event, blink::mojom::InputEventResultSource::kBrowser,
+             blink::mojom::InputEventResultState::kIgnored);
+
+    std::move(dispatch_callback)
+        .Run(key_event.event, DispatchToRendererResult::kNotDispatched);
+    return;
+  }
+
   gesture_event_queue_.StopFling();
   blink::mojom::WidgetInputHandler::DispatchEventCallback callback =
       base::BindOnce(&InputRouterImpl::KeyboardEventHandled, weak_this_,
@@ -143,6 +165,14 @@
 void InputRouterImpl::SendGestureEvent(
     const GestureEventWithLatencyInfo& original_gesture_event,
     DispatchToRendererCallback& dispatch_callback) {
+  if (!IsActive() && base::FeatureList::IsEnabled(
+                         blink::features::kDropInputEventsWhilePaintHolding)) {
+    std::move(dispatch_callback)
+        .Run(original_gesture_event.event,
+             DispatchToRendererResult::kNotDispatched);
+    return;
+  }
+
   TRACE_EVENT0("input", "InputRouterImpl::SendGestureEvent");
   input_stream_validator_.Validate(original_gesture_event.event);
 
@@ -295,6 +325,13 @@
 void InputRouterImpl::SendTouchEvent(
     const TouchEventWithLatencyInfo& touch_event,
     DispatchToRendererCallback& dispatch_callback) {
+  if (!IsActive() && base::FeatureList::IsEnabled(
+                         blink::features::kDropInputEventsWhilePaintHolding)) {
+    std::move(dispatch_callback)
+        .Run(touch_event.event, DispatchToRendererResult::kNotDispatched);
+    return;
+  }
+
   TouchEventWithLatencyInfo updated_touch_event = touch_event;
   SetMovementXYForTouchPoints(&updated_touch_event.event);
   input_stream_validator_.Validate(updated_touch_event.event);
diff --git a/components/input/mock_input_router.h b/components/input/mock_input_router.h
index 0ace23d..70a4a6e 100644
--- a/components/input/mock_input_router.h
+++ b/components/input/mock_input_router.h
@@ -19,15 +19,9 @@
 
 class MockInputRouter : public InputRouter {
  public:
-  explicit MockInputRouter(InputRouterClient* client)
-      : sent_mouse_event_(false),
-        sent_wheel_event_(false),
-        sent_keyboard_event_(false),
-        sent_gesture_event_(false),
-        send_touch_event_not_cancelled_(false),
-        has_handlers_(false),
-        client_(client)
-  {}
+  explicit MockInputRouter(InputRouterClient* client) : client_(client) {
+    MakeActive();
+  }
 
   MockInputRouter(const MockInputRouter&) = delete;
   MockInputRouter& operator=(const MockInputRouter&) = delete;
@@ -62,15 +56,15 @@
       blink::mojom::TouchEventConsumersPtr consumers) override;
   void WaitForInputProcessed(base::OnceClosure callback) override {}
 
-  bool sent_mouse_event_;
-  bool sent_wheel_event_;
-  bool sent_keyboard_event_;
-  bool sent_gesture_event_;
-  bool send_touch_event_not_cancelled_;
-  bool has_handlers_;
+  bool sent_mouse_event_ = false;
+  bool sent_wheel_event_ = false;
+  bool sent_keyboard_event_ = false;
+  bool sent_gesture_event_ = false;
+  bool send_touch_event_not_cancelled_ = false;
+  bool has_handlers_ = false;
 
  private:
-  raw_ptr<InputRouterClient> client_;
+  raw_ptr<InputRouterClient> client_ = nullptr;
 };
 
 }  // namespace input
diff --git a/components/input/render_input_router.cc b/components/input/render_input_router.cc
index d10a227..2ad76408 100644
--- a/components/input/render_input_router.cc
+++ b/components/input/render_input_router.cc
@@ -16,6 +16,7 @@
 #include "cc/input/browser_controls_offset_tag_modifications.h"
 #include "components/input/input_constants.h"
 #include "components/input/input_router_config_helper.h"
+#include "components/input/input_router_impl.h"
 #include "components/input/render_input_router_client.h"
 #include "components/input/render_widget_host_input_event_router.h"
 #include "components/input/render_widget_host_view_input.h"
diff --git a/components/ip_protection/common/masked_domain_list.cc b/components/ip_protection/common/masked_domain_list.cc
index c8633eb6..ae9a234 100644
--- a/components/ip_protection/common/masked_domain_list.cc
+++ b/components/ip_protection/common/masked_domain_list.cc
@@ -4,8 +4,13 @@
 
 #include "components/ip_protection/common/masked_domain_list.h"
 
+#include <cstdint>
+#include <utility>
+
+#include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/strings/string_split.h"
 #include "components/ip_protection/common/flat/masked_domain_list_generated.h"
 #include "components/ip_protection/common/ip_protection_data_types.h"
@@ -169,8 +174,15 @@
   return owner_id == other.owner_id && is_resource == other.is_resource;
 }
 
-MaskedDomainList::MaskedDomainList(base::File file) {
-  if (!mdl_file_.Initialize(std::move(file))) {
+MaskedDomainList::MaskedDomainList(base::File file, uint64_t file_size)
+    : MaskedDomainList(std::move(file),
+                       base::MemoryMappedFile::Region{
+                           .offset = 0,
+                           .size = base::checked_cast<size_t>(file_size)}) {}
+
+MaskedDomainList::MaskedDomainList(base::File file,
+                                   base::MemoryMappedFile::Region region) {
+  if (!mdl_file_.Initialize(std::move(file), region)) {
     CHECK(!mdl_file_.IsValid());
   } else {
     mdl_ = flat::GetMaskedDomainList(mdl_file_.data());
diff --git a/components/ip_protection/common/masked_domain_list.h b/components/ip_protection/common/masked_domain_list.h
index f2e2a32..e9c84fb 100644
--- a/components/ip_protection/common/masked_domain_list.h
+++ b/components/ip_protection/common/masked_domain_list.h
@@ -5,10 +5,12 @@
 #ifndef COMPONENTS_IP_PROTECTION_COMMON_MASKED_DOMAIN_LIST_H_
 #define COMPONENTS_IP_PROTECTION_COMMON_MASKED_DOMAIN_LIST_H_
 
+#include <cstdint>
 #include <map>
 #include <string>
 #include <vector>
 
+#include "base/files/file.h"
 #include "base/files/memory_mapped_file.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
@@ -89,11 +91,13 @@
     bool operator==(const GetResult& other) const;
   };
 
-  // Create a new MDL reading from the given file, as constructed by `Builder`.
-  explicit MaskedDomainList(base::File file);
+  // Create a new MDL reading from the given file, with a file size.
+  MaskedDomainList(base::File file, uint64_t file_size);
+  MaskedDomainList(base::File file, base::MemoryMappedFile::Region region);
 
   // Verify that the MDL was read correctly. This will be false if the file
-  // could not be read or is otherwise invalid.
+  // could not be read. This does not validate the contents of the file, as
+  // that would be a time-consuming process.
   bool Verify();
 
   // Determine whether the given request matches the MDL.
diff --git a/components/ip_protection/common/masked_domain_list_manager.cc b/components/ip_protection/common/masked_domain_list_manager.cc
index c770a6dee..f4fe278a 100644
--- a/components/ip_protection/common/masked_domain_list_manager.cc
+++ b/components/ip_protection/common/masked_domain_list_manager.cc
@@ -5,14 +5,19 @@
 #include "components/ip_protection/common/masked_domain_list_manager.h"
 
 #include <cstddef>
+#include <cstdint>
+#include <memory>
 #include <optional>
 #include <set>
 #include <string>
 #include <unordered_set>
+#include <utility>
 #include <vector>
 
+#include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
+#include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/numerics/checked_math.h"
@@ -196,53 +201,10 @@
 void MaskedDomainListManager::UpdateMaskedDomainList(
     const masked_domain_list::MaskedDomainList& mdl,
     const std::vector<std::string>& exclusion_list) {
-  if (creation_time_for_mdl_update_metric_.has_value()) {
-    Telemetry().MdlFirstUpdateTime(base::TimeTicks::Now() -
-                                   *creation_time_for_mdl_update_metric_);
-    creation_time_for_mdl_update_metric_.reset();
-  }
+  // Browser should only call this method when flatbuffer is disabled.
+  CHECK(!UseFlatbuffer());
 
-  if (UseFlatbuffer()) {
-    // Flatbuffer implementation is not compatible with the exclusion-list
-    // policy.
-    CHECK(proxy_bypass_policy_ !=
-          IpProtectionProxyBypassPolicy::kExclusionList);
-
-    base::FilePath default_mdl_file_path;
-    base::CreateTemporaryFile(&default_mdl_file_path);
-    base::FilePath regular_browsing_mdl_file_path;
-    base::CreateTemporaryFile(&regular_browsing_mdl_file_path);
-
-    if (!MaskedDomainList::BuildFromProto(mdl, default_mdl_file_path,
-                                          regular_browsing_mdl_file_path)) {
-      return;
-    }
-
-    base::File::Info info;
-    base::File default_mdl_file(default_mdl_file_path,
-                                base::File::Flags::FLAG_OPEN |
-                                    base::File::Flags::FLAG_READ |
-                                    base::File::Flags::FLAG_DELETE_ON_CLOSE);
-    if (default_mdl_file.GetInfo(&info)) {
-      Telemetry().MdlEstimatedDiskUsage(info.size);
-    }
-    default_mdl_ =
-        std::make_unique<MaskedDomainList>(std::move(default_mdl_file));
-
-    base::File regular_browsing_mdl_file(
-        regular_browsing_mdl_file_path,
-        base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ |
-            base::File::Flags::FLAG_DELETE_ON_CLOSE);
-    if (regular_browsing_mdl_file.GetInfo(&info)) {
-      Telemetry().MdlEstimatedDiskUsage(info.size);
-    }
-    regular_browsing_mdl_ = std::make_unique<MaskedDomainList>(
-        std::move(regular_browsing_mdl_file));
-
-    // Note that MdlEstimatedMemoryUsage is not recorded in this branch, as
-    // this data structure is not in-memory.
-    return;
-  }
+  RecordCreationTime();
 
   // Clear the existing matchers.
   url_matcher_with_bypass_.Clear();
@@ -266,6 +228,38 @@
   Telemetry().MdlEstimatedMemoryUsage(EstimateMemoryUsage());
 }
 
+void MaskedDomainListManager::UpdateMaskedDomainListFlatbuffer(
+    base::File default_file,
+    uint64_t default_file_size,
+    base::File regular_browsing_file,
+    uint64_t regular_browsing_file_size) {
+  // Browser should only call this Mojo method when flatbuffer is enabled.
+  CHECK(UseFlatbuffer());
+
+  // Flatbuffer implementation is not compatible with the exclusion-list
+  // policy.
+  CHECK_NE(proxy_bypass_policy_, IpProtectionProxyBypassPolicy::kExclusionList);
+
+  RecordCreationTime();
+
+  default_mdl_ = std::make_unique<MaskedDomainList>(std::move(default_file),
+                                                    default_file_size);
+  regular_browsing_mdl_ = std::make_unique<MaskedDomainList>(
+      std::move(regular_browsing_file), regular_browsing_file_size);
+
+  // Note that MdlEstimatedMemoryUsage is not recorded in this branch, as
+  // this data structure is not in-memory.
+  return;
+}
+
+void MaskedDomainListManager::RecordCreationTime() {
+  if (creation_time_for_mdl_update_metric_.has_value()) {
+    Telemetry().MdlFirstUpdateTime(base::TimeTicks::Now() -
+                                   *creation_time_for_mdl_update_metric_);
+    creation_time_for_mdl_update_metric_.reset();
+  }
+}
+
 const GURL& MaskedDomainListManager::SanitizeURLIfNeeded(
     const GURL& url,
     GURL& sanitized_url) const {
diff --git a/components/ip_protection/common/masked_domain_list_manager.h b/components/ip_protection/common/masked_domain_list_manager.h
index cb43501..6b40da20 100644
--- a/components/ip_protection/common/masked_domain_list_manager.h
+++ b/components/ip_protection/common/masked_domain_list_manager.h
@@ -6,12 +6,14 @@
 #define COMPONENTS_IP_PROTECTION_COMMON_MASKED_DOMAIN_LIST_MANAGER_H_
 
 #include <cstddef>
+#include <cstdint>
 #include <map>
 #include <optional>
 #include <set>
 #include <string>
 #include <vector>
 
+#include "base/files/file.h"
 #include "base/time/time.h"
 #include "components/ip_protection/common/ip_protection_data_types.h"
 #include "components/ip_protection/common/url_matcher_with_bypass.h"
@@ -63,8 +65,14 @@
   // and the 1P bypass rules.
   void UpdateMaskedDomainList(const masked_domain_list::MaskedDomainList& mdl,
                               const std::vector<std::string>& exclusion_list);
+  void UpdateMaskedDomainListFlatbuffer(base::File default_file,
+                                        uint64_t default_file_size,
+                                        base::File regular_browsing_file,
+                                        uint64_t regular_browsing_file_size);
 
  private:
+  void RecordCreationTime();
+
   // Sanitizes the given URL by removing a trailing dot from its host if
   // present. Returns a reference to either the modified sanitized URL or the
   // original URL if no changes were made.
@@ -81,7 +89,7 @@
   UrlMatcherWithBypass url_matcher_with_bypass_;
 
   // If UpdateMaskedDomainList has not yet been called, stores the time at which
-  // the manager was created. The first call to UpdateMaskedDomainList clears
+  // the manager was created. The first call to `RecordCreationTime` clears
   // this to nullopt on entry.
   std::optional<base::TimeTicks> creation_time_for_mdl_update_metric_;
 };
diff --git a/components/ip_protection/common/masked_domain_list_manager_unittest.cc b/components/ip_protection/common/masked_domain_list_manager_unittest.cc
index 236dbe0..6b3fe86 100644
--- a/components/ip_protection/common/masked_domain_list_manager_unittest.cc
+++ b/components/ip_protection/common/masked_domain_list_manager_unittest.cc
@@ -7,14 +7,18 @@
 #include <map>
 #include <string>
 #include <string_view>
+#include <tuple>
 #include <vector>
 
 #include "base/containers/contains.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/strings/strcat.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/unguessable_token.h"
 #include "components/ip_protection/common/ip_protection_data_types.h"
+#include "components/ip_protection/common/masked_domain_list.h"
 #include "components/privacy_sandbox/masked_domain_list/masked_domain_list.pb.h"
 #include "net/base/features.h"
 #include "net/base/network_anonymization_key.h"
@@ -155,39 +159,43 @@
 
 const char kFirstUpdateTimeHistogram[] =
     "NetworkService.MaskedDomainList.FirstUpdateTime";
-const char kDiskUsageHistogram[] =
-    "NetworkService.MaskedDomainList.DiskUsageInKB";
 
 }  // namespace
 
-class MaskedDomainListManagerBaseTest : public testing::Test {};
+class MaskedDomainListManagerBaseTest : public testing::Test {
+ protected:
+  virtual bool UseFlatbuffer() = 0;
 
-TEST_F(MaskedDomainListManagerBaseTest, IsNotEnabledByDefault) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndDisableFeature(
-      network::features::kMaskedDomainList);
+  // Call either `UpdateMaskedDomainList` or `UpdateMaskedDomainListFlatbuffer`,
+  // depending on  `UseFlatbuffer`.
+  void UpdateMaskedDomainList(masked_domain_list::MaskedDomainList& mdl,
+                              MaskedDomainListManager& mdl_manager) {
+    if (UseFlatbuffer()) {
+      base::FilePath default_mdl_file_path;
+      base::CreateTemporaryFile(&default_mdl_file_path);
+      base::FilePath regular_browsing_mdl_file_path;
+      base::CreateTemporaryFile(&regular_browsing_mdl_file_path);
+      EXPECT_TRUE(ip_protection::MaskedDomainList::BuildFromProto(
+          mdl, default_mdl_file_path, regular_browsing_mdl_file_path));
 
-  MaskedDomainListManager allow_list_no_bypass(
-      network::mojom::IpProtectionProxyBypassPolicy::kNone);
-  MaskedDomainListManager allow_list_first_party_bypass(
-      network::mojom::IpProtectionProxyBypassPolicy::
-          kFirstPartyToTopLevelFrame);
-
-  EXPECT_FALSE(allow_list_no_bypass.IsEnabled());
-  EXPECT_FALSE(allow_list_first_party_bypass.IsEnabled());
-}
-
-TEST_F(MaskedDomainListManagerBaseTest, IsEnabledWhenManuallySet) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures({net::features::kEnableIpProtectionProxy,
-                                        network::features::kMaskedDomainList},
-                                       {});
-
-  MaskedDomainListManager allow_list(
-      network::mojom::IpProtectionProxyBypassPolicy::kNone);
-
-  EXPECT_TRUE(allow_list.IsEnabled());
-}
+      base::File default_mdl_file(default_mdl_file_path,
+                                  base::File::Flags::FLAG_OPEN |
+                                      base::File::Flags::FLAG_READ |
+                                      base::File::Flags::FLAG_DELETE_ON_CLOSE);
+      base::File regular_browsing_mdl_file(
+          regular_browsing_mdl_file_path,
+          base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ |
+              base::File::Flags::FLAG_DELETE_ON_CLOSE);
+      mdl_manager.UpdateMaskedDomainListFlatbuffer(
+          default_mdl_file.Duplicate(), default_mdl_file.GetLength(),
+          regular_browsing_mdl_file.Duplicate(),
+          regular_browsing_mdl_file.GetLength());
+    } else {
+      mdl_manager.UpdateMaskedDomainList(
+          mdl, /*exclusion_list=*/std::vector<std::string>());
+    }
+  }
+};
 
 class MaskedDomainListManagerTest
     : public MaskedDomainListManagerBaseTest,
@@ -210,10 +218,12 @@
     resource_owner->set_owner_name("foo");
     resource_owner->add_owned_properties("property.com");
     resource_owner->add_owned_resources()->set_domain(std::string(kTestDomain));
-    allow_list_no_bypass_.UpdateMaskedDomainList(
-        mdl, /*exclusion_list=*/std::vector<std::string>());
-    allow_list_first_party_bypass_.UpdateMaskedDomainList(
-        mdl, /*exclusion_list=*/std::vector<std::string>());
+    UpdateMaskedDomainList(mdl, allow_list_no_bypass_);
+    UpdateMaskedDomainList(mdl, allow_list_first_party_bypass_);
+  }
+
+  bool UseFlatbuffer() override {
+    return GetParam() == MdlImpl::kFlatbufferImpl;
   }
 
  protected:
@@ -232,6 +242,33 @@
                                       : "Flatbuffer";
                          });
 
+TEST_P(MaskedDomainListManagerTest, IsNotEnabledByDefault) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      network::features::kMaskedDomainList);
+
+  MaskedDomainListManager allow_list_no_bypass(
+      network::mojom::IpProtectionProxyBypassPolicy::kNone);
+  MaskedDomainListManager allow_list_first_party_bypass(
+      network::mojom::IpProtectionProxyBypassPolicy::
+          kFirstPartyToTopLevelFrame);
+
+  EXPECT_FALSE(allow_list_no_bypass.IsEnabled());
+  EXPECT_FALSE(allow_list_first_party_bypass.IsEnabled());
+}
+
+TEST_P(MaskedDomainListManagerTest, IsEnabledWhenManuallySet) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures({net::features::kEnableIpProtectionProxy,
+                                        network::features::kMaskedDomainList},
+                                       {});
+
+  MaskedDomainListManager allow_list(
+      network::mojom::IpProtectionProxyBypassPolicy::kNone);
+
+  EXPECT_TRUE(allow_list.IsEnabled());
+}
+
 TEST_P(MaskedDomainListManagerTest, AllowListIsNotPopulatedByDefault) {
   MaskedDomainListManager allow_list(
       network::mojom::IpProtectionProxyBypassPolicy::kNone);
@@ -239,41 +276,20 @@
 }
 
 TEST_P(MaskedDomainListManagerTest, AllowlistIsPopulated_MdlHasResourceOwners) {
-  MaskedDomainListManager allow_list(
+  MaskedDomainListManager mdl_manager(
       network::mojom::IpProtectionProxyBypassPolicy::kNone);
   masked_domain_list::MaskedDomainList mdl;
   auto* resource_owner = mdl.add_resource_owners();
   resource_owner->set_owner_name("foo");
   resource_owner->add_owned_resources()->set_domain("example.com");
-  allow_list.UpdateMaskedDomainList(
-      mdl,
-      /*exclusion_list=*/std::vector<std::string>());
+  UpdateMaskedDomainList(mdl, mdl_manager);
 
-  EXPECT_TRUE(allow_list.IsPopulated());
-}
-
-TEST_P(MaskedDomainListManagerTest, DiskSpaceTelemetry) {
-  base::HistogramTester histogram_tester;
-
-  MaskedDomainListManager allow_list(
-      network::mojom::IpProtectionProxyBypassPolicy::kNone);
-  masked_domain_list::MaskedDomainList mdl;
-  auto* resource_owner = mdl.add_resource_owners();
-  resource_owner->set_owner_name("foo");
-  resource_owner->add_owned_resources()->set_domain("example.com");
-  allow_list.UpdateMaskedDomainList(
-      mdl,
-      /*exclusion_list=*/std::vector<std::string>());
-
-  // When using the flatbuffer, UpdateMaskeDomainList generated two on-disk
-  // MDLs, one for each MdlType.
-  histogram_tester.ExpectTotalCount(
-      kDiskUsageHistogram, GetParam() == MdlImpl::kFlatbufferImpl ? 2 : 0);
+  EXPECT_TRUE(mdl_manager.IsPopulated());
 }
 
 TEST_P(MaskedDomainListManagerTest, AllowlistAcceptsMultipleUpdates) {
   base::HistogramTester histogram_tester;
-  MaskedDomainListManager allow_list(
+  MaskedDomainListManager mdl_manager(
       network::mojom::IpProtectionProxyBypassPolicy::kNone);
   masked_domain_list::MaskedDomainList mdl1;
   {
@@ -295,21 +311,19 @@
   histogram_tester.ExpectTotalCount(kFirstUpdateTimeHistogram, 0);
 
   // First update.
-  allow_list.UpdateMaskedDomainList(
-      mdl1, /*exclusion_list=*/std::vector<std::string>());
+  UpdateMaskedDomainList(mdl1, mdl_manager);
 
-  EXPECT_TRUE(allow_list.IsPopulated());
-  EXPECT_TRUE(allow_list.Matches(kHttpsRequestUrl1, kEmptyNak));
-  EXPECT_FALSE(allow_list.Matches(kHttpsRequestUrl2, kEmptyNak));
+  EXPECT_TRUE(mdl_manager.IsPopulated());
+  EXPECT_TRUE(mdl_manager.Matches(kHttpsRequestUrl1, kEmptyNak));
+  EXPECT_FALSE(mdl_manager.Matches(kHttpsRequestUrl2, kEmptyNak));
   histogram_tester.ExpectTotalCount(kFirstUpdateTimeHistogram, 1);
 
   // Second update. Removes old rules, adds new ones.
-  allow_list.UpdateMaskedDomainList(
-      mdl2, /*exclusion_list=*/std::vector<std::string>());
+  UpdateMaskedDomainList(mdl2, mdl_manager);
 
-  EXPECT_TRUE(allow_list.IsPopulated());
-  EXPECT_FALSE(allow_list.Matches(kHttpsRequestUrl1, kEmptyNak));
-  EXPECT_TRUE(allow_list.Matches(kHttpsRequestUrl2, kEmptyNak));
+  EXPECT_TRUE(mdl_manager.IsPopulated());
+  EXPECT_FALSE(mdl_manager.Matches(kHttpsRequestUrl1, kEmptyNak));
+  EXPECT_TRUE(mdl_manager.Matches(kHttpsRequestUrl2, kEmptyNak));
   histogram_tester.ExpectTotalCount(kFirstUpdateTimeHistogram, 1);
 }
 
@@ -507,8 +521,7 @@
       Resource::Experiment::Resource_Experiment_EXPERIMENT_EXTERNAL_REGULAR);
   resource->set_exclude_default_group(true);
 
-  mdl_manager.UpdateMaskedDomainList(
-      mdl, /*exclusion_list=*/std::vector<std::string>());
+  UpdateMaskedDomainList(mdl, mdl_manager);
 
   // The default MDL resource should ONLY match for mdl type kDefault.
   EXPECT_TRUE(
@@ -529,7 +542,11 @@
 
 class MaskedDomainListManagerMatchTest
     : public MaskedDomainListManagerBaseTest,
-      public testing::WithParamInterface<std::tuple<MatchTest, MdlImpl>> {};
+      public testing::WithParamInterface<std::tuple<MatchTest, MdlImpl>> {
+  bool UseFlatbuffer() override {
+    return std::get<1>(GetParam()) == MdlImpl::kFlatbufferImpl;
+  }
+};
 
 TEST_P(MaskedDomainListManagerMatchTest, Match) {
   auto& [match_test, mdl_impl] = GetParam();
@@ -574,10 +591,8 @@
   resource = resource_owner->add_owned_resources();
   resource->set_domain("sub.co.jp");
 
-  allow_list_no_bypass.UpdateMaskedDomainList(
-      mdl, /*exclusion_list=*/std::vector<std::string>());
-  allow_list_first_party_bypass.UpdateMaskedDomainList(
-      mdl, /*exclusion_list=*/std::vector<std::string>());
+  UpdateMaskedDomainList(mdl, allow_list_no_bypass);
+  UpdateMaskedDomainList(mdl, allow_list_first_party_bypass);
 
   GURL request_url(base::StrCat({"https://", match_test.req}));
   auto network_anonymization_key =
diff --git a/components/ip_protection/common/masked_domain_list_unittest.cc b/components/ip_protection/common/masked_domain_list_unittest.cc
index 65eac8b..ea53c86 100644
--- a/components/ip_protection/common/masked_domain_list_unittest.cc
+++ b/components/ip_protection/common/masked_domain_list_unittest.cc
@@ -4,9 +4,12 @@
 
 #include "components/ip_protection/common/masked_domain_list.h"
 
+#include <cstdint>
 #include <string>
+#include <utility>
 
 #include "base/debug/crash_logging.h"
+#include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/logging.h"
@@ -28,9 +31,12 @@
         base::NumberToString(filename_suffix_++));
   }
 
-  base::File OpenFile(base::FilePath& path) {
-    return base::File(
+  MaskedDomainList OpenMdl(base::FilePath& path) {
+    base::File file(
         path, base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ);
+    uint64_t size = file.GetLength();
+    EXPECT_NE(size, 0UL);
+    return MaskedDomainList(std::move(file), size);
   }
 
  private:
@@ -41,11 +47,7 @@
 TEST_F(MaskedDomainListTest, Invalid) {
   base::FilePath path = MakeTempPath();
 
-  base::File file(
-      path, base::File::Flags::FLAG_CREATE | base::File::Flags::FLAG_WRITE);
-  file.Close();
-
-  MaskedDomainList mdl((OpenFile(path)));
+  MaskedDomainList mdl(base::File(), 10UL);
   EXPECT_EQ(mdl.Verify(), false);
 }
 
@@ -58,7 +60,7 @@
                              /*is_wildcard=*/true));
   CHECK(bldr.Finish(path));
 
-  MaskedDomainList mdl((OpenFile(path)));
+  MaskedDomainList mdl = OpenMdl(path);
 
   // Result matches the first call to AddOwner.
   EXPECT_EQ(mdl.Get("example.com"),
@@ -76,7 +78,7 @@
                             /*is_wildcard=*/true));
   CHECK(bldr.Finish(path));
 
-  MaskedDomainList mdl((OpenFile(path)));
+  MaskedDomainList mdl = OpenMdl(path);
   EXPECT_EQ(
       mdl.Get("sub.foo.example.com"),
       (MaskedDomainList::GetResult{.owner_id = 20U, .is_resource = true}));
@@ -118,7 +120,7 @@
                             /*is_wildcard=*/true));
   CHECK(bldr.Finish(path));
 
-  MaskedDomainList mdl((OpenFile(path)));
+  MaskedDomainList mdl = OpenMdl(path);
 
   EXPECT_FALSE(mdl.IsOwnedResource("initech.com"))
       << "Un-owned domain should not match";
@@ -158,7 +160,7 @@
                             /*is_wildcard=*/true));
   CHECK(bldr.Finish(path));
 
-  MaskedDomainList mdl((OpenFile(path)));
+  MaskedDomainList mdl = OpenMdl(path);
 
   // 1P requests.
   EXPECT_FALSE(mdl.Matches("initech.com", "initech.com"))
diff --git a/components/live_caption/views/caption_bubble.cc b/components/live_caption/views/caption_bubble.cc
index aec0ecd4..236d066e 100644
--- a/components/live_caption/views/caption_bubble.cc
+++ b/components/live_caption/views/caption_bubble.cc
@@ -1588,6 +1588,7 @@
   auto left_header_width = width - 2 * button_size.width();
   left_header_container_->SetPreferredSize(
       gfx::Size(left_header_width, button_size.height()));
+  download_progress_label_->SetPreferredSize(gfx::Size(width, content_height));
 
   if (caption_bubble_settings_->IsLiveTranslateFeatureEnabled() ||
       base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) {
diff --git a/components/manta/proto/common.proto b/components/manta/proto/common.proto
index 83c0a5ce..ad6017e 100644
--- a/components/manta/proto/common.proto
+++ b/components/manta/proto/common.proto
@@ -17,3 +17,17 @@
 message Image {
   optional bytes serialized_bytes = 1;
 }
+
+// This is a copy of google.protobuf.Timestamp.
+message Timestamp {
+  // Represents seconds of UTC time since Unix epoch
+  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+  // 9999-12-31T23:59:59Z inclusive.
+  int64 seconds = 1;
+
+  // Non-negative fractions of a second at nanosecond resolution. Negative
+  // second values with fractions must still have non-negative nanos values
+  // that count forward in time. Must be from 0 to 999,999,999
+  // inclusive.
+  int32 nanos = 2;
+}
diff --git a/components/manta/proto/scanner.proto b/components/manta/proto/scanner.proto
index e1bfe73..030c701 100644
--- a/components/manta/proto/scanner.proto
+++ b/components/manta/proto/scanner.proto
@@ -5,6 +5,8 @@
 syntax = "proto3";
 option optimize_for = LITE_RUNTIME;
 
+import "components/manta/proto/common.proto";
+
 package manta.proto;
 
 message ScannerInput {
@@ -15,6 +17,8 @@
   // actions that can be performed on the selected region with unpopulated
   // details.
   ScannerAction selected_action = 2;
+  // The current timestamp on the user's device.
+  Timestamp current_timestamp = 3;
 }
 
 message ScannerOutput {
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageAutodismissDurationProvider.java b/components/messages/android/java/src/org/chromium/components/messages/MessageAutodismissDurationProvider.java
index 8a9477e..e9374b2b 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageAutodismissDurationProvider.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageAutodismissDurationProvider.java
@@ -4,7 +4,10 @@
 
 package org.chromium.components.messages;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Interface to provide a duration time for message. */
+@NullMarked
 public interface MessageAutodismissDurationProvider {
     /**
      * Provide a duration time based on given custom duration and whether a11y mode is on.
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java b/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java
index 23657d0..f61b33a 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java
@@ -12,6 +12,7 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.listmenu.ListMenuDelegate;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.ReadableIntPropertyKey;
@@ -22,6 +23,7 @@
 import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
 
 /** Properties of message banner. */
+@NullMarked
 public class MessageBannerProperties {
     /** A Color value indicating that the "natural" colors from the image should be used. */
     @ColorInt public static final int TINT_NONE = Color.TRANSPARENT;
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageContainer.java b/components/messages/android/java/src/org/chromium/components/messages/MessageContainer.java
index 23c1e71..3df29e8 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageContainer.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageContainer.java
@@ -11,14 +11,15 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.core.view.ViewCompat;
 
 import org.chromium.base.Log;
 import org.chromium.base.TraceEvent;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** Container holding messages. */
+@NullMarked
 public class MessageContainer extends FrameLayout {
     private static final String TAG = "MessageContainer";
 
@@ -34,20 +35,19 @@
         private int mFocusedView;
 
         @Override
-        public void onInitializeAccessibilityEvent(
-                @NonNull View host, @NonNull AccessibilityEvent event) {
+        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
             handleEvent(event);
             super.onInitializeAccessibilityEvent(host, event);
         }
 
         @Override
         public boolean onRequestSendAccessibilityEvent(
-                @NonNull ViewGroup host, @NonNull View child, @NonNull AccessibilityEvent event) {
+                ViewGroup host, View child, AccessibilityEvent event) {
             handleEvent(event);
             return super.onRequestSendAccessibilityEvent(host, child, event);
         }
 
-        private void handleEvent(@NonNull AccessibilityEvent event) {
+        private void handleEvent(AccessibilityEvent event) {
             if (mA11yDelegate == null) return;
             if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
                 assert mFocusedView == 0 : "No other view should be focused";
@@ -62,11 +62,11 @@
         }
     }
 
-    private MessageContainerA11yDelegate mA11yDelegate;
+    private @Nullable MessageContainerA11yDelegate mA11yDelegate;
     private boolean mIsInitializingLayout;
     private int mA11yDismissActionId = NO_ID;
 
-    public MessageContainer(@NonNull Context context, @Nullable AttributeSet attrs) {
+    public MessageContainer(Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         setAccessibilityDelegate(new MessageContainerA11yDelegateProxy());
     }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcher.java b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcher.java
index e92d35b3..3b2d4e3 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcher.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcher.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.messages;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -11,6 +12,7 @@
  * The public interface for Messages. To interact with messages, feature should obtain a reference
  * to MessageDispatcher through MessageDispatcherProvider and call methods of MessageDispatcher.
  */
+@NullMarked
 public interface MessageDispatcher {
     /**
      * Enqueues a message defined by its properties.
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherBridge.java b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherBridge.java
index 4bf093a..6e2720a 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherBridge.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherBridge.java
@@ -7,6 +7,7 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 
@@ -15,6 +16,7 @@
  * with MessageDispatcher.
  */
 @JNINamespace("messages")
+@NullMarked
 public class MessageDispatcherBridge {
     /**
      * Return false if it fails to enqueue message, which usually happens when
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java
index 9fd98a14..b2e9ee0 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java
@@ -4,16 +4,17 @@
 
 package org.chromium.components.messages;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.UnownedUserData;
 import org.chromium.base.UnownedUserDataKey;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.WindowAndroid;
 
 /**
  * The class that handles association of MessageDispatcher with WindowAndroid and retrieval of the
  * associated MessageDispatcher.
  */
+@NullMarked
 public class MessageDispatcherProvider {
     /** An interface that allows a MessageDispatcher to be associated with an unowned data host. */
     interface Unowned extends MessageDispatcher, UnownedUserData {}
@@ -31,8 +32,7 @@
      * @param windowAndroid The window to retrieve MessageDispatcher from.
      * @return An instance of MessageDispatcher associated with the window.
      */
-    @Nullable
-    public static MessageDispatcher from(WindowAndroid windowAndroid) {
+    public static @Nullable MessageDispatcher from(@Nullable WindowAndroid windowAndroid) {
         if (windowAndroid == null) return null;
         return KEY.retrieveDataFromHost(windowAndroid.getUnownedUserDataHost());
     }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
index fe5d17c..dc37ca5 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
@@ -4,12 +4,15 @@
 
 package org.chromium.components.messages;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Lists base::Features that can be accessed through {@link MessageFeatureMap}.
  *
  * <p>Should be kept in sync with |kFeaturesExposedToJava| in
  * //components/messages/android/messages_feature.cc
  */
+@NullMarked
 public abstract class MessageFeatureList {
     public static final String MESSAGES_FOR_ANDROID_FULLY_VISIBLE_CALLBACK =
             "MessagesForAndroidFullyVisibleCallback";
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java
index a13438f..987d29e 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java
@@ -8,9 +8,11 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.FeatureMap;
+import org.chromium.build.annotations.NullMarked;
 
 /** Java accessor for base::Features listed in {@link MessageFeatureList} */
 @JNINamespace("messages")
+@NullMarked
 public final class MessageFeatureMap extends FeatureMap {
     private static final MessageFeatureMap sInstance = new MessageFeatureMap();
 
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageSecondaryMenuItems.java b/components/messages/android/java/src/org/chromium/components/messages/MessageSecondaryMenuItems.java
index b539318..4a225105 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageSecondaryMenuItems.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageSecondaryMenuItems.java
@@ -8,6 +8,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.widget.BrowserUiListMenuUtils;
 import org.chromium.ui.listmenu.BasicListMenu.ListMenuItemType;
 import org.chromium.ui.listmenu.ListMenu;
@@ -16,6 +17,7 @@
 import org.chromium.ui.modelutil.PropertyModel;
 
 /** A class used by {@link MessageWrapper} to manage the message secondary menu and menu items. */
+@NullMarked
 public class MessageSecondaryMenuItems {
     @VisibleForTesting ModelList mMenuItems = new ModelList();
 
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java b/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java
index 297a744a..9dde6ab 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.messages;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
@@ -16,6 +18,8 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.listmenu.ListMenu;
 import org.chromium.ui.listmenu.ListMenuItemProperties;
@@ -23,10 +27,11 @@
 
 /** Java side of native MessageWrapper class that represents a message for native features. */
 @JNINamespace("messages")
+@NullMarked
 public final class MessageWrapper implements ListMenu.Delegate {
     private long mNativeMessageWrapper;
     private final PropertyModel mMessageProperties;
-    private MessageSecondaryMenuItems mMessageSecondaryMenuItems;
+    private @Nullable MessageSecondaryMenuItems mMessageSecondaryMenuItems;
 
     /**
      * Creates an instance of MessageWrapper and links it with native MessageWrapper object.
@@ -73,7 +78,7 @@
     }
 
     @CalledByNative
-    String getDescription() {
+    @Nullable String getDescription() {
         CharSequence description = mMessageProperties.get(MessageBannerProperties.DESCRIPTION);
         return description == null ? null : description.toString();
     }
@@ -132,7 +137,7 @@
             mMessageProperties.set(MessageBannerProperties.SECONDARY_MENU_MAX_SIZE, maxSize);
             mMessageProperties.set(
                     MessageBannerProperties.SECONDARY_MENU_BUTTON_DELEGATE,
-                    () -> mMessageSecondaryMenuItems.createListMenu(context, this));
+                    () -> assumeNonNull(mMessageSecondaryMenuItems).createListMenu(context, this));
         }
     }
 
@@ -151,7 +156,7 @@
                 itemId, resourceId, itemText, itemDescription);
     }
 
-    MessageSecondaryMenuItems getMessageSecondaryMenuItemsForTesting() {
+    @Nullable MessageSecondaryMenuItems getMessageSecondaryMenuItemsForTesting() {
         return mMessageSecondaryMenuItems;
     }
 
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java b/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java
index 636243fe..a94131a 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java
@@ -4,17 +4,18 @@
 
 package org.chromium.components.messages;
 
-
 import androidx.annotation.IntDef;
 
 import org.chromium.base.Log;
 import org.chromium.base.TimeUtils;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
 
 /**
  * Static utility methods for recording messages related metrics. TODO(crbug.com/40877562): remove
  * logs.
  */
+@NullMarked
 public class MessagesMetrics {
     private static final String TAG = "MessagesMetrics";
     private static final String ENQUEUED_HISTOGRAM_NAME = "Android.Messages.Enqueued";
diff --git a/components/navigation_interception/intercept_navigation_throttle.cc b/components/navigation_interception/intercept_navigation_throttle.cc
index 284d5932..24c7ec9 100644
--- a/components/navigation_interception/intercept_navigation_throttle.cc
+++ b/components/navigation_interception/intercept_navigation_throttle.cc
@@ -32,7 +32,12 @@
         request_finish_async_work_callback_.has_value());
 }
 
-InterceptNavigationThrottle::~InterceptNavigationThrottle() = default;
+InterceptNavigationThrottle::~InterceptNavigationThrottle() {
+  // Clients should not synchronously cause the navigation to be deleted.
+  // Putting the check here allows us to get a stack for what's causing the
+  // deletion.
+  CHECK(!in_sync_check_);
+}
 
 content::NavigationThrottle::ThrottleCheckResult
 InterceptNavigationThrottle::WillStartRequest() {
@@ -83,12 +88,14 @@
 InterceptNavigationThrottle::CheckIfShouldIgnoreNavigation() {
   bool async = ShouldCheckAsynchronously();
   pending_check_ = true;
+  in_sync_check_ = true;
   auto weak_this = weak_factory_.GetWeakPtr();
   should_ignore_callback_.Run(
       navigation_handle(), async,
       base::BindOnce(&InterceptNavigationThrottle::OnCheckComplete, weak_this));
   // Clients should not synchronously cause the navigation to be deleted.
   CHECK(weak_this);
+  in_sync_check_ = false;
   if (pending_check_) {
     if (async) {
       return content::NavigationThrottle::PROCEED;
diff --git a/components/navigation_interception/intercept_navigation_throttle.h b/components/navigation_interception/intercept_navigation_throttle.h
index 56d3b41dd..bfc20ca 100644
--- a/components/navigation_interception/intercept_navigation_throttle.h
+++ b/components/navigation_interception/intercept_navigation_throttle.h
@@ -98,6 +98,10 @@
 
   base::TimeTicks defer_start_;
 
+  // Tracks whether we're in a synchronous intercept navigation check so we can
+  // crash if we're deleted during the check and get a stack trace.
+  bool in_sync_check_ = false;
+
   base::WeakPtrFactory<InterceptNavigationThrottle> weak_factory_{this};
 };
 
diff --git a/components/optimization_guide/core/mock_optimization_guide_model_executor.cc b/components/optimization_guide/core/mock_optimization_guide_model_executor.cc
index 4599c2e5..636b1df7 100644
--- a/components/optimization_guide/core/mock_optimization_guide_model_executor.cc
+++ b/components/optimization_guide/core/mock_optimization_guide_model_executor.cc
@@ -66,11 +66,11 @@
         impl->GetSizeInTokens(input, std::move(callback));
       });
   ON_CALL(*this, GetExecutionInputSizeInTokens)
-      .WillByDefault([impl](const auto& input, auto callback) {
+      .WillByDefault([impl](MultimodalMessageReadView input, auto callback) {
         impl->GetExecutionInputSizeInTokens(input, std::move(callback));
       });
   ON_CALL(*this, GetContextSizeInTokens)
-      .WillByDefault([impl](const auto& input, auto callback) {
+      .WillByDefault([impl](MultimodalMessageReadView input, auto callback) {
         impl->GetContextSizeInTokens(input, std::move(callback));
       });
   ON_CALL(*this, GetSamplingParams).WillByDefault([impl]() {
diff --git a/components/optimization_guide/core/mock_optimization_guide_model_executor.h b/components/optimization_guide/core/mock_optimization_guide_model_executor.h
index 976f0612..a91aa21 100644
--- a/components/optimization_guide/core/mock_optimization_guide_model_executor.h
+++ b/components/optimization_guide/core/mock_optimization_guide_model_executor.h
@@ -78,11 +78,11 @@
                OptimizationGuideModelSizeInTokenCallback callback));
   MOCK_METHOD(void,
               GetExecutionInputSizeInTokens,
-              (const google::protobuf::MessageLite& request_metadata,
+              (MultimodalMessageReadView request_metadata,
                OptimizationGuideModelSizeInTokenCallback callback));
   MOCK_METHOD(void,
               GetContextSizeInTokens,
-              (const google::protobuf::MessageLite& request_metadata,
+              (MultimodalMessageReadView request_metadata,
                OptimizationGuideModelSizeInTokenCallback callback));
   MOCK_METHOD(const optimization_guide::SamplingParams,
               GetSamplingParams,
diff --git a/components/optimization_guide/core/model_execution/model_execution_prefs.cc b/components/optimization_guide/core/model_execution/model_execution_prefs.cc
index b5ed4eb2..305df14e 100644
--- a/components/optimization_guide/core/model_execution/model_execution_prefs.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_prefs.cc
@@ -106,7 +106,7 @@
     "optimization_guide.on_device.last_time_eligible_for_download";
 
 // An integer pref that contains the user's client id.
-const char kModelQualityLogggingClientId[] =
+const char kModelQualityLoggingClientId[] =
     "optimization_guide.model_quality_logging_client_id";
 
 // An integer pref for the on-device GenAI foundational model enterprise policy
@@ -127,7 +127,7 @@
       localstate::kLastTimeEligibleForOnDeviceModelDownload, base::Time::Min());
   registry->RegisterDictionaryPref(localstate::kOnDeviceModelValidationResult);
   registry->RegisterDictionaryPref(localstate::kLastUsageByFeature);
-  registry->RegisterInt64Pref(localstate::kModelQualityLogggingClientId, 0,
+  registry->RegisterInt64Pref(localstate::kModelQualityLoggingClientId, 0,
                               PrefRegistry::LOSSY_PREF);
   registry->RegisterIntegerPref(
       localstate::kGenAILocalFoundationalModelEnterprisePolicySettings, 0);
diff --git a/components/optimization_guide/core/model_execution/model_execution_prefs.h b/components/optimization_guide/core/model_execution/model_execution_prefs.h
index 0be0487a..ab93b76 100644
--- a/components/optimization_guide/core/model_execution/model_execution_prefs.h
+++ b/components/optimization_guide/core/model_execution/model_execution_prefs.h
@@ -53,7 +53,7 @@
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
 extern const char kLastTimeEligibleForOnDeviceModelDownload[];
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-extern const char kModelQualityLogggingClientId[];
+extern const char kModelQualityLoggingClientId[];
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
 extern const char kGenAILocalFoundationalModelEnterprisePolicySettings[];
 
diff --git a/components/optimization_guide/core/model_execution/session_impl.cc b/components/optimization_guide/core/model_execution/session_impl.cc
index 976c183..f1a4fc6 100644
--- a/components/optimization_guide/core/model_execution/session_impl.cc
+++ b/components/optimization_guide/core/model_execution/session_impl.cc
@@ -234,14 +234,14 @@
 }
 
 void SessionImpl::GetExecutionInputSizeInTokens(
-    const google::protobuf::MessageLite& request_metadata,
+    MultimodalMessageReadView request_metadata,
     OptimizationGuideModelSizeInTokenCallback callback) {
   GetSizeInTokensInternal(request_metadata, std::move(callback),
                           /*want_input_context=*/false);
 }
 
 void SessionImpl::GetContextSizeInTokens(
-    const google::protobuf::MessageLite& request_metadata,
+    MultimodalMessageReadView request_metadata,
     OptimizationGuideModelSizeInTokenCallback callback) {
   GetSizeInTokensInternal(request_metadata, std::move(callback),
                           /*want_input_context=*/true);
@@ -256,7 +256,7 @@
 }
 
 void SessionImpl::GetSizeInTokensInternal(
-    const google::protobuf::MessageLite& request,
+    MultimodalMessageReadView request,
     OptimizationGuideModelSizeInTokenCallback callback,
     bool want_input_context) {
   // TODO(crbug.com/377539962): Return nullopt on error instead.
@@ -265,7 +265,7 @@
     return;
   }
   auto input = on_device_context_->opts().adapter->ConstructInputString(
-      MultimodalMessageReadView(request), want_input_context);
+      request, want_input_context);
   if (!input) {
     std::move(callback).Run(0);
     return;
diff --git a/components/optimization_guide/core/model_execution/session_impl.h b/components/optimization_guide/core/model_execution/session_impl.h
index 279fd02..981a12f 100644
--- a/components/optimization_guide/core/model_execution/session_impl.h
+++ b/components/optimization_guide/core/model_execution/session_impl.h
@@ -72,10 +72,10 @@
       const std::string& text,
       OptimizationGuideModelSizeInTokenCallback callback) override;
   void GetExecutionInputSizeInTokens(
-      const google::protobuf::MessageLite& request_metadata,
+      MultimodalMessageReadView request_metadata,
       OptimizationGuideModelSizeInTokenCallback callback) override;
   void GetContextSizeInTokens(
-      const google::protobuf::MessageLite& request_metadata,
+      MultimodalMessageReadView request_metadata,
       OptimizationGuideModelSizeInTokenCallback callback) override;
   const SamplingParams GetSamplingParams() const override;
 
@@ -93,7 +93,7 @@
   // Helper function to get the size of request in tokens with boolean flag to
   // control if we are extracting the context or the execution text.
   void GetSizeInTokensInternal(
-      const google::protobuf::MessageLite& request,
+      MultimodalMessageReadView request,
       OptimizationGuideModelSizeInTokenCallback callback,
       bool want_input_context);
 
diff --git a/components/optimization_guide/core/model_quality/model_quality_util.cc b/components/optimization_guide/core/model_quality/model_quality_util.cc
index 6415e02a..c86d13c0b 100644
--- a/components/optimization_guide/core/model_quality/model_quality_util.cc
+++ b/components/optimization_guide/core/model_quality/model_quality_util.cc
@@ -46,7 +46,7 @@
   }
 
   pref_service->SetInt64(optimization_guide::model_execution::prefs::
-                             localstate::kModelQualityLogggingClientId,
+                             localstate::kModelQualityLoggingClientId,
                          client_id);
   return client_id;
 }
@@ -68,11 +68,11 @@
   }
   int64_t client_id =
       pref_service->GetInt64(optimization_guide::model_execution::prefs::
-                                 localstate::kModelQualityLogggingClientId);
+                                 localstate::kModelQualityLoggingClientId);
   if (!client_id) {
     client_id = GenerateAndStoreClientId(pref_service);
     pref_service->SetInt64(optimization_guide::model_execution::prefs::
-                               localstate::kModelQualityLogggingClientId,
+                               localstate::kModelQualityLoggingClientId,
                            client_id);
   }
 
diff --git a/components/optimization_guide/core/optimization_guide_model_executor.h b/components/optimization_guide/core/optimization_guide_model_executor.h
index c4b48eb6..3bfbcb6 100644
--- a/components/optimization_guide/core/optimization_guide_model_executor.h
+++ b/components/optimization_guide/core/optimization_guide_model_executor.h
@@ -280,14 +280,14 @@
     // formatted by a call to `ExecuteModel()`. The result will be passed back
     // through the callback.
     virtual void GetExecutionInputSizeInTokens(
-        const google::protobuf::MessageLite& request_metadata,
+        MultimodalMessageReadView request_metadata,
         OptimizationGuideModelSizeInTokenCallback callback) = 0;
 
     // Gets the size in tokens used by request_metadata as it would be formatted
     // by a call to `AddContext()`. The result will be passed back through the
     // callback.
     virtual void GetContextSizeInTokens(
-        const google::protobuf::MessageLite& request_metadata,
+        MultimodalMessageReadView request_metadata,
         OptimizationGuideModelSizeInTokenCallback callback) = 0;
 
     // Return the sampling params for the current session.
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index 4e185f6..f73d4cb 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit 4e185f6350b47d631b33b5c5fcb8bc359e402990
+Subproject commit f73d4cb558082258f5c49cd4fa7772eea7d10415
diff --git a/components/optimization_guide/proto/features/forms_classifications.proto b/components/optimization_guide/proto/features/forms_classifications.proto
index 46dd87e5..327b22b 100644
--- a/components/optimization_guide/proto/features/forms_classifications.proto
+++ b/components/optimization_guide/proto/features/forms_classifications.proto
@@ -30,8 +30,6 @@
   FormTypeQuality quality = 3;
 
   ModelExecutionInfo model_execution_info = 4;
-
-  PageContent page_content = 5;
 }
 
 message AutofillAiTypeRequest {
@@ -45,6 +43,10 @@
   // A screenshot of the form.
   // This is optional and may be used by the model to improve predictions.
   FormMedia media = 3;
+
+  // The page content extracted from the page, including form and field names,
+  // types, surrounding text, and other relevant information.
+  PageContent page_content = 4;
 }
 
 message FormMedia {
@@ -52,6 +54,20 @@
   repeated bytes screenshots = 1;
 }
 
+// Next ID: 4
+message PageContent {
+  // The form data extracted from the page, including form and field names,
+  // types, and other relevant information.
+  repeated FormInfo forms = 1;
+
+  // Information about unowned form control elements found on the page.
+  repeated FormControlData unowned_form_controls = 2;
+
+  // The page content represented as a tree of semantic chunks and (in the
+  // future) annotated with additional information about the page.
+  AnnotatedPageContent annotated_page_content = 3;
+}
+
 message AutofillAiTypeResponse {
   // A list of field-level type predictions for the form.
   repeated FieldTypeResponse field_responses = 1;
@@ -80,17 +96,3 @@
   // User-provided feedback on the predictions.
   UserFeedback user_feedback = 1;
 }
-
-// Next ID: 4
-message PageContent {
-  // The form data extracted from the page, including form and field names,
-  // types, and other relevant information.
-  repeated FormInfo forms = 1;
-
-  // Information about unowned form control elements found on the page.
-  repeated FormControlData unowned_form_controls = 2;
-
-  // The page content represented as a tree of semantic chunks and (in the
-  // future) annotated with additional information about the page.
-  AnnotatedPageContent annotated_page_content = 3;
-}
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
index da92add1..ee12d6a 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -11,6 +11,7 @@
 
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/read_only_shared_memory_region.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
@@ -200,7 +201,7 @@
   // access the current WebContents.
   primary_page_ = nullptr;
   active_pages_.clear();
-  ukm_smoothness_data_.clear();
+  ukm_data_.clear();
   provisional_loads_.clear();
   aborted_provisional_loads_.clear();
 }
@@ -272,7 +273,7 @@
   }
   active_pages_.erase(rfh);
   inactive_pages_.erase(rfh);
-  ukm_smoothness_data_.erase(rfh);
+  ukm_data_.erase(rfh);
 }
 
 void MetricsWebContentsObserver::MediaStartedPlaying(
@@ -825,11 +826,13 @@
   const bool is_main_frame =
       render_frame_host && render_frame_host->GetParent() == nullptr;
   if (is_main_frame) {
-    auto it = ukm_smoothness_data_.find(render_frame_host);
-    if (it != ukm_smoothness_data_.end()) {
-      raw_tracker->metrics_update_dispatcher()->SetUpSharedMemoryForSmoothness(
-          render_frame_host, std::move(it->second));
-      ukm_smoothness_data_.erase(it);
+    auto ukm_it = ukm_data_.find(render_frame_host);
+    if (ukm_it != ukm_data_.end()) {
+      auto& [smoothness_memory, dropped_frames_memory] = ukm_it->second;
+      raw_tracker->metrics_update_dispatcher()->SetUpSharedMemoryForUkms(
+          render_frame_host, std::move(smoothness_memory),
+          std::move(dropped_frames_memory));
+      ukm_data_.erase(ukm_it);
     }
   }
 
@@ -1254,24 +1257,25 @@
   OnCustomUserTimingUpdated(render_frame_host, std::move(custom_timing));
 }
 
-void MetricsWebContentsObserver::SetUpSharedMemoryForSmoothness(
-    base::ReadOnlySharedMemoryRegion shared_memory) {
+void MetricsWebContentsObserver::SetUpSharedMemoryForUkms(
+    base::ReadOnlySharedMemoryRegion smoothness_memory,
+    base::ReadOnlySharedMemoryRegion dropped_frames_memory) {
   content::RenderFrameHost* render_frame_host =
       page_load_metrics_receivers_.GetCurrentTargetFrame();
   const bool is_outermost_main_frame =
       render_frame_host->GetParentOrOuterDocument() == nullptr;
   if (!is_outermost_main_frame) {
-    // TODO(crbug.com/40144214): Merge smoothness metrics from OOPIFs and
-    // FencedFrames with the main-frame. Also need to check if FencedFrames
-    // send this request correctly.
     return;
   }
 
   if (PageLoadTracker* tracker = GetPageLoadTracker(render_frame_host)) {
-    tracker->metrics_update_dispatcher()->SetUpSharedMemoryForSmoothness(
-        render_frame_host, std::move(shared_memory));
+    tracker->metrics_update_dispatcher()->SetUpSharedMemoryForUkms(
+        render_frame_host, std::move(smoothness_memory),
+        std::move(dropped_frames_memory));
   } else {
-    ukm_smoothness_data_.emplace(render_frame_host, std::move(shared_memory));
+    ukm_data_.emplace(render_frame_host,
+                      std::make_pair(std::move(smoothness_memory),
+                                     std::move(dropped_frames_memory)));
   }
 }
 
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h
index c9b54a87..a9f8a06c 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.h
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h
@@ -256,8 +256,9 @@
   void AddCustomUserTiming(
       mojom::CustomUserTimingMarkPtr custom_timing) override;
 
-  void SetUpSharedMemoryForSmoothness(
-      base::ReadOnlySharedMemoryRegion shared_memory) override;
+  void SetUpSharedMemoryForUkms(
+      base::ReadOnlySharedMemoryRegion smoothness_memory,
+      base::ReadOnlySharedMemoryRegion dropped_frames_memory) override;
 
   // Common part for UpdateThroughput and OnTimingUpdated.
   bool DoesTimingUpdateHaveError(PageLoadTracker* tracker);
@@ -392,9 +393,12 @@
       inactive_pages_;
 
   // This is currently set only for the main frame of each page associated with
-  // the WebContents.
-  base::flat_map<content::RenderFrameHost*, base::ReadOnlySharedMemoryRegion>
-      ukm_smoothness_data_;
+  // the WebContents. It maps to the shared memory for the smoothness and the
+  // dropped frame count UKMs.
+  base::flat_map<content::RenderFrameHost*,
+                 std::pair<base::ReadOnlySharedMemoryRegion,
+                           base::ReadOnlySharedMemoryRegion>>
+      ukm_data_;
 
   std::vector<mojom::CustomUserTimingMarkPtr> page_load_custom_timings_;
 
diff --git a/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h b/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h
index 50718b4..16b3aa9 100644
--- a/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h
+++ b/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h
@@ -174,8 +174,9 @@
   void OnFeaturesUsageObserved(
       content::RenderFrameHost* rfh,
       const std::vector<blink::UseCounterFeature>& features) override {}
-  void SetUpSharedMemoryForSmoothness(
-      const base::ReadOnlySharedMemoryRegion& shared_memory) override {}
+  void SetUpSharedMemoryForUkms(
+      const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+      const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) override {}
   void OnResourceDataUseObserved(
       content::RenderFrameHost* rfh,
       const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>&
diff --git a/components/page_load_metrics/browser/page_load_metrics_forward_observer.cc b/components/page_load_metrics/browser/page_load_metrics_forward_observer.cc
index e9138f6..8dd6d46f 100644
--- a/components/page_load_metrics/browser/page_load_metrics_forward_observer.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_forward_observer.cc
@@ -307,12 +307,10 @@
   parent_observer_->OnFeaturesUsageObserved(rfh, features);
 }
 
-// SetUpSharedMemoryForSmoothness is called only for the outermost page.
-void PageLoadMetricsForwardObserver::SetUpSharedMemoryForSmoothness(
-    const base::ReadOnlySharedMemoryRegion& shared_memory) {
-  // See also MetricsWebContentsObserver::SetUpSharedMemoryForSmoothness and
-  // the relevant TODO. Currently, information from OOPIFs and FencedFrames are
-  // not handled.
+// SetUpSharedMemoryForUkms is called only for the outermost page.
+void PageLoadMetricsForwardObserver::SetUpSharedMemoryForUkms(
+    const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+    const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) {
   // TODO(crbug.com/40895492): Investigate whether this should truly be
   // unreachable. Note that all NOTREACHED()s were made non-fatal in this file,
   // they are not all necessarily hit.
diff --git a/components/page_load_metrics/browser/page_load_metrics_forward_observer.h b/components/page_load_metrics/browser/page_load_metrics_forward_observer.h
index 4966a992..ce676e9 100644
--- a/components/page_load_metrics/browser/page_load_metrics_forward_observer.h
+++ b/components/page_load_metrics/browser/page_load_metrics_forward_observer.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_FORWARD_OBSERVER_H_
 #define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_FORWARD_OBSERVER_H_
 
+#include "base/memory/read_only_shared_memory_region.h"
 #include "base/memory/weak_ptr.h"
 #include "components/page_load_metrics/browser/page_load_metrics_observer_delegate.h"
 #include "components/page_load_metrics/browser/page_load_metrics_observer_interface.h"
@@ -120,8 +121,9 @@
   void OnFeaturesUsageObserved(
       content::RenderFrameHost* rfh,
       const std::vector<blink::UseCounterFeature>& features) override;
-  void SetUpSharedMemoryForSmoothness(
-      const base::ReadOnlySharedMemoryRegion& shared_memory) override;
+  void SetUpSharedMemoryForUkms(
+      const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+      const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) override;
   void OnResourceDataUseObserved(
       content::RenderFrameHost* rfh,
       const std::vector<mojom::ResourceDataUpdatePtr>& resources) override;
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.h b/components/page_load_metrics/browser/page_load_metrics_observer.h
index 2b8faebe..59f9628 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer.h
@@ -200,8 +200,9 @@
   void OnFeaturesUsageObserved(
       content::RenderFrameHost* rfh,
       const std::vector<blink::UseCounterFeature>& features) override {}
-  void SetUpSharedMemoryForSmoothness(
-      const base::ReadOnlySharedMemoryRegion& shared_memory) override {}
+  void SetUpSharedMemoryForUkms(
+      const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+      const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) override {}
   void OnResourceDataUseObserved(
       content::RenderFrameHost* rfh,
       const std::vector<mojom::ResourceDataUpdatePtr>& resources) override {}
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_interface.h b/components/page_load_metrics/browser/page_load_metrics_observer_interface.h
index 8e757b9a..a47aa52 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer_interface.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer_interface.h
@@ -450,11 +450,13 @@
       content::RenderFrameHost* rfh,
       const std::vector<blink::UseCounterFeature>& features) = 0;
 
-  // The smoothness metrics is shared over shared-memory. The observer should
-  // create a mapping (by calling |shared_memory.Map()|) so that they are able
-  // to read from the shared memory.
-  virtual void SetUpSharedMemoryForSmoothness(
-      const base::ReadOnlySharedMemoryRegion& shared_memory) = 0;
+  // The smoothness and dropped frame count metrics are shared over
+  // shared-memory. The observer should create a mapping (by calling
+  // |shared_memory.Map()|) so that they are able to read from the shared
+  // memory.
+  virtual void SetUpSharedMemoryForUkms(
+      const base::ReadOnlySharedMemoryRegion& smoothness_memory,
+      const base::ReadOnlySharedMemoryRegion& dropped_frames_memory) = 0;
 
   // Invoked when there is data use for loading a resource on the page
   // for a given RenderFrameHost. This only contains resources that have had
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
index 98062f9..4a441f6 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
@@ -508,15 +508,14 @@
   client_->UpdateFeaturesUsage(render_frame_host, new_features);
 }
 
-void PageLoadMetricsUpdateDispatcher::SetUpSharedMemoryForSmoothness(
+void PageLoadMetricsUpdateDispatcher::SetUpSharedMemoryForUkms(
     content::RenderFrameHost* render_frame_host,
-    base::ReadOnlySharedMemoryRegion shared_memory) {
+    base::ReadOnlySharedMemoryRegion smoothness_memory,
+    base::ReadOnlySharedMemoryRegion dropped_frames_memory) {
   const bool is_main_frame = client_->IsPageMainFrame(render_frame_host);
   if (is_main_frame) {
-    client_->SetUpSharedMemoryForSmoothness(std::move(shared_memory));
-  } else {
-    // TODO(crbug.com/40144214): Merge smoothness metrics from OOPIFs with the
-    // main-frame.
+    client_->SetUpSharedMemoryForUkms(std::move(smoothness_memory),
+                                      std::move(dropped_frames_memory));
   }
 }
 
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
index 4353bd2..970e20d 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
@@ -157,8 +157,9 @@
         const gfx::Rect& main_frame_viewport_rect) = 0;
     virtual void OnMainFrameImageAdRectsChanged(
         const base::flat_map<int, gfx::Rect>& main_frame_image_ad_rects) = 0;
-    virtual void SetUpSharedMemoryForSmoothness(
-        base::ReadOnlySharedMemoryRegion shared_memory) = 0;
+    virtual void SetUpSharedMemoryForUkms(
+        base::ReadOnlySharedMemoryRegion smoothness_memory,
+        base::ReadOnlySharedMemoryRegion dropped_frames_memory) = 0;
   };
 
   // The |client| instance must outlive this object.
@@ -187,9 +188,10 @@
                      mojom::SoftNavigationMetricsPtr soft_navigation_metrics,
                      internal::PageLoadTrackerPageType page_type);
 
-  void SetUpSharedMemoryForSmoothness(
+  void SetUpSharedMemoryForUkms(
       content::RenderFrameHost* render_frame_host,
-      base::ReadOnlySharedMemoryRegion shared_memory);
+      base::ReadOnlySharedMemoryRegion smoothness_memory,
+      base::ReadOnlySharedMemoryRegion dropped_frames_memory);
 
   // This method is only intended to be called for PageLoadFeatures being
   // recorded directly from the browser process. Features coming from the
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc
index a3a55487..ec8b778a 100644
--- a/components/page_load_metrics/browser/page_load_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -12,6 +12,7 @@
 
 #include "base/check_op.h"
 #include "base/feature_list.h"
+#include "base/memory/read_only_shared_memory_region.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/notreached.h"
@@ -1123,11 +1124,13 @@
   }
 }
 
-void PageLoadTracker::SetUpSharedMemoryForSmoothness(
-    base::ReadOnlySharedMemoryRegion shared_memory) {
-  DCHECK(shared_memory.IsValid());
+void PageLoadTracker::SetUpSharedMemoryForUkms(
+    base::ReadOnlySharedMemoryRegion smoothness_memory,
+    base::ReadOnlySharedMemoryRegion dropped_frames_memory) {
+  DCHECK(smoothness_memory.IsValid() && dropped_frames_memory.IsValid());
   for (auto& observer : observers_) {
-    observer->SetUpSharedMemoryForSmoothness(shared_memory);
+    observer->SetUpSharedMemoryForUkms(smoothness_memory,
+                                       dropped_frames_memory);
   }
 }
 
diff --git a/components/page_load_metrics/browser/page_load_tracker.h b/components/page_load_metrics/browser/page_load_tracker.h
index 3a7c204b..c890bed 100644
--- a/components/page_load_metrics/browser/page_load_tracker.h
+++ b/components/page_load_metrics/browser/page_load_tracker.h
@@ -235,8 +235,9 @@
       const gfx::Rect& main_frame_viewport_rect) override;
   void OnMainFrameImageAdRectsChanged(
       const base::flat_map<int, gfx::Rect>& main_frame_image_ad_rects) override;
-  void SetUpSharedMemoryForSmoothness(
-      base::ReadOnlySharedMemoryRegion shared_memory) override;
+  void SetUpSharedMemoryForUkms(
+      base::ReadOnlySharedMemoryRegion smoothness_memory,
+      base::ReadOnlySharedMemoryRegion dropped_frames_memory) override;
 
   // PageLoadMetricsObserverDelegate implementation:
   content::WebContents* GetWebContents() const override;
diff --git a/components/page_load_metrics/common/page_load_metrics.mojom b/components/page_load_metrics/common/page_load_metrics.mojom
index 6a17b16..6dddf5c 100644
--- a/components/page_load_metrics/common/page_load_metrics.mojom
+++ b/components/page_load_metrics/common/page_load_metrics.mojom
@@ -584,10 +584,12 @@
                SoftNavigationMetrics soft_navigation_metrics);
 
   // Set up a shared memory used to transfer smoothness data from the renderer
-  // to the browser. The structure is defined in
-  // //cc/metrics/ukm_smoothness_data.h
-  SetUpSharedMemoryForSmoothness(
-      mojo_base.mojom.ReadOnlySharedMemoryRegion shared_memory);
+  // to the browser. The structures are defined in
+  // //cc/metrics/ukm_smoothness_data.h and
+  // //cc/metrics/ukm_dropped_frames_data.h
+  SetUpSharedMemoryForUkms(
+    mojo_base.mojom.ReadOnlySharedMemoryRegion smoothness_memory,
+    mojo_base.mojom.ReadOnlySharedMemoryRegion dropped_frames_memory);
 
   // Called when performance entries are added via `performance.mark()` from the
   // outermost main frame in renderer, except for the case when standard
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.cc b/components/page_load_metrics/renderer/fake_page_timing_sender.cc
index d5b7d0b..e809b8eb 100644
--- a/components/page_load_metrics/renderer/fake_page_timing_sender.cc
+++ b/components/page_load_metrics/renderer/fake_page_timing_sender.cc
@@ -33,8 +33,9 @@
                            subresource_load_metrics, soft_navigation_metrics);
 }
 
-void FakePageTimingSender::SetUpSmoothnessReporting(
-    base::ReadOnlySharedMemoryRegion shared_memory) {}
+void FakePageTimingSender::SetUpUkmReporting(
+    base::ReadOnlySharedMemoryRegion smoothness_memory,
+    base::ReadOnlySharedMemoryRegion dropped_frames_memory) {}
 
 void FakePageTimingSender::SendCustomUserTiming(
     mojom::CustomUserTimingMarkPtr timing) {}
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.h b/components/page_load_metrics/renderer/fake_page_timing_sender.h
index b1a9605..71c7f36 100644
--- a/components/page_load_metrics/renderer/fake_page_timing_sender.h
+++ b/components/page_load_metrics/renderer/fake_page_timing_sender.h
@@ -166,8 +166,9 @@
           subresource_load_metrics,
       const mojom::SoftNavigationMetricsPtr& soft_navigation_metrics) override;
 
-  void SetUpSmoothnessReporting(
-      base::ReadOnlySharedMemoryRegion shared_memory) override;
+  void SetUpUkmReporting(
+      base::ReadOnlySharedMemoryRegion smoothness_memory,
+      base::ReadOnlySharedMemoryRegion dropped_frames_memory) override;
 
   void SendCustomUserTiming(mojom::CustomUserTimingMarkPtr timing) override;
 
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
index 08d56f0..78b6849 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -74,11 +74,13 @@
         subresource_load_metrics, soft_navigation_metrics->Clone());
   }
 
-  void SetUpSmoothnessReporting(
-      base::ReadOnlySharedMemoryRegion shared_memory) override {
+  void SetUpUkmReporting(
+      base::ReadOnlySharedMemoryRegion shared_memory_smoothness,
+      base::ReadOnlySharedMemoryRegion shared_memory_dropped_frames) override {
     DCHECK(page_load_metrics_);
-    page_load_metrics_->SetUpSharedMemoryForSmoothness(
-        std::move(shared_memory));
+    page_load_metrics_->SetUpSharedMemoryForUkms(
+        std::move(shared_memory_smoothness),
+        std::move(shared_memory_dropped_frames));
   }
 
   void SendCustomUserTiming(mojom::CustomUserTimingMarkPtr timing) override {
@@ -419,13 +421,16 @@
   WillDetach(blink::DetachReason::kNavigation);
 }
 
-bool MetricsRenderFrameObserver::SetUpSmoothnessReporting(
-    base::ReadOnlySharedMemoryRegion& shared_memory) {
+bool MetricsRenderFrameObserver::SetUpUkmReporting(
+    base::ReadOnlySharedMemoryRegion& shared_memory_smoothness,
+    base::ReadOnlySharedMemoryRegion& shared_memory_dropped_frames) {
   if (page_timing_metrics_sender_) {
-    page_timing_metrics_sender_->SetUpSmoothnessReporting(
-        std::move(shared_memory));
+    page_timing_metrics_sender_->SetUpUkmReporting(
+        std::move(shared_memory_smoothness),
+        std::move(shared_memory_dropped_frames));
   } else {
-    ukm_smoothness_data_ = std::move(shared_memory);
+    ukm_smoothness_data_ = std::move(shared_memory_smoothness);
+    ukm_dropped_frames_data_ = std::move(shared_memory_dropped_frames);
   }
   return true;
 }
@@ -479,9 +484,9 @@
 }
 
 void MetricsRenderFrameObserver::OnMetricsSenderCreated() {
-  if (ukm_smoothness_data_.IsValid()) {
-    page_timing_metrics_sender_->SetUpSmoothnessReporting(
-        std::move(ukm_smoothness_data_));
+  if (ukm_smoothness_data_.IsValid() && ukm_dropped_frames_data_.IsValid()) {
+    page_timing_metrics_sender_->SetUpUkmReporting(
+        std::move(ukm_smoothness_data_), std::move(ukm_dropped_frames_data_));
   }
 
   // Send the latest the frame intersection update, as otherwise we may miss
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
index 15d32d2b..1b5e244 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -136,8 +136,9 @@
   // blink::WebLocalFrameObserver implementation
   void OnFrameDetached() override;
 
-  bool SetUpSmoothnessReporting(
-      base::ReadOnlySharedMemoryRegion& shared_memory) override;
+  bool SetUpUkmReporting(
+      base::ReadOnlySharedMemoryRegion& shared_memory_smoothness,
+      base::ReadOnlySharedMemoryRegion& shared_memory_dropped_frames) override;
 
  protected:
   // The relative and monotonic page load timings.
@@ -182,6 +183,7 @@
 
   // Handle to the shared memory for transporting smoothness related ukm data.
   base::ReadOnlySharedMemoryRegion ukm_smoothness_data_;
+  base::ReadOnlySharedMemoryRegion ukm_dropped_frames_data_;
 
   // The main frame intersection rectangle signal received before
   // `page_timing_metrics_sender_` is created. The signal will be send out right
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
index 8765bc6..372bbb4 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -250,9 +250,11 @@
   it->second->SetIsMainFrameResource(is_main_frame_resource);
 }
 
-void PageTimingMetricsSender::SetUpSmoothnessReporting(
-    base::ReadOnlySharedMemoryRegion shared_memory) {
-  sender_->SetUpSmoothnessReporting(std::move(shared_memory));
+void PageTimingMetricsSender::SetUpUkmReporting(
+    base::ReadOnlySharedMemoryRegion shared_memory_smoothness,
+    base::ReadOnlySharedMemoryRegion shared_memory_dropped_frames) {
+  sender_->SetUpUkmReporting(std::move(shared_memory_smoothness),
+                             std::move(shared_memory_dropped_frames));
 }
 
 void PageTimingMetricsSender::Update(
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.h b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
index 2beb70f..f0c4955 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender.h
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
@@ -107,7 +107,11 @@
   void UpdateCpuTiming(base::TimeDelta task_time);
 
   void UpdateResourceMetadata(int resource_id, bool is_main_frame_resource);
-  void SetUpSmoothnessReporting(base::ReadOnlySharedMemoryRegion shared_memory);
+
+  void SetUpUkmReporting(
+      base::ReadOnlySharedMemoryRegion shared_memory_smoothness,
+      base::ReadOnlySharedMemoryRegion shared_memory_dropped_frames);
+
   void InitiateUserInteractionTiming();
   mojom::SoftNavigationMetricsPtr GetSoftNavigationMetrics() {
     return soft_navigation_metrics_->Clone();
diff --git a/components/page_load_metrics/renderer/page_timing_sender.h b/components/page_load_metrics/renderer/page_timing_sender.h
index 93e96ba..dd9f469 100644
--- a/components/page_load_metrics/renderer/page_timing_sender.h
+++ b/components/page_load_metrics/renderer/page_timing_sender.h
@@ -25,8 +25,9 @@
       const std::optional<blink::SubresourceLoadMetrics>&
           subresource_load_metrics,
       const mojom::SoftNavigationMetricsPtr& soft_navigation_metrics) = 0;
-  virtual void SetUpSmoothnessReporting(
-      base::ReadOnlySharedMemoryRegion shared_memory) = 0;
+  virtual void SetUpUkmReporting(
+      base::ReadOnlySharedMemoryRegion shared_memory_smoothness,
+      base::ReadOnlySharedMemoryRegion shared_memory_dropped_frames) = 0;
   virtual void SendCustomUserTiming(mojom::CustomUserTimingMarkPtr timing) = 0;
 };
 
diff --git a/components/payments/OWNERS b/components/payments/OWNERS
index 9a4f07a..c4c7959 100644
--- a/components/payments/OWNERS
+++ b/components/payments/OWNERS
@@ -1,3 +1,4 @@
 rouslan@chromium.org
 npnavarro@chromium.org
 smcgruer@chromium.org
+slobodan@chromium.org
diff --git a/components/plugins/renderer/webview_plugin.h b/components/plugins/renderer/webview_plugin.h
index 7059aab..d9be6eb 100644
--- a/components/plugins/renderer/webview_plugin.h
+++ b/components/plugins/renderer/webview_plugin.h
@@ -203,7 +203,8 @@
     void CreateFrameSink(
         mojo::PendingReceiver<viz::mojom::CompositorFrameSink>
             compositor_frame_sink_receiver,
-        mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>) override {}
+        mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>,
+        mojo::PendingRemote<blink::mojom::RenderInputRouterClient>) override {}
     void RegisterRenderFrameMetadataObserver(
         mojo::PendingReceiver<cc::mojom::RenderFrameMetadataObserverClient>
             render_frame_metadata_observer_client_receiver,
diff --git a/components/policy/core/common/BUILD.gn b/components/policy/core/common/BUILD.gn
index 471d4cf..a3c864fa 100644
--- a/components/policy/core/common/BUILD.gn
+++ b/components/policy/core/common/BUILD.gn
@@ -235,6 +235,7 @@
     "//components/enterprise/common:strings",
     "//components/enterprise/common/proto:chrome_reporting_entity",
     "//components/enterprise/common/proto:upload_request_response",
+    "//components/enterprise/connectors/core:constants",
     "//components/prefs",
     "//components/signin/public/identity_manager",
     "//components/strings",
@@ -635,6 +636,7 @@
     "//components/enterprise/common/proto:browser_events_proto",
     "//components/enterprise/common/proto:chrome_reporting_entity",
     "//components/enterprise/common/proto:upload_request_response",
+    "//components/enterprise/connectors/core:constants",
     "//components/invalidation:test_support",
     "//components/invalidation/impl:test_support",
     "//components/policy:generated",
diff --git a/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc b/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc
index 3e6c051..23780072 100644
--- a/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc
+++ b/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc
@@ -10,7 +10,9 @@
 #include "base/check_op.h"
 #include "base/feature_list.h"
 #include "base/json/json_reader.h"
+#include "base/metrics/histogram_functions.h"
 #include "components/enterprise/common/strings.h"
+#include "components/enterprise/connectors/core/reporting_constants.h"
 #include "components/policy/core/common/cloud/cloud_policy_client.h"
 #include "google_apis/google_api_keys.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -64,10 +66,36 @@
     default;
 
 std::string RealtimeReportingJobConfiguration::GetPayload() {
+  std::string payload;
+  std::string metric_name;
   if (base::FeatureList::IsEnabled(kUploadRealtimeReportingEventsUsingProto)) {
-    return upload_request_.SerializeAsString();
+    upload_request_.SerializeToString(&payload);
+    const auto& event_case = upload_request_.events(0).event_case();
+    metric_name =
+        enterprise_connectors::GetPayloadSizeUmaMetricName(event_case);
+  } else {
+    payload = ReportingJobConfigurationBase::GetPayload();
+
+    // When kUploadRealtimeReportingEventsUsingProto is disabled, the payload
+    // is serialized from the JSON dictionary in |payload_|, so use this
+    // dict to find the event type. |payload| still stores the final serialized
+    // string in both cases.
+    const auto& dict = payload_.FindList(kEventListKey)->front().GetDict();
+    for (const std::string& event_name :
+         enterprise_connectors::kAllReportingEvents) {
+      if (dict.contains(event_name)) {
+        metric_name =
+            enterprise_connectors::GetPayloadSizeUmaMetricName(event_name);
+        break;
+      }
+    }
   }
-  return ReportingJobConfigurationBase::GetPayload();
+  base::UmaHistogramCounts100000(
+      enterprise_connectors::kAllUploadSizeUmaMetricName, payload.size());
+  if (!metric_name.empty()) {
+    base::UmaHistogramCounts100000(metric_name, payload.size());
+  }
+  return payload;
 }
 
 std::string RealtimeReportingJobConfiguration::GetContentType() {
diff --git a/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc b/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
index 781ee3d48..7eb12f4 100644
--- a/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
+++ b/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/policy/core/common/cloud/realtime_reporting_job_configuration.h"
 
+#include <cstddef>
 #include <optional>
 #include <set>
 #include <vector>
@@ -11,6 +12,7 @@
 #include "base/check_deref.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/values.h"
@@ -18,6 +20,7 @@
 #include "components/enterprise/common/proto/synced/browser_events.pb.h"
 #include "components/enterprise/common/proto/synced_from_google3/chrome_reporting_entity.pb.h"
 #include "components/enterprise/common/proto/upload_request_response.pb.h"
+#include "components/enterprise/connectors/core/reporting_constants.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/core/common/cloud/cloud_policy_util.h"
 #include "components/policy/core/common/cloud/device_management_service.h"
@@ -41,7 +44,6 @@
 
 constexpr char kAppPackage[] = "appPackage";
 constexpr char kEventType[] = "eventType";
-constexpr char kAppInstallEvent[] = "androidAppInstallEvent";
 constexpr char kEventId[] = "eventId";
 constexpr char kStatusCode[] = "status";
 
@@ -77,8 +79,7 @@
 
   void SetUp() override {
     client_.SetDMToken(kDummyToken);
-    bool use_proto_format = GetParam();
-    if (use_proto_format) {
+    if (use_proto_format()) {
       feature_list_.InitAndEnableFeature(
           kUploadRealtimeReportingEventsUsingProto);
     } else {
@@ -91,7 +92,7 @@
         /*include_device_info=*/true,
         base::BindOnce(&MockCallbackObserver::OnURLLoadComplete,
                        base::Unretained(&callback_observer_)));
-    if (use_proto_format) {
+    if (use_proto_format()) {
       ::chrome::cros::reporting::proto::UploadEventsRequest request;
       request.mutable_browser()->set_user_agent("dummyAgent");
       for (size_t i = 0; i < kIds.size(); ++i) {
@@ -113,14 +114,18 @@
     }
   }
 
+  bool use_proto_format() { return GetParam(); }
+
  protected:
   const std::vector<std::string> kIds = {"id1", "id2", "id3"};
+  base::HistogramTester histogram_;
   static base::Value::Dict CreateEvent(const std::string& event_id, int type) {
     base::Value::Dict event;
     event.Set(kAppPackage, kPackage);
     event.Set(kEventType, type);
     base::Value::Dict wrapper;
-    wrapper.Set(kAppInstallEvent, std::move(event));
+    wrapper.Set(enterprise_connectors::kExtensionInstallEvent,
+                std::move(event));
     wrapper.Set(kEventId, event_id);
     return wrapper;
   }
@@ -218,7 +223,7 @@
 };
 
 TEST_P(RealtimeReportingJobConfigurationTest, ValidatePayload) {
-  if (GetParam()) {
+  if (use_proto_format()) {
     // If using the proto format, validate the request.
     ::chrome::cros::reporting::proto::UploadEventsRequest request;
     request.ParseFromString(configuration_->GetPayload());
@@ -286,7 +291,8 @@
       const std::string& id = CHECK_DEREF(event.FindString(kEventId));
       EXPECT_EQ(kIds[++i], id);
       const std::optional<int> type =
-          event.FindDict(kAppInstallEvent)->FindInt(kEventType);
+          event.FindDict(enterprise_connectors::kExtensionInstallEvent)
+              ->FindInt(kEventType);
       ASSERT_TRUE(type.has_value());
       EXPECT_EQ(i, *type);
     }
@@ -403,6 +409,17 @@
   EXPECT_EQ(original_payload, configuration_->GetPayload());
 }
 
+TEST_P(RealtimeReportingJobConfigurationTest, GetPayloadRecordsUmaMetrics) {
+  // GetPayload should record the payload size as an UMA metric.
+  std::string payload = configuration_->GetPayload();
+  histogram_.ExpectUniqueSample(
+      enterprise_connectors::kAllUploadSizeUmaMetricName, payload.size(), 1);
+
+  histogram_.ExpectUniqueSample(
+      enterprise_connectors::kExtensionInstallUploadSizeUmaMetricName,
+      payload.size(), 1);
+}
+
 TEST_P(RealtimeReportingJobConfigurationTest, OnBeforeRetry_PartialBatch) {
   // Only those events whose ids are in failed_uploads should be in the payload
   // after the OnBeforeRetry call.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index fa485d2..7833e39 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -1,13 +1,13 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
-<translation id="1000202298241288854">Tieni presente che questo criterio è stato rimosso nella versione M94.  Questo criterio era stato pensato soltanto per il periodo di transizione.
+<translation id="1000202298241288854">Tieni presente che questa policy è stata rimossa nella versione M94.  Questa policy era stata pensata soltanto per il periodo di transizione.
 
-      Se il criterio viene attivato, la funzionalità <ph name="PRODUCT_NAME" /> invierà intestazioni della richiesta granulari che forniscono informazioni sul browser e sull'ambiente degli utenti.
+      Se la policy viene attivata, la funzionalità <ph name="PRODUCT_NAME" /> invierà intestazioni della richiesta granulari che forniscono informazioni sul browser e sull'ambiente degli utenti.
       Si tratta di una funzionalità aggiuntiva, ma le nuove intestazioni potrebbero causare interruzioni su alcuni siti web che limitano il numero di caratteri della richiesta.
-      Se il criterio viene attivato o se non viene configurato, la funzionalità <ph name="PRODUCT_NAME" /> verrà attivata. Se il criterio viene disattivato, la funzionalità non sarà disponibile.</translation>
-<translation id="1001728814256572466">Se il criterio viene impostato su falso, i dati di <ph name="PRODUCT_NAME" />, inclusi cookie e archiviazione locale dei siti web, saranno esclusi da iCloud e dai backup locali su iOS.
-          Se questo criterio viene impostato su vero o se non viene impostato, <ph name="PRODUCT_NAME" /> potrebbe essere incluso nei backup.</translation>
+      Se la policy viene attivata o se non viene configurata, la funzionalità <ph name="PRODUCT_NAME" /> verrà attivata. Se la policy viene disattivata, la funzionalità non sarà disponibile.</translation>
+<translation id="1001728814256572466">Se la policy viene impostata su false, i dati di <ph name="PRODUCT_NAME" />, inclusi cookie e archiviazione locale dei siti web, saranno esclusi da iCloud e dai backup locali su iOS.
+          Se questa policy viene impostata su true o se non viene impostata, <ph name="PRODUCT_NAME" /> potrebbe essere incluso nei backup.</translation>
 <translation id="1002439864875515590">Se questa norma non viene configurata o se viene impostata una stringa vuota, non verrà mostrata un'opzione di completamento automatico durante il flusso di accesso dell'utente in <ph name="PRODUCT_OS_NAME" />.
       Se per questa norma viene impostata una stringa che rappresenta un nome di dominio, durante l'accesso dell'utente in <ph name="PRODUCT_OS_NAME" /> verrà mostrata un'opzione di completamento automatico che consentirà all'utente di digitare soltanto il nome utente senza l'estensione del nome di dominio.  L'utente potrà sovrascrivere l'estensione del nome di dominio.
       Se il valore della norma non è un dominio valido, la norma non sarà applicata.</translation>
@@ -16,11 +16,11 @@
 <translation id="1006218396155867129">Non consente agli utenti che accedono da remoto di trasferire i file da e verso l'host remoto</translation>
 <translation id="1007043180702842391">Consente di stabilire se il visualizzatore PDF in <ph name="PRODUCT_NAME" /> utilizza un iframe out-of-process (OOPIF). In futuro, questa sarà la nuova architettura di visualizzazione di PDF, in quanto è più semplice e semplificherà l'aggiunta di nuove funzionalità. Il visualizzatore PDF GuestView esistente è un'architettura obsoleta e complessa che verrà ritirata.
 
-Se questo criterio viene attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> potrà usare l'architettura del visualizzatore PDF OOPIF. Se il criterio viene attivato o se non viene configurato, il comportamento predefinito verrà deciso da <ph name="PRODUCT_NAME" />.
+Se questa policy viene attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> potrà usare l'architettura del visualizzatore PDF OOPIF. Se la policy viene attivata o se non viene configurata, il comportamento predefinito verrà deciso da <ph name="PRODUCT_NAME" />.
 
-Se questo criterio viene disattivato, <ph name="PRODUCT_NAME" /> userà rigorosamente il visualizzatore PDF GuestView esistente. Incorpora una pagina web con un albero di frame separato in un'altra pagina web.
+Se questa policy viene disattivata, <ph name="PRODUCT_NAME" /> userà rigorosamente il visualizzatore PDF GuestView esistente. Incorpora una pagina web con un albero di frame separato in un'altra pagina web.
 
-Questo criterio verrà rimosso in futuro, una volta completata l'implementazione della funzionalità del visualizzatore PDF OOPIF.</translation>
+Questa policy verrà rimossa in futuro, una volta completata l'implementazione della funzionalità del visualizzatore PDF OOPIF.</translation>
 <translation id="1007149936182752368">Disabilita la modifica dei preferiti</translation>
 <translation id="1009336698423963085">Consenti schermo intero automatico su questi siti</translation>
 <translation id="1010151305531217567">Imposta il tasto destro come tasto principale del mouse</translation>
@@ -31,13 +31,13 @@
 <translation id="1017967144265860778">Gestione dell'alimentazione nella schermata di accesso</translation>
 <translation id="1018427234617066902">Consente di forzare l'attivazione delle lingue per il controllo ortografico. Le lingue dell'elenco non riconosciute verranno ignorate.
 
-      Se attivi questo criterio, il controllo ortografico verrà attivato per le lingue specificate, oltre che per le lingue per cui l'utente ha attivato il controllo ortografico.
+      Se attivi questa policy, il controllo ortografico verrà attivato per le lingue specificate, oltre che per le lingue per cui l'utente ha attivato il controllo ortografico.
 
-      Se il criterio non viene impostato o viene disattivato, le preferenze di controllo ortografico dell'utente rimarranno invariate.
+      Se la policy non viene impostata o viene disattivata, le preferenze di controllo ortografico dell'utente rimarranno invariate.
 
-      Se il criterio <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> è impostato su False, questo criterio non avrà effetto.
+      Se la policy <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> è impostata su False, questa policy non avrà effetto.
 
-      Se una lingua è inclusa sia in questo criterio sia nel criterio <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" />, questo criterio ha la priorità e verrà attivata la lingua per il controllo ortografico.
+      Se una lingua è inclusa sia in questa policy sia nella policy <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" />, questa policy ha la priorità e verrà attivata la lingua per il controllo ortografico.
 
       Le lingue attualmente supportate sono: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="1019101089073227242">Imposta directory dati utente</translation>
@@ -53,11 +53,11 @@
 
           Se utilizzi una coppia di URL, il primo valore della coppia supporta *, mentre il secondo no. L'uso di * per il primo valore indica che tutti i siti possono utilizzare i cookie quando il secondo URL è il sito di primo livello.
 
-          Se questo criterio non viene configurato, per tutti i siti viene usato il valore predefinito globale del criterio <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> o <ph name="BLOCK_THIRD_PARTY_COOKIES_POLICY_NAME" />, se configurato, o della configurazione personale dell'utente.
+          Se questa policy non viene configurata, per tutti i siti viene usato il valore predefinito globale della policy <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> o <ph name="BLOCK_THIRD_PARTY_COOKIES_POLICY_NAME" />, se configurata, o della configurazione personale dell'utente.
 
-          Vedi anche i criteri <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_SESSIONS_ONLY_FOR_URLS" />. Tieni presente che non ci deve essere conflitto di pattern URL tra questi tre criteri. Non viene specificato quale criterio debba avere la precedenza.
+          Vedi anche le policy <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_SESSIONS_ONLY_FOR_URLS" />. Tieni presente che non ci deve essere conflitto di pattern URL tra queste tre policy. Non viene specificato quale policy debba avere la precedenza.
 
-          Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+          Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="102658870205613876">Impostazioni popup</translation>
 <translation id="1027000705181149370">Consente di specificare se trasferire o meno al profilo dell'utente i cookie di autenticazione impostati da un IdP SAML durante l'accesso.
 
@@ -69,19 +69,19 @@
 
       . Questa norma è valida soltanto per gli utenti il cui dominio corrisponde al dominio di registrazione del dispositivo. Per tutti gli altri utenti, i cookie impostati dall'IdP vengono trasferiti al profilo dell'utente soltanto durante il primo accesso sul dispositivo.</translation>
 <translation id="1029052664284722254">Forza il riavvio del dispositivo all'uscita dell'utente</translation>
-<translation id="1032533786864478457">Se il criterio viene impostato su Attivato, gli utenti possono configurare i propri dispositivi per sincronizzare gli SMS con i Chromebook. Gli utenti devono attivare esplicitamente questa funzionalità completando un flusso di configurazione. Una volta completato, gli utenti possono inviare e ricevere SMS sui propri Chromebook.
+<translation id="1032533786864478457">Se la policy viene impostata su Attivata, gli utenti possono configurare i propri dispositivi per sincronizzare gli SMS con i Chromebook. Gli utenti devono attivare esplicitamente questa funzionalità completando un flusso di configurazione. Una volta completato, gli utenti possono inviare e ricevere SMS sui propri Chromebook.
 
-      Se il criterio viene impostato su Disattivato, gli utenti non possono configurare la sincronizzazione dei messaggi.
+      Se la policy viene impostata su Disattivata, gli utenti non possono configurare la sincronizzazione dei messaggi.
 
-      Se non viene configurato, per impostazione predefinita, la funzionalità non è consentita per gli utenti gestiti, ma può essere utilizzata dagli altri utenti.</translation>
+      Se non viene configurata, per impostazione predefinita, la funzionalità non è consentita per gli utenti gestiti, ma può essere utilizzata dagli altri utenti.</translation>
 <translation id="1035860095382451169">Attiva l'icona lucchetto nella omnibox per le connessioni sicure</translation>
 <translation id="1037426296070139784">Certificati TLS che <ph name="PRODUCT_NAME" /> dovrebbe considerare non attendibili per l'autenticazione del server</translation>
 <translation id="1037470927044831850">Consenti ai siti di richiedere all'utente la condivisione di un video stream del suo schermo</translation>
 <translation id="1038049732032297658">Consente di attivare o disattivare la funzionalità di correzione automatica sulla tastiera fisica.
 
-Se questo criterio viene attivato o se non viene configurato, la funzionalità di correzione automatica sulla tastiera fisica sarà consentita.
+Se questa policy viene attivata o se non viene configurata, la funzionalità di correzione automatica sulla tastiera fisica sarà consentita.
 
-Se viene disattivato, la funzionalità di correzione automatica sulla tastiera fisica non sarà consentita.</translation>
+Se viene disattivata, la funzionalità di correzione automatica sulla tastiera fisica non sarà consentita.</translation>
 <translation id="1038725366103635282">Consenti il rilevamento condivisioni NetBIOS</translation>
 <translation id="1040446814317236570">Attiva la rimozione per gli URL PAC (https://)</translation>
 <translation id="1046484220783400299">Consente di attivare le funzioni della piattaforma web obsolete per un periodo di tempo limitato</translation>
@@ -90,36 +90,36 @@
 
       Se questa norma viene impostata, la schermata di accesso verrà sempre visualizzata nella lingua stabilita dal primo valore di questa norma (la norma viene definita come elenco per la compatibilità con le versioni successive). Se la norma non viene impostata o se viene impostato un elenco vuoto, la schermata di accesso verrà visualizzata nella lingua dell'ultima sessione utente. Se la norma viene impostata su un valore non corrispondente a una lingua valida, la schermata di accesso verrà visualizzata in una lingua di riserva (attualmente en-US).</translation>
 <translation id="1050158007881386475">Disattiva i report sullo stato della scheda del dispositivo</translation>
-<translation id="1052499923181221200">Questo criterio non ha effetti a meno che SamlInSessionPasswordChangeEnabled sia impostato su true.
-      Se quel criterio è impostato su true e questo criterio è impostato su (ad esempio) 14, significa che gli utenti SAML riceveranno una notifica che li informa con 14 giorni di anticipo che la password scadrà in una determinata data.
+<translation id="1052499923181221200">Questa policy non ha effetti a meno che SamlInSessionPasswordChangeEnabled sia impostata su true.
+      Se quella policy è impostata su true e questa policy è impostata su (ad esempio) 14, significa che gli utenti SAML riceveranno una notifica che li informa con 14 giorni di anticipo che la password scadrà in una determinata data.
       Quindi, gli utenti possono organizzarsi immediatamente, modificare la password all'interno della sessione e aggiornarla prima della scadenza.
       Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal Provider di identità SAML durante il flusso di accesso SAML.
-      Se imposti il criterio su zero, gli utenti non riceveranno nessuna notifica in anticipo, ma verranno avvisati una volta che la password è scaduta.
+      Se imposti la policy su zero, gli utenti non riceveranno nessuna notifica in anticipo, ma verranno avvisati una volta che la password è scaduta.
 
-      Se questo criterio viene impostato, l'utente non può modificarlo o ignorarlo.</translation>
+      Se questa policy viene impostata, l'utente non può modificarla o ignorarla.</translation>
 <translation id="105369313766849861">Consente di configurare la directory che <ph name="PRODUCT_FRAME_NAME" /> utilizza per memorizzare i dati utente.
 
-      Se il criterio viene configurato, <ph name="PRODUCT_FRAME_NAME" /> utilizza la directory fornita.
+      Se la policy viene configurata, <ph name="PRODUCT_FRAME_NAME" /> utilizza la directory fornita.
 
       Per un elenco di varianti che possono essere utilizzate, vai all'indirizzo https://support.google.com/chrome/a?p=Supported_directory_variables.
 
-      Se il criterio non viene configurato, viene utilizzata la directory del profilo predefinito.</translation>
+      Se la policy non viene configurata, viene utilizzata la directory del profilo predefinito.</translation>
 <translation id="1053981429146436598">Un gruppo di criteri relativi alle impostazioni delle richieste di rete privata.  Visita la pagina https://wicg.github.io/private-network-access/.</translation>
 <translation id="1059069692400941670">Disabilita l'importazione del motore di ricerca predefinito alla prima esecuzione</translation>
 <translation id="1062011392452772310">Attivazione dell'attestazione da remoto per il dispositivo</translation>
 <translation id="1062407476771304334">Sostituisci</translation>
-<translation id="1063860513136880926">Se il criterio viene impostato su Attivato, gli screenshot acquisiti con scorciatoie da tastiera o API di estensioni non sono consentiti. Se il criterio viene impostato su Disattivato o se non viene configurato, gli screenshot sono consentiti.
+<translation id="1063860513136880926">Se la policy viene impostata su Attivata, gli screenshot acquisiti con scorciatoie da tastiera o API di estensioni non sono consentiti. Se la policy viene impostata su Disattivata o se non viene configurata, gli screenshot sono consentiti.
 
 Tieni presente che su <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" /> gli screenshot acquisiti con applicazioni del sistema operativo o di terze parti sono consentiti.</translation>
-<translation id="1065175969514496951">La configurazione del criterio consente di accedere agli URL elencati durante l'autenticazione (ad es. nella schermata di accesso e nella schermata di blocco), sotto forma di eccezioni a <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" />. Leggi la descrizione del criterio per conoscere il formato delle voci di questo elenco. Ad esempio, se imposti il criterio <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" /> su <ph name="WILDCARD_VALUE" />, tutte le richieste verranno bloccate e puoi utilizzare questo criterio per consentire l'accesso a un elenco limitato di URL. Utilizzalo per aprire le eccezioni di alcuni schemi, sottodomini di altri domini, porte o percorsi specifici utilizzando il formato specificato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Il filtro più specifico consente di determinare se un URL è bloccato o consentito. Il criterio <ph name="DEVICE_AUTHENTICATION_URL_ALLOWLIST_POLICY_NAME" /> ha la precedenza sul criterio <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" />. Per questo criterio è possibile definire al massimo 1000 voci.
+<translation id="1065175969514496951">La configurazione della policy consente di accedere agli URL elencati durante l'autenticazione (ad es. nella schermata di accesso e nella schermata di blocco), sotto forma di eccezioni a <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" />. Leggi la descrizione della policy per conoscere il formato delle voci di questo elenco. Ad esempio, se imposti la policy <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" /> su <ph name="WILDCARD_VALUE" />, tutte le richieste verranno bloccate e puoi utilizzare questa policy per consentire l'accesso a un elenco limitato di URL. Utilizzalo per aprire le eccezioni di alcuni schemi, sottodomini di altri domini, porte o percorsi specifici utilizzando il formato specificato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Il filtro più specifico consente di determinare se un URL è bloccato o consentito. La policy <ph name="DEVICE_AUTHENTICATION_URL_ALLOWLIST_POLICY_NAME" /> ha la precedenza sulla policy <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" />. Per questa policy è possibile definire al massimo 1000 voci.
 
-Se il criterio non viene configurato, non sono consentite eccezioni a <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" />.</translation>
+Se la policy non viene configurata, non sono consentite eccezioni a <ph name="DEVICE_AUTHENTICATION_URL_BLOCKLIST_POLICY_NAME" />.</translation>
 <translation id="1068801725746725727">Attiva la ricezione di sondaggi di Navigazione sicura</translation>
 <translation id="107045325503547419">Dipende dal processo di implementazione della funzionalità.</translation>
 <translation id="1073983258515362346">Consente di segnalare informazioni sulla retroilluminazione del dispositivo.
 
-      Se il criterio viene impostato su false o non viene impostato, le informazioni non vengono segnalate.
-      Se viene impostato su true, le informazioni sulla retroilluminazione del dispositivo vengono segnalate.</translation>
+      Se la policy viene impostata su false o non viene impostata, le informazioni non vengono segnalate.
+      Se viene impostata su true, le informazioni sulla retroilluminazione del dispositivo vengono segnalate.</translation>
 <translation id="1076751984131277498">Elenco di dispositivi USB che è consentito scollegare</translation>
 <translation id="1077675271127011209">Disattiva i report sull'utilizzo e sui dati relativi agli arresti anomali</translation>
 <translation id="1079498696402787191">Usa il valore predefinito per gli hash consentiti in handshake TLS.</translation>
@@ -138,11 +138,11 @@
 </translation>
 <translation id="1099858055878287525">Per i profili di lavoro e della scuola, nella barra degli strumenti verrà mostrata per impostazione predefinita un'etichetta "Lavoro" o "Scuola" accanto all'avatar della barra degli strumenti. L'etichetta verrà mostrata solo se l'account a cui è stato eseguito l'accesso è gestito.
 
-Se questo criterio viene impostato su <ph name="HIDE_EXPANDED_ENTERPRISE_TOOLBAR_BADGE" /> (valore 1), il badge aziendale per un profilo gestito nella barra degli strumenti verrà nascosto.
+Se questa policy viene impostata su <ph name="HIDE_EXPANDED_ENTERPRISE_TOOLBAR_BADGE" /> (valore 1), il badge aziendale per un profilo gestito nella barra degli strumenti verrà nascosto.
 
-Se questo criterio non viene configurato o se viene impostato su <ph name="SHOW_EXPANDED_ENTERPRISE_TOOLBAR_BADGE" /> (valore 0), il badge aziendale verrà mostrato.
+Se questa policy non viene configurata o se viene impostata su <ph name="SHOW_EXPANDED_ENTERPRISE_TOOLBAR_BADGE" /> (valore 0), il badge aziendale verrà mostrato.
 
-L'etichetta è personalizzabile tramite il criterio <ph name="ENTERPRISE_CUSTOM_LABEL_POLICY_NAME" />.</translation>
+L'etichetta è personalizzabile tramite la policy <ph name="ENTERPRISE_CUSTOM_LABEL_POLICY_NAME" />.</translation>
 <translation id="1100840127293327071">Non selezionare l'opzione per mantenere i dati di navigazione esistenti per impostazione predefinita</translation>
 <translation id="1105572260329131950">Vengono usate icone predefinite per le connessioni sicure</translation>
 <translation id="1105711894873068933">Dopo la disattivazione di <ph name="LACROS_NAME" />, tutti i dati utente vengono rimossi all'accesso successivo.</translation>
@@ -155,33 +155,33 @@
 <translation id="111910763555783249">Impostazioni di notifica</translation>
 <translation id="1120898831571148679">Google Keep (supportato a partire versione 135)</translation>
 <translation id="1122068467107743258">Lavoro</translation>
-<translation id="1122089575901325963">L'impostazione di questo criterio consente di configurare il controller DTC (Diagnostics and Telemetry Controller) <ph name="WILCO_NAME" />, se disponibile sul dispositivo. Le dimensioni della configurazione non possono superare 1 MB (1.000.000 di byte) e il formato deve essere JSON. Il controller DTC <ph name="WILCO_NAME" /> è responsabile della gestione della configurazione. L'hash di crittografia consente di verificare l'integrità del download. La configurazione viene scaricata e memorizzata nella cache. Viene scaricata nuovamente ogni volta che l'URL o l'hash cambiano.
+<translation id="1122089575901325963">L'impostazione di questa policy consente di configurare il controller DTC (Diagnostics and Telemetry Controller) <ph name="WILCO_NAME" />, se disponibile sul dispositivo. Le dimensioni della configurazione non possono superare 1 MB (1.000.000 di byte) e il formato deve essere JSON. Il controller DTC <ph name="WILCO_NAME" /> è responsabile della gestione della configurazione. L'hash di crittografia consente di verificare l'integrità del download. La configurazione viene scaricata e memorizzata nella cache. Viene scaricata nuovamente ogni volta che l'URL o l'hash cambiano.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla.</translation>
 <translation id="1123650965531933634">Nega l'autorizzazione per il posizionamento delle finestre su tutti i siti per impostazione predefinita</translation>
 <translation id="1126037943895692096">Consenti agli utenti di includere dati di debug di basso livello Wi-Fi nel feedback degli utenti</translation>
 <translation id="1126456433590366966">Automatizza il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /></translation>
-<translation id="112794759469625182">Questo criterio è stato rimosso da M118. Consente di attivare e disattivare l'attestazione remota per l'utente, ma questa è attivata per impostazione predefinita.
+<translation id="112794759469625182">Questa policy è stata rimossa da M118. Consente di attivare e disattivare l'attestazione remota per l'utente, ma questa è attivata per impostazione predefinita.
 
-Se il criterio viene impostato su Attivato, gli utenti possono utilizzare l'hardware sui dispositivi <ph name="PRODUCT_OS_NAME" /> per attestare da remoto la propria identità all'autorità di certificazione della privacy tramite <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> usando la funzione <ph name="CHALLENGE_USER_KEY_FUNCTION" />.
+Se la policy viene impostata su Attivata, gli utenti possono utilizzare l'hardware sui dispositivi <ph name="PRODUCT_OS_NAME" /> per attestare da remoto la propria identità all'autorità di certificazione della privacy tramite <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> usando la funzione <ph name="CHALLENGE_USER_KEY_FUNCTION" />.
 
-      Se viene impostato su Disattivato o se non viene impostato, le chiamate all'API non vengono eseguite correttamente e viene visualizzato un codice di errore.</translation>
+      Se viene impostata su Disattivata o se non viene impostata, le chiamate all'API non vengono eseguite correttamente e viene visualizzato un codice di errore.</translation>
 <translation id="1133622335785078255">Consenti agli utenti di creare e usare profili secondari e di utilizzare la modalità ospite nel browser <ph name="LACROS_NAME" /></translation>
 <translation id="1137096407176363892">Consenti le voci di sintesi vocale di rete migliorate durante l'utilizzo della funzione di accessibilità in Seleziona per ascoltare. Queste voci inviano il testo ai server di Google per sintetizzare un discorso dal tono naturale.
 
-          Se questo criterio è impostato su false, la funzionalità di sintesi vocale di rete migliorata in Seleziona per ascoltare sarà sempre disattivata.
+          Se questa policy è impostata su false, la funzionalità di sintesi vocale di rete migliorata in Seleziona per ascoltare sarà sempre disattivata.
 
-          Se il criterio viene impostato su true o se non viene configurato, la funzionalità di sintesi vocale di rete migliorata in Seleziona per ascoltare può essere attivata o disattivata dall'utente.</translation>
+          Se la policy viene impostata su true o se non viene configurata, la funzionalità di sintesi vocale di rete migliorata in Seleziona per ascoltare può essere attivata o disattivata dall'utente.</translation>
 <translation id="1137479817584930805">Consenti il salvataggio delle immagini direttamente su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /></translation>
 <translation id="1138294736309071213">Questa norma è attiva soltanto in modalità retail.
 
       Consente di stabilire il periodo di tempo che deve trascorrere prima della visualizzazione del salvaschermo nella schermata di accesso dei dispositivi in modalità retail.
 
       Il valore della norma deve essere specificato in millisecondi.</translation>
-<translation id="1143257335984030879">Questo criterio consente di stabilire la disponibilità della funzionalità della lista della spesa.
-      Se viene attivato, agli utenti verrà presentata una UI per monitorare il prezzo del prodotto visualizzato nella pagina corrente. Il prodotto monitorato verrà mostrato nel riquadro laterale dei preferiti.
-      Se questo criterio viene impostato su Enabled o se non viene configurato, la funzionalità della lista della spesa sarà a disposizione degli utenti.
-      Se questo criterio viene impostato su Disabled, la funzionalità della lista della spesa non sarà disponibile.
+<translation id="1143257335984030879">Questa policy consente di stabilire la disponibilità della funzionalità della lista della spesa.
+      Se viene attivata, agli utenti verrà presentata una UI per monitorare il prezzo del prodotto visualizzato nella pagina corrente. Il prodotto monitorato verrà mostrato nel riquadro laterale dei preferiti.
+      Se questa policy viene impostata su Enabled o se non viene configurata, la funzionalità della lista della spesa sarà a disposizione degli utenti.
+      Se questa policy viene impostata su Disabled, la funzionalità della lista della spesa non sarà disponibile.
       </translation>
 <translation id="1144147113722324623">Attiva gli upgrade automatici a HTTPS di audio e video e mostra l'avviso "Non sicuro" per le immagini.</translation>
 <translation id="1146804230175611166">La funzionalità di ricerca nella cronologia basata sull'AI consente agli utenti di effettuare ricerche nella loro cronologia di navigazione e di ricevere risposte generate in base ai contenuti della pagina, non solo al titolo e all'URL.
@@ -201,7 +201,7 @@
 <translation id="1149841949061115313">Canale LTC</translation>
 <translation id="1150742937785306405">Consenti agli utenti di attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli annunci suggeriti dai siti.</translation>
 <translation id="1151353063931113432">Consenti immagini su questi siti</translation>
-<translation id="1151987132434751822">Gli schemi di autenticazione per i quali è possibile applicare le credenziali del criterio. È possibile impostare uno dei seguenti valori:
+<translation id="1151987132434751822">Gli schemi di autenticazione per i quali è possibile applicare le credenziali della policy. È possibile impostare uno dei seguenti valori:
             * basic
             * digest
             * ntlm
@@ -210,10 +210,10 @@
 <translation id="115699958189272121">Segnala eventi <ph name="CHROME_REMOTE_DESKTOP_PRODUCT_NAME" /></translation>
 <translation id="1157003104143964656">Questa impostazione consente di attivare o disattivare l'intercettazione dell'accesso.
 
-      Se questo criterio non viene configurato o se viene abilitato, la finestra di dialogo di intercettazione dell'accesso viene attivata quando viene aggiunto un Account Google sul Web; l'utente potrebbe avere la possibilità di spostare l'account in un altro profilo (nuovo o esistente).
+      Se questa policy non viene configurata o se viene abilitata, la finestra di dialogo di intercettazione dell'accesso viene attivata quando viene aggiunto un Account Google sul web; l'utente potrebbe avere la possibilità di spostare l'account in un altro profilo (nuovo o esistente).
 
-      Se questo criterio viene disabilitato, la finestra di dialogo di intercettazione dell'accesso non viene attivata.
-      Se viene disabilitato, una finestra di dialogo verrà mostrata se la separazione dei profili degli account gestiti viene applicata in modo forzato da <ph name="MANAGED_ACCOUNTS_SIGNIN_RESTRICTION_POLICY_NAME" />.</translation>
+      Se questa policy viene disabilitata, la finestra di dialogo di intercettazione dell'accesso non viene attivata.
+      Se viene disabilitata, una finestra di dialogo verrà mostrata se la separazione dei profili degli account gestiti viene applicata in modo forzato da <ph name="MANAGED_ACCOUNTS_SIGNIN_RESTRICTION_POLICY_NAME" />.</translation>
 <translation id="1158844608156732189">La configurazione Kerberos (una riga per elemento array); visita la pagina https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html.</translation>
 <translation id="1159241725763211010">Overlay di Lens consente agli utenti di eseguire ricerche su Google interagendo con uno screenshot della pagina corrente sovrapposto ai contenuti web effettivi. Inoltre, consente agli utenti di eseguire ricerche su Google sensibili al contesto della pagina corrente. Per fornire risposte contestuali, Overlay di Lens invia a Google i contenuti della pagina per rispondere alla query dell'utente con il contesto della pagina visualizzata.
 
@@ -238,28 +238,28 @@
 <translation id="117080706484659953">Consenti il rilevamento dell'ambito dei criteri su <ph name="MAC_OS_NAME" /></translation>
 <translation id="1171106901454883937">Attiva i report sulle informazioni relative alla versione del dispositivo</translation>
 <translation id="1173493742686115032">Attiva <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> in tutte le pagine web</translation>
-<translation id="1176740714945046981">Abilita la funzionalità di downgrade per le IWA. Per impostazione predefinita, vengono installate solo le versioni più recenti delle IWA. Se il criterio è impostato su <ph name="TRUE" />, puoi installare anche le versioni precedenti. Per consentire il downgrade, il valore della versione che vuoi deve essere specificato utilizzando il campo "pinned_version". Se il valore di "allow_downgrades" non viene specificato o è impostato su <ph name="FALSE" />, il downgrade è disabilitato per l'AIW.</translation>
-<translation id="1177624681620856105"> Questo criterio consente di stabilire se mostrare o meno la casella di controllo "Apri sempre" nei messaggi di conferma di avvio di protocolli esterni.
+<translation id="1176740714945046981">Abilita la funzionalità di downgrade per le IWA. Per impostazione predefinita, vengono installate solo le versioni più recenti delle IWA. Se la policy è impostata su <ph name="TRUE" />, puoi installare anche le versioni precedenti. Per consentire il downgrade, il valore della versione che vuoi deve essere specificato utilizzando il campo "pinned_version". Se il valore di "allow_downgrades" non viene specificato o è impostato su <ph name="FALSE" />, il downgrade è disabilitato per l'AIW.</translation>
+<translation id="1177624681620856105"> Questa policy consente di stabilire se mostrare o meno la casella di controllo "Apri sempre" nei messaggi di conferma di avvio di protocolli esterni.
 
-      Se questo criterio viene impostato su True o non viene impostato, quando viene mostrato un messaggio di conferma di protocollo esterno, l'utente può selezionare "Consenti sempre" per ignorare i futuri messaggi di conferma per il protocollo su questo sito.
+      Se questa policy viene impostata su True o non viene impostata, quando viene mostrato un messaggio di conferma di protocollo esterno, l'utente può selezionare "Consenti sempre" per ignorare i futuri messaggi di conferma per il protocollo su questo sito.
 
-      Se questo criterio viene impostato su False, la casella di controllo "Consenti sempre" non viene visualizzata e l'utente riceverà un messaggio ogni volta che viene richiamato un protocollo esterno.</translation>
+      Se questa policy viene impostata su False, la casella di controllo "Consenti sempre" non viene visualizzata e l'utente riceverà un messaggio ogni volta che viene richiamato un protocollo esterno.</translation>
 <translation id="1181598794547737681">Attiva l'UI del fumetto dei download</translation>
 <translation id="1182701225491473405">Impostazioni di Controlled Frame</translation>
 <translation id="1184531093651606913">Impedisci il caricamento delle estensioni dalla riga di comando</translation>
 <translation id="1184562656144537588">Il file manifest v2 è abilitato solo per le estensioni forzate</translation>
-<translation id="11903325225202653">Se il criterio è impostato su True, la modalità ad alto contrasto rimane attivata. Se il criterio è impostato su False, la modalità ad alto contrasto rimane disattivata.
+<translation id="11903325225202653">Se la policy è impostata su True, la modalità ad alto contrasto rimane attivata. Se la policy è impostata su False, la modalità ad alto contrasto rimane disattivata.
 
-      Se imposti il criterio, gli utenti non possono modificarlo. Se il criterio non è impostato, la modalità ad alto contrasto è disattivata, ma gli utenti possono attivarla in qualsiasi momento.</translation>
-<translation id="1190663377142764616">Consente di stabilire come trattare le VM in esecuzione che non corrispondono all'impostazione di questo criterio; il valore predefinito è <ph name="FORCE_SHUTDOWN_IF_MORE_RESTRICTED" />.</translation>
-<translation id="1192875037379495940">Se il criterio viene configurato, viene eseguito automaticamente l'accesso alla sessione specificata se non ci sono interazioni dell'utente nella schermata di accesso entro il periodo di tempo specificato nel criterio <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_DELAY_POLICY_NAME" />. L'account locale del dispositivo deve essere già configurato (vedi <ph name="DEVICE_LOCAL_ACCOUNTS_POLICY_NAME" />).
+      Se imposti la policy, gli utenti non possono modificarla. Se la policy non è impostata, la modalità ad alto contrasto è disattivata, ma gli utenti possono attivarla in qualsiasi momento.</translation>
+<translation id="1190663377142764616">Consente di stabilire come trattare le VM in esecuzione che non corrispondono all'impostazione di questa policy; il valore predefinito è <ph name="FORCE_SHUTDOWN_IF_MORE_RESTRICTED" />.</translation>
+<translation id="1192875037379495940">Se la policy viene configurata, viene eseguito automaticamente l'accesso alla sessione specificata se non ci sono interazioni dell'utente nella schermata di accesso entro il periodo di tempo specificato nella policy <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_DELAY_POLICY_NAME" />. L'account locale del dispositivo deve essere già configurato (vedi <ph name="DEVICE_LOCAL_ACCOUNTS_POLICY_NAME" />).
 
-      Se non viene configurato, non è possibile effettuare l'accesso automatico.</translation>
+      Se non viene configurata, non è possibile effettuare l'accesso automatico.</translation>
 <translation id="1193653806129988688">Impedisci agli utenti di utilizzare le offerte tramite la registrazione a <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="1197437816436565375">Non puoi forzare le app Android a utilizzare un proxy. Un sottoinsieme di impostazioni relative al proxy viene messo a disposizione delle app Android, che possono decidere volontariamente se rispettarlo o meno. Consulta la norma <ph name="PROXY_MODE_POLICY_NAME" /> per ulteriori dettagli.</translation>
-<translation id="1198183996903759302">Se il criterio è impostato su true (o se <ph name="HARDWARE_ACCELERATION_MODE_ENABLED_POLICY_NAME" /> è impostato su false), le pagine web non possono accedere all'API WebGL e i plug-in non possono usare l'API Pepper 3D.
+<translation id="1198183996903759302">Se la policy è impostata su true (o se <ph name="HARDWARE_ACCELERATION_MODE_ENABLED_POLICY_NAME" /> è impostata su false), le pagine web non possono accedere all'API WebGL e i plug-in non possono usare l'API Pepper 3D.
 
-      Se il criterio è impostato su false o non viene configurato, le pagine web possono usare l'API WebGL e i plug-in possono usare l'API Pepper 3D, ma le impostazioni predefinite del browser potrebbero comunque richiedere argomenti della riga di comando per usare queste API.</translation>
+      Se la policy è impostata su false o non viene configurata, le pagine web possono usare l'API WebGL e i plug-in possono usare l'API Pepper 3D, ma le impostazioni predefinite del browser potrebbero comunque richiedere argomenti della riga di comando per usare queste API.</translation>
 <translation id="1198458955128279215">Utilizza il comportamento predefinito del piano di implementazione delle funzionalità.</translation>
 <translation id="1202216683470826356">Mostra schede nella pagina Nuova scheda</translation>
 <translation id="1203676252390737801">Gestione dell'IP di WebRTC per URL</translation>
@@ -275,19 +275,19 @@
 <translation id="1221955019309484560">Attiva gli aggiornamenti per tutti i componenti</translation>
 <translation id="1222694988453895594">Consente di impostare un elenco di protocolli, e per ogni protocollo un elenco associato di pattern di origini consentite, che possono lanciare un'applicazione esterna senza chiedere conferma all'utente. Il separatore finale non deve essere incluso nell'elenco di protocolli, quindi usa "skype" anziché "skype:" o "skype://".
 
-Se questo criterio viene impostato, un protocollo sarà autorizzato a lanciare un'applicazione esterna senza chiedere conferma in base al criterio soltanto se il protocollo è nell'elenco e se l'origine del sito che prova a lanciare il protocollo corrisponde a uno dei pattern di origini nell'elenco allowed_origins del protocollo. Se una delle condizioni è falsa, la richiesta di lancio di un protocollo esterno non sarà omessa, in base al criterio.
+Se questa policy viene impostata, un protocollo sarà autorizzato a lanciare un'applicazione esterna senza chiedere conferma in base alla policy soltanto se il protocollo è nell'elenco e se l'origine del sito che prova a lanciare il protocollo corrisponde a uno dei pattern di origini nell'elenco allowed_origins del protocollo. Se una delle condizioni è falsa, la richiesta di lancio di un protocollo esterno non sarà omessa, in base alla policy.
 
-Se questo criterio non viene impostato, per impostazione predefinita nessun protocollo può essere lanciato senza chiedere conferma. Gli utenti possono disattivare le richieste di conferma per ogni singolo protocollo/sito, a meno che il criterio <ph name="EXTERNAL_PROTOCOL_DIALOG_SHOW_ALWAYS_OPEN_CHECKBOX_POLICY_NAME" /> sia impostato su Disattivato. Questo criterio non influisce sulle esenzioni delle richieste di conferma per ogni singolo protocollo/sito impostate dagli utenti.
+Se questa policy non viene impostata, per impostazione predefinita nessun protocollo può essere lanciato senza chiedere conferma. Gli utenti possono disattivare le richieste di conferma per ogni singolo protocollo/sito, a meno che la policy <ph name="EXTERNAL_PROTOCOL_DIALOG_SHOW_ALWAYS_OPEN_CHECKBOX_POLICY_NAME" /> sia impostata su Disattivata. Questa policy non influisce sulle esenzioni delle richieste di conferma per ogni singolo protocollo/sito impostate dagli utenti.
 
-Per i pattern corrispondenti alle origini viene usato un formato simile a quello usato per i pattern del criterio "<ph name="URL_BLOCKLIST_POLICY_NAME" />", documentati all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
+Per i pattern corrispondenti alle origini viene usato un formato simile a quello usato per i pattern della policy "<ph name="URL_BLOCKLIST_POLICY_NAME" />", documentati all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
 
-I pattern corrispondenti alle origini di questo criterio non possono però contenere elementi "/path" o "@query". I pattern contenenti un elemento "/path" o "@query" verranno ignorati.</translation>
+I pattern corrispondenti alle origini di questa policy non possono però contenere elementi "/path" o "@query". I pattern contenenti un elemento "/path" o "@query" verranno ignorati.</translation>
 <translation id="1223789468190631420">Stato attivazione Navigazione sicura per origini attendibili</translation>
 <translation id="123018742985150697">Richiede la corrispondenza tra utente locale e proprietario dell'host di accesso remoto</translation>
 <translation id="123081309365616809">Attiva la trasmissione di contenuti al dispositivo</translation>
-<translation id="1233343906578850273">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POLICY_NAME" /> consente di specificare l'URL del motore di ricerca utilizzato per le immagini. Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> viene configurato, la ricerca immagini richiede invece l'utilizzo del metodo POST.
+<translation id="1233343906578850273">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POLICY_NAME" /> consente di specificare l'URL del motore di ricerca utilizzato per le immagini. Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> viene configurata, la ricerca immagini richiede invece l'utilizzo del metodo POST.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POLICY_NAME" /> non viene configurato, non viene utilizzata alcuna ricerca immagini.
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POLICY_NAME" /> non viene configurata, non viene utilizzata alcuna ricerca immagini.
 
       Se la ricerca immagini utilizza il metodo Get, l'URL deve specificare i parametri delle immagini utilizzando una combinazione valida dei seguenti segnaposto:
       <ph name="IMAGE_IMAGE_URL" />,
@@ -300,29 +300,29 @@
 <translation id="1238868319430505522">Configura il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /></translation>
 <translation id="1239526922294123540">Consente di stabilire se i siti web possono o meno effettuare richieste agli endpoint di rete con un livello di protezione più alto in modo non sicuro.
 
-          Se questo criterio viene impostato su vero, vengono disattivati tutti i controlli di <ph name="PRIVATE_NETWORK_ACCESS" /> per tutte le origini. Gli utenti malintenzionati potrebbero riuscire a compiere attacchi <ph name="CSRF" /> su server di reti private.
+          Se questa policy viene impostata su true, vengono disattivati tutti i controlli di <ph name="PRIVATE_NETWORK_ACCESS" /> per tutte le origini. Gli utenti malintenzionati potrebbero riuscire a compiere attacchi <ph name="CSRF" /> su server di reti private.
 
-          Se il criterio viene impostato su falso o se non viene configurato, il comportamento predefinito per le richieste agli endpoint di rete con un livello di protezione più alto dipende dalla configurazione personale dell'utente per i flag funzionalità <ph name="BLOCK_INSECURE_PRIVATE_NETWORK_REQUESTS_FEATURE_NAME" />, <ph name="PRIVATE_NETWORK_ACCESS_SEND_PREFLIGHTS_FEATURE_NAME" /> e <ph name="PRIVATE_NETWORK_ACCESS_RESPECT_PREFLIGHT_RESULTS_FEATURE_NAME" />, che possono essere configurati in base a prove sul campo o alla riga di comando.
+          Se la policy viene impostata su false o se non viene configurata, il comportamento predefinito per le richieste agli endpoint di rete con un livello di protezione più alto dipende dalla configurazione personale dell'utente per i flag funzionalità <ph name="BLOCK_INSECURE_PRIVATE_NETWORK_REQUESTS_FEATURE_NAME" />, <ph name="PRIVATE_NETWORK_ACCESS_SEND_PREFLIGHTS_FEATURE_NAME" /> e <ph name="PRIVATE_NETWORK_ACCESS_RESPECT_PREFLIGHT_RESULTS_FEATURE_NAME" />, che possono essere configurati in base a prove sul campo o alla riga di comando.
 
-          Questo criterio riguarda la specifica <ph name="PRIVATE_NETWORK_ACCESS" />. Per maggiori dettagli, visita la pagina https://wicg.github.io/private-network-access/.
+          Questa policy riguarda la specifica <ph name="PRIVATE_NETWORK_ACCESS" />. Per maggiori dettagli, visita la pagina https://wicg.github.io/private-network-access/.
 
           Un endpoint di rete ha un livello di protezione più alto di un altro se:
           1) Il suo indirizzo IP è localhost e quello dell'altro no.
           2) Il suo indirizzo IP è privato e quello dell'altro è pubblico.
-          In futuro, a seconda dell'evoluzione della specifica, questo criterio potrebbe essere applicato a tutte le richieste multiorigine indirizzate a localhost o IP privati.
+          In futuro, a seconda dell'evoluzione della specifica, questa policy potrebbe essere applicata a tutte le richieste multiorigine indirizzate a localhost o IP privati.
 
-          Se il criterio viene impostato su vero, i siti web possono effettuare richieste a qualsiasi endpoint di rete, soggette ad altri controlli multiorigine.</translation>
+          Se la policy viene impostata su true, i siti web possono effettuare richieste a qualsiasi endpoint di rete, soggette ad altri controlli multiorigine.</translation>
 <translation id="1240559668501539326">Consente di impostare i metadati utilizzati dal programma di installazione per le VM Bruschetta sui dispositivi <ph name="PRODUCT_OS_NAME" />, prima dell'installazione del programma.</translation>
-<translation id="1240722269871366886">Questo criterio consente a <ph name="PRODUCT_OS_NAME" /> di suggerire le emoji quando gli utenti digitano il testo sulle tastiere fisiche o virtuali.
-      Se questo criterio viene impostato su vero, la funzionalità verrà attivata e gli utenti potranno modificarla.
-      Per impostazione predefinita questo criterio è impostato su falso, il che significa che non vengono suggerite emoji e gli utenti non possono ignorarlo.</translation>
+<translation id="1240722269871366886">Questa policy consente a <ph name="PRODUCT_OS_NAME" /> di suggerire le emoji quando gli utenti digitano il testo sulle tastiere fisiche o virtuali.
+      Se questa policy viene impostata su true, la funzionalità verrà attivata e gli utenti potranno modificarla.
+      Per impostazione predefinita questa policy è impostata su false, il che significa che non vengono suggerite emoji e gli utenti non possono ignorarla.</translation>
 <translation id="1241536186320046498">Chiedi ogni volta che un sito vuole ottenere l'autorizzazione per il posizionamento delle finestre</translation>
 <translation id="1243311058213605210">Disattiva gli upgrade automatici a HTTPS di audio e video e non mostrare alcun avviso per le immagini.</translation>
 <translation id="1243570869342663665">Controlla il filtro dei contenuti per adulti di SafeSites.</translation>
-<translation id="1244309789361056660">Questo criterio è stato rimosso in M87 e le home directory vengono automaticamente integrate a ext4 all'accesso.
-      La configurazione del criterio consente di specificare l'azione da eseguire quando la home directory dell'utente è stata creata con la crittografia ecryptfs. A meno che le home directory con crittografia ecryptfs non eseguano la migrazione alla crittografia ext4, l'esecuzione delle app Android potrebbe interrompersi.
+<translation id="1244309789361056660">Questa policy è stata rimossa in M87 e le home directory vengono automaticamente integrate a ext4 all'accesso.
+      La configurazione della policy consente di specificare l'azione da eseguire quando la home directory dell'utente è stata creata con la crittografia ecryptfs. A meno che le home directory con crittografia ecryptfs non eseguano la migrazione alla crittografia ext4, l'esecuzione delle app Android potrebbe interrompersi.
 
-      L'impostazione del criterio su:
+      L'impostazione della policy su:
 
       * Migrate (o su opzioni non supportate come AskUser o AskForEcryptfsArcUsers) implica la migrazione automatica delle directory a ext4 all'accesso, senza richiedere il consenso dell'utente.
 
@@ -330,18 +330,18 @@
 
       * DisallowArc, o la sua mancata configurazione, impedisce la migrazione e interrompe l'esecuzione delle app Android dell'utente.
 
-      Il criterio non si applica agli utenti kiosk.
+      La policy non si applica agli utenti kiosk.
 
       Avviso: Wipe e MinimalMigrate comportano la rimozione dei dati locali.</translation>
 <translation id="1248955696540150266">Consenti i download di aggiornamento automatico peer-to-peer</translation>
-<translation id="1250597158212586309">Se il criterio viene impostato su Attivato o se non viene configurato, l'utente ha la possibilità di ignorare/ripristinare gli avvisi relativi alle password compromesse.
+<translation id="1250597158212586309">Se la policy viene impostata su Attivata o se non viene configurata, l'utente ha la possibilità di ignorare/ripristinare gli avvisi relativi alle password compromesse.
 
       Se disattivi questa impostazione, gli utenti non potranno ignorare gli avvisi relativi alle password compromesse. Se la attivi, gli utenti potranno ignorare gli avvisi relativi alle password compromesse.</translation>
 <translation id="1252536192437793850">Consenti ai siti di chiedere all'utente di concedere l'accesso a una porta seriale</translation>
 <translation id="1255159327956066463">Attiva la funzionalità di finestre nascoste</translation>
-<translation id="125655429495551011">Se il criterio viene impostato su una stringa, questa viene applicata come nome host del dispositivo durante la richiesta DHCP. La stringa può comportare la sostituzione delle variabili <ph name="ASSET_ID_PLACEHOLDER" />, <ph name="SERIAL_NUM_PLACEHOLDER" />, <ph name="MAC_ADDR_PLACEHOLDER" />, <ph name="MACHINE_NAME_PLACEHOLDER" /> e<ph name="LOCATION_PLACEHOLDER" /> con i valori sul dispositivo prima che venga utilizzata come nome host. La conseguente sostituzione deve essere un nome host valido (come da RFC 1035, sezione 3.1).
+<translation id="125655429495551011">Se la policy viene impostata su una stringa, questa viene applicata come nome host del dispositivo durante la richiesta DHCP. La stringa può comportare la sostituzione delle variabili <ph name="ASSET_ID_PLACEHOLDER" />, <ph name="SERIAL_NUM_PLACEHOLDER" />, <ph name="MAC_ADDR_PLACEHOLDER" />, <ph name="MACHINE_NAME_PLACEHOLDER" /> e <ph name="LOCATION_PLACEHOLDER" /> con i valori sul dispositivo prima che venga utilizzata come nome host. La conseguente sostituzione deve essere un nome host valido (come da RFC 1035, sezione 3.1).
 
-      Se il criterio non viene configurato o se il valore dopo la sostituzione non è un nome host valido, non viene impostato nessun nome host nella richiesta DHCP.</translation>
+      Se la policy non viene configurata o se il valore dopo la sostituzione non è un nome host valido, non viene impostato nessun nome host nella richiesta DHCP.</translation>
 <translation id="1257550411839719984">Imposta directory di download predefinita</translation>
 <translation id="1262993197422487260">Non mostrare il pulsante di visualizzazione della password nella schermata di accesso e di blocco</translation>
 <translation id="1265053460044691532">Limita il tempo per cui un utente autenticato tramite SAML può eseguire l'accesso offline</translation>
@@ -352,19 +352,19 @@
 <translation id="1272798957154751008">Attiva la migrazione dei dispositivi Chromad nella gestione del cloud</translation>
 <translation id="1274997165432133392">Cookie e altri dati dei siti</translation>
 <translation id="1277411517984768103">Consenti l'esecuzione di <ph name="BOREALIS_NAME" /> per un utente</translation>
-<translation id="1277489612460516394">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che possono aprire popup.
+<translation id="1277489612460516394">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che possono aprire popup.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="1285819498003746288">L'API Event.path non sarà disponibile.</translation>
-<translation id="1290722184971934486">Se il criterio viene impostato su <ph name="BLOCK_WINDOW_MANAGEMENT_POLICY_NAME" /> (valore 2), per impostazione predefinita viene automaticamente negata ai siti l'autorizzazione per la gestione delle finestre. Ciò limiterà la capacità dei siti di vedere le informazioni sulle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
+<translation id="1290722184971934486">Se la policy viene impostata su <ph name="BLOCK_WINDOW_MANAGEMENT_POLICY_NAME" /> (valore 2), per impostazione predefinita viene automaticamente negata ai siti l'autorizzazione per la gestione delle finestre. Ciò limiterà la capacità dei siti di vedere le informazioni sulle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
 
-Se il criterio viene impostato su <ph name="ASK_WINDOW_MANAGEMENT_POLICY_NAME" /> (valore 3), per impostazione predefinita viene mostrata all'utente la richiesta di autorizzazione per la gestione delle finestre. Se l'utente concede l'autorizzazione, i siti potranno vedere le informazioni sulle schermate del dispositivo e utilizzare quelle informazioni per aprire e posizionare le finestre oppure per richiedere lo schermo interno su schermate specifiche.
+Se la policy viene impostata su <ph name="ASK_WINDOW_MANAGEMENT_POLICY_NAME" /> (valore 3), per impostazione predefinita viene mostrata all'utente la richiesta di autorizzazione per la gestione delle finestre. Se l'utente concede l'autorizzazione, i siti potranno vedere le informazioni sulle schermate del dispositivo e utilizzare quelle informazioni per aprire e posizionare le finestre oppure per richiedere lo schermo interno su schermate specifiche.
 
-Se il criterio non viene configurato, si applica il criterio <ph name="ASK_WINDOW_MANAGEMENT_POLICY_NAME" />, ma gli utenti possono cambiare l'impostazione.
+Se la policy non viene configurata, si applica la policy <ph name="ASK_WINDOW_MANAGEMENT_POLICY_NAME" />, ma gli utenti possono cambiare l'impostazione.
 
-Questo sostituisce il criterio <ph name="DEFAULT_WINDOW_PLACEMENT_SETTING_POLICY_NAME" /> obsoleto.</translation>
+Sostituisce la policy <ph name="DEFAULT_WINDOW_PLACEMENT_SETTING_POLICY_NAME" /> obsoleta.</translation>
 <translation id="129206366270737897">Consente di disattivare tutti i metodi asincroni di <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" />.</translation>
 <translation id="1294263471858445589">Attiva l'autenticazione ambientale nelle sessioni standard e in modalità in incognito.</translation>
 <translation id="1295737447968372331">Attiva la dettatura sulla schermata di accesso</translation>
@@ -376,85 +376,85 @@
 Per ulteriori informazioni sui contesti sicuri, visita il sito Secure Contexts: https://www.w3.org/TR/secure-contexts.</translation>
 <translation id="1297961932043741908">Imposta un limite sui megabyte di memoria che una istanza singola di Chrome può usare.</translation>
 <translation id="1304973015437969093">ID app/estensioni e URL di aggiornamento da installare automaticamente</translation>
-<translation id="1305400589435476516">Se il criterio viene impostato su Attivato, il roaming dei dati è consentito per il dispositivo.
+<translation id="1305400589435476516">Se la policy viene impostata su Attivata, il roaming dei dati è consentito per il dispositivo.
 
-      Se viene impostato su Disattivato o se non viene configurato, il roaming dei dati non è disponibile.</translation>
+      Se viene impostata su Disattivata o se non viene configurata, il roaming dei dati non è disponibile.</translation>
 <translation id="1306041796676461437">Disattiva supporto per Extensible Enterprise SSO</translation>
-<translation id="1308526987406924874">Se il criterio viene configurato, puoi elencare i pattern URL che specificano i siti che non possono chiedere agli utenti l'autorizzazione di accesso a una porta seriale.
+<translation id="1308526987406924874">Se la policy viene configurata, puoi elencare i pattern URL che specificano i siti che non possono chiedere agli utenti l'autorizzazione di accesso a una porta seriale.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Per i pattern URL che non presentano corrispondenze con il criterio <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" /> (se una corrispondenza è presente), <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> (se configurato) o le impostazioni personali degli utenti hanno la precedenza in questo ordine.
+      Per i pattern URL che non presentano corrispondenze con la policy <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" /> (se una corrispondenza è presente), <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> (se configurata) o le impostazioni personali degli utenti hanno la precedenza in questo ordine.
 
-      I pattern URL non possono essere in conflitto con <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non possono essere in conflitto con <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="1309259005392595570">Disattiva l'accordo chiave post-quantistico per TLS</translation>
-<translation id="1309465583050255779">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_NAME_POLICY_NAME" /> consente di specificare il nome del provider di ricerca predefinito.
+<translation id="1309465583050255779">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_NAME_POLICY_NAME" /> consente di specificare il nome del provider di ricerca predefinito.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_NAME_POLICY_NAME" /> non viene configurato, viene utilizzato il nome host specificato dall'URL di ricerca.</translation>
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_NAME_POLICY_NAME" /> non viene configurata, viene utilizzato il nome host specificato dall'URL di ricerca.</translation>
 <translation id="1312799700549720683">Consente di gestire le impostazioni di visualizzazione.</translation>
 <translation id="131353325527891113">Mostra nomi utente nella schermata di accesso</translation>
 <translation id="1317658068839330898">Non consentire l'utilizzo di <ph name="ASSISTANT_PRODUCT_NAME" /> sul Web</translation>
 <translation id="1318233005302276244">Consente agli utenti di tracciare i propri pacchi su Chrome.</translation>
 <translation id="1323501563951768821">Le impostazioni di F12 usano la scorciatoia che contiene il tasto di modifica Maiusc</translation>
 <translation id="1325547947664414578">Quando un utente passa da un dispositivo <ph name="PRODUCT_OS_NAME" /> a un altro dello stesso tipo, il servizio <ph name="PRODUCT_NAME" /> avvia le finestre del browser e delle app del dispositivo precedente su quello nuovo.
-Se il criterio viene attivato, le finestre del browser e delle app verranno avviate automaticamente al momento dell'accesso dall'ultimo dispositivo <ph name="PRODUCT_OS_NAME" /> utilizzato dall'utente corrente.
-Se il criterio viene disattivato o se non viene configurato, gli elementi da avviare al momento dell'accesso verranno determinati dalle impostazioni di ripristino completo.</translation>
+Se la policy viene attivata, le finestre del browser e delle app verranno avviate automaticamente al momento dell'accesso dall'ultimo dispositivo <ph name="PRODUCT_OS_NAME" /> utilizzato dall'utente corrente.
+Se la policy viene disattivata o se non viene configurata, gli elementi da avviare al momento dell'accesso verranno determinati dalle impostazioni di ripristino completo.</translation>
 <translation id="1327466551276625742">Attivazione richiesta di configurazione della rete offline</translation>
-<translation id="13356285923490863">Nome criterio</translation>
+<translation id="13356285923490863">Nome policy</translation>
 <translation id="1338603603553894503">Consente di specificare se il selettore profilo è attivato, disattivato o forzato all'avvio del browser.
 
-      Per impostazione predefinita, il selettore profilo non viene mostrato quando il browser si avvia in modalità ospite o di navigazione in incognito, quando una directory e/o gli URL del profilo sono specificati da una riga di comando, quando è richiesta esplicitamente l'apertura di un'app, quando il browser è stato lanciato da una notifica nativa, quando c'è un solo profilo disponibile o quando il criterio ForceBrowserSignin è impostato su Vero.
+      Per impostazione predefinita, il selettore profilo non viene mostrato quando il browser si avvia in modalità ospite o di navigazione in incognito, quando una directory e/o gli URL del profilo sono specificati da una riga di comando, quando è richiesta esplicitamente l'apertura di un'app, quando il browser è stato lanciato da una notifica nativa, quando c'è un solo profilo disponibile o quando la policy ForceBrowserSignin è impostata su True.
 
-      Se è selezionata l'opzione "Attivato" (0) o se il criterio non viene impostato, il selettore profilo verrà mostrato all'avvio per impostazione predefinita, ma gli utenti potranno attivarlo/disattivarlo.
+      Se è selezionata l'opzione "Attivato" (0) o se la policy non viene impostata, il selettore profilo verrà mostrato all'avvio per impostazione predefinita, ma gli utenti potranno attivarlo/disattivarlo.
 
       Se è selezionata l'opzione "Disattivato" (1), il selettore profilo non verrà mai mostrato e gli utenti non saranno in grado di modificare l'impostazione.
 
       Se è selezionata l'opzione "Forzato" (2), il selettore profilo non può essere eliminato dall'utente. Il selettore profilo sarà mostrato anche se c'è un solo profilo disponibile.</translation>
 <translation id="1339174690935954950">Impedisci agli utenti di inviare feedback</translation>
 <translation id="1340053691042184658">Impedisci gli accessi come ospite al browser</translation>
-<translation id="134154550994512097">Questo criterio consente di stabilire se gli utenti possono attivare o meno la modalità solo HTTPS (Utilizza sempre connessioni sicure) nelle Impostazioni. La Modalità solo HTTPS esegue l'upgrade di tutte le navigazioni alle estensioni HTTPS.
+<translation id="134154550994512097">Questa policy consente di stabilire se gli utenti possono attivare o meno la modalità solo HTTPS (Utilizza sempre connessioni sicure) nelle Impostazioni. La Modalità solo HTTPS esegue l'upgrade di tutte le navigazioni alle estensioni HTTPS.
       Se questa impostazione non viene configurata o se viene impostata su allowed, gli utenti potranno attivare la Modalità solo HTTPS.
       Se viene impostata su disallowed, gli utenti non potranno attivare la Modalità solo HTTPS.
       Se viene impostata su force_enabled, la Modalità solo HTTPS verrà attivata con restrizioni e gli utenti non potranno disattivarla.
       Se viene impostata su force_balanced_enabled, la Modalità solo HTTPS verrà attivata in Modalità bilanciata e gli utenti non potranno disattivarla.
       Il valore force_enabled è supportato a partire dalla versione M112, mentre force_balanced_enabled è supportato a partire dalla versione M129.
-      Se imposti questo criterio su un valore non supportato dalla versione di Chrome che lo riceve, Chrome utilizzerà l'impostazione consentita per impostazione predefinita.
+      Se imposti questa policy su un valore non supportato dalla versione di Chrome che lo riceve, Chrome utilizzerà l'impostazione consentita per impostazione predefinita.
 
-Il criterio <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> separato
-può essere utilizzato per escludere determinati nomi host o pattern dei nomi host
+La policy <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> separata
+può essere utilizzata per escludere determinati nomi host o pattern dei nomi host
 dall'upgrade ad HTTPS da parte di questa funzionalità.</translation>
 <translation id="1342918903685430097">Configura la versione minima di <ph name="PRODUCT_OS_NAME" /> consentita per il dispositivo.</translation>
 <translation id="1343128241903870688">Disattiva i report sulle informazioni relative alle app del dispositivo</translation>
-<translation id="1347198119056266798">Questo criterio è deprecato, al suo posto usa <ph name="FORCE_GOOGLE_SAFE_SEARCH_POLICY_NAME" /> e <ph name="FORCE_YOUTUBE_RESTRICT_POLICY_NAME" />. Questo criterio viene ignorato se è impostato il criterio <ph name="FORCE_GOOGLE_SAFE_SEARCH_POLICY_NAME" />, <ph name="FORCE_YOUTUBE_RESTRICT_POLICY_NAME" /> o <ph name="FORCE_YOUTUBE_SAFETY_MODE_POLICY_NAME" /> (deprecato).
+<translation id="1347198119056266798">Questa policy è deprecata, al suo posto usa <ph name="FORCE_GOOGLE_SAFE_SEARCH_POLICY_NAME" /> e <ph name="FORCE_YOUTUBE_RESTRICT_POLICY_NAME" />. Questa policy viene ignorata se è impostata la policy <ph name="FORCE_GOOGLE_SAFE_SEARCH_POLICY_NAME" />, <ph name="FORCE_YOUTUBE_RESTRICT_POLICY_NAME" /> o <ph name="FORCE_YOUTUBE_SAFETY_MODE_POLICY_NAME" /> (deprecata).
 
       Forza l'esecuzione delle query nella Ricerca Google con l'opzione SafeSearch attiva e impedisce agli utenti di modificare questa impostazione. Questa impostazione forza anche la modalità Restrizione moderata su YouTube.
 
       Se attivi questa impostazione, la funzione SafeSearch della Ricerca Google e la modalità Restrizione moderata su YouTube saranno sempre attive.
 
       Se disattivi questa impostazione o non imposti un valore, la funzione SafeSearch della Ricerca Google e la Modalità con restrizioni di YouTube non verranno applicate.</translation>
-<translation id="134745581157553029">Se il criterio "DeviceArcDataSnapshotHours" viene configurato, viene attivato il meccanismo di creazione di istantanee dei dati ARC. L'aggiornamento delle istantanee dei dati ARC può essere avviato automaticamente durante gli intervalli di tempo definiti. Quando inizia un intervallo, l'aggiornamento delle istantanee dei dati ARC è necessario e non ci sono utenti che hanno eseguito l'accesso, questa procedura di aggiornamento viene avviata senza informare l'utente. Se è attiva la sessione utente, nell'UI viene mostrata la notifica, che deve essere accettata per poter riavviare il dispositivo e avviare la procedura di aggiornamento delle istantanee dei dati ARC. Nota: durante questa procedura non è possibile usare il dispositivo.</translation>
+<translation id="134745581157553029">Se la policy "DeviceArcDataSnapshotHours" viene configurata, viene attivato il meccanismo di creazione di istantanee dei dati ARC. L'aggiornamento delle istantanee dei dati ARC può essere avviato automaticamente durante gli intervalli di tempo definiti. Quando inizia un intervallo, l'aggiornamento delle istantanee dei dati ARC è necessario e non ci sono utenti che hanno eseguito l'accesso, questa procedura di aggiornamento viene avviata senza informare l'utente. Se è attiva la sessione utente, nell'UI viene mostrata la notifica, che deve essere accettata per poter riavviare il dispositivo e avviare la procedura di aggiornamento delle istantanee dei dati ARC. Nota: durante questa procedura non è possibile usare il dispositivo.</translation>
 <translation id="1348603614848418219">Disattiva la migrazione dei dispositivi gestiti da <ph name="MS_AD_NAME" /> nella gestione del cloud.</translation>
 <translation id="1352799151662469739">Il periodo di tempo, in millisecondi, senza input dell'utente trascorso il quale lo schermo viene bloccato quando viene usata l'alimentazione CA.</translation>
 <translation id="1353416417709895349">Disattiva controlli dell'intercettazione DNS e barre di informazioni "http://intranetsite/" alternative</translation>
 <translation id="1354280967938151061">Disattiva ARC</translation>
 <translation id="1354349503792572661">Forza la possibilità di eseguire Native Client (NaCl) su <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="1354424209129232709">Massimo:</translation>
-<translation id="1355050231181289439"> Questo criterio consente di stabilire se la mappatura migliorata delle scorciatoie da tastiera internazionali è attivata.
+<translation id="1355050231181289439"> Questa policy consente di stabilire se la mappatura migliorata delle scorciatoie da tastiera internazionali è attivata.
       Questa funzionalità garantisce che le scorciatoie da tastiera funzionino in modo coerente con i layout delle tastiere internazionali e le scorciatoie precedenti deprecate.
 
-      Se questo criterio viene disattivato, le scorciatoie da tastiera internazionali migliorate vengono disabilitate.
-      Se viene attivato, le scorciatoie da tastiera internazionali migliorate vengono abilitate.
-      Se non viene configurato, questo criterio viene attivato per i dispositivi gestiti e per i dispositivi di proprietà del consumatore.
-      Tieni presente che questo criterio è temporaneo per consentire agli utenti gestiti di poter ancora utilizzare le scorciatoie precedenti deprecate. Verrà ritirato quando le scorciatoie da tastiera personalizzate saranno disponibili.</translation>
+      Se questa policy viene disattivata, le scorciatoie da tastiera internazionali migliorate vengono disabilitate.
+      Se viene attivata, le scorciatoie da tastiera internazionali migliorate vengono abilitate.
+      Se non viene configurata, questa policy viene attivata per i dispositivi gestiti e per i dispositivi di proprietà del consumatore.
+      Tieni presente che questa policy è temporanea per consentire agli utenti gestiti di poter ancora utilizzare le scorciatoie precedenti deprecate. Verrà ritirata quando le scorciatoie da tastiera personalizzate saranno disponibili.</translation>
 <translation id="1361661842732478894">Mostra il pulsante Pagina iniziale nella barra degli strumenti</translation>
 <translation id="1363275621236827384">Attiva le query in Quirks Server per i profili hardware</translation>
-<translation id="1363839375295535439">Se il criterio viene attivato o se non viene configurato, la sandbox LPAC per i servizi di stampa viene attivata ogni volta che la configurazione del sistema supporta l'operazione.
+<translation id="1363839375295535439">Se la policy viene attivata o se non viene configurata, la sandbox LPAC per i servizi di stampa viene attivata ogni volta che la configurazione del sistema supporta l'operazione.
 
-Se viene disattivato, la sicurezza di <ph name="PRODUCT_NAME" /> ne risentirà, in quanto i servizi utilizzati per la stampa potrebbero essere eseguiti in una configurazione sandbox meno sicura.
+Se viene disattivata, la sicurezza di <ph name="PRODUCT_NAME" /> ne risentirà, in quanto i servizi utilizzati per la stampa potrebbero essere eseguiti in una configurazione sandbox meno sicura.
 
-Disattiva il criterio solo se si verificano problemi di compatibilità con software di terze parti che impediscono ai servizi di stampa di funzionare correttamente all'interno della sandbox LPAC.</translation>
+Disattiva la policy solo se si verificano problemi di compatibilità con software di terze parti che impediscono ai servizi di stampa di funzionare correttamente all'interno della sandbox LPAC.</translation>
 <translation id="1369698103169067223">I Glanceables non sono attivati per gli utenti.</translation>
 <translation id="1371626834351873151">La riduzione dello user agent verrà attivata per tutte le origini.</translation>
 <translation id="1371851989348083665">Consenti l'utilizzo di <ph name="ASSISTANT_PRODUCT_NAME" /> sul Web</translation>
@@ -469,42 +469,42 @@
 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
 I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-Le eccezioni relative ai criteri di ottimizzazione di JavaScript verranno applicate soltanto sito
-per sito (eTLD+1). Un criterio impostato soltanto per sottodominio.sito.com non verrà
+Le eccezioni relative alle policy di ottimizzazione di JavaScript verranno applicate soltanto sito
+per sito (eTLD+1). Una policy impostato soltanto per sottodominio.sito.com non verrà
 applicato correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti
-allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcun criterio. In questo caso, il criterio
+allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcuna policy. In questo caso, la policy
 deve essere impostato per sito.com per essere applicato correttamente sia a sito.com sia a sottodominio.sito.com.
 
-Questo criterio viene applicato frame per frame e non si basa esclusivamente
-sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco del criterio <ph name="JAVA_SCRIPT_OPTIMIZER_BLOCKED_FOR_SITES_POLICY_NAME" />, ma carica un frame
+Questa policy viene applicata frame per frame e non si basa esclusivamente
+sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco della policy <ph name="JAVA_SCRIPT_OPTIMIZER_BLOCKED_FOR_SITES_POLICY_NAME" />, ma carica un frame
 che contiene sito-due.com, sito-uno.com avrà disattivato le ottimizzazioni di JavaScript,
-ma sito-due.com utilizzerà il criterio di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" />, se configurato, o le ottimizzazioni di JavaScript
+ma sito-due.com utilizzerà la policy di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" />, se configurato, o le ottimizzazioni di JavaScript
 saranno attivate per impostazione predefinita. Le voci della lista bloccata hanno una priorità maggiore rispetto alle voci della lista consentita,
 che a loro volta hanno la priorità sul valore predefinito configurato.
 
-Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti
+Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" /> viene applicata al sito, se configurato, altrimenti
 l'ottimizzazione di JavaScript viene attivata per il sito.</translation>
 <translation id="1376765488559847650">Cloud Upload</translation>
-<translation id="1379689277107868399">Se il criterio viene impostato su NonChiedere o se non viene configurato, <ph name="PRODUCT_NAME" /> non chiede automaticamente all'utente di eseguire nuovamente l'autenticazione sul browser.
+<translation id="1379689277107868399">Se la policy viene impostata su NonChiedere o se non viene configurata, <ph name="PRODUCT_NAME" /> non chiede automaticamente all'utente di eseguire nuovamente l'autenticazione sul browser.
 
-Se impostato su ChiediInUnaScheda, quando l'autenticazione dell'utente scade, apri immediatamente una nuova scheda con la pagina di accesso di Google. Questo si verifica solo se utilizzi <ph name="CHROME_SYNC_NAME" />.</translation>
+Se impostata su ChiediInUnaScheda, quando l'autenticazione dell'utente scade, apri immediatamente una nuova scheda con la pagina di accesso di Google. Questo si verifica solo se utilizzi <ph name="CHROME_SYNC_NAME" />.</translation>
 <translation id="1384459581748403878">Riferimento: <ph name="REFERENCE_URL" /></translation>
-<translation id="1384594066274112751">Questo criterio consente di fare in modo che qualsiasi URL corrispondente a uno o più pattern specificati nel criterio (usando il formato del filtro <ph name="URL_BLOCKLIST_POLICY_NAME" />) non venga mai ignorato dal browser.
-      Questo criterio viene applicato per ignorare l'utilizzo della memoria e la modalità ad alta efficienza.
+<translation id="1384594066274112751">Questa policy consente di fare in modo che qualsiasi URL corrispondente a uno o più pattern specificati nella policy (usando il formato del filtro <ph name="URL_BLOCKLIST_POLICY_NAME" />) non venga mai ignorato dal browser.
+      Questa policy viene applicata per ignorare l'utilizzo della memoria e la modalità ad alta efficienza.
       Viene eseguito l'unload della pagina ignorata e le risorse della pagina vengono recuperate completamente. La scheda a cui è associata la pagina rimane nella tabstrip, ma se viene resa visibile viene attivato un ricaricamento completo.
       </translation>
 <translation id="138847842893090358">Indica lo stato di aggiornamento del sistema operativo</translation>
 <translation id="1389138080311956934">Risparmio di memoria massimo.</translation>
-<translation id="1390529781843037070">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono stampare con <ph name="CLOUD_PRINT_NAME" /> dalla finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> può inviare documenti da stampare a <ph name="CLOUD_PRINT_NAME" />. Questo non impedisce agli utenti di inviare processi di stampa su siti web.
+<translation id="1390529781843037070">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono stampare con <ph name="CLOUD_PRINT_NAME" /> dalla finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> può inviare documenti da stampare a <ph name="CLOUD_PRINT_NAME" />. Questo non impedisce agli utenti di inviare processi di stampa su siti web.
 
-      Se il criterio viene impostato su Disattivato, gli utenti non possono stampare con <ph name="CLOUD_PRINT_NAME" /> dalla finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />.
+      Se la policy viene impostata su Disattivata, gli utenti non possono stampare con <ph name="CLOUD_PRINT_NAME" /> dalla finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />.
 
-      Per mantenere rilevabili le destinazioni <ph name="CLOUD_PRINT_NAME" />, questo criterio deve essere impostato su Attivato e il valore <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> non deve essere incluso nel criterio <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation>
+      Per mantenere rilevabili le destinazioni <ph name="CLOUD_PRINT_NAME" />, questa policy deve essere impostata su Attivata e il valore <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> non deve essere incluso nella policy <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation>
 <translation id="1390901586107713894">Consente di specificare le estensioni che gli utenti NON possono installare. Le estensioni già installate vengono disattivate, se bloccate, e l'utente non può attivarle. Un'estensione disattivata da una lista bloccata viene automaticamente riattivata nel caso venga rimossa dalla lista.
 
           Il valore "*" di una lista bloccata significa che tutte le estensioni sono bloccate, a meno che vengano elencate esplicitamente nella lista consentita.
 
-          Se questo criterio non viene configurato, l'utente può installare qualsiasi estensione in <ph name="PRODUCT_NAME" />.</translation>
+          Se questa policy non viene configurata, l'utente può installare qualsiasi estensione in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1392703142209771447">Espressione regolare per trovare corrispondenze con l'ID stampante.</translation>
 <translation id="1393485621820363363">Stampanti aziendali associate ai dispositivi attive</translation>
 <translation id="1395505489889158859">Viene attivato l'invio di nome utente e nome file alle stampanti native</translation>
@@ -512,30 +512,30 @@
 <translation id="1396119629372155901">Funzionalità ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes disattivata</translation>
 <translation id="1397855852561539316">URL di suggerimento del provider di ricerca predefinito</translation>
 <translation id="140076409387986842">Consenti Aiutami a scrivere senza migliorare i modelli di AI.</translation>
-<translation id="1401249111997036083">Se il criterio viene impostato su False, le app per Android possono acquisire i link supportati per impostazione predefinita.
-Se il criterio è impostato su True, tutti i link vengono aperti per impostazione predefinita nel browser Chrome.
-Se il criterio non viene configurato, i link vengono aperti per impostazione predefinita nelle app per Android per gli utenti gestiti e nel browser per i consumatori.</translation>
+<translation id="1401249111997036083">Se la policy viene impostata su False, le app per Android possono acquisire i link supportati per impostazione predefinita.
+Se la policy è impostata su True, tutti i link vengono aperti per impostazione predefinita nel browser Chrome.
+Se la policy non viene configurata, i link vengono aperti per impostazione predefinita nelle app per Android per gli utenti gestiti e nel browser per i consumatori.</translation>
 <translation id="1402227992519954892">Attiva i report sulle informazioni relative alle app del dispositivo</translation>
 <translation id="1405444733221330570">Attiva Orca</translation>
 <translation id="1407977345632185991">Non consentire Crea temi.</translation>
-<translation id="141279920573530952">La configurazione del criterio consente di elencare i siti a cui viene concessa automaticamente l'autorizzazione ad accedere a tutte le porte seriali disponibili.
+<translation id="141279920573530952">La configurazione della policy consente di elencare i siti a cui viene concessa automaticamente l'autorizzazione ad accedere a tutte le porte seriali disponibili.
 
-      Se gli URL non sono validi, il criterio viene ignorato. Viene considerata soltanto l'origine (schema, host e porta) dell'URL.
+      Se gli URL non sono validi, la policy viene ignorata. Viene considerata soltanto l'origine (schema, host e porta) dell'URL.
 
-      Su <ph name="PRODUCT_OS_NAME" />, questo criterio viene applicato solo agli utenti affiliati.
+      Su <ph name="PRODUCT_OS_NAME" />, questa policy viene applicata solo agli utenti affiliati.
 
-      Questo criterio esegue l'override di <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> e delle preferenze dell'utente.</translation>
+      Questa policy esegue l'override di <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> e delle preferenze dell'utente.</translation>
 <translation id="1413768951234456918">Cancella la cronologia di navigazione</translation>
 <translation id="1413936351612032792">Segnala informazioni sull'utilizzo delle app Linux</translation>
 <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="142346659686073702">Consenti agli utenti non affiliati di usare Crostini</translation>
-<translation id="1423900783955065155">Questo criterio 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.
+<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.
 
-Se il criterio viene attivato o se non viene configurato, la pagina con l'intestazione <ph name="CACHE_CONTROL_NO_STORE_NAME" /> potrebbe essere ripristinata dalla cache back-forward, a meno che non venga attivata l'eliminazione della cache, ad esempio se al sito viene apportata una modifica ai cookie solo HTTP.
+Se la policy viene attivata o se non viene configurata, la pagina con l'intestazione <ph name="CACHE_CONTROL_NO_STORE_NAME" /> potrebbe essere ripristinata dalla cache back-forward, a meno che non venga attivata l'eliminazione della cache, ad esempio se al sito viene apportata una modifica ai cookie solo HTTP.
 
-Se il criterio viene disattivato, la pagina con l'intestazione <ph name="CACHE_CONTROL_NO_STORE_NAME" /> non verrà memorizzata nella cache back-forward.</translation>
+Se la policy viene disattivata, la pagina con l'intestazione <ph name="CACHE_CONTROL_NO_STORE_NAME" /> non verrà memorizzata nella cache back-forward.</translation>
 <translation id="1425551776320718592">Impedisci agli utenti di questo dispositivo di utilizzare il processo sideload ADB senza forzare la funzione Powerwash, che potrebbe lasciare il dispositivo in uno stato di sicurezza discutibile</translation>
 <translation id="1426170570389588560">Imposta il periodo di tempo in giorni per memorizzare i metadati dei processi di stampa</translation>
 <translation id="1426410128494586442">Sì</translation>
@@ -543,18 +543,18 @@
 <translation id="1430811977802269244">Consenti l'attivazione degli aggiornamenti automatici estesi
 per i dispositivi idonei che altrimenti perderebbero l'assistenza Android.
 
-Se il criterio viene attivato, i dispositivi autorizzano gli aggiornamenti automatici estesi.
+Se la policy viene attivata, i dispositivi autorizzano gli aggiornamenti automatici estesi.
 
-Se il criterio viene disattivato o se non viene configurato, i dispositivi smetteranno di ricevere aggiornamenti
+Se la policy viene disattivata o se non viene configurata, i dispositivi smetteranno di ricevere aggiornamenti
 dopo la data di scadenza degli aggiornamenti automatici originale.
 
-Questo criterio è pertinente solo per i modelli precedenti che non ricevono
+Questa policy è pertinente solo per i modelli precedenti che non ricevono
 automaticamente gli aggiornamenti estesi.
 
 Per ulteriori dettagli, visita la pagina
 https://support.google.com/chrome/a/?p=extended_updates_support.</translation>
-<translation id="1432834104376790711">Questo criterio attiva o disattiva l'impostazione della modalità Risparmio energetico.
-      Su Chrome, questa impostazione fa sì che la frequenza fotogrammi venga limitata per ridurre il consumo energetico. Se questo criterio non è impostato, l'utente finale può controllare questa impostazione all'indirizzo chrome://settings/performance.
+<translation id="1432834104376790711">Questa policy attiva o disattiva l'impostazione della modalità Risparmio energetico.
+      Su Chrome, questa impostazione fa sì che la frequenza fotogrammi venga limitata per ridurre il consumo energetico. Se questa policy non è impostata, l'utente finale può controllare questa impostazione all'indirizzo chrome://settings/performance.
       Su ChromeOS, questa impostazione fa sì che la frequenza fotogrammi e la frequenza della CPU vengano limitate, le retroilluminazione siano attenuate e Android venga attivato nella modalità Risparmio energetico. Sui dispositivi con più CPU, alcune CPU verranno disattivate.
       I diversi livelli sono:
       <ph name="BATTERY_SAVER_MODE_DISABLED" /> (0): la modalità Risparmio energetico verrà disattivata.
@@ -563,35 +563,35 @@
       </translation>
 <translation id="1434300053894025056">Disattiva controllo ortografico</translation>
 <translation id="1435031247649241006">Nella schermata di blocco gli utenti hanno la possibilità di aprire una finestra di
-riautenticazione online e utilizzarla per il processo di autenticazione per rientrare nella sessione. Questo
-criterio può essere utilizzato per aprire automaticamente la finestra se
+riautenticazione online e utilizzarla per il processo di autenticazione per rientrare nella sessione. Questa
+policy può essere utilizzata per aprire automaticamente la finestra se
 è richiesta la riautenticazione online.
 
-Se il criterio viene attivato ed è richiesta la riautenticazione online, la
+Se la policy viene attivata ed è richiesta la riautenticazione online, la
 finestra di riautenticazione online viene aperta automaticamente.
 
-Se il criterio viene disattivato o se non viene configurato, la finestra di riautenticazione online
+Se la policy viene disattivata o se non viene configurata, la finestra di riautenticazione online
 deve essere aperta manualmente.
 
 La riautenticazione online può essere richiesta per vari motivi, ad esempio
-la modifica della password, ma può essere applicata in modo forzato anche da determinati criteri come
+la modifica della password, ma può essere applicata in modo forzato anche da determinate policy come
 <ph name="GAIA_LOCK_SCREEN_OFFLINE_SIGNIN_TIME_LIMIT_DAYS_POLICY_NAME" /> o
 <ph name="SAML_LOCK_SCREEN_OFFLINE_SIGNIN_TIME_LIMIT_DAYS_POLICY_NAME" />.</translation>
 <translation id="1435493974546396517">Consente di stabilire in che modo <ph name="PRODUCT_NAME" /> mette a disposizione l'opzione Stampa come immagine su <ph name="MS_WIN_NAME" /> e <ph name="MAC_OS_NAME" /> per la stampa di PDF.
 
       Quando viene stampato un file PDF su <ph name="MS_WIN_NAME" /> o <ph name="MAC_OS_NAME" />, a volte per alcune stampanti è necessario rasterizzare i processi di stampa in un'immagine per poter ottenere un output corretto.
 
-      Se questo criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> metterà a disposizione l'opzione Stampa come immagine nella finestra Anteprima di stampa per la stampa di un PDF.
+      Se questa policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> metterà a disposizione l'opzione Stampa come immagine nella finestra Anteprima di stampa per la stampa di un PDF.
 
-      Se questo criterio viene impostato su Disattivato o se non viene configurato, l'opzione Stampa come immagine di <ph name="PRODUCT_NAME" /> non sarà disponibile per gli utenti nella finestra Anteprima di stampa e i PDF verranno stampati normalmente senza essere rasterizzati in un'immagine prima di essere inviati alla destinazione.</translation>
+      Se questa policy viene impostata su Disattivata o se non viene configurata, l'opzione Stampa come immagine di <ph name="PRODUCT_NAME" /> non sarà disponibile per gli utenti nella finestra Anteprima di stampa e i PDF verranno stampati normalmente senza essere rasterizzati in un'immagine prima di essere inviati alla destinazione.</translation>
 <translation id="1435659902881071157">Configurazione di rete a livello di dispositivo</translation>
 <translation id="143649776386947790">Usa il comportamento predefinito</translation>
 <translation id="1438739959477268107">Impostazione generazione di chiavi predefinite</translation>
 <translation id="1440408958042020947">Consente agli utenti che hanno attivato Phone Hub di accedere a foto e video recenti acquisiti sul loro telefono</translation>
 <translation id="1443532790824582949">Attiva la tastiera virtuale touch</translation>
-<translation id="1449083855104537880">Se il criterio è impostato su True, le opzioni di accessibilità vengono mostrate nel menu della barra delle applicazioni. Se il criterio è impostato su False, le opzioni non appaiono nel menu.
+<translation id="1449083855104537880">Se la policy è impostata su True, le opzioni di accessibilità vengono mostrate nel menu della barra delle applicazioni. Se la policy è impostata su False, le opzioni non appaiono nel menu.
 
-      Se imposti il criterio, gli utenti non possono modificarlo. Se il criterio non è impostato, le opzioni di accessibilità non vengono mostrate nel menu, ma gli utenti possono farle apparire dalla pagina Impostazioni.
+      Se imposti la policy, gli utenti non possono modificarla. Se la policy non è impostata, le opzioni di accessibilità non vengono mostrate nel menu, ma gli utenti possono farle apparire dalla pagina Impostazioni.
 
       Se attivi le funzioni di accessibilità in altro modo (ad esempio, con una combinazione di tasti), tali opzioni vengono sempre mostrate nel menu della barra delle applicazioni.</translation>
 <translation id="1449777485284610883">Consenti l'installazione e l'aggiornamento di estensioni ospitate al di fuori del Chrome Web Store</translation>
@@ -599,18 +599,18 @@
 
       Quando stampi con una stampante non PostScript su <ph name="MS_WIN_NAME" />, a volte i processi di stampa devono essere rasterizzati per essere stampati correttamente.
 
-      Se il criterio viene impostato su Full, <ph name="PRODUCT_NAME" /> effettuerà la rasterizzazione completa delle pagine, se necessario.
+      Se la policy viene impostata su Full, <ph name="PRODUCT_NAME" /> effettuerà la rasterizzazione completa delle pagine, se necessario.
 
-      Se il criterio viene impostato su Fast, se possibile <ph name="PRODUCT_NAME" /> eviterà la rasterizzazione: ridurre la quantità di rasterizzazione può contribuire a diminuire le dimensioni dei processi di stampa e ad aumentare la velocità di stampa.
+      Se la policy viene impostata su Fast, se possibile <ph name="PRODUCT_NAME" /> eviterà la rasterizzazione: ridurre la quantità di rasterizzazione può contribuire a diminuire le dimensioni dei processi di stampa e ad aumentare la velocità di stampa.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_NAME" /> sarà in modalità Full.</translation>
+      Se la policy non viene impostata, <ph name="PRODUCT_NAME" /> sarà in modalità Full.</translation>
 <translation id="1455351936334569779">Per le stampanti dei tipi inseriti nell'elenco di tipi non consentiti verranno disattivati il rilevamento o il recupero delle relative funzionalità.
 
       L'inserimento di tutti i tipi di stampanti nell'elenco di tipi non consentiti comporta essenzialmente la disattivazione della stampa, perché non ci sarebbero destinazioni disponibili a cui inviare un documento da stampare.
 
-      Nelle versioni precedenti alla 102, l'inserimento di <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> nell'elenco di tipi non consentiti equivale all'impostazione del valore False per il criterio <ph name="POLICY_CLOUDPRINTSUBMITENABLED" />. Per mantenere rilevabili le destinazioni <ph name="CLOUD_PRINT_NAME" />, il criterio <ph name="POLICY_CLOUDPRINTSUBMITENABLED" /> deve essere impostato su True e il valore <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> non deve essere nell'elenco di tipi non consentiti. A partire dalla versione 102, le destinazioni <ph name="CLOUD_PRINT_NAME" /> non sono supportate e non verranno visualizzate a prescindere dai valori del criterio.
+      Nelle versioni precedenti alla 102, l'inserimento di <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> nell'elenco di tipi non consentiti equivale all'impostazione del valore False per la policy <ph name="POLICY_CLOUDPRINTSUBMITENABLED" />. Per mantenere rilevabili le destinazioni <ph name="CLOUD_PRINT_NAME" />, la policy <ph name="POLICY_CLOUDPRINTSUBMITENABLED" /> deve essere impostata su True e il valore <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> non deve essere nell'elenco di tipi non consentiti. A partire dalla versione 102, le destinazioni <ph name="CLOUD_PRINT_NAME" /> non sono supportate e non verranno visualizzate a prescindere dai valori della policy.
 
-      Se il criterio non viene configurato o se viene impostato su un elenco vuoto, potranno essere rilevati tutti i tipi di stampanti.
+      Se la policy non viene configurata o se viene impostata su un elenco vuoto, potranno essere rilevati tutti i tipi di stampanti.
 
       Le stampanti estensione sono note anche come destinazioni dei provider di stampa e includono le eventuali destinazioni appartenenti a un'estensione di <ph name="PRODUCT_NAME" />.
 
@@ -633,9 +633,9 @@
 <translation id="1465619815762735808">Click to play</translation>
 <translation id="1467633031685836974">Questa funzionalità consente di indirizzare link ipertestuali e navigazioni degli URL nella barra degli indirizzi a testo specifico in una pagina web, a cui si passa al termine del caricamento della pagina.
 
-Se attivi o non configuri questo criterio, viene attivato lo scorrimento della pagina web ai frammenti di testo specifici tramite URL.
+Se attivi o non configuri questa policy, viene attivato lo scorrimento della pagina web ai frammenti di testo specifici tramite URL.
 
-Se disattivi questo criterio, lo scorrimento della pagina web ai frammenti di testo specifici tramite URL viene disattivato.</translation>
+Se disattivi questa policy, lo scorrimento della pagina web ai frammenti di testo specifici tramite URL viene disattivato.</translation>
 <translation id="1468702975912409463">Consente agli utenti che accedono da remoto di aprire gli URL lato host nel browser client locale</translation>
 <translation id="1474273443907024088">Disattiva TLS False Start</translation>
 <translation id="1475494149102693892">Puoi attivare questa policy per creare un dizionario di estensioni di tipi di file con un elenco di domini corrispondente che verrà esentato dagli avvisi relativi al download basati sulle estensioni dei tipi di file. Questa policy consente agli amministratori aziendali di bloccare gli avvisi relativi al download basati sulle estensioni dei tipi di file per i file associati a un dominio presente nell'elenco. Ad esempio, se l'estensione "jnlp" viene associata a "sitoweb1.com", gli utenti non vedrebbero un avviso se scaricassero file "jnlp" da "sitoweb1.com", ma vedrebbero un avviso relativo al download se scaricassero file "jnlp" da "sitoweb2.com".
@@ -668,62 +668,62 @@
 
 Ulteriori informazioni su <ph name="DOWNLOAD_RESTRICTIONS_POLICY_NAME" /> sono disponibili alla pagina https://chromeenterprise.google/policies/?policy=DownloadRestrictions.</translation>
 <translation id="1477934438414550161">TLS 1.2</translation>
-<translation id="1479427764273213107">L'impostazione del criterio consente di definire l'elenco di dispositivi USB che gli utenti possono scollegare dal proprio driver del kernel per essere utilizzati tramite l'API chrome.usb direttamente all'interno di un'app web. Le voci sono coppie costituite dall'ID fornitore USB e dall'ID prodotto per identificare un hardware specifico.
+<translation id="1479427764273213107">L'impostazione della policy consente di definire l'elenco di dispositivi USB che gli utenti possono scollegare dal proprio driver del kernel per essere utilizzati tramite l'API chrome.usb direttamente all'interno di un'app web. Le voci sono coppie costituite dall'ID fornitore USB e dall'ID prodotto per identificare un hardware specifico.
 
-      Se non viene configurato, l'elenco di dispositivi USB scollegabili è vuoto.</translation>
-<translation id="1481508277421549404">Se il criterio è impostato su true, le estensioni installate dal criterio aziendale usano l'API Enterprise Hardware Platform.
+      Se non viene configurata, l'elenco di dispositivi USB scollegabili è vuoto.</translation>
+<translation id="1481508277421549404">Se la policy è impostata su true, le estensioni installate dalla policy aziendale usano l'API Enterprise Hardware Platform.
 
-      Se il criterio è impostato su false o non viene configurato, le estensioni non possono usare tale API.
+      Se la policy è impostata su false o non viene configurata, le estensioni non possono usare tale API.
 
-      Nota: questo criterio si applica inoltre a estensioni di componenti come l'estensione Hangout Services.</translation>
+      Nota: questa policy si applica inoltre a estensioni di componenti come l'estensione Hangout Services.</translation>
 <translation id="148194404518916594">Consenti agli utenti di usare la funzionalità Tocca per cercare</translation>
 <translation id="1484190167468437592">Disattiva l'audio in formato mono</translation>
-<translation id="1484580923123963615">Lista consentita che controlla i report sulla telemetria dei siti web per gli utenti affiliati. I tipi di dati di telemetria segnalati sono controllati dal criterio <ph name="REPORT_WEBSITE_TELEMETRY_POLICY_NAME" />.
+<translation id="1484580923123963615">Lista consentita che controlla i report sulla telemetria dei siti web per gli utenti affiliati. I tipi di dati di telemetria segnalati sono controllati dalla policy <ph name="REPORT_WEBSITE_TELEMETRY_POLICY_NAME" />.
 
-La configurazione del criterio consente di controllare i report sulla telemetria dei siti web per gli URL nella lista consentita. Se il criterio non viene configurato, la telemetria dei siti web non verrà segnalata.
-Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Per questo criterio sono consentiti solo gli schemi di URL HTTP e HTTPS.</translation>
+La configurazione della policy consente di controllare i report sulla telemetria dei siti web per gli URL nella lista consentita. Se la policy non viene configurata, la telemetria dei siti web non verrà segnalata.
+Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Per questa policy sono consentiti solo gli schemi di URL HTTP e HTTPS.</translation>
 <translation id="1486021504508098388">Segnala informazioni sulla retroilluminazione</translation>
 <translation id="1487722536912664411">Consenti agli utenti di utilizzare <ph name="PRODUCT_NAME" /></translation>
-<translation id="1487916040416013623">La configurazione del criterio consente di specificare i server consentiti per l'autenticazione integrata. L'autenticazione integrata viene attivata soltanto quando <ph name="PRODUCT_NAME" /> riceve una richiesta di autenticazione da un proxy o da un server presente nell'elenco dei server consentiti.
+<translation id="1487916040416013623">La configurazione della policy consente di specificare i server consentiti per l'autenticazione integrata. L'autenticazione integrata viene attivata soltanto quando <ph name="PRODUCT_NAME" /> riceve una richiesta di autenticazione da un proxy o da un server presente nell'elenco dei server consentiti.
 
-      Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> prova a rilevare se un server è presente sulla Intranet. Solo allora risponderà alle richieste IWA. Se viene rilevato un server su Internet, <ph name="PRODUCT_NAME" /> ignora le richieste IWA provenienti da tale server.
+      Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> prova a rilevare se un server è presente sulla Intranet. Solo allora risponderà alle richieste IWA. Se viene rilevato un server su internet, <ph name="PRODUCT_NAME" /> ignora le richieste IWA provenienti da tale server.
 
       Nota: se ci sono più server, separane i nomi utilizzando virgole. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="1488008594883876680">Attiva il precaricamento dell'immagine <ph name="ARC_VM" /></translation>
 <translation id="1488724823347505879">Attiva la condivisione dalle app Android alle app web</translation>
 <translation id="1490962807364514840">Il tempo di esecuzione della CPU conta la velocità di raccolta dei dati di telemetria in millisecondi.</translation>
-<translation id="1492223733885011596">Questo criterio consente di attivare il supporto delle GIF per il selettore di emoji su <ph name="PRODUCT_OS_NAME" />.
-Se questo criterio viene attivato, il selettore di emoji supporterà le emoji in formato GIF.
-Se viene disattivato o se non viene configurato, il selettore di emoji non supporterà le emoji in formato GIF.
-Se non viene configurato, il selettore di emoji verrà attivato per gli utenti normali, ma sarà disattivato per gli utenti gestiti.</translation>
+<translation id="1492223733885011596">Questa policy consente di attivare il supporto delle GIF per il selettore di emoji su <ph name="PRODUCT_OS_NAME" />.
+Se questa policy viene attivata, il selettore di emoji supporterà le emoji in formato GIF.
+Se viene disattivata o se non viene configurata, il selettore di emoji non supporterà le emoji in formato GIF.
+Se non viene configurata, il selettore di emoji verrà attivato per gli utenti normali, ma sarà disattivato per gli utenti gestiti.</translation>
 <translation id="1494138678487405397">Disattiva l'alto contrasto nella schermata di accesso</translation>
 <translation id="1497797462580613666">Gestione dei download avrà un'opzione per salvare i file su <ph name="GOOGLE_DRIVE_NAME" />.</translation>
-<translation id="1498640472634891941">Questo criterio consente di elencare i pattern URL che specificano i siti a cui viene automaticamente negata l'autorizzazione di accesso alle stampanti locali tramite l'API WebPrinting.
+<translation id="1498640472634891941">Questa policy consente di elencare i pattern URL che specificano i siti a cui viene automaticamente negata l'autorizzazione di accesso alle stampanti locali tramite l'API WebPrinting.
 
-Se il criterio non viene configurato, <ph name="DEFAULT_WEB_PRINTING_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+Se la policy non viene configurata, <ph name="DEFAULT_WEB_PRINTING_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-I pattern URL non devono essere in conflitto con <ph name="WEB_PRINTING_ALLOWED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+I pattern URL non devono essere in conflitto con <ph name="WEB_PRINTING_ALLOWED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambi.
 
-Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="1499129134689253257">Gestisci il nuovo comportamento di <ph name="OFFSET_PARENT" /></translation>
 <translation id="1501644502684303995">Applica in modo forzato gli accessi online soltanto nella schermata di accesso</translation>
 <translation id="1502843533062797703">Attiva blocco inserimento da software di terze parti</translation>
-<translation id="1503969899251962413">La configurazione del criterio consente di specificare il codice licenza <ph name="PLUGIN_VM_NAME" /> per il dispositivo.
+<translation id="1503969899251962413">La configurazione della policy consente di specificare il codice licenza <ph name="PLUGIN_VM_NAME" /> per il dispositivo.
 
-      Questo criterio è stato rimosso dalla versione M94.</translation>
+      Questa policy è stata rimossa dalla versione M94.</translation>
 <translation id="1507373253059695424">Attiva sempre la Schermata privata nella schermata di accesso</translation>
 <translation id="1508588104835702000">Disattiva reporting su cloud tramite browser gestito</translation>
-<translation id="1509377996969000672">La configurazione del criterio consente di specificare le configurazioni delle stampanti aziendali associate ai dispositivi. Il formato corrisponde a quello del dizionario <ph name="NATIVE_PRINTERS_POLICY_NAME" />, con un campo "id" o "guid" aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base ai criteri <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
+<translation id="1509377996969000672">La configurazione della policy consente di specificare le configurazioni delle stampanti aziendali associate ai dispositivi. Il formato corrisponde a quello del dizionario <ph name="NATIVE_PRINTERS_POLICY_NAME" />, con un campo "id" o "guid" aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base alle policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
-      Questo criterio:
+      Questa policy:
 
       * Non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.
 
-      * È integrativo al criterio <ph name="BULK_PRINTERS_POLICY_NAME" /> e alle configurazioni delle stampanti da parte dei singoli utenti.
+      * È integrativa alla policy <ph name="BULK_PRINTERS_POLICY_NAME" /> e alle configurazioni delle stampanti da parte dei singoli utenti.
 
-      Se il criterio non viene configurato, non ci saranno stampanti per i dispositivi e gli altri criteri <ph name="DEVICE_NATIVE_PRINTERS_POLICY_PATTERN" /> verranno ignorati.
+      Se la policy non viene configurata, non ci saranno stampanti per i dispositivi e le altre policy <ph name="DEVICE_NATIVE_PRINTERS_POLICY_PATTERN" /> verranno ignorate.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
+      Questa policy è deprecata. Usa la policy <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="1509692106376861764">Questa norma non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1509839615768187049">Utilizza sempre il client DNS integrato</translation>
 <translation id="1514888685242892912">Attiva <ph name="PRODUCT_NAME" /></translation>
@@ -781,19 +781,19 @@
 Equivale alla policy <ph name="RELATED_WEBSITE_SETS_OVERRIDES_POLICY_NAME" />.
 È possibile utilizzare entrambe le policy, ma a breve questa verrà ritirata, quindi è preferibile usare la policy <ph name="RELATED_WEBSITE_SETS_OVERRIDES_POLICY_NAME" />.
 Entrambe hanno lo stesso effetto sul comportamento del browser.</translation>
-<translation id="1550295162561011575">L'impostazione di questo criterio consente agli amministratori di configurare l'automazione per il lancio di app sui dispositivi <ph name="PRODUCT_NAME" />. Queste app possono essere lanciate al momento dell'accesso dell'utente oppure insieme da Avvio app.</translation>
+<translation id="1550295162561011575">L'impostazione di questa policy consente agli amministratori di configurare l'automazione per il lancio di app sui dispositivi <ph name="PRODUCT_NAME" />. Queste app possono essere lanciate al momento dell'accesso dell'utente oppure insieme da Avvio app.</translation>
 <translation id="1551782388466447648">Attiva la tastiera virtuale touch nella schermata di accesso</translation>
 <translation id="1552418937045050762">Se questa impostazione viene attivata, gli utenti possono scegliere di utilizzare la funzionalità Condivisione nelle vicinanze, che consente di inviare e ricevere file dalle persone nelle vicinanze.
 
       Se viene disattivata, gli utenti non possono attivare la funzionalità.
 
-      Se il criterio non viene configurato, per impostazione predefinita, la funzionalità non è consentita per gli utenti gestiti a livello aziendale ed è consentita per gli utenti non gestiti.</translation>
+      Se la policy non viene configurata, per impostazione predefinita, la funzionalità non è consentita per gli utenti gestiti a livello aziendale ed è consentita per gli utenti non gestiti.</translation>
 <translation id="1553956579506604198">Blocca l'installazione delle estensioni esterne</translation>
 <translation id="1555248923316727072">Impostazioni di gestione dell'identità degli utenti SAML</translation>
 <translation id="1556858590951401264">Non consentire al modello di oscuramento smart di estendere il tempo di oscuramento dello schermo</translation>
-<translation id="1557113199339446336">Se il criterio viene impostato su True, i dispositivi registrati segnalano informazioni relative a eventi di rilevamento e risposta estesi (XDR).
+<translation id="1557113199339446336">Se la policy viene impostata su True, i dispositivi registrati segnalano informazioni relative a eventi di rilevamento e risposta estesi (XDR).
 
-      Se il criterio viene impostato su False o se non viene configurato, i dispositivi registrati non segnalano eventi di rilevamento e risposta estesi (XDR).</translation>
+      Se la policy viene impostata su False o se non viene configurata, i dispositivi registrati non segnalano eventi di rilevamento e risposta estesi (XDR).</translation>
 <translation id="1559343998807576489">Impostazioni per la funzionalità Overlay di Lens</translation>
 <translation id="1560279917909364275">App per scrivere note della lista consentita ammesse sulla schermata di blocco di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="1561424797596341174">La norma sostituisce le build di debug dell'host di accesso remoto</translation>
@@ -810,24 +810,24 @@
 Su <ph name="MS_WIN_NAME" />, questa policy è disponibile soltanto per le istanze che sono aggiunte a un dominio <ph name="MS_AD_NAME" />, aggiunte a <ph name="MS_AAD_NAME" /> o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.
 
 Su <ph name="MAC_OS_NAME" />, questa policy è disponibile soltanto per le istanze che sono gestite tramite MDM, aggiunte a un dominio tramite MCX o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.</translation>
-<translation id="1567718448549957373">Se il criterio viene impostato su Attivato o se non viene configurato, le richieste di autenticazione <ph name="BASIC_AUTH" /> ricevute tramite connessioni HTTP non sicure sono consentite.
+<translation id="1567718448549957373">Se la policy viene impostata su Attivata o se non viene configurata, le richieste di autenticazione <ph name="BASIC_AUTH" /> ricevute tramite connessioni HTTP non sicure sono consentite.
 
-      Se il criterio viene impostato su Disattivato, per le richieste HTTP non sicure non è consentito usare lo schema di autenticazione <ph name="BASIC_AUTH" />; sono consentite soltanto le connessioni HTTPS sicure.
+      Se la policy viene impostata su Disattivata, per le richieste HTTP non sicure non è consentito usare lo schema di autenticazione <ph name="BASIC_AUTH" />; sono consentite soltanto le connessioni HTTPS sicure.
 
-      L'impostazione di questo criterio viene ignorata (e il valore <ph name="BASIC_AUTH" /> è sempre vietato) se il criterio <ph name="AUTH_SCHEMES_POLICY_NAME" /> viene impostato e non include il valore <ph name="BASIC_AUTH" />.</translation>
+      L'impostazione di questa policy viene ignorata (e il valore <ph name="BASIC_AUTH" /> è sempre vietato) se la policy <ph name="AUTH_SCHEMES_POLICY_NAME" /> viene impostata e non include il valore <ph name="BASIC_AUTH" />.</translation>
 <translation id="1571604752299617930">Scanner</translation>
 <translation id="1573074208167290576">Consente di stabilire se gli utenti possono aggiungere eccezioni per consentire contenuti misti per siti specifici.
 
-È possibile eseguire l'override di questo criterio per pattern URL specifici utilizzando i criteri "InsecureContentAllowedForUrls" e "InsecureContentBlockedForUrls".
+È possibile eseguire l'override di questa policy per pattern URL specifici utilizzando le policy "InsecureContentAllowedForUrls" e "InsecureContentBlockedForUrls".
 
-Se questo criterio non viene configurato, gli utenti potranno aggiungere eccezioni per consentire contenuti misti bloccabili e disattivare gli upgrade automatici dei contenuti misti bloccabili facoltativi.</translation>
+Se questa policy non viene configurata, gli utenti potranno aggiungere eccezioni per consentire contenuti misti bloccabili e disattivare gli upgrade automatici dei contenuti misti bloccabili facoltativi.</translation>
 <translation id="1573444493980402757">Consente di impostare un elenco di pattern URL che specifica i siti a cui l'autorizzazione per il posizionamento delle finestre viene automaticamente negata. Ciò limiterà la capacità dei siti di vedere le informazioni relative alle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
 
-      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
+      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
 
-      Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_WINDOW_PLACEMENT_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
+      Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_WINDOW_PLACEMENT_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
 <translation id="1574258262373444557">Non usare <ph name="AES_KL_NAME" /> come algoritmo di crittografia per la crittografia dello spazio di archiviazione degli utenti</translation>
-<translation id="1575015449587326319">Criterio di configurazione per il connettore OnFileDownloaded di Chrome Enterprise</translation>
+<translation id="1575015449587326319">Policy di configurazione per il connettore OnFileDownloaded di Chrome Enterprise</translation>
 <translation id="1577162851453388235">L'API Direct Sockets consente la comunicazione con endpoint arbitrari che utilizzano TCP e UDP.
 Visita la pagina https://github.com/WICG/direct-sockets per informazioni dettagliate.
 
@@ -839,31 +839,31 @@
 I pattern URL non devono essere in conflitto con <ph name="DIRECT_SOCKETS_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambi.
 
 Visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns per informazioni dettagliate sui pattern URL validi. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
-<translation id="1578495851351913403">Se configuri questo criterio, viene mostrata una nuova opzione di attivazione/disattivazione dell'interfaccia utente sotto ogni display nelle impostazioni di visualizzazione. La normale modalità Specchio trasforma tutti i display in un unico display, ma la nuova opzione di attivazione/disattivazione consente agli utenti di escludere un display dal mirroring e di visualizzarlo come display esteso.
+<translation id="1578495851351913403">Se configuri questa policy, viene mostrata una nuova opzione di attivazione/disattivazione dell'interfaccia utente sotto ogni display nelle impostazioni di visualizzazione. La normale modalità Specchio trasforma tutti i display in un unico display, ma la nuova opzione di attivazione/disattivazione consente agli utenti di escludere un display dal mirroring e di visualizzarlo come display esteso.
 
-Se il criterio viene impostato su Enabled, verrà visualizzata l'opzione di attivazione/disattivazione per ogni display, in modo da escluderlo dalla modalità di mirroring, e gli utenti potranno scegliere un display da attivare.
+Se la policy viene impostata su Enabled, verrà visualizzata l'opzione di attivazione/disattivazione per ogni display, in modo da escluderlo dalla modalità di mirroring, e gli utenti potranno scegliere un display da attivare.
 
-Se il criterio non viene configurato o se viene impostato su Disabled, l'opzione di attivazione/disattivazione verrà nascosta.
+Se la policy non viene configurata o se viene impostata su Disabled, l'opzione di attivazione/disattivazione verrà nascosta.
 
-Nota: questo criterio influirà solo sull'interfaccia utente e ChromeOS manterrà le impostazioni esistenti quando l'interfaccia è nascosta.</translation>
+Nota: questa policy influirà solo sull'interfaccia utente e ChromeOS manterrà le impostazioni esistenti quando l'interfaccia è nascosta.</translation>
 <translation id="1583248206450240930">Utilizza <ph name="PRODUCT_FRAME_NAME" /> per impostazione predefinita</translation>
 <translation id="1587585749332985896">Non è consentito l'uso della modalità headless</translation>
 <translation id="1588240398285670601">Impostazioni del browser</translation>
 <translation id="1590802206069983683">Funzionalità ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes disponibile</translation>
 <translation id="1592334921377856028">Disattiva i report sullo stato dell'hardware del dispositivo</translation>
-<translation id="1595013560176869154">Se il criterio viene impostato su Enabled, vengono consentiti PIN inefficaci. Ecco alcune caratteristiche dei PIN inefficaci: una sola cifra ripetuta (1111), cifre con incrementi di 1 (1234), cifre con decrementi di 1 (4321) e PIN comuni. Se il criterio viene impostato su Disabled, gli utenti non possono impostare PIN inefficaci e facili da indovinare.
+<translation id="1595013560176869154">Se la policy viene impostata su Enabled, vengono consentiti PIN inefficaci. Ecco alcune caratteristiche dei PIN inefficaci: una sola cifra ripetuta (1111), cifre con incrementi di 1 (1234), cifre con decrementi di 1 (4321) e PIN comuni. Se la policy viene impostata su Disabled, gli utenti non possono impostare PIN inefficaci e facili da indovinare.
 
-      Se il criterio non viene configurato, gli utenti ricevono un avviso, e non un messaggio di errore, se usano un PIN inefficace.</translation>
+      Se la policy non viene configurata, gli utenti ricevono un avviso, e non un messaggio di errore, se usano un PIN inefficace.</translation>
 <translation id="1597684038583138808">Attiva definizioni di Risposte rapide</translation>
 <translation id="1598258379228800626">Attiva l'evidenziazione dell'elemento attivo tramite tastiera nella schermata di accesso</translation>
 <translation id="1599424828227887013">Attiva isolamento dei siti per origini specificate su dispositivi Android</translation>
-<translation id="159946228300522107">Se il criterio è impostato su True, Chrome ingrandisce la prima finestra mostrata alla prima esecuzione.
+<translation id="159946228300522107">Se la policy è impostata su True, Chrome ingrandisce la prima finestra mostrata alla prima esecuzione.
 
-      Se il criterio è impostato su False o se non viene configurato, Chrome potrebbe ingrandire la prima finestra in base alle dimensioni dello schermo.</translation>
-<translation id="1600340610556453828">Se il criterio viene impostato su Disattivato, <ph name="PRODUCT_OS_NAME" /> disattiva la rete Wi-Fi e gli utenti non possono modificarlo.
+      Se la policy è impostata su False o se non viene configurata, Chrome potrebbe ingrandire la prima finestra in base alle dimensioni dello schermo.</translation>
+<translation id="1600340610556453828">Se la policy viene impostata su Disattivata, <ph name="PRODUCT_OS_NAME" /> disattiva la rete Wi-Fi e gli utenti non possono modificarlo.
 
-      Se viene impostato su Attivato o se non viene configurato, gli utenti possono attivare o disattivare la rete Wi-Fi.</translation>
-<translation id="1601848091543601739">La configurazione del criterio consente di stabilire la strategia di gestione dell'alimentazione quando l'utente diventa inattivo.
+      Se viene impostata su Attivata o se non viene configurata, gli utenti possono attivare o disattivare la rete Wi-Fi.</translation>
+<translation id="1601848091543601739">La configurazione della policy consente di stabilire la strategia di gestione dell'alimentazione quando l'utente diventa inattivo.
 
       Esistono quattro azioni:
 
@@ -898,9 +898,9 @@
 <translation id="1608755754295374538">URL a cui verrà concesso l'accesso ai dispositivi di acquisizione audio senza richieste</translation>
 <translation id="1608901087213748889">Consente di attivare un'azione quando il computer è inattivo.
 
-Se questo criterio viene configurato, consente di specificare il periodo di tempo senza input utente (in minuti) prima che il browser esegua le azioni configurate tramite il criterio <ph name="IDLE_TIMEOUT_ACTIONS_POLICY_NAME" />.
+Se questa policy viene configurata, consente di specificare il periodo di tempo senza input utente (in minuti) prima che il browser esegua le azioni configurate tramite la policy <ph name="IDLE_TIMEOUT_ACTIONS_POLICY_NAME" />.
 
-Se il criterio non viene configurato, non verrà eseguita alcuna azione.
+Se la policy non viene configurata, non verrà eseguita alcuna azione.
 
 La soglia minima è di 1 minuto.
 
@@ -908,25 +908,25 @@
 <translation id="1611144198714227240">Disattiva la scheda Calendario di Outlook per nella pagina Nuova scheda</translation>
 <translation id="1611394564825535541">Consente di controllare se gli utenti possono accedere alle stampanti non aziendali.
 
-      Se il criterio viene impostato su Vero o se non viene configurato, gli utenti possono aggiungere, configurare e utilizzare le proprie stampanti.
+      Se la policy viene impostata su True o se non viene configurata, gli utenti possono aggiungere, configurare e utilizzare le proprie stampanti.
 
-      Se il criterio viene impostato su Falso, gli utenti non possono aggiungere né configurare le proprie stampanti. Inoltre, non possono utilizzare nessuna delle stampanti precedentemente configurate.
+      Se la policy viene impostata su False, gli utenti non possono aggiungere né configurare le proprie stampanti. Inoltre, non possono utilizzare nessuna delle stampanti precedentemente configurate.
       </translation>
 <translation id="1613327425322354195">Segnala stato di sicurezza del dispositivo</translation>
 <translation id="1615221548356595305">Consenti la coalescenza di connessioni HTTP/2 per questi host anche quando sono in uso i certificati client</translation>
 <translation id="1616280227447957376">Consenti di proseguire dalla pagina di avviso SSL su origini specifiche</translation>
 <translation id="1617235075406854669">Attiva eliminazione cronologia del browser e dei download</translation>
 <translation id="1620510694547887537">Fotocamera</translation>
-<translation id="1621245029534873770">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="AUTOPLAY_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="1621245029534873770">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="AUTOPLAY_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="162162247775156979">Disattiva i report sullo stato dello spazio di archiviazione del dispositivo</translation>
 <translation id="1622982680869126605">Consenti Organizza schede e migliora i modelli di AI.</translation>
 <translation id="1625700732886306811">Consenti a <ph name="PRODUCT_NAME" /> di connettersi ai dispositivi su tutti gli indirizzi IP</translation>
 <translation id="1626379196197114720">Consenti uso della cache back-forward</translation>
 <translation id="1628974048137236820">La pagina Nuova scheda non mostra schede</translation>
 <translation id="163200210584085447">I pattern di questo elenco verranno confrontati con l'origine di sicurezza dell'URL richiedente. Se viene trovata una corrispondenza, l'accesso ai dispositivi di acquisizione video verrà concesso sulle pagine di accesso SAML. In caso contrario, l'accesso verrà automaticamente negato. Non sono consentite sequenze con caratteri jolly.</translation>
-<translation id="1634770710106162474">Se il criterio viene impostato su Attivato, viene eliminato l'avviso visualizzato quando <ph name="PRODUCT_NAME" /> è in esecuzione su un computer o un sistema operativo non supportato.
+<translation id="1634770710106162474">Se la policy viene impostata su Attivata, viene eliminato l'avviso visualizzato quando <ph name="PRODUCT_NAME" /> è in esecuzione su un computer o un sistema operativo non supportato.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, sui sistemi non supportati vengono visualizzati degli avvisi.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, sui sistemi non supportati vengono visualizzati degli avvisi.</translation>
 <translation id="1634989431648355062">Consenti il plug-in <ph name="FLASH_PLUGIN_NAME" /> su questi siti</translation>
 <translation id="1635450837608153975">Disattiva le ottimizzazioni di JavaScript avanzate su tutti i siti</translation>
 <translation id="1635748761015837179">Consenti la scrittura su dispositivi di archiviazione esterni</translation>
@@ -938,9 +938,9 @@
 
       Se una qualsiasi di queste funzionalità viene disattivata, l'utente non può accedervi dall'UI e la vede contrassegnata come "disattivata dall'amministratore". L'esperienza utente delle funzionalità disattivate è decisa da <ph name="SYSTEM_FEATURES_DISABLE_MODE" />
 
-      Se il criterio non viene configurato, tutte le funzionalità di <ph name="PRODUCT_OS_NAME" /> vengono attivate per impostazione predefinita e l'utente le può utilizzare.
+      Se la policy non viene configurata, tutte le funzionalità di <ph name="PRODUCT_OS_NAME" /> vengono attivate per impostazione predefinita e l'utente le può utilizzare.
 
-      Nota: al momento la funzionalità di scansione è disattivata per impostazione predefinita tramite un flag funzionalità. Se l'utente attiva la funzionalità tramite il flag funzionalità, questa può comunque essere disattivata dal criterio.</translation>
+      Nota: al momento la funzionalità di scansione è disattivata per impostazione predefinita tramite un flag funzionalità. Se l'utente attiva la funzionalità tramite il flag funzionalità, questa può comunque essere disattivata dalla policy.</translation>
 <translation id="1643642938972654829">Consenti l'accesso alla pagina di test dei criteri</translation>
 <translation id="1644373745741524038">Per motivi di sicurezza,
 l'API web <ph name="REQUEST_FULLSCREEN_API_NAME" />
@@ -949,28 +949,28 @@
 questa API senza una precedente attivazione dall'utente, come descritto nella sezione
 <ph name="AUTOMATIC_FULLSCREEN_HELP_URL" />.
 
-Questo criterio sostituisce le impostazioni personali degli utenti e consente alle origini corrispondenti di
+Questa policy sostituisce le impostazioni personali degli utenti e consente alle origini corrispondenti di
 chiamare l'API senza una precedente attivazione dall'utente.
 
 Per informazioni dettagliate sui pattern URL validi, visita la pagina
 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
 I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-Le origini che corrispondono a pattern di criteri sia bloccati sia consentiti verranno bloccate.
-Le origini non specificate dal criterio o dalle impostazioni utente richiederanno la precedente
+Le origini che corrispondono a pattern delle policy sia bloccati sia consentiti verranno bloccate.
+Le origini non specificate dalla policy o dalle impostazioni utente richiederanno la precedente
 attivazione dall'utente per chiamare questa API.</translation>
 <translation id="1645793986494086629">Schema:</translation>
-<translation id="1647558381546345298">La configurazione del criterio consente di impostare le dimensioni della cache utilizzate da <ph name="PRODUCT_NAME" /> per archiviare sul disco i file multimediali memorizzati nella cache, a prescindere dal fatto che gli utenti abbiano specificato o meno il flag --media-cache-size. Il valore specificato in questo criterio non è un limite rigido, ma un suggerimento per il sistema di memorizzazione nella cache. Tutti i valori inferiori ad alcuni megabyte vengono arrotondati.
+<translation id="1647558381546345298">La configurazione della policy consente di impostare le dimensioni della cache utilizzate da <ph name="PRODUCT_NAME" /> per archiviare sul disco i file multimediali memorizzati nella cache, a prescindere dal fatto che gli utenti abbiano specificato o meno il flag --media-cache-size. Il valore specificato in questa policy non è un limite rigido, ma un suggerimento per il sistema di memorizzazione nella cache. Tutti i valori inferiori ad alcuni megabyte vengono arrotondati.
 
-      Se il valore del criterio viene impostato su 0, vengono utilizzate le dimensioni della cache predefinite e gli utenti non possono apportare modifiche.
+      Se il valore della policy viene impostato su 0, vengono utilizzate le dimensioni della cache predefinite e gli utenti non possono apportare modifiche.
 
-      Se il criterio non viene configurato, vengono utilizzate le dimensioni della cache predefinite e gli utenti possono apportare modifiche con il flag --media-cache-size.</translation>
+      Se la policy non viene configurata, vengono utilizzate le dimensioni della cache predefinite e gli utenti possono apportare modifiche con il flag --media-cache-size.</translation>
 <translation id="1648816843164517573">Elenco di nomi che eviteranno il controllo dei criteri HSTS</translation>
 <translation id="1651197070942919276">Non consentire al dispositivo di eseguire macchine virtuali</translation>
-<translation id="1651216316133158002">Questo criterio consente agli amministratori di specificare le app che fungono da gestori predefiniti per le rispettive estensioni dei file
+<translation id="1651216316133158002">Questa policy consente agli amministratori di specificare le app che fungono da gestori predefiniti per le rispettive estensioni dei file
 su <ph name="PRODUCT_OS_NAME" /> che gli utenti non possono modificare.
 
-Per tutte le estensioni dei file non specificate nel criterio, gli utenti sono liberi di impostare le loro impostazioni predefinite riguardo al
+Per tutte le estensioni dei file non specificate nella policy, gli utenti sono liberi di impostare le loro impostazioni predefinite riguardo al
 normale flusso di lavoro.
 
 Specifica app di Chrome tramite il relativo ID, ad esempio <ph name="DEFAULT_HANDLERS_FOR_FILE_EXTENSIONS_POLICY_CHROME_APP_EXAMPLE" />;
@@ -981,9 +981,9 @@
 App web isolate tramite il relativo ID pacchetto web, ad esempio <ph name="DEFAULT_HANDLERS_FOR_FILE_EXTENSIONS_POLICY_ISOLATED_WEB_APP_EXAMPLE" />.
 
 Tieni presente che le app DEVONO dichiararsi come gestori di file per le estensioni dei file specificate nel manifest affinché
-la voce del criterio abbia effetto (ossia il criterio NON estende le funzionalità di app esistenti).
+la voce della policy abbia effetto (ossia la policy NON estende le funzionalità di app esistenti).
 
-Se il criterio non viene configurato, <ph name="PRODUCT_OS_NAME" /> può selezionare gestori predefiniti in base alla logica interna.</translation>
+Se la policy non viene configurata, <ph name="PRODUCT_OS_NAME" /> può selezionare gestori predefiniti in base alla logica interna.</translation>
 <translation id="1651810147727432656">Blocca l'autorizzazione per la gestione delle finestre su questi siti</translation>
 <translation id="1654087023995670109">Applica modalità ospite del browser</translation>
 <translation id="1655229863189977773">Imposta le dimensioni della cache su disco in byte</translation>
@@ -1007,20 +1007,20 @@
 <translation id="1673097259557436886">Comunica sempre ai siti web che non è stato salvato alcun metodo di pagamento</translation>
 <translation id="1674287836076801014">SAML</translation>
 <translation id="1675002386741412210">Supportato su:</translation>
-<translation id="167514072300004091">Se il criterio è impostato su 3, i siti web possono richiedere l'accesso ai dispositivi USB connessi. Se il criterio è impostato su 2, l'accesso ai dispositivi USB connessi viene negato.
+<translation id="167514072300004091">Se la policy è impostata su 3, i siti web possono richiedere l'accesso ai dispositivi USB connessi. Se la policy è impostata su 2, l'accesso ai dispositivi USB connessi viene negato.
 
-      Se non viene configurato, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
+      Se non viene configurata, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="1675391557079742340">Attiva la codifica dei contenuti <ph name="ZSTANDARD_SHORTNAME" /> per la pubblicità nell'intestazione Accept-Encoding</translation>
 <translation id="1678137412645922426">Controlla l'uso di <ph name="AES_KL_NAME" /> per la crittografia dello spazio di archiviazione degli utenti, se è supportata</translation>
 <translation id="1682063842123336408">Spazio libero su disco (in GB) necessario per installare <ph name="PLUGIN_VM_NAME" />.
 
-      Se il criterio non viene configurato, l'installazione di <ph name="PLUGIN_VM_NAME" /> non va a buon fine se lo spazio libero disponibile sul dispositivo è inferiore a 20 GB (valore predefinito).
-      Se il criterio è impostato, l'installazione di <ph name="PLUGIN_VM_NAME" /> non va a buon fine se lo spazio libero disponibile sul dispositivo è inferiore a quello richiesto dal criterio.</translation>
+      Se la policy non viene configurata, l'installazione di <ph name="PLUGIN_VM_NAME" /> non va a buon fine se lo spazio libero disponibile sul dispositivo è inferiore a 20 GB (valore predefinito).
+      Se la policy è impostata, l'installazione di <ph name="PLUGIN_VM_NAME" /> non va a buon fine se lo spazio libero disponibile sul dispositivo è inferiore a quello richiesto dalla policy.</translation>
 <translation id="1686952487081322272">Disattiva Risposte rapide</translation>
 <translation id="1690383938831887552">Impedisci il caricamento di scambi Signed HTTP Exchange</translation>
-<translation id="1692325295652827195">Se il criterio è impostato su True, Google riceverà report sui principali eventi di installazione delle app Android attivati dal criterio.
+<translation id="1692325295652827195">Se la policy è impostata su True, Google riceverà report sui principali eventi di installazione delle app Android attivati dalla policy.
 
-Se il criterio viene impostato su False o se non viene configurato, non viene registrato alcun evento.</translation>
+Se la policy viene impostata su False o se non viene configurata, non viene registrato alcun evento.</translation>
 <translation id="1692990221685273468">Consente di stabilire se lo strumento di verifica dei certificati integrato forzerà o meno l'applicazione di vincoli codificati nei trust anchor caricati dall'archivio di attendibilità della piattaforma.</translation>
 <translation id="169467210981344373">Disattiva cache di autenticazione HTTP con ambito globale</translation>
 <translation id="1696501581280568361">Suggerisce la separazione dei profili</translation>
@@ -1028,17 +1028,17 @@
 
       Quando un file PDF viene stampato usando l'opzione Stampa come immagine, può essere utile specificare una risoluzione di stampa diversa dall'impostazione della stampante di un dispositivo o dall'impostazione predefinita per i PDF.  Se viene usata una risoluzione elevata, aumenta notevolmente il tempo di elaborazione e di stampa, mentre una risoluzione bassa può generare un'immagine di scarsa qualità.
 
-      Questo criterio consente di specificare una risoluzione specifica da usare durante la rasterizzazione dei file PDF da stampare.
+      Questa policy consente di specificare una risoluzione specifica da usare durante la rasterizzazione dei file PDF da stampare.
 
-      Se questo criterio viene impostato su 0 o se non viene configurato, verrà usata la risoluzione predefinita di sistema durante la rasterizzazione delle immagini delle pagine.</translation>
+      Se questa policy viene impostata su 0 o se non viene configurata, verrà usata la risoluzione predefinita di sistema durante la rasterizzazione delle immagini delle pagine.</translation>
 <translation id="1700811900332333712">Consenti al dispositivo di richiedere il powerwash</translation>
 <translation id="1702882980096462188">Google Drive (supportato a partire dalla versione 135)</translation>
 <translation id="1705215165572785706">Imposta i tasti della fila superiore come tasti multimediali, ma consenti la modifica da parte degli utenti</translation>
 <translation id="1708496595873025510">Imposta la limitazione sul recupero del numero di inizializzazione delle varianti</translation>
 <translation id="1709154322133526432">Attiva il controllo del browser predefinito all'avvio</translation>
-<translation id="1713829924716792485">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti connessi a un host di accesso remoto possono trasferire file dal client all'host e viceversa. Questo criterio non si applica alle connessioni di assistenza remota, che non supportano il trasferimento di file.
+<translation id="1713829924716792485">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti connessi a un host di accesso remoto possono trasferire file dal client all'host e viceversa. Questa policy non si applica alle connessioni di assistenza remota, che non supportano il trasferimento di file.
 
-      Se il criterio viene impostato su Disattivato, il trasferimento di file non è consentito.</translation>
+      Se la policy viene impostata su Disattivata, il trasferimento di file non è consentito.</translation>
 <translation id="1714498967590789694">L'elemento <ph name="WEBVIEW_TAG_NAME" /> delle app di Chrome consente
 un comportamento che verrà rimosso da
 <ph name="PRODUCT_NAME" />.
@@ -1054,59 +1054,59 @@
 chiamata a <ph name="WINDOW_OPEN_NAME" /> nell'elemento
 <ph name="WEBVIEW_TAG_NAME" /> originario non è più valido.
 
-Se il criterio viene attivato, viene utilizzato il comportamento precedente.
-Se il criterio viene disattivato o se non viene configurato, la modifica del comportamento viene applicata
+Se la policy viene attivata, viene utilizzato il comportamento precedente.
+Se la policy viene disattivata o se non viene configurata, la modifica del comportamento viene applicata
 a mano a mano che viene implementata tramite il processo di rilascio di <ph name="PRODUCT_NAME" />.
 
-Questo criterio è una soluzione alternativa temporanea qualora le aziende
-riscontrino danni a causa di questa modifica. L'ultima versione supportata di questo
-criterio era la versione 121. È stato rimosso nella versione 122.</translation>
+Questa policy è una soluzione alternativa temporanea qualora le aziende
+riscontrino danni a causa di questa modifica. L'ultima versione supportata di questa
+policy era la versione 121. È stata rimossa nella versione 122.</translation>
 <translation id="1714790754501130659">Il nome utente per l'autenticazione dei servizi di sistema per il proxy web remoto.</translation>
-<translation id="171511968762040550">Se il criterio è impostato su True o se non viene configurato, gli utenti possono aggiungere, rimuovere o modificare i preferiti.
+<translation id="171511968762040550">Se la policy è impostata su True o se non viene configurata, gli utenti possono aggiungere, rimuovere o modificare i preferiti.
 
-      Se il criterio è impostato su False, gli utenti non possono aggiungere, rimuovere o modificare i preferiti, ma possono comunque utilizzare quelli esistenti.</translation>
+      Se la policy è impostata su False, gli utenti non possono aggiungere, rimuovere o modificare i preferiti, ma possono comunque utilizzare quelli esistenti.</translation>
 <translation id="1715151459541210849">Attiva la funzione di accessibilità di dettatura</translation>
 <translation id="1716468109214130396">Impedisci l'avvio di Chrome se non hai effettuato la registrazione a Chrome Browser Cloud Management</translation>
 <translation id="1719033799014769396">Disattiva i report sulla modalità di avvio del dispositivo</translation>
-<translation id="1721158690981421598">La configurazione del criterio consente di specificare i nomi di dominio degli host che vengono imposti per gli host di accesso remoto e gli utenti non possono modificarli. Gli host possono essere condivisi soltanto tramite account registrati su uno dei nomi di dominio specificati.
+<translation id="1721158690981421598">La configurazione della policy consente di specificare i nomi di dominio degli host che vengono imposti per gli host di accesso remoto e gli utenti non possono modificarli. Gli host possono essere condivisi soltanto tramite account registrati su uno dei nomi di dominio specificati.
 
-      Se per il criterio viene impostato un elenco vuoto o se il criterio non viene configurato, gli host possono essere condivisi tramite qualsiasi account.
+      Se per la policy viene impostato un elenco vuoto o se la policy non viene configurata, gli host possono essere condivisi tramite qualsiasi account.
 
-      Vedi anche il criterio <ph name="REMOTE_ACCESS_HOST_CLIENT_DOMAIN_LIST_POLICY_NAME" />.
+      Vedi anche la policy <ph name="REMOTE_ACCESS_HOST_CLIENT_DOMAIN_LIST_POLICY_NAME" />.
 
       Nota: questa impostazione sostituirà <ph name="REMOTE_ACCESS_HOST_DOMAIN_POLICY_NAME" />, se presente.</translation>
 <translation id="172374442286684480">Consenti a tutti i siti di impostare i dati locali</translation>
-<translation id="1729169799290004131">La configurazione del criterio consente di specificare la percentuale di luminosità dello schermo, che comporta la disattivazione delle funzionalità di luminosità automatica. Il valore iniziale di luminosità dello schermo viene regolato il base al valore del criterio, ma gli utenti possono modificarlo.
+<translation id="1729169799290004131">La configurazione della policy consente di specificare la percentuale di luminosità dello schermo, che comporta la disattivazione delle funzionalità di luminosità automatica. Il valore iniziale di luminosità dello schermo viene regolato il base al valore della policy, ma gli utenti possono modificarlo.
 
-      Se il criterio non viene configurato, i controlli o le funzionalità di luminosità automatica dello schermo dell'utente rimangono invariati.
+      Se la policy non viene configurata, i controlli o le funzionalità di luminosità automatica dello schermo dell'utente rimangono invariati.
 
-      Nota: i valori del criterio devono essere specificati in percentuali da 0 a 100.</translation>
+      Nota: i valori della policy devono essere specificati in percentuali da 0 a 100.</translation>
 <translation id="1733092875104864334">Non consentire la raccolta di log di testo WebRTC dai servizi Google</translation>
 <translation id="1733768596873041559">Reindirizza all'IdP SAML per impostazione predefinita (prima della versione 99 di <ph name="PRODUCT_NAME" /> è necessaria la conferma dell'utente)</translation>
 <translation id="1736269219679256369">Consenti di proseguire dalla pagina di avviso SSL</translation>
 <translation id="1736990730683753958">La pagina della cronologia di Chrome organizzata in gruppi non sarà visibile all'indirizzo chrome://history/grouped.</translation>
-<translation id="1740724790865999129">Se questo criterio viene impostato su un elenco di tipi di dispositivi, i dati di debug di basso livello dei tipi di dispositivi menzionati possono essere inclusi nel feedback degli utenti.
+<translation id="1740724790865999129">Se questa policy viene impostata su un elenco di tipi di dispositivi, i dati di debug di basso livello dei tipi di dispositivi menzionati possono essere inclusi nel feedback degli utenti.
 
       La voce speciale "all" include tutti i tipi di dispositivi, anche quelli che verranno aggiunti in futuro.
 
-      Se il criterio non viene configurato o se viene impostato su un elenco vuoto, al feedback degli utenti non vengono associati dati di debug di basso livello.
+      Se la policy non viene configurata o se viene impostata su un elenco vuoto, al feedback degli utenti non vengono associati dati di debug di basso livello.
       Leggi la descrizione di ogni tipo di dispositivo per conoscere il tipo specifico di dati di debug di basso livello.</translation>
 <translation id="1744340218280697033">Non consentire ai genitori di aggiungere account supervisionati</translation>
 <translation id="1745981653910662565">Consenti l'API Controlled Frame su questi siti</translation>
-<translation id="1751429117283165017">La configurazione del criterio consente di elencare i pattern URL che specificano i siti che non possono richiedere agli utenti l'accesso di scrittura di file o directory nel file system del sistema operativo host.
+<translation id="1751429117283165017">La configurazione della policy consente di elencare i pattern URL che specificano i siti che non possono richiedere agli utenti l'accesso di scrittura di file o directory nel file system del sistema operativo host.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_FILE_SYSTEM_WRITE_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_FILE_SYSTEM_WRITE_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      I pattern URL non possono essere in conflitto con <ph name="FILE_SYSTEM_WRITE_ASK_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non possono essere in conflitto con <ph name="FILE_SYSTEM_WRITE_ASK_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="1755310913456007816">Utilizza le impostazioni di controllo delle revoche online esistenti</translation>
 <translation id="1760951637494635692">Consenti l'API Serial su questi siti</translation>
-<translation id="1765503534110351026">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
+<translation id="1765503534110351026">Questa policy è deprecata. Usa la policy <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       Se il criterio viene impostato, <ph name="PRODUCT_NAME" /> bypassa qualsiasi proxy per l'elenco di host fornito. Questo criterio viene applicato se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non viene specificato e hai indicato <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> o <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> per <ph name="PROXY_MODE_POLICY_NAME" />.
+       Se la policy viene impostata, <ph name="PRODUCT_NAME" /> bypassa qualsiasi proxy per l'elenco di host fornito. Questa policy viene applicata se la policy <ph name="PROXY_SETTINGS_POLICY_NAME" /> non viene specificata e hai indicato <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> o <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> per <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Non impostare questo criterio se hai selezionato una qualsiasi altra modalità per i criteri di impostazione del proxy.
+       Non impostare questa policy se hai selezionato una qualsiasi altra modalità per le policy di impostazione del proxy.
 
        Nota: per esempi più dettagliati, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="1767673020408652620">Attiva consigli di app a stato nullo della casella di ricerca</translation>
@@ -1116,29 +1116,29 @@
 <translation id="177528603307243880">Non abilitare l'integrazione di Gemini.</translation>
 <translation id="1781356041596378058">Questa norma controlla anche l'accesso alle Opzioni sviluppatore di Android. Se la norma viene impostata su true, gli utenti non possono accedere alle Opzioni sviluppatore. Se la norma viene impostata su false o non viene impostata, gli utenti possono accedere alle Opzioni sviluppatore toccando sette volte il numero di build nell'app Impostazioni di Android.</translation>
 <translation id="1781720543185538098">Specifica se i sondaggi <ph name="PRODUCT_NAME" /> all'interno del prodotto vengono mostrati agli utenti.</translation>
-<translation id="1787790976045065845">Questo criterio viene applicato soltanto se il criterio <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> è impostato su <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> o <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" /> e un utente che effettua l'autenticazione tramite smart card rimuove quest'ultima. Consente inoltre di specificare per quanti secondi viene visualizzata una notifica che informa l'utente dell'azione imminente. Questa notifica blocca lo schermo. L'azione viene compiuta soltanto allo scadere della notifica. L'utente può impedire l'azione inserendo di nuovo la smart card prima della scadenza della notifica. Se questo criterio viene impostato su 0, non viene visualizzata alcuna notifica e l'azione viene compiuta immediatamente.</translation>
+<translation id="1787790976045065845">Questa policy viene applicata soltanto se la policy <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> è impostata su <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> o <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" /> e un utente che effettua l'autenticazione tramite smart card rimuove quest'ultima. Consente inoltre di specificare per quanti secondi viene visualizzata una notifica che informa l'utente dell'azione imminente. Questa notifica blocca lo schermo. L'azione viene compiuta soltanto allo scadere della notifica. L'utente può impedire l'azione inserendo di nuovo la smart card prima della scadenza della notifica. Se questa policy viene impostata su 0, non viene visualizzata alcuna notifica e l'azione viene compiuta immediatamente.</translation>
 <translation id="1793346220873697538">Disattiva la stampa PIN per impostazione predefinita</translation>
-<translation id="1794457906032475749">Se questo criterio viene attivato, l'opzione per mantenere i dati di navigazione esistenti durante la creazione di un profilo aziendale sarà selezionata per impostazione predefinita.
+<translation id="1794457906032475749">Se questa policy viene attivata, l'opzione per mantenere i dati di navigazione esistenti durante la creazione di un profilo aziendale sarà selezionata per impostazione predefinita.
 
-Se questo criterio viene disattivato o se non viene configurato, l'opzione per mantenere i dati di navigazione esistenti durante la creazione di un profilo aziendale non sarà selezionata per impostazione predefinita.
+Se questa policy viene disattivata o se non viene configurata, l'opzione per mantenere i dati di navigazione esistenti durante la creazione di un profilo aziendale non sarà selezionata per impostazione predefinita.
 
 Indipendentemente dal valore, l'utente potrà decidere se mantenere o meno i dati di navigazione esistenti durante la creazione di un profilo aziendale.
 
-Questo criterio non ha effetto se l'opzione per mantenere i dati di navigazione esistenti non è disponibile. Questo accade se viene applicata in modo forzato la separazione dei profili aziendali o se i dati provengono da un profilo già gestito.
+Questa policy non ha effetto se l'opzione per mantenere i dati di navigazione esistenti non è disponibile. Questo accade se viene applicata in modo forzato la separazione dei profili aziendali o se i dati provengono da un profilo già gestito.
 </translation>
 <translation id="1795105105645381965">
-      Se il criterio viene impostato su Attivato (True), <ph name="PRODUCT_NAME" /> chiede il consenso degli utenti gestiti prima di condividere gli indicatori dei dispositivi sui dispositivi non gestiti per ottenere l'accesso.
+      Se la policy viene impostata su Attivata (True), <ph name="PRODUCT_NAME" /> chiede il consenso degli utenti gestiti prima di condividere gli indicatori dei dispositivi sui dispositivi non gestiti per ottenere l'accesso.
 
-      Se il criterio viene impostato su Disattivato (False) o se non viene configurato, <ph name="PRODUCT_NAME" /> non può raccogliere gli indicatori dei dispositivi.
+      Se la policy viene impostata su Disattivata (False) o se non viene configurata, <ph name="PRODUCT_NAME" /> non può raccogliere gli indicatori dei dispositivi.
 
       Alcuni esempi di indicatori dei dispositivi includono, a titolo esemplificativo, informazioni sul sistema operativo, registro e presenza di file.</translation>
 <translation id="1797233582739332495">Mostra all'utente un messaggio ricorrente che indica che è necessario un riavvio</translation>
 <translation id="1798559516913615713">Durata della cache del GPO</translation>
-<translation id="180130467244315277">Questo criterio consente agli amministratori di configurare l'ordine delle lingue preferite nelle impostazioni di <ph name="PRODUCT_NAME" />.
+<translation id="180130467244315277">Questa policy consente agli amministratori di configurare l'ordine delle lingue preferite nelle impostazioni di <ph name="PRODUCT_NAME" />.
 
-      L'ordine dell'elenco sarà uguale a quello nella sezione "Ordina le lingue in base alle tue preferenze" della pagina chrome://settings/languages. Gli utenti non potranno rimuovere o cambiare l'ordine delle lingue impostate nel criterio, ma potranno aggiungere lingue sotto quelle impostate nel criterio. Gli utenti avranno inoltre il pieno controllo della lingua dell'interfaccia utente del browser e delle impostazioni di traduzione/controllo ortografico, a meno che non vengano applicate da altri criteri.
+      L'ordine dell'elenco sarà uguale a quello nella sezione "Ordina le lingue in base alle tue preferenze" della pagina chrome://settings/languages. Gli utenti non potranno rimuovere o cambiare l'ordine delle lingue impostate nella policy, ma potranno aggiungere lingue sotto quelle impostate nella policy. Gli utenti avranno inoltre il pieno controllo della lingua dell'interfaccia utente del browser e delle impostazioni di traduzione/controllo ortografico, a meno che non vengano applicate da altre policy.
 
-      Se il criterio non viene configurato, gli utenti possono modificare l'intero elenco di lingue preferite.</translation>
+      Se la policy non viene configurata, gli utenti possono modificare l'intero elenco di lingue preferite.</translation>
 <translation id="1803646570632580723">Elenco di applicazioni bloccate da visualizzare in Avvio applicazioni</translation>
 <translation id="1808715480127969042">Blocca cookie su questi siti</translation>
 <translation id="1810261428246410396">Consenti l'uso del tethering istantaneo.</translation>
@@ -1147,39 +1147,39 @@
 
           Se JIT di JavaScript viene disattivato, <ph name="PRODUCT_NAME" /> potrebbe visualizzare i contenuti web più lentamente e disattivare inoltre alcune parti di JavaScript, incluso WebAssembly. Se JIT di JavaScript viene disattivato, <ph name="PRODUCT_NAME" /> potrebbe essere in grado di visualizzare contenuti web in una configurazione più sicura.
 
-          È possibile eseguire l'override del criterio per pattern URL specifici utilizzando i criteri <ph name="JAVA_SCRIPT_JIT_ALLOWED_FOR_SITES_POLICY_NAME" /> e <ph name="JAVA_SCRIPT_JIT_BLOCKED_FOR_SITES_POLICY_NAME" />.
+          È possibile eseguire l'override della policy per pattern URL specifici utilizzando le policy <ph name="JAVA_SCRIPT_JIT_ALLOWED_FOR_SITES_POLICY_NAME" /> e <ph name="JAVA_SCRIPT_JIT_BLOCKED_FOR_SITES_POLICY_NAME" />.
 
-          Se il criterio non viene configurato, JIT di JavaScript viene attivato.</translation>
+          Se la policy non viene configurata, JIT di JavaScript viene attivato.</translation>
 <translation id="1815386977045680976">Consente di definire l'elenco di utenti autorizzati ad accedere al dispositivo. Le voci sono nel formato <ph name="USER_ALLOWLIST_ENTRY_FORMAT" />, ad esempio <ph name="USER_ALLOWLIST_ENTRY_EXAMPLE" />. Per autorizzare utenti arbitrari su un dominio, le voci devono essere nel formato <ph name="USER_ALLOWLIST_ENTRY_WILDCARD" />.
 
-      Se questo criterio non viene configurato, non ci sono limitazioni in termini di utenti autorizzati ad accedere. Tieni presente che la creazione di nuovi utenti richiede comunque la corretta configurazione del criterio <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />.
-      Se viene attivato il criterio <ph name="DEVICE_FAMILY_LINK_ACCOUNTS_ALLOWED_POLICY_NAME" />, saranno consentiti anche gli utenti Family Link oltre agli account definiti in questo criterio.</translation>
+      Se questa policy non viene configurata, non ci sono limitazioni in termini di utenti autorizzati ad accedere. Tieni presente che la creazione di nuovi utenti richiede comunque la corretta configurazione della policy <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />.
+      Se viene attivata la policy <ph name="DEVICE_FAMILY_LINK_ACCOUNTS_ALLOWED_POLICY_NAME" />, saranno consentiti anche gli utenti Family Link oltre agli account definiti in questa policy.</translation>
 <translation id="18186215616223740">Quando si accede a documenti Office gestiti da <ph name="BASIC_EDITOR_NAME" />, forzane il download</translation>
 <translation id="1819272352048746487">Attiva o disattiva diverse funzionalità per la tastiera sullo schermo</translation>
 <translation id="1820974289087266512">La funzionalità Generatore codice QR è disabilitata.</translation>
 <translation id="1822163547472114648">Impostazioni per Crea temi con l'IA</translation>
 <translation id="1823974945066396306">Consente di definire l'elenco di utenti autorizzati ad accedere al dispositivo. Le voci sono nel formato <ph name="USER_ALLOWLIST_ENTRY_FORMAT" />, ad esempio <ph name="USER_ALLOWLIST_ENTRY_EXAMPLE" />. Per autorizzare utenti arbitrari su un dominio, le voci devono essere nel formato <ph name="USER_ALLOWLIST_ENTRY_WILDCARD" />.
 
-      Se questo criterio non viene configurato, non ci sono limitazioni in termini di utenti autorizzati ad accedere. Tieni presente che la creazione di nuovi utenti richiede comunque la corretta configurazione del criterio <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />.
+      Se questa policy non viene configurata, non ci sono limitazioni in termini di utenti autorizzati ad accedere. Tieni presente che la creazione di nuovi utenti richiede comunque la corretta configurazione della policy <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />.
+      Questa policy è deprecata. Usa la policy <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />.
       </translation>
 <translation id="1827523283178827583">Utilizza server proxy definiti</translation>
 <translation id="1829117241432374848">Un account gestito deve essere un account principale, non deve avere account secondari e l'utente può importare i dati esistenti al momento della sua creazione</translation>
-<translation id="1829839214911753838">Se il criterio viene impostato su Attivato, l'host di assistenza remota viene eseguito in un processo con autorizzazioni <ph name="UIACCESS_PERMISSION_NAME" />. In questo modo gli utenti remoti possono interagire con finestre con privilegi più elevati sul desktop dell'utente locale.
+<translation id="1829839214911753838">Se la policy viene impostata su Attivata, l'host di assistenza remota viene eseguito in un processo con autorizzazioni <ph name="UIACCESS_PERMISSION_NAME" />. In questo modo gli utenti remoti possono interagire con finestre con privilegi più elevati sul desktop dell'utente locale.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, l'host di assistenza remota viene eseguito nel contesto dell'utente e gli utenti remoti non possono interagire con finestre con privilegi più elevati sul desktop.</translation>
-<translation id="183438382744421768">Questo criterio consente di controllare il comportamento del browser dopo che un account gestito ha eseguito l'accesso all'area dei contenuti.
+      Se la policy viene impostata su Disattivata o se non viene configurata, l'host di assistenza remota viene eseguito nel contesto dell'utente e gli utenti remoti non possono interagire con finestre con privilegi più elevati sul desktop.</translation>
+<translation id="183438382744421768">Questa policy consente di controllare il comportamento del browser dopo che un account gestito ha eseguito l'accesso all'area dei contenuti.
 
-Questo criterio sostituisce <ph name="MANAGED_ACCOUNTS_SIGNIN_RESTRICTION_POLICY_NAME" />.
+Questa policy sostituisce <ph name="MANAGED_ACCOUNTS_SIGNIN_RESTRICTION_POLICY_NAME" />.
 
-Se questo criterio viene impostato su Suggerito, dopo l'accesso a un account gestito, all'utente verrà chiesto di continuare a utilizzare un profilo gestito come se fosse stato applicato in modo forzato. Se rifiuta, l'utente può continuare la navigazione in un ambiente non gestito.
+Se questa policy viene impostata su Suggerita, dopo l'accesso a un account gestito, all'utente verrà chiesto di continuare a utilizzare un profilo gestito come se fosse stato applicato in modo forzato. Se rifiuta, l'utente può continuare la navigazione in un ambiente non gestito.
 
-Se questo criterio viene applicato, dopo l'accesso a un account gestito l'utente dovrà continuare a utilizzare un profilo gestito. Se l'invito viene rifiutato, verrà disconnesso dal proprio account. Questa applicazione non è interessata dal criterio <ph name="SIGNIN_INTERCEPTION_ENABLED_POLICY_NAME" />.
+Se questa policy viene applicata, dopo l'accesso a un account gestito l'utente dovrà continuare a utilizzare un profilo gestito. Se l'invito viene rifiutato, verrà disconnesso dal proprio account. Questa applicazione non è interessata dalla policy <ph name="SIGNIN_INTERCEPTION_ENABLED_POLICY_NAME" />.
 
-Se questo criterio viene impostato su Disabled o se non viene impostato, dopo l'accesso a un account gestito l'utente potrebbe visualizzare un fumetto in cui gli viene chiesto di creare un nuovo profilo. Il fumetto può essere ignorato e l'utente può continuare la navigazione in un ambiente non gestito. Il fumetto è controllato dal criterio <ph name="SIGNIN_INTERCEPTION_ENABLED_POLICY_NAME" />.
+Se questa policy viene impostata su Disabled o se non viene impostata, dopo l'accesso a un account gestito l'utente potrebbe visualizzare un fumetto in cui gli viene chiesto di creare un nuovo profilo. Il fumetto può essere ignorato e l'utente può continuare la navigazione in un ambiente non gestito. Il fumetto è controllato dalla policy <ph name="SIGNIN_INTERCEPTION_ENABLED_POLICY_NAME" />.
 
-Questo criterio non ha effetto se viene impostato a livello di macchina.</translation>
+Questa policy non ha effetto se viene impostata a livello di macchina.</translation>
 <translation id="1834796168555733063">Disattiva il salvataggio delle passkey utilizzando Gestore delle password</translation>
 <translation id="1836380138559328229">Salva le credenziali Wi-Fi attive a livello di dispositivo</translation>
 <translation id="1837165432382702436">L'altezza della pagina in micron.</translation>
@@ -1198,13 +1198,13 @@
 
 Il supporto delle estensioni Manifest v2 verrà ritirato e in futuro sarà necessario eseguire la migrazione di tutte le estensioni alla versione 3. Ulteriori informazioni e tempistiche della migrazione sono disponibili all'indirizzo https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
 
-Se il criterio viene impostato su <ph name="DEFAULT" /> (0) o se non viene configurato, il caricamento delle estensioni v2 viene determinato dal browser, in base alle tempistiche indicate nella pagina precedente.
-Se il criterio viene impostato su <ph name="DISABLE" /> (1), l'installazione delle estensioni v2 viene bloccata, mentre le estensioni esistenti vengono disattivate. L'opzione verrà trattata come se il criterio non fosse impostato dopo la disattivazione del supporto della versione 2 per impostazione predefinita.
-Se il criterio viene impostato su <ph name="ENABLE" /> (2), le estensioni v2 sono consentite. L'opzione verrà trattata come se il criterio non fosse impostato prima della disattivazione del supporto della versione 2 per impostazione predefinita.
-Se il criterio viene impostato su <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), le estensioni v2 con installazione forzata sono consentite. Sono incluse le estensioni elencate da <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> o <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> con <ph name="INSTALLATION_MODE" /> "force_installed" o "normal_installed". Tutte le altre estensioni v2 vengono disattivate. L'opzione è sempre disponibile indipendentemente dallo stato della migrazione.
+Se la policy viene impostata su <ph name="DEFAULT" /> (0) o se non viene configurata, il caricamento delle estensioni v2 viene determinato dal browser, in base alle tempistiche indicate nella pagina precedente.
+Se la policy viene impostata su <ph name="DISABLE" /> (1), l'installazione delle estensioni v2 viene bloccata, mentre le estensioni esistenti vengono disattivate. L'opzione verrà trattata come se la policy non fosse impostata dopo la disattivazione del supporto della versione 2 per impostazione predefinita.
+Se la policy viene impostata su <ph name="ENABLE" /> (2), le estensioni v2 sono consentite. L'opzione verrà trattata come se la policy non fosse impostata prima della disattivazione del supporto della versione 2 per impostazione predefinita.
+Se la policy viene impostata su <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), le estensioni v2 con installazione forzata sono consentite. Sono incluse le estensioni elencate da <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> o <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> con <ph name="INSTALLATION_MODE" /> "force_installed" o "normal_installed". Tutte le altre estensioni v2 vengono disattivate. L'opzione è sempre disponibile indipendentemente dallo stato della migrazione.
 
 
-La disponibilità delle estensioni è comunque controllata da altri criteri.</translation>
+La disponibilità delle estensioni è comunque controllata da altre policy.</translation>
 <translation id="1846545322805269573">Gli utenti non possono personalizzare lo sfondo della pagina Nuova scheda</translation>
 <translation id="1847960418907100918">Consente di specificare i parametri utilizzati durante la ricerca istantanea con POST. Si tratta di coppie di nome/valore separate da virgole. Se un valore è il parametro di un modello, come {searchTerms} nell'esempio precedente, verrà sostituito con i dati dei termini di ricerca reali.
 
@@ -1215,25 +1215,25 @@
 <translation id="1851034156561932736">Attiva i suoni di ricarica</translation>
 <translation id="1851282952069386119">Gli utenti possono scegliere di condividere con Google i risultati di una pulizia eseguita da Chrome Software Cleaner</translation>
 <translation id="1852294065645015766">Consenti la riproduzione automatica dei contenuti multimediali</translation>
-<translation id="1855963029978337744">La configurazione del criterio consente di elencare gli URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso a un dispositivo HID con gli ID fornitore e prodotto forniti. Ogni elemento nell'elenco richiede che entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" /> siano validi per l'elemento, altrimenti quest'ultimo viene ignorato. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> deve avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e potrebbe avere un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> viene omesso, viene creato un criterio che corrisponde a qualsiasi dispositivo con l'ID fornitore specificato. Un elemento con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valido e viene ignorato.
+<translation id="1855963029978337744">La configurazione della policy consente di elencare gli URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso a un dispositivo HID con gli ID fornitore e prodotto forniti. Ogni elemento nell'elenco richiede che entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" /> siano validi per l'elemento, altrimenti quest'ultimo viene ignorato. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> deve avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e potrebbe avere un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> viene omesso, viene creata una policy che corrisponde a qualsiasi dispositivo con l'ID fornitore specificato. Un elemento con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valido e viene ignorato.
 
-      Se il criterio non viene configurato, viene applicato il criterio <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" />, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, viene applicata la policy <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" />, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Gli URL in questo criterio non devono essere in conflitto con quelli configurati tramite <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />. In caso di conflitto, questo criterio ha la precedenza su <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
+      Gli URL in questa policy non devono essere in conflitto con quelli configurati tramite <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />. In caso di conflitto, questa policy ha la precedenza su <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="1858775210076906272">Configurazione precompilata Kerberos</translation>
 <translation id="1861206724856734193">Consente di configurare un elenco di regole per la prevenzione della fuga di dati.</translation>
 <translation id="1862267110714201519">Disattiva la funzionalità di finestre nascoste.</translation>
-<translation id="1865129144973895592">Questo criterio consente di riattivare temporaneamente un insieme di eventi della piattaforma deprecato e rimosso chiamato eventi Mutazione.
-Se questo criterio viene attivato, gli eventi Mutazione continueranno a essere attivati, anche se sono stati disattivati per impostazione predefinita per i normali utenti web. Se questo criterio viene disattivato o se non viene configurato, questi eventi potrebbero non essere attivati.
-Questo criterio è una soluzione alternativa temporanea e verrà rimosso nella versione M135.</translation>
+<translation id="1865129144973895592">Questa policy consente di riattivare temporaneamente un insieme di eventi della piattaforma deprecato e rimosso chiamato eventi Mutazione.
+Se questa policy viene attivata, gli eventi Mutazione continueranno a essere attivati, anche se sono stati disattivati per impostazione predefinita per i normali utenti web. Se questa policy viene disattivata o se non viene configurata, questi eventi potrebbero non essere attivati.
+Questa policy è una soluzione alternativa temporanea e verrà rimossa nella versione M135.</translation>
 <translation id="1865417998205858223">Autorizzazioni chiave</translation>
-<translation id="1865867000796030567">Se il criterio viene impostato su Attivato, il valore della chiave manifest <ph name="REQUIRED_PLATFORM_VERSION" /> dell'app kiosk con avvio automatico senza ritardo viene utilizzato come prefisso di versione di destinazione con aggiornamento automatico.
+<translation id="1865867000796030567">Se la policy viene impostata su Attivata, il valore della chiave manifest <ph name="REQUIRED_PLATFORM_VERSION" /> dell'app kiosk con avvio automatico senza ritardo viene utilizzato come prefisso di versione di destinazione con aggiornamento automatico.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, la chiave manifest <ph name="REQUIRED_PLATFORM_VERSION" /> viene ignorata e l'aggiornamento automatico viene eseguito normalmente.
+Se la policy viene impostata su Disattivata o se non viene configurata, la chiave manifest <ph name="REQUIRED_PLATFORM_VERSION" /> viene ignorata e l'aggiornamento automatico viene eseguito normalmente.
 
 Avviso: non delegare il controllo della versione di <ph name="PRODUCT_OS_NAME" /> a un'app kiosk, poiché potrebbe impedire al dispositivo di ricevere gli aggiornamenti del software e correzioni fondamentali per la sicurezza. La delega del controllo della versione di <ph name="PRODUCT_OS_NAME" /> potrebbe esporre gli utenti a dei rischi.</translation>
 <translation id="186719019195685253">Azione da compiere quando il ritardo di inattività viene raggiunto durante l'utilizzo della corrente CA</translation>
-<translation id="1869688072690234823">Questo criterio consente di stabilire quali fattori WebAuthn è possibile usare.
+<translation id="1869688072690234823">Questa policy consente di stabilire quali fattori WebAuthn è possibile usare.
 
       Per consentire:
 
@@ -1243,45 +1243,45 @@
 
       * PIN e impronta, usa ["PIN", "FINGERPRINT"].
 
-      Se il criterio non viene configurato o se viene impostato su un elenco vuoto, non è disponibile nessun fattore WebAuthn per i dispositivi gestiti.</translation>
-<translation id="1870669000882901616">Questo criterio consente a un amministratore di specificare le impostazioni relative alle app web installate. Questo criterio associa un ID app web alla relativa impostazione specifica. È possibile impostare con l'ID speciale <ph name="DEFAULT_SCOPE" /> una configurazione predefinita che verrà applicata a tutte le app web senza una configurazione personalizzata in questo criterio.
+      Se la policy non viene configurata o se viene impostata su un elenco vuoto, non è disponibile nessun fattore WebAuthn per i dispositivi gestiti.</translation>
+<translation id="1870669000882901616">Questa policy consente a un amministratore di specificare le impostazioni relative alle app web installate. Questa policy associa un ID app web alla relativa impostazione specifica. È possibile impostare con l'ID speciale <ph name="DEFAULT_SCOPE" /> una configurazione predefinita che verrà applicata a tutte le app web senza una configurazione personalizzata in questa policy.
 
 Il campo <ph name="MANIFEST_ID_FIELD" /> è l'ID manifest dell'app web. Visita la pagina <ph name="WEB_APP_ID_REFERENCE_URL" /> per avere istruzioni su come stabilire l'ID manifest di un'app web installata.
 Il campo <ph name="RUN_ON_OS_LOGIN_FIELD" /> consente di specificare se un'app web può essere eseguita durante l'accesso al sistema operativo. Se questo campo viene impostato su <ph name="BLOCKED" />, l'app web non verrà eseguita durante l'accesso al sistema operativo e l'utente non potrà attivare questa funzionalità in un secondo momento. Se questo campo viene impostato su <ph name="RUN_WINDOWED" />, l'app web verrà eseguita durante l'accesso al sistema operativo e l'utente non potrà disattivare questa funzionalità in un secondo momento. Se questo campo viene impostato su <ph name="ALLOWED" />, l'utente potrà configurare l'esecuzione dell'app web al momento dell'accesso al sistema operativo. Per la configurazione predefinita sono consentiti soltanto i valori <ph name="ALLOWED" /> e <ph name="BLOCKED" />.
-(Dalla versione 117) Il campo <ph name="PREVENT_CLOSE_FIELD" /> consente di specificare se impedire o meno la chiusura di un'app web in qualsiasi modo (ad esempio da parte dell'utente, da Task Manager, da API web). Questo comportamento può essere attivato solo se il criterio <ph name="RUN_ON_OS_LOGIN_FIELD" /> è impostato su <ph name="RUN_WINDOWED" />. Se l'app era già in esecuzione, questa proprietà diventa effettiva solo dopo il suo riavvio. Se questo campo non viene definito, gli utenti potranno chiudere le app.
+(Dalla versione 117) Il campo <ph name="PREVENT_CLOSE_FIELD" /> consente di specificare se impedire o meno la chiusura di un'app web in qualsiasi modo (ad esempio da parte dell'utente, da Task Manager, da API web). Questo comportamento può essere attivato solo se la policy <ph name="RUN_ON_OS_LOGIN_FIELD" /> è impostata su <ph name="RUN_WINDOWED" />. Se l'app era già in esecuzione, questa proprietà diventa effettiva solo dopo il suo riavvio. Se questo campo non viene definito, gli utenti potranno chiudere le app.
 (Dalla versione 118) Il campo <ph name="FORCE_UNREGISTER_OS_INTEGRATION" /> consente di specificare se tutte le integrazioni del sistema operativo per un'app web, ad esempio scorciatoie, gestori di file, gestori di protocollo e così via, vengono rimosse o meno. Se un'app è già in esecuzione, questa proprietà diventerà effettiva dopo il suo riavvio. Questa opzione deve essere utilizzata con cautela, poiché può sostituire qualsiasi integrazione del sistema operativo impostata automaticamente durante l'avvio del sistema delle applicazioni web. Al momento funziona solo su piattaforme Windows, Mac e Linux.</translation>
-<translation id="1874719875297132073">Questo criterio consente di stabilire se segnalare o meno le informazioni che possono essere utilizzate per identificare gli utenti, ad esempio i dati di accesso al sistema operativo, i dati di accesso del profilo <ph name="PRODUCT_NAME" />, il nome del profilo <ph name="PRODUCT_NAME" />, il percorso del profilo <ph name="PRODUCT_NAME" /> e il percorso eseguibile di <ph name="PRODUCT_NAME" />.
+<translation id="1874719875297132073">Questa policy consente di stabilire se segnalare o meno le informazioni che possono essere utilizzate per identificare gli utenti, ad esempio i dati di accesso al sistema operativo, i dati di accesso del profilo <ph name="PRODUCT_NAME" />, il nome del profilo <ph name="PRODUCT_NAME" />, il percorso del profilo <ph name="PRODUCT_NAME" /> e il percorso eseguibile di <ph name="PRODUCT_NAME" />.
 
-Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, verrà ignorato.
+Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, verrà ignorata.
 
-Se il criterio non viene configurato o viene impostato su True, le informazioni che possono essere utilizzate per identificare gli utenti vengono raccolte.
-Se il criterio viene impostato su False, le informazioni che possono essere utilizzate per identificare gli utenti non vengono raccolte.
+Se la policy non viene configurata o viene impostata su True, le informazioni che possono essere utilizzate per identificare gli utenti vengono raccolte.
+Se la policy viene impostata su False, le informazioni che possono essere utilizzate per identificare gli utenti non vengono raccolte.
 
-Questo criterio viene applicato soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
+Questa policy viene applicata soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+Questa policy viene sempre applicata per <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="1883274744253492031">Attiva l'upgrade automatico del contenuto misto</translation>
 <translation id="1885782360784839335">Attiva la visualizzazione di contenuti promozionali a scheda intera</translation>
 <translation id="1888871729456797026">Il token di registrazione della norma relativa al cloud su desktop</translation>
 <translation id="1890850749633603276">Ripristina il comportamento permissivo dell'elemento <ph name="WEBVIEW_TAG_NAME" /> delle app di Chrome</translation>
-<translation id="1893271062894546361">Se questo criterio viene attivato, l'UI dei controlli per la riproduzione di contenuti multimediali è disponibile per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi sulla rete locale.
+<translation id="1893271062894546361">Se questa policy viene attivata, l'UI dei controlli per la riproduzione di contenuti multimediali è disponibile per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi sulla rete locale.
 
-      Se questo criterio non viene configurato per gli utenti aziendali o se viene disattivato, l'UI dei controlli per la riproduzione di contenuti multimediali non è disponibile per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi sulla rete locale.
+      Se questa policy non viene configurata per gli utenti aziendali o se viene disattivata, l'UI dei controlli per la riproduzione di contenuti multimediali non è disponibile per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi sulla rete locale.
 
-      Se il criterio <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> viene disattivato, il valore di questo criterio non ha alcun effetto perché l'intera funzionalità <ph name="PRODUCT_NAME" /> viene disattivata.</translation>
+      Se la policy <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> viene disattivata, il valore di questa policy non ha alcun effetto perché l'intera funzionalità <ph name="PRODUCT_NAME" /> viene disattivata.</translation>
 <translation id="1894790493260633497">Attiva la modalità di stampa delle immagini di sfondo per impostazione predefinita</translation>
-<translation id="1894798677636924604">Se questo criterio non viene impostato, non sarà necessario eseguire l'accesso agli account per creare un nuovo profilo separato.
+<translation id="1894798677636924604">Se questa policy non viene impostata, non sarà necessario eseguire l'accesso agli account per creare un nuovo profilo separato.
 
-Se questo criterio viene impostato, non sarà necessario creare un nuovo profilo separato per gli accessi agli account dai domini elencati.
+Se questa policy viene impostata, non sarà necessario creare un nuovo profilo separato per gli accessi agli account dai domini elencati.
 
-Questo criterio può essere impostato su una stringa vuota in modo che tutti gli accessi all'account debbano creare un nuovo profilo separato.</translation>
-<translation id="1897095538209040086">Se il criterio viene attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> tiene aperta almeno una scheda dopo il passaggio a un browser alternativo.
+Questa policy può essere impostata su una stringa vuota in modo che tutti gli accessi all'account debbano creare un nuovo profilo separato.</translation>
+<translation id="1897095538209040086">Se la policy viene attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> tiene aperta almeno una scheda dopo il passaggio a un browser alternativo.
 
-Se il criterio viene disattivato, <ph name="PRODUCT_NAME" /> chiude la scheda dopo il passaggio a un browser alternativo, anche se era l'ultima scheda. Questo causa l'uscita da <ph name="PRODUCT_NAME" />.</translation>
+Se la policy viene disattivata, <ph name="PRODUCT_NAME" /> chiude la scheda dopo il passaggio a un browser alternativo, anche se era l'ultima scheda. Questo causa l'uscita da <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1897365952389968758">Consenti l'esecuzione di JavaScript in tutti i siti</translation>
 <translation id="1902043648529789224">Controlla la posizione della barra delle app</translation>
-<translation id="1904323733389537794">Se il criterio è impostato su true, vengono eseguiti i controlli online di <ph name="OCSP_CRL_LABEL" />.
+<translation id="1904323733389537794">Se la policy è impostata su true, vengono eseguiti i controlli online di <ph name="OCSP_CRL_LABEL" />.
 
-      Se il criterio è impostato su false o non viene configurato, <ph name="PRODUCT_NAME" /> non eseguirà i controlli delle revoche online in <ph name="PRODUCT_NAME" /> 19 e versioni successive.
+      Se la policy è impostata su false o non viene configurata, <ph name="PRODUCT_NAME" /> non eseguirà i controlli delle revoche online in <ph name="PRODUCT_NAME" /> 19 e versioni successive.
 
       Nota: i controlli di <ph name="OCSP_CRL_LABEL" /> non forniscono vantaggi efficaci per la sicurezza.</translation>
 <translation id="1905061765326052857">Non consentire agli utenti non affiliati di usare le macchine virtuali necessarie per supportare le app Linux</translation>
@@ -1294,22 +1294,22 @@
         Non è possibile bloccare app fondamentali per il sistema operativo; i limiti relativi a tali app verranno ignorati.
         Le app vengono identificate in modo univoco tramite il valore |app_id|. Dato che tipi di app diversi possono usare formati di ID differenti, è necessario specificare |app_type| accanto a |app_id|.
         Attualmente i limiti di tempo per app sono supportati soltanto per le app |ARC|. Viene usato il nome del pacchetto Android come |app_id|.
-        In futuro verranno supportati altri tipi di applicazioni, che per ora è possibile specificare nel criterio, ma i limiti non verranno applicati.
+        In futuro verranno supportati altri tipi di applicazioni, che per ora è possibile specificare nella policy, ma i limiti non verranno applicati.
         Esistono due tipi di limiti disponibili: |BLOCK| e |TIME_LIMIT|.
         |BLOCK| consente di non rendere disponibile l'app per l'utente. Se viene specificato un valore |daily_limit_mins| con il limite |BLOCK|, il valore |daily_limit_mins| viene ignorato.
         |TIME_LIMITS| consente di applicare un limite di utilizzo giornaliero e di non rendere disponibile l'app una volta raggiunto il limite nella giornata specifica. Il limite di utilizzo viene specificato tramite |daily_limit_mins| e viene reimpostato ogni giorno all'orario UTC impostato tramite |reset_at|.
-        Questo criterio viene usato soltanto per i bambini ed è complementare al criterio "UsageTimeLimit". I limiti specificati nel criterio "UsageTimeLimit", ad esempio relativi al tempo di utilizzo e di interruzione dell'uso, verranno applicati a prescindere dal criterio "PerAppTimeLimits".</translation>
+        Questa policy viene usata soltanto per i bambini ed è complementare alla policy "UsageTimeLimit". I limiti specificati nella policy "UsageTimeLimit", ad esempio relativi al tempo di utilizzo e di interruzione dell'uso, verranno applicati a prescindere dalla policy "PerAppTimeLimits".</translation>
 <translation id="1913629775420987861">Mostra una finestra di dialogo di avviso quando l'utente sta tentando di uscire</translation>
 <translation id="1915242485679279502">Mostra badge aziendale espanso nella barra degli strumenti</translation>
-<translation id="1916266055944569995">La configurazione del criterio consente di definire il valore restituito dell'API Managed Configuration per una determinata origine.
+<translation id="1916266055944569995">La configurazione della policy consente di definire il valore restituito dell'API Managed Configuration per una determinata origine.
 
       L'API Managed Configuration è una configurazione di coppie chiave-valore accessibile tramite chiamata JavaScript navigator.managed.getManagedConfiguration(). Questa API è disponibile soltanto per le origini che corrispondono ad applicazioni web con installazione forzata tramite <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" />.
      </translation>
-<translation id="1919802376548418720">Utilizza il criterio KDC per delegare credenziali.</translation>
+<translation id="1919802376548418720">Utilizza la policy KDC per delegare credenziali.</translation>
 <translation id="1920046221095339924">Consenti la sessione gestita sul dispositivo</translation>
-<translation id="1920772397574801429">La configurazione del criterio consente di specificare il tipo di account, tra quelli forniti dall'app di autenticazione Android, che supporta l'autenticazione <ph name="HTTP_NEGOTIATE" />, ad esempio Kerberos. Queste informazioni dovrebbero essere messe a disposizione dal fornitore dell'app di autenticazione. Per i dettagli, consulta la pagina I progetti di Chromium ( https://goo.gl/hajyfN )
+<translation id="1920772397574801429">La configurazione della policy consente di specificare il tipo di account, tra quelli forniti dall'app di autenticazione Android, che supporta l'autenticazione <ph name="HTTP_NEGOTIATE" />, ad esempio Kerberos. Queste informazioni dovrebbero essere messe a disposizione dal fornitore dell'app di autenticazione. Per i dettagli, consulta la pagina I progetti di Chromium ( https://goo.gl/hajyfN )
 
-      Se il criterio non viene configurato, l'autenticazione <ph name="HTTP_NEGOTIATE" /> su Android viene disattivata.</translation>
+      Se la policy non viene configurata, l'autenticazione <ph name="HTTP_NEGOTIATE" /> su Android viene disattivata.</translation>
 <translation id="1923704782248889851">Attiva la dettatura</translation>
 <translation id="1924085079572112898">Le impostazioni di F11 sono disattivate</translation>
 <translation id="1924393228810864764">Non consentire alle origini delle app web isolate di utilizzare Controlled Frame</translation>
@@ -1323,13 +1323,13 @@
 <translation id="1942015922182679826">Attiva l'eliminazione delle password non decifrabili</translation>
 <translation id="1942626390957213764">Disattiva hub di condivisione desktop</translation>
 <translation id="194407941132272412">Disattiva l'isolamento dei siti per tutti i siti web, ma consenti agli utenti di attivarlo</translation>
-<translation id="1945994447126139909">Questo criterio aziendale è finalizzato al periodo di transizione e verrà rimosso nella versione 88 di <ph name="PRODUCT_NAME" />.
+<translation id="1945994447126139909">Questa policy aziendale è finalizzata al periodo di transizione e verrà rimossa nella versione 88 di <ph name="PRODUCT_NAME" />.
 
-      Il criterio relativo al referrer predefinito di Chrome sarà rafforzato passando dal relativo valore corrente no-referrer-when-downgrade al più sicuro strict-origin-when-cross-origin tramite un rilascio graduale della release stabile di Chrome 85.
+      La policy relativa al referrer predefinito di Chrome sarà rafforzata passando dal relativo valore corrente no-referrer-when-downgrade al più sicuro strict-origin-when-cross-origin tramite un rilascio graduale della release stabile di Chrome 85.
 
-      Prima del rilascio, questo criterio aziendale non avrà alcun effetto. Dopo il rilascio, una volta attivato questo criterio aziendale, il criterio relativo al referrer predefinito di Chrome verrà impostato sul suo valore precedente, no-referrer-when-downgrade.
+      Prima del rilascio, questa policy aziendale non avrà alcun effetto. Dopo il rilascio, una volta attivata questa policy aziendale, la policy relativa al referrer predefinito di Chrome verrà impostato sul suo valore precedente, no-referrer-when-downgrade.
 
-      Questo criterio aziendale è disattivato per impostazione predefinita.</translation>
+      Questa policy aziendale è disattivata per impostazione predefinita.</translation>
 <translation id="1947848925128084608">Disattiva l'alto contrasto nella schermata di accesso e consenti all'utente di attivarlo temporaneamente</translation>
 <translation id="1949584741547056205">Risposte rapide</translation>
 <translation id="1954612656043024615">Attiva la funzione Appunti condivisi</translation>
@@ -1338,9 +1338,9 @@
 <translation id="1957093168333856467">Disattiva tastiera virtuale di accessibilità</translation>
 <translation id="1960059835237529462">Consente agli utenti di visualizzare la promozione di valutazione dell'App Store <ph name="IOS_NAME" /></translation>
 <translation id="1960416154405676350">Attiva la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation>
-<translation id="1961091374249454164">Il criterio viene applicato soltanto alle sessioni Ospite gestite.
-      La configurazione del criterio consente di specificare un elenco di ID delle estensioni esenti dalla procedura di pulizia della sessione Ospite gestita limitata (vedi <ph name="DEVICE_RESTRICTED_MANAGED_GUEST_SESSION_ENABLED_POLICY_NAME" />).
-Lasciare il criterio non impostato significa che nessuna estensione è esente dalla procedura di reimpostazione.</translation>
+<translation id="1961091374249454164">La policy viene applicata soltanto alle sessioni Ospite gestite.
+      La configurazione della policy consente di specificare un elenco di ID delle estensioni esenti dalla procedura di pulizia della sessione Ospite gestita limitata (vedi <ph name="DEVICE_RESTRICTED_MANAGED_GUEST_SESSION_ENABLED_POLICY_NAME" />).
+Lasciare la policy non impostata significa che nessuna estensione è esente dalla procedura di reimpostazione.</translation>
 <translation id="1962273523772270623">Consenti la raccolta di log eventi WebRTC dai servizi Google</translation>
 <translation id="1962864958436828230">Imposta le dimensioni minime dei dati per la limitazione relativa agli appunti, al fine di impedire la fuga di dati</translation>
 <translation id="1964191545419036999">Galleria (supportata dalla versione 117)</translation>
@@ -1348,74 +1348,74 @@
 <translation id="1964802606569741174">Questa norma non ha effetto sull'app YouTube per Android. Se è necessario applicare la modalità di protezione di YouTube, l'installazione dell'app YouTube per Android non deve essere consentita.</translation>
 <translation id="1964985353230379667">Consente di specificare la configurazione <ph name="KRB5_CONFIG" /> suggerita per i nuovi ticket creati manualmente.
 
-      Se il criterio "KerberosUseCustomPrefilledConfig" viene attivato, il valore del criterio viene applicato come configurazione suggerita e viene mostrato nella sezione "Avanzate" della finestra di dialogo dell'autenticazione Kerberos. Se il criterio viene impostato su una stringa vuota o se non viene configurato, viene eliminata la configurazione di <ph name="PRODUCT_OS_NAME" /> consigliata.
+      Se la policy "KerberosUseCustomPrefilledConfig" viene attivata, il valore della policy viene applicato come configurazione suggerita e viene mostrato nella sezione "Avanzate" della finestra di dialogo dell'autenticazione Kerberos. Se la policy viene impostata su una stringa vuota o se non viene configurata, viene eliminata la configurazione di <ph name="PRODUCT_OS_NAME" /> consigliata.
 
-      Se il criterio "KerberosUseCustomPrefilledConfig" viene disattivato, il valore di questo criterio non viene usato.</translation>
+      Se la policy "KerberosUseCustomPrefilledConfig" viene disattivata, il valore di questa policy non viene usato.</translation>
 <translation id="1967820716244187368">Consenti l'utilizzo di Chrome for Testing</translation>
 <translation id="1969212217917526199">Sostituisce le build di debug dell'host di accesso remoto.
 
           Il valore viene analizzato come un dizionario JSON di associazioni tra nomi e valori di norme.</translation>
 <translation id="1969808853498848952">Esegue sempre i plug-in che richiedono l'autorizzazione (ritirata)</translation>
 <translation id="1970146489334493241">Le impostazioni di gestione dell'alimentazione applicabili soltanto quando viene usata l'alimentazione CA.</translation>
-<translation id="1971991630422430420">Se il criterio viene impostato su Attivato, la funzionalità Fast Transition viene utilizzata quando il punto di accesso wireless la supporta. Viene applicato a tutti gli utenti e a tutte le interfacce del dispositivo.
+<translation id="1971991630422430420">Se la policy viene impostata su Attivata, la funzionalità Fast Transition viene utilizzata quando il punto di accesso wireless la supporta. Viene applicaa a tutti gli utenti e a tutte le interfacce del dispositivo.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, la funzionalità Fast Transition non viene utilizzata.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, la funzionalità Fast Transition non viene utilizzata.</translation>
 <translation id="1972134432340252414">Vengono bloccati i punti di estensioni precedenti nel processo del browser</translation>
 <translation id="1973804850652157024">Controlla l'utilizzo dell'API Controlled Frame</translation>
-<translation id="1977581177449752640">Se il criterio viene configurato, l'host di accesso remoto usa un certificato client con il nome comune dell'autorità di certificazione indicato per eseguire l'autenticazione per <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />. Per usare qualsiasi certificato client disponibile, imposta il criterio su <ph name="WILDCARD_VALUE" />. Questa funzionalità viene disattivata se il criterio viene lasciato vuoto o se non viene configurato.</translation>
+<translation id="1977581177449752640">Se la policy viene configurata, l'host di accesso remoto usa un certificato client con il nome comune dell'autorità di certificazione indicato per eseguire l'autenticazione per <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />. Per usare qualsiasi certificato client disponibile, imposta la policy su <ph name="WILDCARD_VALUE" />. Questa funzionalità viene disattivata se la policy viene lasciata vuota o se non viene configurata.</translation>
 <translation id="1984934843478301531">Automazione del lancio di app</translation>
 <translation id="1985545260037812875">Visualizza la schermata di impostazione delle dimensioni di visualizzazione durante l'accesso</translation>
 <translation id="1985598967415986700">La riduzione dello user agent sarà controllabile tramite Field-Trials e Origin-Trials.</translation>
 <translation id="1987789058026551147">Attiva i report sulle sessioni kiosk del dispositivo</translation>
 <translation id="1988345404999458987">Consente di specificare le configurazioni dei server di stampa disponibili.
 
-      Questo criterio consente di specificare la configurazione dei server di stampa esterni sui dispositivi <ph name="PRODUCT_OS_NAME" /> come file JSON.
+      Questa policy consente di specificare la configurazione dei server di stampa esterni sui dispositivi <ph name="PRODUCT_OS_NAME" /> come file JSON.
 
       Le dimensioni del file non devono superare 1MB e devono contenere un array di record (oggetti JSON). Ogni record deve contenere i campi "id", "url" e "display_name" con stringhe come valori. I valori dei campi "id" devono essere univoci.
 
       Il file viene scaricato e memorizzato nella cache. L'hash di crittografia viene utilizzato per verificare l'integrità del download. Il file viene scaricato nuovamente ogni volta che l'URL o l'hash cambiano.
 
-      Se il criterio viene impostato su un valore corretto, i dispositivi provano a inviare query ai server di stampa specificati per le stampanti disponibili utilizzando il protocollo IPP.
+      Se la policy viene impostata su un valore corretto, i dispositivi provano a inviare query ai server di stampa specificati per le stampanti disponibili utilizzando il protocollo IPP.
 
-      Se il criterio non viene configurato o se viene impostato un valore non corretto, agli utenti non sarà visibile nessuna stampante.
+      Se la policy non viene configurata o se viene impostato un valore non corretto, agli utenti non sarà visibile nessuna stampante.
 
       Attualmente, il numero di server di stampa è limitato a 16. Solo ai primi 16 server di stampa dell'elenco vengono inviate query.
 
-      Questo criterio è simile a <ph name="EXTERNAL_PRINT_SERVERS_POLICY" />, ma viene applicato per dispositivo.
+      Questa policy è simile a <ph name="EXTERNAL_PRINT_SERVERS_POLICY" />, ma viene applicata per dispositivo.
       </translation>
 <translation id="199011295049694531">Consente di segnalare informazioni sul fuso orario del dispositivo.
 
-      Se il criterio viene impostato su false o non viene impostato, le informazioni non vengono segnalate.
-      Se viene impostato su true, il fuso orario attualmente impostato sul dispositivo viene segnalato.</translation>
-<translation id="1990784382342293892">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="NATIVE_MESSAGING_BLOCKLIST_POLICY_NAME" />.</translation>
+      Se la policy viene impostata su false o non viene impostata, le informazioni non vengono segnalate.
+      Se viene impostata su true, il fuso orario attualmente impostato sul dispositivo viene segnalato.</translation>
+<translation id="1990784382342293892">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="NATIVE_MESSAGING_BLOCKLIST_POLICY_NAME" />.</translation>
 <translation id="1990823660725793326">Un URL blob di SharedWorker non eredita un controller. (comportamento precedente)</translation>
-<translation id="1995744620192427843">La configurazione del criterio impedisce il caricamento delle pagine web con URL vietati durante l'autenticazione utente (ad es. nella schermata di accesso e nella schermata di blocco). Fornisce un elenco di pattern URL che specificano gli URL vietati. Se il criterio non viene configurato, nessun URL è vietato durante l'autenticazione. I pattern URL devono avere il formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
+<translation id="1995744620192427843">La configurazione della policy impedisce il caricamento delle pagine web con URL vietati durante l'autenticazione utente (ad es. nella schermata di accesso e nella schermata di blocco). Fornisce un elenco di pattern URL che specificano gli URL vietati. Se la policy non viene configurata, nessun URL è vietato durante l'autenticazione. I pattern URL devono avere il formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
 
-Le eccezioni a questi pattern possono essere definite nel criterio correlato <ph name="DEVICE_AUTHENTICATION_URL_ALLOWLIST_POLICY_NAME" />.
+Le eccezioni a questi pattern possono essere definite nella policy correlata <ph name="DEVICE_AUTHENTICATION_URL_ALLOWLIST_POLICY_NAME" />.
 
 Determinati URL sono necessari per la buona riuscita dell'autenticazione, incluso accounts.google.com, quindi non devono essere bloccati se è richiesto l'accesso online.
 
-Nota: questo criterio non si applica agli URL JavaScript in-page con caricamento dinamico dei dati. Se hai bloccato example.com/abc, example.com potrebbe comunque caricarlo utilizzando XMLHTTPRequest.</translation>
+Nota: questa policy non si applica agli URL JavaScript in-page con caricamento dinamico dei dati. Se hai bloccato example.com/abc, example.com potrebbe comunque caricarlo utilizzando XMLHTTPRequest.</translation>
 <translation id="199764499252435679">Consenti gli aggiornamenti dei componenti in <ph name="PRODUCT_NAME" /></translation>
 <translation id="1997943707974344423">Consenti Smart Lock</translation>
 <translation id="1998504583649140526">Impostazioni relative alle richieste di rete privata</translation>
 <translation id="1999000620918508488">Forza la schermata di accesso a visualizzare o nascondere le informazioni di sistema.</translation>
 <translation id="1999401210569035434">Consenti estensioni non pubblicate</translation>
-<translation id="1999942889260716089">Se il criterio viene impostato su Vero, vengono attivati i suggerimenti di ricerca nella barra degli indirizzi di <ph name="PRODUCT_NAME" />. Se il criterio viene impostato su Falso, i suggerimenti di ricerca vengono disattivati.
+<translation id="1999942889260716089">Se la policy viene impostata su True, vengono attivati i suggerimenti di ricerca nella barra degli indirizzi di <ph name="PRODUCT_NAME" />. Se la policy viene impostata su False, i suggerimenti di ricerca vengono disattivati.
 
-      Il criterio non incide sui suggerimenti basati su preferiti o cronologia.
+      La policy non incide sui suggerimenti basati su preferiti o cronologia.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo. Se non viene configurato, i suggerimenti di ricerca sono attivi all'inizio, ma gli utenti possono disattivarli in qualsiasi momento.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla. Se non viene configurata, i suggerimenti di ricerca sono attivi all'inizio, ma gli utenti possono disattivarli in qualsiasi momento.</translation>
 <translation id="2000937390924915996">Non eseguire la pulizia automatica del disco durante l'accesso</translation>
 <translation id="2004382785802837840">Disattiva la possibilità di ignorare gli avvisi relativi alle password compromesse</translation>
 <translation id="2005506794355327448">L'azione da compiere quando lo schermo è abbassato.</translation>
 <translation id="2006530844219044261">Gestione dell'alimentazione</translation>
 <translation id="2006954055163088863">Considera l'utente inattivo quando viene riprodotto il video</translation>
-<translation id="201153120366509312">Se questo criterio viene consentito o se non viene configurato, la raccolta di metriche con chiave URL è consentita.
-Se il criterio viene consentito e la raccolta di metriche con chiave URL viene attivata dall'utente, la raccolta di metriche con chiave URL invia a Google gli URL delle pagine visitate dagli utenti per migliorare le ricerche e la navigazione, nonché le statistiche sull'utilizzo di ogni singola pagina.
+<translation id="201153120366509312">Se questa policy viene consentita o se non viene configurata, la raccolta di metriche con chiave URL è consentita.
+Se la policy viene consentita e la raccolta di metriche con chiave URL viene attivata dall'utente, la raccolta di metriche con chiave URL invia a Google gli URL delle pagine visitate dagli utenti per migliorare le ricerche e la navigazione, nonché le statistiche sull'utilizzo di ogni singola pagina.
 Le metriche con chiave URL includono anche gli identificatori e le statistiche sull'utilizzo di altri componenti del browser che possono modificare o fornire contenuti, come le estensioni.
 
-Se questo criterio non viene consentito, gli utenti non possono attivare la raccolta di metriche con chiave URL.</translation>
+Se questa policy non viene consentita, gli utenti non possono attivare la raccolta di metriche con chiave URL.</translation>
 <translation id="2012296492055302633">Attiva sempre la Schermata privata</translation>
 <translation id="2014757022750736514">Consente di stabilire il comportamento della schermata di accesso, da cui gli utenti possono accedere ai propri account. Le impostazioni consentono di decidere chi può accedere, che tipi di account sono consentiti, quali metodi di autenticazione devono essere usati. Sono disponibili anche impostazioni generali relative ad accessibilità, metodo di immissione e lingue.</translation>
 <translation id="201557587962247231">Frequenza dei caricamenti del rapporto sullo stato del dispositivo</translation>
@@ -1424,24 +1424,24 @@
 <translation id="2017459564744167827">Vedi <ph name="REFERENCE_URL" /> per ulteriori informazioni su schema e formattazione.</translation>
 <translation id="2018425641414671849">Non consentire agli utenti di riprodurre contenuti multimediali quando il dispositivo è bloccato</translation>
 <translation id="2021087124402050619">Consenti a Chrome Software Cleaner di eseguire scansioni periodiche del sistema e consenti scansioni manuali</translation>
-<translation id="2022842553416990270">Questo criterio è stato rimosso nella versione M114. Serviva per disattivare CECPQ2, ma CECPQ2 è stato disattivato per impostazione predefinita. Verrà introdotto un criterio separato per controllare l'implementazione della sostituzione di CECPQ2. Questa sostituzione sarà una combinazione del contratto chiave standard X25519 con il KEM post-quantistico scelto dal NIST, chiamato "Kyber".
+<translation id="2022842553416990270">Questa policy è stata rimossa nella versione M114. Serviva per disattivare CECPQ2, ma CECPQ2 è stato disattivato per impostazione predefinita. Verrà introdotta una policy separata per controllare l'implementazione della sostituzione di CECPQ2. Questa sostituzione sarà una combinazione del contratto chiave standard X25519 con il KEM post-quantistico scelto dal NIST, chiamato "Kyber".
 
-Se questo criterio non viene configurato o se viene attivato, <ph name="PRODUCT_NAME" /> seguirà la procedura di implementazione predefinita di CECPQ2, un algoritmo di accordo chiave post-quantistico in TLS.
+Se questa policy non viene configurata o se viene attivata, <ph name="PRODUCT_NAME" /> seguirà la procedura di implementazione predefinita di CECPQ2, un algoritmo di accordo chiave post-quantistico in TLS.
 
-      CECPQ2 comporta la generazione di messaggi TLS di dimensioni maggiori che, in rarissimi casi, potrebbero attivare bug in alcuni componenti hardware di rete. Questo criterio può essere impostato su False per disattivare ECPQ2 durante la risoluzione dei problemi di rete.
+      CECPQ2 comporta la generazione di messaggi TLS di dimensioni maggiori che, in rarissimi casi, potrebbero attivare bug in alcuni componenti hardware di rete. Questa policy può essere impostata su False per disattivare ECPQ2 durante la risoluzione dei problemi di rete.
 
-      Questo criterio è una misura temporanea e verrà rimosso nelle future versioni di <ph name="PRODUCT_NAME" />.</translation>
+      Questa policy è una misura temporanea e verrà rimossa nelle future versioni di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="2024476116966025075">Configura il nome di dominio richiesto per i client di accesso remoto</translation>
 <translation id="2026749017601510117">Consente di configurare il tempo di inattività del dispositivo in secondi che deve trascorrere prima di mostrare il salvaschermo per la schermata di accesso.
 
-I valori validi sono compresi tra 1 secondo e 9999 secondi. Se il criterio non viene configurato, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 7 secondi.
+I valori validi sono compresi tra 1 secondo e 9999 secondi. Se la policy non viene configurata, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 7 secondi.
 
-Questo criterio non avrà alcun effetto se il criterio <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" /> viene impostato su false.</translation>
+Questa policy non avrà alcun effetto se la policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" /> viene impostata su false.</translation>
 <translation id="2029985289397958781">Viene disattivata la ricerca tramite fotocamera con <ph name="GOOGLE_LENS_PRODUCT_NAME" /> per gli utenti Enterprise</translation>
 <translation id="2030905906517501646">Parola chiave del provider di ricerca predefinito</translation>
 <translation id="203096360153626918">Questa norma non ha effetto sulle app Android, che saranno in grado di entrare in modalità a schermo intero anche se la norma viene impostata su <ph name="FALSE" />.</translation>
 <translation id="2031074619942406753">Disattiva tastiera virtuale touch</translation>
-<translation id="2032848225007871645">La configurazione del criterio consente di stabilire le modalità di sblocco rapido che è possibile usare per sbloccare la schermata di blocco.
+<translation id="2032848225007871645">La configurazione della policy consente di stabilire le modalità di sblocco rapido che è possibile usare per sbloccare la schermata di blocco.
 
       Per consentire:
 
@@ -1451,28 +1451,28 @@
 
       * PIN e impronta, usa ["PIN", "FINGERPRINT"].
 
-      Se il criterio non viene configurato o se viene impostato su un elenco vuoto, non saranno disponibili modalità di sblocco rapido per i dispositivi gestiti.
+      Se la policy non viene configurata o se viene impostata su un elenco vuoto, non saranno disponibili modalità di sblocco rapido per i dispositivi gestiti.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" />.</translation>
+      Questa policy è deprecata. Usa la policy <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" />.</translation>
 <translation id="2033200857253268661">Le impostazioni di F12 sono disattivate</translation>
 <translation id="2034497350905878772">Attiva le ottimizzazioni di JavaScript avanzate su tutti i siti</translation>
-<translation id="2035995535603698706">Se il criterio viene impostato su Attivato, le immagini di terze parti su una pagina possono visualizzare un prompt di autenticazione.
+<translation id="2035995535603698706">Se la policy viene impostata su Attivata, le immagini di terze parti su una pagina possono visualizzare un prompt di autenticazione.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, le immagini di terze parti non possono visualizzare un prompt di autenticazione.
+Se la policy viene impostata su Disattivata o se non viene configurata, le immagini di terze parti non possono visualizzare un prompt di autenticazione.
 
-In genere, questo criterio è disattivato per difendere gli utenti da tentativi di phishing.</translation>
-<translation id="2036522553891755455">Se il criterio viene impostato su Attivato, il rilevamento delle condivisioni (la funzionalità Condivisione file di rete di <ph name="PRODUCT_NAME" />) utilizza il protocollo <ph name="NETBIOS_PROTOCOL" /> per rilevare le condivisioni sulla rete. Se viene impostato su Disattivato, il rilevamento delle condivisioni non utilizza il protocollo per rilevare le condivisioni.
+In genere, questa policy è disattivata per difendere gli utenti da tentativi di phishing.</translation>
+<translation id="2036522553891755455">Se la policy viene impostata su Attivata, il rilevamento delle condivisioni (la funzionalità Condivisione file di rete di <ph name="PRODUCT_NAME" />) utilizza il protocollo <ph name="NETBIOS_PROTOCOL" /> per rilevare le condivisioni sulla rete. Se viene impostata su Disattivata, il rilevamento delle condivisioni non utilizza il protocollo per rilevare le condivisioni.
 
-      Se non viene configurato, il comportamento predefinito è off per gli utenti gestiti e on per gli altri utenti.</translation>
+      Se non viene configurata, il comportamento predefinito è off per gli utenti gestiti e on per gli altri utenti.</translation>
 <translation id="2039801473506609891">Disattiva il supporto HTTP/0.9 sulle porte non predefinite</translation>
 <translation id="2040479044912658454">Modalità rasterizzazione stampa</translation>
-<translation id="2042513383871755994">La configurazione del criterio consente di elencare pattern URL che specificano quali siti non possono richiedere agli utenti l'accesso di lettura di file o directory nel file system del sistema operativo host tramite l'API file system.
+<translation id="2042513383871755994">La configurazione della policy consente di elencare pattern URL che specificano quali siti non possono richiedere agli utenti l'accesso di lettura di file o directory nel file system del sistema operativo host tramite l'API file system.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_FILE_SYSTEM_READ_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_FILE_SYSTEM_READ_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      I pattern URL non possono essere in conflitto con <ph name="FILE_SYSTEM_READ_ASK_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non possono essere in conflitto con <ph name="FILE_SYSTEM_READ_ASK_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="2043749682619281558">Attiva l'evidenziazione del cursore sulla schermata di accesso</translation>
 <translation id="2043770014371753404">Stampanti aziendali disattivate</translation>
 <translation id="2054093043033461396">Schermata di accesso salvaschermo del dispositivo attivata.</translation>
@@ -1482,9 +1482,9 @@
 <translation id="2061123930713023976">Consenti acquisizioni di pacchetti di rete di debug</translation>
 <translation id="2061810934846663491">Configura i nomi di dominio richiesti per gli host di accesso remoto</translation>
 <translation id="2062632109797189011">Riattiva l'API window.webkitStorageInfo</translation>
-<translation id="2069350366303315077">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> applica le sessioni ospite e impedisce gli accessi ai profili. Gli accessi ospite sono profili di <ph name="PRODUCT_NAME" /> in cui le finestre sono nella modalità di navigazione in incognito.
+<translation id="2069350366303315077">Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> applica le sessioni ospite e impedisce gli accessi ai profili. Gli accessi ospite sono profili di <ph name="PRODUCT_NAME" /> in cui le finestre sono nella modalità di navigazione in incognito.
 
-      Se il criterio viene impostato su Disattivato, se non viene configurato o se la modalità ospite del browser viene disattivata (tramite il criterio <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />), è possibile utilizzare profili nuovi ed esistenti.</translation>
+      Se la policy viene impostata su Disattivata, se non viene configurata o se la modalità ospite del browser viene disattivata (tramite la policy <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />), è possibile utilizzare profili nuovi ed esistenti.</translation>
 <translation id="2070744136203607632">Non eseguire controlli dell'intercettazione DNS</translation>
 <translation id="2072613440623913880">Attiva i clic automatici nella schermata di accesso</translation>
 <translation id="2073552873076775140">Consenti di eseguire l'accesso a <ph name="PRODUCT_NAME" /></translation>
@@ -1492,8 +1492,8 @@
 <translation id="2076158466157390917">Controlla la pulizia automatica durante l'accesso</translation>
 <translation id="2077273864382355561">Ritardo disattivazione schermo in caso di utilizzo della batteria</translation>
 <translation id="2081969239334697268">
-        Se il criterio viene impostato su Disabled, l'aggiornamento delle app kiosk di Chrome all'interno della sessione (per cui viene usato l'URL di aggiornamento indicato nel file manifest dell'estensione) verrà disattivato e rimarrà soltanto il precaricamento CRX come meccanismo di aggiornamento.
-        Se il criterio viene impostato su Enabled o se non viene configurato, l'aggiornamento delle app kiosk di Chrome all'interno della sessione sarà consentito.
+        Se la policy viene impostata su Disabled, l'aggiornamento delle app kiosk di Chrome all'interno della sessione (per cui viene usato l'URL di aggiornamento indicato nel file manifest dell'estensione) verrà disattivato e rimarrà soltanto il precaricamento CRX come meccanismo di aggiornamento.
+        Se la policy viene impostata su Enabled o se non viene configurata, l'aggiornamento delle app kiosk di Chrome all'interno della sessione sarà consentito.
         </translation>
 <translation id="2082205219176343977">Configura la versione minima di Chrome consentita per il dispositivo.</translation>
 <translation id="2083016623552073519">Attiva la traduzione dei sottotitoli in tempo reale. I sottotitoli codificati verranno inviati a Google per essere tradotti.
@@ -1512,38 +1512,38 @@
 <translation id="208623333578980446">Consenti wakelock schermo per la gestione dell'alimentazione</translation>
 <translation id="2089541797660774692">Attiva reporting su cloud tramite browser gestito</translation>
 <translation id="2090712407517297305">La pagina della cronologia di Chrome organizzata in gruppi sarà visibile all'indirizzo chrome://history/grouped.</translation>
-<translation id="2090939118981888335">Se il criterio viene impostato su Attivato, è consentito il proxy di compressione dei dati. Se viene impostato su Disattivato, il proxy non è consentito.
+<translation id="2090939118981888335">Se la policy viene impostata su Attivata, è consentito il proxy di compressione dei dati. Se viene impostata su Disattivata, il proxy non è consentito.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo. In caso contrario, gli utenti possono scegliere di utilizzare la funzionalità.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla. In caso contrario, gli utenti possono scegliere di utilizzare la funzionalità.</translation>
 <translation id="2093552723795057221">Non viene segnalato lo stato dell'audio</translation>
-<translation id="209388704279338003">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />.</translation>
-<translation id="2093951844062548778">Questo criterio consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server per ricevere i risultati della definizione.
+<translation id="209388704279338003">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />.</translation>
+<translation id="2093951844062548778">Questa policy consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server per ricevere i risultati della definizione.
 
-      Se il criterio è attivato o non impostato, la funzionalità di definizione di Risposte rapide sarà attiva.
-      Se il criterio è disattivato, la funzionalità di definizione di Risposte rapide sarà disattivata.</translation>
+      Se la policy è attivata o non impostata, la funzionalità di definizione di Risposte rapide sarà attiva.
+      Se la policy è disattivata, la funzionalità di definizione di Risposte rapide sarà disattivata.</translation>
 <translation id="209586405398070749">Canale stabile</translation>
 <translation id="2096932573113293941">Chiedi all'utente l'autorizzazione a eseguire plug-in che la richiedono</translation>
 <translation id="2098658257603918882">Attiva rapporti sull'utilizzo e sui dati relativi agli arresti anomali</translation>
 <translation id="2099380339157427935">Non mostrare il pulsante di disconnessione nella barra delle applicazioni</translation>
-<translation id="2100630160869631650">Aggiunge account Kerberos compilati automaticamente. Se le credenziali di Kerberos corrispondono a quelle di accesso, un account può essere configurato in modo da riutilizzare le credenziali di accesso specificando "<ph name="LOGIN_EMAIL_PLACEHOLDER" />" e "<ph name="PASSWORD_PLACEHOLDER" />" rispettivamente per l'account principale e la password, in modo che il ticket Kerberos possa essere recuperato automaticamente, a meno che non sia configurata l'autenticazione a due fattori. Gli utenti non possono modificare gli account aggiunti tramite questo criterio.
+<translation id="2100630160869631650">Aggiunge account Kerberos compilati automaticamente. Se le credenziali di Kerberos corrispondono a quelle di accesso, un account può essere configurato in modo da riutilizzare le credenziali di accesso specificando "<ph name="LOGIN_EMAIL_PLACEHOLDER" />" e "<ph name="PASSWORD_PLACEHOLDER" />" rispettivamente per l'account principale e la password, in modo che il ticket Kerberos possa essere recuperato automaticamente, a meno che non sia configurata l'autenticazione a due fattori. Gli utenti non possono modificare gli account aggiunti tramite questa policy.
 
-          Se questo criterio viene attivato, l'elenco degli account definiti dal criterio viene aggiunto alle impostazioni dell'account Kerberos.
+          Se questa policy viene attivata, l'elenco degli account definiti dalla policy viene aggiunto alle impostazioni dell'account Kerberos.
 
-          Se questo criterio viene disattivato o non è configurato, nessun account viene aggiunto alle impostazioni dell'account Kerberos e tutti gli account aggiunti in precedenza con questo criterio vengono rimossi. Gli utenti possono comunque aggiungere manualmente gli account se il criterio "Gli utenti possono aggiungere account Kerberos" viene attivato.</translation>
+          Se questa policy viene disattivata o non è configurata, nessun account viene aggiunto alle impostazioni dell'account Kerberos e tutti gli account aggiunti in precedenza con questa policy vengono rimossi. Gli utenti possono comunque aggiungere manualmente gli account se la policy "Gli utenti possono aggiungere account Kerberos" viene attivata.</translation>
 <translation id="2104418465060359056">Segnala i dati delle estensioni e dei plug-in</translation>
 <translation id="210652463860415362">Accetta i contenuti web che usano la funzionalità di trasporto dei dizionari di compressione</translation>
 <translation id="2106627642643925514">Consente di sostituire la modalità di stampa PIN predefinita. Se la modalità non è disponibile, questa norma viene ignorata.</translation>
-<translation id="2107563874993284076">Se il criterio viene impostato su Attivato, gli utenti possono utilizzare la funzione Condivisione file di rete per <ph name="PRODUCT_NAME" />. Se viene impostato su Disattivato, gli utenti non possono utilizzare questa funzionalità.</translation>
+<translation id="2107563874993284076">Se la policy viene impostata su Attivata, gli utenti possono utilizzare la funzione Condivisione file di rete per <ph name="PRODUCT_NAME" />. Se viene impostata su Disattivata, gli utenti non possono utilizzare questa funzionalità.</translation>
 <translation id="2107601598727098402">
         La norma è obsoleta in M72. Utilizza invece CloudManagementEnrollmentToken.
         </translation>
 <translation id="2112656109118682849">Consenti agli utenti di attivare/disattivare la visualizzazione delle informazioni di sistema nella schermata di accesso</translation>
 <translation id="2113068765175018713">Limita il tempo di attività del dispositivo riavviandolo automaticamente</translation>
-<translation id="2116169546538119304"> Questo criterio è deprecato, configura i criteri di Kerberos in modo da riutilizzare la password di accesso.</translation>
+<translation id="2116169546538119304"> Questa policy è deprecata, configura le policy di Kerberos in modo da riutilizzare la password di accesso.</translation>
 <translation id="2117990069872855599">L'URL da cui è possibile scaricare l'immagine dell'avatar.</translation>
-<translation id="2124881675920287921">Questo criterio è stato ritirato in M82 e rimosso in M85; usa il criterio <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />. Disattivare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_OPT_IN_ALLOWED_POLICY_NAME" /> equivale a disattivare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />. Attivare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_OPT_IN_ALLOWED_POLICY_NAME" /> o non configurare questa impostazione equivale a non configurare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />.
+<translation id="2124881675920287921">Questa policy è stata ritirata in M82 e rimossa in M85; usa la policy <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />. Disattivare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_OPT_IN_ALLOWED_POLICY_NAME" /> equivale a disattivare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />. Attivare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_OPT_IN_ALLOWED_POLICY_NAME" /> o non configurare questa impostazione equivale a non configurare <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />.
 
-      L'impostazione di questo criterio su false impedisce agli utenti di decidere di inviare ai server di Google alcune informazioni sul sistema e alcuni contenuti delle pagine. Se questo criterio viene impostato su true o non viene configurato, gli utenti potranno inviare alcune informazioni sul sistema e alcuni contenuti delle pagine alla funzionalità Navigazione sicura per contribuire a rilevare app e siti pericolosi.
+      L'impostazione di questa policy su false impedisce agli utenti di decidere di inviare ai server di Google alcune informazioni sul sistema e alcuni contenuti delle pagine. Se questa policy viene impostata su true o non viene configurata, gli utenti potranno inviare alcune informazioni sul sistema e alcuni contenuti delle pagine alla funzionalità Navigazione sicura per contribuire a rilevare app e siti pericolosi.
 
       Visita il sito https://developers.google.com/safe-browsing per ulteriori informazioni sulla funzionalità Navigazione sicura.</translation>
 <translation id="2127599828444728326">Consenti notifiche su questi siti</translation>
@@ -1554,17 +1554,17 @@
 
       Se questa impostazione viene disattivata, <ph name="PRODUCT_NAME" /> non rileverà quando una finestra è coperta da altre finestre.
 
-      Se questo criterio non viene impostato, il rilevamento della copertura della finestra verrà attivato.</translation>
-<translation id="2132424782557550556">Configura i criteri del reporting su cloud.
+      Se questa policy non viene impostata, il rilevamento della copertura della finestra verrà attivato.</translation>
+<translation id="2132424782557550556">Configura le policy del reporting su cloud.
 
-      Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, questi criteri vengono ignorati.
+      Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, queste policy vengono ignorate.
 
-      I criteri vengono applicati solo se la macchina è registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-      I criteri vengono sempre applicati per <ph name="PRODUCT_OS_NAME" />.</translation>
+      Le policy vengono applicate solo se la macchina è registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+      Le policy vengono sempre applicate per <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="2134437727173969994">Consenti blocco dello schermo</translation>
-<translation id="2135335181634291106">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_ICON_URL_POLICY_NAME" /> consente di specificare l'URL dell'icona preferita del provider di ricerca predefinito.
+<translation id="2135335181634291106">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_ICON_URL_POLICY_NAME" /> consente di specificare l'URL dell'icona preferita del provider di ricerca predefinito.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ICON_URL_POLICY_NAME" /> non viene configurato, non è presente alcuna icona per il provider di ricerca.</translation>
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ICON_URL_POLICY_NAME" /> non viene configurata, non è presente alcuna icona per il provider di ricerca.</translation>
 <translation id="2136073175041447267">Configura le unità cloud (Google Drive, Microsoft OneDrive) in <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="2142409122365327693">Questa è una funzionalità beta.
 
@@ -1589,10 +1589,10 @@
 <translation id="2151831603578119302">Attiva le scorciatoie delle funzioni di accessibilità</translation>
 <translation id="2156132677421487971">Consente di configurare le norme per <ph name="PRODUCT_NAME" />, una funzione che permette agli utenti di inviare i contenuti di schede, siti o del desktop dal browser a schermi remoti e sistemi audio.</translation>
 <translation id="2156755242840687300">Server di stampa esterni attivi</translation>
-<translation id="2157842368188031417">Il criterio viene applicato soltanto alle sessioni ospite gestite. Deve essere attivato per consentire il cambio di utente all'interno della sessione nella modalità di workstation condivisa di Imprivata.
-      Se il criterio viene impostato su Vero, vengono sostituiti forzatamente alcuni criteri per le funzionalità, che memorizzano dati utente sensibili e non vengono gestite tramite il meccanismo di pulizia usato per il cambio di utente all'interno della sessione con la modalità di workstation condivisa di Imprivata.
-      Se il criterio viene impostato su Falso o se non viene configurato, i criteri non vengono sostituiti.</translation>
-<translation id="2158028663273824412">Consente di controllare la modalità del resolver di DNS over HTTPS. Tieni presente che questo criterio imposta solo la modalità predefinita per ciascuna query. La modalità può essere ignorata per tipi speciali di query, ad esempio le richieste di risoluzione del nome host del server DNS over HTTPS.
+<translation id="2157842368188031417">La policy viene applicata soltanto alle sessioni ospite gestite. Deve essere attivata per consentire il cambio di utente all'interno della sessione nella modalità di workstation condivisa di Imprivata.
+      Se la policy viene impostata su True, vengono sostituite forzatamente alcune policy per le funzionalità, che memorizzano dati utente sensibili e non vengono gestite tramite il meccanismo di pulizia usato per il cambio di utente all'interno della sessione con la modalità di workstation condivisa di Imprivata.
+      Se la policy viene impostata su False o se non viene configurata, le policy non vengono sostituite.</translation>
+<translation id="2158028663273824412">Consente di controllare la modalità del resolver di DNS over HTTPS. Tieni presente che questa policy imposta solo la modalità predefinita per ciascuna query. La modalità può essere ignorata per tipi speciali di query, ad esempio le richieste di risoluzione del nome host del server DNS over HTTPS.
 
 La modalità <ph name="SECURE_DNS_MODE_OFF" /> disattiverà DNS over HTTPS.
 
@@ -1602,65 +1602,65 @@
 
 Su <ph name="ANDROID_VERSION" /> e versioni successive, se DNS over TLS è attivo, <ph name="PRODUCT_NAME" /> non invierà richieste DNS non sicure.
 
-Se questo criterio non viene configurato, le query DNS over HTTPS non verranno inviate per i dispositivi gestiti. In caso contrario, il browser potrebbe inviare richieste DNS over HTTPS a un resolver associato al resolver di sistema configurato dall'utente.</translation>
-<translation id="2158741059065130266">Se il criterio viene impostato su True, gli utenti dell'app File di <ph name="PRODUCT_OS_NAME" /> possono vedere un Cestino e i file nelle cartelle I miei file e Download (inclusi i discendenti creati dall'utente) verranno inviati al Cestino quando verranno eliminati.
+Se questa policy non viene configurata, le query DNS over HTTPS non verranno inviate per i dispositivi gestiti. In caso contrario, il browser potrebbe inviare richieste DNS over HTTPS a un resolver associato al resolver di sistema configurato dall'utente.</translation>
+<translation id="2158741059065130266">Se la policy viene impostata su True, gli utenti dell'app File di <ph name="PRODUCT_OS_NAME" /> possono vedere un Cestino e i file nelle cartelle I miei file e Download (inclusi i discendenti creati dall'utente) verranno inviati al Cestino quando verranno eliminati.
 
-      Se il criterio viene impostato su False, i file che si trovavano nel cestino continueranno a essere disponibili visualizzando i file nascosti e cercando la directory .Trash nella cartella I miei file o Download.</translation>
+      Se la policy viene impostata su False, i file che si trovavano nel cestino continueranno a essere disponibili visualizzando i file nascosti e cercando la directory .Trash nella cartella I miei file o Download.</translation>
 <translation id="2159486052528894673">Consenti ai criteri relativi al cloud degli utenti di eseguire l'override dei criteri relativi al cloud delle macchine.</translation>
-<translation id="2160170953213468208">Se viene attivato, questo criterio forza l'accesso a qualsiasi documento Office con un tipo MIME normalmente gestito dall'<ph name="BASIC_EDITOR_NAME" /> per scaricare il file.
+<translation id="2160170953213468208">Se viene attivata, questa policy forza l'accesso a qualsiasi documento Office con un tipo MIME normalmente gestito dall'<ph name="BASIC_EDITOR_NAME" /> per scaricare il file.
 
-Se il criterio viene disattivato, questi documenti verranno aperti automaticamente nell'<ph name="BASIC_EDITOR_NAME" />.
+Se la policy viene disattivata, questi documenti verranno aperti automaticamente nell'<ph name="BASIC_EDITOR_NAME" />.
 
-Se questo criterio non viene configurato, equivale ad attivarlo per gli utenti normali (ad esempio, i file verranno scaricati). Se il criterio non viene configurato, equivale a disattivarlo per gli utenti aziendali (ad esempio, i file verranno aperti nell'<ph name="BASIC_EDITOR_NAME" />).</translation>
+Se questa policy non viene configurata, equivale ad attivarla per gli utenti normali (ad esempio, i file verranno scaricati). Se la policy non viene configurata, equivale a disattivarla per gli utenti aziendali (ad esempio, i file verranno aperti nell'<ph name="BASIC_EDITOR_NAME" />).</translation>
 <translation id="2160336427036785721">Consente di configurare la quantità di memoria che una singola istanza di <ph name="PRODUCT_NAME" /> può utilizzare prima che le schede vengano eliminate (ossia la memoria utilizzata dalla scheda verrà liberata e la scheda dovrà essere ricaricata quando l'utente la seleziona) per risparmiare memoria.
 
-      Se il criterio viene impostato, una volta superato il limite il browser inizierà a eliminare le schede per risparmiare memoria. Non vi è, tuttavia, alcuna garanzia che il browser venga sempre eseguito al di sotto di tale limite. Qualsiasi valore inferiore a 1024 verrà arrotondato per eccesso a 1024.
+      Se la policy viene impostata, una volta superato il limite il browser inizierà a eliminare le schede per risparmiare memoria. Non vi è, tuttavia, alcuna garanzia che il browser venga sempre eseguito al di sotto di tale limite. Qualsiasi valore inferiore a 1024 verrà arrotondato per eccesso a 1024.
 
-      Se questo criterio non viene impostato, il browser farà dei tentativi per risparmiare memoria solo una volta rilevato che la memoria fisica del computer è in esaurimento.</translation>
+      Se questa policy non viene impostata, il browser farà dei tentativi per risparmiare memoria solo una volta rilevato che la memoria fisica del computer è in esaurimento.</translation>
 <translation id="2161348910646846717">Consenti agli utenti di modificare il canale di rilascio</translation>
 <translation id="2162703823039992020">Integrazioni contestuali dei servizi Google su <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2165567959657265531">Per i cookie impostati per i domini corrispondenti a questi pattern verrà ripristinato il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> precedente. Se ripristini il comportamento precedente, i cookie per cui non è specificato un attributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> vengono considerati come se avessero il valore "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />"; viene rimosso il requisito che richiede che i cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" abbiano l'attributo "<ph name="ATTRIBUTE_SECURE_NAME" />" e viene ignorato il confronto tra schemi nel valutare se due siti sono uno stesso sito. Per una descrizione completa, visita la pagina https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
 
-          Per i cookie sui domini non previsti dai pattern specificati qui oppure per tutti i cookie se questo criterio non viene impostato, il valore predefinito globale sarà la configurazione personale dell'utente.
+          Per i cookie sui domini non previsti dai pattern specificati qui oppure per tutti i cookie se questa policy non viene impostata, il valore predefinito globale sarà la configurazione personale dell'utente.
 
           Per informazioni dettagliate sui pattern validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
 
           Tieni presente che i pattern elencati qui vengono considerati come domini, non come URL, quindi non dovresti specificare uno schema o una porta.</translation>
 <translation id="2166155400701622446">Esiste un elenco di porte limitate integrate a <ph name="PRODUCT_NAME" />. Non sarà possibile eseguire collegamenti a tali porte. Questa impostazione consente di bypassare tale elenco. Il valore è un elenco separato da virgole di nessuna porta o di più porte tramite le quali saranno consentiti collegamenti in uscita.
 
-      Le porte sono limitate per impedire l'utilizzo di <ph name="PRODUCT_NAME" /> come vettore per sfruttare varie vulnerabilità di rete. La configurazione di questo criterio potrebbe esporre la tua rete a eventuali attacchi. Questo criterio è inteso come soluzione alternativa temporanea per gli errori con codice "ERR_UNSAFE_PORT" durante la migrazione a una porta standard (ossia 80 o 443) di un servizio in esecuzione tramite una porta bloccata.
+      Le porte sono limitate per impedire l'utilizzo di <ph name="PRODUCT_NAME" /> come vettore per sfruttare varie vulnerabilità di rete. La configurazione di questa policy potrebbe esporre la tua rete a eventuali attacchi. Questa policy è intesa come soluzione alternativa temporanea per gli errori con codice "ERR_UNSAFE_PORT" durante la migrazione a una porta standard (ossia 80 o 443) di un servizio in esecuzione tramite una porta bloccata.
 
-      I siti web dannosi possono rilevare facilmente che questo criterio è configurato e per quali porte, quindi usano queste informazioni per attacchi mirati.
+      I siti web dannosi possono rilevare facilmente che questa policy è configurata e per quali porte, quindi usano queste informazioni per attacchi mirati.
 
       Qui ogni porta è etichettata con una data limite per lo sblocco. Dopo tale data, la porta verrà limitata a prescindere da questa impostazione.
 
-      Se il criterio viene lasciato vuoto o se non viene configurato, verranno bloccate tutte le porte limitate. Se sono presenti valori validi e non validi contemporaneamente, verranno applicati quelli validi.
+      Se la policy viene lasciata vuota o se non viene configurata, verranno bloccate tutte le porte limitate. Se sono presenti valori validi e non validi contemporaneamente, verranno applicati quelli validi.
 
-      Questo criterio esegue l'override dell'opzione della riga di comando "--explicitly-allowed-ports".</translation>
+      Questa policy esegue l'override dell'opzione della riga di comando "--explicitly-allowed-ports".</translation>
 <translation id="2166472654199325139">Non filtrare i siti di contenuti per adulti</translation>
 <translation id="2168397434410358693">Ritardo inattività in caso di utilizzo di CA</translation>
 <translation id="217013996107840632">Parametri della riga di comando per cambiare il browser alternativo.</translation>
 <translation id="2170233653554726857">Attiva ottimizzazione WPAD</translation>
 <translation id="2174946221763588594">Consente di stabilire se i siti visitati dagli utenti possono creare sessioni di realtà aumentata immersive usando l'<ph name="WEBXR_API_NAME" />.
 
-      Se questo criterio non viene configurato o se viene attivato, l'<ph name="WEBXR_API_NAME" /> accetterà <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> durante la creazione delle sessioni, consentendo così agli utenti di vivere esperienze di realtà aumentata.
+      Se questa policy non viene configurata o se viene attivata, l'<ph name="WEBXR_API_NAME" /> accetterà <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> durante la creazione delle sessioni, consentendo così agli utenti di vivere esperienze di realtà aumentata.
 
-      Se questo criterio viene disattivato, l'<ph name="WEBXR_API_NAME" /> rifiuterà le richieste di creazione di sessioni con la modalità <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Le sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> esistenti (se presenti) non verranno chiuse.
+      Se questa policy viene disattivata, l'<ph name="WEBXR_API_NAME" /> rifiuterà le richieste di creazione di sessioni con la modalità <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Le sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> esistenti (se presenti) non verranno chiuse.
 
       Per ulteriori informazioni sulle sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulta la specifica <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="2175353308236295184">Oggetto di configurazione JSON specifico dell'app con una serie di coppie chiave-valore, ad esempio '"managedConfiguration": { "key1": value1, "key2": value2 }'. Le chiavi sono definite nel file manifest dell'app.</translation>
 <translation id="2176115444876446233">Gli utenti non possono raccogliere dati di rilevamento del rendimento a livello di sistema.</translation>
 <translation id="2177382213857119200">Consente di controllare se la funzionalità Navigazione sicura di <ph name="PRODUCT_NAME" /> è attiva e la relativa modalità.
 
-      Se questo criterio viene impostato su "NoProtection" (valore 0), Navigazione sicura non è mai attiva.
+      Se questa policy viene impostata su "NoProtection" (valore 0), Navigazione sicura non è mai attiva.
 
-      Se questo criterio viene impostato su "StandardProtection" (valore 1, predefinito), Navigazione sicura è sempre attiva in modalità standard.
+      Se questa policy viene impostata su "StandardProtection" (valore 1, predefinito), Navigazione sicura è sempre attiva in modalità standard.
 
-      Se questo criterio viene impostato su "EnhancedProtection" (valore 2), Navigazione sicura è sempre attiva in modalità avanzata e fornisce maggior sicurezza, ma non richiede la condivisione di ulteriori dati di navigazione con Google.
+      Se questa policy viene impostata su "EnhancedProtection" (valore 2), Navigazione sicura è sempre attiva in modalità avanzata e fornisce maggior sicurezza, ma non richiede la condivisione di ulteriori dati di navigazione con Google.
 
-      Se imposti questo criterio come obbligatorio, gli utenti non potranno modificare o ignorare l'impostazione Navigazione sicura in <ph name="PRODUCT_NAME" />.
+      Se imposti questa policy come obbligatoria, gli utenti non potranno modificare o ignorare l'impostazione Navigazione sicura in <ph name="PRODUCT_NAME" />.
 
-      Se questo criterio non viene impostato, Navigazione sicura sarà attiva in modalità di protezione standard, ma gli utenti potranno modificare questa impostazione.
+      Se questa policy non viene impostata, Navigazione sicura sarà attiva in modalità di protezione standard, ma gli utenti potranno modificare questa impostazione.
 
       Per ulteriori informazioni sulla Navigazione sicura, visita la pagina https://support.google.com/chrome?p=safe_browsing_preferences.</translation>
 <translation id="2177696016354404697">Disattiva sempre la Schermata privata</translation>
@@ -1670,65 +1670,65 @@
 <translation id="2180958780733364832">Controlla l'uso della modalità headless</translation>
 <translation id="2182291258410176649">L'utente decide se abilitare il backup e il ripristino</translation>
 <translation id="2183338188392346527">Non segnalare i contatori del tempo di esecuzione del dispositivo</translation>
-<translation id="2187372280917024033">Il modello URI del resolver DNS over HTTPS desiderato. Per specificare diversi resolver DNS over HTTPS, separa i modelli URI corrispondenti con gli spazi. Questo criterio è molto simile a <ph name="DOH_TEMPLATES_POLICY_NAME" /> e lo sostituirà se verrà specificato.
-A differenza del criterio <ph name="DOH_TEMPLATES_POLICY_NAME" />, questo criterio consente di specificare le informazioni sull'identità.
+<translation id="2187372280917024033">Il modello URI del resolver DNS over HTTPS desiderato. Per specificare diversi resolver DNS over HTTPS, separa i modelli URI corrispondenti con gli spazi. Questa policy è molto simile a <ph name="DOH_TEMPLATES_POLICY_NAME" /> e la sostituirà se verrà specificato.
+A differenza della policy <ph name="DOH_TEMPLATES_POLICY_NAME" />, questa policy consente di specificare le informazioni sull'identità.
 Gli identificatori vengono specificati mediante segnaposto di variabili che vengono sostituiti con informazioni sull'utente o sul dispositivo in <ph name="PRODUCT_NAME" />. Gli identificatori non vengono inviati al server DNS come testo normale; vengono invece sottoposti ad hashing con l'algoritmo <ph name="SHA256" /> e con codifica esadecimale maiuscola.
 
 Gli identificatori vengono specificati tra parentesi graffe, precedute dal simbolo del dollaro. Per l'identificazione degli utenti, usa i seguenti segnaposto <ph name="USER_EMAIL" />, <ph name="USER_EMAIL_DOMAIN" /> e <ph name="USER_EMAIL_NAME" />. Per l'identificazione del dispositivo, usa i seguenti segnaposto <ph name="DEVICE_DIRECTORY_ID" />, <ph name="DEVICE_SERIAL_NUMBER" />, <ph name="DEVICE_ASSET_ID" /> e <ph name="DEVICE_ANNOTATED_LOCATION" />.
 
 Prima della versione 122, gli identificatori dei dispositivi non venivano sostituiti per gli utenti non affiliati. A partire dalla versione 122, i segnaposto dei dispositivi vengono sostituiti con il valore <ph name="DEVICE_NOT_MANAGED" />, che viene sottoposto ad hashing e con codifica esadecimale.
 
-A partire dalla versione 125, gli indirizzi IP dei dispositivi possono essere aggiunti come URI del modello utilizzando il segnaposto <ph name="DEVICE_IP_ADDRESSES" />. Questo segnaposto verrà sostituito da una stringa esadecimale che rappresenta l'ordine dei byte di rete dell'indirizzo IPv4 e/o dell'indirizzo IPv6 associati alla rete attuale, se quest'ultima è gestita tramite criteri.
-L'indirizzo IPv4 reca il prefisso 0010; l'indirizzo IPv6 reca il prefisso 0020. Per le reti a doppio stack, per la sostituzione dei segnaposto verranno utilizzati entrambi gli indirizzi IPv4 e IPv6. Vengono aggiunti più indirizzi consecutivamente, senza delimitatore. Per gli utenti non affiliati, la sostituzione avviene solo se la rete è gestita in base ai criteri relativi agli utenti. Se il segnaposto degli indirizzi IP non può essere sostituito con l'indirizzo IP del dispositivo, viene sostituito con una stringa vuota.
+A partire dalla versione 125, gli indirizzi IP dei dispositivi possono essere aggiunti come URI del modello utilizzando il segnaposto <ph name="DEVICE_IP_ADDRESSES" />. Questo segnaposto verrà sostituito da una stringa esadecimale che rappresenta l'ordine dei byte di rete dell'indirizzo IPv4 e/o dell'indirizzo IPv6 associati alla rete attuale, se quest'ultima è gestita tramite policy.
+L'indirizzo IPv4 reca il prefisso 0010; l'indirizzo IPv6 reca il prefisso 0020. Per le reti a doppio stack, per la sostituzione dei segnaposto verranno utilizzati entrambi gli indirizzi IPv4 e IPv6. Vengono aggiunti più indirizzi consecutivamente, senza delimitatore. Per gli utenti non affiliati, la sostituzione avviene solo se la rete è gestita in base alle policy relative agli utenti. Se il segnaposto degli indirizzi IP non può essere sostituito con l'indirizzo IP del dispositivo, viene sostituito con una stringa vuota.
 
-Se il criterio <ph name="DOH_MODE_POLICY_NAME" /> viene impostato su <ph name="SECURE_DNS_MODE_SECURE" />, è necessario configurare questo criterio o il criterio <ph name="DOH_TEMPLATES_POLICY_NAME" /> e il campo non può essere lasciato vuoto.
+Se la policy <ph name="DOH_MODE_POLICY_NAME" /> viene impostata su <ph name="SECURE_DNS_MODE_SECURE" />, è necessario configurare questa policy o la policy <ph name="DOH_TEMPLATES_POLICY_NAME" /> e il campo non può essere lasciato vuoto.
 
-Se il criterio <ph name="DOH_MODE_POLICY_NAME" /> viene impostato su <ph name="SECURE_DNS_MODE_AUTOMATIC" /> e questo criterio viene configurato, verranno usati i modelli URI specificati; se questo criterio non viene configurato, verranno usate le mappature impostate come hardcoded per cercare di eseguire l'upgrade del resolver DNS attuale dell'utente a un resolver DoH gestito dallo stesso fornitore.
+Se la policy <ph name="DOH_MODE_POLICY_NAME" /> viene impostata su <ph name="SECURE_DNS_MODE_AUTOMATIC" /> e questa policy viene configurata, verranno usati i modelli URI specificati; se questa policy non viene configurata, verranno usate le mappature impostate come hardcoded per cercare di eseguire l'upgrade del resolver DNS attuale dell'utente a un resolver DoH gestito dallo stesso fornitore.
 
 Se il modello URI contiene una variabile <ph name="HTTP_VARIABLE_DNS" />, per le richieste al resolver verrà usato il metodo <ph name="HTTP_METHOD_GET" />; in caso contrario verrà usato il metodo <ph name="HTTP_METHOD_POST" />.
 
-Dalla versione 114 in poi, il criterio <ph name="DOH_SALT_POLICY_NAME" /> è facoltativo se viene configurato questo criterio.</translation>
+Dalla versione 114 in poi, la policy <ph name="DOH_SALT_POLICY_NAME" /> è facoltativa se viene configurata questa policy.</translation>
 <translation id="219297066914002620">Indica a <ph name="PRODUCT_OS_NAME" /> di attivare o disattivare gli strumenti della console di gestione delle macchine virtuali.
 
-      Se il criterio viene impostato su true o non viene impostato, l'utente potrà usare l'interfaccia a riga di comando di gestione delle macchine virtuali.
+      Se la policy viene impostata su true o non viene impostata, l'utente potrà usare l'interfaccia a riga di comando di gestione delle macchine virtuali.
       In caso contrario, l'intera interfaccia a riga di comando di gestione delle macchine virtuali viene disattivata e nascosta.
       </translation>
-<translation id="2194051055390000601">Un criterio per stabilire se i tuoi utenti possono o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli argomenti degli annunci.
+<translation id="2194051055390000601">Una policy per stabilire se i tuoi utenti possono o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli argomenti degli annunci.
 
-Se imposti questo criterio su Disabled, l'impostazione relativa agli argomenti degli annunci verrà disattivata per i tuoi utenti.
-Se lo imposti su Enabled o se non lo configuri, i tuoi utenti potranno attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli argomenti degli annunci.
+Se imposti questa policy su Disabled, l'impostazione relativa agli argomenti degli annunci verrà disattivata per i tuoi utenti.
+Se la imposti su Enabled o se non la configuri, i tuoi utenti potranno attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli argomenti degli annunci.
 
-Se configuri questo criterio, il criterio <ph name="PRIVACY_SANDBOX_PROMPT_ENABLED_POLICY_NAME" /> deve essere impostato su Disabled.</translation>
+Se configuri questa policy, la policy <ph name="PRIVACY_SANDBOX_PROMPT_ENABLED_POLICY_NAME" /> deve essere impostata su Disabled.</translation>
 <translation id="2195032660890227692">Questa norma è stata rimossa in <ph name="PRODUCT_NAME" /> 68 e sostituita da <ph name="ARC_BR_POLICY_NAME" />.</translation>
-<translation id="2197625019569762163">Se questo criterio è impostato su True, per impostazione predefinita viene visualizzata la tastiera numerica per inserire la password nella schermata di accesso. Gli utenti possono comunque passare alla tastiera normale.
+<translation id="2197625019569762163">Se questa policy è impostata su True, per impostazione predefinita viene visualizzata la tastiera numerica per inserire la password nella schermata di accesso. Gli utenti possono comunque passare alla tastiera normale.
 
-      Se imposti il criterio, gli utenti non possono modificarlo. Se non è impostato o è impostato su False, non sortisce alcun effetto.</translation>
+      Se imposti la policy, gli utenti non possono modificarla. Se non è impostata o è impostata su False, non sortisce alcun effetto.</translation>
 <translation id="2200698565850397198">Configura lista bloccata di messaggi nativi</translation>
 <translation id="220157212534775145">Consente di riattivare l'interfaccia asincrona ritirata per <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> nell'API File System Access.</translation>
 <translation id="2202787915587511214">Attiva NTLMv2</translation>
 <translation id="2204379573346866896">I minuti trascorsi nell'ora corrente.</translation>
 <translation id="2204753382813641270">Controlla la visualizzazione automatica della barra delle app</translation>
-<translation id="2208092773610663977">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> controlla se nomi utente e password inseriti dagli utenti sono stati resi noti.
+<translation id="2208092773610663977">Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> controlla se nomi utente e password inseriti dagli utenti sono stati resi noti.
 
-Se viene impostato disattivato, gli utenti non possono utilizzare questa funzionalità.
+Se viene impostata su Disattivata, gli utenti non possono utilizzare questa funzionalità.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo in <ph name="PRODUCT_NAME" />. Se non viene configurato, è consentito il controllo della divulgazione delle credenziali, ma l'utente può disattivarlo.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla in <ph name="PRODUCT_NAME" />. Se non viene configurata, è consentito il controllo della divulgazione delle credenziali, ma l'utente può disattivarlo.</translation>
 <translation id="2208976000652006649">Parametri per l'URL di ricerca che utilizza POST</translation>
 <translation id="2212011154693551439">La pagina della cronologia di Chrome organizzata in gruppi sarà visibile all'indirizzo chrome://history/grouped per impostazione predefinita.</translation>
 <translation id="2212207215880394506">Non consentire l'editing di foto con AI generativa.</translation>
 <translation id="221287948061571053">Nascondi badge aziendale espanso nella barra degli strumenti</translation>
 <translation id="2213059592185933570">Attiva la creazione di profili di roaming</translation>
 <translation id="2213342458177721585">Attiva il layout Hindi Inscript a livello di dispositivo.</translation>
-<translation id="2215238871726750562">Se il criterio è impostato su True, la finestra del browser non viene avviata all'inizio della sessione.
+<translation id="2215238871726750562">Se la policy è impostata su True, la finestra del browser non viene avviata all'inizio della sessione.
 
-      Se il criterio è impostato su False o se non viene configurato, la finestra si avvia automaticamente.
+      Se la policy è impostata su False o se non viene configurata, la finestra si avvia automaticamente.
 
-      Nota: tieni presente che la finestra del browser potrebbe non essere avviata a causa di altri criteri o altri flag della riga di comando.</translation>
-<translation id="2215471798823435557">La configurazione di questo criterio consente di specificare quali varianti è possibile applicare su un dispositivo <ph name="PRODUCT_OS_NAME" /> gestito dall'azienda.
+      Nota: tieni presente che la finestra del browser potrebbe non essere avviata a causa di altre policy o altri flag della riga di comando.</translation>
+<translation id="2215471798823435557">La configurazione di questa policy consente di specificare quali varianti è possibile applicare su un dispositivo <ph name="PRODUCT_OS_NAME" /> gestito dall'azienda.
 
       Le varianti forniscono un mezzo per apportare modifiche a <ph name="PRODUCT_OS_NAME" /> senza inviare una nuova versione, attivando o disattivando in modo selettivo le funzionalità già esistenti. Per ulteriori informazioni, vai all'indirizzo https://support.google.com/chrome/a?p=Manage_the_Chrome_variations_framework.
 
-      Se viene impostato <ph name="VARIATIONS_ENABLED_OPTION_NAME" /> (valore 0) o se il criterio non viene configurato, è possibile applicare tutte le varianti a <ph name="PRODUCT_OS_NAME" />.
+      Se viene impostato <ph name="VARIATIONS_ENABLED_OPTION_NAME" /> (valore 0) o se la policy non viene configurata, è possibile applicare tutte le varianti a <ph name="PRODUCT_OS_NAME" />.
 
       Se viene impostato <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (valore 1), è possibile applicare a <ph name="PRODUCT_OS_NAME" /> soltanto le varianti considerate correzioni fondamentali per la sicurezza o la stabilità.
 
@@ -1736,14 +1736,14 @@
 <translation id="2215746393279570703">Impostazioni del servizio SSO mobile</translation>
 <translation id="2221779615493499989">Consente agli utenti di segnalare lo stato di rete su dispositivi registrati.
 
-      Se il criterio viene impostato su Falso, le informazioni non vengono segnalate.
-      Se impostato su Vero o non impostato, verrà segnalato lo stato di rete del dispositivo.</translation>
+      Se la policy viene impostata su False, le informazioni non vengono segnalate.
+      Se impostata su True o non impostata, verrà segnalato lo stato di rete del dispositivo.</translation>
 <translation id="2223393221350938149">Non consentire ad alcun sito di eseguire JIT di JavaScript</translation>
 <translation id="2223598546285729819">Impostazione di notifica predefinita</translation>
 <translation id="2224706708550115831">Consente al browser dell'utente di accedere a un elenco di URL quando la VPN sempre attiva è attiva in modalità con restrizioni, il blocco è attivato e la VPN non è connessa</translation>
 <translation id="222673035924187991">Attiva TLS Encrypted ClientHello</translation>
 <translation id="2231817271680715693">Importa cronologia di navigazione dal browser predefinito alla prima esecuzione</translation>
-<translation id="2231962946025538735">Questo criterio è stato ritirato. Usa il criterio <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e il criterio <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per scegliere se utilizzare il visualizzatore PDF integrato per aprire i file PDF.
+<translation id="2231962946025538735">Questa policy è stata ritirata. Usa la policy <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e la policy <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per scegliere se utilizzare il visualizzatore PDF integrato per aprire i file PDF.
 
       Specifica un elenco di plug-in che l'utente può attivare o disattivare in <ph name="PRODUCT_NAME" />.
 
@@ -1751,34 +1751,34 @@
 
       Se attivi questa impostazione, l'elenco di plug-in specificato può essere usato in <ph name="PRODUCT_NAME" />. Gli utenti possono attivare o disattivare i plug-in in "about:plugins", anche se corrispondono a un pattern di DisabledPlugins. Gli utenti possono anche attivare e disattivare i plug-in che non corrispondono a nessun pattern in DisabledPlugins, DisabledPluginsExceptions e EnabledPlugins.
 
-      Questo criterio è pensato per consentire un blocco rigoroso dei plug-in se l'elenco "DisabledPlugins" contiene voci con caratteri jolly (ad esempio per disattivare tutti i plug-in "*" o per disattivare tutti i plug-in Java "*Java*"), ma l'amministratore vuole attivare qualche versione particolare come "IcedTea Java 2.3". Queste versioni particolari possono essere specificate in questo criterio.
+      Questa policy è pensata per consentire un blocco rigoroso dei plug-in se l'elenco "DisabledPlugins" contiene voci con caratteri jolly (ad esempio per disattivare tutti i plug-in "*" o per disattivare tutti i plug-in Java "*Java*"), ma l'amministratore vuole attivare qualche versione particolare come "IcedTea Java 2.3". Queste versioni particolari possono essere specificate in questa policy.
 
       Tieni presente che devono essere esclusi sia il nome del plug-in sia il nome del gruppo del plug-in. Ciascun gruppo di plug-in viene mostrato in una sezione separata di about:plugins; ciascuna sezione può contenere uno o più plug-in. Ad esempio, il plug-in "Shockwave Flash" appartiene al gruppo "Adobe Flash Player" ed entrambi i nomi devono avere una corrispondenza nell'elenco di eccezioni se il plug-in in questione deve essere escluso dalla lista bloccata.
 
-      Se questo criterio non viene impostato, tutti i plug-in che corrispondono ai pattern in "DisabledPlugins" verranno disattivati e bloccati e l'utente non potrà attivarli.</translation>
+      Se questa policy non viene impostata, tutti i plug-in che corrispondono ai pattern in "DisabledPlugins" verranno disattivati e bloccati e l'utente non potrà attivarli.</translation>
 <translation id="2236488539271255289">Non consentire ai siti di impostare i dati locali</translation>
 <translation id="2236593201136596376">Consenti la raccolta di log di testo WebRTC dai servizi Google</translation>
-<translation id="2237258181338466053">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> proverà ad avviare alcuni URL in un browser alternativo, ad esempio <ph name="IE_PRODUCT_NAME" />. Questa funzionalità viene impostata con i criteri del gruppo <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />.
+<translation id="2237258181338466053">Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> proverà ad avviare alcuni URL in un browser alternativo, ad esempio <ph name="IE_PRODUCT_NAME" />. Questa funzionalità viene impostata con le policy del gruppo <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />.
 
-Se il criterio viene impostato su Disattivato o se non viene impostato, <ph name="PRODUCT_NAME" /> non proverà ad avviare gli URL impostati in un browser alternativo.</translation>
-<translation id="2237705286848619561">Se questo criterio viene attivato, le sessioni aziendali di assistenza da remoto avviate dall'amministratore consentiranno il trasferimento di file tra il client e l'host.
+Se la policy viene impostata su Disattivata o se non viene impostata, <ph name="PRODUCT_NAME" /> non proverà ad avviare gli URL impostati in un browser alternativo.</translation>
+<translation id="2237705286848619561">Se questa policy viene attivata, le sessioni aziendali di assistenza da remoto avviate dall'amministratore consentiranno il trasferimento di file tra il client e l'host.
 
-Questo criterio non influisce sugli scenari di accesso remoto.
+Questa policy non influisce sugli scenari di accesso remoto.
 
-Se questo criterio non viene configurato o se viene disattivato, il trasferimento di file non è consentito.</translation>
-<translation id="2241498944622759244">Questa funzionalità non è mai stata lanciata, pertanto il criterio è obsoleto. Se è impostato su true o non è impostato, <ph name="PRODUCT_NAME" /> suggerisce pagine correlate alla pagina corrente.
+Se questa policy non viene configurata o se viene disattivata, il trasferimento di file non è consentito.</translation>
+<translation id="2241498944622759244">Questa funzionalità non è mai stata lanciata, pertanto la policy è obsoleta. Se è impostata su true o non è impostata, <ph name="PRODUCT_NAME" /> suggerisce pagine correlate alla pagina corrente.
       Questi suggerimenti vengono recuperati da remoto dai server di Google.
 
       Se l'impostazione è impostata su false, i suggerimenti non vengono recuperati o mostrati.</translation>
-<translation id="2244674148015569802">La configurazione del criterio consente di elencare i siti a cui viene concessa automaticamente l'autorizzazione ad accedere ai dispositivi seriali USB con ID fornitore e prodotto corrispondenti ai valori dei campi <ph name="VENDOR_ID_FIELD_NAME" /> e <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> non viene specificato, i siti indicati sono autorizzati ad accedere ai dispositivi con ID fornitore corrispondente al valore del campo <ph name="VENDOR_ID_FIELD_NAME" /> e con qualsiasi ID prodotto.
+<translation id="2244674148015569802">La configurazione della policy consente di elencare i siti a cui viene concessa automaticamente l'autorizzazione ad accedere ai dispositivi seriali USB con ID fornitore e prodotto corrispondenti ai valori dei campi <ph name="VENDOR_ID_FIELD_NAME" /> e <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> non viene specificato, i siti indicati sono autorizzati ad accedere ai dispositivi con ID fornitore corrispondente al valore del campo <ph name="VENDOR_ID_FIELD_NAME" /> e con qualsiasi ID prodotto.
 
-      Se gli URL non sono validi, il criterio viene ignorato. Viene considerata soltanto l'origine (schema, host e porta) dell'URL.
+      Se gli URL non sono validi, la policy viene ignorata. Viene considerata soltanto l'origine (schema, host e porta) dell'URL.
 
-      Su ChromeOS, questo criterio viene applicato solo agli utenti affiliati.
+      Su ChromeOS, questa policy viene applicata solo agli utenti affiliati.
 
-      Questo criterio esegue l'override di <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> e delle preferenze dell'utente.
+      Questa policy esegue l'override di <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> e delle preferenze dell'utente.
 
-      Questo criterio viene applicato soltanto per l'accesso ai dispositivi USB tramite l'API Web Serial. Per concedere l'accesso ai dispositivi USB tramite l'API WebUSB, vedi il criterio <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+      Questa policy viene applicata soltanto per l'accesso ai dispositivi USB tramite l'API Web Serial. Per concedere l'accesso ai dispositivi USB tramite l'API WebUSB, vedi la policy <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="2246565294817797392">Blocca cookie troncati</translation>
 <translation id="2246621891161157804">Consenti a Chrome di bloccare le navigazioni verso protocolli esterni all'interno di iframe con sandbox</translation>
 <translation id="224750967938323855">Non mostrare il consenso alla sincronizzazione durante l'accesso</translation>
@@ -1788,15 +1788,15 @@
 <translation id="225830954785359083">Impedisci alle pagine di mostrare popup durante l'unload</translation>
 <translation id="2261648512244797294">Disattiva stampa Privet deprecata</translation>
 <translation id="2263881357524831360">Consenti l'utilizzo di gestori delle password di terze parti in <ph name="PRODUCT_NAME" /> su <ph name="ANDROID_NAME" /></translation>
-<translation id="2264286153777425328">Elenco di azioni da eseguire quando viene raggiunto il timeout del criterio <ph name="IDLE_TIMEOUT_POLICY_NAME" />.
+<translation id="2264286153777425328">Elenco di azioni da eseguire quando viene raggiunto il timeout della policy <ph name="IDLE_TIMEOUT_POLICY_NAME" />.
 
-Avviso: l'impostazione di questo criterio può influire sulla rimozione definitiva dei dati personali locali. Ti consigliamo di testare le impostazioni prima del deployment per evitare l'eliminazione accidentale di dati personali.
+Avviso: l'impostazione di questa policy può influire sulla rimozione definitiva dei dati personali locali. Ti consigliamo di testare le impostazioni prima del deployment per evitare l'eliminazione accidentale di dati personali.
 
-Se il criterio <ph name="IDLE_TIMEOUT_POLICY_NAME" /> non viene configurato, questo criterio non ha alcun effetto.
+Se la policy <ph name="IDLE_TIMEOUT_POLICY_NAME" /> non viene configurata, questa policy non ha alcun effetto.
 
-Quando viene raggiunto il timeout del criterio <ph name="IDLE_TIMEOUT_POLICY_NAME" />, il browser esegue le azioni configurate in questo criterio.
+Quando viene raggiunto il timeout della policy <ph name="IDLE_TIMEOUT_POLICY_NAME" />, il browser esegue le azioni configurate in questa policy.
 
-Se questo criterio è vuoto o se non viene configurato, il criterio <ph name="IDLE_TIMEOUT_POLICY_NAME" /> non ha alcun effetto.
+Se questa policy è vuota o se non viene configurata, la policy <ph name="IDLE_TIMEOUT_POLICY_NAME" /> non ha alcun effetto.
 
 Le azioni supportate sono:
 
@@ -1808,15 +1808,15 @@
 
 "<ph name="SIGN_OUT_ACTION" />": l'utente che ha attualmente eseguito l'accesso viene disconnesso. Azione supportata solo su iOS.
 
-"<ph name="CLEAR_BROWSING_HISTORY_ACTION" />", "<ph name="CLEAR_DOWNLOAD_HISTORY_ACTION" />", "<ph name="CLEAR_COOKIES_AND_OTHER_SITE_DATA_ACTION" />", "<ph name="CLEAR_CACHED_IMAGES_AND_FILES_ACTION" />", "<ph name="CLEAR_PASSWORD_SIGNIN_ACTION" />", "<ph name="CLEAR_AUTOFILL_ACTION" />", "<ph name="CLEAR_SITE_SETTINGS_ACTION" />", "<ph name="CLEAR_HOSTED_APP_DATA_ACTION" />": vengono cancellati i dati di navigazione corrispondenti. Per maggiori informazioni, vedi il criterio <ph name="CLEAR_BROWSING_DATA_ON_EXIT_LIST_POLICY_NAME" />. I tipi di azione supportati su iOS sono: "<ph name="CLEAR_BROWSING_HISTORY_ACTION" />", "<ph name="CLEAR_COOKIES_AND_OTHER_SITE_DATA_ACTION" />", "<ph name="CLEAR_CACHED_IMAGES_AND_FILES_ACTION" />", "<ph name="CLEAR_PASSWORD_SIGNIN_ACTION" />" e "<ph name="CLEAR_AUTOFILL_ACTION" />"
+"<ph name="CLEAR_BROWSING_HISTORY_ACTION" />", "<ph name="CLEAR_DOWNLOAD_HISTORY_ACTION" />", "<ph name="CLEAR_COOKIES_AND_OTHER_SITE_DATA_ACTION" />", "<ph name="CLEAR_CACHED_IMAGES_AND_FILES_ACTION" />", "<ph name="CLEAR_PASSWORD_SIGNIN_ACTION" />", "<ph name="CLEAR_AUTOFILL_ACTION" />", "<ph name="CLEAR_SITE_SETTINGS_ACTION" />", "<ph name="CLEAR_HOSTED_APP_DATA_ACTION" />": vengono cancellati i dati di navigazione corrispondenti. Per maggiori informazioni, vedi la policy <ph name="CLEAR_BROWSING_DATA_ON_EXIT_LIST_POLICY_NAME" />. I tipi di azione supportati su iOS sono: "<ph name="CLEAR_BROWSING_HISTORY_ACTION" />", "<ph name="CLEAR_COOKIES_AND_OTHER_SITE_DATA_ACTION" />", "<ph name="CLEAR_CACHED_IMAGES_AND_FILES_ACTION" />", "<ph name="CLEAR_PASSWORD_SIGNIN_ACTION" />" e "<ph name="CLEAR_AUTOFILL_ACTION" />"
 
 "<ph name="RELOAD_PAGES_ACTION" />": vengono ricaricate tutte le pagine web. Per alcune pagine, all'utente potrebbe essere chiesto di confermare prima. Azione non supportata su iOS.
 
-La configurazione delle azioni "<ph name="CLEAR_BROWSING_HISTORY_ACTION" />", "<ph name="CLEAR_PASSWORD_SIGNIN_ACTION" />", "<ph name="CLEAR_AUTOFILL_ACTION" />" e "<ph name="CLEAR_SITE_SETTINGS_ACTION" />" comporta la disattivazione della sincronizzazione per i rispettivi tipi di dati se né il criterio "<ph name="CHROME_SYNC_NAME" />" viene disattivato impostando il criterio <ph name="SYNC_DISABLED_POLICY_NAME" /> né il criterio <ph name="BROWSER_SIGNIN_POLICY_NAME" /> viene disattivato.</translation>
+La configurazione delle azioni "<ph name="CLEAR_BROWSING_HISTORY_ACTION" />", "<ph name="CLEAR_PASSWORD_SIGNIN_ACTION" />", "<ph name="CLEAR_AUTOFILL_ACTION" />" e "<ph name="CLEAR_SITE_SETTINGS_ACTION" />" comporta la disattivazione della sincronizzazione per i rispettivi tipi di dati se né la policy "<ph name="CHROME_SYNC_NAME" />" viene disattivata impostando la policy <ph name="SYNC_DISABLED_POLICY_NAME" /> né la policy <ph name="BROWSER_SIGNIN_POLICY_NAME" /> viene disattivata.</translation>
 <translation id="2266422599396179941">Consenti agli utenti di inviare feedback</translation>
-<translation id="2268891553068901979">Se il criterio viene attivato, verrà disattivata la sincronizzazione di <ph name="GOOGLE_DRIVE_NAME" /> nell'app File di <ph name="PRODUCT_OS_NAME" /> quando si è connessi a una rete cellulare. I dati verranno sincronizzati con Drive solo se si è connessi a una rete Wi-Fi o Ethernet.
+<translation id="2268891553068901979">Se la policy viene attivata, verrà disattivata la sincronizzazione di <ph name="GOOGLE_DRIVE_NAME" /> nell'app File di <ph name="PRODUCT_OS_NAME" /> quando si è connessi a una rete cellulare. I dati verranno sincronizzati con Drive solo se si è connessi a una rete Wi-Fi o Ethernet.
 
-Se il criterio viene disattivato o se non viene configurato, gli utenti potranno trasferire i file su Drive tramite la rete cellulare.</translation>
+Se la policy viene disattivata o se non viene configurata, gli utenti potranno trasferire i file su Drive tramite la rete cellulare.</translation>
 <translation id="2269319728625047531">Abilita la visualizzazione del consenso alla sincronizzazione durante l'accesso</translation>
 <translation id="2269837888511509900">Attiva la condivisione delle credenziali utente</translation>
 <translation id="2270747976331889601">Attiva una funzionalità di sicurezza TLS 1.3 per i trust anchor locali</translation>
@@ -1825,24 +1825,24 @@
 <translation id="2279381650184876122">Disattiva il supporto degli URL di dati in SVGUseElement.</translation>
 <translation id="2281496157391382819"> Consente di controllare gli avvisi sulla privacy della sessione Ospite gestita su <ph name="PRODUCT_OS_NAME" />.
 
-      Se il criterio è impostato su false, gli avvisi sulla privacy sulla schermata di accesso e la notifica sull'avvio automatico all'interno della sessione Ospite verranno disattivati.
+      Se la policy è impostata su false, gli avvisi sulla privacy sulla schermata di accesso e la notifica sull'avvio automatico all'interno della sessione Ospite verranno disattivati.
 
-      Questo criterio non dovrebbe essere utilizzato per i dispositivi usati dal pubblico generale.
+      Questa policy non dovrebbe essere utilizzata per i dispositivi usati dal pubblico generale.
 
-      Se il criterio è impostato su true o non configurato, la notifica di avviso sulla privacy nella sessione Ospite gestita con avvio automatico verrà bloccata finché l'utente non la ignorerà.</translation>
-<translation id="2281878365805647176">La configurazione del criterio consente di attivare la funzionalità di accesso limitato di Chrome in <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME" /> e di impedire agli utenti di modificare questa impostazione. Gli utenti possono accedere agli strumenti Google soltanto con gli account dei domini specificati (per consentire gli account Gmail o googlemail, aggiungi consumer_accounts all'elenco dei domini). Questa impostazione impedisce agli utenti di accedere a un account secondario e di aggiungerne uno su un dispositivo gestito che richiede l'autenticazione di Google, se tale account non appartiene a uno dei domini esplicitamente consentiti.
+      Se la policy è impostata su true o non configurata, la notifica di avviso sulla privacy nella sessione Ospite gestita con avvio automatico verrà bloccata finché l'utente non la ignorerà.</translation>
+<translation id="2281878365805647176">La configurazione della policy consente di attivare la funzionalità di accesso limitato di Chrome in <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME" /> e di impedire agli utenti di modificare questa impostazione. Gli utenti possono accedere agli strumenti Google soltanto con gli account dei domini specificati (per consentire gli account Gmail o googlemail, aggiungi consumer_accounts all'elenco dei domini). Questa impostazione impedisce agli utenti di accedere a un account secondario e di aggiungerne uno su un dispositivo gestito che richiede l'autenticazione di Google, se tale account non appartiene a uno dei domini esplicitamente consentiti.
 
       Se questa impostazione viene lasciata vuota o se non viene configurata, gli utenti possono accedere a <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME" /> con qualsiasi account.
 
       Gli utenti non possono modificare o ignorare questa impostazione.
 
-      Nota: questo criterio comporta l'aggiunta dell'intestazione X-GoogApps-Allowed-Domains a tutte le richieste HTTP e HTTPS inviate a tutti i domini google.com, come descritto all'indirizzo https://support.google.com/a/answer/1668854.</translation>
+      Nota: questa policy comporta l'aggiunta dell'intestazione X-GoogApps-Allowed-Domains a tutte le richieste HTTP e HTTPS inviate a tutti i domini google.com, come descritto all'indirizzo https://support.google.com/a/answer/1668854.</translation>
 <translation id="2288506601233091655">Non consentire l'eliminazione della cronologia dei processi di stampa</translation>
 <translation id="2289688405312849186">Entità utente "utente@realm". Il segnaposto <ph name="LOGIN_ID_PLACEHOLDER" /> viene sostituito dal nome utente "utente". Il segnaposto <ph name="LOGIN_EMAIL_PLACEHOLDER" /> viene sostituito dall'entità completa "utente@realm".</translation>
-<translation id="2290270645214705008">Se questo criterio viene impostato su Disattivato, non è possibile avviare o configurare il servizio host di accesso remoto per accettare le connessioni in arrivo.  Questo criterio non influisce sugli scenari di assistenza remota.
+<translation id="2290270645214705008">Se questa policy viene impostata su Disattivata, non è possibile avviare o configurare il servizio host di accesso remoto per accettare le connessioni in arrivo.  Questa policy non influisce sugli scenari di assistenza remota.
 
-          Il criterio non ha effetto se viene impostato su Attivato, se viene lasciato vuoto o se non viene configurato.</translation>
-<translation id="2292482441027364457">La configurazione del criterio consente di correggere quali identificatori di applicazioni vengono mostrati da <ph name="PRODUCT_OS_NAME" /> come app bloccate nella barra Avvio app e gli utenti non possono modificarli.
+          La policy non ha effetto se viene impostata su Attivata, se viene lasciata vuota o se non viene configurata.</translation>
+<translation id="2292482441027364457">La configurazione della policy consente di correggere quali identificatori di applicazioni vengono mostrati da <ph name="PRODUCT_OS_NAME" /> come app bloccate nella barra Avvio app e gli utenti non possono modificarli.
 
 Specifica le app di Chrome tramite il relativo ID, come pjkljhegncpnkpknbcohdijeoejaedia;
 le app per Android tramite il relativo nome del pacchetto, ad esempio com.google.android.gm;
@@ -1850,29 +1850,29 @@
 e le app web di sistema tramite il nome in snake case, ad esempio <ph name="PINNED_LAUNCHER_APPS_POLICY_SYSTEM_WEB_APP_EXAMPLE" />.
 App web isolate tramite il relativo ID pacchetto web, ad esempio <ph name="PINNED_LAUNCHER_APPS_POLICY_ISOLATED_WEB_APP_EXAMPLE" />.
 
-Se il criterio non viene configurato, gli utenti possono modificare l'elenco di app bloccate in Avvio app.</translation>
+Se la policy non viene configurata, gli utenti possono modificare l'elenco di app bloccate in Avvio app.</translation>
 <translation id="229322770310505679">Consenti il concetto di gruppi atomici di criteri</translation>
-<translation id="22941467117331786">Se il criterio è impostato su True, viene visualizzato un grande pulsante di disconnessione nella barra delle applicazioni durante le sessioni attive mentre la schermata non è bloccata.
+<translation id="22941467117331786">Se la policy è impostata su True, viene visualizzato un grande pulsante di disconnessione nella barra delle applicazioni durante le sessioni attive mentre la schermata non è bloccata.
 
-      Se il criterio è impostato su False o se non viene configurato, non viene visualizzato alcun pulsante.</translation>
+      Se la policy è impostata su False o se non viene configurata, non viene visualizzato alcun pulsante.</translation>
 <translation id="2294382669900758280">Il video riprodotto nelle app Android non viene considerato, anche se la norma viene impostata su <ph name="TRUE" />.</translation>
-<translation id="2296600623052658741">La configurazione del criterio consente di impostare un elenco di pattern URL che specificano i siti che possono usare l'autorizzazione di accesso dei siti agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
+<translation id="2296600623052658741">La configurazione della policy consente di impostare un elenco di pattern URL che specificano i siti che possono usare l'autorizzazione di accesso dei siti agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
 
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="2299220924812062390">Consente di specificare un elenco dei plug-in attivati</translation>
 <translation id="2299815818824242485">Non consentire ricerche inviate tramite proxy con una protezione maggiore</translation>
 <translation id="2303795211377219696">Attiva la Compilazione automatica per le carte di credito</translation>
-<translation id="2304009805995145854">A partire da <ph name="PRODUCT_NAME" /> 67, l'isolamento dei siti è stato attivato per impostazione predefinita su tutte le piattaforme desktop, così che ogni sito venga eseguito nel proprio processo. Ogni sito è uno schema più eTLD+1 (ad es. https://example.com). Se il criterio viene impostato su Attivato, il comportamento non cambia; impedisce solo la disattivazione da parte degli utenti (ad esempio, utilizzando la voce "Disattiva l'isolamento dei siti" in chrome://flags). A partire da <ph name="PRODUCT_NAME" /> 76, se il criterio viene impostato su Disattivato o se non viene configurato, l'isolamento dei siti non viene disattivato, ma è consentita la disattivazione da parte degli utenti.
+<translation id="2304009805995145854">A partire da <ph name="PRODUCT_NAME" /> 67, l'isolamento dei siti è stato attivato per impostazione predefinita su tutte le piattaforme desktop, così che ogni sito venga eseguito nel proprio processo. Ogni sito è uno schema più eTLD+1 (ad es. https://example.com). Se la policy viene impostata su Attivata, il comportamento non cambia; impedisce solo la disattivazione da parte degli utenti (ad esempio, utilizzando la voce "Disattiva l'isolamento dei siti" in chrome://flags). A partire da <ph name="PRODUCT_NAME" /> 76, se la policy viene impostata su Disattivata o se non viene configurata, l'isolamento dei siti non viene disattivato, ma è consentita la disattivazione da parte degli utenti.
 
       <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> potrebbe anche essere utile per l'isolamento di origini specifiche a una granularità maggiore rispetto al sito (ad es. https://a.example.com).
 
-      In <ph name="PRODUCT_OS_NAME" /> 76 o versioni precedenti, imposta il criterio relativo ai dispositivi <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> sullo stesso valore, perché, se i valori non corrispondono, potrebbe verificarsi un ritardo quando si accede a una sessione utente.
+      In <ph name="PRODUCT_OS_NAME" /> 76 o versioni precedenti, imposta la policy relativa ai dispositivi <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> sullo stesso valore, perché, se i valori non corrispondono, potrebbe verificarsi un ritardo quando si accede a una sessione utente.
 
-      Nota: per Android, utilizza invece il criterio <ph name="SITE_PER_PROCESS_ANDROID_POLICY_NAME" />.</translation>
-<translation id="2306505001667207184">Richiedi all'utente di selezionare il certificato client quando il criterio di selezione automatica corrisponde a più certificati.</translation>
+      Nota: per Android, utilizza invece la policy <ph name="SITE_PER_PROCESS_ANDROID_POLICY_NAME" />.</translation>
+<translation id="2306505001667207184">Richiedi all'utente di selezionare il certificato client quando la policy di selezione automatica corrisponde a più certificati.</translation>
 <translation id="230713790688681130">Attiva il layout Hindi Inscript</translation>
 <translation id="2307496301287881990">Segnala stati del display e della grafica</translation>
 <translation id="2309284543927494965">Blocca aggiornamenti</translation>
@@ -1885,94 +1885,94 @@
 Su <ph name="MS_WIN_NAME" />, questa policy è disponibile soltanto per le istanze che sono aggiunte a un dominio <ph name="MS_AD_NAME" />, aggiunte a <ph name="MS_AAD_NAME" /> o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.
 
 Su <ph name="MAC_OS_NAME" />, questa policy è disponibile soltanto per le istanze che sono gestite tramite MDM, aggiunte a un dominio tramite MCX o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.</translation>
-<translation id="2316700579410680894">La configurazione del criterio consente di elencare i pattern URL che specificano i siti a cui viene concessa automaticamente l'autorizzazione di accesso a un dispositivo USB con gli ID fornitore e prodotto indicati. Perché il criterio sia valido, ogni elemento nell'elenco richiede entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> può avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="VENDOR_ID_FIELD_NAME" /> non viene specificato, il criterio può corrispondere a qualsiasi dispositivo. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> non viene specificato, il criterio può corrispondere a qualsiasi dispositivo con l'ID fornitore specificato. Un criterio con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valido.
+<translation id="2316700579410680894">La configurazione della policy consente di elencare i pattern URL che specificano i siti a cui viene concessa automaticamente l'autorizzazione di accesso a un dispositivo USB con gli ID fornitore e prodotto indicati. Perché la policy sia valida, ogni elemento nell'elenco richiede entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> può avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="VENDOR_ID_FIELD_NAME" /> non viene specificato, la policy può corrispondere a qualsiasi dispositivo. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> non viene specificato, la policy può corrispondere a qualsiasi dispositivo con l'ID fornitore specificato. Una policy con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valida.
 
-      Il modello di autorizzazioni USB consentirà all'URL specificato di accedere al dispositivo USB come origine di primo livello. Se i frame incorporati devono accedere ai dispositivi USB, per concedere l'accesso è necessario usare l'intestazione "usb" del criterio <ph name="FEATURE_POLICY_HEADER_NAME" />. Se l'URL non è valido, il criterio viene ignorato.
+      Il modello di autorizzazioni USB consentirà all'URL specificato di accedere al dispositivo USB come origine di primo livello. Se i frame incorporati devono accedere ai dispositivi USB, per concedere l'accesso è necessario usare l'intestazione "usb" della policy <ph name="FEATURE_POLICY_HEADER_NAME" />. Se l'URL non è valido, la policy viene ignorata.
 
       Deprecato. Il modello di autorizzazioni USB supportava la specifica di entrambi gli URL richiedente e di incorporamento. Questo modello è deprecato e supportato soltanto per la compatibilità con le versioni precedenti nel seguente modo: se vengono specificati entrambi gli URL richiedente e di incorporamento, all'URL di incorporamento verrà concessa l'autorizzazione come origine di primo livello, mentre l'URL richiedente verrà ignorato completamente.
 
-      Questo criterio sostituisce i criteri <ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" />, <ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />, <ph name="WEB_USB_BLOCKED_FOR_URLS_POLICY_NAME" /> e le preferenze dell'utente.
+      Questa policy sostituisce le policy <ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" />, <ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />, <ph name="WEB_USB_BLOCKED_FOR_URLS_POLICY_NAME" /> e le preferenze dell'utente.
 
-      Questo criterio viene applicato soltanto per l'accesso ai dispositivi USB tramite l'API WebUSB. Per concedere l'accesso ai dispositivi USB tramite l'API Web Serial, vedi il criterio <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+      Questa policy viene applicata soltanto per l'accesso ai dispositivi USB tramite l'API WebUSB. Per concedere l'accesso ai dispositivi USB tramite l'API Web Serial, vedi la policy <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="2318583605563438459">Consenti ai genitori di aggiungere account supervisionati</translation>
 <translation id="2326031114717677574">La frequenza di campionamento e raccolta dei dati audio. Il valore minimo consentito è 1 minuto.
 
-      Se il criterio non viene configurato, viene applicata la frequenza predefinita di 15 minuti.</translation>
-<translation id="2333228572393176330">Questo criterio consente di controllare una funzionalità di sicurezza nel protocollo TLS 1.3, che protegge le connessioni da attacchi di downgrade. È compatibile con le versioni precedenti e non interessa le connessioni a server o proxy TLS 1.2 conformi. Tuttavia, un difetto di implementazione nelle versioni precedenti di alcuni proxy che intercettano connessioni TLS li rende incompatibili.
+      Se la policy non viene configurata, viene applicata la frequenza predefinita di 15 minuti.</translation>
+<translation id="2333228572393176330">Questa policy consente di controllare una funzionalità di sicurezza nel protocollo TLS 1.3, che protegge le connessioni da attacchi di downgrade. È compatibile con le versioni precedenti e non interessa le connessioni a server o proxy TLS 1.2 conformi. Tuttavia, un difetto di implementazione nelle versioni precedenti di alcuni proxy che intercettano connessioni TLS li rende incompatibili.
 
-      Se questo criterio viene impostato su Vero o se non viene configurato, <ph name="PRODUCT_NAME" /> attiva queste protezioni di sicurezza per tutte le connessioni.
+      Se questa policy viene impostata su True o se non viene configurata, <ph name="PRODUCT_NAME" /> attiva queste protezioni di sicurezza per tutte le connessioni.
 
-      Se questo criterio viene impostato su Falso, <ph name="PRODUCT_NAME" /> disattiva queste protezioni di sicurezza per le connessioni autenticate con certificati CA installati a livello locale. Queste protezioni sono sempre attive per le connessioni autenticate con certificati CA considerati pubblicamente attendibili.
+      Se questa policy viene impostata su False, <ph name="PRODUCT_NAME" /> disattiva queste protezioni di sicurezza per le connessioni autenticate con certificati CA installati a livello locale. Queste protezioni sono sempre attive per le connessioni autenticate con certificati CA considerati pubblicamente attendibili.
 
-      Il valore predefinito di questo criterio è stato modificato in <ph name="PRODUCT_NAME" /> 81 da Falso a Vero. Il codice di errore previsto per il problema di connessione dei proxy interessati è ERR_TLS13_DOWNGRADE_DETECTED. Gli amministratori a cui occorre più tempo per eseguire l'upgrade dei proxy interessati potrebbero usare questo criterio per disattivare temporaneamente questa funzionalità di sicurezza. Questo criterio è stato rimosso nella versione 86.
+      Il valore predefinito di questa policy è stato modificato in <ph name="PRODUCT_NAME" /> 81 da False a True. Il codice di errore previsto per il problema di connessione dei proxy interessati è ERR_TLS13_DOWNGRADE_DETECTED. Gli amministratori a cui occorre più tempo per eseguire l'upgrade dei proxy interessati potrebbero usare questa policy per disattivare temporaneamente questa funzionalità di sicurezza. Questa policy è stata rimossa nella versione 86.
       </translation>
 <translation id="2334744362022255283">Consente di impostare un elenco di pattern URL che specificano i siti autorizzati a visualizzare contenuti misti (ossia contenuti HTTP su siti HTTPS) bloccabili (ossia attivi) e per i quali gli aggiornamenti dei contenuti misti bloccabili facoltativi verranno disattivati.
 
-          Se questo criterio non viene impostato, i contenuti misti bloccabili verranno bloccati e quelli bloccabili facoltativi verranno aggiornati; inoltre, gli utenti potranno configurare eccezioni per consentire i contenuti misti per siti specifici.
+          Se questa policy non viene impostata, i contenuti misti bloccabili verranno bloccati e quelli bloccabili facoltativi verranno aggiornati; inoltre, gli utenti potranno configurare eccezioni per consentire i contenuti misti per siti specifici.
 
           Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="2336822410658374491">Disattiva l'accesso al menu contestuale del provider di ricerca predefinito</translation>
 <translation id="2337859888277013371">Non consentire uso della cache back-forward</translation>
-<translation id="2341509917222115272">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono accoppiare client e host in fase di connessione, senza dover inserire un codice PIN ogni volta.
+<translation id="2341509917222115272">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono accoppiare client e host in fase di connessione, senza dover inserire un codice PIN ogni volta.
 
-      Se il criterio viene impostato su Disattivato, questa funzionalità non è disponibile.</translation>
+      Se la policy viene impostata su Disattivata, questa funzionalità non è disponibile.</translation>
 <translation id="2342066287156668839">Attiva la quota permanente.</translation>
 <translation id="2345547870894930157">Attiva DNS over HTTPS senza fallback non sicuro</translation>
 <translation id="2347695338560092641">Driver di stampa out-of-process consentiti</translation>
-<translation id="234856189825555040">Questo criterio consente di stabilire se i plug-in <ph name="PEPPER_NAME" /> possono usare il nuovo decodificatore per comunicare con i decodificatori hardware anziché il decodificatore video precedente.
+<translation id="234856189825555040">Questa policy consente di stabilire se i plug-in <ph name="PEPPER_NAME" /> possono usare il nuovo decodificatore per comunicare con i decodificatori hardware anziché il decodificatore video precedente.
 
-La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questo criterio può essere utilizzato nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto.
+La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questa policy può essere utilizzata nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto.
 
-Se il criterio non viene configurato o se viene impostato su Enabled, il browser deciderà quale implementazione usare.
-Se il criterio viene impostato su Disabled, il browser utilizzerà la vecchia implementazione fino alla scadenza di questo criterio.
+Se la policy non viene configurata o se viene impostata su Enabled, il browser deciderà quale implementazione usare.
+Se la policy viene impostata su Disabled, il browser utilizzerà la vecchia implementazione fino alla scadenza di questa policy.
 
-Se devi usare il criterio, invia una segnalazione di bug su crbug.com spiegando il tuo caso d'uso e aggiungendo in copia per conoscenza {andrescj, blundell, pmolinalopez, vasilyt}@chromium.org. Il criterio sarà valido fino alla versione 114 di <ph name="PRODUCT_NAME" />, dopodiché la vecchia implementazione verrà rimossa.
+Se devi usare la policy, invia una segnalazione di bug su crbug.com spiegando il tuo caso d'uso e aggiungendo in copia per conoscenza {andrescj, blundell, pmolinalopez, vasilyt}@chromium.org. La policy sarà valida fino alla versione 114 di <ph name="PRODUCT_NAME" />, dopodiché la vecchia implementazione verrà rimossa.
 
-NOTA: le modifiche apportate a questo criterio verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
+NOTA: le modifiche apportate a questa policy verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
 <translation id="2354439478396602136">Mostra consigli delle app in Avvio app di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2355876547176311490">Disattiva l'utilizzo dei relay server per l'host di accesso remoto</translation>
-<translation id="2358176879566587521">Il criterio è rimosso. Non è compatibile con questa versione di <ph name="PRODUCT_NAME" />. Leggi ulteriori informazioni all'indirizzo https://support.google.com/chrome/a/answer/7643500</translation>
+<translation id="2358176879566587521">La policy è rimossa. Non è compatibile con questa versione di <ph name="PRODUCT_NAME" />. Leggi ulteriori informazioni all'indirizzo https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="235987002603620567">NewBaseUrlInheritanceBehavior è una funzionalità <ph name="PRODUCT_NAME" /> che fa sì che i frame <ph name="ABOUT_BLANK_PAGE" /> e <ph name="ABOUT_SRCDOC_PAGE" /> ereditino coerentemente i valori dell'URL di base tramite snapshot dell'URL di base dell'iniziatore. Per informazioni dettagliate, visita la pagina https://chromestatus.com/feature/5161101671530496.
 
-Se il criterio viene impostato su disabled, gli utenti o le varianti <ph name="PRODUCT_NAME" /> non potranno attivare NewBaseUrlInheritanceBehavior in caso di problemi di compatibilità. Se il criterio viene impostato su enabled o se non viene configurato, consente l'attivazione di NewBaseUrlInheritanceBehavior.</translation>
+Se la policy viene impostata su disabled, gli utenti o le varianti <ph name="PRODUCT_NAME" /> non potranno attivare NewBaseUrlInheritanceBehavior in caso di problemi di compatibilità. Se la policy viene impostata su enabled o se non viene configurata, consente l'attivazione di NewBaseUrlInheritanceBehavior.</translation>
 <translation id="2361182501645567439">Controlla la disponibilità della modalità sviluppatore nella pagina delle estensioni</translation>
 <translation id="2362469626417133796">Intervallo di tempo per il riavvio</translation>
 <translation id="2362539163677485510">Il token di registrazione della norma relativa al cloud</translation>
-<translation id="2363928351203698966">Se per il criterio viene impostato un valore valido, <ph name="PRODUCT_NAME" /> non utilizzerà versioni SSL/TLS precedenti alla versione specificata. I valori non riconosciuti vengono ignorati.
+<translation id="2363928351203698966">Se per la policy viene impostato un valore valido, <ph name="PRODUCT_NAME" /> non utilizzerà versioni SSL/TLS precedenti alla versione specificata. I valori non riconosciuti vengono ignorati.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_NAME" /> mostra un errore per TLS 1.0 e TLS 1.1, ma l'utente può ignorarlo.
+      Se la policy non viene impostata, <ph name="PRODUCT_NAME" /> mostra un errore per TLS 1.0 e TLS 1.1, ma l'utente può ignorarlo.
 
-      Se il criterio viene impostato su "tls1.2", l'utente non potrà ignorare l'errore.
+      Se la policy viene impostata su "tls1.2", l'utente non potrà ignorare l'errore.
 
-      Il supporto dell'impostazione dei valori "tls1" o "tls1.1" per questo criterio è stato rimosso nella versione 91. L'eliminazione dell'avviso relativo a TLS 1.0/1.1 non è più supportata.</translation>
+      Il supporto dell'impostazione dei valori "tls1" o "tls1.1" per questa policy è stato rimosso nella versione 91. L'eliminazione dell'avviso relativo a TLS 1.0/1.1 non è più supportata.</translation>
 <translation id="2364639863953745682">Modalità dell'esperienza di onboarding dell'assistente</translation>
 <translation id="2366301887862414321">Consenti gli host di messaggi nativi a livello di sistema e a livello di utente</translation>
 <translation id="2373014700224092497">Consenti agli utenti di aggiungere account Kerberos</translation>
 <translation id="2376134474855349829">Disattiva la tastiera sullo schermo nella schermata di accesso e consenti all'utente di attivarla temporaneamente</translation>
-<translation id="2376151922689284770">Nome da mostrare nell'interfaccia utente del programma di installazione, ad esempio Happy VM. Se lo schema non viene configurato, verrà mostrato un nome di riserva, recuperato dalla prima voce (in ordine di visualizzazione) nel criterio BruschettaVMConfiguration, oppure un nome generico se non esiste un nome di riserva.</translation>
-<translation id="2376278121995306084">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che possono mostrare notifiche.
+<translation id="2376151922689284770">Nome da mostrare nell'interfaccia utente del programma di installazione, ad esempio Happy VM. Se lo schema non viene configurato, verrà mostrato un nome di riserva, recuperato dalla prima voce (in ordine di visualizzazione) nella policy BruschettaVMConfiguration, oppure un nome generico se non esiste un nome di riserva.</translation>
+<translation id="2376278121995306084">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che possono mostrare notifiche.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="2377109572344699022">Controlla l'utilizzo dell'API Direct Sockets</translation>
 <translation id="2382672620906337383">Il valore JavaScript setTimeout() non verrà bloccato finché non viene raggiunta una soglia di nidificazione superiore.</translation>
-<translation id="2384233438419344179">Se il criterio è impostato su Attivato, gli elementi della pagina web che non provengono dal dominio presente nella barra degli indirizzi del browser non possono impostare i cookie. Se il criterio è impostato su Disattivato, tali elementi possono impostare i cookie e gli utenti non possono modificare l'impostazione.
+<translation id="2384233438419344179">Se la policy è impostata su Attivata, gli elementi della pagina web che non provengono dal dominio presente nella barra degli indirizzi del browser non possono impostare i cookie. Se la policy è impostata su Disattivata, tali elementi possono impostare i cookie e gli utenti non possono modificare l'impostazione.
 
-      Se il criterio non viene impostato, i cookie di terze parti vengono attivati, ma gli utenti possono modificare l'impostazione.</translation>
+      Se la policy non viene impostata, i cookie di terze parti vengono attivati, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="2386362615870139244">Consenti Wakelock dello schermo</translation>
-<translation id="2387469539700985783">Questo criterio non influisce sui report generati da Android.</translation>
-<translation id="2388701318721126001">Se questo criterio viene disattivato, non è possibile selezionare l'immagine di sfondo dell'utente <ph name="PRODUCT_OS_NAME" /> da un album di Google Foto.
+<translation id="2387469539700985783">Questa policy non influisce sui report generati da Android.</translation>
+<translation id="2388701318721126001">Se questa policy viene disattivata, non è possibile selezionare l'immagine di sfondo dell'utente <ph name="PRODUCT_OS_NAME" /> da un album di Google Foto.
 
-L'utente può scegliere un'immagine di Google Foto come sfondo se questo criterio viene attivato o se non viene configurato.</translation>
+L'utente può scegliere un'immagine di Google Foto come sfondo se questa policy viene attivata o se non viene configurata.</translation>
 <translation id="2393862222659066027">Apri un elenco di URL e ripristina l'ultima sessione</translation>
 <translation id="239416486107542256">Le impostazioni di F11 usano la scorciatoia che contiene i tasti di modifica Ctrl e Maiusc</translation>
 <translation id="2394429297128584919">Non consentire alle pagine di inviare richieste XHR sincrone durante la chiusura delle pagine</translation>
-<translation id="2399987589969059485">La configurazione di questo criterio consente di specificare quali varianti è possibile applicare in <ph name="PRODUCT_NAME" />.
+<translation id="2399987589969059485">La configurazione di questa policy consente di specificare quali varianti è possibile applicare in <ph name="PRODUCT_NAME" />.
 
       Le varianti forniscono un mezzo per apportare modifiche a <ph name="PRODUCT_NAME" /> senza inviare una nuova versione del browser, attivando o disattivando in modo selettivo le funzionalità già esistenti. Per ulteriori informazioni, vai all'indirizzo https://support.google.com/chrome/a?p=Manage_the_Chrome_variations_framework.
 
-      Se viene impostato <ph name="VARIATIONS_ENABLED_OPTION_NAME" /> (valore 0) o se il criterio non viene configurato, è possibile applicare al browser tutte le varianti.
+      Se viene impostato <ph name="VARIATIONS_ENABLED_OPTION_NAME" /> (valore 0) o se la policy non viene configurata, è possibile applicare al browser tutte le varianti.
 
       Se viene impostato <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (valore 1), è possibile applicare a <ph name="PRODUCT_NAME" /> soltanto le varianti considerate correzioni fondamentali per la sicurezza o la stabilità.
 
@@ -1980,44 +1980,44 @@
 <translation id="2402537890732357732">Mostra sempre l'etichetta di gestione</translation>
 <translation id="2402547085566757554">Non usare la pagina Nuova scheda come home page</translation>
 <translation id="2405765347317553213">Impostazioni Confronta schede</translation>
-<translation id="240713331529749993">Se il criterio viene configurato, ciascuna delle origini denominate in un elenco separato da virgole viene eseguita in un processo dedicato su Android. Il processo di ogni origine denominata potrà contenere solo documenti provenienti da tale origine e i relativi sottodomini. Ad esempio, specificare https://a1.example.com/ consente https://a2.a1.example.com/ nello stesso processo, ma non https://example.com o https://b.example.com. Tieni presente che Android isola alcuni siti sensibili per impostazione predefinita a partire da <ph name="PRODUCT_NAME" /> 77 e il criterio estende questa modalità per isolare origini aggiuntive specifiche.
+<translation id="240713331529749993">Se la policy viene configurata, ciascuna delle origini denominate in un elenco separato da virgole viene eseguita in un processo dedicato su Android. Il processo di ogni origine denominata potrà contenere solo documenti provenienti da tale origine e i relativi sottodomini. Ad esempio, specificare https://a1.example.com/ consente https://a2.a1.example.com/ nello stesso processo, ma non https://example.com o https://b.example.com. Tieni presente che Android isola alcuni siti sensibili per impostazione predefinita a partire da <ph name="PRODUCT_NAME" /> 77 e la policy estende questa modalità per isolare origini aggiuntive specifiche.
 
       A partire da <ph name="PRODUCT_NAME" /> 77, puoi specificare anche un intervallo di origini da isolare utilizzando un carattere jolly. Ad esempio, specificare https://[*.]corp.example.com consentirà a ogni origine al di sotto di https://corp.example.com il proprio processo dedicato, inclusi https://corp.example.com stesso, https://a1.corp.example.com e https://a2.a1.corp.example.com.
 
-      Tieni presente che le origini isolate da questo criterio non potranno scrivere altre origini nello stesso sito, processo possibile se due documenti dello stesso sito modificano i propri valori document.docmani affinché corrispondano. Gli amministratori devono confermare che questo comportamento non comune non venga utilizzato su un'origine prima di isolarla.
+      Tieni presente che le origini isolate da questa policy non potranno scrivere altre origini nello stesso sito, processo possibile se due documenti dello stesso sito modificano i propri valori document.docmani affinché corrispondano. Gli amministratori devono confermare che questo comportamento non comune non venga utilizzato su un'origine prima di isolarla.
 
-      Se il criterio viene impostato su Disattivato, vengono disattivati tutti i tipi di isolamento dei siti, inclusi quelli di siti sensibili, prove sul campo di IsolateOriginsAndroid, SitePerProcessAndroid e altre modalità di isolamento dei siti. Gli utenti possono comunque attivare IsolateOrigins manualmente usando il flag della riga di comando.
+      Se la policy viene impostata su Disattivata, vengono disattivati tutti i tipi di isolamento dei siti, inclusi quelli di siti sensibili, prove sul campo di IsolateOriginsAndroid, SitePerProcessAndroid e altre modalità di isolamento dei siti. Gli utenti possono comunque attivare IsolateOrigins manualmente usando il flag della riga di comando.
 
-      Se il criterio non viene configurato, gli utenti possono modificare questa impostazione.
+      Se la policy non viene configurata, gli utenti possono modificare questa impostazione.
 
-      Nota: se vengono isolati troppi siti su Android, potrebbero verificarsi problemi di prestazioni, in particolare sui dispositivi con poca memoria. Questo criterio viene applicato solo a Chrome su dispositivi Android con più di 1 GB di RAM. Per applicare il criterio a piattaforme non Androd, utilizza <ph name="ISOLATE_ORIGINS_POLICY_NAME" />.</translation>
+      Nota: se vengono isolati troppi siti su Android, potrebbero verificarsi problemi di prestazioni, in particolare sui dispositivi con poca memoria. Questa policy viene applicata solo a Chrome su dispositivi Android con più di 1 GB di RAM. Per applicare la policy a piattaforme non Androd, utilizza <ph name="ISOLATE_ORIGINS_POLICY_NAME" />.</translation>
 <translation id="2407758458436268630">Consenti al modello di oscuramento smart di estendere il tempo di oscuramento dello schermo</translation>
 <translation id="2410163749464044777">Impostazioni spazio di archiviazione dei dati utente locale</translation>
-<translation id="2411629345938804022">Se il criterio è impostato su 3, i siti web possono chiedere l'accesso ai dispositivi Bluetooth nelle vicinanze. Se il criterio è impostato su 2, l'accesso ai dispositivi Bluetooth nelle vicinanze viene negato.
+<translation id="2411629345938804022">Se la policy è impostata su 3, i siti web possono chiedere l'accesso ai dispositivi Bluetooth nelle vicinanze. Se la policy è impostata su 2, l'accesso ai dispositivi Bluetooth nelle vicinanze viene negato.
 
-      Se il criterio non viene configurato, i siti possono chiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
+      Se la policy non viene configurata, i siti possono chiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="2411817661175306360">L'avviso di protezione tramite password non è attivo</translation>
 <translation id="2411919772666155530">Blocca le notifiche su questi siti</translation>
 <translation id="2413022450179356125">Consente di attivare o disattivare la funzionalità Schermata sulla privacy.
 
-Se questo criterio viene impostato su True, la Schermata sulla privacy sarà sempre attiva.
+Se questa policy viene impostata su True, la Schermata sulla privacy sarà sempre attiva.
 
-Se questo criterio viene impostato su False, la Schermata sulla privacy sarà sempre disattivata.
+Se questa policy viene impostata su False, la Schermata sulla privacy sarà sempre disattivata.
 
-Se questo criterio viene impostato, l'utente non potrà sostituire il valore.
+Se questa policy viene impostata, l'utente non potrà sostituire il valore.
 
-Se questo criterio non viene impostato, la Schermata sulla privacy verrà inizialmente disattivata, ma potrà essere controllata dall'utente.</translation>
+Se questa policy non viene impostata, la Schermata sulla privacy verrà inizialmente disattivata, ma potrà essere controllata dall'utente.</translation>
 <translation id="2413899611035194909">Mostra opzioni di accessibilità nel menu della barra delle applicazioni della schermata di accesso</translation>
 <translation id="2415715982424988916">Esplora (supportata dalla versione 91)</translation>
-<translation id="2420958105721932612">Consente di specificare la modalità di installazione di un'app. AVAILABLE: l'app non viene installata automaticamente, ma può essere installata dall'utente. Si tratta del comportamento predefinito se questo criterio non viene specificato. FORCE_INSTALLED: l'app viene installata automaticamente e l'utente non può disinstallarla. BLOCKED: l'app è bloccata e non può essere installata. Se l'app è stata installata in base a un criterio precedente, verrà disinstallata.</translation>
+<translation id="2420958105721932612">Consente di specificare la modalità di installazione di un'app. AVAILABLE: l'app non viene installata automaticamente, ma può essere installata dall'utente. Si tratta del comportamento predefinito se questa policy non viene specificata. FORCE_INSTALLED: l'app viene installata automaticamente e l'utente non può disinstallarla. BLOCKED: l'app è bloccata e non può essere installata. Se l'app è stata installata in base a una policy precedente, verrà disinstallata.</translation>
 <translation id="2421400544595297401">Non consentire a utenti non affiliati di utilizzare app per Android</translation>
-<translation id="2421677964966613267">Questo criterio è deprecato in M88 e Flash non è più supportato da Chrome. Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />.
+<translation id="2421677964966613267">Questa policy è deprecata in M88 e Flash non è più supportato da Chrome. Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che non possono eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />.
 
-      Se non viene configurato, viene applicato il criterio <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se non viene configurata, viene applicata la policy <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tuttavia, a partire dalla versione M85, i pattern con caratteri jolly "*" e "[*.]" nell'host non sono più supportati per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tuttavia, a partire dalla versione M85, i pattern con caratteri jolly "*" e "[*.]" nell'host non sono più supportati per questa policy.</translation>
 <translation id="2421779938235645781">Il colore della retroilluminazione della tastiera corrisponde allo sfondo corrente</translation>
-<translation id="2423255396068675416">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono eseguire <ph name="PRODUCT_CROSTINI_NAME" />, finché <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> e <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> sono impostati su Attivato. Se il criterio viene impostato su Disattivato, <ph name="PRODUCT_CROSTINI_NAME" /> viene disattivato per l'utente. Impostando il criterio su Disattivato, questo viene applicato all'avvio di nuovi container <ph name="PRODUCT_CROSTINI_NAME" />, non a quelli già in esecuzione.</translation>
+<translation id="2423255396068675416">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono eseguire <ph name="PRODUCT_CROSTINI_NAME" />, finché <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> e <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> sono impostate su Attivata. Se la policy viene impostata su Disattivata, <ph name="PRODUCT_CROSTINI_NAME" /> viene disattivata per l'utente. Impostando la policy su Disattivata, questa viene applicata all'avvio di nuovi container <ph name="PRODUCT_CROSTINI_NAME" />, non a quelli già in esecuzione.</translation>
 <translation id="2423654977291507457">Disattiva integrazioni</translation>
 <translation id="242521047682347997">Non consentire agli utenti di sincronizzare i messaggi SMS tra il telefono e Chromebook</translation>
 <translation id="2426782419955104525">Consente di attivare la funzione Instant di <ph name="PRODUCT_NAME" /> e di impedire agli utenti di modificare l'impostazione.
@@ -2031,11 +2031,11 @@
       Se l'impostazione non viene impostata, l'utente può decidere se utilizzare o meno la funzione.
 
       L'impostazione è stata rimossa da <ph name="PRODUCT_NAME" /> 29 e versioni successive.</translation>
-<translation id="2428819424648741429">Se il criterio viene impostato su Attivato, viene usato un servizio web di Google per correggere gli errori ortografici. Questo criterio consente di stabilire soltanto l'uso del servizio online. Se il criterio viene impostato su Disattivato, questo servizio non viene mai usato.
+<translation id="2428819424648741429">Se la policy viene impostata su Attivata, viene usato un servizio web di Google per correggere gli errori ortografici. Questa policy consente di stabilire soltanto l'uso del servizio online. Se la policy viene impostata su Disattivata, questo servizio non viene mai usato.
 
-      Se il criterio non viene configurato, gli utenti possono scegliere se usare o meno il servizio di controllo ortografico.
+      Se la policy non viene configurata, gli utenti possono scegliere se usare o meno il servizio di controllo ortografico.
 
-      Per il controllo ortografico può essere sempre usato un dizionario scaricato in locale, a meno che la funzionalità non sia disattivata nel criterio <ph name="SPELLCHECK_ENABLED_POLICY_NAME" />; in tal caso questo criterio non avrà effetto.</translation>
+      Per il controllo ortografico può essere sempre usato un dizionario scaricato in locale, a meno che la funzionalità non sia disattivata nella policy <ph name="SPELLCHECK_ENABLED_POLICY_NAME" />; in tal caso questa policy non avrà effetto.</translation>
 <translation id="2433516903565257847">La percentuale del parco di dispositivi che dovrebbe essere aggiornata dopo i giorni indicati.</translation>
 <translation id="2433683038230070030">Il buffering adattivo di Web Audio potrebbe essere attivato a seconda del processo di lancio della funzionalità.</translation>
 <translation id="2435052056904485763">Lista consentita server di delega Kerberos</translation>
@@ -2046,7 +2046,7 @@
 <translation id="2452225615952836461">Metodi di richiesta sempre in maiuscolo</translation>
 <translation id="2454228136871844693">Ottimizza per aumentare la stabilità.</translation>
 <translation id="2455033019778127130">Usa il comportamento predefinito del browser, mostra i TdS e attende l'accettazione dell'utente</translation>
-<translation id="2460127623195247744">Questo criterio è deprecato. Utilizza il criterio "<ph name="WINDOW_OCCLUSION_ENABLED_POLICY_NAME" />".
+<translation id="2460127623195247744">Questa policy è deprecata. Utilizza la policy "<ph name="WINDOW_OCCLUSION_ENABLED_POLICY_NAME" />".
 
       Consente di attivare Copertura finestra nativa in <ph name="PRODUCT_NAME" />.
 
@@ -2054,82 +2054,82 @@
 
       Se questa impostazione viene disattivata, <ph name="PRODUCT_NAME" /> non rileverà quando una finestra è coperta da altre finestre.
 
-      Se questo criterio non viene impostato, il rilevamento della copertura della finestra verrà attivato.</translation>
+      Se questa policy non viene impostata, il rilevamento della copertura della finestra verrà attivato.</translation>
 <translation id="2461842213361247">ServiceWorker può controllare gli iframe srcdoc</translation>
 <translation id="2462606868915618110">A partire dalla versione M108, tutti i metodi <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> verranno richiamati in modo sincrono.
-      Fino alla versione M110, questo criterio riattiva la chiamata asincrona dei metodi <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" />.
-      Se il criterio viene impostato su Attivato, i metodi <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> vengono richiamati in modo asincrono.
-      Se il criterio viene impostato su Disattivato o se non viene configurato, tutti i metodi di <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> vengono richiamati in modo sincrono.</translation>
+      Fino alla versione M110, questa policy riattiva la chiamata asincrona dei metodi <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" />.
+      Se la policy viene impostata su Attivata, i metodi <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> vengono richiamati in modo asincrono.
+      Se la policy viene impostata su Disattivata o se non viene configurata, tutti i metodi di <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> vengono richiamati in modo sincrono.</translation>
 <translation id="2463034609187171371">Attiva i pacchetti di crittografia DHE in TLS</translation>
 <translation id="2463365186486772703">Lingua dell'applicazione</translation>
-<translation id="2463832514638083341">Questo criterio controlla per quanto tempo i metadati dei processi di stampa vengono memorizzati sul dispositivo, con valore espresso in giorni.
+<translation id="2463832514638083341">Questa policy controlla per quanto tempo i metadati dei processi di stampa vengono memorizzati sul dispositivo, con valore espresso in giorni.
 
-      Quando questo criterio viene impostato sul valore -1, i metadati dei processi di stampa vengono memorizzati per un periodo di tempo indefinito. Quando questo criterio viene impostato sul valore 0, i metadati dei processi di stampa non vengono memorizzati. Quando questo criterio viene impostato su un qualsiasi altro valore, specifica il periodo di tempo durante il quale i metadati dei processi di stampa completati vengono memorizzati sul dispositivo.
+      Quando questa policy viene impostata sul valore -1, i metadati dei processi di stampa vengono memorizzati per un periodo di tempo indefinito. Quando questa policy viene impostata sul valore 0, i metadati dei processi di stampa non vengono memorizzati. Quando questa policy viene impostata su un qualsiasi altro valore, specifica il periodo di tempo durante il quale i metadati dei processi di stampa completati vengono memorizzati sul dispositivo.
 
-      Se non impostato, viene utilizzato il periodo predefinito di 90 giorni per i dispositivi <ph name="PRODUCT_OS_NAME" />.
+      Se non impostata, viene utilizzato il periodo predefinito di 90 giorni per i dispositivi <ph name="PRODUCT_OS_NAME" />.
 
-      Il valore del criterio deve essere specificato in giorni.</translation>
+      Il valore della policy deve essere specificato in giorni.</translation>
 <translation id="2466131534462628618">L'autenticazione tramite captive portal ignora il proxy</translation>
 <translation id="2467181864598429837">Comportamento predefinito del browser</translation>
 <translation id="2467896267442150508">L'intervallo di tempo (massimo una settimana). Se l'ora di inizio è successiva all'ora di fine, l'intervallo verrà chiuso il giorno successivo.</translation>
 <translation id="2476249479201711962">Attiva l'accesso al menu contestuale del provider di ricerca predefinito</translation>
 <translation id="2478756867046106663">Consenti ai siti con esperienze intrusive di aprirsi in nuove finestre o schede</translation>
-<translation id="2479760962196319822">Questo criterio consente di stabilire se gli utenti di <ph name="PRODUCT_OS_NAME" /> possono archiviare i dati localmente o meno.
-      Se questo criterio viene impostato su False, l'archiviazione locale su <ph name="PRODUCT_OS_NAME" /> viene bloccata: gli utenti non possono archiviare i dati localmente e non possono accedere alle directory locali.
-      Se questo criterio viene impostato su True o se non viene configurato, l'archiviazione locale su <ph name="PRODUCT_OS_NAME" /> non subisce limitazioni: non esistono limitazioni relative alla posizione in cui gli utenti possono archiviare i dati o alle directory a cui possono accedere.</translation>
+<translation id="2479760962196319822">Questa policy consente di stabilire se gli utenti di <ph name="PRODUCT_OS_NAME" /> possono archiviare i dati localmente o meno.
+      Se questa policy viene impostata su False, l'archiviazione locale su <ph name="PRODUCT_OS_NAME" /> viene bloccata: gli utenti non possono archiviare i dati localmente e non possono accedere alle directory locali.
+      Se questa policy viene impostata su True o se non viene configurata, l'archiviazione locale su <ph name="PRODUCT_OS_NAME" /> non subisce limitazioni: non esistono limitazioni relative alla posizione in cui gli utenti possono archiviare i dati o alle directory a cui possono accedere.</translation>
 <translation id="2480971699591919564">Consente di attivare la funzionalità Click-to-call che permette agli utenti di inviare numeri di telefono dai computer desktop Chrome ai dispositivi Android se eseguono l'accesso. Per ulteriori informazioni, leggi l'articolo del Centro assistenza all'indirizzo https://support.google.com/chrome/answer/9430554?hl=it.
 
-      Se questo criterio viene attivato, la funzionalità di invio di numeri di telefono ai dispositivi Android verrà attivata per gli utenti di Chrome.
+      Se questa policy viene attivata, la funzionalità di invio di numeri di telefono ai dispositivi Android verrà attivata per gli utenti di Chrome.
 
-      Se questo criterio viene disattivato, la funzionalità di invio di numeri di telefono ai dispositivi Android verrà disattivata per gli utenti di Chrome.
+      Se questa policy viene disattivata, la funzionalità di invio di numeri di telefono ai dispositivi Android verrà disattivata per gli utenti di Chrome.
 
-      Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+      Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-      Se questo criterio non viene impostato, la funzionalità Click-to-call sarà attiva per impostazione predefinita.</translation>
+      Se questa policy non viene impostata, la funzionalità Click-to-call sarà attiva per impostazione predefinita.</translation>
 <translation id="2482676533225429905">Messaggi nativi</translation>
 <translation id="2483146640187052324">Prevedi le azioni di rete su qualsiasi connessione di rete</translation>
 <translation id="2487495476672607707">La funzionalità di sincronizzazione file di <ph name="PRODUCT_OS_NAME" /> rende automaticamente disponibili offline i file di <ph name="GOOGLE_DRIVE_NAME" /> presenti nella sezione "Il mio Drive" di un utente (se lo spazio lo consente) sui dispositivi <ph name="CHROMEBOOK_PLUS_NAME" />.
 
 Una volta attivata la funzionalità, tutti i nuovi file verranno automaticamente resi disponibili offline. Se in un secondo momento lo spazio non sarà sufficiente, tutti i nuovi file non verranno più resi disponibili offline automaticamente. Tuttavia, l'utente può comunque rendere disponibili offline gli elementi manualmente.
 
-Se il criterio viene impostato su <ph name="POLICY_VALUE_VISIBLE" />, la funzionalità di sincronizzazione file viene mostrata nell'app File e nelle Impostazioni. L'utente può attivare o disattivare la sincronizzazione file.
+Se la policy viene impostata su <ph name="POLICY_VALUE_VISIBLE" />, la funzionalità di sincronizzazione file viene mostrata nell'app File e nelle Impostazioni. L'utente può attivare o disattivare la sincronizzazione file.
 
-Se il criterio viene impostato su <ph name="POLICY_VALUE_DISABLEDE" />, la funzionalità di sincronizzazione file viene disattivata se era stata precedentemente attivata dall'utente. Consente di nascondere la funzionalità nell'app File e nelle Impostazioni in modo che l'utente non possa riattivarla. I file esistenti che sono stati resi disponibili offline dall'utente rimarranno disponibili offline. L'utente può comunque rendere disponibili offline gli elementi manualmente.
+Se la policy viene impostata su <ph name="POLICY_VALUE_DISABLEDE" />, la funzionalità di sincronizzazione file viene disattivata se era stata precedentemente attivata dall'utente. Consente di nascondere la funzionalità nell'app File e nelle Impostazioni in modo che l'utente non possa riattivarla. I file esistenti che sono stati resi disponibili offline dall'utente rimarranno disponibili offline. L'utente può comunque rendere disponibili offline gli elementi manualmente.
 
-Se il criterio non viene configurato, <ph name="POLICY_VALUE_VISIBLE" /> è la selezione predefinita.</translation>
+Se la policy non viene configurata, <ph name="POLICY_VALUE_VISIBLE" /> è la selezione predefinita.</translation>
 <translation id="2489558694350871332">Consenti al dispositivo di eseguire macchine virtuali</translation>
 <translation id="2492240920793040106">Attiva la segnalazione di informazioni di sistema e contenuti della pagina per migliorare Navigazione sicura</translation>
 <translation id="2496180316473517155">Cronologia di navigazione</translation>
 <translation id="2497751676088107779">Script utente</translation>
-<translation id="249798396824949930"> Consente di stabilire se il browser può rilevare l'ambito dei criteri obbligatori su <ph name="MAC_OS_NAME" /> o meno.
+<translation id="249798396824949930"> Consente di stabilire se il browser può rilevare l'ambito delle policy obbligatorie su <ph name="MAC_OS_NAME" /> o meno.
 
-      Se il criterio viene impostato su Enabled o se non viene configurato, l'ambito di ogni criterio viene determinato dall'ambito del profilo gestito di <ph name="MAC_OS_NAME" />.
-      Se viene impostato su Disabled, tutti i criteri vengono riconosciuti come criterio dell' ambito macchina.
+      Se la policy viene impostata su Enabled o se non viene configurata, l'ambito di ogni policy viene determinato dall'ambito del profilo gestito di <ph name="MAC_OS_NAME" />.
+      Se viene impostata su Disabled, tutte le policy vengono riconosciute come policy dell'ambito macchina.
 
-      Questo criterio è temporaneo per semplificare la transizione ai criteri con ambito corretto su <ph name="MAC_OS_NAME" /> e verrà rimosso in <ph name="PRODUCT_NAME" /> 107.
+      Questa policy è temporanea per semplificare la transizione alle policy con ambito corretto su <ph name="MAC_OS_NAME" /> e verrà rimossa in <ph name="PRODUCT_NAME" /> 107.
 
       </translation>
 <translation id="2498238926436517902">Nascondi sempre automaticamente la barra delle app</translation>
-<translation id="250022556568924228">Se il criterio viene configurato, <ph name="PRODUCT_OS_NAME" /> scarica i Termini di servizio e li presenta agli utenti a ogni avvio di sessione con un account locale del dispositivo. Gli utenti possono accedere alla sessione dopo aver accettato i Termini di servizio.
+<translation id="250022556568924228">Se la policy viene configurata, <ph name="PRODUCT_OS_NAME" /> scarica i Termini di servizio e li presenta agli utenti a ogni avvio di sessione con un account locale del dispositivo. Gli utenti possono accedere alla sessione dopo aver accettato i Termini di servizio.
 
-      Se il criterio non viene configurato, i Termini di servizio non vengono visualizzati.
+      Se la policy non viene configurata, i Termini di servizio non vengono visualizzati.
 
-      Il criterio deve essere impostato su un URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare i Termini di servizio. I Termini di servizio devono essere composti da testo normale e pubblicati come testo di tipo MIME/semplice. Non sono consentiti markup.</translation>
-<translation id="250151283451228612">Se il criterio <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_POLICY_NAME" /> viene impostato su Attivato, la configurazione di <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> consente di impostare un valore percentuale per il limite di consumo della batteria per la variazione dei picchi energetici.
+      La policy deve essere impostata su un URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare i Termini di servizio. I Termini di servizio devono essere composti da testo normale e pubblicati come testo di tipo MIME/semplice. Non sono consentiti markup.</translation>
+<translation id="250151283451228612">Se la policy <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_POLICY_NAME" /> viene impostata su Attivata, la configurazione di <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> consente di impostare un valore percentuale per il limite di consumo della batteria per la variazione dei picchi energetici.
 
-       Se non viene configurato, la variazione dei picchi energetici rimane disattivata.</translation>
+       Se non viene configurata, la variazione dei picchi energetici rimane disattivata.</translation>
 <translation id="2502467045153796624">Comportamento del downgrade del canale</translation>
 <translation id="250670737672448119">Consente di attivare la funzione di accessibilità di evidenziazione del cursore di testo.
 
           Questa funzione consente di evidenziare l'area che circonda il cursore di testo durante la modifica.
 
-          Se questo criterio viene attivato, l'evidenziazione del cursore di testo sarà sempre attiva.
+          Se questa policy viene attivata, l'evidenziazione del cursore di testo sarà sempre attiva.
 
-          Se questo criterio viene disattivato, l'evidenziazione del cursore di testo sarà sempre disattivata.
+          Se questa policy viene disattivata, l'evidenziazione del cursore di testo sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'evidenziazione del cursore di testo è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'evidenziazione del cursore di testo è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="2506865562891982662">Consenti agli utenti di selezionare i dispositivi di trasmissione con un codice di accesso o un codice QR dal menu di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="2509748672176727116">L'utente potrà eseguire acquisizioni di pacchetti di rete</translation>
 <translation id="2509919237512982967">Usa i controlli modulo legacy fino alla versione M84.</translation>
@@ -2145,53 +2145,53 @@
 <translation id="252742292004421898">Consenti l'API Direct Sockets su questi siti</translation>
 <translation id="2529880111512635313">Configura l'elenco di estensioni e app con installazione imposta</translation>
 <translation id="253135976343875019">Ritardo avviso inattività in caso di utilizzo di CA</translation>
-<translation id="2535370400681639351">Se il criterio viene impostato su Attivato, le richieste di autenticazione Gnubby verranno trasferite al proxy tramite una connessione host remota.
+<translation id="2535370400681639351">Se la policy viene impostata su Attivata, le richieste di autenticazione Gnubby verranno trasferite al proxy tramite una connessione host remota.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, le richieste di autenticazione Gnubby non verranno trasferite al proxy.
+      Se la policy viene impostata su Disattivata o se non viene configurata, le richieste di autenticazione Gnubby non verranno trasferite al proxy.
 
       Tieni presente che per il corretto comportamento di questa funzionalità sono necessari componenti aggiuntivi non disponibili al di fuori dell'ambiente della rete Google.</translation>
 <translation id="2536525645274582300">L'utente decide se abilitare i servizi di geolocalizzazione di Google</translation>
 <translation id="2536717624356629471">Attiva i suoni in modalità Niente distrazioni per ChromeOS</translation>
 <translation id="254653220329944566">Consente di attivare il reporting su cloud di <ph name="PRODUCT_NAME" /></translation>
-<translation id="2547854230073316008">La configurazione del criterio consente di impostare la risoluzione e il fattore di scalabilità per ogni display. Le impostazioni del display esterno si applicano ai display collegati. Il criterio non viene applicato se un display non supporta la risoluzione o la scalabilità specificate.
+<translation id="2547854230073316008">La configurazione della policy consente di impostare la risoluzione e il fattore di scalabilità per ogni display. Le impostazioni del display esterno si applicano ai display collegati. la policy non viene applicata se un display non supporta la risoluzione o la scalabilità specificate.
 
-      Se <ph name="EXTERNAL_USE_NATIVE" /> viene impostato su True, il criterio ignora <ph name="EXTERNAL_WIDTH" /> e <ph name="EXTERNAL_HEIGHT" /> e imposta i display esterni sulla loro risoluzione nativa. Se <ph name="EXTERNAL_USE_NATIVE" /> viene impostato su False o se non viene configurato insieme a <ph name="EXTERNAL_WIDTH" /> o <ph name="EXTERNAL_HEIGHT" />, il criterio non viene applicato ai display esterni.
+      Se <ph name="EXTERNAL_USE_NATIVE" /> viene impostata su True, la policy ignora <ph name="EXTERNAL_WIDTH" /> e <ph name="EXTERNAL_HEIGHT" /> e imposta i display esterni sulla loro risoluzione nativa. Se <ph name="EXTERNAL_USE_NATIVE" /> viene impostata su False o se non viene configurata insieme a <ph name="EXTERNAL_WIDTH" /> o <ph name="EXTERNAL_HEIGHT" />, la policy non viene applicata ai display esterni.
 
-      L'impostazione del flag consigliato su True consente agli utenti di modificare la risoluzione e il fattore di scalabilità per qualsiasi display tramite la pagina delle impostazioni, ma le impostazioni del display torneranno allo stato precedente al riavvio successivo. Se il flag consigliato viene impostato su False o se non viene configurato, gli utenti non possono modificare la impostazioni del display.
+      L'impostazione del flag consigliato su True consente agli utenti di modificare la risoluzione e il fattore di scalabilità per qualsiasi display tramite la pagina delle impostazioni, ma le impostazioni del display torneranno allo stato precedente al riavvio successivo. Se il flag consigliato viene impostato su False o se non viene configurato, gli utenti non possono modificare le impostazioni del display.
 
       Nota: imposta <ph name="EXTERNAL_WIDTH" /> e <ph name="EXTERNAL_HEIGHT" /> in pixel e <ph name="EXTERNAL_SCALE_PERCENTAGE" /> e <ph name="INTERNAL_SCALE_PERCENTAGE" /> in percentuali.</translation>
 <translation id="2548331788863219790">Impedisci l'installazione e l'aggiornamento di estensioni ospitate al di fuori del Chrome Web Store</translation>
-<translation id="2548397295248733155">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="2548397295248733155">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale lo schermo viene disattivato quando viene usata la batteria.
 
-          Se questo criterio viene impostato su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> disattivi lo schermo.
+          Se questa policy viene impostata su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> disattivi lo schermo.
 
-          Se questo criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non disattiva lo schermo quando l'utente diventa inattivo.
+          Se questa policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non disattiva lo schermo quando l'utente diventa inattivo.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.</translation>
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.</translation>
 <translation id="2548572254685798999">Segnala dati di Navigazione sicura</translation>
-<translation id="2549472870177108435">La configurazione del criterio consente di impostare le regole per la selezione della stampante predefinita in <ph name="PRODUCT_NAME" />, che sostituiscono le regole predefinite. La selezione della stampante viene effettuata la prima volta che gli utenti provano a stampare, quando <ph name="PRODUCT_NAME" /> cerca una stampante corrispondente agli attributi specificati. In caso di corrispondenza non ottimale, è possibile impostare <ph name="PRODUCT_NAME" /> affinché venga selezionata qualsiasi stampante corrispondente, a seconda dell'ordine di rilevamento delle stampanti.
+<translation id="2549472870177108435">La configurazione della policy consente di impostare le regole per la selezione della stampante predefinita in <ph name="PRODUCT_NAME" />, che sostituiscono le regole predefinite. La selezione della stampante viene effettuata la prima volta che gli utenti provano a stampare, quando <ph name="PRODUCT_NAME" /> cerca una stampante corrispondente agli attributi specificati. In caso di corrispondenza non ottimale, è possibile impostare <ph name="PRODUCT_NAME" /> affinché venga selezionata qualsiasi stampante corrispondente, a seconda dell'ordine di rilevamento delle stampanti.
 
-Se il criterio non viene configurato o se vengono impostati attributi per cui non esistono corrispondenze, viene selezionata come predefinita la stampante PDF integrata. Se non ci sono stampanti PDF disponibili, <ph name="PRODUCT_NAME" /> non seleziona alcuna stampante predefinita.
+Se la policy non viene configurata o se vengono impostati attributi per cui non esistono corrispondenze, viene selezionata come predefinita la stampante PDF integrata. Se non ci sono stampanti PDF disponibili, <ph name="PRODUCT_NAME" /> non seleziona alcuna stampante predefinita.
 
 Al momento, tutte le stampanti sono classificate come <ph name="PRINTER_TYPE_LOCAL" />. Le stampanti connesse a <ph name="CLOUD_PRINT_NAME" /> vengono considerate <ph name="PRINTER_TYPE_CLOUD" />, ma <ph name="CLOUD_PRINT_NAME" /> non è più supportato.
 
 Nota: l'omissione di un campo implica la corrispondenza di tutti i valori per il campo specifico. Ad esempio, se non specifichi idPattern, Anteprima di stampa accetta tutti gli ID stampante. I pattern di espressioni regolari devono seguire la sintassi JavaScript RegExp e le corrispondenze sono sensibili alle maiuscole.</translation>
 <translation id="2550593661567988768">Solo stampa su un lato</translation>
-<translation id="2552318891854145040">La configurazione del criterio consente di impostare un elenco di preferiti dove ognuno di questi è un dizionario con le chiavi "<ph name="NAME" />" e "<ph name="URL_LABEL" />" indicanti il nome e la destinazione del preferito. Gli amministratori possono configurare una sottocartella definendo un preferito senza una chiave "<ph name="URL_LABEL" />", ma con una chiave "<ph name="CHILDREN" />" aggiuntiva. Tale chiave contiene anche un elenco di preferiti, alcuni dei quali possono essere anche cartelle. Chrome corregge gli URL incompleti come se fossero stati inviati tramite la barra degli indirizzi. Ad esempio, "<ph name="GOOGLE_COM" />" diventa "<ph name="HTTPS_GOOGLE_COM" />".
+<translation id="2552318891854145040">La configurazione della policy consente di impostare un elenco di preferiti dove ognuno di questi è un dizionario con le chiavi "<ph name="NAME" />" e "<ph name="URL_LABEL" />" indicanti il nome e la destinazione del preferito. Gli amministratori possono configurare una sottocartella definendo un preferito senza una chiave "<ph name="URL_LABEL" />", ma con una chiave "<ph name="CHILDREN" />" aggiuntiva. Tale chiave contiene anche un elenco di preferiti, alcuni dei quali possono essere anche cartelle. Chrome corregge gli URL incompleti come se fossero stati inviati tramite la barra degli indirizzi. Ad esempio, "<ph name="GOOGLE_COM" />" diventa "<ph name="HTTPS_GOOGLE_COM" />".
 
-      Gli utenti non possono modificare le cartelle in cui vengono inseriti i preferiti (ma possono nasconderle dalla barra dei preferiti). Il nome predefinito della cartella per i preferiti gestiti è "Preferiti gestiti", ma può essere modificato aggiungendo un nuovo dizionario secondario al criterio con una chiave unica chiamata "<ph name="TOPLEVEL_NAME" />" e il nome della cartella che preferiscono gli utenti come valore. I preferiti gestiti non vengono sincronizzati con l'account utente e le estensioni non possono modificarli.</translation>
+      Gli utenti non possono modificare le cartelle in cui vengono inseriti i preferiti (ma possono nasconderle dalla barra dei preferiti). Il nome predefinito della cartella per i preferiti gestiti è "Preferiti gestiti", ma può essere modificato aggiungendo un nuovo dizionario secondario alla policy con una chiave unica chiamata "<ph name="TOPLEVEL_NAME" />" e il nome della cartella che preferiscono gli utenti come valore. I preferiti gestiti non vengono sincronizzati con l'account utente e le estensioni non possono modificarli.</translation>
 <translation id="2552966063069741410">Fuso orario</translation>
-<translation id="2554010621206996293">Questo criterio consente di controllare l'abilitazione della funzionalità di insiemi di siti web correlati.
+<translation id="2554010621206996293">Questa policy consente di controllare l'abilitazione della funzionalità di insiemi di siti web correlati.
 
-Questo criterio esegue l'override di<ph name="FIRST_PARTY_SETS_ENABLED_POLICY_NAME" />.
+Questa policy esegue l'override di<ph name="FIRST_PARTY_SETS_ENABLED_POLICY_NAME" />.
 
-Se questo criterio non viene configurato o se viene impostato su True, la funzionalità di insiemi di siti web correlati viene attivata.
+Se questa policy non viene configurata o se viene impostata su True, la funzionalità di insiemi di siti web correlati viene attivata.
 
-Se questo criterio viene impostato su False, la funzionalità di insiemi di siti web correlati viene disattivata.</translation>
+Se questa policy viene impostata su False, la funzionalità di insiemi di siti web correlati viene disattivata.</translation>
 <translation id="2555244983262829274">Nascondi il pulsante Pagina iniziale dalla barra degli strumenti</translation>
 <translation id="2558154810835597313">Attiva il provisioning dei certificati client per un utente o un profilo gestito</translation>
 <translation id="2562213287271514629">Consenti l'utilizzo del plug-in <ph name="FLASH_PLUGIN_NAME" /> obsoleto come il normale plug-in <ph name="FLASH_PLUGIN_NAME" /></translation>
@@ -2204,23 +2204,23 @@
           Questa norma viene rispettata soltanto se è attiva la norma "DefaultSearchProviderEnabled".</translation>
 <translation id="2563373001850981577">Attiva la possibilità di inviare file al Cestino (su file system supportati) nell'app File di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="256597156026041241">Disattiva i tasti permanenti nella schermata di accesso</translation>
-<translation id="2568488785376704318">Questo criterio è deprecato. Usa il criterio <ph name="REMOTE_ACCESS_HOST_DOMAIN_LIST_POLICY_NAME" />.</translation>
+<translation id="2568488785376704318">Questa policy è deprecata. Usa la policy <ph name="REMOTE_ACCESS_HOST_DOMAIN_LIST_POLICY_NAME" />.</translation>
 <translation id="2570059561924004903">Disattiva feedback vocale</translation>
 <translation id="2570181623957732921">Attiva <ph name="DESK_API_NAME" /> per un elenco di domini di terze parti</translation>
 <translation id="2575198840408498393">Disattiva la creazione di profili di roaming</translation>
-<translation id="25765864042030871">I gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> sono in fase di ritiro. La loro attivazione dipende dal valore <ph name="UNLOAD_EVENT_NAME" /> del criterio <ph name="PERMISSIONS_POLICY_NAME" />. Attualmente sono consentiti per impostazione predefinita in base al criterio. In futuro passeranno gradualmente allo stato non consentito per impostazione predefinita e i siti dovranno attivarli in modo esplicito tramite le intestazioni <ph name="PERMISSIONS_POLICY_NAME" />. Questo criterio aziendale può essere utilizzato per disattivare questo ritiro graduale. Per farlo, è necessario mantenere attiva l'impostazione predefinita.
+<translation id="25765864042030871">I gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> sono in fase di ritiro. La loro attivazione dipende dal valore <ph name="UNLOAD_EVENT_NAME" /> della policy <ph name="PERMISSIONS_POLICY_NAME" />. Attualmente sono consentiti per impostazione predefinita in base alla policy. In futuro passeranno gradualmente allo stato non consentito per impostazione predefinita e i siti dovranno attivarli in modo esplicito tramite le intestazioni <ph name="PERMISSIONS_POLICY_NAME" />. Questa policy aziendale può essere utilizzata per disattivare questo ritiro graduale. Per farlo, è necessario mantenere attiva l'impostazione predefinita.
  
 Le pagine potrebbero dipendere dai gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> per salvare i dati o segnalare al server la fine di una sessione utente. Questo non è consigliato perché non è affidabile e influisce sulle prestazioni bloccando l'utilizzo di <ph name="PRODUCT_NAME" />. Esistono alternative consigliate, ma l'evento <ph name="UNLOAD_EVENT_NAME" /> è utilizzato da molto tempo. Alcune applicazioni potrebbero continuare a utilizzarli.
 
-Se questo criterio viene impostato su false o se non viene configurato, i gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> verranno gradualmente ritirati in linea con l'implementazione del ritiro e i siti per i quali non viene impostata l'intestazione <ph name="PERMISSIONS_POLICY_NAME" /> smetteranno di attivare gli eventi "unload".
+Se questa policy viene impostata su false o se non viene configurata, i gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> verranno gradualmente ritirati in linea con l'implementazione del ritiro e i siti per i quali non viene impostata l'intestazione <ph name="PERMISSIONS_POLICY_NAME" /> smetteranno di attivare gli eventi "unload".
 
-Se questo criterio viene impostato su true, i gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> continueranno a funzionare per impostazione predefinita.
+Se questa policy viene impostata su true, i gestori di eventi <ph name="UNLOAD_EVENT_NAME" /> continueranno a funzionare per impostazione predefinita.
 
-NOTA: questo criterio presentava un valore predefinito documentato erroneamente "true" nella versione M117. L'evento unload non è cambiato e non cambierà nella versione M117, quindi questo criterio non ha effetto in quella versione.
+NOTA: questa policy presentava un valore predefinito documentato erroneamente "true" nella versione M117. L'evento unload non è cambiato e non cambierà nella versione M117, quindi questa policy non ha effetto in quella versione.
 </translation>
 <translation id="257788512393330403">Richiedi inserimento della password ogni sei ore</translation>
 <translation id="2580606791930800692">Consente di impostare un elenco di regole di controllo dei dati.</translation>
-<translation id="2580757713966614760">La configurazione del criterio consente di determinare quale criterio di accesso applicare per la configurazione collettiva delle stampanti, al fine di stabilire quali stampanti del criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" /> mettere a disposizione degli utenti.
+<translation id="2580757713966614760">La configurazione della policy consente di determinare quale policy di accesso applicare per la configurazione collettiva delle stampanti, al fine di stabilire quali stampanti della policy <ph name="DEVICE_PRINTERS_POLICY_NAME" /> mettere a disposizione degli utenti.
 
       * Con <ph name="POLICY_ENUM_DEVICEPRINTERSACCESSMODE_BLOCKLISTRESTRICTIONS" /> (valore 0), <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> consente di limitare l'accesso alle stampanti specificate.
 
@@ -2228,24 +2228,24 @@
 
       * Con <ph name="POLICY_ENUM_DEVICEPRINTERSACCESSMODE_ALLOWALL" /> (valore 2), tutte le stampanti sono consentite.
 
-      Se il criterio non viene configurato, viene applicato il valore <ph name="PRINTERS_ALLOW_ALL" />.</translation>
+      Se la policy non viene configurata, viene applicato il valore <ph name="PRINTERS_ALLOW_ALL" />.</translation>
 <translation id="2581338546762479588">Consenti il riavvio automatico dopo gli aggiornamenti</translation>
 <translation id="2585535930727399201">Le estensioni aziendali possono aggiungere log a un file di log di sistema tramite l'API chrome.systemLog.
 
-Se il criterio viene attivato, i log saranno mantenuti nel file di log di sistema per un periodo di tempo limitato.
-Se il criterio viene disattivato o se non viene configurato, i log non possono essere aggiunti al file di log di sistema. Ciò significa che i log non verranno mantenuti tra le sessioni.</translation>
+Se la policy viene attivata, i log saranno mantenuti nel file di log di sistema per un periodo di tempo limitato.
+Se la policy viene disattivata o se non viene configurata, i log non possono essere aggiunti al file di log di sistema. Ciò significa che i log non verranno mantenuti tra le sessioni.</translation>
 <translation id="2586117300379904732">Consenti wakelock per la gestione dell'alimentazione</translation>
 <translation id="2586231026319371211">L'ora nel formato di tempo reale di 24 ore locale.</translation>
 <translation id="2587719089023392205">Imposta <ph name="PRODUCT_NAME" /> come browser predefinito</translation>
-<translation id="2588252329503406673">La configurazione del criterio consente di impostare il comportamento di <ph name="PRODUCT_OS_NAME" /> quando non viene rilevata alcuna attività utente per un determinato periodo di tempo durante la visualizzazione della schermata di accesso. Il criterio consente di controllare diverse impostazioni. Per conoscere la semantica e gli intervalli di valori di ognuna di esse, consulta i relativi criteri che controllano la gestione dell'alimentazione all'interno di una sessione.
+<translation id="2588252329503406673">La configurazione della policy consente di impostare il comportamento di <ph name="PRODUCT_OS_NAME" /> quando non viene rilevata alcuna attività utente per un determinato periodo di tempo durante la visualizzazione della schermata di accesso. La policy consente di controllare diverse impostazioni. Per conoscere la semantica e gli intervalli di valori di ognuna di esse, consulta le relative policy che controllano la gestione dell'alimentazione all'interno di una sessione.
 
-      Le differenze rispetto a questi criteri sono le seguenti:
+      Le differenze rispetto a queste policy sono le seguenti:
 
       * Le azioni da compiere in caso di inattività o chiusura dello schermo non possono essere la chiusura della sessione.
 
       * L'azione predefinita compiuta in caso di inattività durante l'utilizzo della corrente CA è l'arresto.
 
-      Se il criterio o una qualsiasi delle relative impostazioni non vengono configurati, vengono utilizzati i valori predefiniti per le diverse impostazioni relative all'alimentazione.</translation>
+      Se la policy o una qualsiasi delle relative impostazioni non vengono configurate, vengono utilizzati i valori predefiniti per le diverse impostazioni relative all'alimentazione.</translation>
 <translation id="2589944745979739478">Questa policy consente di controllare le impostazioni della funzionalità di editing in Foto con AI generativa per <ph name="PRODUCT_OS_NAME" />.
 
 0 = Consente di utilizzare la funzionalità e permette al contempo a Google di utilizzare i dati pertinenti per migliorare i propri modelli di AI. A seconda della funzionalità, tra i dati pertinenti sono inclusi prompt, input, output, materiali originali e feedback scritto. Potrebbero anche essere esaminati da persone per migliorare i modelli di AI. 0 è il valore predefinito, ad eccezione dei casi riportati di seguito.
@@ -2259,9 +2259,9 @@
 Per ulteriori informazioni sulla gestione dei dati per le funzionalità di AI generativa, visita la pagina https://support.google.com/chrome/a?p=generative_ai_settings.</translation>
 <translation id="2591775699187375408">Limita sempre il processo audio tramite sandbox</translation>
 <translation id="2592091433672667839">Durata inattività prima della visualizzazione del salvaschermo nella schermata di accesso in modalità retail</translation>
-<translation id="259289618675490104">Se il criterio viene impostato su "All" (valore 0) o se non viene configurato, gli utenti possono gestire i certificati. Se viene impostato su "None" (valore 2), gli utenti possono soltanto visualizzare i certificati, ma non possono gestirli.
+<translation id="259289618675490104">Se la policy viene impostata su "All" (valore 0) o se non viene configurata, gli utenti possono gestire i certificati. Se viene impostata su "None" (valore 2), gli utenti possono soltanto visualizzare i certificati, ma non possono gestirli.
 
-      Se il criterio viene impostato su "UserOnly" (valore 1), gli utenti possono gestire i certificati a livello di utente, ma non quelli a livello di dispositivo.</translation>
+      Se la policy viene impostata su "UserOnly" (valore 1), gli utenti possono gestire i certificati a livello di utente, ma non quelli a livello di dispositivo.</translation>
 <translation id="2593762551209145088">Navigazione sicura non è mai attiva.</translation>
 <translation id="2594773358911436070">Impostazioni WebRTC</translation>
 <translation id="26023406105317310">Configura account Kerberos</translation>
@@ -2273,43 +2273,43 @@
 <translation id="2608887839902987727">Impedisci all'autenticazione captive portal di ignorare le impostazioni del proxy</translation>
 <translation id="2608985885792348429">Impostazione relativa agli appunti predefinita</translation>
 <translation id="2613493229743687635">L'API <ph name="GET_ALL_SCREENS_MEDIA_NAME" /> consente alle applicazioni web isolate (identificate in base alla loro origine) di acquisire più piattaforme contemporaneamente senza ulteriore autorizzazione dell'utente.
-      Se il criterio non viene configurato, <ph name="GET_ALL_SCREENS_MEDIA_NAME" /> non è disponibile per alcuna applicazione web.
-Per migliorare la privacy, questo criterio non supporterà gli aggiornamenti a metà sessione del valore del criterio, pertanto le modifiche verranno applicate solo dopo che l'utente si è disconnesso e ha eseguito nuovamente l'accesso.
+      Se la policy non viene configurata, <ph name="GET_ALL_SCREENS_MEDIA_NAME" /> non è disponibile per alcuna applicazione web.
+Per migliorare la privacy, questa policy non supporterà gli aggiornamenti a metà sessione del valore della policy, pertanto le modifiche verranno applicate solo dopo che l'utente si è disconnesso e ha eseguito nuovamente l'accesso.
 L'utente avrà la certezza che, dopo l'accesso, le altre app non saranno in grado di acquisire le schermate, se ciò non era già stato consentito all'inizio della sessione.</translation>
 <translation id="2615240493030733717">Segnala informazioni sul fuso orario</translation>
 <translation id="2619258867868873629">La destinazione "Salva come PDF" e la destinazione "Salva su Google Drive" sui dispositivi <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="2621290137818374425">La configurazione del criterio consente di disattivare i requisiti relativi alle informative di Certificate Transparency per i nomi host negli URL specificati. Anche se rilevare certificati emessi in modo scorretto diventa più difficile, gli host possono continuare a utilizzare certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato.
+<translation id="2621290137818374425">La configurazione della policy consente di disattivare i requisiti relativi alle informative di Certificate Transparency per i nomi host negli URL specificati. Anche se rilevare certificati emessi in modo scorretto diventa più difficile, gli host possono continuare a utilizzare certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato.
 
-      Se il criterio non viene configurato e se i certificati che richiedono informative tramite Certificate Transparency non vengono comunicati, <ph name="PRODUCT_NAME" /> non ritiene attendibili questi certificati.
+      Se la policy non viene configurata e se i certificati che richiedono informative tramite Certificate Transparency non vengono comunicati, <ph name="PRODUCT_NAME" /> non ritiene attendibili questi certificati.
 
       Un pattern URL ha il formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Tuttavia, poiché la validità dei certificati per un determinato nome host è indipendente da schemi, porte o percorsi, <ph name="PRODUCT_NAME" /> considera soltanto la parte del nome host dell'URL. Gli host con caratteri jolly non sono supportati.</translation>
 <translation id="2623014935069176671">Attesa dell'attività iniziale dell'utente</translation>
 <translation id="2625026032335150744">Seleziona l'opzione per mantenere i dati di navigazione esistenti per impostazione predefinita</translation>
 <translation id="2625398797484317969">Controlla le impostazioni di Risposte rapide.</translation>
-<translation id="2626302212133950795">Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi <ph name="PRODUCT_OS_NAME" /> possono utilizzare l'attestazione remota (Accesso verificato) per ricevere un certificato emesso dall'autorità di certificazione di <ph name="PRODUCT_OS_NAME" /> in cui si afferma che il dispositivo è idoneo alla riproduzione di contenuti protetti. Questo processo comporta l'invio all'autorità di certificazione di <ph name="PRODUCT_OS_NAME" /> di informazioni di approvazione dell'hardware che identificano in modo univoco il dispositivo.
+<translation id="2626302212133950795">Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi <ph name="PRODUCT_OS_NAME" /> possono utilizzare l'attestazione remota (Accesso verificato) per ricevere un certificato emesso dall'autorità di certificazione di <ph name="PRODUCT_OS_NAME" /> in cui si afferma che il dispositivo è idoneo alla riproduzione di contenuti protetti. Questo processo comporta l'invio all'autorità di certificazione di <ph name="PRODUCT_OS_NAME" /> di informazioni di approvazione dell'hardware che identificano in modo univoco il dispositivo.
 
-Se il criterio viene impostato su Disattivato, il dispositivo non utilizza l'attestazione remota per la protezione dei contenuti e non può riprodurre contenuti protetti.</translation>
+Se la policy viene impostata su Disattivata, il dispositivo non utilizza l'attestazione remota per la protezione dei contenuti e non può riprodurre contenuti protetti.</translation>
 <translation id="262740370354162807">Attiva l'invio di documenti a <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2633084400146331575">Attiva la funzione di lettura vocale</translation>
 <translation id="2633907568797306353">Consenti l'attivazione delle notifiche Phone Hub</translation>
 <translation id="2634265675787412567"><ph name="PRODUCT_NAME" /> può indirizzare le richieste di creazione di passkey/WebAuthn direttamente al portachiavi iCloud su macOS 13.5 o versioni successive. Se la sincronizzazione del portachiavi iCloud non è stata ancora abilitata, all'utente verrà richiesto di eseguire l'accesso con iCloud oppure potrebbe essergli chiesto di attivare la sincronizzazione del portachiavi iCloud.
 
-Se questo criterio viene impostato su "false", il portachiavi iCloud non verrà utilizzato per impostazione predefinita e verrà utilizzato il comportamento precedente (creazione della credenziale nel profilo <ph name="PRODUCT_NAME" />). Gli utenti potranno comunque selezionare il portachiavi iCloud come opzione e visualizzare le credenziali del portachiavi iCloud durante l'accesso.
+Se questa policy viene impostata su "false", il portachiavi iCloud non verrà utilizzato per impostazione predefinita e verrà utilizzato il comportamento precedente (creazione della credenziale nel profilo <ph name="PRODUCT_NAME" />). Gli utenti potranno comunque selezionare il portachiavi iCloud come opzione e visualizzare le credenziali del portachiavi iCloud durante l'accesso.
 
-Se questo criterio viene impostato su "true", il portachiavi iCloud sarà predefinito ogni volta che la richiesta WebAuthn è compatibile con la scelta.
+Se questa policy viene impostata su "true", il portachiavi iCloud sarà predefinito ogni volta che la richiesta WebAuthn è compatibile con la scelta.
 
-Se questo criterio non viene configurato, l'impostazione predefinita dipende da fattori come l'abilitazione di iCloud Drive e il fatto che l'utente abbia utilizzato o creato di recente una credenziale nel proprio profilo <ph name="PRODUCT_NAME" />.</translation>
-<translation id="2635872253077105112">Questo criterio consente di stabilire l'elenco dei siti web da aprire in un browser alternativo. Ogni elemento è considerato come una regola per aprire un URL in un browser alternativo. <ph name="PRODUCT_NAME" /> utilizza queste regole per scegliere se aprire un URL in un browser alternativo. Quando il componente aggiuntivo <ph name="IE_PRODUCT_NAME" /> è attivo, <ph name="IE_PRODUCT_NAME" /> torna a <ph name="PRODUCT_NAME" /> se non c'è corrispondenza tra le regole. Se le regole sono in conflitto, <ph name="PRODUCT_NAME" /> usa quella più specifica.
+Se questa policy non viene configurata, l'impostazione predefinita dipende da fattori come l'abilitazione di iCloud Drive e il fatto che l'utente abbia utilizzato o creato di recente una credenziale nel proprio profilo <ph name="PRODUCT_NAME" />.</translation>
+<translation id="2635872253077105112">Questa policy consente di stabilire l'elenco dei siti web da aprire in un browser alternativo. Ogni elemento è considerato come una regola per aprire un URL in un browser alternativo. <ph name="PRODUCT_NAME" /> utilizza queste regole per scegliere se aprire un URL in un browser alternativo. Quando il componente aggiuntivo <ph name="IE_PRODUCT_NAME" /> è attivo, <ph name="IE_PRODUCT_NAME" /> torna a <ph name="PRODUCT_NAME" /> se non c'è corrispondenza tra le regole. Se le regole sono in conflitto, <ph name="PRODUCT_NAME" /> usa quella più specifica.
 
-      Se il criterio non viene impostato, non viene aggiunto alcun sito web all'elenco.
+      Se la policy non viene impostata, non viene aggiunto alcun sito web all'elenco.
 
-      Nota: puoi aggiungere elementi all'elenco anche tramite i criteri <ph name="USE_IE_SITELIST_POLICY_NAME" /> e <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
+      Nota: puoi aggiungere elementi all'elenco anche tramite le policy <ph name="USE_IE_SITELIST_POLICY_NAME" /> e <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="2640898752536996430">L'utente viene disconnesso</translation>
 <translation id="264093234299818170">Vengono mostrate tutte le stampanti, tranne quelle indicate nella lista bloccata.</translation>
 <translation id="264252574246191885">Non in elenco</translation>
-<translation id="2644268520085581041">Se il criterio viene impostato su true, il controllo della connettività IPv6 viene sostituito. Ciò significa che il sistema eseguirà sempre una query sui record AAAA per la risoluzione dei nomi host. Viene applicato a tutti gli utenti e a tutte le interfacce del dispositivo.
+<translation id="2644268520085581041">Se la policy viene impostata su true, il controllo della connettività IPv6 viene sostituito. Ciò significa che il sistema eseguirà sempre una query sui record AAAA per la risoluzione dei nomi host. Viene applicata a tutti gli utenti e a tutte le interfacce del dispositivo.
 
-Se il criterio viene impostato su false o se non viene configurato, il controllo della connettività IPv6 non viene sostituito.
+Se la policy viene impostata su false o se non viene configurata, il controllo della connettività IPv6 non viene sostituito.
 Il sistema eseguirà una query sui record AAAA soltanto quando può essere connesso a un host IPv6 globale.</translation>
 <translation id="2647069081229792812">Attiva o disattiva la funzione di modifica dei preferiti</translation>
 <translation id="264771271300359481">Non consentire ai siti di usare l'autorizzazione di accesso dei siti agli appunti</translation>
@@ -2326,9 +2326,9 @@
 <translation id="2665129863304939984">Consenti agli utenti di decidere di importare i dati di navigazione esistenti nel loro profilo gestito</translation>
 <translation id="2665422249821137126">Attiva il puntatore grande nella schermata di accesso</translation>
 <translation id="2666177084759967497">
-      Consente di stabilire se tenere o meno memorizzati in <ph name="PRODUCT_OS_NAME" /> i dati degli account locali dopo l'uscita. Se il criterio viene impostato su true, in <ph name="PRODUCT_OS_NAME" /> non verranno conservati i dati degli account persistenti e tutti i dati della sessione utente verranno eliminati dopo l'uscita. Se il criterio viene impostato su false o non viene configurato, il dispositivo conserverà i dati utente locali (criptati).
+      Consente di stabilire se tenere o meno memorizzati in <ph name="PRODUCT_OS_NAME" /> i dati degli account locali dopo l'uscita. Se la policy viene impostata su true, in <ph name="PRODUCT_OS_NAME" /> non verranno conservati i dati degli account persistenti e tutti i dati della sessione utente verranno eliminati dopo l'uscita. Se la policy viene impostata su false o non viene configurata, il dispositivo conserverà i dati utente locali (criptati).
 
-      Nota: dalla versione M114, determinate app kiosk possono sostituire il comportamento di questo criterio per le proprie app per casi d'uso speciali, ad esempio le valutazioni degli studenti.</translation>
+      Nota: dalla versione M114, determinate app kiosk possono sostituire il comportamento di questa policy per le proprie app per casi d'uso speciali, ad esempio le valutazioni degli studenti.</translation>
 <translation id="2667894101494585925">Attiva il recupero della guida all'ottimizzazione</translation>
 <translation id="2669157090883237118">Non modificare la configurazione di <ph name="PRODUCT_OS_NAME" /> consigliata.</translation>
 <translation id="2672012807430078509">Controlla l'attivazione del protocollo di autenticazione NTLM per i montaggi SMB</translation>
@@ -2337,24 +2337,24 @@
 <translation id="2678503605767349615">Certificati client a livello di dispositivo richiesti</translation>
 <translation id="268134026533587276">Schermata di blocco salvaschermo attivata.</translation>
 <translation id="268577405881275241">Attiva la funzione proxy di compressione dei dati</translation>
-<translation id="268695908564263739">Questo criterio attiva o disattiva l'impostazione della modalità ad alta efficienza. Questa impostazione fa sì che le schede vengano chiuse dopo un certo periodo di tempo in background per recuperare memoria.
-      Se questo criterio non è impostato, l'utente finale può controllare questa impostazione all'indirizzo chrome://settings/performance.
+<translation id="268695908564263739">Questa policy attiva o disattiva l'impostazione della modalità ad alta efficienza. Questa impostazione fa sì che le schede vengano chiuse dopo un certo periodo di tempo in background per recuperare memoria.
+      Se questa policy non è impostata, l'utente finale può controllare questa impostazione all'indirizzo chrome://settings/performance.
       </translation>
-<translation id="2691668238491124549">Se questo criterio viene impostato (come consigliato), le lingue consigliate per una sessione gestita vengono spostate in cima all'elenco, nell'ordine di visualizzazione nel criterio. La prima lingua consigliata è preselezionata.
+<translation id="2691668238491124549">Se questa policy viene impostata (come consigliato), le lingue consigliate per una sessione gestita vengono spostate in cima all'elenco, nell'ordine di visualizzazione nella policy. La prima lingua consigliata è preselezionata.
 
-      Se il criterio non viene impostato, viene preselezionata la lingua attuale dell'interfaccia utente.
+      Se la policy non viene impostata, viene preselezionata la lingua attuale dell'interfaccia utente.
 
       Se ci sono più lingue consigliate, si presume che gli utenti vogliano scegliere tra queste lingue. Le opzioni per la selezione della lingua e del layout della tastiera sono in una posizione ben visibile quando si avvia una sessione gestita. In caso contrario, si presume che la maggior parte degli utenti voglia usare la lingua preselezionata. Le opzioni per la selezione della lingua e del layout della tastiera sono in una posizione ben visibile quando si avvia una sessione gestita.
 
-      Se imposti il criterio e attivi l'accesso automatico (vedi i criteri <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> e <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_DELAY_POLICY_NAME" />), per la sessione gestita vengono usati la prima lingua consigliata e il layout della tastiera corrispondente più usato.
+      Se imposti la policy e attivi l'accesso automatico (vedi le policy <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> e <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_DELAY_POLICY_NAME" />), per la sessione gestita vengono usati la prima lingua consigliata e il layout della tastiera corrispondente più usato.
 
       Il layout della tastiera preselezionato è sempre il layout più usato corrispondente alla lingua preselezionata. Gli utenti possono scegliere in qualsiasi momento qualsiasi lingua supportata da <ph name="PRODUCT_OS_NAME" /> per la loro sessione.</translation>
 <translation id="269274821351405808">Impostazioni per la funzionalità di editing di foto con AI generativa</translation>
 <translation id="2693108589792503178">Configura l'URL di modifica della password.</translation>
 <translation id="2694143893026486692">Lente d'ingrandimento ancorata attivata</translation>
 <translation id="2696077732471707315">
-      Questo criterio è stato rimosso da M77.
-      Questo criterio si applica alla schermata di accesso. Vedi anche il criterio <ph name="SITE_PER_PROCESS_POLICY_NAME" /> che viene applicato alla sessione utente. È consigliabile impostare lo stesso valore per entrambi i criteri. Se i valori non corrispondono, può verificarsi un ritardo quando si accede a una sessione utente mentre viene applicato il valore specificato dai criteri relativi agli utenti.
+      Questa policy è stata rimossa da M77.
+      Questa policy si applica alla schermata di accesso. Vedi anche la policy <ph name="SITE_PER_PROCESS_POLICY_NAME" /> che viene applicata alla sessione utente. È consigliabile impostare lo stesso valore per entrambe le policy. Se i valori non corrispondono, può verificarsi un ritardo quando si accede a una sessione utente mentre viene applicato il valore specificato dalle policy relative agli utenti.
       </translation>
 <translation id="2697717608663878828">Attiva l'esperimento TLS Encrypted ClientHello</translation>
 <translation id="2699836109975228367">Attiva l'audio in formato mono sulla schermata di accesso</translation>
@@ -2367,38 +2367,38 @@
 <translation id="2709516037105925701">Compilazione automatica</translation>
 <translation id="2713913573196284609">Questo valore è obsoleto a partire dalla versione M121. Nella versione M121 e successive, i valori verranno trattati come EnabledBelowThreshold.</translation>
 <translation id="2713977837384407666">Invia sempre le metriche a Google</translation>
-<translation id="2714359695399346815">Se il criterio viene impostato su Attivato o se non viene configurato, viene consentito l'utilizzo di server STUN, permettendo ai client remoti di rilevare e collegarsi a questo computer anche se sono separati da un firewall.
+<translation id="2714359695399346815">Se la policy viene impostata su Attivata o se non viene configurata, viene consentito l'utilizzo di server STUN, permettendo ai client remoti di rilevare e collegarsi a questo computer anche se sono separati da un firewall.
 
-      Se il criterio viene impostato su Disattivato e le connessioni UDP in uscita vengono filtrate dal firewall, il computer consente soltanto connessioni da computer client all'interno della rete locale.</translation>
+      Se la policy viene impostata su Disattivata e le connessioni UDP in uscita vengono filtrate dal firewall, il computer consente soltanto connessioni da computer client all'interno della rete locale.</translation>
 <translation id="2714756912981510828">Attiva il rilevamento di fuga delle password</translation>
 <translation id="2716071441112588786">Consenti ricerche inviate tramite proxy con una protezione maggiore</translation>
-<translation id="2716623398185506073">Se il criterio viene impostato su Attivato, i dispositivi registrati segnalano statistiche hardware e identificatori relativi al consumo di energia.
+<translation id="2716623398185506073">Se la policy viene impostata su Attivata, i dispositivi registrati segnalano statistiche hardware e identificatori relativi al consumo di energia.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i dispositivi registrati non segnalano statistiche relative al consumo di energia.</translation>
-<translation id="2716930334159519261">La configurazione del criterio consente di impostare un elenco di pattern URL che specificano i siti che non possono usare l'autorizzazione di accesso dei siti agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
+      Se la policy viene impostata su Disattivata o se non viene configurata, i dispositivi registrati non segnalano statistiche relative al consumo di energia.</translation>
+<translation id="2716930334159519261">La configurazione della policy consente di impostare un elenco di pattern URL che specificano i siti che non possono usare l'autorizzazione di accesso dei siti agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
-<translation id="2717628606602248727">Questo criterio è impostato su Attivato per impostazione predefinita. Consente di stabilire se i dispositivi registrati devono segnalare o meno le informazioni sulla memoria.
+<translation id="2717628606602248727">Questa policy è impostata su Attivata per impostazione predefinita. Consente di stabilire se i dispositivi registrati devono segnalare o meno le informazioni sulla memoria.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano informazioni sulla memoria.
-      Eccezione: le informazioni relative alla memoria libera vengono controllate tramite il criterio <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano informazioni sulla memoria.
+      Eccezione: le informazioni relative alla memoria libera vengono controllate tramite la policy <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
 <translation id="2721185634942265347">Disattiva i suggerimenti di ricerca</translation>
 <translation id="2721582713721006926">Disattiva definizioni di Risposte rapide</translation>
-<translation id="2722076884688932437">Se il criterio viene impostato su Vero, i dispositivi registrati segnalano informazioni relative alle periferiche collegate al dispositivo.
+<translation id="2722076884688932437">Se la policy viene impostata su True, i dispositivi registrati segnalano informazioni relative alle periferiche collegate al dispositivo.
 
-      Se il criterio viene impostato su Falso o non viene impostato, i dispositivi registrati non segnalano informazioni relative alle periferiche.</translation>
-<translation id="2723281094174141470">L'estensione Insights segnala velocità di caricamento e download tramite Internet e tempo di inattività degli utenti, nonché informazioni relative alle applicazioni.
+      Se la policy viene impostata su False o non viene impostata, i dispositivi registrati non segnalano informazioni relative alle periferiche.</translation>
+<translation id="2723281094174141470">L'estensione Insights segnala velocità di caricamento e download tramite internet e tempo di inattività degli utenti, nonché informazioni relative alle applicazioni.
 
-      Se il criterio viene impostato su Enabled, l'estensione Insights verrà installata e segnalerà le metriche.
+      Se la policy viene impostata su Enabled, l'estensione Insights verrà installata e segnalerà le metriche.
 
-      Se non viene configurato o se viene impostato su Disabled, l'estensione Insights non verrà installata e non segnalerà le metriche.</translation>
+      Se non viene configurata o se viene impostata su Disabled, l'estensione Insights non verrà installata e non segnalerà le metriche.</translation>
 <translation id="2724868837491558133">Consente di impostare un elenco di pattern URL per i siti che specifica i siti a cui viene concessa automaticamente l'autorizzazione per i caratteri locali. Ciò estenderà la capacità dei siti di vedere le informazioni sui caratteri locali.
 
-      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
+      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
 
-      Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
+      Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
 <translation id="2727844239611930002">Consenti a <ph name="PRODUCT_NAME" /> di stabilire se mostrare o meno la richiesta di <ph name="PRIVACY_SANDBOX_NAME" />.</translation>
 <translation id="2729889068935597630">Questa policy definisce l'impostazione predefinita per tutte le funzionalità di AI generativa incluse. Ad esempio, se questa policy viene impostata sul valore 1, 1 sarà l'impostazione predefinita per tutte le funzionalità di AI generativa incluse. Non inciderà sui valori delle policy impostate manualmente. Per un elenco delle funzionalità incluse, visita la pagina https://support.google.com/chrome/a?p=generative_ai_settings.
 
@@ -2413,16 +2413,16 @@
 Per ulteriori informazioni sulla gestione dei dati per le funzionalità di AI generativa, visita la pagina https://support.google.com/chrome/a?p=generative_ai_settings.</translation>
 <translation id="2730200383593984228">Consenti a utenti non affiliati di utilizzare app per Android</translation>
 <translation id="2730419309754848345">Stampa PDF come immagine predefinita</translation>
-<translation id="2730644640965800157">Se il criterio viene attivato, viene disattivata la sincronizzazione di <ph name="GOOGLE_DRIVE_NAME" /> nell'app File di <ph name="PRODUCT_OS_NAME" />. Nessun dato viene caricato su Drive.
+<translation id="2730644640965800157">Se la policy viene attivata, viene disattivata la sincronizzazione di <ph name="GOOGLE_DRIVE_NAME" /> nell'app File di <ph name="PRODUCT_OS_NAME" />. Nessun dato viene caricato su Drive.
 
-Se il criterio viene disattivato o se non viene configurato, gli utenti possono trasferire i file su Drive.</translation>
-<translation id="2731299561202635374">Questo criterio consente di controllare gli URL in tempo reale per identificare quelli non sicuri.
+Se la policy viene disattivata o se non viene configurata, gli utenti possono trasferire i file su Drive.</translation>
+<translation id="2731299561202635374">Questa policy consente di controllare gli URL in tempo reale per identificare quelli non sicuri.
 
-      Se questo criterio non viene configurato o se viene impostato su "Disattivato", vengono applicati i controlli consumer di Navigazione sicura. I controlli consumer di Navigazione sicura possono comunque includere ricerche in tempo reale, a seconda del valore dell'impostazione "Migliora le ricerche e le attività di navigazione" e del valore del criterio UrlKeyedAnonymizedDataCollectionEnabled.
+      Se questa policy non viene configurata o se viene impostata su "Disattivata", vengono applicati i controlli consumer di Navigazione sicura. I controlli consumer di Navigazione sicura possono comunque includere ricerche in tempo reale, a seconda del valore dell'impostazione "Migliora le ricerche e le attività di navigazione" e del valore della policy UrlKeyedAnonymizedDataCollectionEnabled.
 
-      Se questo criterio viene impostato su "Attivato", gli URL vengono inviati per l'analisi in tempo reale in base ai TdS di Chrome Enterprise. Chrome invia gli URL a Google Cloud o alle terze parti scelte da te per controllarli in tempo reale. La versione consumer della ricerca in tempo reale di Navigazione sicura viene disattivata.
+      Se questa policy viene impostata su "Attivata", gli URL vengono inviati per l'analisi in tempo reale in base ai TdS di Chrome Enterprise. Chrome invia gli URL a Google Cloud o alle terze parti scelte da te per controllarli in tempo reale. La versione consumer della ricerca in tempo reale di Navigazione sicura viene disattivata.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="2731627323327011390">Disattiva l'utilizzo dei certificati <ph name="PRODUCT_OS_NAME" /> per le app ARC</translation>
 <translation id="273678600057164019">La risoluzione DNS di sistema verrà eseguita all'interno del processo di rete.</translation>
 <translation id="2737917415184832294">Utilizza HTTPS per i download di aggiornamento</translation>
@@ -2441,12 +2441,12 @@
       Se questa impostazione viene disattivata, le pagine web non potranno utilizzare JavaScript e l'utente non potrà modificare tale impostazione.
 
       Se questa impostazione viene attivata o non è impostata, le pagine web potranno utilizzare JavaScript ma l'utente potrà modificare tale impostazione.</translation>
-<translation id="274769314493317695">Se per il criterio <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" />, la configurazione del criterio <ph name="NATIVE_PRINTERS_BULK_WHITELIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="NATIVE_PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.
+<translation id="274769314493317695">Se per la policy <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" />, la configurazione della policy <ph name="NATIVE_PRINTERS_BULK_WHITELIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="NATIVE_PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" />.</translation>
-<translation id="2752046642026416564">Se il criterio viene impostato su Attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> può utilizzare gli host di messaggistica nativi installati a livello di utente.
+      Questa policy è deprecata. Usa la policy <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="2752046642026416564">Se la policy viene impostata su Attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> può utilizzare gli host di messaggistica nativi installati a livello di utente.
 
-      Se viene impostato su Disattivato, <ph name="PRODUCT_NAME" /> può utilizzare questi host solo se sono installati a livello di sistema.</translation>
+      Se viene impostata su Disattivata, <ph name="PRODUCT_NAME" /> può utilizzare questi host solo se sono installati a livello di sistema.</translation>
 <translation id="2753637905605932878">Limita l'intervallo di porte UDP locali utilizzato da WebRTC</translation>
 <translation id="2755847332939882873">Consenti la raccolta di dati di rilevamento del rendimento a livello di sistema</translation>
 <translation id="2757054304033424106">Tipi di estensioni/app che possono essere installati</translation>
@@ -2456,22 +2456,22 @@
 <translation id="2764750330785898947">Attiva il supporto della codifica dei contenuti <ph name="ZSTANDARD_SHORTNAME" /></translation>
 <translation id="2764964245640818227">Controlla se il visualizzatore PDF in <ph name="PRODUCT_NAME" /> può aggiungere annotazioni nei PDF.
 
-      Quando questo criterio non è impostato o è impostato su vero, il visualizzatore PDF può aggiungere annotazioni nei PDF.
+      Quando questa policy non è impostata o è impostata su true, il visualizzatore PDF può aggiungere annotazioni nei PDF.
 
-      Quando questo criterio è impostato su falso, il visualizzatore PDF non può aggiungere annotazioni sui PDF.</translation>
+      Quando questa policy è impostata su false, il visualizzatore PDF non può aggiungere annotazioni sui PDF.</translation>
 <translation id="2769199041812510302">URL logo aziendale</translation>
 <translation id="2769952903507981510">Configura il nome di dominio richiesto per gli host di accesso remoto</translation>
 <translation id="2770376586681635746">Consente di stabilire se gli utenti possono o meno aggiungere account Kerberos.
 
-Se questo criterio viene attivato o se non viene configurato, gli utenti possono aggiungere account Kerberos tramite le impostazioni relative agli account Kerberos nella pagina di impostazioni Kerberos. Gli utenti hanno il controllo completo degli account che hanno aggiunto e possono modificarli o rimuoverli.
+Se questa policy viene attivata o se non viene configurata, gli utenti possono aggiungere account Kerberos tramite le impostazioni relative agli account Kerberos nella pagina di impostazioni Kerberos. Gli utenti hanno il controllo completo degli account che hanno aggiunto e possono modificarli o rimuoverli.
 
-Se questo criterio viene disattivato, gli utenti non possono aggiungere account Kerberos. Gli account possono essere aggiunti solo tramite il criterio "Configura account Kerberos". Si tratta di una soluzione efficace per bloccare gli account.</translation>
+Se questa policy viene disattivata, gli utenti non possono aggiungere account Kerberos. Gli account possono essere aggiunti solo tramite la policy "Configura account Kerberos". Si tratta di una soluzione efficace per bloccare gli account.</translation>
 <translation id="2772231477628401250">Utilizza HTTP per i download di aggiornamento</translation>
-<translation id="2772955711376920612">Se il criterio viene impostato su Attivato e vengono impostati i criteri <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> e <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, la variazione dei picchi energetici rimane attiva, se supportata sul dispositivo. Il criterio di gestione della variazione dei picchi energetici è un criterio per il risparmio energetico che riduce al minimo l'utilizzo della corrente alternata durante i momenti di picco. Puoi impostare un orario di inizio e di fine della modalità di variazione dei picchi energetici per ogni giorno feriale. Se durante questi orari il livello della batteria rimane al di sopra della soglia specificata, il dispositivo usa la batteria (anche se è collegato alla corrente alternata). Dopo l'orario di fine specificato, il dispositivo usa la corrente alternata, se è collegato, ma non ricarica la batteria. Il dispositivo funzionerà di nuovo normalmente con la corrente alternata e ricaricherà la batteria dopo l'orario di inizio della ricarica specificato.
+<translation id="2772955711376920612">Se la policy viene impostata su Attivata e vengono impostate le policy <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> e <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, la variazione dei picchi energetici rimane attiva, se supportata sul dispositivo. La policy di gestione della variazione dei picchi energetici è una policy per il risparmio energetico che riduce al minimo l'utilizzo della corrente alternata durante i momenti di picco. Puoi impostare un orario di inizio e di fine della modalità di variazione dei picchi energetici per ogni giorno feriale. Se durante questi orari il livello della batteria rimane al di sopra della soglia specificata, il dispositivo usa la batteria (anche se è collegato alla corrente alternata). Dopo l'orario di fine specificato, il dispositivo usa la corrente alternata, se è collegato, ma non ricarica la batteria. Il dispositivo funzionerà di nuovo normalmente con la corrente alternata e ricaricherà la batteria dopo l'orario di inizio della ricarica specificato.
 
-      Se il criterio viene impostato su Disattivato, la variazione dei picchi energetici rimane disattivata.
+      Se la policy viene impostata su Disattivata, la variazione dei picchi energetici rimane disattivata.
 
-      Se non viene configurato, la variazione dei picchi energetici è inizialmente disattivata. Gli utenti non possono modificare questa impostazione.</translation>
+      Se non viene configurata, la variazione dei picchi energetici è inizialmente disattivata. Gli utenti non possono modificare questa impostazione.</translation>
 <translation id="2773288106548584039">Supporto dei browser precedenti</translation>
 <translation id="2774906947252258544">La lista bloccata consente di stabilire i tipi di installazione delle estensioni vietati.
 
@@ -2479,34 +2479,34 @@
 <translation id="2780840673734667062">Disattiva l'accesso con Account Google aggiuntivi</translation>
 <translation id="2784880732336446591">Cancella dati di navigazione all'uscita</translation>
 <translation id="2787173078141616821">Segnala informazioni sullo stato di Android</translation>
-<translation id="2787774054174244402">L'impostazione del criterio su True impedisce agli utenti di scrivere su dispositivi di archiviazione esterni.
+<translation id="2787774054174244402">L'impostazione della policy su True impedisce agli utenti di scrivere su dispositivi di archiviazione esterni.
 
-      A meno che lo spazio di archiviazione esterno non sia bloccato, se imposti ExternalStorageReadOnly su False o non lo imposti, gli utenti possono creare e modificare i file dei dispositivi di archiviazione esterni fisicamente scrivibili. Puoi bloccare lo spazio di archiviazione esterno impostando ExternalStorageDisable su True.</translation>
+      A meno che lo spazio di archiviazione esterno non sia bloccato, se imposti ExternalStorageReadOnly su False o non la imposti, gli utenti possono creare e modificare i file dei dispositivi di archiviazione esterni fisicamente scrivibili. Puoi bloccare lo spazio di archiviazione esterno impostando ExternalStorageDisable su True.</translation>
 <translation id="2789742777235177478">Limita il tempo per cui un utente autenticato tramite GAIA senza SAML può accedere offline nella schermata di blocco</translation>
 <translation id="2794180170614133361">Attiva la tastiera virtuale touch in base all'euristica di sistema predefinita nella schermata di accesso</translation>
-<translation id="2795923835422513629">Se il criterio viene impostato su 1, i siti web possono mostrare i popup. Se il criterio viene impostato su 2, i popup vengono negati.
+<translation id="2795923835422513629">Se la policy viene impostata su 1, i siti web possono mostrare i popup. Se la policy viene impostata su 2, i popup vengono negati.
 
-Se non viene configurato, si applica il criterio <ph name="BLOCK_POPUPS_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
+Se non viene configurata, si applica la policy <ph name="BLOCK_POPUPS_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="2796714419743648316">Lista consentita limiti di utilizzo per app</translation>
 <translation id="2801065672151277034">Impostazioni di gestione dei certificati</translation>
 <translation id="2801155097555584385">Imposta il valore personalizzato espresso in percentuale raggiunto il quale la batteria avvia la ricarica</translation>
 <translation id="2801378553855965587">Disattiva integrazione di <ph name="GOOGLE_CALENDAR_NAME" />.</translation>
 <translation id="2805707493867224476">Consenti la visualizzazione di popup in tutti i siti</translation>
-<translation id="2806804577787377637">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="PER_APP_TIME_LIMITS_ALLOWLIST" />.</translation>
+<translation id="2806804577787377637">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="PER_APP_TIME_LIMITS_ALLOWLIST" />.</translation>
 <translation id="2812417768214606683">Questa policy consente di specificare un elenco di dispositivi di archiviazione USB esenti dalle policy <ph name="EXTERNAL_STORAGE_DISABLED_POLICY_NAME" /> e <ph name="EXTERNAL_STORAGE_READ_ONLY_POLICY_NAME" />.
 
 Le voci sono coppie costituite dall'ID fornitore USB e dall'ID prodotto per identificare il modello di dispositivo USB specifico.</translation>
-<translation id="2815701930753942156">Questo criterio specifica un elenco di intervalli settimanali durante i quali il dispositivo <ph name="PRODUCT_OS_NAME" /> non può essere utilizzato. Eventuali sessioni in corso verranno chiuse e l'accesso verrà bloccato.
+<translation id="2815701930753942156">Questa policy specifica un elenco di intervalli settimanali durante i quali il dispositivo <ph name="PRODUCT_OS_NAME" /> non può essere utilizzato. Eventuali sessioni in corso verranno chiuse e l'accesso verrà bloccato.
 
 Non sono supportati intervalli sovrapposti.
 
 I dispositivi <ph name="PRODUCT_OS_NAME" /> utilizzeranno il fuso orario del sistema per applicare questi intervalli.</translation>
 <translation id="2816964824289752181">Attiva <ph name="DESK_API_NAME" /> per il controllo <ph name="PRODUCT_OS_NAME" /> di terze parti</translation>
-<translation id="2818074121667686266">Se il criterio viene attivato o se non viene configurato, agli utenti viene richiesto l'accesso all'acquisizione audio, fatta eccezione per gli URL configurati nell'elenco AudioCaptureAllowedUrls.
+<translation id="2818074121667686266">Se la policy viene attivata o se non viene configurata, agli utenti viene richiesto l'accesso all'acquisizione audio, fatta eccezione per gli URL configurati nell'elenco AudioCaptureAllowedUrls.
 
-      Se il criterio viene disattivato, le richieste vengono disabilitate e l'acquisizione audio è disponibile solo per gli URL configurati nell'elenco AudioCaptureAllowedUrls.
+      Se la policy viene disattivata, le richieste vengono disabilitate e l'acquisizione audio è disponibile solo per gli URL configurati nell'elenco AudioCaptureAllowedUrls.
 
-      Nota: il criterio si applica a tutte le uscite audio (non solo al microfono integrato).</translation>
+      Nota: la policy si applica a tutte le uscite audio (non solo al microfono integrato).</translation>
 <translation id="2823164704578322622">Le impostazioni di Inizio/Fine usano la scorciatoia che contiene il tasto di modifica Alt</translation>
 <translation id="2823870601012066791">Posizione del Registro di sistema di Windows per client <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Attiva modalità di navigazione in incognito</translation>
@@ -2519,14 +2519,14 @@
 <translation id="2841911109921764691">Il pulsante destro è il principale nella schermata di accesso</translation>
 <translation id="284288632677954003">URL di un file XML che contiene URL che non devono mai attivare il cambio di browser.</translation>
 <translation id="2845590342236201916">Le impostazioni di F12 usano la scorciatoia che contiene il tasto di modifica Alt</translation>
-<translation id="28458742190197992">Questo criterio consente di controllare il reporting su cloud di <ph name="PRODUCT_NAME" /> per uno specifico profilo gestito.
+<translation id="28458742190197992">Questa policy consente di controllare il reporting su cloud di <ph name="PRODUCT_NAME" /> per uno specifico profilo gestito.
 
-Se il criterio non viene configurato o viene impostato su Disabled, i dati non vengono raccolti o caricati.
-Se il criterio viene impostato su Enabled, i dati vengono raccolti e caricati sulla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
+Se la policy non viene configurata o viene impostata su Disabled, i dati non vengono raccolti o caricati.
+Se la policy viene impostata su Enabled, i dati vengono raccolti e caricati sulla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
-Il rapporto include informazioni sull'utilizzo e sullo stato del profilo, incluse, a titolo esemplificativo, la versione del sistema operativo, la versione del browser, le estensioni installate e i criteri applicati.
+Il rapporto include informazioni sull'utilizzo e sullo stato del profilo, incluse, a titolo esemplificativo, la versione del sistema operativo, la versione del browser, le estensioni installate e le policy applicate.
 
-Questo criterio può essere impostato soltanto come criterio relativo agli utenti cloud.</translation>
+Questa policy può essere impostata soltanto come policy relativa agli utenti cloud.</translation>
 <translation id="2846689894646472396">Velocità di controllo degli eventi di rete in millisecondi.</translation>
 <translation id="2847788524147474533">I criteri relativi al computer della piattaforma hanno la precedenza sui criteri relativi al cloud in ambito computer</translation>
 <translation id="2849051159985119151">Consenti l'editing di foto con AI generativa senza migliorare i modelli di AI.</translation>
@@ -2552,31 +2552,31 @@
 <translation id="2874983257003956579">Configura gli strumenti di gestione dei corsi</translation>
 <translation id="2875192972412983412">Consente di specificare il sottoinsieme di server di stampa a cui verranno inviate query sulle stampanti.
 
-      Se viene usato questo criterio, gli utenti avranno a disposizione soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio.
+      Se viene usata questa policy, gli utenti avranno a disposizione soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy.
 
-      Gli ID devono corrispondere al campo "id" del file specificato nel criterio <ph name="EXTERNAL_PRINT_SERVERS_POLICY" />.
+      Gli ID devono corrispondere al campo "id" del file specificato nella policy <ph name="EXTERNAL_PRINT_SERVERS_POLICY" />.
 
-      Se questo criterio non viene impostato, il filtro viene omesso e vengono presi in considerazione tutti i server di stampa.</translation>
+      Se questa policy non viene impostata, il filtro viene omesso e vengono presi in considerazione tutti i server di stampa.</translation>
 <translation id="2877225735001246144">Disabilita ricerca CNAME durante la negoziazione con Kerberos</translation>
-<translation id="288448261660192095">Se il criterio viene impostato su Attivato, i dispositivi di input e output fisici degli host di accesso remoto vengono disattivati durante una connessione remota.
+<translation id="288448261660192095">Se la policy viene impostata su Attivata, i dispositivi di input e output fisici degli host di accesso remoto vengono disattivati durante una connessione remota.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, sia gli utenti locali sia gli utenti remoti possono interagire con l'host quando viene condiviso.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, sia gli utenti locali sia gli utenti remoti possono interagire con l'host quando viene condiviso.</translation>
 <translation id="2884765974461416016">Disattiva la condivisione da Android alle app web.</translation>
 <translation id="2886215882246310669">Consente di stabilire se <ph name="PRODUCT_OS_NAME" /> permette o meno di aggiungere nuovi account utente Family Link al dispositivo.
-      Questo criterio è utile soltanto insieme al criterio <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />, che consente di autorizzare gli account Family Link oltre agli account definiti nella lista consentita.
-      Questo criterio non influisce sul comportamento di altri criteri di accesso. Nello specifico, non ha effetto se:
-      - Viene disattivata l'aggiunta di nuovi utenti al dispositivo tramite il criterio <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />.
-      - Viene consentita l'aggiunta di tutti gli utenti tramite il criterio <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />.
+      Questa policy è utile soltanto insieme alla policy <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />, che consente di autorizzare gli account Family Link oltre agli account definiti nella lista consentita.
+      Questa policy non influisce sul comportamento di altre policy di accesso. Nello specifico, non ha effetto se:
+      - Viene disattivata l'aggiunta di nuovi utenti al dispositivo tramite la policy <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />.
+      - Viene consentita l'aggiunta di tutti gli utenti tramite la policy <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />.
 
-      Se questo criterio viene impostato su falso o se non viene configurato, non verranno applicate regole aggiuntive per gli account Family Link.
-      Se questo criterio viene impostato su vero, verranno consentiti nuovi account utente Family Link oltre agli account definiti nel criterio <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />.</translation>
-<translation id="2886969306951284125">Se le app Android sono attive e il criterio viene impostato su Vero, i dispositivi registrati segnalano informazioni sullo stato di Android.
+      Se questa policy viene impostata su false o se non viene configurata, non verranno applicate regole aggiuntive per gli account Family Link.
+      Se questa policy viene impostata su true, verranno consentiti nuovi account utente Family Link oltre agli account definiti nella policy <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="2886969306951284125">Se le app Android sono attive e la policy viene impostata su True, i dispositivi registrati segnalano informazioni sullo stato di Android.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i dispositivi registrati non segnalano informazioni sullo stato di Android.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, i dispositivi registrati non segnalano informazioni sullo stato di Android.</translation>
 <translation id="288923520817177650">È consentita la creazione di sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> di <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2889842394011108075">window.webkitStorageInfo sarà disponibile.</translation>
 <translation id="2890645751406497668">Concede automaticamente a questi siti l'autorizzazione a connettersi a dispositivi USB usando gli ID fornitore e prodotto forniti.</translation>
-<translation id="2891049933730408118">La configurazione di questo criterio consente di specificare per quali origini consentire tutti gli schemi di autenticazione HTTP supportati da <ph name="PRODUCT_NAME" /> indipendentemente dal criterio <ph name="AUTH_SCHEMES_POLICY_NAME" />.
+<translation id="2891049933730408118">La configurazione di questa policy consente di specificare per quali origini consentire tutti gli schemi di autenticazione HTTP supportati da <ph name="PRODUCT_NAME" /> indipendentemente dalla policy <ph name="AUTH_SCHEMES_POLICY_NAME" />.
 
       Il pattern dell'URL deve avere il seguente formato (<ph name="URL_SCHEME_FORMAT_LINK" />). In <ph name="ALL_HTTP_AUTH_ALLOWED_FOR_ORIGINS_POLICY_NAME" /> possono essere definite fino a 1000 eccezioni.
       I caratteri jolly sono consentiti sia per l'intera origine sia per le sue parti, ovvero lo schema, l'host e la porta.</translation>
@@ -2584,12 +2584,12 @@
 <translation id="2893660462311365527">Velocità di raccolta della telemetria di rete in millisecondi.</translation>
 <translation id="2894914342151915910">Elimina avvisi quando Chrome viene eseguito su un sistema non supportato</translation>
 <translation id="2895444724612647239">Concedi automaticamente ai siti l'autorizzazione di connessione a qualsiasi dispositivo HID.</translation>
-<translation id="2896434627453256512">Se il criterio viene impostato su Attivato, la funzionalità di finestre nascoste viene attivata.
-      Se viene impostato su Vero, le finestre nascoste ARC vengono create prima dell'avvio di ARC e dopo un arresto anomalo o un riavvio in base all'impostazione di ripristino dell'app.
-      Se viene impostato su Falso, non viene creata alcuna finestra nascosta prima dell'avvio di ARC. Le app ARC vengono ripristinate dopo l'avvio di ARC</translation>
+<translation id="2896434627453256512">Se la policy viene impostata su Attivata, la funzionalità di finestre nascoste viene attivata.
+      Se viene impostata su True, le finestre nascoste ARC vengono create prima dell'avvio di ARC e dopo un arresto anomalo o un riavvio in base all'impostazione di ripristino dell'app.
+      Se viene impostata su False, non viene creata alcuna finestra nascosta prima dell'avvio di ARC. Le app ARC vengono ripristinate dopo l'avvio di ARC</translation>
 <translation id="2897716186959852329">Non consentire mai Leggi schermo</translation>
 <translation id="2899002520262095963">Le app Android possono utilizzare le configurazioni di rete e i certificati CA impostati tramite questa norma ma non hanno accesso ad alcune opzioni di configurazione.</translation>
-<translation id="2899213072616346687">Consente di limitare la modalità di stampa delle immagini di sfondo. Se il criterio non viene impostato non vengono applicate limitazioni.</translation>
+<translation id="2899213072616346687">Consente di limitare la modalità di stampa delle immagini di sfondo. Se la policy non viene impostata non vengono applicate limitazioni.</translation>
 <translation id="2899640611559504158">Disattiva l'accesso alla riga di comando delle macchine virtuali</translation>
 <translation id="290002216614278247">Questa norma consente di bloccare la sessione dell'utente in base al tempo del client o alla quota di utilizzo del giorno.
 
@@ -2611,64 +2611,64 @@
 <translation id="2908277604670530363">Numero massimo di connessioni simultanee al server proxy</translation>
 <translation id="2912366658685903301">Configura il colore del tema del browser</translation>
 <translation id="2914283793640833265">Non consentire l'attivazione della continuazione di attività Phone Hub</translation>
-<translation id="2915787312243722351">Questo criterio consente di controllare l'impostazione "Usa l'Avvio app/il tasto Ricerca per modificare il
+<translation id="2915787312243722351">Questa policy consente di controllare l'impostazione "Usa l'Avvio app/il tasto Ricerca per modificare il
 comportamento dei tasti funzione". Questa impostazione consente agli utenti di tenere premuto il tasto Avvio app
 per spostarsi tra i tasti funzione e i tasti della fila superiore del sistema.
 
-Se questo criterio non viene configurato, gli utenti possono scegliere liberamente il valore dell'impostazione "Usa
+Se questa policy non viene configurata, gli utenti possono scegliere liberamente il valore dell'impostazione "Usa
 l'Avvio app/il tasto Ricerca per modificare il comportamento dei tasti funzione".
-Se questo criterio viene disattivato, l'Avvio app/il tasto Ricerca non sarà in grado di
+Se questa policy viene disattivata, l'Avvio app/il tasto Ricerca non sarà in grado di
 modificare il comportamento dei tasti funzione e questa impostazione non sarà modificabile
 dagli utenti.
-Se questo criterio viene attivato, il l'Avvio app/il tasto Ricerca potrà modificare il
+Se questa policy viene attivata, il l'Avvio app/il tasto Ricerca potrà modificare il
 comportamento dei tasti funzione e questa impostazione non sarà modificabile dagli utenti.</translation>
 <translation id="291853569864365550">Non mostrare suggerimenti di contenuti nella pagina Nuova scheda</translation>
 <translation id="2920795918401557243">Questa impostazione consente di raccogliere dati di rilevamento del rendimento a livello di sistema usando il servizio di tracciamento del sistema.
 
-      Se questo criterio viene disattivato, l'utente non può raccogliere dati di rilevamento a livello di sistema usando il servizio di tracciamento del sistema.
-      Se questo criterio viene attivato, l'utente può raccogliere dati di rilevamento a livello di sistema usando il servizio di tracciamento del sistema.
-      Se non viene configurato, questo criterio viene disattivato per i dispositivi gestiti e attivato per i dispositivi di proprietà del consumatore.
-      Tieni presente che l'impostazione di questo criterio su Disattivato comporta soltanto la disattivazione della raccolta dei dati di rilevamento a livello di sistema. Questo criterio non ha effetto sulla raccolta dei dati di rilevamento del browser.</translation>
+      Se questa policy viene disattivata, l'utente non può raccogliere dati di rilevamento a livello di sistema usando il servizio di tracciamento del sistema.
+      Se questa policy viene attivata, l'utente può raccogliere dati di rilevamento a livello di sistema usando il servizio di tracciamento del sistema.
+      Se non viene configurata, questa policy viene disattivata per i dispositivi gestiti e attivato per i dispositivi di proprietà del consumatore.
+      Tieni presente che l'impostazione di questa policy su Disattivata comporta soltanto la disattivazione della raccolta dei dati di rilevamento a livello di sistema. Questa policy non ha effetto sulla raccolta dei dati di rilevamento del browser.</translation>
 <translation id="2922511125678964398">Consenti all'autenticazione captive portal di ignorare le impostazioni del proxy</translation>
 <translation id="2926813071464307947">Disabilita la sandbox del container dell'app del renderer</translation>
-<translation id="2931888116345994552">Se questo criterio non viene configurato o se viene impostato su Attivato, consente gli aggiornamenti di tutti i componenti di <ph name="PRODUCT_NAME" />.
+<translation id="2931888116345994552">Se questa policy non viene configurata o se viene impostata su Attivata, consente gli aggiornamenti di tutti i componenti di <ph name="PRODUCT_NAME" />.
 
-      Se viene impostato su Disattivato, gli aggiornamenti dei componenti vengono disattivati. Tuttavia, alcuni componenti sono esclusi da questo criterio: gli aggiornamenti dei componenti che non contengono codice eseguibile e che sono critici per la sicurezza del browser non verranno disattivati.
+      Se viene impostata su Disattivata, gli aggiornamenti dei componenti vengono disattivati. Tuttavia, alcuni componenti sono esclusi da questa policy: gli aggiornamenti dei componenti che non contengono codice eseguibile e che sono critici per la sicurezza del browser non verranno disattivati.
       Esempi di tali componenti includono gli elenchi revoche certificati e i filtri di sottorisorse.</translation>
-<translation id="2932796739547676677">Se il criterio viene impostato su Vero, per impostazione predefinita la tastiera virtuale ridimensiona l'area visibile del layout.
-      Altri stati (Falso/non impostato) non hanno effetto.
+<translation id="2932796739547676677">Se la policy viene impostata su True, per impostazione predefinita la tastiera virtuale ridimensiona l'area visibile del layout.
+      Altri stati (False/non impostato) non hanno effetto.
 
       Tieni presente che questo influisce solo sul comportamento di ridimensionamento predefinito: se una pagina richiede un comportamento specifico utilizzando un tag &lt;meta&gt; o l'API Virtual Keyboard, continuerà a essere applicato il comportamento richiesto.
 
-      Tieni inoltre presente che si tratta di un criterio "alternativo" destinato a essere di breve durata.
+      Tieni inoltre presente che si tratta di una policy "alternativa" destinata a essere di breve durata.
       </translation>
 <translation id="2939335382784544151">Abilita l'importazione della cronologia di navigazione alla prima esecuzione</translation>
-<translation id="2940127076681735544">Se per il criterio viene impostato un URL valido, <ph name="PRODUCT_NAME" /> scarica l'elenco dei siti da tale URL e applica le regole come se fossero state configurate con il criterio <ph name="SITELIST_POLICY_NAME" />.
+<translation id="2940127076681735544">Se per la policy viene impostata un URL valido, <ph name="PRODUCT_NAME" /> scarica l'elenco dei siti da tale URL e applica le regole come se fossero state configurate con la policy <ph name="SITELIST_POLICY_NAME" />.
 
-      Se il criterio non viene impostato (o se viene impostato un URL non valido), <ph name="PRODUCT_NAME" /> non usa il criterio come fonte di regole per il cambio di browser.
+      Se la policy non viene impostata (o se viene impostato un URL non valido), <ph name="PRODUCT_NAME" /> non usa la policy come fonte di regole per il cambio di browser.
 
-      Nota: questo criterio rimanda a un file XML nello stesso formato del criterio <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" />. Se viene impostato, le regole vengono caricate da un file XML senza essere condivise con <ph name="IE_PRODUCT_NAME" />. Leggi ulteriori informazioni sul criterio <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> (https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode)</translation>
+      Nota: questa policy rimanda a un file XML nello stesso formato della policy <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" />. Se viene impostata, le regole vengono caricate da un file XML senza essere condivise con <ph name="IE_PRODUCT_NAME" />. Leggi ulteriori informazioni sulla policy <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> (https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode)</translation>
 <translation id="2940284205859074236">Utilizza il renderer Skia per il rendering dei PDF</translation>
 <translation id="2940653651012844682">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />, che si attiva quando si verifica un evento di sicurezza in Chrome. Sono inclusi risultati negativi relativi ad analisi dei connettori di Enterprise, riutilizzo delle password, visite di pagine non sicure e altre azioni dell'utente critiche dal punto di vista della sicurezza.
 
       Il campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica il fornitore di servizi di report a cui corrispondono le impostazioni, mentre il campo <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> identifica quali eventi sono attivati per questo fornitore.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="2943242293289396843">App in pacchetto della versione precedente</translation>
-<translation id="2947111924404450461">L'impostazione di questo criterio consente di configurare le stampanti aziendali. Il formato corrisponde a quello del dizionario <ph name="NATIVE_PRINTERS_POLICY_NAME" />, con un campo <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base ai criteri <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="BULK_PRINTERS_WHITELIST" /> e <ph name="BULK_PRINTERS_BLACKLIST" />.
+<translation id="2947111924404450461">L'impostazione di questa policy consente di configurare le stampanti aziendali. Il formato corrisponde a quello del dizionario <ph name="NATIVE_PRINTERS_POLICY_NAME" />, con un campo <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base alle policy <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="BULK_PRINTERS_WHITELIST" /> e <ph name="BULK_PRINTERS_BLACKLIST" />.
 
-      Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi. È inteso come integrativo alla configurazione delle stampanti da parte dei singoli utenti.
+      Questa policy non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi. È intesa come integrativa alla configurazione delle stampanti da parte dei singoli utenti.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo.
+      Se la policy viene configurata, gli utenti non possono modificarla.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
-<translation id="2948268792364772890">Questo criterio consente a un amministratore di specificare che una pagina potrebbe inviare richieste XHR sincrone durante l'uscita dalla pagina.
+      Questa policy è deprecata. Usa la policy <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
+<translation id="2948268792364772890">Questa policy consente a un amministratore di specificare che una pagina potrebbe inviare richieste XHR sincrone durante l'uscita dalla pagina.
 
-      Se il criterio viene attivato, le pagine possono inviare richieste XHR sincrone durante l'uscita dalle pagine.
+      Se la policy viene attivata, le pagine possono inviare richieste XHR sincrone durante l'uscita dalle pagine.
 
-      Se il criterio viene disattivato o non viene impostato, le pagine non possono inviare richieste XHR sincrone durante l'uscita dalle pagine.
+      Se la policy viene disattivata o non viene impostata, le pagine non possono inviare richieste XHR sincrone durante l'uscita dalle pagine.
 
-      Questo criterio è stato rimosso in Chrome 99.
+      Questa policy è stata rimossa in Chrome 99.
 
       Visita la pagina https://www.chromestatus.com/feature/4664843055398912.</translation>
 <translation id="2952347049958405264">Limitazioni:</translation>
@@ -2676,7 +2676,7 @@
 
 Se un cookie è impostato per un dominio che corrisponde a uno dei filtri forniti, viene escluso dal trasferimento. I domini dei cookie vengono associati in base alle regole dei campi "host" descritte nella pagina https://support.google.com/chrome/a?p=url_blocklist_filter_format, tutti gli altri campi vengono ignorati. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-Il criterio <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_EXCEPTIONS_POLICY_NAME" /> ha la precedenza.</translation>
+La policy <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_EXCEPTIONS_POLICY_NAME" /> ha la precedenza.</translation>
 <translation id="2953447815703785478">Consente di specificare i certificati client a livello di dispositivo che dovrebbero essere registrati usando il
 protocollo di gestione del dispositivo.
 
@@ -2684,9 +2684,9 @@
 <translation id="2957506574938329824">Non consentire ad alcun sito di richiedere l'accesso ai dispositivi Bluetooth tramite l'API Web Bluetooth</translation>
 <translation id="2957513448235202597">Tipo di account per l'autenticazione <ph name="HTTP_NEGOTIATE" /></translation>
 <translation id="2959469725686993410">Invia sempre i punti di accesso Wi-Fi al server durante le operazioni per stabilire il fuso orario</translation>
-<translation id="2959527429632925933">Se questo criterio non esiste (ad esempio per gli utenti non gestiti), viene attivata la funzionalità delle connessioni SSH (Secure SHell) client in uscita in Terminal System App (il valore predefinito è True).
-      Se l'utente è gestito e il criterio non viene configurato o viene impostato su Disabled, la funzionalità viene disattivata in Terminal.
-      Se il criterio viene impostato su Enabled, gli utenti gestiti possono creare connessioni SSH client in uscita in Terminal.</translation>
+<translation id="2959527429632925933">Se questa policy non esiste (ad esempio per gli utenti non gestiti), viene attivata la funzionalità delle connessioni SSH (Secure SHell) client in uscita in Terminal System App (il valore predefinito è True).
+      Se l'utente è gestito e la policy non viene configurata o viene impostata su Disabled, la funzionalità viene disattivata in Terminal.
+      Se la policy viene impostata su Enabled, gli utenti gestiti possono creare connessioni SSH client in uscita in Terminal.</translation>
 <translation id="2959737282368424062">Consenti l'esecuzione di Native Client</translation>
 <translation id="2959898425599642200">Regole di bypass proxy</translation>
 <translation id="2960013482187484833">Utilizza la stampante usata più di recente come scelta predefinita in Anteprima di stampa</translation>
@@ -2697,53 +2697,53 @@
 <translation id="2962972237615992440">Viene disattivato il proxy <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2963292398266537394">Disattiva la dettatura</translation>
 <translation id="2964373560810620158">Impedisci agli utenti di usare il browser <ph name="LACROS_NAME" /></translation>
-<translation id="2968177167006045252">Consenti ai siti di utilizzare il criterio SharedArrayBuffers</translation>
+<translation id="2968177167006045252">Consenti ai siti di utilizzare la policy SharedArrayBuffers</translation>
 <translation id="2969489219271682844">Non mostrare notifiche quando vengono rilevati dispositivi USB</translation>
 <translation id="2969568582351417848">Disattiva gli avvisi relativi al download basati sulle estensioni dei tipi di file per tipi di file specifici sui domini</translation>
-<translation id="2969797921412053304">Questo criterio consente di configurare gli URL a cui verrà concesso l'accesso per usare l'attestazione remota dell'identità del dispositivo durante il flusso SAML nella schermata di accesso.
+<translation id="2969797921412053304">Questa policy consente di configurare gli URL a cui verrà concesso l'accesso per usare l'attestazione remota dell'identità del dispositivo durante il flusso SAML nella schermata di accesso.
 
-      Nello specifico, se un URL corrisponde a uno dei pattern specificati tramite questo criterio, l'URL potrà ricevere un'intestazione HTTP contenente una risposta a una richiesta di attestazione remota, che attesta l'identità e lo stato del dispositivo.
+      Nello specifico, se un URL corrisponde a uno dei pattern specificati tramite questa policy, l'URL potrà ricevere un'intestazione HTTP contenente una risposta a una richiesta di attestazione remota, che attesta l'identità e lo stato del dispositivo.
 
-      Se questo criterio non viene impostato o se l'elenco viene lasciato vuoto, nessun URL potrà usare l'attestazione remota nella schermata di accesso.
+      Se questa policy non viene impostata o se l'elenco viene lasciato vuoto, nessun URL potrà usare l'attestazione remota nella schermata di accesso.
 
       Gli URL devono avere uno schema HTTPS, ad esempio "https://example.com".
 
       Per informazioni dettagliate sui pattern URL validi, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation>
 <translation id="2971096666394658693">Il menu contestuale includerà una voce di menu per condividere le immagini con <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" />.</translation>
-<translation id="2973972555495515337">Se il criterio viene impostato su Attivato, le applicazioni web di terze parti possono usare <ph name="DESK_API_NAME" /> per salvare e condividere <ph name="PRODUCT_OS_NAME" /> scrivanie. Se il criterio viene impostato su Disattivato, l'utente non potrà salvare e condividere i dati delle scrivanie tramite l'<ph name="DESK_API_NAME" />. Se il criterio non viene configurato, viene applicato lo stesso comportamento del criterio disattivato. Il criterio verrà applicato soltanto sui dispositivi registrati.</translation>
+<translation id="2973972555495515337">Se la policy viene impostata su Attivata, le applicazioni web di terze parti possono usare <ph name="DESK_API_NAME" /> per salvare e condividere <ph name="PRODUCT_OS_NAME" /> scrivanie. Se la policy viene impostata su Disattivata, l'utente non potrà salvare e condividere i dati delle scrivanie tramite l'<ph name="DESK_API_NAME" />. Se la policy non viene configurata, viene applicato lo stesso comportamento della policy disattivata. La policy verrà applicata soltanto sui dispositivi registrati.</translation>
 <translation id="2976033779241323433">Attiva la tastiera virtuale touch in base all'euristica di sistema predefinita</translation>
 <translation id="2976429807269247880">Impostazioni del comportamento per i cookie <ph name="ATTRIBUTE_SAMESITE_NAME" /> precedenti</translation>
-<translation id="2977576137210520963">Se il criterio viene configurato, verrà specificato l'elenco di URL i cui pattern vengono confrontati con l'origine di sicurezza dell'URL richiedente. Una corrispondenza assicura l'accesso ai dispositivi di acquisizione audio senza richieste
+<translation id="2977576137210520963">Se la policy viene configurata, verrà specificato l'elenco di URL i cui pattern vengono confrontati con l'origine di sicurezza dell'URL richiedente. Una corrispondenza assicura l'accesso ai dispositivi di acquisizione audio senza richieste
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tieni presente, tuttavia, che il pattern "*", che corrisponde a qualsiasi URL, non è supportato da questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tieni presente, tuttavia, che il pattern "*", che corrisponde a qualsiasi URL, non è supportato da questa policy.</translation>
 <translation id="2979696534869541158">Forza implementazione precedente</translation>
 <translation id="2985927503455169394">Usa la modalità predefinita dell'esperienza di onboarding dell'assistente</translation>
 <translation id="2987155890997901449">Attiva ARC</translation>
 <translation id="2987227569419001736">Controlla l'utilizzo dell'API Web Bluetooth</translation>
 <translation id="2989404644164421834">Ricarica pagine</translation>
-<translation id="299446489108785864">Elenco di URL che specifica a quali URL verrà applicato il criterio <ph name="AUTO_OPEN_FILE_TYPES_POLICY_NAME" />. Questo criterio non influisce sui valori di apertura automatica impostati dagli utenti.
+<translation id="299446489108785864">Elenco di URL che specifica a quali URL verrà applicata la policy <ph name="AUTO_OPEN_FILE_TYPES_POLICY_NAME" />. Questa policy non influisce sui valori di apertura automatica impostati dagli utenti.
 
-      Se il criterio viene impostato, i file verranno aperti automaticamente in base al criterio soltanto se l'URL fa parte di questo insieme e il tipo di file è elencato nel criterio <ph name="AUTO_OPEN_FILE_TYPES_POLICY_NAME" />. Se una delle condizioni è falsa, i file scaricati non verranno aperti automaticamente in base al criterio.
+      Se la policy viene impostata, i file verranno aperti automaticamente in base alla policy soltanto se l'URL fa parte di questo insieme e il tipo di file è elencato nella policy <ph name="AUTO_OPEN_FILE_TYPES_POLICY_NAME" />. Se una delle condizioni è falsa, i file scaricati non verranno aperti automaticamente in base alla policy.
 
-      Se il criterio non viene configurato, tutti i file scaricati con tipo di file indicato nel criterio <ph name="AUTO_OPEN_FILE_TYPES_POLICY_NAME" /> verranno aperti automaticamente.
+      Se la policy non viene configurata, tutti i file scaricati con tipo di file indicato nella policy <ph name="AUTO_OPEN_FILE_TYPES_POLICY_NAME" /> verranno aperti automaticamente.
 
       Un pattern URL deve essere nel formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation>
 <translation id="3000238720665173643">Un flag booleano che indica se la tastiera sullo schermo può offrire la funzionalità di correzione automatica.</translation>
-<translation id="3001285126226650303">Consente a <ph name="PRODUCT_NAME" /> di caricare criteri sperimentali.
+<translation id="3001285126226650303">Consente a <ph name="PRODUCT_NAME" /> di caricare policy sperimentali.
 
-        AVVISO: i criteri sperimentali non sono supportati e sono soggetti a modifiche o a rimozione senza preavviso nella versione successiva del browser.
+        AVVISO: le policy sperimentali non sono supportate e sono soggette a modifiche o a rimozione senza preavviso nella versione successiva del browser.
 
-        Un criterio sperimentale può non essere completo o avere ancora problemi noti o sconosciuti. Può essere modificato o anche rimosso senza preavviso. Se attivi i criteri sperimentali, potresti perdere i dati del browser oppure compromettere la tua sicurezza o privacy.
+        Una policy sperimentale può non essere completa o avere ancora problemi noti o sconosciuti. Può essere modificata o anche rimossa senza preavviso. Se attivi le policy sperimentali, potresti perdere i dati del browser oppure compromettere la tua sicurezza o privacy.
 
-        Se un criterio non è nell'elenco e non è stato pubblicato ufficialmente, il suo valore verrà ignorato sui canali beta e stabile.
+        Se una policy non è nell'elenco e non è stato pubblicata ufficialmente, il suo valore verrà ignorato sui canali beta e stabile.
 
-        Se un criterio è nell'elenco e non è stato pubblicato ufficialmente, il suo valore verrà applicato.
+        Se una policy è nell'elenco e non è stato pubblicata ufficialmente, il suo valore verrà applicato.
 
-        Il criterio non ha effetto su quelli già pubblicati.</translation>
+        La policy non ha effetto su quelle già pubblicati.</translation>
 <translation id="3002067315837777719">Non consentire l'attivazione delle notifiche Phone Hub</translation>
 <translation id="3003490107503207900">Forza il download dei documenti Office (ad esempio .docx) anziché aprirli in <ph name="BASIC_EDITOR_NAME" /></translation>
-<translation id="300673820739371513">Questo criterio consente di stabilire se nelle pagine web vengono rilevate entità di testo normale, consentendo agli utenti di attivare azioni contestuali interagendo con loro.
-Il criterio ha più proprietà, una per ogni tipo di entità.
+<translation id="300673820739371513">Questa policy consente di stabilire se nelle pagine web vengono rilevate entità di testo normale, consentendo agli utenti di attivare azioni contestuali interagendo con loro.
+La policy ha più proprietà, una per ogni tipo di entità.
 I tipi di entità sono <ph name="DEFAULT_ENUM_VALUE" />, <ph name="ADDRESS_ENUM_VALUE" />…
 
 Se il valore di un'entità non viene impostato, viene applicato il comportamento dell'entità <ph name="DEFAULT_ENUM_VALUE" />.
@@ -2759,7 +2759,7 @@
 <translation id="3016585641676676461">Blocca lo schermo intero automatico su questi siti</translation>
 <translation id="3017578958356048910">Il visualizzatore PDF può aggiungere annotazioni nei PDF</translation>
 <translation id="3020623128585817424">Disattiva il controllo del browser predefinito all'avvio</translation>
-<translation id="3020953534071988875">Se configuri questo criterio, l'autenticazione ambientale verrà attivata o disattivata per i profili Ospite e in modalità in incognito in <ph name="PRODUCT_NAME" />.
+<translation id="3020953534071988875">Se configuri questa policy, l'autenticazione ambientale verrà attivata o disattivata per i profili Ospite e in modalità in incognito in <ph name="PRODUCT_NAME" />.
 
       L'autenticazione ambientale è l'autenticazione http con credenziali predefinite, se non sono fornite credenziali esplicite tramite schemi NTLM/Kerberos/Negotiate challenge/response.
 
@@ -2773,19 +2773,19 @@
 
       Tieni presente che l'autenticazione ambientale è sempre consentita per i profili standard.
 
-      Se nella versione 81 e nelle versioni successive di <ph name="PRODUCT_NAME" /> questo criterio non viene impostato, l'autenticazione ambientale sarà consentita soltanto nelle sessioni standard.</translation>
+      Se nella versione 81 e nelle versioni successive di <ph name="PRODUCT_NAME" /> questa policy non viene impostata, l'autenticazione ambientale sarà consentita soltanto nelle sessioni standard.</translation>
 <translation id="3021562480854470924">Numero di obiettivi consentiti per il rollback</translation>
 <translation id="3023572080620427845">URL di un file XML che contiene gli URL da caricare su un browser alternativo.</translation>
 <translation id="302528139996622624">Impostazioni immagini</translation>
 <translation id="3026740867910702435">Consente di attivare la funzione di accessibilità del puntatore grande nella schermata di accesso.
 
-          Se questo criterio viene impostato su true, il puntatore grande sarà sempre attivo nella schermata di accesso.
+          Se questa policy viene impostata su true, il puntatore grande sarà sempre attivo nella schermata di accesso.
 
-          Se questo criterio viene impostato su false, il puntatore grande sarà sempre disattivato nella schermata di accesso.
+          Se questa policy viene impostata su false, il puntatore grande sarà sempre disattivato nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente il puntatore grande è disattivato nella schermata di accesso, ma l'utente può attivarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente il puntatore grande è disattivato nella schermata di accesso, ma l'utente può attivarlo in qualsiasi momento.</translation>
 <translation id="3028201032688933333">Questa policy consente di stabilire se all'utente è consentito scegliere file direttamente da <ph name="GOOGLE_DRIVE_NAME" /> quando un sito web contiene un modulo in cui è possibile inviare file.
 Se la policy viene impostata su "Mostra l'opzione <ph name="GOOGLE_DRIVE_NAME" />" (0) o se non viene configurata, l'utente può scegliere i file da <ph name="GOOGLE_DRIVE_NAME" /> nel menu di selezione dei file.
 Se la policy viene impostata su "Nascondi l'opzione <ph name="GOOGLE_DRIVE_NAME" />" (1), l'opzione <ph name="GOOGLE_DRIVE_NAME" /> viene nascosta nel menu di selezione dei file.
@@ -2793,28 +2793,28 @@
 <translation id="3030000825273123558">Attiva rapporti sulle metriche</translation>
 <translation id="30300807616984726">Consente di generare report sui dati dell'inventario per app per gli utenti affiliati.
 
-      La configurazione del criterio consente di controllare la generazione di report sugli eventi relativi a installazione, avvio e disinstallazione delle app per i tipi di app specificati.
-      Se il criterio non viene configurato, non verranno generati report sugli eventi delle app.</translation>
-<translation id="3030232909811556512">Se questo criterio è disattivato, non è possibile impostare l'immagine dell'avatar di <ph name="PRODUCT_OS_NAME" /> utilizzando file locali, la fotocamera del dispositivo o l'immagine del profilo Google dell'utente.
+      La configurazione della policy consente di controllare la generazione di report sugli eventi relativi a installazione, avvio e disinstallazione delle app per i tipi di app specificati.
+      Se la policy non viene configurata, non verranno generati report sugli eventi delle app.</translation>
+<translation id="3030232909811556512">Se questa policy è disattivata, non è possibile impostare l'immagine dell'avatar di <ph name="PRODUCT_OS_NAME" /> utilizzando file locali, la fotocamera del dispositivo o l'immagine del profilo Google dell'utente.
 
-L'utente può impostare l'immagine avatar da una di queste opzioni se questo criterio viene attivato o se non viene configurato.</translation>
+L'utente può impostare l'immagine avatar da una di queste opzioni se questa policy viene attivata o se non viene configurata.</translation>
 <translation id="3031796805169553856">Consenti che i moduli WebAssembly vengano inviati tra origini</translation>
 <translation id="3032322294267258117">Consente di gestire le impostazioni degli utenti autenticati tramite GAIA senza SAML.</translation>
-<translation id="3034855514833090741">Se il criterio viene impostato su Attivato, il flusso Voice Match dell'Assistente Google viene mostrato durante la configurazione iniziale. Se il criterio viene impostato su Disattivato, l'Assistente Google non mostrerà il flusso Voice Match durante la configurazione iniziale.
+<translation id="3034855514833090741">Se la policy viene impostata su Attivata, il flusso Voice Match dell'Assistente Google viene mostrato durante la configurazione iniziale. Se la policy viene impostata su Disattivata, l'Assistente Google non mostrerà il flusso Voice Match durante la configurazione iniziale.
 
-      Se il criterio non viene impostato, significa che è Attivato.</translation>
+      Se la policy non viene impostata, significa che è Attivata.</translation>
 <translation id="3036271748813538143">Consente di controllare se il nuovo comportamento del parser HTML per l'elemento &lt;select&gt; è attivato</translation>
 <translation id="3038323923255997294">Continua a eseguire applicazioni in background dopo la chiusura di <ph name="PRODUCT_NAME" /></translation>
 <translation id="3039862327847526651">Controlla l'utilizzo delle ottimizzazioni di JavaScript</translation>
-<translation id="3041887182529293512">Se il criterio viene impostato su True o non viene impostato, nella pagina Nuova scheda vengono visualizzati suggerimenti di contenuti generati automaticamente in base alla cronologia di navigazione, agli interessi o alla posizione dell'utente.
+<translation id="3041887182529293512">Se la policy viene impostata su True o non viene impostata, nella pagina Nuova scheda vengono visualizzati suggerimenti di contenuti generati automaticamente in base alla cronologia di navigazione, agli interessi o alla posizione dell'utente.
 
-      Se il criterio viene impostato su False, i suggerimenti di contenuti generati automaticamente non vengono visualizzati nella pagina Nuova scheda.</translation>
+      Se la policy viene impostata su False, i suggerimenti di contenuti generati automaticamente non vengono visualizzati nella pagina Nuova scheda.</translation>
 <translation id="3046192273793919231">Invia pacchetti di rete al server di gestione per monitorare lo stato online</translation>
-<translation id="3046917616600522016">L'impostazione del criterio consente di configurare le impostazioni del proxy per Chrome e le app ARC, ignorando tutte le opzioni relative al proxy specificate dalla riga di comando.
+<translation id="3046917616600522016">L'impostazione della policy consente di configurare le impostazioni del proxy per Chrome e le app ARC, ignorando tutte le opzioni relative al proxy specificate dalla riga di comando.
 
-Se il criterio non viene configurato, gli utenti possono scegliere le impostazioni del proxy.
+Se la policy non viene configurata, gli utenti possono scegliere le impostazioni del proxy.
 
-L'impostazione del criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> consente di accettare i seguenti campi:
+L'impostazione della policy <ph name="PROXY_SETTINGS_POLICY_NAME" /> consente di accettare i seguenti campi:
          * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, che consente di specificare il server proxy utilizzato da Chrome e impedisce agli utenti di modificare le impostazioni del proxy
          * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />, un URL a un file proxy .pac o uno script PAC codificato come URL di dati con tipo MIME application/x-ns-proxy-autoconfig
          * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, che impedisce allo stack di rete di eseguire il fallback alle connessioni dirette con script PAC non valido o non disponibile
@@ -2840,15 +2840,15 @@
 Questa norma è facoltativa. Se non viene impostata, non verrà effettuata alcuna sostituzione dei termini di ricerca.
 
 Questa norma viene rispettata soltanto se viene attivata la norma "DefaultSearchProviderEnabled".</translation>
-<translation id="3049115011983576556">Se il criterio viene configurato, puoi elencare i pattern URL che specificano i siti che possono chiedere agli utenti l'autorizzazione di accesso a una porta seriale.
+<translation id="3049115011983576556">Se la policy viene configurata, puoi elencare i pattern URL che specificano i siti che possono chiedere agli utenti l'autorizzazione di accesso a una porta seriale.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      Per i pattern URL che non presentano corrispondenze con il criterio <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> (se una corrispondenza è presente), <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> (se configurato) o le impostazioni personali degli utenti hanno la precedenza in questo ordine.
+      Per i pattern URL che non presentano corrispondenze con la policy <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> (se una corrispondenza è presente), <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" /> (se configurata) o le impostazioni personali degli utenti hanno la precedenza in questo ordine.
 
-      I pattern URL non devono essere in conflitto con <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="305106159605171619">Riduzione dello user agent disattivata e non attivata da Field-Trials o Origin-Trials.</translation>
 <translation id="3053265701996417839">Microsoft Windows 7</translation>
 <translation id="3057459316145779761">Non consentire l'utilizzo di Chrome for Testing</translation>
@@ -2859,14 +2859,14 @@
 <translation id="3067462824622454143">Consenti agli utenti di decidere se il dispositivo deve bloccarsi quando viene sospeso o il coperchio viene chiuso</translation>
 <translation id="3070119171976169951">Impedisci la visualizzazione di immagini di terze parti in un prompt di autenticazione</translation>
 <translation id="3072045631333522102">Salvaschermo da utilizzare nella schermata di accesso in modalità retail</translation>
-<translation id="3072788420987305247">Se il criterio viene impostato su Attivato o se non viene configurato, i controlli multimediali vengono visualizzati nella schermata di blocco se gli utenti bloccano il dispositivo durante la riproduzione dei contenuti.
+<translation id="3072788420987305247">Se la policy viene impostata su Attivata o se non viene configurata, i controlli multimediali vengono visualizzati nella schermata di blocco se gli utenti bloccano il dispositivo durante la riproduzione dei contenuti.
 
-      Se viene impostato su Disattivato, i controlli multimediali nella schermata di blocco vengono disattivati.</translation>
+      Se viene impostata su Disattivata, i controlli multimediali nella schermata di blocco vengono disattivati.</translation>
 <translation id="3072847235228302527">Imposta i Termini di servizio di un account locale del dispositivo</translation>
 <translation id="3074032542020543133">Canale LTS</translation>
 <translation id="3074886258920642791">Attiva la tastiera virtuale di accessibilità nella schermata di accesso</translation>
 <translation id="3077650998740742747">
-Comportamento predefinito (Criterio non impostato)
+Comportamento predefinito (Policy non impostata)
 Quando viene aggiunto un account nell'area dei contenuti, potrebbe essere visualizzata una piccola finestra di dialogo che chiede all'utente di creare un nuovo profilo. Questa finestra di dialogo è ignorabile.
 
 <ph name="MANAGED_ACCOUNTS_SIGNIN_RESTRICTION_POLICY_NAME" /> = <ph name="POLICY_VALUE_PRIMARY_ACCOUNT" />
@@ -2889,62 +2889,62 @@
 <translation id="3083259245974004342">Protezione della password</translation>
 <translation id="308356121098374167">WebSQL in contesti non sicuri sarà disponibile.</translation>
 <translation id="3086995894968271156">Consente di configurare Cast Receiver in <ph name="PRODUCT_NAME" />.</translation>
-<translation id="3087346703976541109">Consente di specificare se il criterio SharedArrayBuffers può essere utilizzato in un contesto isolato da tutte le origini</translation>
+<translation id="3087346703976541109">Consente di specificare se la policy SharedArrayBuffers può essere utilizzata in un contesto isolato da tutte le origini</translation>
 <translation id="3088557424854005813">Attestazione</translation>
 <translation id="3090283903269516279">Disattiva il modello di ricarica adattiva su <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="3091832372132789233">Carica la batteria dei dispositivi che sono principalmente collegati a una fonte di alimentazione esterna.</translation>
 <translation id="3092059499596000593">Usa la stampante di sistema come scelta predefinita in Anteprima di stampa</translation>
-<translation id="309416443108680956">Consente di specificare cosa succede quando un utente che sta effettuando l'autenticazione tramite un token di sicurezza (ad esempio con una smart card) rimuove il token durante una sessione. <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_IGNORE" />: non accade nulla. <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" />: lo schermo viene bloccato finché l'utente non ripete l'autenticazione. <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" />: la sessione viene terminata e l'utente viene disconnesso. Se questo criterio non viene configurato, per impostazione predefinita viene usata l'opzione <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_IGNORE" />.</translation>
+<translation id="309416443108680956">Consente di specificare cosa succede quando un utente che sta effettuando l'autenticazione tramite un token di sicurezza (ad esempio con una smart card) rimuove il token durante una sessione. <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_IGNORE" />: non accade nulla. <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" />: lo schermo viene bloccato finché l'utente non ripete l'autenticazione. <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" />: la sessione viene terminata e l'utente viene disconnesso. Se questa policy non viene configurata, per impostazione predefinita viene usata l'opzione <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_IGNORE" />.</translation>
 <translation id="3096595567015595053">Elenco dei plug-in attivati</translation>
 <translation id="309885424548342662">Attiva l'autenticazione cloud di Microsoft®</translation>
 <translation id="3101035417394748390">Le dimensioni massime, in byte, che è possibile trasferire tra client e host tramite la sincronizzazione degli appunti</translation>
 <translation id="3101501961102569744">Scegli come specificare le impostazioni del server proxy</translation>
 <translation id="3101709781009526431">Data e ora</translation>
-<translation id="3105764289283669411">Questo criterio consente di stabilire se i metodi di richiesta sono in maiuscolo quando corrispondono alle intestazioni della risposta <ph name="ACAM_HEADER_NAME" /> in preflight <ph name="CORS" />.
+<translation id="3105764289283669411">Questa policy consente di stabilire se i metodi di richiesta sono in maiuscolo quando corrispondono alle intestazioni della risposta <ph name="ACAM_HEADER_NAME" /> in preflight <ph name="CORS" />.
 
-Se il criterio viene disattivato, i metodi di richiesta sono in maiuscolo.
+Se la policy viene disattivata, i metodi di richiesta sono in maiuscolo.
 Questo è il comportamento su <ph name="PRODUCT_NAME" /> 108 o versioni precedenti.
 
-Se il criterio viene attivato o se non viene configurato, i metodi di richiesta non sono in maiuscolo, a meno che non ci sia distinzione tra maiuscole e minuscole con <ph name="DELETE_METHOD_NAME" />, <ph name="GET_METHOD_NAME" />, <ph name="HEAD_METHOD_NAME" />, <ph name="OPTIONS_METHOD_NAME" />, <ph name="POST_METHOD_NAME" /> o <ph name="PUT_METHOD_NAME" />.
+Se la policy viene attivata o se non viene configurata i metodi di richiesta non sono in maiuscolo, a meno che non ci sia distinzione tra maiuscole e minuscole con <ph name="DELETE_METHOD_NAME" />, <ph name="GET_METHOD_NAME" />, <ph name="HEAD_METHOD_NAME" />, <ph name="OPTIONS_METHOD_NAME" />, <ph name="POST_METHOD_NAME" /> o <ph name="PUT_METHOD_NAME" />.
 L'intestazione della risposta <ph name="REJECTED_CASE" /> verrebbe rifiutata
 e verrebbe accettata invece <ph name="ACCEPTED_CASE" />.
 
 Nota: i metodi di richiesta <ph name="POST_LOWERCASE_METHOD_NAME" /> e <ph name="PUT_LOWERCASE_METHOD_NAME" /> non sono interessati, mentre <ph name="PATCH_LOWERCASE_METHOD_NAME" /> lo è.
 
-Questo criterio è stato pensato per essere temporaneo e verrà rimosso in futuro.</translation>
-<translation id="3110248563985502478">Questo criterio è deprecato in M88 e Flash non è più supportato da Chrome. Se il criterio viene impostato su Attivato, i plug-in obsoleti vengono utilizzati come normali plug-in. Se viene impostato su Disattivato, i plug-in obsoleti non vengono utilizzati.
+Questa policy è stata pensata per essere temporanea e verrà rimossa in futuro.</translation>
+<translation id="3110248563985502478">Questa policy è deprecata in M88 e Flash non è più supportato da Chrome. Se la policy viene impostata su Attivata, i plug-in obsoleti vengono utilizzati come normali plug-in. Se viene impostata su Disattivata, i plug-in obsoleti non vengono utilizzati.
 
-      Se non viene configurato, agli utenti viene richiesta l'autorizzazione per eseguire i plug-in obsoleti.</translation>
-<translation id="3110373701407677290">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che acquisiscono schede aventi la stessa origine.
+      Se non viene configurata, agli utenti viene richiesta l'autorizzazione per eseguire i plug-in obsoleti.</translation>
+<translation id="3110373701407677290">Se la policy viene configurata, puoi impostare un elenco di pattern URL che acquisiscono schede aventi la stessa origine.
 
-      Se non viene configurato, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
+      Se non viene configurata, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
 
       Tieni presente che le app di Chrome con finestre aventi la stessa origine di questo sito potranno ancora essere acquisite.
 
-      Se un sito corrisponde a un pattern URL in questo criterio, i seguenti criteri non saranno presi in considerazione: <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />.
+      Se un sito corrisponde a un pattern URL in questa policy, le seguenti policy non saranno prese in considerazione: <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
 <translation id="3112501357749061018">Un elenco di certificati TLS che <ph name="PRODUCT_NAME" /> deve considerare attendibili per l'autenticazione del server, con vincoli aggiunti al di fuori del certificato. Se non è presente alcun vincolo di un determinato tipo, è consentito qualsiasi nome di quel tipo.
 I certificati devono essere codificati in base64. È necessario specificare almeno un vincolo per ogni certificato.</translation>
 <translation id="3118552207903834734">Consente a un utente di configurare il nome host del suo dispositivo</translation>
 <translation id="3122082892722698079">Controlla l'utilizzo delle eccezioni per i contenuti non sicuri</translation>
 <translation id="3125472566440502628">Disattiva Seleziona per ascoltare</translation>
-<translation id="312561239664885970">Questo criterio è deprecato ed è stato suddiviso in <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />, <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
+<translation id="312561239664885970">Questa policy è deprecata ed è stata suddivisa in <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />, <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
 
 Attiva <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL.
 
-La configurazione di questo criterio consente di specificare gli URL che <ph name="PRODUCT_NAME" /> fornirà per avviare il flusso di attestazione. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
+La configurazione di questa policy consente di specificare gli URL che <ph name="PRODUCT_NAME" /> fornirà per avviare il flusso di attestazione. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
 
-Se questo criterio non viene impostato o se viene lasciato vuoto, nessun sito web potrà avviare il flusso di attestazione o ricevere indicatori dal dispositivo.
+Se questa policy non viene impostata o se viene lasciata vuota, nessun sito web potrà avviare il flusso di attestazione o ricevere indicatori dal dispositivo.
 
-Per <ph name="PRODUCT_OS_NAME" />, questo criterio è correlato all'attestazione remota, in cui un certificato viene generato e caricato automaticamente sul server. Per utilizzare il flusso di attestazione nella schermata di accesso del dispositivo, utilizza il criterio <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
+Per <ph name="PRODUCT_OS_NAME" />, questa policy è correlata all'attestazione remota, in cui un certificato viene generato e caricato automaticamente sul server. Per utilizzare il flusso di attestazione nella schermata di accesso del dispositivo, utilizza la policy <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
 
 Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation>
 <translation id="3126229421659523563">In modalità kiosk, consente di controllare se visualizzare o meno il menu Accessibilità mobile.
 
-Se il criterio è impostato su Attivato, il menu Accessibilità mobile verrà mostrato sempre.
+Se la policy è impostata su Attivata, il menu Accessibilità mobile verrà mostrato sempre.
 
-Se il criterio è impostato su Disattivato o non è impostato, il menu Accessibilità mobile non verrà mai mostrato.</translation>
+Se la policy è impostata su Disattivata o non è impostata, il menu Accessibilità mobile non verrà mai mostrato.</translation>
 <translation id="3126748868885248792">Il pulsante destro è il principale</translation>
 <translation id="3128072319047570212">Impostazioni keygen</translation>
 <translation id="3131703464330936425">Non consentire il roaming dei dati mobili</translation>
@@ -2952,53 +2952,53 @@
 
       Se questa impostazione viene disattivata, gli utenti non potranno sincronizzare le configurazioni di reti Wi-Fi.
 
-      Questa funzionalità dipende dall'attivazione del tipo di dati <ph name="WIFI_CONFIGURATIONS_DATATYPE_NAME" /> in <ph name="CHROME_SYNC_NAME" />. Questa funzionalità non verrà attivata se il tipo di dati <ph name="WIFI_CONFIGURATIONS_DATATYPE_NAME" /> viene disattivato nel criterio <ph name="SYNC_TYPES_LIST_DISABLED_POLICY_NAME" /> o se viene disattivata la funzionalità <ph name="CHROME_SYNC_NAME" /> nel criterio <ph name="SYNC_DISABLED_POLICY_NAME" />.
+      Questa funzionalità dipende dall'attivazione del tipo di dati <ph name="WIFI_CONFIGURATIONS_DATATYPE_NAME" /> in <ph name="CHROME_SYNC_NAME" />. Questa funzionalità non verrà attivata se il tipo di dati <ph name="WIFI_CONFIGURATIONS_DATATYPE_NAME" /> viene disattivato nella policy <ph name="SYNC_TYPES_LIST_DISABLED_POLICY_NAME" /> o se viene disattivata la funzionalità <ph name="CHROME_SYNC_NAME" /> nella policy <ph name="SYNC_DISABLED_POLICY_NAME" />.
 
-      Se questo criterio non viene configurato, per impostazione predefinita la funzionalità non è consentita per gli utenti gestiti.</translation>
+      Se questa policy non viene configurata, per impostazione predefinita la funzionalità non è consentita per gli utenti gestiti.</translation>
 <translation id="3136550518935590587">Concedi automaticamente a questi siti l'autorizzazione a connettersi a dispositivi HID usando gli ID fornitore e prodotto indicati nella schermata di accesso.</translation>
 <translation id="3138514192363246220">Disattiva il recupero dei metadati di caricamento delle pagine e dei modelli di machine learning che migliorano l'esperienza di navigazione</translation>
-<translation id="3142410959002029864">La configurazione di questo criterio consente di sostituire la modalità di stampa fronte/retro predefinita. Se la modalità non è disponibile, questo criterio viene ignorato.</translation>
+<translation id="3142410959002029864">La configurazione di questa policy consente di sostituire la modalità di stampa fronte/retro predefinita. Se la modalità non è disponibile, questa policy viene ignorata.</translation>
 <translation id="3143203373436771188">Quando si accede a documenti Office gestiti da <ph name="BASIC_EDITOR_NAME" />, aprili in <ph name="BASIC_EDITOR_NAME" /></translation>
-<translation id="3144173889708944482">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLOCKLIST" />, la configurazione del criterio <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. Gli utenti avranno a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questo criterio. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
+<translation id="3144173889708944482">Se per la policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLOCKLIST" />, la configurazione della policy <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. Gli utenti avranno a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questa policy. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3146711617256415776">Non consentire le voci di sintesi vocale di rete migliorate durante l'utilizzo di Seleziona per ascoltare</translation>
 <translation id="3150351525324499342">Non mostrare l'icona <ph name="PRODUCT_NAME" /> nella barra degli strumenti per impostazione predefinita, ma lascia la scelta agli utenti</translation>
 <translation id="3152135410085709340">Consenti l'accesso ai file locali per gli URL file:// su questi siti nel visualizzatore PDF</translation>
 <translation id="3152425128389603870">Rendi disponibile la modalità Desktop unificato e attivala per impostazione predefinita</translation>
 <translation id="3159375329008977062">L'utente è abilitato a importare/esportare contenitori Crostini tramite l'interfaccia</translation>
-<translation id="3163167792874598128">Se il criterio non viene configurato o se viene impostato su Enabled, la promozione di valutazione dell'App Store potrebbe essere mostrata all'utente al massimo una volta all'anno.
-Se viene impostato su Disabled, la promozione di valutazione dell'App Store non verrà mostrata all'utente.</translation>
+<translation id="3163167792874598128">Se la policy non viene configurata o se viene impostata su Enabled, la promozione di valutazione dell'App Store potrebbe essere mostrata all'utente al massimo una volta all'anno.
+Se viene impostata su Disabled, la promozione di valutazione dell'App Store non verrà mostrata all'utente.</translation>
 <translation id="3164531087779621747">Modalità di stampa PostScript</translation>
 <translation id="3165808775394012744">Queste norme sono incluse qui in modo che sia più facile rimuoverle.</translation>
 <translation id="3166210414652928099">Consenti all'utente di usare app Android di fonti non attendibili</translation>
 <translation id="316778957754360075">Questa impostazione non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_NAME" />. Il metodo consigliato per la configurazione di raccolte di estensioni/app ospitate dall'organizzazione consiste nell'includere il sito che ospita i pacchetti CRX in ExtensionInstallSources e inserire link di download diretti per i pacchetti in una pagina web. È possibile creare una funzione Avvio applicazioni per la pagina web utilizzando la norma ExtensionInstallForcelist.</translation>
-<translation id="3168303368727724798">Se il criterio viene configurato, puoi elencare i pattern URL che specificano i siti che possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo USB.
+<translation id="3168303368727724798">Se la policy viene configurata, puoi elencare i pattern URL che specificano i siti che possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo USB.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      I pattern URL non devono essere in conflitto con <ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="3168968618972302728">Criteri relativi all'autenticazione per Kerberos.</translation>
 <translation id="3169872426103732947">Visualizza l'URL predefinito, consenti agli utenti di passare all'URL completo</translation>
 <translation id="3171369832001535378">Modello del nome host della rete del dispositivo</translation>
-<translation id="3173844121395372156">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="NATIVE_MESSAGING_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="3173844121395372156">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="NATIVE_MESSAGING_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="3177537290334203187">Usa il comportamento predefinito quando determini se i siti web possono effettuare richieste agli endpoint di rete.</translation>
 <translation id="3177802893484440532">Richiedi controlli OCSP/CRL online per i trust anchor</translation>
 <translation id="3179533009079100620">Mostra Selettore profilo</translation>
-<translation id="3180633260411794645">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono eseguire JavaScript.
+<translation id="3180633260411794645">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che non possono eseguire JavaScript.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_JAVA_SCRIPT_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_JAVA_SCRIPT_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-      Tieni presente che questo criterio blocca JavaScript in base alla corrispondenza dell'origine del documento di primo livello (di solito l'URL della pagina visualizzato anche nella barra degli indirizzi) a uno dei due pattern. Pertanto, questo criterio non è adatto per mitigare gli attacchi alla catena di fornitura web. Ad esempio, se fornisci il pattern "https://[*.]foo.com/", non impedirai a una pagina ospitata su https://example.com, ad esempio, di eseguire uno script caricato da https://www.foo.com/example.js. Inoltre, l'inserimento del pattern "https://example.com/" non impedisce a un documento di https://example.com di eseguire script se non è il documento di primo livello, ma è incorporato come frame secondario in una pagina ospitata su un'altra origine, come https://www.bar.com.</translation>
+      Tieni presente che questa policy blocca JavaScript in base alla corrispondenza dell'origine del documento di primo livello (di solito l'URL della pagina visualizzato anche nella barra degli indirizzi) a uno dei due pattern. Pertanto, questa policy non è adatta per mitigare gli attacchi alla catena di fornitura web. Ad esempio, se fornisci il pattern "https://[*.]foo.com/", non impedirai a una pagina ospitata su https://example.com, ad esempio, di eseguire uno script caricato da https://www.foo.com/example.js. Inoltre, l'inserimento del pattern "https://example.com/" non impedisce a un documento di https://example.com di eseguire script se non è il documento di primo livello, ma è incorporato come frame secondario in una pagina ospitata su un'altra origine, come https://www.bar.com.</translation>
 <translation id="3181114468897395940">Le impostazioni di Pagina su/Pagina giù usano la scorciatoia che contiene il tasto di modifica Alt</translation>
 <translation id="3182503302060513467">Nella pagina Nuova scheda verrà mostrata la comunicazione dell'area centrale, se è disponibile</translation>
 <translation id="3184161739683646075">Controlla la modalità di DNS over HTTPS</translation>
 <translation id="3184309751910415763">Lista consentita che controlla i report sull'attività dei siti web per gli utenti affiliati.
 
-La configurazione del criterio consente di controllare i report sugli eventi degli URL dei siti web aperti e chiusi per gli URL nella lista consentita. Se il criterio non viene configurato, non verranno segnalati gli eventi relativi ai siti web.
-Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Per questo criterio sono consentiti solo gli schemi di URL HTTP e HTTPS.</translation>
+La configurazione della policy consente di controllare i report sugli eventi degli URL dei siti web aperti e chiusi per gli URL nella lista consentita. Se la policy non viene configurata, non verranno segnalati gli eventi relativi ai siti web.
+Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Per questa policy sono consentiti solo gli schemi di URL HTTP e HTTPS.</translation>
 <translation id="3184638144755436350">Chrome bloccherà le navigazioni verso protocolli esterni all'interno di iframe con sandbox. Visita la pagina https://chromestatus.com/features/5680742077038592.
 
       Quando il valore è True, Chrome può bloccare queste navigazioni.
@@ -3007,77 +3007,77 @@
 
       Il valore predefinito è True, ossia la funzionalità di sicurezza è attiva.
 
-      Questo criterio può essere utilizzato dagli amministratori che hanno bisogno di più tempo per aggiornare i siti web interni interessati da questa nuova limitazione. Questo criterio aziendale è temporaneo ed è destinato a essere rimosso dopo la versione 117 di <ph name="PRODUCT_NAME" />.
+      Questa policy può essere utilizzata dagli amministratori che hanno bisogno di più tempo per aggiornare i siti web interni interessati da questa nuova limitazione. Questa policy aziendale è temporanea ed è destinata a essere rimossa dopo la versione 117 di <ph name="PRODUCT_NAME" />.
       </translation>
 <translation id="3185009703220253572">a partire dalla versione <ph name="SINCE_VERSION" /></translation>
-<translation id="3192902750888034827">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" /> specifica l'URL utilizzato dal motore di ricerca per fornire una pagina Nuova scheda.
+<translation id="3192902750888034827">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" /> specifica l'URL utilizzato dal motore di ricerca per fornire una pagina Nuova scheda.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" /> non viene configurato, non è fornita alcuna pagina Nuova scheda.</translation>
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" /> non viene configurata, non è fornita alcuna pagina Nuova scheda.</translation>
 <translation id="3195062117832383020">Consenti dati di debug di basso livello nel feedback degli utenti</translation>
-<translation id="3195103497550111266">Se questo criterio viene impostato su <ph name="DEVICE_LTS_TAG_VALUE" /> consente al dispositivo di ricevere aggiornamenti LTS (assistenza a lungo termine).</translation>
+<translation id="3195103497550111266">Se questa policy viene impostata su <ph name="DEVICE_LTS_TAG_VALUE" /> consente al dispositivo di ricevere aggiornamenti LTS (assistenza a lungo termine).</translation>
 <translation id="319608028525745507">Attiva il supporto degli URL di dati in SVGUseElement.</translation>
-<translation id="3196585866522778760">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="3196585866522778760">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale viene compiuta l'azione stabilita per l'inattività quando viene usata la batteria.
 
-          Se viene impostato, questo criterio specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> compia l'azione stabilita in caso di inattività, che può essere configurata separatamente.
+          Se viene impostata, questa policy specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> compia l'azione stabilita in caso di inattività, che può essere configurata separatamente.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il valore del criterio deve essere specificato in millisecondi.</translation>
+          Il valore della policy deve essere specificato in millisecondi.</translation>
 <translation id="3198385910521788907">Non visualizzare la schermata del sensore della presenza di persone durante l'accesso</translation>
 <translation id="3205825995289802549">Ingrandisci la prima finestra del browser alla prima esecuzione</translation>
-<translation id="320607884987562184">Se il criterio viene impostato su 1, i siti web possono eseguire JavaScript. Se il criterio viene impostato su 2, JavaScript viene negato.
+<translation id="320607884987562184">Se la policy viene impostata su 1, i siti web possono eseguire JavaScript. Se la policy viene impostata su 2, JavaScript viene negato.
 
-Se non viene configurato, JavaScript è consentito, ma gli utenti possono modificare l'impostazione.</translation>
+Se non viene configurata, JavaScript è consentito, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="3207821022126246451">WebRTC utilizzerà TCP nell'interfaccia pubblica e utilizzerà UDP solo se un proxy configurato lo supporta.</translation>
-<translation id="3207873329349672535">Questo criterio controlla se all'utente verrà presentata un'opzione, all'interno del menu di <ph name="PRODUCT_NAME" />, che gli consente di trasmettere contenuti ai dispositivi di trasmissione che non vengono visualizzati nel menu di <ph name="PRODUCT_NAME" />, usando il codice di accesso o il codice QR visualizzati sullo schermo dei dispositivi di trasmissione.
-      Per impostazione predefinita, un utente deve reinserire il codice di accesso o riscansionare il codice QR per iniziare una sessione di trasmissione successiva, ma se il criterio <ph name="ACCESS_CODE_CAST_DEVICE_DURATION_POLICY_NAME" /> è stato impostato su un valore diverso da 0 (il valore predefinito è 0), il dispositivo di trasmissione rimarrà nell'elenco dei dispositivi di trasmissione disponibili fino alla scadenza del periodo di tempo specificato.
-      Se il criterio viene impostato su Attivato, agli utenti verrà presentata l'opzione per selezionare i dispositivi di trasmissione usando un codice di accesso o scansionando un codice QR.
-      Se viene impostato su Disattivato o se non viene configurato, gli utenti non avranno la possibilità di selezionare i dispositivi di trasmissione usando un codice di accesso o scansionando un codice QR.</translation>
+<translation id="3207873329349672535">Questa policy controlla se all'utente verrà presentata un'opzione, all'interno del menu di <ph name="PRODUCT_NAME" />, che gli consente di trasmettere contenuti ai dispositivi di trasmissione che non vengono visualizzati nel menu di <ph name="PRODUCT_NAME" />, usando il codice di accesso o il codice QR visualizzati sullo schermo dei dispositivi di trasmissione.
+      Per impostazione predefinita, un utente deve reinserire il codice di accesso o riscansionare il codice QR per iniziare una sessione di trasmissione successiva, ma se la policy <ph name="ACCESS_CODE_CAST_DEVICE_DURATION_POLICY_NAME" /> è stato impostata su un valore diverso da 0 (il valore predefinito è 0), il dispositivo di trasmissione rimarrà nell'elenco dei dispositivi di trasmissione disponibili fino alla scadenza del periodo di tempo specificato.
+      Se la policy viene impostata su Attivata, agli utenti verrà presentata l'opzione per selezionare i dispositivi di trasmissione usando un codice di accesso o scansionando un codice QR.
+      Se viene impostata su Disattivata o se non viene configurata, gli utenti non avranno la possibilità di selezionare i dispositivi di trasmissione usando un codice di accesso o scansionando un codice QR.</translation>
 <translation id="3208615748170745525">I giorni dal rilevamento di aggiornamenti.</translation>
 <translation id="3209947902706795852">Chiedi agli utenti di eseguire la migrazione.</translation>
-<translation id="3210408472559816322">La configurazione del criterio consente di specificare quale host di messaggistica nativo non deve essere caricato. Il valore <ph name="WILDCARD_VALUE" /> nell'elenco di host non consentiti comporta il rifiuto di tutti gli host di messaggistica nativi, a meno che non siano consentiti in modo esplicito.
+<translation id="3210408472559816322">La configurazione della policy consente di specificare quale host di messaggistica nativo non deve essere caricato. Il valore <ph name="WILDCARD_VALUE" /> nell'elenco di host non consentiti comporta il rifiuto di tutti gli host di messaggistica nativi, a meno che non siano consentiti in modo esplicito.
 
-      Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> carica tutti gli host di messaggistica nativi installati.</translation>
+      Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> carica tutti gli host di messaggistica nativi installati.</translation>
 <translation id="3211426942294667684">Impostazioni di accesso al browser</translation>
-<translation id="3213872023700948990">Questo criterio consente di disattivare temporaneamente il nuovo comportamento delle barre di scorrimento attivabili da tastiera.
+<translation id="3213872023700948990">Questa policy consente di disattivare temporaneamente il nuovo comportamento delle barre di scorrimento attivabili da tastiera.
 
-Se viene attivato o se non viene configurato, le barre di scorrimento senza elementi secondari attivabili sono attivabili con la tastiera per impostazione predefinita.
+Se viene attivata o se non viene configurata, le barre di scorrimento senza elementi secondari attivabili sono attivabili con la tastiera per impostazione predefinita.
 
-Se questo criterio viene disattivato, le barre di scorrimento non saranno attivabili con la tastiera per impostazione predefinita.
+Se questa policy viene disattivata, le barre di scorrimento non saranno attivabili con la tastiera per impostazione predefinita.
 
-Questo criterio è una soluzione alternativa temporanea e verrà rimosso nella versione M135.</translation>
+Questa policy è una soluzione alternativa temporanea e verrà rimossa nella versione M135.</translation>
 <translation id="3216094710930835317">Il nuovo comportamento del parser HTML che consente l'uso di più tag verrà disattivato.</translation>
-<translation id="3217774577897351942">L'API <ph name="OFFSET_PARENT" /> verrà modificata in <ph name="PRODUCT_NAME" /> per conformarla alle modifiche apportate in <ph name="FIREFOX_PRODUCT_NAME" /> e <ph name="SAFARI_PRODUCT_NAME" />. Questo criterio ripristina il comportamento precedente fino alla versione M120.
+<translation id="3217774577897351942">L'API <ph name="OFFSET_PARENT" /> verrà modificata in <ph name="PRODUCT_NAME" /> per conformarla alle modifiche apportate in <ph name="FIREFOX_PRODUCT_NAME" /> e <ph name="SAFARI_PRODUCT_NAME" />. Questa policy ripristina il comportamento precedente fino alla versione M120.
 
 Il nuovo comportamento potrebbe rendere inaccessibili alcuni siti web solo di <ph name="PRODUCT_NAME" /> che usano <ph name="OFFSET_PARENT" />, <ph name="OFFSET_TOP" /> o <ph name="OFFSET_LEFT" /> in combinazione con il DOM Shadow.
 
 All'indirizzo https://github.com/josepharhar/offsetparent-polyfills puoi trovare alcuni polyfill che ripristinano il comportamento precedente per facilitare la migrazione.
 
-Se questo criterio viene attivato, verrà utilizzato il nuovo comportamento.
+Se questa policy viene attivata, verrà utilizzato il nuovo comportamento.
 
-Se viene disattivato, verrà utilizzato il comportamento precedente.
+Se viene disattivata, verrà utilizzato il comportamento precedente.
 
-Se non viene configurato, verrà utilizzato il nuovo comportamento, esattamente come avviene per gli altri utenti di Chromium.</translation>
+Se non viene configurata, verrà utilizzato il nuovo comportamento, esattamente come avviene per gli altri utenti di Chromium.</translation>
 <translation id="3219421230122020860">Modalità di navigazione in incognito disponibile</translation>
 <translation id="3220624000494482595">Se l'app kiosk è un'app Android, non avrà controllo sulla versione di <ph name="PRODUCT_OS_NAME" />, anche se la norma viene impostata su <ph name="TRUE" />.</translation>
 <translation id="3222088741899353813">Il pulsante sinistro è il principale nella schermata di accesso</translation>
 <translation id="322359555555487980">Determina la disponibilità delle varianti su <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="3229163415739929305">Se il criterio viene impostato su Attivato o se non viene configurato, viene attivato il recupero dei metadati di caricamento delle pagine e dei modelli di machine learning che migliorano l'esperienza di navigazione.
-      Se il criterio viene impostato su Disattivato, il comportamento di alcune funzionalità potrebbe non essere corretto.</translation>
+<translation id="3229163415739929305">Se la policy viene impostata su Attivata o se non viene configurata, viene attivato il recupero dei metadati di caricamento delle pagine e dei modelli di machine learning che migliorano l'esperienza di navigazione.
+      Se la policy viene impostata su Disattivata, il comportamento di alcune funzionalità potrebbe non essere corretto.</translation>
 <translation id="3231311173895401135">Lascia che sia il browser a decidere in merito al supporto</translation>
-<translation id="3231837273069128027">La configurazione del criterio consente di impostare disponibilità e comportamento degli aggiornamenti del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
+<translation id="3231837273069128027">La configurazione della policy consente di impostare disponibilità e comportamento degli aggiornamenti del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Specifica le singole impostazioni nelle proprietà JSON:
 
-      * <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_POWERWASH" />: se viene impostato su <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_POWERWASH_TRUE" />, gli utenti possono attivare il flusso della funzione Powerwash per l'installazione di un aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
+      * <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_POWERWASH" />: se viene impostata su <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_POWERWASH_TRUE" />, gli utenti possono attivare il flusso della funzione Powerwash per l'installazione di un aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
-      * <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_PRESERVE_DEVICE_STATE" /> (disponibile a partire da <ph name="PRODUCT_NAME" /> 68): se viene impostato su <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_PRESERVE_DEVICE_STATE_TRUE" />, gli utenti possono richiamare il flusso di aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> che conserva lo stato a livello di dispositivo, inclusa la registrazione aziendale, ma che comporta la perdita dei dati utente.
+      * <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_PRESERVE_DEVICE_STATE" /> (disponibile a partire da <ph name="PRODUCT_NAME" /> 68): se viene impostata su <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_ALLOW_USER_INITIATED_PRESERVE_DEVICE_STATE_TRUE" />, gli utenti possono richiamare il flusso di aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> che conserva lo stato a livello di dispositivo, inclusa la registrazione aziendale, ma che comporta la perdita dei dati utente.
 
-      * <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_AUTO_UPDATE_MODE" /> (disponibile a partire da <ph name="PRODUCT_NAME" /> 75): consente di controllare in che modo gli aggiornamenti automatici del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> vengono applicati per contrastare la vulnerabilità del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />. Tutti i flussi conservano lo stato del dispositivo locale. Se il criterio viene impostato su:
+      * <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_AUTO_UPDATE_MODE" /> (disponibile a partire da <ph name="PRODUCT_NAME" /> 75): consente di controllare in che modo gli aggiornamenti automatici del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> vengono applicati per contrastare la vulnerabilità del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />. Tutti i flussi conservano lo stato del dispositivo locale. Se la policy viene impostata su:
 
-        * 1 o se non viene configurato, gli aggiornamenti del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> non vengono applicati.
+        * 1 o se non viene configurata, gli aggiornamenti del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> non vengono applicati.
 
         * 2, il firware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> viene aggiornato al riavvio successivo, in seguito alla conferma dell'aggiornamento da parte dell'utente.
 
@@ -3085,16 +3085,16 @@
 
         * 4, il firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> viene aggiornato in seguito alla registrazione, prima dell'accesso dell'utente.
 
-      Se il criterio non viene configurato, la visualizzazione dell'aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> non è disponibile.</translation>
+      Se la policy non viene configurata, la visualizzazione dell'aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /> non è disponibile.</translation>
 <translation id="3232563711929146405">Disattiva la sandbox del servizio di rete</translation>
 <translation id="3232691106293445015">Per le connessioni HTTP non sicure non è possibile usare l'autenticazione <ph name="BASIC_AUTH" />; sono richieste connessioni HTTPS</translation>
 <translation id="3234773866678260466">Consenti l'aggiunta di nuovi profili</translation>
 <translation id="3234863952320884611">Consente di richiamare i metodi <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> in modo asincrono.</translation>
-<translation id="3235085623859932253"> Se questo criterio viene disattivato, l'utente non potrà collegare completamente il proprio dispositivo periferico Thunderbolt/USB4 tramite tunneling PCIe.
+<translation id="3235085623859932253"> Se questa policy viene disattivata, l'utente non potrà collegare completamente il proprio dispositivo periferico Thunderbolt/USB4 tramite tunneling PCIe.
 
-      Se viene attivato, l'utente potrà collegare completamente il proprio dispositivo periferico Thunderbolt/USB4 tramite tunneling PCIe.
+      Se viene attivata, l'utente potrà collegare completamente il proprio dispositivo periferico Thunderbolt/USB4 tramite tunneling PCIe.
 
-      Se non viene configurato, verrà impostato su falso per impostazione predefinita e l'utente potrà selezionare lo stato che preferisce (vero/falso) per questa impostazione.</translation>
+      Se non viene configurata, verrà impostata su false per impostazione predefinita e l'utente potrà selezionare lo stato che preferisce (true/false) per questa impostazione.</translation>
 <translation id="3236046242843493070">Pattern URL per consentire installazioni di estensioni, applicazioni e script utente da</translation>
 <translation id="323609919471603985">Consenti la visualizzazione della promozione dell'estensione fornitore di credenziali</translation>
 <translation id="3239125988620218257">Segnala lo stato di rete</translation>
@@ -3103,35 +3103,35 @@
 <translation id="3240655340884151271">Indirizzo MAC NIC integrato del dock</translation>
 <translation id="3242756958360374888">Contiene un elenco di pattern che possono essere usati per controllare la visibilità degli account in <ph name="PRODUCT_NAME" />.
 
-      Ogni Account Google sul dispositivo viene messo a confronto con i pattern memorizzati in questo criterio per stabilirne la visibilità in <ph name="PRODUCT_NAME" />. L'account sarà visibile se il nome soddisfa uno qualsiasi dei pattern nell'elenco. In caso contrario, l'account non sarà visibile.
+      Ogni Account Google sul dispositivo viene messo a confronto con i pattern memorizzati in questa policy per stabilirne la visibilità in <ph name="PRODUCT_NAME" />. L'account sarà visibile se il nome soddisfa uno qualsiasi dei pattern nell'elenco. In caso contrario, l'account non sarà visibile.
 
       Usa il carattere jolly "*" per rappresentare lo zero e caratteri più arbitrari. Il carattere di escape è "\"; quindi, per rappresentare gli effettivi caratteri "*" o "\", devi farli precedere da un "\".
 
-      Se il criterio non è impostato, tutti gli Account Google sul dispositivo saranno visibili in <ph name="PRODUCT_NAME" />.</translation>
-<translation id="3245558640643744331">Se il criterio viene impostato su Attivato, in caso di conflitto il criterio relativo al cloud prevale sul criterio relativo alla piattaforma.
+      Se la policy non è impostata, tutti gli Account Google sul dispositivo saranno visibili in <ph name="PRODUCT_NAME" />.</translation>
+<translation id="3245558640643744331">Se la policy viene impostata su Attivata, in caso di conflitto la policy relativa al cloud prevale sulla policy relativa alla piattaforma.
 
-Se il criterio viene impostato su Disattivato o se non viene impostato, in caso di conflitto il criterio relativo alla piattaforma prevale sul criterio relativo al cloud.
+Se la policy viene impostata su Disattivata o se non viene impostata, in caso di conflitto la policy relativa alla piattaforma prevale sulla policy relativa al cloud.
 
-Questo criterio obbligatorio interessa i criteri relativi al cloud in ambito macchina.
+Questa policy obbligatoria interessa le policy relative al cloud in ambito macchina.
 
-Questo criterio è specifico di <ph name="PRODUCT_NAME" /> e non influisce su <ph name="GOOGLE_UPDATE_NAME" /> perché si tratta di applicazioni indipendenti.
-<ph name="GOOGLE_UPDATE_NAME" /> ha un criterio separato con lo stesso nome.</translation>
+Questa policy è specifica di <ph name="PRODUCT_NAME" /> e non influisce su <ph name="GOOGLE_UPDATE_NAME" /> perché si tratta di applicazioni indipendenti.
+<ph name="GOOGLE_UPDATE_NAME" /> ha una policy separata con lo stesso nome.</translation>
 <translation id="3246606090306814894">Controlla la scorciatoia usata per attivare F12</translation>
 <translation id="3248019773260441802">Consente a una pagina di mostrare i popup durante l'unload</translation>
 <translation id="3251500716404598358">Configura le norme per passare da un browser all'altro.
 
       I siti web configurati verranno aperti automaticamente in un browser diverso da <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3252724033247471310">Consenti acquisizione schede con stessa origine in base a queste origini</translation>
-<translation id="325374928725737694">Se il criterio viene disattivato, l'app web kiosk non può funzionare offline. All'avvio di una sessione kiosk, verrà visualizzata una richiesta di accesso alla rete solo se il dispositivo è offline. In questo modo, il dispositivo sarà online prima che l'app venga avviata correttamente.
+<translation id="325374928725737694">Se la policy viene disattivata, l'app web kiosk non può funzionare offline. All'avvio di una sessione kiosk, verrà visualizzata una richiesta di accesso alla rete solo se il dispositivo è offline. In questo modo, il dispositivo sarà online prima che l'app venga avviata correttamente.
 
-Questa richiesta di accesso alla rete potrebbe non essere visualizzata se per un'app è impostato l'avvio automatico e il criterio <ph name="PROMPT_POLICY_NAME" /> (<ph name="PROMPT_POLICY_URL" />) è disattivato.
+Questa richiesta di accesso alla rete potrebbe non essere visualizzata se per un'app è impostato l'avvio automatico e la policy <ph name="PROMPT_POLICY_NAME" /> (<ph name="PROMPT_POLICY_URL" />) è disattivata.
 
-Questo criterio non ha alcun effetto sulle app di Chrome o web che hanno un URL di installazione che esegue un reindirizzamento multiorigine a un'app web diversa (ad es. se l'URL di installazione dell'app è <ph name="APP_INSTALL_URL" />, ma in fase di caricamento reindirizza a un'app web diversa, ad es. <ph name="APP_REDIRECTED_URL" />).
+Questa policy non ha alcun effetto sulle app di Chrome o web che hanno un URL di installazione che esegue un reindirizzamento multiorigine a un'app web diversa (ad es. se l'URL di installazione dell'app è <ph name="APP_INSTALL_URL" />, ma in fase di caricamento reindirizza a un'app web diversa, ad es. <ph name="APP_REDIRECTED_URL" />).
 
-Se il criterio viene impostato su true o non viene configurato, le app web verranno avviate anche se il dispositivo è offline.</translation>
-<translation id="3255624750680556186">Se il criterio viene impostato su Attivato o se non viene configurato, la funzione Powerwash può essere attivata da un dispositivo.
+Se la policy viene impostata su true o non viene configurata, le app web verranno avviate anche se il dispositivo è offline.</translation>
+<translation id="3255624750680556186">Se la policy viene impostata su Attivata o se non viene configurata, la funzione Powerwash può essere attivata da un dispositivo.
 
-      Se viene impostato su Disattivato, la funzione non può essere attivata da un dispositivo. Si può verificare un'eccezione per l'attivazione della funzione Powerwash, se il criterio <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_NAME" /> viene impostato su un valore che consente l'aggiornamento del firmware TPM, ma tale firmware non è ancora stato aggiornato.</translation>
+      Se viene impostata su Disattivata, la funzione non può essere attivata da un dispositivo. Si può verificare un'eccezione per l'attivazione della funzione Powerwash, se la policy <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_NAME" /> viene impostata su un valore che consente l'aggiornamento del firmware TPM, ma tale firmware non è ancora stato aggiornato.</translation>
 <translation id="3256920103934729145">Impedisci il clickthrough degli utenti su pagine di avviso SSL</translation>
 <translation id="3257786863492892609">Controlla i criteri relativi alla funzionalità Registra schermo.</translation>
 <translation id="3258380413685430793">Esegui tutti i contenuti di <ph name="FLASH_PLUGIN_NAME" /></translation>
@@ -3144,19 +3144,19 @@
 <translation id="3269198556438453775">Impedisci le connessioni di assistenza da remoto da parte degli amministratori aziendali a questa macchina</translation>
 <translation id="3271741247922321334">Consente di impostare un elenco di pattern URL che specifica i siti non autorizzati a mostrare contenuti misti (ossia contenuti HTTP su siti HTTPS) bloccabili (ossia attivi) e per i quali i contenuti misti bloccabili facoltativi (ossia passivi) verranno aggiornati.
 
-          Se questo criterio non viene impostato, i contenuti misti bloccabili verranno bloccati e quelli bloccabili facoltativi verranno aggiornati, ma gli utenti potranno configurare eccezioni per consentire i contenuti misti per siti specifici.
+          Se questa policy non viene impostata, i contenuti misti bloccabili verranno bloccati e quelli bloccabili facoltativi verranno aggiornati, ma gli utenti potranno configurare eccezioni per consentire i contenuti misti per siti specifici.
 
           Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="3273221114520206906">Impostazione JavaScript predefinita</translation>
 <translation id="3278042410658310805">Disattiva la funzione di lettura vocale nella schermata di accesso e consenti all'utente di attivarla temporaneamente</translation>
-<translation id="328347261792478720">Per impostazione predefinita, nel browser vengono mostrati consigli di contenuti multimediali personalizzati in base agli interessi dell'utente. Se questo criterio viene impostato su Disattivato, questi consigli vengono nascosti all'utente. Se il criterio viene impostato su Attivato o se non viene configurato, i consigli di contenuti multimediali vengono mostrati all'utente.</translation>
+<translation id="328347261792478720">Per impostazione predefinita, nel browser vengono mostrati consigli di contenuti multimediali personalizzati in base agli interessi dell'utente. Se questa policy viene impostata su Disattivata, questi consigli vengono nascosti all'utente. Se la policy viene impostata su Attivata o se non viene configurata, i consigli di contenuti multimediali vengono mostrati all'utente.</translation>
 <translation id="3284094172359247914">Controlla l'utilizzo dell'API WebUSB</translation>
 <translation id="3286159327013237833">Attiva i clic automatici nella schermata di accesso</translation>
 <translation id="3288595667065905535">Canale di rilascio</translation>
 <translation id="3291940794983537008">Impostazioni per le funzionalità di IA generativa di DevTools</translation>
-<translation id="3294430356898755483">La configurazione del criterio consente agli amministratori di impostare un elenco di stampanti per i loro utenti. La selezione della stampante viene effettuata la prima volta che gli utenti provano a stampare.
+<translation id="3294430356898755483">La configurazione della policy consente agli amministratori di impostare un elenco di stampanti per i loro utenti. La selezione della stampante viene effettuata la prima volta che gli utenti provano a stampare.
 
-      Se viene usato il criterio:
+      Se viene usata la policy:
 
       * È possibile personalizzare le stringhe in formato libero <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> per facilitare la selezione delle stampanti.
 
@@ -3166,30 +3166,30 @@
 
       * In via facoltativa, è possibile specificare un valore <ph name="PRINTER_UUID" /> per facilitare la deduplicazione delle stampanti <ph name="ZEROCONF_DISCOVERY" />.
 
-      * E' possibile usare il nome del modello di <ph name="PRINTER_EFFECTIVE_MODEL" /> o impostare <ph name="PRINTER_AUTOCONF" /> su Vero. Le stampanti con entrambe le proprietà o prive di proprietà vengono ignorate.
+      * E' possibile usare il nome del modello di <ph name="PRINTER_EFFECTIVE_MODEL" /> o impostare <ph name="PRINTER_AUTOCONF" /> su True. Le stampanti con entrambe le proprietà o prive di proprietà vengono ignorate.
 
-      I file PPD vengono scaricati dopo l'utilizzo della stampante e i file PPD usati più spesso vengono memorizzati nella cache. Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.
+      I file PPD vengono scaricati dopo l'utilizzo della stampante e i file PPD usati più spesso vengono memorizzati nella cache. Questa policy non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.
 
-      Nota: per i dispositivi <ph name="MS_AD_NAME" /> gestiti, questo criterio supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina <ph name="MS_AD_NAME" /> oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> viene sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. La posizione è in base zero.
+      Nota: per i dispositivi <ph name="MS_AD_NAME" /> gestiti, questa policy supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina <ph name="MS_AD_NAME" /> oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> viene sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. La posizione è in base zero.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="PRINTERS_POLICY_NAME" />.</translation>
+      Questa policy è deprecata. Usa la policy <ph name="PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3296560797994110772">Le scorciatoie con il tasto Ricerca vengono inviate all'app prima di essere gestite dal sistema operativo.</translation>
 <translation id="3300441638895109781">Ricarica automaticamente il flusso di autenticazione su ChromeOS</translation>
 <translation id="3300784749135986828">Attiva o disattiva la funzionalità <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />.</translation>
 <translation id="3301698868852716692">Attiva estensione Insights</translation>
-<translation id="3302829897293005699">Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano informazioni relative alla sessione kiosk attiva quali ID applicazione e versione.
+<translation id="3302829897293005699">Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano informazioni relative alla sessione kiosk attiva quali ID applicazione e versione.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano informazioni relative alla sessione kiosk.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano informazioni relative alla sessione kiosk.</translation>
 <translation id="3303770131697159224">Impostazione predefinita dell'autorizzazione per la gestione delle finestre</translation>
-<translation id="3303911765031636277">Criterio di configurazione per il connettore OnFileAttached di Chrome Enterprise</translation>
+<translation id="3303911765031636277">Policy di configurazione per il connettore OnFileAttached di Chrome Enterprise</translation>
 <translation id="3307744348419745296">Non consentire la sincronizzazione delle configurazioni di reti Wi-Fi tra i dispositivi <ph name="PRODUCT_OS_NAME" /> e un telefono Android connesso</translation>
-<translation id="3308724602356134956">Se imposti il criterio, <ph name="PRODUCT_OS_NAME" />
+<translation id="3308724602356134956">Se imposti la policy, <ph name="PRODUCT_OS_NAME" />
 
       scarica e usa l'immagine di sfondo impostata per lo sfondo del desktop e della schermata di accesso degli utenti, che non possono cambiarla. Specifica l'URL (che sia accessibile senza autenticazione) da cui <ph name="PRODUCT_OS_NAME" />
 
       può scaricare l'immagine di sfondo, nonché un hash di crittografia (in formato JPEG con file di dimensioni massime pari a 16 MB) utilizzato per verificare l'integrità del download.
 
-      Se il criterio non viene impostato, gli utenti possono scegliere l'immagine da usare come sfondo del desktop e della schermata di accesso.</translation>
+      Se la policy non viene impostata, gli utenti possono scegliere l'immagine da usare come sfondo del desktop e della schermata di accesso.</translation>
 <translation id="3313395530427546108">Non utilizzare firme di codice ad hoc.</translation>
 <translation id="3315324240256767419">Attiva la funzionalità di finestre nascoste.</translation>
 <translation id="3321099611644751329">Certificati TLS che <ph name="PRODUCT_NAME" /> deve considerare attendibili per l'autenticazione del server con vincoli</translation>
@@ -3199,34 +3199,34 @@
           Se questa norma viene impostata su una stringa non vuota, tale stringa verrà usata come nome della destinazione di <ph name="PRODUCT_NAME" />. In caso contrario, il nome della destinazione sarà quello del dispositivo. Se questa norma non viene impostata, il nome della destinazione sarà il nome del dispositivo, che il proprietario (o un utente del dominio che gestisce il dispositivo) potrà cambiare. Il nome può essere formato da massimo 24 caratteri.</translation>
 <translation id="3329063005964041553">Blocca l'API File Handling su queste app web</translation>
 <translation id="3329401415394648069">Consenti l'utilizzo dell'API U2F Security Key.</translation>
-<translation id="3329976499753286262">Se il criterio viene impostato su Attivato o se non viene configurato, la configurazione del container dell'app del renderer verrà attivata sulle piattaforme supportate.
+<translation id="3329976499753286262">Se la policy viene impostata su Attivata o se non viene configurata, la configurazione del container dell'app del renderer verrà attivata sulle piattaforme supportate.
 
-      Se viene impostato su Disattivato, la sicurezza e la stabilità di <ph name="PRODUCT_NAME" /> diminuiranno, poiché verrà ridotta la sandbox usata dai processi del renderer. Disattivalo solo se si verificano dei problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno dei processi del renderer.
+      Se viene impostata su Disattivata, la sicurezza e la stabilità di <ph name="PRODUCT_NAME" /> diminuiranno, poiché verrà ridotta la sandbox usata dai processi del renderer. Disattivala solo se si verificano dei problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno dei processi del renderer.
 
-      Nota: scopri di più sui criteri relativi alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
+      Nota: scopri di più sulle policy relative alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
 <translation id="3338041636115991551">Se ArcEnabled è impostato su True, ARC viene attivato per l'utente, a meno che la modalità temporanea o l'accesso simultaneo siano attivi durante la sessione utente. Se la policy è impostata su False o non è configurata, gli utenti aziendali non possono utilizzare ARC.
 Questa policy consente di controllare soltanto <ph name="ARC_VM" /> su <ph name="PRODUCT_NAME" />. Per <ph name="PRODUCT_OS_FLEX_NAME" />, consulta la policy <ph name="DEVICE_FLEX_ARC_PRELOAD_ENABLED_POLICY_NAME" /> per ulteriori dettagli.</translation>
 <translation id="3338431256935927407">Consente di gestire le impostazioni relative alla funzionalità Cloud Upload.</translation>
 <translation id="3339271789059866414">Consente di configurare la disponibilità del servizio proxy di sistema e le credenziali proxy dei servizi di sistema.
-      Se il criterio non viene impostato, il servizio proxy di sistema non sarà disponibile.</translation>
+      Se la policy non viene impostata, il servizio proxy di sistema non sarà disponibile.</translation>
 <translation id="3341649870321644698">Attiva la modalità Niente distrazioni solo con Suoni della modalità Niente distrazioni.</translation>
 <translation id="334231891933432876">Disconnetti l'utente non appena il suo account non è più autenticato</translation>
 <translation id="3345323903592385588">L'ordine in cui la configurazione VM verrà visualizzata nel programma di installazione. Quando vengono specificate più configurazioni VM, quella con il valore display_order più basso appare in cima all'elenco. Il valore predefinito è zero.</translation>
-<translation id="3351661569026056296">Se il criterio è impostato su True, i tasti della fila superiore della tastiera riprodurranno i comandi dei tasti funzione. Per ripristinare il comportamento dei tasti multimediali, è necessario premere il tasto Ricerca.
+<translation id="3351661569026056296">Se la policy è impostata su True, i tasti della fila superiore della tastiera riprodurranno i comandi dei tasti funzione. Per ripristinare il comportamento dei tasti multimediali, è necessario premere il tasto Ricerca.
 
-Se il criterio è impostato su False o non è impostato, la tastiera riprodurrà i comandi dei tasti multimediali per impostazione predefinita. Per ripristinare il comportamento dei tasti funzione, è necessario premere il tasto Ricerca.</translation>
+Se la policy è impostata su False o non è impostata, la tastiera riprodurrà i comandi dei tasti multimediali per impostazione predefinita. Per ripristinare il comportamento dei tasti funzione, è necessario premere il tasto Ricerca.</translation>
 <translation id="3351835664671920945">Imposta una tastiera standard come predefinita per l'inserimento delle password</translation>
 <translation id="3359186795130278362">Viene attivata la sessione Ospite gestita limitata.</translation>
 <translation id="33592541385181121">Non includere porta nel Kerberos SPN generato</translation>
-<translation id="3360093276083825336">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="3360093276083825336">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale viene mostrata una finestra di dialogo di avviso quando viene usata la batteria.
 
-          Se viene impostato, questo criterio specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> mostri una finestra di dialogo di avviso per comunicare all'utente che sta per essere compiuta l'azione stabilita in caso di inattività.
+          Se viene impostata, questa policy specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> mostri una finestra di dialogo di avviso per comunicare all'utente che sta per essere compiuta l'azione stabilita in caso di inattività.
 
-          Se questo criterio non viene impostato, non viene visualizzata alcuna finestra di dialogo di avviso.
+          Se questa policy non viene impostata, non viene visualizzata alcuna finestra di dialogo di avviso.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.
 
           L'avviso viene mostrato solo se l'azione stabilita in caso di inattività è la disconnessione o lo spegnimento.</translation>
 <translation id="3360490004791301756">Consenti agli utenti di utilizzare le offerte tramite la registrazione a <ph name="PRODUCT_OS_NAME" /></translation>
@@ -3237,30 +3237,30 @@
 <translation id="3366156659815091184">La stampa della piattaforma utilizza il processo di servizio.</translation>
 <translation id="3367361756115023251">Consente all'utente l'accesso root ai contenitori Crostini.
 
-Se il criterio viene impostato su true o se non viene configurato, all'utente verrà concesso l'accesso root ai contenitori Crostini.
-Se il criterio viene impostato su false, all'utente non verrà concesso l'accesso root ai contenitori Crostini nuovi ed esistenti.</translation>
+Se la policy viene impostata su true o se non viene configurata, all'utente verrà concesso l'accesso root ai contenitori Crostini.
+Se la policy viene impostata su false, all'utente non verrà concesso l'accesso root ai contenitori Crostini nuovi ed esistenti.</translation>
 <translation id="3373381043600809954">Attiva <ph name="PRODUCT_NAME" /></translation>
 <translation id="3374587000313305002">Consente di configurare la directory che <ph name="PRODUCT_NAME" /> utilizza per memorizzare i dati utente.
 
-      Se il criterio viene configurato, <ph name="PRODUCT_NAME" /> utilizza la directory fornita, indipendentemente dal fatto che l'utente abbia specificato o meno il flag "--user-data-dir". Per evitare perdite di dati o altri errori imprevisti, questo criterio non deve essere impostato su una directory usata per altri scopi perché <ph name="PRODUCT_NAME" /> gestisce i relativi contenuti.
+      Se la policy viene configurata, <ph name="PRODUCT_NAME" /> utilizza la directory fornita, indipendentemente dal fatto che l'utente abbia specificato o meno il flag "--user-data-dir". Per evitare perdite di dati o altri errori imprevisti, questa policy non deve essere impostato su una directory usata per altri scopi perché <ph name="PRODUCT_NAME" /> gestisce i relativi contenuti.
 
       Per un elenco di varianti che possono essere utilizzate, vai all'indirizzo https://support.google.com/chrome/a?p=Supported_directory_variables.
 
-      Se il criterio non viene configurato, viene utilizzato il percorso del profilo predefinito e l'utente può ignorarlo con il flag della riga di comando "--user-data-dir".</translation>
+      Se la policy non viene configurata, viene utilizzato il percorso del profilo predefinito e l'utente può ignorarlo con il flag della riga di comando "--user-data-dir".</translation>
 <translation id="3379326579027180941">Consenti ai siti di chiedere all'utente l'autorizzazione di accesso alle stampanti locali tramite l'API WebPrinting</translation>
 <translation id="3379368498958498146">Attiva o disattiva la funzionalità di scrittura predittiva sulla tastiera fisica.
 
-Se questo criterio viene attivato o se non viene configurato, la funzionalità di scrittura predittiva sulla tastiera fisica sarà consentita.
+Se questa policy viene attivata o se non viene configurata, la funzionalità di scrittura predittiva sulla tastiera fisica sarà consentita.
 
-Se viene disattivato, la funzionalità di scrittura predittiva sulla tastiera fisica non sarà consentita.</translation>
+Se viene disattivata, la funzionalità di scrittura predittiva sulla tastiera fisica non sarà consentita.</translation>
 <translation id="3380801667330555918">Modifica la configurazione precompilata per i ticket Kerberos</translation>
 <translation id="338149029069528354">Non cancellare i dati utente locali</translation>
 <translation id="3381968327636295719">Utilizza il browser host per impostazione predefinita</translation>
 <translation id="3383857097929929678">Apri i link nelle app per Android per impostazione predefinita</translation>
 <translation id="3387117557265712991">Disabilita la crittografia per applicazioni</translation>
-<translation id="3387211681524224831">Se il criterio viene impostato su Attivato, la cronologia di navigazione non viene salvata, la sincronizzazione delle schede viene disattivata e gli utenti non possono modificare questa impostazione.
+<translation id="3387211681524224831">Se la policy viene impostata su Attivata, la cronologia di navigazione non viene salvata, la sincronizzazione delle schede viene disattivata e gli utenti non possono modificare questa impostazione.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, la cronologia di navigazione viene salvata.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, la cronologia di navigazione viene salvata.</translation>
 <translation id="3387999258705169775">Comportamento predefinito per il blocco nidificato della funzione setTimeout().</translation>
 <translation id="3388628790024977864">Non consentire il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /></translation>
 <translation id="3389088527709746815">Attiva l'autenticazione Gnubby per l'host di accesso remoto</translation>
@@ -3270,37 +3270,37 @@
 <translation id="33993310248354034">Consente di rilevare entità di testo normale nelle pagine web.</translation>
 <translation id="3399859571630358395">Viene forzata la disattivazione della funzionalità Accoppiamento rapido (accoppiamento rapido tramite Bluetooth)</translation>
 <translation id="3404681701763345449">Attiva integrazione di <ph name="GOOGLE_CALENDAR_NAME" />.</translation>
-<translation id="3405361833556012520">Questo criterio si applica solo al traffico del browser; il Play Store, la navigazione web delle app per Android e altro traffico generato dagli utenti, ad esempio il traffico delle VM Linux o i processi di stampa, continueranno a rispettare le limitazioni imposte dalla VPN sempre attiva. Questo criterio viene applicato in modo forzato solo quando la VPN non è connessa e solo per il traffico generato dal browser degli utenti. Anche se questo criterio viene applicato in modo forzato, il traffico generato dal sistema può anche ignorare la VPN sempre attiva per eseguire attività come il recupero dei criteri e la sincronizzazione dell'orologio di sistema.
+<translation id="3405361833556012520">Questa policy si applica solo al traffico del browser; il Play Store, la navigazione web delle app per Android e altro traffico generato dagli utenti, ad esempio il traffico delle VM Linux o i processi di stampa, continueranno a rispettare le limitazioni imposte dalla VPN sempre attiva. Questa policy viene applicata in modo forzato solo quando la VPN non è connessa e solo per il traffico generato dal browser degli utenti. Anche se questa policy viene applicata in modo forzato, il traffico generato dal sistema può anche ignorare la VPN sempre attiva per eseguire attività come il recupero delle policy e la sincronizzazione dell'orologio di sistema.
 
-Utilizza questo criterio per aprire le eccezioni di alcuni schemi, sottodomini di altri domini, porte o percorsi specifici utilizzando il formato specificato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Il filtro più specifico consente di determinare se un URL è bloccato o consentito.
+Utilizza questa policy per aprire le eccezioni di alcuni schemi, sottodomini di altri domini, porte o percorsi specifici utilizzando il formato specificato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Il filtro più specifico consente di determinare se un URL è bloccato o consentito.
 
-Se il criterio <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> viene impostato, viene configurata una VPN sempre attiva che non sarà connessa, la navigazione verrà bloccata verso tutti gli host, ad eccezione di quelli consentiti dal criterio <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />. In questo stato del dispositivo, i criteri <ph name="URL_BLOCKLIST_POLICY_NAME" /> e <ph name="URL_ALLOWLIST_POLICY_NAME" /> vengono ignorati. Quando la VPN sempre attiva si connette, vengono applicati i criteri <ph name="URL_BLOCKLIST_POLICY_NAME" /> e <ph name="URL_ALLOWLIST_POLICY_NAME" />, mentre il criterio <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> viene ignorato.
+Se la policy <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> viene impostata, viene configurata una VPN sempre attiva che non sarà connessa, la navigazione verrà bloccata verso tutti gli host, ad eccezione di quelli consentiti dalla policy <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />. In questo stato del dispositivo, le policy <ph name="URL_BLOCKLIST_POLICY_NAME" /> e <ph name="URL_ALLOWLIST_POLICY_NAME" /> vengono ignorate. Quando la VPN sempre attiva si connette, vengono applicate le policy <ph name="URL_BLOCKLIST_POLICY_NAME" /> e <ph name="URL_ALLOWLIST_POLICY_NAME" />, mentre la policy <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> viene ignorata.
 
-Per questo criterio è possibile definire al massimo 1000 voci.
+Per questa policy è possibile definire al massimo 1000 voci.
 
-Se il criterio non viene impostato, non è possibile navigare nel browser se è attiva la VPN sempre attiva in modalità con restrizioni e la VPN non è connessa.</translation>
+Se la policy non viene impostata, non è possibile navigare nel browser se è attiva la VPN sempre attiva in modalità con restrizioni e la VPN non è connessa.</translation>
 <translation id="3405997282295704902">Non consentire agli utenti di utilizzare <ph name="PRODUCT_NAME" /></translation>
 <translation id="3406122462682235653">Non chiedere all'utente (il download inizia immediatamente)</translation>
-<translation id="3408078762098350617">Consente di controllare l'esperienza utente delle funzionalità disattivate elencate nel criterio <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />.
+<translation id="3408078762098350617">Consente di controllare l'esperienza utente delle funzionalità disattivate elencate nella policy <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />.
 
-      Se il criterio viene impostato su "blocked", le funzionalità disattivate non saranno utilizzabili, ma rimarranno visibili per gli utenti.
+      Se la policy viene impostata su "blocked", le funzionalità disattivate non saranno utilizzabili, ma rimarranno visibili per gli utenti.
 
-      Se il criterio viene impostato su "hidden", le funzionalità disattivate saranno inutilizzabili e non visibili per gli utenti.
+      Se la policy viene impostata su "hidden", le funzionalità disattivate saranno inutilizzabili e non visibili per gli utenti.
 
-      Se il criterio non viene configurato o presenta un valore non valido, la modalità di disattivazione delle funzionalità di sistema sarà "blocked".</translation>
+      Se la policy non viene configurata o presenta un valore non valido, la modalità di disattivazione delle funzionalità di sistema sarà "blocked".</translation>
 <translation id="3411947169047929182">Controlla la configurazione correlata a WebRTC</translation>
-<translation id="341285788698114069">Questo criterio consente di stabilire la priorità del processo audio su Windows.
-      Se il criterio viene attivato, il processo audio verrà eseguito con priorità sopra la norma.
-      Se il criterio viene disattivato, il processo audio verrà eseguito con priorità normale.
-      Se il criterio non viene configurato, verrà usata la configurazione predefinita del processo audio.
-      Questo criterio è inteso come misura temporanea per dare alle aziende la possibilità di eseguire l'audio con priorità più elevata al fine di risolvere determinati problemi di prestazioni relativi all'acquisizione di audio.
-      Questo criterio verrà rimosso in futuro.</translation>
-<translation id="3413763534078822244">Questo criterio è deprecato. Usa il criterio <ph name="USER_BOREALIS_ALLOWED_NAME" />.
+<translation id="341285788698114069">Questa policy consente di stabilire la priorità del processo audio su Windows.
+      Se la policy viene attivata, il processo audio verrà eseguito con priorità sopra la norma.
+      Se la policy viene disattivata, il processo audio verrà eseguito con priorità normale.
+      Se la policy non viene configurata, verrà usata la configurazione predefinita del processo audio.
+      Questa policy è intesa come misura temporanea per dare alle aziende la possibilità di eseguire l'audio con priorità più elevata al fine di risolvere determinati problemi di prestazioni relativi all'acquisizione di audio.
+      Questa policy verrà rimossa in futuro.</translation>
+<translation id="3413763534078822244">Questa policy è deprecata. Usa la policy <ph name="USER_BOREALIS_ALLOWED_NAME" />.
 
       Consente di gestire la disponibilità di <ph name="BOREALIS_NAME" /> per questo dispositivo.
 
-      Se il criterio viene impostato su false, <ph name="BOREALIS_NAME" /> non sarà disponibile per tutti gli utenti del dispositivo. In caso contrario (se il criterio non viene configurato o se viene impostato su true) <ph name="BOREALIS_NAME" /> sarà disponibile soltanto se non viene disattivato da altri criteri o altre impostazioni.</translation>
-<translation id="3415954062311826850">Il criterio non è supportato in Arc.</translation>
+      Se la policy viene impostata su false, <ph name="BOREALIS_NAME" /> non sarà disponibile per tutti gli utenti del dispositivo. In caso contrario (se la policy non viene configurata o se viene impostata su true) <ph name="BOREALIS_NAME" /> sarà disponibile soltanto se non viene disattivata da altre policy o altre impostazioni.</translation>
+<translation id="3415954062311826850">La policy non è supportata in Arc.</translation>
 <translation id="34160070798637152">Consente di controllare la configurazione di rete a livello di dispositivo.</translation>
 <translation id="3417130629744653218">Consenti ai siti web di chiedere se esistono metodi di pagamento disponibili</translation>
 <translation id="3417391585519621050">Viene attivata la ricerca tramite fotocamera con <ph name="GOOGLE_LENS_PRODUCT_NAME" /> per gli utenti Enterprise</translation>
@@ -3309,18 +3309,18 @@
       Se questa norma viene impostata su false, in <ph name="PRODUCT_OS_NAME" /> non sarà possibile avviare sessioni Ospite.</translation>
 <translation id="3419726087743433857">Consenti le funzionalità di GenAI senza migliorare i modelli di AI</translation>
 <translation id="3423703250826790403">App per Android</translation>
-<translation id="3426434797050451264">Questo criterio può essere utilizzato anche per specificare le app Android come gestori di file predefiniti.</translation>
+<translation id="3426434797050451264">Questa policy può essere utilizzata anche per specificare le app Android come gestori di file predefiniti.</translation>
 <translation id="3428247105888806363">Attiva previsione di rete</translation>
 <translation id="3432863169147125747">Consente di gestire le impostazioni di stampa.</translation>
 <translation id="3434053014926283175">Imposta il tasto destro come tasto principale del mouse.
 
-          Se questo criterio viene attivato, il tasto destro del mouse sarà sempre il tasto principale nella schermata di accesso.
+          Se questa policy viene attivata, il tasto destro del mouse sarà sempre il tasto principale nella schermata di accesso.
 
-          Se questo criterio viene disattivato, il tasto sinistro del mouse sarà sempre il tasto principale nella schermata di accesso.
+          Se questa policy viene disattivata, il tasto sinistro del mouse sarà sempre il tasto principale nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente il tasto principale sulla pagina di accesso sarà il tasto sinistro del mouse, ma l'utente può cambiarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente il tasto principale sulla pagina di accesso sarà il tasto sinistro del mouse, ma l'utente può cambiarlo in qualsiasi momento.</translation>
 <translation id="3434932177006334880">Il nome di questa impostazione era EnableWebBasedSignin nelle versioni di Chrome precedenti alla versione 42 e a partire dalla versione 43 di Chrome tale impostazione non verrà più supportata.
 
       Questa impostazione è utile per i clienti aziendali che utilizzano soluzioni SSO non ancora compatibili con il nuovo flusso di accesso incorporato.
@@ -3333,9 +3333,9 @@
 <translation id="3436217793443508863">Il periodo di tempo, in millisecondi, senza input dell'utente trascorso il quale lo schermo viene bloccato quando viene usata la batteria.</translation>
 <translation id="3437924696598384725">Consente all'utente di gestire le connessioni VPN</translation>
 <translation id="3441664787678256816">Consenti le connessioni aziendali di assistenza da remoto a questo computer</translation>
-<translation id="3442269905344976871">Se il criterio viene impostato su Attivato quando sul dispositivo è disponibile il controller DTC (Diagnostics and Telemetry Controller) <ph name="WILCO_NAME" />, vengono attivati la raccolta, l'elaborazione e la segnalazione di dati telemetrici e diagnostici.
+<translation id="3442269905344976871">Se la policy viene impostata su Attivata quando sul dispositivo è disponibile il controller DTC (Diagnostics and Telemetry Controller) <ph name="WILCO_NAME" />, vengono attivati la raccolta, l'elaborazione e la segnalazione di dati telemetrici e diagnostici.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, viene disattivato il controller DTC e non sarà possibile raccogliere, elaborare o segnalare dati telemetrici e diagnostici del dispositivo.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, viene disattivato il controller DTC e non sarà possibile raccogliere, elaborare o segnalare dati telemetrici e diagnostici del dispositivo.</translation>
 <translation id="3442589735857147823">Consenti agli utenti di usare le macchine virtuali necessarie per supportare le app Linux</translation>
 <translation id="3450649825886735618">Non usare servizi web di Google per correggere gli errori ortografici</translation>
 <translation id="3451422488938880786"> Consente l'attivazione o la disattivazione delle nuove mappature delle scorciatoie da tastiera internazionali</translation>
@@ -3351,15 +3351,15 @@
 <translation id="3459509316159669723">Stampa</translation>
 <translation id="3460485593332210712">Consenti Chrome for Testing</translation>
 <translation id="3461279434465463233">Segnala lo stato dell'alimentazione</translation>
-<translation id="3468115890799739909">Questo criterio consente di stabilire la visibilità della pagina della cronologia di Chrome organizzata in gruppi di pagine.
+<translation id="3468115890799739909">Questa policy consente di stabilire la visibilità della pagina della cronologia di Chrome organizzata in gruppi di pagine.
 
-      Se il criterio viene attivato, all'indirizzo chrome://history/grouped sarà visibile una pagina della cronologia di Chrome organizzata in gruppi.
+      Se la policy viene attivata, all'indirizzo chrome://history/grouped sarà visibile una pagina della cronologia di Chrome organizzata in gruppi.
 
-      Se il criterio viene disattivato, all'indirizzo chrome://history/grouped non sarà visibile una pagina della cronologia di Chrome organizzata in gruppi.
+      Se la policy viene disattivata, all'indirizzo chrome://history/grouped non sarà visibile una pagina della cronologia di Chrome organizzata in gruppi.
 
-      Se il criterio non viene configurato, all'indirizzo chrome://history/grouped sarà visibile per impostazione predefinita una pagina della cronologia di Chrome organizzata in gruppi.
+      Se la policy non viene configurata, all'indirizzo chrome://history/grouped sarà visibile per impostazione predefinita una pagina della cronologia di Chrome organizzata in gruppi.
 
-      Tieni presente che se il criterio <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> viene disattivato, ma il criterio <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> viene attivato o non viene configurato, all'indirizzo chrome://history/grouped sarà comunque disponibile una pagina della cronologia di Chrome organizzata in gruppi, che però potrebbe essere meno pertinente per l'utente.
+      Tieni presente che se la policy <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> viene disattivata, ma la policy <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> viene attivata o non viene configurata, all'indirizzo chrome://history/grouped sarà comunque disponibile una pagina della cronologia di Chrome organizzata in gruppi, che però potrebbe essere meno pertinente per l'utente.
 </translation>
 <translation id="3469713571374938745">Consenti Crea temi senza migliorare i modelli di AI.</translation>
 <translation id="3471245568493482863">L'API Direct Sockets consente la comunicazione con endpoint arbitrari che utilizzano TCP e UDP.
@@ -3378,39 +3378,39 @@
 <translation id="3480961938508521469">Carica completamente la batteria con la modalità standard.</translation>
 <translation id="348110646151632565">Consente di attivare la funzione di accessibilità Seleziona per ascoltare sulla schermata di accesso.
 
-          Se questo criterio è impostato su true, la funzionalità Seleziona per ascoltare sarà sempre attivata nella schermata di accesso.
+          Se questa policy è impostata su true, la funzionalità Seleziona per ascoltare sarà sempre attivata nella schermata di accesso.
 
-          Se questo criterio è impostato su false, la funzionalità Seleziona per ascoltare sarà sempre disattivata nella schermata di accesso.
+          Se questa policy è impostata su false, la funzionalità Seleziona per ascoltare sarà sempre disattivata nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la funzionalità Seleziona per ascoltare è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente la funzionalità Seleziona per ascoltare è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="3483585138745445814">Consenti agli utenti di attivare la Condivisione nelle vicinanze</translation>
 <translation id="3484305545282013129">Consenti alle origini di accedere alle autorizzazioni del browser disponibili per l'origine di installazione del kiosk web.</translation>
 <translation id="3485200437120267231">Disattiva l'intercettazione dell'accesso</translation>
 <translation id="3485222925928396648">Google Chat (supportato a partire dalla versione 135)</translation>
 <translation id="3487651201232258606">Messaggi nativi</translation>
-<translation id="3492351353716550742">Non viene usato un criterio relativo al referrer predefinito no-referrer-when-downgrade</translation>
-<translation id="3492834335089638487">Questo criterio consente di controllare l'utilizzo delle app Android di fonti non attendibili (diverse dal Google Play Store) per un dispositivo.
+<translation id="3492351353716550742">Non viene usata una policy relativa al referrer predefinito no-referrer-when-downgrade</translation>
+<translation id="3492834335089638487">Questa policy consente di controllare l'utilizzo delle app Android di fonti non attendibili (diverse dal Google Play Store) per un dispositivo.
 
-      Se il valore di questo criterio non viene impostato, la funzionalità viene considerata vietata.
+      Se il valore di questa policy non viene impostato, la funzionalità viene considerata vietata.
 
-      La disponibilità di questa funzione dipende anche dai criteri relativi agli utenti corrispondenti.</translation>
-<translation id="3495602011142234826">Se il criterio viene impostato su Vero, questa estensione può usare tutte le chiavi designate per uso aziendale per firmare dati arbitrari. Se viene impostato su Falso, l'estensione non può accedere a tali chiavi e l'utente non può concedere tale autorizzazione. Come eccezione, un'estensione può accedere a tale chiave esattamente una volta se la stessa estensione ha generato tale chiave.</translation>
+      La disponibilità di questa funzione dipende anche dalle policy relative agli utenti corrispondenti.</translation>
+<translation id="3495602011142234826">Se la policy viene impostata su True, questa estensione può usare tutte le chiavi designate per uso aziendale per firmare dati arbitrari. Se viene impostata su False, l'estensione non può accedere a tali chiavi e l'utente non può concedere tale autorizzazione. Come eccezione, un'estensione può accedere a tale chiave esattamente una volta se la stessa estensione ha generato tale chiave.</translation>
 <translation id="3496296378755072552">Gestione password</translation>
 <translation id="3496519114741602716">Controlla se gli utenti possono attivare la modalità sviluppatore su chrome://extensions.
 
-Se il criterio non viene configurato, gli utenti possono attivare la modalità sviluppatore nella pagina delle estensioni, a meno che il criterio <ph name="DEVELOPER_TOOLS_AVAILABILITY_POLICY_NAME" /> non venga impostato su <ph name="DEVELOPER_TOOLS_DISALLOWED" /> (2).
-Se il criterio viene impostato su <ph name="ALLOW" /> (0), gli utenti possono attivare la modalità sviluppatore nella pagina delle estensioni.
-Se il criterio viene impostato su <ph name="DISALLOW" /> (1), gli utenti non possono attivare la modalità sviluppatore nella pagina delle estensioni.
+Se la policy non viene configurata, gli utenti possono attivare la modalità sviluppatore nella pagina delle estensioni, a meno che la policy <ph name="DEVELOPER_TOOLS_AVAILABILITY_POLICY_NAME" /> non venga impostata su <ph name="DEVELOPER_TOOLS_DISALLOWED" /> (2).
+Se la policy viene impostata su <ph name="ALLOW" /> (0), gli utenti possono attivare la modalità sviluppatore nella pagina delle estensioni.
+Se la policy viene impostata su <ph name="DISALLOW" /> (1), gli utenti non possono attivare la modalità sviluppatore nella pagina delle estensioni.
 
-Se questo criterio viene configurato, <ph name="DEVELOPER_TOOLS_AVAILABILITY_POLICY_NAME" /> non può più controllare la modalità sviluppatore delle estensioni.</translation>
+Se questa policy viene configurata, <ph name="DEVELOPER_TOOLS_AVAILABILITY_POLICY_NAME" /> non può più controllare la modalità sviluppatore delle estensioni.</translation>
 <translation id="3496761649331792755">Attiva barra dei Preferiti</translation>
-<translation id="3498109920669229084">Impostare il criterio specifica quali estensioni non sono soggette alla lista bloccata.
+<translation id="3498109920669229084">Impostare la policy specifica quali estensioni non sono soggette alla lista bloccata.
 
        Il valore <ph name="ALL_EXTENSIONS" /> nella lista bloccata significa che tutte le estensioni vengono bloccate e che gli utenti possono installare solo le estensioni presenti nella lista consentita.
 
-       Per impostazione predefinita, tutte le estensioni sono consentite. Se invece non hai consentito estensioni tramite criterio, utilizza l'elenco delle estensioni consentite per modificare il criterio.</translation>
+       Per impostazione predefinita, tutte le estensioni sono consentite. Se invece non hai consentito estensioni tramite policy, utilizza l'elenco delle estensioni consentite per modificare la policy.</translation>
 <translation id="3501606938635483637">Le scorciatoie da tastiera internazionali sono mappate al glifo dei tasti e non alla posizione del tasto sulla tastiera.</translation>
 <translation id="3501850499442915474">Il provider di <ph name="UIA_NAME" /> verrà attivato o disattivato tramite il framework delle varianti.</translation>
 <translation id="3502438748205582075">Disattiva Kerberos</translation>
@@ -3420,9 +3420,9 @@
 
       I processi di stampa memorizzati in locale possono essere eliminati tramite l'app di gestione della stampa oppure eliminando la cronologia del browser degli utenti.
 
-      Se questo criterio viene attivato o se non viene configurato, l'utente potrà eliminare la propria cronologia dei processi di stampa tramite l'app di gestione della stampa oppure eliminando la cronologia del browser.
+      Se questa policy viene attivata o se non viene configurata, l'utente potrà eliminare la propria cronologia dei processi di stampa tramite l'app di gestione della stampa oppure eliminando la cronologia del browser.
 
-      Se questo criterio viene disattivato, l'utente non potrà eliminare la propria cronologia dei processi di stampa tramite l'app di gestione della stampa oppure eliminando la cronologia del browser.</translation>
+      Se questa policy viene disattivata, l'utente non potrà eliminare la propria cronologia dei processi di stampa tramite l'app di gestione della stampa oppure eliminando la cronologia del browser.</translation>
 <translation id="3507745622376866366">Forza l'attivazione per impostazione predefinita dei gestori di eventi unload durante il ritiro</translation>
 <translation id="350797926066071931">Abilita traduzione</translation>
 <translation id="3513265258454735822">Viene attivato il salvataggio della cronologia del browser</translation>
@@ -3438,13 +3438,13 @@
 <translation id="351654132746710200">Dopo la disattivazione di <ph name="LACROS_NAME" />, la migrazione dei dati non viene eseguita. La cartella <ph name="LACROS_NAME" /> viene rimossa e gli utenti continuano a utilizzare i dati rimanenti.</translation>
 <translation id="3518293344797498431">Carica la batteria fino a circa l'80% per massimizzarne l'autonomia.</translation>
 <translation id="3518512927469906365">Disattiva il partizionamento dello spazio di archiviazione di terze parti per origini di primo livello specifiche</translation>
-<translation id="3522257170445891912">Se questo criterio viene impostato, il flusso di autenticazione dell'accesso avrà uno dei seguenti metodi a seconda del valore dell'impostazione:
+<translation id="3522257170445891912">Se questa policy viene impostata, il flusso di autenticazione dell'accesso avrà uno dei seguenti metodi a seconda del valore dell'impostazione:
 
-      Se è impostato su GAIA, l'accesso verrà effettuato tramite il normale flusso di autenticazione GAIA.
+      Se è impostata su GAIA, l'accesso verrà effettuato tramite il normale flusso di autenticazione GAIA.
 
-      Se è impostato su SAML_INTERSTITIAL, l'accesso reindirizzerà automaticamente all'IdP SAML per impostazione predefinita. L'utente è comunque autorizzato a tornare al normale flusso di accesso a GAIA.
+      Se è impostata su SAML_INTERSTITIAL, l'accesso reindirizzerà automaticamente all'IdP SAML per impostazione predefinita. L'utente è comunque autorizzato a tornare al normale flusso di accesso a GAIA.
 
-      Nota: la schermata di conferma dell'utente aggiuntiva, che è stata visualizzata su <ph name="PRODUCT_NAME" /> fino alla versione 99, non viene più visualizzata. Se l'IdP SAML non è configurato e questo criterio viene impostato su SAML_INTERSTITIAL, il reindirizzamento non riuscirà e verrà restituito l'errore 400.</translation>
+      Nota: la schermata di conferma dell'utente aggiuntiva, che è stata visualizzata su <ph name="PRODUCT_NAME" /> fino alla versione 99, non viene più visualizzata. Se l'IdP SAML non è configurato e questa policy viene impostata su SAML_INTERSTITIAL, il reindirizzamento non riuscirà e verrà restituito l'errore 400.</translation>
 <translation id="3523630512885826906">Intervallo di visualizzazione immagine schermata di blocco schermo utente.</translation>
 <translation id="3524204464536655762">Non consentire ai siti di richiedere l'accesso ai dispositivi USB tramite l'API WebUSB</translation>
 <translation id="3526752951628474302">Solo stampa monocromatica</translation>
@@ -3466,10 +3466,10 @@
       - Controllare i file scaricati da tutte le origini quando vengono trasferiti alla destinazione. Funzionalità supportata su <ph name="PRODUCT_OS_NAME" /> 108 e versioni successive.
 
       Il livello di limitazione può essere impostato su BLOCK, ALLOW, REPORT o WARN.
-      - Se il livello di limitazione è impostato su BLOCK, l'azione non sarà consentita. Se il criterio <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> è impostato su True, l'azione bloccata verrà segnalata all'amministratore.
+      - Se il livello di limitazione è impostato su BLOCK, l'azione non sarà consentita. Se la policy <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> è impostata su True, l'azione bloccata verrà segnalata all'amministratore.
       - Se il livello di limitazione è impostato su ALLOW, l'azione sarà consentita.
-      - Se il livello di limitazione è impostato su REPORT e il criterio <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> è impostato su True, l'azione verrà segnalata all'amministratore.
-      - Se il livello di limitazione è impostato su WARN, l'utente verrà avvisato e potrà scegliere se continuare o annullare l'azione. Se il criterio <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> è impostato su True, la visualizzazione dell'avviso verrà segnalata all'amministratore; verrà segnalata anche la prosecuzione dell'azione.
+      - Se il livello di limitazione è impostato su REPORT e la policy <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> è impostata su True, l'azione verrà segnalata all'amministratore.
+      - Se il livello di limitazione è impostato su WARN, l'utente verrà avvisato e potrà scegliere se continuare o annullare l'azione. Se la policy <ph name="DATA_LEAK_PREVENTION_REPORTING_ENABLED" /> è impostata su True, la visualizzazione dell'avviso verrà segnalata all'amministratore; verrà segnalata anche la prosecuzione dell'azione.
 
       Note:
       - La limitazione PRIVACY_SCREEN non blocca la capacità di attivare la Schermata privata, ma la applica in modo forzato quando la classe della limitazione è impostata su BLOCK.
@@ -3477,12 +3477,12 @@
       - Le destinazioni DRIVE e USB vengono ignorate per la limitazione CLIPBOARD.
       - I pattern URL devono avere il formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
 
-      Se il criterio non viene configurato, non sarà applicata alcuna limitazione.</translation>
+      Se la policy non viene configurata, non sarà applicata alcuna limitazione.</translation>
 <translation id="3531084733660068324">Impostazioni della supervisione dei genitori</translation>
 <translation id="3532827558833318911">Cancella l'accesso con password</translation>
 <translation id="353611922042274900">Mostra sempre le informazioni di sistema nella schermata di accesso</translation>
 <translation id="3536263244905016305">Disattiva l'ottimizzazione WPAD (Web Proxy Auto-Discovery)</translation>
-<translation id="3539103206548425861">Se il criterio viene configurato, la riproduzione video automatica (senza il consenso dell'utente) con contenuti audio è consentita in <ph name="PRODUCT_NAME" />. Se il criterio <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> viene impostato su true, tale criterio non ha effetto. Se il criterio <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> viene impostato su false, l'insieme di pattern URL in tale criterio possono comunque essere riprodotti. Se il criterio viene modificato mentre <ph name="PRODUCT_NAME" /> è in esecuzione, viene applicato solo alle nuove schede aperte.
+<translation id="3539103206548425861">Se la policy viene configurata, la riproduzione video automatica (senza il consenso dell'utente) con contenuti audio è consentita in <ph name="PRODUCT_NAME" />. Se la policy <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> viene impostata su true, tale policy non ha effetto. Se la policy <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> viene impostata su false, l'insieme di pattern URL in tale policy possono comunque essere riprodotti. Se la policy viene modificata mentre <ph name="PRODUCT_NAME" /> è in esecuzione, viene applicata solo alle nuove schede aperte.
 
       Per informazioni dettagliate sui pattern URL validi, vai all'indirizzo https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation>
 <translation id="3540496580121878254">ServiceWorker non controllerà gli iframe srcdoc</translation>
@@ -3493,38 +3493,38 @@
 <translation id="3547954654003013442">Impostazioni proxy</translation>
 <translation id="3548064438634502368">Chiudi i browser</translation>
 <translation id="3548642468619496972">Blocca download dannosi, download insoliti o indesiderati e tipi di file pericolosi.</translation>
-<translation id="3550122827225052130">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
+<translation id="3550122827225052130">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale lo schermo viene bloccato quando viene usata la corrente alternata.
 
-          Se questo criterio viene impostato su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> blocchi lo schermo.
+          Se questa policy viene impostata su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> blocchi lo schermo.
 
-          Se questo criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non blocca lo schermo quando l'utente diventa inattivo.
+          Se questa policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non blocca lo schermo quando l'utente diventa inattivo.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il metodo consigliato per bloccare lo schermo in caso di inattività consiste nell'attivare il blocco dello schermo in caso di sospensione e fare in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Questo criterio dovrebbe essere usato soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non si vuole affatto la sospensione in caso di inattività.
+          Il metodo consigliato per bloccare lo schermo in caso di inattività consiste nell'attivare il blocco dello schermo in caso di sospensione e fare in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Questa policy dovrebbe essere usata soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non si vuole affatto la sospensione in caso di inattività.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori al ritardo di inattività.</translation>
-<translation id="3550875587920006460">Consente di impostare una pianificazione personalizzata per verificare la presenza di aggiornamenti. La scelta è valida per tutti gli utenti e per tutte le interfacce sul dispositivo. Dopo aver impostato il criterio, il dispositivo controllerà se ci sono aggiornamenti disponibili in base alla pianificazione. Il criterio deve essere rimosso per annullare ulteriori controlli pianificati della disponibilità di aggiornamenti.</translation>
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori al ritardo di inattività.</translation>
+<translation id="3550875587920006460">Consente di impostare una pianificazione personalizzata per verificare la presenza di aggiornamenti. La scelta è valida per tutti gli utenti e per tutte le interfacce sul dispositivo. Dopo aver impostato la policy, il dispositivo controllerà se ci sono aggiornamenti disponibili in base alla pianificazione. La policy deve essere rimossa per annullare ulteriori controlli pianificati della disponibilità di aggiornamenti.</translation>
 <translation id="3550963062099410653">Attiva/disattiva gli aggiornamenti automatici estesi</translation>
 <translation id="355118380775352753">Siti web da aprire in un browser alternativo</translation>
 <translation id="3553017634884660206">Destinazione della migrazione dei file utente locali</translation>
 <translation id="3554498762428140109">Attiva Copertura finestra nativa</translation>
 <translation id="3554984410014457319">Consente all'Assistente Google di ascoltare la frase di attivazione vocale</translation>
 <translation id="3557586898458302131">Includi porta non standard nel Kerberos SPN generato</translation>
-<translation id="3557705296383573923">Questo criterio consente di controllare quale stack software viene utilizzato per comunicare con il server DNS: il client DNS del sistema operativo o quello integrato di <ph name="PRODUCT_NAME" />. Questo criterio non influisce sui server DNS utilizzati: se, ad esempio, il sistema operativo viene configurato in modo da usare un server DNS aziendale, lo stesso server viene usato dal client DNS integrato. Non consente nemmeno di controllare se viene utilizzato il protocollo DNS over HTTPS; <ph name="PRODUCT_NAME" /> userà sempre il resolver integrato per le richieste DNS over HTTPS. Per informazioni relative al controllo del protocollo DNS over HTTPS, vedi il criterio <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" />.
+<translation id="3557705296383573923">Questa policy consente di controllare quale stack software viene utilizzato per comunicare con il server DNS: il client DNS del sistema operativo o quello integrato di <ph name="PRODUCT_NAME" />. Questa policy non influisce sui server DNS utilizzati: se, ad esempio, il sistema operativo viene configurato in modo da usare un server DNS aziendale, lo stesso server viene usato dal client DNS integrato. Non consente nemmeno di controllare se viene utilizzato il protocollo DNS over HTTPS; <ph name="PRODUCT_NAME" /> userà sempre il resolver integrato per le richieste DNS over HTTPS. Per informazioni relative al controllo del protocollo DNS over HTTPS, vedi la policy <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" />.
 
-      Se questo criterio viene attivato o se non viene configurato, viene utilizzato il client DNS integrato.
+      Se questa policy viene attivata o se non viene configurata, viene utilizzato il client DNS integrato.
 
-      Se viene disattivato, il client DNS integrato viene utilizzato soltanto quando viene usato il protocollo DNS over HTTPS.</translation>
+      Se viene disattivata, il client DNS integrato viene utilizzato soltanto quando viene usato il protocollo DNS over HTTPS.</translation>
 <translation id="3558024517032824255">Consente di specificare il numero minimo di obiettivi di <ph name="PRODUCT_OS_NAME" /> consentiti per il rollback a partire dalla versione stabile in qualsiasi momento.
 
 L'impostazione predefinita è 0 per il consumatore, 4 (circa sei mesi) per i dispositivi aziendali registrati.
 
-La configurazione di questo criterio impedisce che la protezione del rollback venga applicata, come minimo, a questo numero di obiettivi.
+La configurazione di questa policy impedisce che la protezione del rollback venga applicata, come minimo, a questo numero di obiettivi.
 
-Se imposti un valore più basso per questo criterio, l'effetto è permanente: il dispositivo POTREBBE non essere in grado di eseguire il rollback alle versioni precedenti anche dopo aver reimpostato un valore maggiore del criterio.
+Se imposti un valore più basso per questa policy, l'effetto è permanente: il dispositivo POTREBBE non essere in grado di eseguire il rollback alle versioni precedenti anche dopo aver reimpostato un valore maggiore della policy.
 
 Le possibilità effettive di eseguire il rollback potrebbero dipendere anche dalla scheda e dalle patch di vulnerabilità critiche.</translation>
 <translation id="3565284547329101236">Precarica l'immagine <ph name="ARC_VM" /> su Flex</translation>
@@ -3535,30 +3535,30 @@
 <translation id="3575011234198230041">Autenticazione HTTP</translation>
 <translation id="3575159471980949522">Non consentire agli utenti di inviare numeri di telefono da Chrome al loro dispositivo Android</translation>
 <translation id="3577251398714997599">Impostazione annunci per i siti con annunci invasivi</translation>
-<translation id="3577628175311752799">Utilizza un criterio relativo al referrer predefinito no-referrer-when-downgrade.</translation>
-<translation id="3578741808802810963">Se il criterio viene impostato su Enabled, gli strumenti per la risoluzione dei problemi relativi a Kiosk possono essere usati in una sessione Kiosk:
+<translation id="3577628175311752799">Utilizza una policy relativa al referrer predefinito no-referrer-when-downgrade.</translation>
+<translation id="3578741808802810963">Se la policy viene impostata su Enabled, gli strumenti per la risoluzione dei problemi relativi a Kiosk possono essere usati in una sessione Kiosk:
 - Strumenti per sviluppatori di Chrome
 - Finestra del browser Chrome
 - Task Manager
-Se il criterio non viene configurato o se viene impostato su Disabled, gli strumenti per la risoluzione dei problemi relativi a Kiosk vengono disattivati.
+Se la policy non viene configurata o se viene impostata su Disabled, gli strumenti per la risoluzione dei problemi relativi a Kiosk vengono disattivati.
 
-Ricorda di non tenere questo criterio sempre attivo, soprattutto nelle distribuzioni di produzione.</translation>
+Ricorda di non tenere questa policy sempre attiva, soprattutto nelle distribuzioni di produzione.</translation>
 <translation id="357917253161699596">Consenti agli utenti di gestire i certificati utente</translation>
 <translation id="3579976772194405786">Bruschetta</translation>
 <translation id="3580414086211696382">Controlla l'utilizzo dell'API file system per la lettura</translation>
 <translation id="3584194414857209694">Abilita i criteri sperimentali</translation>
-<translation id="3584722841530002134">La configurazione del criterio consente di assegnare i server a cui <ph name="PRODUCT_NAME" /> può delegare le credenziali utente. Se ci sono più server, separane i nomi utilizzando virgole. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
+<translation id="3584722841530002134">La configurazione della policy consente di assegnare i server a cui <ph name="PRODUCT_NAME" /> può delegare le credenziali utente. Se ci sono più server, separane i nomi utilizzando virgole. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-      Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> non delega le credenziali utente, anche se un server viene rilevato come Intranet.</translation>
+      Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> non delega le credenziali utente, anche se un server viene rilevato come Intranet.</translation>
 <translation id="3585177699591644295">Consente di attivare la funzione di accessibilità Seleziona per ascoltare.
 
-          Se questo criterio viene impostato su true, la funzione Seleziona per ascoltare sarà sempre attiva.
+          Se questa policy viene impostata su true, la funzione Seleziona per ascoltare sarà sempre attiva.
 
-          Se questo criterio viene impostato su false, la funzione Seleziona per ascoltare sarà sempre disattivata.
+          Se questa policy viene impostata su false, la funzione Seleziona per ascoltare sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la funzione Seleziona per ascoltare è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente la funzione Seleziona per ascoltare è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="3587482841069643663">Tutti</translation>
 <translation id="3587487647039152577">Questa impostazione è deprecata. Consente agli utenti di creare e usare profili secondari e di utilizzare la modalità ospite nel browser <ph name="LACROS_NAME" />.
 
@@ -3583,52 +3583,52 @@
 
       Per informazioni dettagliate su <ph name="CORS" />, visita la pagina <ph name="CORS_HELP_URL" />.
 
-      Tieni presente che, nonostante sia stata comunicata la rimozione di questo criterio nella versione 82 di <ph name="PRODUCT_NAME" />, il criterio è stato rimosso nella versione 84.</translation>
+      Tieni presente che, nonostante sia stata comunicata la rimozione di questa policy nella versione 82 di <ph name="PRODUCT_NAME" />, la policy è stata rimossa nella versione 84.</translation>
 <translation id="3606571057705314194">Selettore profilo disattivato all'avvio</translation>
 <translation id="3608206578291537084">Abilita la Pipeline di reporting criptato</translation>
 <translation id="3608281460204780443">Visualizza l'icona di Chrome Web Store in Avvio app di <ph name="PRODUCT_OS_NAME" /> e nella pagina Nuova scheda</translation>
 <translation id="3608411984079625468">Consente di configurare l'accesso automatico degli utenti per gli account con fornitori di autenticazione tramite un'estensione SSO aziendale.
 
-Se questo criterio viene impostato su 1 (<ph name="POLICY_VALUE_ENABLED" />) o se non viene configurato, i fornitori di autenticazione con un'estensione SSO sul dispositivo utilizzeranno quell'estensione per autenticare gli utenti che provano ad accedere.
+Se questa policy viene impostata su 1 (<ph name="POLICY_VALUE_ENABLED" />) o se non viene configurata, i fornitori di autenticazione con un'estensione SSO sul dispositivo utilizzeranno quell'estensione per autenticare gli utenti che provano ad accedere.
 
-Se questo criterio viene impostato su 0 (<ph name="POLICY_VALUE_DISABLED" />), l'accesso automatico come descritto sopra è disattivato.
+Se questa policy viene impostata su 0 (<ph name="POLICY_VALUE_DISABLED" />), l'accesso automatico come descritto sopra è disattivato.
 
 Questa funzionalità è disponibile a partire da macOS Catalina.
 
-Nota: questo criterio non viene applicato alle modalità Ospite o di navigazione in incognito.</translation>
+Nota: questa policy non viene applicata alle modalità Ospite o di navigazione in incognito.</translation>
 <translation id="3612482251405108708">Avvio automatico della riautenticazione online nella schermata di blocco</translation>
-<translation id="3616490235694929053">Questo criterio consente di stabilire se mostrare o meno la schermata di impostazione delle dimensioni di visualizzazione all'utente durante il primo accesso.
-      Se viene impostato su false, la schermata di impostazione delle dimensioni di visualizzazione non verrà visualizzata.
-      Se il valore è impostato su true, viene visualizzata la schermata di impostazione delle dimensioni del display.</translation>
+<translation id="3616490235694929053">Questa policy consente di stabilire se mostrare o meno la schermata di impostazione delle dimensioni di visualizzazione all'utente durante il primo accesso.
+      Se viene impostata su false, la schermata di impostazione delle dimensioni di visualizzazione non verrà visualizzata.
+      Se il valore è impostata su true, viene visualizzata la schermata di impostazione delle dimensioni del display.</translation>
 <translation id="3622463490728773174">Consenti nuova implementazione</translation>
 <translation id="3623332696371971798">Impedisci l'accesso a Google Foto dall'app di personalizzazione</translation>
-<translation id="3625900437628963632">Se memorizzare il valore della password Kerberos impostato in questo elemento del criterio. Se non viene configurato o se viene impostato su true, la password viene memorizzata. Se viene impostato su false, la password non viene memorizzata. Viene ignorato se il campo della password non è specificato per questo account. Questo campo è supportato a partire dalla versione 116 di ChromeOS.</translation>
+<translation id="3625900437628963632">Se memorizzare il valore della password Kerberos impostato in questo elemento della policy. Se non viene configurata o se viene impostata su true, la password viene memorizzata. Se viene impostata su false, la password non viene memorizzata. Viene ignorata se il campo della password non è specificato per questo account. Questo campo è supportato a partire dalla versione 116 di ChromeOS.</translation>
 <translation id="3627678165642179114">Attiva o disattiva il servizio web di controllo ortografico</translation>
 <translation id="3628480121685794414">Attiva stampa su un lato</translation>
 <translation id="36319015509487508">Non consentire Aiutami a leggere.</translation>
 <translation id="3634125384445314047">Consenti l'accesso tramite Phone Hub a foto e video recenti acquisiti sul telefono.</translation>
-<translation id="3637063789824963261">Se il criterio viene attivato, i dispositivi registrati segnalano i contatori del tempo di esecuzione del dispositivo (solo Intel vPro Gen 14 e versioni successive).
+<translation id="3637063789824963261">Se la policy viene attivata, i dispositivi registrati segnalano i contatori del tempo di esecuzione del dispositivo (solo Intel vPro Gen 14 e versioni successive).
 
-Se il criterio viene disattivato o se non viene configurato, i dispositivi registrati non rilevano o non segnalano i contatori del tempo di esecuzione dei dispositivi.</translation>
-<translation id="3640677352428533707">Questo criterio consente di stabilire se segnalare o meno le informazioni sulla versione, ad esempio la versione, la piattaforma e l'architettura del sistema operativo, la versione di <ph name="PRODUCT_NAME" /> e il canale di <ph name="PRODUCT_NAME" />.
+Se la policy viene disattivata o se non viene configurata, i dispositivi registrati non rilevano o non segnalano i contatori del tempo di esecuzione dei dispositivi.</translation>
+<translation id="3640677352428533707">Questa policy consente di stabilire se segnalare o meno le informazioni sulla versione, ad esempio la versione, la piattaforma e l'architettura del sistema operativo, la versione di <ph name="PRODUCT_NAME" /> e il canale di <ph name="PRODUCT_NAME" />.
 
-Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, verrà ignorato.
+Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, verrà ignorata.
 
-Se il criterio non viene configurato o viene impostato su True, le informazioni sulla versione vengono raccolte.
-Se il criterio viene impostato su False, le informazioni sulla versione non vengono raccolte.
+Se la policy non viene configurata o viene impostata su True, le informazioni sulla versione vengono raccolte.
+Se la policy viene impostata su False, le informazioni sulla versione non vengono raccolte.
 
-Questo criterio viene applicato soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
+Questa policy viene applicata soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+Questa policy viene sempre applicata per <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="3644735978203799620">Consente di attivare la selezione automatica per le acquisizioni multischermo</translation>
 <translation id="3646859102161347133">Impostazione tipo di ingrandimento dello schermo</translation>
-<translation id="3647212518036289905">La configurazione del criterio consente di specificare quale libreria GSSAPI utilizzare per l'autenticazione HTTP. Imposta il criterio sul nome di una libreria o su un percorso completo.
+<translation id="3647212518036289905">La configurazione della policy consente di specificare quale libreria GSSAPI utilizzare per l'autenticazione HTTP. Imposta la policy sul nome di una libreria o su un percorso completo.
 
-      Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> utilizza un nome di libreria predefinito.</translation>
+      Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> utilizza un nome di libreria predefinito.</translation>
 <translation id="3650122925429054129">Disattiva l'evidenziazione del cursore nella schermata di accesso</translation>
-<translation id="365093517647222762">Segnala i dati di telemetria dei siti web per gli URL consentiti specificati dal criterio <ph name="REPORT_WEBSITE_TELEMETRY_ALLOWLIST_POLICY_NAME" /> per gli utenti affiliati.
+<translation id="365093517647222762">Segnala i dati di telemetria dei siti web per gli URL consentiti specificati dalla policy <ph name="REPORT_WEBSITE_TELEMETRY_ALLOWLIST_POLICY_NAME" /> per gli utenti affiliati.
 
-La configurazione del criterio consente di controllare i report sulla telemetria dei siti web per i tipi di dati di telemetria specificati.
-Se il criterio non viene configurato, i dati di telemetria dei siti web non verranno segnalati.</translation>
+La configurazione della policy consente di controllare i report sulla telemetria dei siti web per i tipi di dati di telemetria specificati.
+Se la policy non viene configurata, i dati di telemetria dei siti web non verranno segnalati.</translation>
 <translation id="3651483357891254380">Consenti Overlay di Lens senza migliorare i modelli di AI.</translation>
 <translation id="3652670852519271837">Consenti ai siti di richiedere all'utente l'accesso di lettura di file e directory tramite l'API file system</translation>
 <translation id="3653237928288822292">Icona del provider di ricerca predefinito</translation>
@@ -3639,21 +3639,21 @@
 
 La versione 123 e le versioni precedenti di <ph name="PRODUCT_NAME" /> hanno il seguente comportamento:
 
-Se il criterio viene attivato, <ph name="PRODUCT_NAME" /> eseguirà questo controllo.
+Se la policy viene attivata, <ph name="PRODUCT_NAME" /> eseguirà questo controllo.
 In questo modo è possibile evitare attacchi in cui un utente malintenzionato manipola il browser per interpretare una chiave in modo non intenzionale dal proprietario del certificato.
 
-Se questo criterio viene impostato su Disabled, <ph name="PRODUCT_NAME" /> ignorerà questo controllo nelle connessioni HTTPS che negoziano TLS 1.2 e utilizzano un certificato RSA che si collega a un trust anchor locale. Esempi di trust anchor locali includono i certificati radice installati dall'utente o forniti dai criteri. In tutti gli altri casi, il controllo viene eseguito indipendentemente dall'impostazione di questo criterio.
+Se questa policy viene impostata su Disabled, <ph name="PRODUCT_NAME" /> ignorerà questo controllo nelle connessioni HTTPS che negoziano TLS 1.2 e utilizzano un certificato RSA che si collega a un trust anchor locale. Esempi di trust anchor locali includono i certificati radice installati dall'utente o forniti dalle policy. In tutti gli altri casi, il controllo viene eseguito indipendentemente dall'impostazione di questa policy.
 
-Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> si comporterà come se il criterio fosse attivato.
+Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> si comporterà come se la policy fosse attivata.
 
 Le connessioni che non superano il controllo non andranno a buon fine e restituiranno l'errore ERR_SSL_KEY_USAGE_INCOMPATIBLE. I siti che non superano il controllo e restituiscono questo errore hanno probabilmente un certificato configurato in modo errato. Le moderne suite di crittografia ECDHE_RSA impiegano l'opzione di utilizzo della chiave "digitalSignature", mentre le suite di crittografia con decrittografia RSA precedenti impiegano l'opzione di utilizzo della chiave "keyEncipherment". In caso di dubbi, gli amministratori devono includere entrambi i certificati RSA destinati a HTTPS.</translation>
 <translation id="3655710915351748191">Non visualizzare l'icona di Chrome Web Store in Avvio app di <ph name="PRODUCT_OS_NAME" /> o nella pagina Nuova scheda</translation>
 <translation id="3655885297177292093">L'API Event.path sarà nello stato predefinito: disponibile prima della versione M109 e non disponibile nelle versioni M109-114.</translation>
-<translation id="3659542706175323490">Se il criterio viene impostato su Attivato, l'avvio tramite CA rimane abilitato, se supportato dal dispositivo. L'avvio tramite CA consente al sistema di riavviarsi dallo stato Off o Ibernazione quando il dispositivo viene collegato alla corrente.
+<translation id="3659542706175323490">Se la policy viene impostata su Attivata, l'avvio tramite CA rimane abilitato, se supportato dal dispositivo. L'avvio tramite CA consente al sistema di riavviarsi dallo stato Off o Ibernazione quando il dispositivo viene collegato alla corrente.
 
-      Se il criterio viene impostato su Disattivato, l'avvio tramite CA viene disabilitato.
+      Se la policy viene impostata su Disattivata, l'avvio tramite CA viene disabilitato.
 
-      Se viene configurato, gli utenti non possono modificarlo. Se non viene configurato, il riavvio tramite CA viene disattivato e gli utenti non possono modificare questa impostazione.</translation>
+      Se viene configurata, gli utenti non possono modificarla. Se non viene configurata, il riavvio tramite CA viene disattivato e gli utenti non possono modificare questa impostazione.</translation>
 <translation id="3660562134618097814">Trasferisci i cookie dell'IdP SAML durante l'accesso</translation>
 <translation id="3662660961914441274">Disattiva l'archiviazione locale dei file degli utenti</translation>
 <translation id="3663124775601519286">Se la policy viene impostata su Attivata o se non viene configurata, l'utilizzo dell'API Translator in <ph name="PRODUCT_NAME" /> è consentito.
@@ -3663,11 +3663,11 @@
 <translation id="3665437376055221832">Richiedi la selezione da parte dell'utente quando nessun certificato corrisponde alla selezione automatica.</translation>
 <translation id="3667467644216039144">Consente di configurare un elenco dei tipi di dati di navigazione che dovrebbero essere eliminati alla chiusura di tutte le finestre del browser da parte dell'utente.
 
-Avviso: l'impostazione di questo criterio può influire sulla rimozione definitiva dei dati personali locali. Ti consigliamo di testare le impostazioni prima del deployment per evitare l'eliminazione accidentale di dati personali.
+Avviso: l'impostazione di questa policy può influire sulla rimozione definitiva dei dati personali locali. Ti consigliamo di testare le impostazioni prima del deployment per evitare l'eliminazione accidentale di dati personali.
 
-Tra i tipi di dati disponibili ci sono: cronologia di navigazione (<ph name="DATA_TYPE_BROWSING_HISTORY" />), cronologia dei download (<ph name="DATA_TYPE_DOWNLOAD_HISTORY" />), cookie (<ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />), cache <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, compilazione automatica (<ph name="DATA_TYPE_AUTOFILL" />), password (<ph name="DATA_TYPE_PASSWORD" />), impostazioni sito (<ph name="DATA_TYPE_SITE_SETTINGS" />) e dati di app ospitate (<ph name="DATA_TYPE_HOSTED_APP_DATA" />). Questo criterio non ha la precedenza su <ph name="ALLOW_DELETING_BROWSER_HISTORY_POLICY_NAME" />.
+Tra i tipi di dati disponibili ci sono: cronologia di navigazione (<ph name="DATA_TYPE_BROWSING_HISTORY" />), cronologia dei download (<ph name="DATA_TYPE_DOWNLOAD_HISTORY" />), cookie (<ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />), cache <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, compilazione automatica (<ph name="DATA_TYPE_AUTOFILL" />), password (<ph name="DATA_TYPE_PASSWORD" />), impostazioni sito (<ph name="DATA_TYPE_SITE_SETTINGS" />) e dati di app ospitate (<ph name="DATA_TYPE_HOSTED_APP_DATA" />). Questa policy non ha la precedenza su <ph name="ALLOW_DELETING_BROWSER_HISTORY_POLICY_NAME" />.
 
-Fino a Chrome 114, questo criterio richiedeva l'impostazione del criterio <ph name="SYNC_DISABLED_POLICY_NAME" /> su true. A partire da Chrome 115, la configurazione di questo criterio disattiva la sincronizzazione per i rispettivi tipi di dati se "<ph name="CHROME_SYNC_NAME" />" non viene disattivato impostando il criterio <ph name="SYNC_DISABLED_POLICY_NAME" /> e non viene disattivato <ph name="BROWSER_SIGNIN_POLICY_NAME" />.
+Fino a Chrome 114, questa policy richiedeva l'impostazione della policy <ph name="SYNC_DISABLED_POLICY_NAME" /> su true. A partire da Chrome 115, la configurazione di questa policy disattiva la sincronizzazione per i rispettivi tipi di dati se "<ph name="CHROME_SYNC_NAME" />" non viene disattivata impostando la policy <ph name="SYNC_DISABLED_POLICY_NAME" /> e non viene disattivata <ph name="BROWSER_SIGNIN_POLICY_NAME" />.
 
 Se per qualche motivo l'eliminazione dei dati è stata avviata ma non è stata completata, i dati di navigazione verranno cancellati al successivo caricamento del profilo.
 
@@ -3675,21 +3675,21 @@
 <translation id="3671773704245936868">Disattiva l'evidenziazione dell'elemento attivo tramite tastiera</translation>
 <translation id="3674010627788940405">Le intestazioni delle richieste CORS senza caratteri jolly non sono supportate.</translation>
 <translation id="3675303748198647471">setTimeout(…, 0) viene comunemente utilizzato per suddividere le attività JavaScript di lunga durata.
-          Se il criterio viene impostato su Enabled, i valori di setTimeouts e setIntervals con un intervallo inferiore a 4 ms non vengono limitati in modo aggressivo.
+          Se la policy viene impostata su Enabled, i valori di setTimeouts e setIntervals con un intervallo inferiore a 4 ms non vengono limitati in modo aggressivo.
           Ciò migliora le prestazioni a breve termine, ma in definitiva i valori di setTimeouts dei siti web che abusano dell'API verranno fatti rientrare nei limiti.
 
-          Se il criterio viene impostato su Disabled, i valori di setTimeout e setInterval con un intervallo inferiore a 4 ms vengono limitati.
+          Se la policy viene impostata su Disabled, i valori di setTimeout e setInterval con un intervallo inferiore a 4 ms vengono limitati.
 
           L'operazione potrebbe modificare l'ordine delle attività su una pagina web, causando comportamenti imprevisti sui siti che dipendono in qualche misura da un ordine specifico.
           Potrebbe anche incidere sui siti che utilizzano spesso setTimeout() con timeout di 0 ms, ad esempio causando un aumento del carico della CPU.
 
-          Per gli utenti per cui questo criterio non viene configurato, <ph name="PRODUCT_NAME" /> renderà disponibile gradualmente la modifica sul canale stabile.
+          Per gli utenti per cui questa policy non viene configurata, <ph name="PRODUCT_NAME" /> renderà disponibile gradualmente la modifica sul canale stabile.
 
-          Si tratta di un criterio temporaneo di cui è prevista la rimozione in <ph name="PRODUCT_NAME" /> 107. Questo termine ultimo potrebbe essere esteso nel caso in cui le aziende dovessero averne bisogno.
+          Si tratta di una policy temporanea di cui è prevista la rimozione in <ph name="PRODUCT_NAME" /> 107. Questo termine ultimo potrebbe essere esteso nel caso in cui le aziende dovessero averne bisogno.
           </translation>
 <translation id="3677660004554019617">Non consentire lo Sfondo AI generativa per videoconferenze</translation>
 <translation id="3678069907945250643">Consenti l'accesso a Google Foto dall'app di personalizzazione</translation>
-<translation id="3685979383016152590">La configurazione del criterio consente di determinare quale criterio di accesso applicare per la configurazione collettiva delle stampanti, al fine di stabilire quali stampanti del criterio <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> mettere a disposizione degli utenti.
+<translation id="3685979383016152590">La configurazione della policy consente di determinare quale policy di accesso applicare per la configurazione collettiva delle stampanti, al fine di stabilire quali stampanti della policy <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> mettere a disposizione degli utenti.
 
       * Per l'opzione <ph name="PRINTERS_BLOCKLIST" /> (valore 0) viene usato il valore <ph name="PRINTERS_BULK_BLOCKLIST" /> per limitare l'accesso alle stampanti specificate.
 
@@ -3697,7 +3697,7 @@
 
       * L'opzione <ph name="PRINTERS_ALLOW_ALL" /> (valore 2) consente di visualizzare tutte le stampanti.
 
-      Se il criterio non viene configurato, viene usata l'opzione <ph name="PRINTERS_ALLOW_ALL" />.</translation>
+      Se la policy non viene configurata, viene usata l'opzione <ph name="PRINTERS_ALLOW_ALL" />.</translation>
 <translation id="3686607051786495544">Disattiva sandbox LPAC per i servizi di stampa</translation>
 <translation id="3695204334462456702">Destinazioni protocolli (mDNS e DNS-SD) basate su configurazione automatica (opzione deprecata)</translation>
 <translation id="3695706037816556327">Azione alla rimozione del token di sicurezza (ad esempio smart card) per <ph name="PRODUCT_OS_NAME" /></translation>
@@ -3721,22 +3721,22 @@
 Per il corretto funzionamento dell'app Trasferimento dei contenuti, è necessario attivare anche il trasferimento di dati con Takeout. Per maggiori informazioni, visita la pagina https://support.google.com/a/answer/6364687.</translation>
 <translation id="3702518095257671450">Attestazione da remoto</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Il campo a una sola riga è obsoleto e sarà rimosso a breve. Inizia a usare la casella di testo multiriga qui sotto).</translation>
-<translation id="3711561721191203926">Se questo criterio viene impostato su Attivato, ogni volta che dovrebbe essere visualizzato un avviso in <ph name="DEV_TOOLS_NAME" /> a causa di controlli <ph name="PRIVATE_NETWORK_ACCESS" /> non riusciti, la richiesta principale verrà bloccata.
+<translation id="3711561721191203926">Se questa policy viene impostata su Attivata, ogni volta che dovrebbe essere visualizzato un avviso in <ph name="DEV_TOOLS_NAME" /> a causa di controlli <ph name="PRIVATE_NETWORK_ACCESS" /> non riusciti, la richiesta principale verrà bloccata.
 
-Se questo criterio viene impostato su Disattivato o se non viene configurato, tutti gli avvisi di <ph name="PRIVATE_NETWORK_ACCESS" /> non verranno applicati in modo forzato e le richieste non verranno bloccate.
+Se questa policy viene impostata su Disattivata o se non viene configurata, tutti gli avvisi di <ph name="PRIVATE_NETWORK_ACCESS" /> non verranno applicati in modo forzato e le richieste non verranno bloccate.
 
 Visita la pagina https://wicg.github.io/private-network-access/ per conoscere le limitazioni relative a <ph name="PRIVATE_NETWORK_ACCESS" />.</translation>
 <translation id="3711895659073496551">Sospensione</translation>
 <translation id="3712861436661566358">Applica separazione dei profili</translation>
 <translation id="3719826155360621982">Home page</translation>
 <translation id="3724039569609354541">Usa il comportamento predefinito quando determini se i siti web possono effettuare richieste agli endpoint di rete</translation>
-<translation id="3727476641336727380">A meno che <ph name="ALLOW_WAKE_LOCKS_POLICY_NAME" /> non sia impostato su Disattivato, la mancata configurazione o l'impostazione del criterio <ph name="ALLOW_SCREEN_WAKE_LOCKS_POLICY_NAME" /> su Attivato consente i wakelock dello schermo per la gestione dell'alimentazione. Le estensioni possono richiedere wakelock dello schermo tramite l'API dell'estensione di gestione dell'alimentazione e le app ARC.
+<translation id="3727476641336727380">A meno che <ph name="ALLOW_WAKE_LOCKS_POLICY_NAME" /> non sia impostata su Disattivata, la mancata configurazione o l'impostazione della policy <ph name="ALLOW_SCREEN_WAKE_LOCKS_POLICY_NAME" /> su Attivata consente i wakelock dello schermo per la gestione dell'alimentazione. Le estensioni possono richiedere wakelock dello schermo tramite l'API dell'estensione di gestione dell'alimentazione e le app ARC.
 
-      Se il criterio viene impostato su Disattivato, le richieste di wakelock dello schermo vengono retrocesse a richieste di wakelock del sistema.</translation>
-<translation id="3727675072430693164">Se il criterio viene impostato su Attivato, i dispositivi registrati segnalano statistiche hardware relative ai componenti SoC.
+      Se la policy viene impostata su Disattivata, le richieste di wakelock dello schermo vengono retrocesse a richieste di wakelock del sistema.</translation>
+<translation id="3727675072430693164">Se la policy viene impostata su Attivata, i dispositivi registrati segnalano statistiche hardware relative ai componenti SoC.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i dispositivi registrati non segnalano le statistiche.</translation>
-<translation id="3729937245044939404">Questo criterio è stata deprecato in M70, utilizza invece <ph name="AUTOFILL_ADDRESS_ENABLED_POLICY_NAME" /> e <ph name="AUTOFILL_CREDIT_CARD_ENABLED_POLICY_NAME" />.
+      Se la policy viene impostata su Disattivata o se non viene configurata, i dispositivi registrati non segnalano le statistiche.</translation>
+<translation id="3729937245044939404">Questa policy è stata deprecata in M70, utilizza invece <ph name="AUTOFILL_ADDRESS_ENABLED_POLICY_NAME" /> e <ph name="AUTOFILL_CREDIT_CARD_ENABLED_POLICY_NAME" />.
 
       Consente di attivare la funzionalità di compilazione automatica di <ph name="PRODUCT_NAME" /> e permette agli utenti di compilare automaticamente i moduli web utilizzando informazioni memorizzate in precedenza, come l'indirizzo o i dati della carta di credito.
 
@@ -3751,9 +3751,9 @@
 <translation id="3750220015372671395">Blocca la generazione di chiavi su questi siti</translation>
 <translation id="3753267109888284695">Lista consentita HTTP</translation>
 <translation id="3753959315989102457">Disattiva la segnalazione della posizione del dispositivo</translation>
-<translation id="3755237588083934849">Questo criterio consente di stabilire la frequenza di invio, in millisecondi, dei caricamenti dello stato del dispositivo. Il valore minimo consentito è 60 secondi.
+<translation id="3755237588083934849">Questa policy consente di stabilire la frequenza di invio, in millisecondi, dei caricamenti dello stato del dispositivo. Il valore minimo consentito è 60 secondi.
 
-      Se il criterio non viene configurato, viene applicato l'intervallo predefinito di 3 ore.</translation>
+      Se la policy non viene configurata, viene applicato l'intervallo predefinito di 3 ore.</translation>
 <translation id="3755796472192036324">Colore della retroilluminazione della tastiera bianco</translation>
 <translation id="3755902888263933411">Consenti la funzionalità di ricerca nella cronologia basata sull'AI senza migliorare i modelli di AI.</translation>
 <translation id="3756011779061588474">Blocca modalità sviluppatore</translation>
@@ -3773,23 +3773,23 @@
       Se queste norme non vengono impostate, gli utenti possono scegliere autonomamente le impostazioni del proxy.</translation>
 <translation id="3758249152301468420">Disabilita Strumenti per sviluppatori</translation>
 <translation id="3758910737665387561">Consenti ai dispositivi di utilizzare PluginVm</translation>
-<translation id="3759650373178711405">A meno che il criterio <ph name="RESTORE_ON_STARTUP_POLICY_NAME" /> non sia impostato per ripristinare in modo permanente gli URL delle sessioni precedenti, l'impostazione di <ph name="COOKIES_SESSION_ONLY_FOR_URLS_POLICY_NAME" /> ti consente di creare un elenco di pattern URL che specificano i siti che possono o meno impostare i cookie per una sessione.
+<translation id="3759650373178711405">A meno che la policy <ph name="RESTORE_ON_STARTUP_POLICY_NAME" /> non sia impostata per ripristinare in modo permanente gli URL delle sessioni precedenti, l'impostazione di <ph name="COOKIES_SESSION_ONLY_FOR_URLS_POLICY_NAME" /> ti consente di creare un elenco di pattern URL che specificano i siti che possono o meno impostare i cookie per una sessione.
 
-      Se il criterio non viene configurato, viene usato <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente. In caso di URL non interessati dai pattern specificati, vengono applicate le impostazioni predefinite.
+      Se la policy non viene configurata, viene usata <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente. In caso di URL non interessati dai pattern specificati, vengono applicate le impostazioni predefinite.
 
-      Poiché nessun criterio specifico prevale, vedi <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. I pattern URL di questi tre criteri non devono essere in conflitto.</translation>
+      Poiché nessuna policy specifica prevale, vedi <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. I pattern URL di queste tre policy non devono essere in conflitto.</translation>
 <translation id="3760148113224469113">Richiedi sempre agli utenti di confermare i messaggi relativi ai protocolli esterni</translation>
 <translation id="3760231600118073732">La sessione corrente viene bloccata</translation>
 <translation id="3761222804122755011">WebRTC utilizzerà l'interfaccia solo se si connette a una rete pubblica, ma potrà anche connettersi utilizzando indirizzi IP privati.</translation>
-<translation id="3762520180381586267">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> attiva il riavvio quando gli utenti arrestano il dispositivo. <ph name="PRODUCT_OS_NAME" /> sostituisce tutti i pulsanti di arresto nell'UI con quelli di riavvio. Se gli utenti arrestano i dispositivi utilizzando il tasto di accensione, non verrà eseguito alcun riavvio automatico, nemmeno se il criterio è stato attivato.
+<translation id="3762520180381586267">Se la policy viene impostata su Attivata, <ph name="PRODUCT_OS_NAME" /> attiva il riavvio quando gli utenti arrestano il dispositivo. <ph name="PRODUCT_OS_NAME" /> sostituisce tutti i pulsanti di arresto nell'UI con quelli di riavvio. Se gli utenti arrestano i dispositivi utilizzando il tasto di accensione, non verrà eseguito alcun riavvio automatico, nemmeno se la policy è stata attivata.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, <ph name="PRODUCT_OS_NAME" /> consente agli utenti di arrestare il dispositivo.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, <ph name="PRODUCT_OS_NAME" /> consente agli utenti di arrestare il dispositivo.</translation>
 <translation id="376375951585423504">Disattiva la quota permanente.</translation>
 <translation id="3765260570442823273">Durata del messaggio di avviso di uscita per inattività</translation>
 <translation id="3766695867369523703">Consenti il partizionamento dello spazio di archiviazione di terze parti per impostazione predefinita.</translation>
-<translation id="3770407495263198786">La configurazione del criterio consente agli amministratori di impostare un elenco di stampanti per i loro utenti. La selezione della stampante viene effettuata la prima volta che gli utenti provano a stampare.
+<translation id="3770407495263198786">La configurazione della policy consente agli amministratori di impostare un elenco di stampanti per i loro utenti. La selezione della stampante viene effettuata la prima volta che gli utenti provano a stampare.
 
-      Se viene usato il criterio:
+      Se viene usata la policy:
 
       * È possibile personalizzare le stringhe in formato libero <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> per facilitare la selezione delle stampanti.
 
@@ -3799,11 +3799,11 @@
 
       * In via facoltativa, è possibile specificare un valore <ph name="PRINTER_UUID" /> per facilitare la deduplicazione delle stampanti <ph name="ZEROCONF_DISCOVERY" />.
 
-      * E' possibile usare il nome del modello di <ph name="PRINTER_EFFECTIVE_MODEL" /> o impostare <ph name="PRINTER_AUTOCONF" /> su Vero. Le stampanti con entrambe le proprietà o prive di proprietà vengono ignorate.
+      * E' possibile usare il nome del modello di <ph name="PRINTER_EFFECTIVE_MODEL" /> o impostare <ph name="PRINTER_AUTOCONF" /> su True. Le stampanti con entrambe le proprietà o prive di proprietà vengono ignorate.
 
-      I file PPD vengono scaricati dopo l'utilizzo della stampante e i file PPD usati più spesso vengono memorizzati nella cache. Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.
+      I file PPD vengono scaricati dopo l'utilizzo della stampante e i file PPD usati più spesso vengono memorizzati nella cache. Questa policy non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.
 
-      Nota: per i dispositivi <ph name="MS_AD_NAME" /> gestiti, questo criterio supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina <ph name="MS_AD_NAME" /> oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> viene sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. La posizione è in base zero.</translation>
+      Nota: per i dispositivi <ph name="MS_AD_NAME" /> gestiti, questa policy supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina <ph name="MS_AD_NAME" /> oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> viene sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. La posizione è in base zero.</translation>
 <translation id="377044054160169374">Applicazione dell'intervento in caso di esperienza intrusiva</translation>
 <translation id="3778689139323007309">Esegui i controlli delle revoche per i certificati dei server che vengono convalidati correttamente e firmati tramite certificati CA installati localmente</translation>
 <translation id="3780152581321609624">Includi porta non standard in Kerberos SPN</translation>
@@ -3824,32 +3824,32 @@
 <translation id="3791179836066841809">Documentazione per le norme</translation>
 <translation id="379318040165550702">Consenti agli utenti di scegliere</translation>
 <translation id="3796527892245558832">Selettore profilo disponibile all'avvio</translation>
-<translation id="3798922329287609568">La configurazione del criterio consente di limitare la modalità di stampa fronte/retro.
+<translation id="3798922329287609568">La configurazione della policy consente di limitare la modalità di stampa fronte/retro.
 
-      Se il criterio non viene configurato o se viene lasciato vuoto, non vengono applicate limitazioni.</translation>
+      Se la policy non viene configurata o se viene lasciata vuota, non vengono applicate limitazioni.</translation>
 <translation id="3799417300383048419">Mantieni i dati del profilo su disco al termine della sessione utente</translation>
 <translation id="3799436555130241393">Sincronizzazione file di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="3803171355925844705">Non consentire il caricamento di contenuti misti in nessun sito</translation>
 <translation id="3808945828600697669">Specifica un elenco dei plug-in disattivati</translation>
 <translation id="3810642039169532482">Consente di attivare la funzione di accessibilità di dettatura nella schermata di accesso.
 
-          Se questo criterio è impostato su true, la dettatura sarà sempre attivata nella schermata di accesso.
+          Se questa policy è impostata su true, la dettatura sarà sempre attivata nella schermata di accesso.
 
-          Se questo criterio è impostato su false, la dettatura sarà sempre disattivata nella schermata di accesso.
+          Se questa policy è impostata su false, la dettatura sarà sempre disattivata nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la dettatura è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente la dettatura è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="3811562426301733860">Consenti annunci su tutti i siti</translation>
 <translation id="3816312845600780067">Attivazione scorciatoia da tastiera bailout per accesso automatico</translation>
 <translation id="3817323252437541502">Attiva protezioni aggiuntive per gli utenti iscritti al programma di protezione avanzata</translation>
 <translation id="3821861026311587684">Forza la disconnessione dell'utente quando il suo account non è più autenticato</translation>
 <translation id="3822756181940590230">I dati UEFI iniziali non volatili utilizzati dal firmware della VM.</translation>
-<translation id="3823381379309653965">L'impostazione del criterio specifica il periodo in millisecondi durante il quale il servizio di gestione dei dispositivi viene interrogato per informazioni sui criteri relativi ai dispositivi. I valori validi vanno da 1.800.000 (30 minuti) a 86.400.000 (1 giorno). I valori che non rientrano in questo intervallo verranno bloccati al relativo limite.
+<translation id="3823381379309653965">L'impostazione della policy specifica il periodo in millisecondi durante il quale il servizio di gestione dei dispositivi viene interrogato per informazioni sulle policy relative ai dispositivi. I valori validi vanno da 1.800.000 (30 minuti) a 86.400.000 (1 giorno). I valori che non rientrano in questo intervallo verranno bloccati al relativo limite.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 3 ore.
+      Se la policy non viene impostata, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 3 ore.
 
-      Nota: le notifiche relative ai criteri forzano un aggiornamento quando cambiano i criteri, rendendo quindi superflui aggiornamenti più frequenti. Quindi, se la piattaforma supporta queste notifiche, il ritardo dell'aggiornamento verrà impostato su 24 ore (vengono ignorati tutti i valori predefiniti e il valore di questo criterio).</translation>
+      Nota: le notifiche relative alle policy forzano un aggiornamento quando cambiano le policy, rendendo quindi superflui aggiornamenti più frequenti. Quindi, se la piattaforma supporta queste notifiche, il ritardo dell'aggiornamento verrà impostato su 24 ore (vengono ignorati tutti i valori predefiniti e il valore di questa policy).</translation>
 <translation id="382476126209906314">Configura il prefisso TalkGadget per gli host di accesso remoto</translation>
 <translation id="3824972131618513497">Consente di controllare le impostazioni relative alla gestione dell'alimentazione e al riavvio.</translation>
 <translation id="3825873934240606959">Impedisci rilevamento del dispositivo locale</translation>
@@ -3862,16 +3862,16 @@
       Se questa norma non viene impostata o viene impostata su false, <ph name="PRODUCT_NAME" /> segue il piano di ritiro pubblico.
 
       Visita la pagina https://g.co/chrome/symantecpkicerts per avere ulteriori informazioni sul ritiro.</translation>
-<translation id="3831836327853123066">La configurazione del criterio consente di limitare il tempo di attività del dispositivo tramite la programmazione di riavvii automatici, che è possibile ritardare di massimo 24 ore se un utente sta utilizzando il dispositivo. Il valore del criterio deve essere specificato in secondi. Il valore minimo consentito è 3600 (1 ora).
+<translation id="3831836327853123066">La configurazione della policy consente di limitare il tempo di attività del dispositivo tramite la programmazione di riavvii automatici, che è possibile ritardare di massimo 24 ore se un utente sta utilizzando il dispositivo. Il valore della policy deve essere specificato in secondi. Il valore minimo consentito è 3600 (1 ora).
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo. Se non viene configurato, il tempo di attività del dispositivo non viene limitato.
+      Se la policy viene configurata, gli utenti non possono modificarla. Se non viene configurata, il tempo di attività del dispositivo non viene limitato.
 
       Nota: gli avvii automatici vengono attivati solo quando viene visualizzata la schermata di accesso o durante la sessione di un'app kiosk.</translation>
 <translation id="3835692988507803626">Forza la disattivazione delle lingue per correttore ortografico</translation>
 <translation id="3837424079837455272">Questa norma consente di stabilire se i nuovi utenti possono essere aggiunti a <ph name="PRODUCT_OS_NAME" />. Non impedisce agli utenti di accedere ad Account Google aggiuntivi su Android. Se vuoi impedirlo, configura la norma <ph name="ACCOUNT_TYPES_WITH_MANAGEMENT_DISABLED_CLOUDDPC_POLICY_NAME" /> specifica per Android nell'ambito della norma <ph name="ARC_POLICY_POLICY_NAME" />.</translation>
-<translation id="3838094946886335701">Se il criterio viene impostato (solo come consigliato), puoi registrare un elenco di gestori di protocolli che vengono uniti a quelli registrati dall'utente, con conseguente utilizzo di entrambi i gruppi. Imposta la proprietà "protocollo" sullo schema (ad esempio "mailto") e la proprietà "URL" sul pattern URL dell'applicazione che gestisce lo schema specificato nel campo "protocollo". Il pattern può includere un segnaposto "%s", che viene sostituito dall'URL gestito.
+<translation id="3838094946886335701">Se la policy viene impostata (solo come consigliato), puoi registrare un elenco di gestori di protocolli che vengono uniti a quelli registrati dall'utente, con conseguente utilizzo di entrambi i gruppi. Imposta la proprietà "protocollo" sullo schema (ad esempio "mailto") e la proprietà "URL" sul pattern URL dell'applicazione che gestisce lo schema specificato nel campo "protocollo". Il pattern può includere un segnaposto "%s", che viene sostituito dall'URL gestito.
 
-      Gli utenti non possono rimuovere un gestore di protocollo registrato tramite il criterio. Se però installano un nuovo gestore predefinito, possono cambiare i gestori di protocolli installati in base al criterio.</translation>
+      Gli utenti non possono rimuovere un gestore di protocollo registrato tramite la policy. Se però installano un nuovo gestore predefinito, possono cambiare i gestori di protocolli installati in base alla policy.</translation>
 <translation id="3842619997238271109">Non consente all'host di accesso remoto di usare le autenticazioni con PIN e accoppiamento quando le connessioni client vengono accettate</translation>
 <translation id="3844931982362586388">Questa policy consente di configurare l'URL predefinito della pagina Nuova scheda e impedisce agli utenti di modificarlo.
 
@@ -3918,16 +3918,16 @@
 
           Questa funzione consente di evidenziare l'elemento attivo impostato tramite tastiera.
 
-          Se questo criterio viene attivato, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre attiva.
+          Se questa policy viene attivata, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre attiva.
 
-          Se questo criterio viene disattivato, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre disattivata.
+          Se questa policy viene disattivata, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'evidenziazione dell'elemento attivo tramite tastiera è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
-<translation id="3870300103958000506">A meno che <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> venga impostato su false, se <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> viene impostato su 1 o se non viene configurato, gli annunci sono consentiti su tutti i siti.
+          Se questa policy non viene impostata, inizialmente l'evidenziazione dell'elemento attivo tramite tastiera è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+<translation id="3870300103958000506">A meno che <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> venga impostata su false, se <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> viene impostata su 1 o se non viene configurata, gli annunci sono consentiti su tutti i siti.
 
-      Se il criterio viene impostato su 2, gli annunci sono bloccati sui siti con annunci invasivi.</translation>
+      Se la policy viene impostata su 2, gli annunci sono bloccati sui siti con annunci invasivi.</translation>
 <translation id="3876564097829884243">Attiva la funzionalità EphemeralNetworkPolicies.</translation>
 <translation id="3877517141460819966">Modalità di autenticazione a due fattori integrata</translation>
 <translation id="3879208481373875102">Configura l'elenco delle app web con installazione forzata</translation>
@@ -3947,15 +3947,15 @@
 <translation id="3891175633496805812">Disattiva il controller DTC (Diagnostics and Telemetry Controller) wilco</translation>
 <translation id="3891357445869647828">Abilita JavaScript</translation>
 <translation id="3891769546914233112">Stampa PDF come immagine disponibile</translation>
-<translation id="389527805641080362">Questo criterio consente di stabilire il valore dell'<ph name="IPP_ATTRIBUTE" /> <ph name="INTERNET_PRINTING_PROTOCOL" /> (<ph name="IPP_PROTOCOL" />) <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> nei processi di stampa.
+<translation id="389527805641080362">Questa policy consente di stabilire il valore dell'<ph name="IPP_ATTRIBUTE" /> <ph name="INTERNET_PRINTING_PROTOCOL" /> (<ph name="IPP_PROTOCOL" />) <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> nei processi di stampa.
 
- La configurazione del criterio consente di inviare un valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> aggiuntivo per i processi di stampa inviati a stampanti <ph name="IPP_PROTOCOL" />. Il membro <ph name="CLIENT_TYPE_IPP_ATTRIBUTE" /> del valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> aggiunto verrà impostato su <ph name="CLIENT_TYPE_OTHER" />. Il membro <ph name="CLIENT_NAME_IPP_ATTRIBUTE" /> del valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> aggiunto verrà impostato sul valore del criterio dopo la sostituzione delle variabili segnaposto. Le variabili segnaposto supportate sono <ph name="DIRECTORY_ID_PLACEHOLDER" />, <ph name="SERIAL_NUMBER_PLACEHOLDER" />, <ph name="ASSET_ID_PLACEHOLDER" /> e <ph name="ANNOTATED_LOCATION_PLACEHOLDER" />. Le variabili segnaposto non supportate non verranno sostituite.
+ La configurazione della policy consente di inviare un valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> aggiuntivo per i processi di stampa inviati a stampanti <ph name="IPP_PROTOCOL" />. Il membro <ph name="CLIENT_TYPE_IPP_ATTRIBUTE" /> del valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> aggiunto verrà impostato su <ph name="CLIENT_TYPE_OTHER" />. Il membro <ph name="CLIENT_NAME_IPP_ATTRIBUTE" /> del valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> aggiunto verrà impostato sul valore della policy dopo la sostituzione delle variabili segnaposto. Le variabili segnaposto supportate sono <ph name="DIRECTORY_ID_PLACEHOLDER" />, <ph name="SERIAL_NUMBER_PLACEHOLDER" />, <ph name="ASSET_ID_PLACEHOLDER" /> e <ph name="ANNOTATED_LOCATION_PLACEHOLDER" />. Le variabili segnaposto non supportate non verranno sostituite.
 
  Il valore ottenuto dopo la sostituzione delle variabili segnaposto viene considerato valido se non supera i 127 caratteri e contiene soltanto i seguenti caratteri: lettere minuscole e maiuscole dell'alfabeto inglese, numeri, trattini ("-"), punti (".") e trattini bassi ("_").
 
- Tieni presente che, per motivi di privacy, questo criterio ha effetto solo quando la connessione con la stampante è sicura (schema URI <ph name="IPPS_SCHEME" />) e l'utente che invia il processo di stampa è affiliato. Tieni inoltre presente che questo criterio si applica soltanto alle stampanti che supportano <ph name="CLIENT_INFO_IPP_ATTRIBUTE" />.
+ Tieni presente che, per motivi di privacy, questa policy ha effetto solo quando la connessione con la stampante è sicura (schema URI <ph name="IPPS_SCHEME" />) e l'utente che invia il processo di stampa è affiliato. Tieni inoltre presente che questa policy si applica soltanto alle stampanti che supportano <ph name="CLIENT_INFO_IPP_ATTRIBUTE" />.
 
- Se il criterio non viene configurato oppure se viene impostato un valore vuoto o non valido, non verrà aggiunto un ulteriore valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> alle richieste di processi di stampa.
+ Se la policy non viene configurata oppure se viene impostato un valore vuoto o non valido, non verrà aggiunto un ulteriore valore <ph name="CLIENT_INFO_IPP_ATTRIBUTE" /> alle richieste di processi di stampa.
 </translation>
 <translation id="3896591584655529057">Attiva il salvataggio delle passkey utilizzando Gestore delle password</translation>
 <translation id="3896751141670591496">Se la policy viene attivata o se non viene configurata, vengono mostrati avvisi di sicurezza quando flag della riga di comando potenzialmente pericolosi vengono utilizzati per avviare Chrome.
@@ -3969,39 +3969,39 @@
 <translation id="3897860452756794695">Verrà utilizzato il nuovo comportamento offsetParent.</translation>
 <translation id="3898345958122666461">Disattiva NTLMv2</translation>
 <translation id="3898795800259311780">Consenti o nega acquisizione schermo</translation>
-<translation id="3901722051566830469">Se il criterio viene impostato su Attivato, i criteri associati a un account gestito hanno la precedenza in caso di conflitti con i criteri del browser <ph name="CHROME_ENTERPRISE_CORE_NAME" />.
+<translation id="3901722051566830469">Se la policy viene impostata su Attivata, le policy associate a un account gestito hanno la precedenza in caso di conflitti con le policy del browser <ph name="CHROME_ENTERPRISE_CORE_NAME" />.
 
-Se il criterio viene impostato su Disattivato o non viene impostato, i criteri relativi al cloud a livello di utente hanno la priorità per impostazione predefinita.
+Se la policy viene impostata su Disattivata o non viene impostata, le policy relative al cloud a livello di utente hanno la priorità per impostazione predefinita.
 
-Soltanto i criteri derivanti da utenti sicuri possono ottenere la precedenza. Un utente sicuro è affiliato all'organizzazione che gestisce il suo browser usando <ph name="CHROME_ENTERPRISE_CORE_NAME" />. Tutti gli altri criteri a livello di utente avranno la precedenza per impostazione predefinita.
+Soltanto le policy derivanti da utenti sicuri possono ottenere la precedenza. Un utente sicuro è affiliato all'organizzazione che gestisce il suo browser usando <ph name="CHROME_ENTERPRISE_CORE_NAME" />. Tutte le altre policy a livello di utente avranno la precedenza per impostazione predefinita.
 
-Il criterio può essere combinato con <ph name="POLICY_CLOUD_POLICY_OVERRIDES_PLATFORM_POLICY_POLICY_NAME" />. Se entrambi i criteri vengono attivati, anche i criteri relativi al cloud degli utenti avranno la precedenza sui criteri relativi alla piattaforma in conflitto.</translation>
+La policy può essere combinata con <ph name="POLICY_CLOUD_POLICY_OVERRIDES_PLATFORM_POLICY_POLICY_NAME" />. Se entrambe le policy vengono attivate, anche le policy relative al cloud degli utenti avranno la precedenza sulle policy relative alla piattaforma in conflitto.</translation>
 <translation id="390296766888987595">Mostra la tastiera sullo schermo solo se richiesto dall'utente o dall'applicazione.</translation>
 <translation id="3903313632842363082">Disattiva i report sugli utenti del dispositivo</translation>
 <translation id="3904304709151553598">Disattiva i report sulle informazioni relative alla ventola del dispositivo</translation>
 <translation id="3905883021371603181">Attiva la cancellazione dell'eco per l'audio di sistema</translation>
-<translation id="3907683835264956726">Consente l'accesso online degli utenti in una schermata di blocco. Se il criterio viene impostato su true, la riautenticazione online nella schermata di blocco viene attivata, ad esempio, tramite il criterio <ph name="POLICY" />.
+<translation id="3907683835264956726">Consente l'accesso online degli utenti in una schermata di blocco. Se la policy viene impostata su true, la riautenticazione online nella schermata di blocco viene attivata, ad esempio, tramite la policy <ph name="POLICY" />.
       La riautenticazione viene applicata subito quando è visualizzata la schermata di blocco o la volta successiva che l'utente blocca lo schermo dopo che viene soddisfatta la condizione.
-      Se il criterio viene impostato su false o non viene impostato, gli utenti possono sbloccare in qualsiasi momento lo schermo con le proprie credenziali locali.</translation>
+      Se la policy viene impostata su false o non viene impostata, gli utenti possono sbloccare in qualsiasi momento lo schermo con le proprie credenziali locali.</translation>
 <translation id="3911737181201537215">Questa norma non influisce sulla registrazione effettuata da Android.</translation>
-<translation id="3911960007057904543">L'impostazione di questo criterio consente di unire i criteri selezionati quando provengono da origini diverse, con stesso ambito e livello.
+<translation id="3911960007057904543">L'impostazione di questa policy consente di unire le policy selezionate quando provengono da origini diverse, con stesso ambito e livello.
 
-      Usa il carattere jolly "*" per consentire l'unione di tutti i criteri dell'elenco.
+      Usa il carattere jolly "*" per consentire l'unione di tutte le policy dell'elenco.
 
-      Se un criterio è nell'elenco, nel caso ci sia conflitto tra le origini:
+      Se una policy è nell'elenco, nel caso ci sia conflitto tra le origini:
 
-      * Se hanno lo stesso ambito e lo stesso livello: i valori verranno uniti in un nuovo elenco dei criteri.
+      * Se hanno lo stesso ambito e lo stesso livello: i valori verranno uniti in un nuovo elenco delle policy.
 
-      * Se hanno ambito o livello diversi: verrà applicato il criterio con la priorità massima.
+      * Se hanno ambito o livello diversi: verrà applicata la policy con la priorità massima.
 
-      Se un criterio non è nell'elenco, nel caso ci sia conflitto tra le origini, l'ambito o il livello, verrà applicato il criterio con la priorità massima.</translation>
+      Se una policy non è nell'elenco, nel caso ci sia conflitto tra le origini, l'ambito o il livello, verrà applicata la policy con la priorità massima.</translation>
 <translation id="3913680877415932969">Configura i criteri per controllare il livello delle API di condivisione schermo (ad esempio, getDisplayMedia() o l'API dell'estensione di acquisizione schermata desktop) che un sito può acquisire (ad esempio, acquisizione di schede, finestre o schermate desktop).</translation>
 <translation id="3915395663995367577">URL di un file proxy .pac</translation>
-<translation id="3915587396318773837">Se questo criterio viene configurato, l'host di accesso remoto richiede che i client di autenticazione ricevano un token di autenticazione da questo URL per la connessione.
+<translation id="3915587396318773837">Se questa policy viene configurata, l'host di accesso remoto richiede che i client di autenticazione ricevano un token di autenticazione da questo URL per la connessione.
 
-      Questa funzionalità viene disattivata se il criterio viene lasciato vuoto o se non viene configurato.
+      Questa funzionalità viene disattivata se la policy viene lasciata vuota o se non viene configurata.
 
-      Nota: questo criterio deve essere usato insieme al criterio <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />.</translation>
+      Nota: questa policy deve essere usata insieme alla policy <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />.</translation>
 <translation id="3918339829588313389">Consenti agli utenti di impostare un PIN inefficace</translation>
 <translation id="392227823425989489">Tutte le scorciatoie di sistema verranno sempre attivate come previsto.</translation>
 <translation id="3924506460382372403">Disattiva i report sullo stato della scheda grafica del dispositivo</translation>
@@ -4009,26 +4009,26 @@
 <translation id="3926681471685211524">Controlla l'utilizzo delle chiavi RSA per i certificati server emessi da trust anchor locali</translation>
 <translation id="3927137827189017535">Consente di attivare la funzione di accessibilità dei tasti permanenti nella schermata di accesso.
 
-          Se questo criterio viene impostato su true, i tasti permanenti saranno sempre attivi nella schermata di accesso.
+          Se questa policy viene impostata su true, i tasti permanenti saranno sempre attivi nella schermata di accesso.
 
-          Se questo criterio viene impostato su false, i tasti permanenti saranno sempre disattivati nella schermata di accesso.
+          Se questa policy viene impostata su false, i tasti permanenti saranno sempre disattivati nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente i tasti permanenti sono disattivati nella schermata di accesso, ma l'utente può attivarli in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente i tasti permanenti sono disattivati nella schermata di accesso, ma l'utente può attivarli in qualsiasi momento.</translation>
 <translation id="3927291637826333102">Consenti acquisizione schermate desktop, schede e finestre in base a queste origini</translation>
 <translation id="3928726028264020458">Attiva i report sulle informazioni VPD del dispositivo</translation>
 <translation id="3929433884360648086">Questa funzionalità consente l'utilizzo di "zstd" nell'intestazione della richiesta Accept-Encoding e supporta la decompressione dei contenuti web <ph name="ZSTANDARD_SHORTNAME" />compressi.
 
-Se il criterio viene attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> accetterà i contenuti web compressi con <ph name="ZSTANDARD_SHORTNAME" />.
-Se il criterio viene disattivato, la funzionalità di codifica dei contenuti di <ph name="ZSTANDARD_SHORTNAME" /> viene disattivata.
+Se la policy viene attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> accetterà i contenuti web compressi con <ph name="ZSTANDARD_SHORTNAME" />.
+Se la policy viene disattivata, la funzionalità di codifica dei contenuti di <ph name="ZSTANDARD_SHORTNAME" /> viene disattivata.
 
-Questo criterio è stato pensato per essere temporaneo e verrà rimosso in futuro.</translation>
+Questa policy è stata pensata per essere temporanea e verrà rimossa in futuro.</translation>
 <translation id="3935592079035695061">Millisecondi dalla mezzanotte.</translation>
 <translation id="3941289958028934630">Disattiva la funzione di lettura vocale nella schermata di accesso</translation>
-<translation id="3943930334592166130">Questo criterio controlla se all'utente viene richiesto di selezionare un certificato client quando più certificati corrispondono a <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_POLICY_NAME" />.
-      Se il criterio viene impostato su Attivato, all'utente viene richiesto di selezionare un certificato client quando il criterio di selezione automatica corrisponde a più certificati.
-      Se viene impostato su Disattivato o se non viene configurato, all'utente può essere richiesta la selezione solo quando nessun certificato corrisponde alla selezione automatica.</translation>
+<translation id="3943930334592166130">Questa policy controlla se all'utente viene richiesto di selezionare un certificato client quando più certificati corrispondono a <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_POLICY_NAME" />.
+      Se la policy viene impostata su Attivata, all'utente viene richiesto di selezionare un certificato client quando la policy di selezione automatica corrisponde a più certificati.
+      Se viene impostata su Disattivata o se non viene configurata, all'utente può essere richiesta la selezione solo quando nessun certificato corrisponde alla selezione automatica.</translation>
 <translation id="3947897854999940598">Specifica il modello URI del resolver DNS over HTTPS desiderato con informazioni sull'identità</translation>
 <translation id="3949642828552641632">Consenti il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /></translation>
 <translation id="3950110092991281616">Attiva l'autenticazione ambientale solo nelle sessioni standard.</translation>
@@ -4038,15 +4038,15 @@
 <translation id="3956573780915784996">Gli utenti possono raccogliere dati di rilevamento del rendimento a livello di sistema.</translation>
 <translation id="3956686688560604829">Utilizza la norma SiteList di Internet Explorer per il Supporto dei browser precedenti.</translation>
 <translation id="3958586912393694012">Consenti l'utilizzo di Smart Lock</translation>
-<translation id="3959350391319409669">Questo criterio consente di controllare le impostazioni del codice dinamico per <ph name="PRODUCT_NAME" />.
+<translation id="3959350391319409669">Questa policy consente di controllare le impostazioni del codice dinamico per <ph name="PRODUCT_NAME" />.
 
 La disattivazione del codice dinamico migliora la sicurezza di <ph name="PRODUCT_NAME" /> impedendo a codice dinamico potenzialmente dannoso e codice di terze parti di apportare modifiche al comportamento di <ph name="PRODUCT_NAME" />, ma potrebbe causare problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno del processo del browser.
 
-Se il criterio viene impostato su 0 - Default o se non viene impostato, <ph name="PRODUCT_NAME" /> utilizzerà le impostazioni predefinite.
+Se la policy viene impostata su 0 - Default o se non viene impostata, <ph name="PRODUCT_NAME" /> utilizzerà le impostazioni predefinite.
 
-Se il criterio viene impostato su 1 - DisabledForBrowser, il processo del browser <ph name="PRODUCT_NAME" /> non potrà creare codice dinamico.
+Se la policy viene impostata su 1 - DisabledForBrowser, il processo del browser <ph name="PRODUCT_NAME" /> non potrà creare codice dinamico.
 
-Nota: scopri di più sui criteri relativi alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
+Nota: scopri di più sulle policy relative alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
 <translation id="3960728283243442805">L'utente non avrà la possibilità di selezionare dispositivi di trasmissione nel menu di <ph name="PRODUCT_NAME" /> usando un codice di accesso o scansionando un codice QR.</translation>
 <translation id="3962445567482559878">Usa la modalità EDU dell'esperienza di onboarding dell'assistente</translation>
 <translation id="396261881101930204">Nascondi all'utente consigli di contenuti multimediali</translation>
@@ -4055,16 +4055,16 @@
 <translation id="3965339130942650562">Timeout fino a esecuzione uscita utente non attivo</translation>
 <translation id="396536755218079668">Utenti supervisionati</translation>
 <translation id="3968218878014278212">Consenti l'attivazione di Eche.</translation>
-<translation id="3971673686578912106">Se il criterio viene impostato su Attivato, il plug-in <ph name="PLUGIN_VM_NAME" /> viene abilitato per il dispositivo, a condizione che anche le altre impostazioni lo permettano. <ph name="PLUGIN_VM_ALLOWED_POLICY_NAME" /> e <ph name="USER_PLUGIN_VM_ALLOWED_POLICY_NAME" /> devono essere impostati su True e <ph name="PLUGIN_VM_LICENSE_KEY_POLICY_NAME" /> o <ph name="PLUGIN_VM_USER_ID_POLICY_NAME" /> devono essere configurati per consentire l'esecuzione di <ph name="PLUGIN_VM_NAME" />.
+<translation id="3971673686578912106">Se la policy viene impostata su Attivata, il plug-in <ph name="PLUGIN_VM_NAME" /> viene abilitato per il dispositivo, a condizione che anche le altre impostazioni lo permettano. <ph name="PLUGIN_VM_ALLOWED_POLICY_NAME" /> e <ph name="USER_PLUGIN_VM_ALLOWED_POLICY_NAME" /> devono essere impostate su True e <ph name="PLUGIN_VM_LICENSE_KEY_POLICY_NAME" /> o <ph name="PLUGIN_VM_USER_ID_POLICY_NAME" /> devono essere configurate per consentire l'esecuzione di <ph name="PLUGIN_VM_NAME" />.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, il plug-in <ph name="PLUGIN_VM_NAME" /> non viene attivato per il dispositivo.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, il plug-in <ph name="PLUGIN_VM_NAME" /> non viene attivato per il dispositivo.</translation>
 <translation id="3973371701361892765">Non nascondere mai automaticamente la barra delle app</translation>
 <translation id="3977304360459208438">Utilizza l'impostazione predefinita per le suite di crittografia 3DES in TLS</translation>
-<translation id="3977906634350977040">Se il criterio viene attivato, l'host di accesso remoto può usare le autenticazioni con PIN e accoppiamento quando le connessioni client vengono accettate.
+<translation id="3977906634350977040">Se la policy viene attivata, l'host di accesso remoto può usare le autenticazioni con PIN e accoppiamento quando le connessioni client vengono accettate.
 
-Se viene disattivato, le autenticazioni con PIN o accoppiamento non sono consentite.
+Se viene disattivata, le autenticazioni con PIN o accoppiamento non sono consentite.
 
-Se non viene configurato, l'host può decidere se è possibile utilizzare le autenticazioni con PIN e/o accoppiamento.
+Se non viene configurata, l'host può decidere se è possibile utilizzare le autenticazioni con PIN e/o accoppiamento.
 
 Nota: se l'impostazione non restituisce metodi di autenticazione supportati sia dall'host sia dal client, la connessione viene rifiutata.</translation>
 <translation id="3979738908158213640">URL a cui verrà concesso l'accesso per eseguire l'attestazione del dispositivo durante l'autenticazione SAML</translation>
@@ -4077,9 +4077,9 @@
 <translation id="398294729592983401">Consenti agli utenti di attivare o disattivare l'impostazione Protezione dal fingerprinting di <ph name="PRIVACY_SANDBOX_NAME" /> sul proprio dispositivo.</translation>
 <translation id="3983162212222338509">La risoluzione DNS di sistema può essere essere eseguita nel processo di rete, all'esterno del processo di rete o parzialmente all'interno e all'esterno, a seconda della configurazione del sistema e dei flag funzionalità.</translation>
 <translation id="3986700049001404598">Consenti agli utenti di terminare i processi con il Task Manager di Chrome</translation>
-<translation id="398884292557092447">Se il criterio viene impostato su true o se non viene configurato, gli utenti possono controllare i suggerimenti di compilazione automatica per le carte di credito nella UI.
+<translation id="398884292557092447">Se la policy viene impostata su true o se non viene configurata, gli utenti possono controllare i suggerimenti di compilazione automatica per le carte di credito nella UI.
 
-      Se il criterio è impostato su false, la compilazione automatica non fornisce mai suggerimenti, né compila i dati della carta di credito, né salva dati aggiuntivi della carta di credito che gli utenti potrebbero inviare durante la navigazione sul Web.</translation>
+      Se la policy è impostata su false, la compilazione automatica non fornisce mai suggerimenti, né compila i dati della carta di credito, né salva dati aggiuntivi della carta di credito che gli utenti potrebbero inviare durante la navigazione sul web.</translation>
 <translation id="3989635538409502728">Esci</translation>
 <translation id="3989829840000169163">Blocca punti di estensioni precedenti nel browser</translation>
 <translation id="3990391739475801018">La modalità Risparmio energetico viene disattivata.</translation>
@@ -4087,26 +4087,26 @@
 <translation id="3994043824457743421">Mostra la comunicazione dell'area centrale nella pagina Nuova scheda</translation>
 <translation id="399433537808390819">Non rendere la modalità Desktop unificato disponibile per l'utente</translation>
 <translation id="3995880046827722248">Manifest v2 disabilitato</translation>
-<translation id="3996118331995847766">Se il criterio <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> viene impostato su Enabled, la configurazione di <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> consente di impostare la modalità di ricarica avanzata della batteria. Dalle ore <ph name="CHARGE_START_TIME_FIELD_NAME" /> alle ore <ph name="CHARGE_END_TIME_FIELD_NAME" />, la batteria del dispositivo potrà ricaricarsi completamente solo una volta. Per il periodo di tempo rimanente, la carica delle batterie viene mantenuta a un livello più basso. Il valore del campo <ph name="CHARGE_START_TIME_FIELD_NAME" /> deve essere inferiore a quello del campo <ph name="CHARGE_END_TIME_FIELD_NAME" />.
+<translation id="3996118331995847766">Se la policy <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> viene impostata su Enabled, la configurazione di <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> consente di impostare la modalità di ricarica avanzata della batteria. Dalle ore <ph name="CHARGE_START_TIME_FIELD_NAME" /> alle ore <ph name="CHARGE_END_TIME_FIELD_NAME" />, la batteria del dispositivo potrà ricaricarsi completamente solo una volta. Per il periodo di tempo rimanente, la carica delle batterie viene mantenuta a un livello più basso. Il valore del campo <ph name="CHARGE_START_TIME_FIELD_NAME" /> deve essere inferiore a quello del campo <ph name="CHARGE_END_TIME_FIELD_NAME" />.
 
-      Se il criterio non viene configurato, la modalità di ricarica avanzata della batteria rimane disattivata.
+      Se la policy non viene configurata, la modalità di ricarica avanzata della batteria rimane disattivata.
 
       I valori validi per il campo <ph name="MINUTE_FIELD_NAME" /> in <ph name="CHARGE_START_TIME_FIELD_NAME" /> e <ph name="CHARGE_END_TIME_FIELD_NAME" /> sono 0, 15, 30 e 45.</translation>
-<translation id="3996325823532867220">Questo criterio non è più supportato, ma il criterio correlato <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> potrebbe essere supportato su alcune piattaforme.
+<translation id="3996325823532867220">Questa policy non è più supportata, ma la policy correlata <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> potrebbe essere supportato su alcune piattaforme.
 
       Se questa impostazione viene attivata, <ph name="PRODUCT_NAME" /> verifica i certificati dei server mediante lo strumento di verifica dei certificati integrato.
-      Se viene disattivata, <ph name="PRODUCT_NAME" /> verifica i certificati del server mediante lo strumento di verifica dei certificati precedente fornito dalla piattaforma, a meno che non sia attivo il criterio <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" />.
+      Se viene disattivata, <ph name="PRODUCT_NAME" /> verifica i certificati del server mediante lo strumento di verifica dei certificati precedente fornito dalla piattaforma, a meno che non sia attiva la policy <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" />.
       Se non viene configurata, potrebbe essere utilizzato lo strumento di verifica dei certificati integrato o quello precedente.</translation>
 <translation id="3997496219154877791">Disattiva l'integrazione di Lens</translation>
 <translation id="3997519162482760140">URL a cui verrà concesso l'accesso ai dispositivi di acquisizione video su pagine di accesso SAML</translation>
 <translation id="4004523942550416237">Non mostrare il flusso Voice Match dell'Assistente Google durante la configurazione iniziale</translation>
-<translation id="4007646377576030214"> Tieni presente che questo criterio è stato deprecato nella versione M87 e verrà rimosso nella versione M89. Utilizza invece <ph name="MANAGED_GUEST_SESSION_PRIVACY_WARNINGS_POLICY_NAME" /> per configurare gli avvisi sulla privacy delle sessioni Ospite gestite.
+<translation id="4007646377576030214"> Tieni presente che questa policy è stata deprecata nella versione M87 e verrà rimossa nella versione M89. Utilizza invece <ph name="MANAGED_GUEST_SESSION_PRIVACY_WARNINGS_POLICY_NAME" /> per configurare gli avvisi sulla privacy delle sessioni Ospite gestite.
 
       Controlla la notifica sull'avvio automatico della sessione Ospite gestita su <ph name="PRODUCT_OS_NAME" />.
 
-      Se il criterio viene impostato su True, la notifica di avviso sulla privacy viene chiusa dopo alcuni secondi.
+      Se la policy viene impostata su True, la notifica di avviso sulla privacy viene chiusa dopo alcuni secondi.
 
-      Se il criterio viene impostato su False o non viene impostato, la notifica di avviso sulla privacy viene bloccata finché non viene ignorata dall'utente.</translation>
+      Se la policy viene impostata su False o non viene impostata, la notifica di avviso sulla privacy viene bloccata finché non viene ignorata dall'utente.</translation>
 <translation id="4008507541867797979">Se questa norma viene impostata su True o non viene configurata, nella schermata di accesso di <ph name="PRODUCT_OS_NAME" /> verranno visualizzati gli utenti esistenti tra cui sarà possibile selezionare un utente.
 
       Se la norma è impostata su False, nella schermata di accesso di <ph name="PRODUCT_OS_NAME" /> non verranno visualizzati gli utenti esistenti. Verrà visualizzata la normale schermata di accesso (richiesta di email utente e password o telefono) o la schermata interstiziale SAML (se attivata tramite la norma <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />), a meno che non sia stata configurata una sessione gestita. Quando viene configurata una sessione gestita, verranno visualizzati solo gli account della sessione gestita, consentendo di selezionarne uno.
@@ -4115,38 +4115,38 @@
 <translation id="4009741515395221389">Attiva la migrazione dei dispositivi gestiti da <ph name="MS_AD_NAME" /> nella gestione del cloud.</translation>
 <translation id="4010738624545340900">Consenti richiamo di finestre di dialogo di selezione file</translation>
 <translation id="401260868452018796">Posiziona la barra delle app nella parte inferiore dello schermo</translation>
-<translation id="4015799413391577485">Questo criterio è stato rimosso da M97 dopo la rimozione di 3DES da <ph name="PRODUCT_NAME" />.
+<translation id="4015799413391577485">Questa policy è stata rimossa da M97 dopo la rimozione di 3DES da <ph name="PRODUCT_NAME" />.
 
-      Se il criterio viene impostato su True, le suite di crittografia 3DES in TLS verranno attivate. Se viene impostato su False, verranno disattivate. Se il criterio non viene configurato, le suite di crittografia 3DES sono disattivate per impostazione predefinita. Questo criterio potrebbe essere usato per mantenere momentaneamente la compatibilità con un server obsoleto. Si tratta di una misura temporanea ed è necessario riconfigurare il server.
+      Se la policy viene impostata su True, le suite di crittografia 3DES in TLS verranno attivate. Se viene impostata su False, verranno disattivate. Se la policy non viene configurata, le suite di crittografia 3DES sono disattivate per impostazione predefinita. Questa policy potrebbe essere usata per mantenere momentaneamente la compatibilità con un server obsoleto. Si tratta di una misura temporanea ed è necessario riconfigurare il server.
       </translation>
-<translation id="4016367078069682737">Questo criterio è stato rimosso da M61.
+<translation id="4016367078069682737">Questa policy è stata rimossa da M61.
 
       Consente di specificare il comportamento di un dispositivo con ecryptfs e richiede la transizione alla crittografia ext4.
 
-      Se il criterio viene impostato su "DisallowArc", le app Android vengono disattivate per tutti gli utenti sul dispositivo (incluse quelle che dispongono già della crittografia ext4) e agli utenti non verrà offerta la possibilità di migrazione dalla crittografia ecryptfs alla crittografia ext4.
+      Se la policy viene impostata su "DisallowArc", le app Android vengono disattivate per tutti gli utenti sul dispositivo (incluse quelle che dispongono già della crittografia ext4) e agli utenti non verrà offerta la possibilità di migrazione dalla crittografia ecryptfs alla crittografia ext4.
 
-      Se il criterio viene impostato su "AllowMigration", gli utenti con le home directory criptate tramite ecryptfs hanno la possibilità di eseguirne la migrazione alla crittografia ext4 in base alle necessità (al momento quando Android N sarà disponibile sul dispositivo).
+      Se la policy viene impostata su "AllowMigration", gli utenti con le home directory criptate tramite ecryptfs hanno la possibilità di eseguirne la migrazione alla crittografia ext4 in base alle necessità (al momento quando Android N sarà disponibile sul dispositivo).
 
-      Non viene applicato alle app kiosk, che vengono migrate automaticamente. Se non viene configurato, il dispositivo si comporta come se fosse stato scelto "DisallowArc".</translation>
-<translation id="401650904918322517">Questo criterio è deprecato e verrà rimosso nella versione 89 di <ph name="PRODUCT_OS_NAME" />.
+      Non viene applicata alle app kiosk, che vengono migrate automaticamente. Se non viene configurata, il dispositivo si comporta come se fosse stato scelto "DisallowArc".</translation>
+<translation id="401650904918322517">Questa policy è deprecata e verrà rimossa nella versione 89 di <ph name="PRODUCT_OS_NAME" />.
 
-      Questo criterio consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server.
+      Questa policy consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server.
 
-      Se il criterio è attivato, Risposte rapide potrà accedere ai contenuti selezionati.
-      Se il criterio è disattivato, Risposte rapide non potrà accedere ai contenuti selezionati.
-      Se il criterio non viene impostato, gli utenti possono decidere se autorizzare Risposte rapide ad accedere ai contenuti selezionati.</translation>
-<translation id="4016523784669365747">Questo criterio consente di disattivare la funzionalità degli insiemi proprietari.
+      Se la policy è attivata, Risposte rapide potrà accedere ai contenuti selezionati.
+      Se la policy è disattivata, Risposte rapide non potrà accedere ai contenuti selezionati.
+      Se la policy non viene impostata, gli utenti possono decidere se autorizzare Risposte rapide ad accedere ai contenuti selezionati.</translation>
+<translation id="4016523784669365747">Questa policy consente di disattivare la funzionalità degli insiemi proprietari.
 
-Se questo criterio non viene configurato o se viene attivato, la funzionalità degli insiemi proprietari viene attivata.
+Se questa policy non viene configurata o se viene attivata, la funzionalità degli insiemi proprietari viene attivata.
 
-Se questo criterio viene disattivato, la funzionalità degli insiemi proprietari viene disattivata.
+Se questa policy viene disattivata, la funzionalità degli insiemi proprietari viene disattivata.
 
 Consente inoltre di stabilire se Chrome supporta o meno le integrazioni correlate agli insiemi proprietari.
 
-Equivale al criterio <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />.
-È possibile utilizzare entrambi i criteri, ma a breve questo verrà ritirato, quindi è preferibile usare il criterio <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />.
-Entrambi hanno lo stesso effetto sul comportamento del browser.</translation>
-<translation id="4016700865356669962">Se il criterio viene impostato su Attivato, gli utenti possono usare i modelli di layout di scrivanie.  Se il criterio viene impostato su Disattivato o se non viene configurato, questi modelli non saranno disponibili.</translation>
+Equivale alla policy <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />.
+È possibile utilizzare entrambe le policy, ma a breve questa verrà ritirata, quindi è preferibile usare la policy <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />.
+Entrambe hanno lo stesso effetto sul comportamento del browser.</translation>
+<translation id="4016700865356669962">Se la policy viene impostata su Attivata, gli utenti possono usare i modelli di layout di scrivanie.  Se la policy viene impostata su Disattivata o se non viene configurata, questi modelli non saranno disponibili.</translation>
 <translation id="4020682745012723568">Le app Android non possono accedere ai cookie trasferiti al profilo dell'utente.</translation>
 <translation id="4021684548211845008">Disattiva i suoni in modalità Niente distrazioni.</translation>
 <translation id="4025500273782820766">Consenti agli utenti di selezionare "Consenti sempre" quando viene mostrata una finestra di dialogo relativa a un protocollo esterno per non ricevere più messaggi di conferma in futuro</translation>
@@ -4154,43 +4154,43 @@
 <translation id="4027608872760987929">Attiva il provider di ricerca predefinito</translation>
 <translation id="4030152268425532846">Disattiva l'esclusione dell'accesso automatico</translation>
 <translation id="4043796890723386527">Impedisci agli utenti di creare e usare profili secondari e di utilizzare la modalità ospite nel browser <ph name="LACROS_NAME" /></translation>
-<translation id="4047633048700722778">La configurazione del criterio consente di controllare il filtro di URL di SafeSites, che utilizza l'API Google Safe Search per classificare gli URL come pornografici o meno.
+<translation id="4047633048700722778">La configurazione della policy consente di controllare il filtro di URL di SafeSites, che utilizza l'API Google Safe Search per classificare gli URL come pornografici o meno.
 
-Se il criterio viene impostato su:
+Se la policy viene impostata su:
 
-* Non filtrare i siti di contenuti per adulti, o se non viene configurato, i siti non vengono filtrati
+* Non filtrare i siti di contenuti per adulti, o se non viene configurata, i siti non vengono filtrati
 
 * Filtra i siti di contenuti per adulti, i siti pornografici vengono filtrati
 
-Il criterio viene applicato sia all'URL a cui l'utente accede sia agli iframe. Il criterio <ph name="URL_ALLOWLIST_POLICY_NAME" /> ha la precedenza su questo criterio e può essere utilizzato per ignorare i giudizi dell'API Google Safe Search.</translation>
+La policy viene applicata sia all'URL a cui l'utente accede sia agli iframe. La policy <ph name="URL_ALLOWLIST_POLICY_NAME" /> ha la precedenza su questa policy e può essere utilizzata per ignorare i giudizi dell'API Google Safe Search.</translation>
 <translation id="4051723201852944592">Attiva Copertura finestra</translation>
 <translation id="4052529125939620019">Carica l'estensione del componente CryptoToken all'avvio</translation>
 <translation id="4053157306171963473">Disattiva i report sul tempo di attività del dispositivo</translation>
 <translation id="4056910949759281379">Disabilita protocollo SPDY</translation>
 <translation id="4057113125482566814">Consente di attivare il provider del framework di accessibilità di <ph name="UIA_NAME" /> in <ph name="PRODUCT_NAME" /> per l'utilizzo da parte degli strumenti di accessibilità.
 
-Questo criterio è supportato in <ph name="PRODUCT_NAME" /> per un periodo di transizione di un anno in modo da consentire agli amministratori aziendali di controllare il deployment del provider del framework di accessibilità di <ph name="UIA_NAME" /> del browser. Gli strumenti di accessibilità e gli altri strumenti che utilizzano il framework di accessibilità di <ph name="UIA_NAME" /> per interoperare con il browser potrebbero richiedere aggiornamenti per funzionare correttamente con il provider di <ph name="UIA_NAME" /> del browser. Gli amministratori possono utilizzare questo criterio per disattivare temporaneamente il provider di <ph name="UIA_NAME" /> del browser (ripristinando il comportamento precedente) mentre collaborano con i fornitori per fornire aggiornamenti agli strumenti interessati.
+Questa policy è supportata in <ph name="PRODUCT_NAME" /> per un periodo di transizione di un anno in modo da consentire agli amministratori aziendali di controllare il deployment del provider del framework di accessibilità di <ph name="UIA_NAME" /> del browser. Gli strumenti di accessibilità e gli altri strumenti che utilizzano il framework di accessibilità di <ph name="UIA_NAME" /> per interoperare con il browser potrebbero richiedere aggiornamenti per funzionare correttamente con il provider di <ph name="UIA_NAME" /> del browser. Gli amministratori possono utilizzare questa policy per disattivare temporaneamente il provider di <ph name="UIA_NAME" /> del browser (ripristinando il comportamento precedente) mentre collaborano con i fornitori per fornire aggiornamenti agli strumenti interessati.
 
-Se il criterio viene impostato su false, <ph name="PRODUCT_NAME" /> attiva solo il relativo provider <ph name="MSAA_NAME" />. Gli strumenti di accessibilità e gli altri strumenti che utilizzano il framework di accessibilità di <ph name="UIA_NAME" /> più recente per interoperare con il browser comunicheranno con quest'ultimo tramite uno shim di compatibilità in <ph name="MS_WIN_NAME" />.
+Se la policy viene impostata su false, <ph name="PRODUCT_NAME" /> attiva solo il relativo provider <ph name="MSAA_NAME" />. Gli strumenti di accessibilità e gli altri strumenti che utilizzano il framework di accessibilità di <ph name="UIA_NAME" /> più recente per interoperare con il browser comunicheranno con quest'ultimo tramite uno shim di compatibilità in <ph name="MS_WIN_NAME" />.
 
-Se il criterio viene impostato su true, <ph name="PRODUCT_NAME" /> attiva il proprio provider di <ph name="UIA_NAME" /> oltre al provider <ph name="MSAA_NAME" />.
+Se la policy viene impostata su true, <ph name="PRODUCT_NAME" /> attiva il proprio provider di <ph name="UIA_NAME" /> oltre al provider <ph name="MSAA_NAME" />.
 Gli strumenti di accessibilità e gli altri strumenti che utilizzano il framework di accessibilità di <ph name="UIA_NAME" /> più recente per interoperare con il browser comunicano direttamente con quest'ultimo.
 
-Se il criterio non viene configurato, il framework delle varianti in <ph name="PRODUCT_NAME" /> viene utilizzato per attivare o disattivare il provider.
+Se la policy non viene configurata, il framework delle varianti in <ph name="PRODUCT_NAME" /> viene utilizzato per attivare o disattivare il provider.
 
-Il supporto di questa impostazione dei criteri terminerà con <ph name="PRODUCT_NAME" /> 136.</translation>
-<translation id="4057442294431066708">Questo criterio consente di stabilire l'opzione della scorciatoia selezionata per la rimappatura degli eventi a
+Il supporto di questa impostazione delle policy terminerà con <ph name="PRODUCT_NAME" /> 136.</translation>
+<translation id="4057442294431066708">Questa policy consente di stabilire l'opzione della scorciatoia selezionata per la rimappatura degli eventi a
 F11/F12 nella pagina secondaria per rimappare i tasti. Queste impostazioni si applicano solo alle
-tastiere di ChromeOS e sono disattivate per impostazione predefinita se il criterio non viene configurato.</translation>
+tastiere di ChromeOS e sono disattivate per impostazione predefinita se la policy non viene configurata.</translation>
 <translation id="4061590579642538878">Segnala informazioni relative ai report sugli arresti anomali.</translation>
 <translation id="4062646759141042418">Attiva <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL.
 
-La configurazione di questo criterio consente di specificare gli URL che <ph name="PRODUCT_NAME" /> offre per avviare il flusso di attestazione per i profili gestiti. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
-Questo criterio può essere configurato solo tramite la pagina Chrome Enterprise Connectors su <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
+La configurazione di questa policy consente di specificare gli URL che <ph name="PRODUCT_NAME" /> offre per avviare il flusso di attestazione per i profili gestiti. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
+Questa policy può essere configurata solo tramite la pagina Chrome Enterprise Connectors su <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
-Se questo criterio non viene impostato o se viene lasciato vuoto, nessun sito web potrà avviare un flusso di attestazione a livello di utente e ricevere indicatori dal dispositivo. Tuttavia, se viene attivato il criterio <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" />, il flusso di attestazione può essere avviato per il browser gestito e gli indicatori dei dispositivi possono essere raccolti.
+Se questa policy non viene impostata o se viene lasciata vuota, nessun sito web potrà avviare un flusso di attestazione a livello di utente e ricevere indicatori dal dispositivo. Tuttavia, se viene attivata la policy <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" />, il flusso di attestazione può essere avviato per il browser gestito e gli indicatori dei dispositivi possono essere raccolti.
 
-Per <ph name="PRODUCT_OS_NAME" />, questo criterio è correlato all'attestazione remota, in cui un certificato viene generato e caricato automaticamente sul server. Per utilizzare il flusso di attestazione nella schermata di accesso del dispositivo, utilizza il criterio <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
+Per <ph name="PRODUCT_OS_NAME" />, questa policy è correlata all'attestazione remota, in cui un certificato viene generato e caricato automaticamente sul server. Per utilizzare il flusso di attestazione nella schermata di accesso del dispositivo, utilizza la policy <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
 
 Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation>
 <translation id="4070039109671307724">Varie</translation>
@@ -4199,30 +4199,30 @@
 <translation id="4075675819066819571">Posiziona la barra delle app sul lato sinistro dello schermo</translation>
 <translation id="4079306023113982053">Consente di gestire la disponibilità di <ph name="BOREALIS_NAME" /> per questo utente.
 
-      Se il criterio non viene configurato o se viene impostato su false, <ph name="BOREALIS_NAME" /> non sarà disponibile. Se il criterio viene impostato su true, <ph name="BOREALIS_NAME" /> sarà disponibile soltanto se non viene disattivato da nessun altro criterio o nessun'altra impostazione.</translation>
+      Se la policy non viene configurata o se viene impostata su false, <ph name="BOREALIS_NAME" /> non sarà disponibile. Se la policy viene impostata su true, <ph name="BOREALIS_NAME" /> sarà disponibile soltanto se non viene disattivata da nessun'altra policy o impostazione.</translation>
 <translation id="408029843066770167">Consenti query a un servizio orario di Google</translation>
 <translation id="408076456549153854">Attiva accesso al browser</translation>
 <translation id="4081127242481747676">Impostazioni dei sensori</translation>
 <translation id="4082405593844340376">Specifica se applicare limitazioni alle richieste agli endpoint di rete con un livello di protezione più alto</translation>
 <translation id="4082498585300984671">Attiva la funzionalità Click-to-call</translation>
-<translation id="4082809879536562387">Ti consente di impostare il periodo di tempo, in millisecondi, tra la prima notifica relativa alla necessità di riavviare un dispositivo <ph name="PRODUCT_OS_NAME" /> per applicare un aggiornamento in attesa e la fine del periodo di tempo specificato dal criterio <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+<translation id="4082809879536562387">Ti consente di impostare il periodo di tempo, in millisecondi, tra la prima notifica relativa alla necessità di riavviare un dispositivo <ph name="PRODUCT_OS_NAME" /> per applicare un aggiornamento in attesa e la fine del periodo di tempo specificato dalla policy <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
 
-      Se non viene impostato, per i dispositivi <ph name="PRODUCT_OS_NAME" /> viene utilizzato il periodo predefinito di 259200000 millisecondi (tre giorni).
+      Se non viene impostata, per i dispositivi <ph name="PRODUCT_OS_NAME" /> viene utilizzato il periodo predefinito di 259200000 millisecondi (tre giorni).
 
-      Per il rollback e altri aggiornamenti di <ph name="PRODUCT_OS_NAME" /> che eseguono il Powerwash del dispositivo, l'utente viene sempre avvisato immediatamente quando l'aggiornamento è disponibile, indipendentemente dal valore di questo criterio.</translation>
-<translation id="4086150283035515220">Se il criterio è impostato su Attivato, gli utenti dovranno specificare dove salvare ogni file prima del download. Se il criterio è impostato su Disattivato, il download si avvierà immediatamente e agli utenti non verrà chiesto dove salvare i file.
+      Per il rollback e altri aggiornamenti di <ph name="PRODUCT_OS_NAME" /> che eseguono il Powerwash del dispositivo, l'utente viene sempre avvisato immediatamente quando l'aggiornamento è disponibile, indipendentemente dal valore di questa policy.</translation>
+<translation id="4086150283035515220">Se la policy è impostata su Attivata, gli utenti dovranno specificare dove salvare ogni file prima del download. Se la policy è impostata su Disattivata, il download si avvierà immediatamente e agli utenti non verrà chiesto dove salvare i file.
 
-      Se il criterio non viene configurato, gli utenti potranno modificare questa impostazione.</translation>
-<translation id="4087476676669545471">Se il criterio viene impostato su Vero o se non viene configurato, gli utenti possono condividere o salvare la pagina web corrente utilizzando le azioni fornite dall'hub di condivisione desktop. L'hub di condivisione è accessibile tramite un'icona omnibox o il menu con tre puntini.
+      Se la policy non viene configurata, gli utenti potranno modificare questa impostazione.</translation>
+<translation id="4087476676669545471">Se la policy viene impostata su True o se non viene configurata, gli utenti possono condividere o salvare la pagina web corrente utilizzando le azioni fornite dall'hub di condivisione desktop. L'hub di condivisione è accessibile tramite un'icona omnibox o il menu con tre puntini.
 
-       Se il criterio viene impostato su Falso, l'icona di condivisione viene rimossa da omnibox e la voce dal menu con tre puntini.</translation>
-<translation id="4087778345310035432">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" />, la configurazione del criterio <ph name="DEVICE_NATIVE_PRINTERS_WHITELIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
+       Se la policy viene impostata su False, l'icona di condivisione viene rimossa da omnibox e la voce dal menu con tre puntini.</translation>
+<translation id="4087778345310035432">Se per la policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" />, la configurazione della policy <ph name="DEVICE_NATIVE_PRINTERS_WHITELIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" />.</translation>
+      Questa policy è deprecata. Usa la policy <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="4088589230932595924">Modalità di navigazione in incognito forzata</translation>
-<translation id="4089849819635523136">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'impostazione del criterio <ph name="DEFAULT_SEARCH_PROVIDER_KEYWORD_POLICY_NAME" /> consente di specificare la parola chiave o la scorciatoia utilizzata nella barra degli indirizzi per attivare la ricerca per questo provider.
+<translation id="4089849819635523136">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'impostazione della policy <ph name="DEFAULT_SEARCH_PROVIDER_KEYWORD_POLICY_NAME" /> consente di specificare la parola chiave o la scorciatoia utilizzata nella barra degli indirizzi per attivare la ricerca per questo provider.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_KEYWORD_POLICY_NAME" /> non viene configurato, il provider di ricerca non viene attivato da alcuna parola chiave.</translation>
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_KEYWORD_POLICY_NAME" /> non viene configurata, il provider di ricerca non viene attivato da alcuna parola chiave.</translation>
 <translation id="4090088362777472639">L'hash SHA-256 del playbook Ansible.</translation>
 <translation id="4091040199847925434">Disattiva la segnalazione di informazioni di sistema e contenuti della pagina utilizzati per migliorare Navigazione sicura</translation>
 <translation id="4098920079809952737">Consenti la stampa con e senza immagini di sfondo</translation>
@@ -4237,41 +4237,41 @@
 
 Il supporto delle estensioni Manifest v2 verrà ritirato e in futuro sarà necessario eseguire la migrazione di tutte le estensioni alla versione 3. Ulteriori informazioni e tempistiche della migrazione sono disponibili all'indirizzo https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
 
-Se il criterio viene impostato su <ph name="DEFAULT" /> (0) o se non viene configurato, il caricamento delle estensioni v2 viene determinato dal dispositivo, in base alle tempistiche indicate nella pagina precedente.
-Se il criterio viene impostato su <ph name="DISABLE" /> (1), l'installazione delle estensioni v2 viene bloccata, mentre le estensioni esistenti vengono disattivate. L'opzione verrà trattata come se il criterio non fosse impostato dopo la disattivazione del supporto della versione 2 per impostazione predefinita.
-Se il criterio viene impostato su <ph name="ENABLE" /> (2), le estensioni v2 sono consentite. L'opzione verrà trattata come se il criterio non fosse impostato prima della disattivazione del supporto della versione 2 per impostazione predefinita.
-Se il criterio viene impostato su <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), le estensioni v2 con installazione forzata sono consentite. Sono incluse le estensioni elencate da <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> o <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> con <ph name="INSTALLATION_MODE" /> "force_installed" o "normal_installed". Tutte le altre estensioni v2 vengono disattivate. L'opzione è sempre disponibile indipendentemente dallo stato della migrazione.
+Se la policy viene impostata su <ph name="DEFAULT" /> (0) o se non viene configurata, il caricamento delle estensioni v2 viene determinato dal dispositivo, in base alle tempistiche indicate nella pagina precedente.
+Se la policy viene impostata su <ph name="DISABLE" /> (1), l'installazione delle estensioni v2 viene bloccata, mentre le estensioni esistenti vengono disattivate. L'opzione verrà trattata come se la policy non fosse impostata dopo la disattivazione del supporto della versione 2 per impostazione predefinita.
+Se la policy viene impostata su <ph name="ENABLE" /> (2), le estensioni v2 sono consentite. L'opzione verrà trattata come se la policy non fosse impostata prima della disattivazione del supporto della versione 2 per impostazione predefinita.
+Se la policy viene impostata su <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), le estensioni v2 con installazione forzata sono consentite. Sono incluse le estensioni elencate da <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> o <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> con <ph name="INSTALLATION_MODE" /> "force_installed" o "normal_installed". Tutte le altre estensioni v2 vengono disattivate. L'opzione è sempre disponibile indipendentemente dallo stato della migrazione.
 
 
-La disponibilità delle estensioni è comunque controllata da altri criteri.</translation>
+La disponibilità delle estensioni è comunque controllata da altre policy.</translation>
 <translation id="4110126170080699437">Per motivi di sicurezza, l'API web <ph name="GET_DISPLAY_MEDIA_API_NAME" /> richiede che venga chiamato un gesto dell'utente precedente ("attivazione temporanea") o la chiamata non andrà a buon fine.
 
-Con questo criterio, gli amministratori possono specificare le origini da cui è possibile chiamare l'API senza gesto dell'utente precedente.
+Con questa policy, gli amministratori possono specificare le origini da cui è possibile chiamare l'API senza gesto dell'utente precedente.
 
-Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. * non è un valore accettato per questo criterio.
+Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. * non è un valore accettato per questa policy.
 
-Se questo criterio non viene configurato, tutte le origini richiederanno un gesto dell'utente precedente per chiamare questa API.</translation>
+Se questa policy non viene configurata, tutte le origini richiederanno un gesto dell'utente precedente per chiamare questa API.</translation>
 <translation id="4115501011761259824">Attiva First-Party Sets per tutti gli utenti interessati</translation>
 <translation id="4120401094617902941">La velocità di campionamento e raccolta dei contatori del tempo di esecuzione. Il minimo consentito è 1 giorno.
 
-Se il criterio non viene impostato, viene applicata la velocità predefinita di 1 giorno.</translation>
+Se la policy non viene impostata, viene applicata la velocità predefinita di 1 giorno.</translation>
 <translation id="4121350739760194865">Impedisci la visualizzazione delle promozioni di applicazioni nella pagina Nuova scheda</translation>
 <translation id="4122432898152851612">L'utente non può vedere nessun elemento della UI relativa alla funzionalità di sincronizzazione file di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="4122473079291425973">La pagina Nuova scheda mostra le schede se sono disponibili contenuti, ma consente all'utente di modificare l'impostazione</translation>
-<translation id="4122565688998751716">Questo criterio è deprecato. Utilizza il criterio "<ph name="ALLOW_SYSTEM_NOTIFICATIONS_POLICY_NAME" />".
+<translation id="4122565688998751716">Questa policy è deprecata. Utilizza la policy "<ph name="ALLOW_SYSTEM_NOTIFICATIONS_POLICY_NAME" />".
 
 Consente di configurare se <ph name="PRODUCT_NAME" /> utilizzerà notifiche native su Linux.
 
-Se questo criterio viene impostato su Vero o se non viene impostato, <ph name="PRODUCT_NAME" /> potrà utilizzare notifiche native.
+Se questa policy viene impostata su True o se non viene impostata, <ph name="PRODUCT_NAME" /> potrà utilizzare notifiche native.
 
-Se questo criterio viene impostato su Falso, <ph name="PRODUCT_NAME" /> non utilizzerà notifiche native. Il Centro messaggi di <ph name="PRODUCT_NAME" /> verrà utilizzato come riserva.</translation>
+Se questa policy viene impostata su False, <ph name="PRODUCT_NAME" /> non utilizzerà notifiche native. Il Centro messaggi di <ph name="PRODUCT_NAME" /> verrà utilizzato come riserva.</translation>
 <translation id="412697421478384751">Consenti agli utenti di impostare PIN non sicuri per la schermata di blocco</translation>
 <translation id="4136603825567209889">Attiva la generazione di report sulle informazioni di identificazione degli utenti</translation>
 <translation id="4138655880188755661">Limite di tempo</translation>
 <translation id="4140646780789794190">Disattiva la condivisione dei dati diagnostici con PluginVm</translation>
 <translation id="4144417751555442768">IA generativa</translation>
 <translation id="4145383150978634398">Rendi la modalità Desktop unificato disponibile per l'utente</translation>
-<translation id="4146319954420095470">(Avviso! A breve questa dipendenza verrà eliminata, inizia a usare invece il criterio <ph name="GLS_POLICY_NAME" />. Se questo criterio viene impostato su <ph name="BLOCK_GEOLOCATION_SETTING" />, i servizi di sistema <ph name="PRODUCT_OS_NAME" /> e le app per Android non possono accedere ai dati sulla posizione. Se imposti il criterio su qualsiasi altro valore o se lo lasci non selezionato, all'utente verrà chiesto il consenso quando un'app Android richiede l'accesso ai dati sulla posizione.</translation>
+<translation id="4146319954420095470">(Avviso! A breve questa dipendenza verrà eliminata, inizia a usare invece la policy <ph name="GLS_POLICY_NAME" />. Se questa policy viene impostata su <ph name="BLOCK_GEOLOCATION_SETTING" />, i servizi di sistema <ph name="PRODUCT_OS_NAME" /> e le app per Android non possono accedere ai dati sulla posizione. Se imposti la policy su qualsiasi altro valore o se lo lasci non selezionata, all'utente verrà chiesto il consenso quando un'app Android richiede l'accesso ai dati sulla posizione.</translation>
 <translation id="4147818922357566987">Attiva solo le varianti relative alle correzioni critiche</translation>
 <translation id="4150201353443180367">Display</translation>
 <translation id="4150646872548223241">L'API Controlled Frame, disponibile per determinati contesti isolati come le app web isolate (IWA), consente a un'app di incorporare e manipolare contenuti arbitrari.
@@ -4292,9 +4292,9 @@
 <translation id="4158531549614162499">Attiva la sincronizzazione Google Drive tramite reti cellulari</translation>
 <translation id="4160962198980004898">Origine dell'indirizzo MAC del dispositivo quando inserito nel dock</translation>
 <translation id="4161019158509414446">Consente di controllare i criteri per la funzionalità di insiemi di siti web correlati.</translation>
-<translation id="4164511138197196839">Se questo criterio viene attivato, le estensioni non pubblicate sul Chrome Web
+<translation id="4164511138197196839">Se questa policy viene attivata, le estensioni non pubblicate sul Chrome Web
 Store verranno disattivate su <ph name="PRODUCT_NAME" />.
-Questo criterio viene applicato solo alle estensioni installate e aggiornate dal
+Questa policy viene applicata solo alle estensioni installate e aggiornate dal
 Chrome Web Store.
 
 Le estensioni esterne al negozio, come le estensioni non pacchettizzate
@@ -4302,53 +4302,53 @@
 vengono ignorate.
 Le estensioni con installazione forzata e ospitate autonomamente vengono ignorate. Vengono ignorate anche tutte le estensioni con blocco della versione.
 
-Se il criterio viene impostato su <ph name="ALLOW_UNPUBLISHED" /> (0) o se non viene configurato, le estensioni non pubblicate sul Chrome Web Store sono consentite.
-Se il criterio viene impostato su <ph name="DISABLE_UNPUBLISHED" /> (1), le estensioni non pubblicate sul Chrome Web Store vengono disattivate.</translation>
+Se la policy viene impostata su <ph name="ALLOW_UNPUBLISHED" /> (0) o se non viene configurata, le estensioni non pubblicate sul Chrome Web Store sono consentite.
+Se la policy viene impostata su <ph name="DISABLE_UNPUBLISHED" /> (1), le estensioni non pubblicate sul Chrome Web Store vengono disattivate.</translation>
 <translation id="4164866067069311355">Controlla la scorciatoia utilizzata per attivare F11/F12</translation>
 <translation id="4165986682804962316">Impostazioni sito</translation>
-<translation id="4166174702671320480">Se il criterio viene impostato su Attivato, i criteri relativi a un gruppo atomico che non condividono l'origine con la priorità massima di quel gruppo vengono ignorati.
+<translation id="4166174702671320480">Se la policy viene impostata su Attivata, le policy relative a un gruppo atomico che non condividono l'origine con la priorità massima di quel gruppo vengono ignorate.
 
-      Se viene impostato su Disattivato, nessun criterio viene ignorato a causa della propria origine. I criteri vengono ignorati soltanto se si verifica un conflitto e se non hanno la massima priorità.
+      Se viene impostata su Disattivata, nessuna policy viene ignorata a causa della propria origine. Le policy vengono ignorate soltanto se si verifica un conflitto e se non hanno la massima priorità.
 
-      Se il criterio viene configurato da un'origine cloud, non può essere applicato a un utente specifico.</translation>
+      Se la policy viene configurata da un'origine cloud, non può essere applicata a un utente specifico.</translation>
 <translation id="416817811987180750">La funzionalità della lista della spesa sarà a disposizione degli utenti.</translation>
 <translation id="4168880975307014079">Attiva tastiera virtuale touch</translation>
 <translation id="4169094969938998854">Non consentire il blocco dello schermo</translation>
 <translation id="4169692397912242417">Consente di attivare la funzione di accessibilità della lettura vocale nella schermata di accesso.
 
-          Se questo criterio è impostato su true, la funzione di lettura vocale sarà sempre attivata nella schermata di accesso.
+          Se questa policy è impostata su true, la funzione di lettura vocale sarà sempre attivata nella schermata di accesso.
 
-          Se questo criterio è impostato su false, la funzione di lettura vocale sarà sempre disattivata nella schermata di accesso.
+          Se questa policy è impostata su false, la funzione di lettura vocale sarà sempre disattivata nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la funzione di lettura vocale è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente la funzione di lettura vocale è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="4173974507809462880">Visualizza la schermata della direzione di scorrimento sul touchpad durante l'accesso</translation>
 <translation id="417956245902013347">Consente di attivare la funzione di accessibilità di evidenziazione del cursore di testo nella schermata di accesso.
 
-          Se questo criterio è impostato su true, l'evidenziazione del cursore di testo sarà sempre attivata sulla schermata di accesso.
+          Se questa policy è impostata su true, l'evidenziazione del cursore di testo sarà sempre attivata sulla schermata di accesso.
 
-          Se questo criterio è impostato su false, l'evidenziazione del cursore di testo sarà sempre disattivata sulla schermata di accesso.
+          Se questa policy è impostata su false, l'evidenziazione del cursore di testo sarà sempre disattivata sulla schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'evidenziazione del cursore di testo è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
-<translation id="4182348537826882258">Se il criterio <ph name="URL_BLOCKLIST_POLICY_NAME" /> viene configurato, le pagine web con URL vietati non vengono caricate. Gli amministratori possono specificare l'elenco di pattern URL da bloccare. Se il criterio non viene configurato, non viene bloccato nessun URL nel browser. Nel criterio <ph name="URL_ALLOWLIST_POLICY_NAME" /> è possibile definire fino a 1000 eccezioni. Scopri come formattare un pattern URL (https://support.google.com/chrome/a?p=url_blocklist_filter_format).
+          Se questa policy non viene impostata, inizialmente l'evidenziazione del cursore di testo è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
+<translation id="4182348537826882258">Se la policy <ph name="URL_BLOCKLIST_POLICY_NAME" /> viene configurata, le pagine web con URL vietati non vengono caricate. Gli amministratori possono specificare l'elenco di pattern URL da bloccare. Se la policy non viene configurata, non viene bloccato nessun URL nel browser. Nella policy <ph name="URL_ALLOWLIST_POLICY_NAME" /> è possibile definire fino a 1000 eccezioni. Scopri come formattare un pattern URL (https://support.google.com/chrome/a?p=url_blocklist_filter_format).
 
-Nota: questo criterio non si applica agli URL JavaScript in-page con dati caricati dinamicamente. Se hai bloccato example.com/abc, example.com potrebbe comunque caricarlo utilizzando XMLHTTPRequest. Inoltre, questo criterio non impedisce alle pagine web di aggiornare l'URL mostrato nella omnibox con uno bloccato usando l'API JavaScript History.
+Nota: questa policy non si applica agli URL JavaScript in-page con dati caricati dinamicamente. Se hai bloccato example.com/abc, example.com potrebbe comunque caricarlo utilizzando XMLHTTPRequest. Inoltre, questa policy non impedisce alle pagine web di aggiornare l'URL mostrato nella omnibox con uno bloccato usando l'API JavaScript History.
 
 A partire dalla versione 73 di <ph name="PRODUCT_NAME" />, puoi bloccare gli URL javascript://*. Tuttavia, questa operazione interessa solo il codice JavaScript inserito nella barra degli indirizzi o, ad esempio, nei bookmarklet.
 
-A partire dalla versione 92 di <ph name="PRODUCT_NAME" />, questo criterio è supportato anche nella modalità headless.
+A partire dalla versione 92 di <ph name="PRODUCT_NAME" />, questa policy è supportata anche nella modalità headless.
 
-Nota: il blocco degli URL interni chrome://* e chrome-untrusted://* può causare errori imprevisti o essere aggirato in alcuni casi. Anziché bloccare determinati URL interni, controlla se sono disponibili criteri più specifici. Ad esempio:
+Nota: il blocco degli URL interni chrome://* e chrome-untrusted://* può causare errori imprevisti o essere aggirato in alcuni casi. Anziché bloccare determinati URL interni, controlla se sono disponibili policy più specifiche. Ad esempio:
 
-- Anziché bloccare chrome://settings/certificates, usa il criterio <ph name="CA_CERTIFICATE_MANAGEMENT_ALLOWED_POLICY_NAME" />.
+- Anziché bloccare chrome://settings/certificates, usa la policy <ph name="CA_CERTIFICATE_MANAGEMENT_ALLOWED_POLICY_NAME" />.
 
-- Anziché bloccare chrome-untrusted://crosh, usa il criterio <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />.</translation>
+- Anziché bloccare chrome-untrusted://crosh, usa la policy <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />.</translation>
 <translation id="4183229833636799228">Impostazione predefinita per il plug-in <ph name="FLASH_PLUGIN_NAME" /></translation>
 <translation id="4185868802416355029">Consenti alle estensioni gestite di utilizzare l'API Enterprise Hardware Platform</translation>
-<translation id="4186244263855283575">Consente di impostare una programmazione personalizzata per il riavvio dei dispositivi. Se viene impostato su Vero, il dispositivo verrà riavviato in base alla programmazione. Il criterio deve essere rimosso per annullare ulteriori riavvii programmati.
+<translation id="4186244263855283575">Consente di impostare una programmazione personalizzata per il riavvio dei dispositivi. Se viene impostata su True, il dispositivo verrà riavviato in base alla programmazione. La policy deve essere rimossa per annullare ulteriori riavvii programmati.
 
       Nelle sessioni utente e nelle sessioni Ospite si applica quanto segue:
 
@@ -4377,14 +4377,14 @@
 
       I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo learn_more_url contiene un URL fornito dall'amministratore su cui l'utente può fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo della lingua è facoltativo e contiene la lingua in cui è scritto il messaggio. Il campo della lingua vuoto o con il valore "predefinito" indica un messaggio da utilizzare se la lingua dell'utente non ne ha uno. Il campo dei tag consente di specificare il tipo di scansioni per cui viene visualizzato il messaggio. L'elenco custom_messages può avere alcune voci o nessuna, dove per ognuna di queste i campi del messaggio e dei tag non devono essere vuoti.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="4189872355465413041">Applicazioni di sistema</translation>
 <translation id="4190316993598857632">Abilita la modifica dei preferiti</translation>
 <translation id="4192388905594723944">URL per la convalida del token di autenticazione del client di accesso remoto</translation>
 <translation id="4195698007674066525">Imposta una tastiera numerica come predefinita per l'inserimento delle password</translation>
-<translation id="4203055629055264833">Se il criterio viene impostato su Enabled o se non viene configurato, gli utenti possono visualizzare la pagina di risultati più recente del motore di ricerca predefinito in un riquadro laterale attivando un'icona nella barra degli strumenti.
+<translation id="4203055629055264833">Se la policy viene impostata su Enabled o se non viene configurata, gli utenti possono visualizzare la pagina di risultati più recente del motore di ricerca predefinito in un riquadro laterale attivando un'icona nella barra degli strumenti.
 
-      Se il criterio viene impostato su Disabled, l'icona che apre il riquadro laterale con la pagina di risultati del motore di ricerca predefinito viene rimossa dalla barra degli strumenti.</translation>
+      Se la policy viene impostata su Disabled, l'icona che apre il riquadro laterale con la pagina di risultati del motore di ricerca predefinito viene rimossa dalla barra degli strumenti.</translation>
 <translation id="4204327073692415353">Non richiedere all'utente di selezionare un certificato client nella schermata di accesso</translation>
 <translation id="4205316772333487392">Viene forzato l'uso di SafeSearch nella Ricerca Google</translation>
 <translation id="4206464220361823768">Disattiva il cursore grande nella schermata di accesso</translation>
@@ -4392,36 +4392,36 @@
 
           Questa funzione consente di fare clic senza premere fisicamente il mouse o il touchpad, basta passare il mouse sull'oggetto su cui si vuole fare clic.
 
-          Se questo criterio viene attivato, il clic automatico sarà sempre attivo.
+          Se questa policy viene attivata, il clic automatico sarà sempre attivo.
 
-          Se questo criterio viene disattivato, il clic automatico sarà sempre disattivato.
+          Se questa policy viene disattivata, il clic automatico sarà sempre disattivato.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente il clic automatico è disattivato, ma l'utente può attivarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente il clic automatico è disattivato, ma l'utente può attivarlo in qualsiasi momento.</translation>
 <translation id="4212181786686887763">L'URL da cui è possibile scaricare l'immagine di sfondo.</translation>
 <translation id="4224610387358583899">Ritardi del blocco schermo</translation>
-<translation id="42267415200641481">Se questo criterio viene impostato su true, la risoluzione DNS di sistema (getaddrinfo()) potrebbe essere eseguita al di fuori del processo di rete, a seconda della configurazione di sistema e dei flag funzionalità.
+<translation id="42267415200641481">Se questa policy viene impostata su true, la risoluzione DNS di sistema (getaddrinfo()) potrebbe essere eseguita al di fuori del processo di rete, a seconda della configurazione di sistema e dei flag funzionalità.
 
-      Se questo criterio viene impostato su false, la risoluzione DNS di sistema (getaddrinfo()) viene eseguita nel processo di rete anziché nel browser. Questa operazione potrebbe forzare la disattivazione della sandbox del servizio di rete, riducendo la sicurezza di <ph name="PRODUCT_NAME" />.
+      Se questa policy viene impostata su false, la risoluzione DNS di sistema (getaddrinfo()) viene eseguita nel processo di rete anziché nel browser. Questa operazione potrebbe forzare la disattivazione della sandbox del servizio di rete, riducendo la sicurezza di <ph name="PRODUCT_NAME" />.
 
-      Se questo criterio non viene configurato, la risoluzione DNS di sistema potrebbe essere eseguita nel servizio di rete, all'esterno del servizio di rete o parzialmente all'interno e all'esterno, a seconda della configurazione del sistema e dei flag funzionalità.</translation>
+      Se questa policy non viene configurata, la risoluzione DNS di sistema potrebbe essere eseguita nel servizio di rete, all'esterno del servizio di rete o parzialmente all'interno e all'esterno, a seconda della configurazione del sistema e dei flag funzionalità.</translation>
 <translation id="4232128469957872687">Impostazioni EDU</translation>
-<translation id="4234788818648224034">Elenco di domini da escludere dalla risoluzione tramite DNS over HTTPS. Questo criterio viene ignorato quando la modalità DNS sicuro è disattivata (usa sempre DNS in testo normale).
+<translation id="4234788818648224034">Elenco di domini da escludere dalla risoluzione tramite DNS over HTTPS. Questa policy viene ignorata quando la modalità DNS sicuro è disattivata (usa sempre DNS in testo normale).
 
-Se è impostato anche il criterio <ph name="DOH_TEMPLATES_POLICY_NAME" />, viene preferito un dominio più specifico. La specificità si riferisce al numero di punti ('.') nel dominio. Quando un dominio corrisponde a entrambi i criteri, per impostazione predefinita viene utilizzato il protocollo DNS over HTTPS per il dominio.
+Se è impostata anche la policy <ph name="DOH_TEMPLATES_POLICY_NAME" />, viene preferito un dominio più specifico. La specificità si riferisce al numero di punti ('.') nel dominio. Quando un dominio corrisponde a entrambe le policy, per impostazione predefinita viene utilizzato il protocollo DNS over HTTPS per il dominio.
 
 I domini devono essere indicati sotto forma di nome di dominio completo (FQDN) o come suffissi di dominio indicati utilizzando come prefisso il carattere jolly speciale "*".
 
 I domini con formato errato verranno ignorati.</translation>
 <translation id="4239720644496144453">La cache non viene utilizzata per le app Android. Se più utenti installano la stessa app Android, questa viene scaricata per ogni utente.</translation>
-<translation id="4242583077375244471">Se questo criterio viene attivato, <ph name="PRODUCT_NAME" /> eseguirà la verifica dei certificati dei server mediante lo strumento di verifica dei certificati integrato con Chrome Root Store usato come fonte di attendibilità pubblica.
+<translation id="4242583077375244471">Se questa policy viene attivata, <ph name="PRODUCT_NAME" /> eseguirà la verifica dei certificati dei server mediante lo strumento di verifica dei certificati integrato con Chrome Root Store usato come fonte di attendibilità pubblica.
 
-Se questo criterio viene disattivato, <ph name="PRODUCT_NAME" /> userà lo strumento di verifica dei certificati di sistema e i certificati radice di sistema.
+Se questa policy viene disattivata, <ph name="PRODUCT_NAME" /> userà lo strumento di verifica dei certificati di sistema e i certificati radice di sistema.
 
-Se questo criterio non viene configurato, potrebbero essere utilizzati Chrome Root Store o i certificati radice forniti dal sistema.
+Se questa policy non viene configurata, potrebbero essere utilizzati Chrome Root Store o i certificati radice forniti dal sistema.
 
-Questo criterio è stato rimosso nella versione 113 di <ph name="PRODUCT_NAME" />
+Questa policy è stata rimossa nella versione 113 di <ph name="PRODUCT_NAME" />
 per <ph name="MS_WIN_NAME" /> e <ph name="MAC_OS_NAME" />,
 nella versione 120 di <ph name="PRODUCT_OS_NAME" />,
 nella versione 120 <ph name="PRODUCT_NAME" /> per
@@ -4431,33 +4431,33 @@
 dello strumento di verifica dei certificati e dei certificati radice forniti dalla piattaforma.</translation>
 <translation id="424318624725112807">Attiva l'evidenziazione del cursore del testo nella schermata di accesso</translation>
 <translation id="4243419387411966417">Disattiva l'eliminazione delle password non decifrabili</translation>
-<translation id="4245159233848584683">Se il criterio viene impostato su Attivato o non viene configurato e se un account locale del dispositivo è configurato per l'accesso automatico senza ritardo, quando un dispositivo è offline <ph name="PRODUCT_OS_NAME" /> mostra una richiesta di configurazione della rete.
+<translation id="4245159233848584683">Se la policy viene impostata su Attivata o non viene configurata e se un account locale del dispositivo è configurato per l'accesso automatico senza ritardo, quando un dispositivo è offline <ph name="PRODUCT_OS_NAME" /> mostra una richiesta di configurazione della rete.
 
-Se il criterio viene impostato su Disattivato, viene visualizzato invece un messaggio di errore.</translation>
+Se la policy viene impostata su Disattivata, viene visualizzato invece un messaggio di errore.</translation>
 <translation id="4248277954659222481">Consenti la riproduzione automatica dei contenuti multimediali per una lista consentita di pattern URL</translation>
 <translation id="4250680216510889253">No</translation>
 <translation id="4251370222792468420">Chrome tenta di eseguire l'upgrade di alcuni tipi di sottorisorse di contenuto misto (HTTP su un sito HTTPS) su iOS.
 Per informazioni dettagliate, visita la pagina https://chromium.googlesource.com/chromium/src/+/main/docs/security/autoupgrade-mixed.md.
 
-Questo criterio è stato utilizzato per disattivare l'upgrade automatico dei contenuti misti su iOS. Il criterio è deprecato e non è supportato.</translation>
+Questa policy è stata utilizzata per disattivare l'upgrade automatico dei contenuti misti su iOS. La policy è deprecata e non è supportata.</translation>
 <translation id="4252522848899331223">Consenti agli utenti di bypassare l'avviso di Navigazione sicura</translation>
-<translation id="4260027436474745627">Se il criterio viene configurato, ciascuna delle origini denominate in un elenco separato da virgole viene eseguita in un processo dedicato. Il processo di ogni origine denominata potrà contenere solo documenti provenienti da tale origine e i relativi sottodomini. Ad esempio, specificare https://a1.example.com/ consente https://a2.a1.example.com/ nello stesso processo, ma non https://example.com o https://b.example.com.
+<translation id="4260027436474745627">Se la policy viene configurata, ciascuna delle origini denominate in un elenco separato da virgole viene eseguita in un processo dedicato. Il processo di ogni origine denominata potrà contenere solo documenti provenienti da tale origine e i relativi sottodomini. Ad esempio, specificare https://a1.example.com/ consente https://a2.a1.example.com/ nello stesso processo, ma non https://example.com o https://b.example.com.
 
       A partire da <ph name="PRODUCT_NAME" /> 77, puoi specificare anche un intervallo di origini da isolare utilizzando un carattere jolly. Ad esempio, specificare https://[*.]corp.example.com consentirà a ogni origine al di sotto di https://corp.example.com il proprio processo dedicato, inclusi https://corp.example.com stesso, https://a1.corp.example.com e https://a2.a1.corp.example.com.
 
-      Tieni presente che tutti i siti (vale a dire schema più eTLD+1, come https://example.com) sono già isolati per impostazione predefinita sulle piattaforme desktop, come specificato nel criterio <ph name="SITE_PER_PROCESS_POLICY_NAME" />. Il criterio <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> è utile per isolare origini specifiche a una granularità maggiore (ad es. https://a.example.com).
+      Tieni presente che tutti i siti (vale a dire schema più eTLD+1, come https://example.com) sono già isolati per impostazione predefinita sulle piattaforme desktop, come specificato nella policy <ph name="SITE_PER_PROCESS_POLICY_NAME" />. La policy <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> è utile per isolare origini specifiche a una granularità maggiore (ad es. https://a.example.com).
 
-      Tieni anche presente che le origini isolate da questo criterio non potranno scrivere altre origini nello stesso sito, processo possibile se due documenti dello stesso sito modificano i propri valori document.docmani affinché corrispondano. Gli amministratori devono confermare che questo comportamento non comune non venga utilizzato su un'origine prima di isolarla.
+      Tieni anche presente che le origini isolate da questa policy non potranno scrivere altre origini nello stesso sito, processo possibile se due documenti dello stesso sito modificano i propri valori document.docmani affinché corrispondano. Gli amministratori devono confermare che questo comportamento non comune non venga utilizzato su un'origine prima di isolarla.
 
-      Se il criterio viene disattivato o non viene configurato, gli utenti possono modificare questa impostazione.
+      Se la policy viene disattivata o non viene configurata, gli utenti possono modificare questa impostazione.
 
-      Nota: per Android, utilizza invece il criterio <ph name="ISOLATE_ORIGINS_ANDROID_POLICY_NAME" />.</translation>
+      Nota: per Android, utilizza invece la policy <ph name="ISOLATE_ORIGINS_ANDROID_POLICY_NAME" />.</translation>
 <translation id="4261820385751181068">Lingua della schermata di accesso del dispositivo</translation>
 <translation id="4263788921751326798">Disattiva i report relativi alle informazioni sul report sugli arresti anomali del dispositivo</translation>
 <translation id="4268586991084547853">Più compatibilità con gli elenchi dei siti in modalità Enterprise di Microsoft IE/Edge</translation>
-<translation id="4269798992490176617">Se questo criterio viene impostato su Attivato, <ph name="CHROME_REMOTE_DESKTOP_PRODUCT_NAME" /> potrebbe eseguire le richieste API WebAuthn provenienti da una sessione di navigazione su un host remoto.
+<translation id="4269798992490176617">Se questa policy viene impostata su Attivata, <ph name="CHROME_REMOTE_DESKTOP_PRODUCT_NAME" /> potrebbe eseguire le richieste API WebAuthn provenienti da una sessione di navigazione su un host remoto.
 
-      Se viene impostato su Disattivato o se non viene configurato, viene applicato il comportamento predefinito.
+      Se viene impostata su Disattivata o se non viene configurata, viene applicato il comportamento predefinito.
 
       Tieni presente che questa funzionalità è supportata soltanto nell'ambiente di rete interno di Google.</translation>
 <translation id="4269859918103560644">Consenti all'utente di decidere</translation>
@@ -4466,9 +4466,9 @@
 Viene eseguito l'override di questa policy da <ph name="POLICY_NAME" />; in particolare, se il valore di una lista bloccata è <ph name="ALL_ISOLATED_WEB_APPS" />, nessuna IWA potrà connettersi ai lettori di smart card (non verrà nemmeno chiesto agli utenti di concedere l'autorizzazione), ad eccezione di quelle elencate in questa policy.
 
 Per impostazione predefinita, le IWA che specificano le autorizzazioni per le smart card all'interno del manifest possono connettersi alle smart card a condizione che l'utente conceda l'autorizzazione in modo interattivo per ogni lettore.</translation>
-<translation id="4274691295133617461">Se il criterio viene impostato su 3, i siti web possono richiedere l'accesso di lettura di file e directory nel file system del sistema operativo host tramite l'API file system. Se il criterio viene impostato su 2, l'accesso viene negato.
+<translation id="4274691295133617461">Se la policy viene impostata su 3, i siti web possono richiedere l'accesso di lettura di file e directory nel file system del sistema operativo host tramite l'API file system. Se la policy viene impostata su 2, l'accesso viene negato.
 
-      Se non viene configurato, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
+      Se non viene configurata, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="4275048399551500192">Non mostrare i controlli multimediali per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi</translation>
 <translation id="4278656834593750050">Attiva i suoni di ricarica</translation>
 <translation id="4282243913059705499">Mostra sempre l'icona <ph name="PRODUCT_NAME" /> nella barra degli strumenti</translation>
@@ -4481,68 +4481,68 @@
 Su <ph name="MS_WIN_NAME" />, questa policy è disponibile soltanto per le istanze che sono aggiunte a un dominio <ph name="MS_AD_NAME" />, aggiunte a <ph name="MS_AAD_NAME" /> o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.</translation>
 <translation id="428948795004445932">La velocità di campionamento e raccolta dei dati di rete. Il valore minimo consentito è 1 minuto.
 
-      Se il criterio non è impostato, viene applicata la velocità predefinita di 10 minuti.</translation>
+      Se la policy non è impostata, viene applicata la velocità predefinita di 10 minuti.</translation>
 <translation id="4290231183305601970">Il testo che verrà mostrato all'utente nel Chrome Web Store se l'installazione è bloccata.</translation>
 <translation id="4293187705196369087">Consente di attivare o di disattivare una notifica quando lo spazio sul disco è in esaurimento. La scelta si applica a tutti gli utenti sul dispositivo.
 
-      Se il criterio viene impostato su Attivato, viene mostrata una notifica quando lo spazio rimanente sul disco è in esaurimento.
+      Se la policy viene impostata su Attivata, viene mostrata una notifica quando lo spazio rimanente sul disco è in esaurimento.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, non viene mostrata alcuna notifica relativa allo spazio sul disco in esaurimento.
+      Se la policy viene impostata su Disattivata o se non viene configurata, non viene mostrata alcuna notifica relativa allo spazio sul disco in esaurimento.
 
-      Se il dispositivo non è gestito o se è presente un solo utente, il criterio viene ignorato e la notifica viene sempre visualizzata.
+      Se il dispositivo non è gestito o se è presente un solo utente, la policy viene ignorata e la notifica viene sempre visualizzata.
 
-      Se sono presenti diversi account utente su un dispositivo gestito, la notifica viene visualizzata soltanto se il criterio è stato attivato.</translation>
+      Se sono presenti diversi account utente su un dispositivo gestito, la notifica viene visualizzata soltanto se la policy è stata attivata.</translation>
 <translation id="4293419489636673391">Attiva i file locali degli utenti</translation>
 <translation id="4294886370621883282">Consenti di visualizzare la tastiera sullo schermo quando opportuno.</translation>
-<translation id="4297483555396496700">Gli utenti sono autorizzati a modificare il canale di rilascio del dispositivo solo se questo criterio è impostato su True. Se questo criterio è impostato su False o non viene configurato, gli utenti non possono modificare il canale.
+<translation id="4297483555396496700">Gli utenti sono autorizzati a modificare il canale di rilascio del dispositivo solo se questa policy è impostata su True. Se questa policy è impostata su False o non viene configurata, gli utenti non possono modificare il canale.
 
-L'impostazione di <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> ha effetto solo se <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> è impostato su False.</translation>
+L'impostazione di <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> ha effetto solo se <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> è impostata su False.</translation>
 <translation id="4301478455179579340">Firma dell'applicazione nativa durante l'installazione dell'applicazione web progressiva</translation>
 <translation id="4303167373847512281">Consenti modalità sviluppatore</translation>
-<translation id="4307116964468610577">Il criterio consente di prolungare la durata utilizzabile delle batterie di un sistema ricaricandole completamente solo una volta al giorno. Per il resto della giornata, la carica delle batterie viene mantenuta a un livello più basso, consentendo di conservarla più a lungo, anche quando il sistema è collegato a una fonte di alimentazione.
+<translation id="4307116964468610577">La policy consente di prolungare la durata utilizzabile delle batterie di un sistema ricaricandole completamente solo una volta al giorno. Per il resto della giornata, la carica delle batterie viene mantenuta a un livello più basso, consentendo di conservarla più a lungo, anche quando il sistema è collegato a una fonte di alimentazione.
 
-      Se il criterio <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> viene configurato, l'impostazione di <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> su Enabled consente di mantenere attivo il criterio di gestione della modalità di ricarica avanzata della batteria (se supportato dal dispositivo). Tramite un algoritmo di ricarica standard e altre tecniche al di fuori dell'orario di lavoro, questa modalità consente agli utenti di ottimizzare le condizioni della batteria. Durante l'orario di lavoro, il sistema utilizza una ricarica express, consentendo alla batteria di ricaricarsi più rapidamente. Specifica quando il sistema viene utilizzato con maggiore frequenza ogni giorno e per quanto tempo tramite l'ora di inizio e la durata.
+      Se la policy <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> viene configurata, l'impostazione di <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> su Enabled consente di mantenere attiva la policy di gestione della modalità di ricarica avanzata della batteria (se supportata dal dispositivo). Tramite un algoritmo di ricarica standard e altre tecniche al di fuori dell'orario di lavoro, questa modalità consente agli utenti di ottimizzare le condizioni della batteria. Durante l'orario di lavoro, il sistema utilizza una ricarica express, consentendo alla batteria di ricaricarsi più rapidamente. Specifica quando il sistema viene utilizzato con maggiore frequenza ogni giorno e per quanto tempo tramite l'ora di inizio e la durata.
 
-      Se il criterio viene impostato su Disabled o se non viene configurato, la modalità di ricarica avanzata della batteria rimane disattivata.
+      Se la policy viene impostata su Disabled o se non viene configurata, la modalità di ricarica avanzata della batteria rimane disattivata.
 
       Gli utenti non possono modificare questa impostazione.</translation>
 <translation id="4307479555111916927">Imposta un'etichetta aziendale personalizzata</translation>
 <translation id="4309091698378414920">Attiva l'evidenziazione del cursore</translation>
-<translation id="4311141497190183490">Se il criterio viene impostato su 1, i siti possono tracciare la posizione fisica dell'utente come stato predefinito. Se il criterio viene impostato su 2, il tracciamento viene negato per impostazione predefinita. Puoi impostare il criterio per chiedere ogni volta che un sito vuole tracciare la posizione fisica degli utenti.
+<translation id="4311141497190183490">Se la policy viene impostata su 1, i siti possono tracciare la posizione fisica dell'utente come stato predefinito. Se la policy viene impostata su 2, il tracciamento viene negato per impostazione predefinita. Puoi impostare la policy per chiedere ogni volta che un sito vuole tracciare la posizione fisica degli utenti.
 
-Se il criterio non viene configurato, si applica il criterio <ph name="ASK_GEOLOCATION_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
+Se la policy non viene configurata, si applica la policy <ph name="ASK_GEOLOCATION_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="4311195029067684288">Full</translation>
 <translation id="4311662690937656540">Applica in modo forzato gli accessi online nelle schermate di accesso e di blocco</translation>
 <translation id="4313767483634435271">Indirizzo MAC designato del dock del dispositivo</translation>
 <translation id="4314538398999793073">Disattiva ricerca CNAME durante l'autenticazione Kerberos</translation>
 <translation id="4320592646346933548">Wi-Fi</translation>
-<translation id="43213511254881626">Questo criterio consente di stabilire se il gestore delle password integrato può eliminare le password non decifrabili dal relativo database. Questa operazione è necessaria per ripristinare la funzionalità completa del gestore delle password integrato, ma potrebbe comportare la perdita definitiva dei dati. I valori delle password non decifrabili non diventeranno decifrabili da soli e, se è possibile correggerli, in genere sono necessarie azioni complesse da parte dell'utente.
+<translation id="43213511254881626">Questa policy consente di stabilire se il gestore delle password integrato può eliminare le password non decifrabili dal relativo database. Questa operazione è necessaria per ripristinare la funzionalità completa del gestore delle password integrato, ma potrebbe comportare la perdita definitiva dei dati. I valori delle password non decifrabili non diventeranno decifrabili da soli e, se è possibile correggerli, in genere sono necessarie azioni complesse da parte dell'utente.
 
-Se il criterio viene attivato o se non viene configurato, gli utenti con password non decifrabili salvate nel gestore delle password integrato le perdono. Le password che sono ancora funzionanti rimangono invariate.
+Se la policy viene attivata o se non viene configurata, gli utenti con password non decifrabili salvate nel gestore delle password integrato le perdono. Le password che sono ancora funzionanti rimangono invariate.
 
-Se il criterio viene disattivato, i dati del gestore delle password degli utenti rimangono invariati, ma la funzionalità del gestore delle password non funziona.
+Se la policy viene disattivata, i dati del gestore delle password degli utenti rimangono invariati, ma la funzionalità del gestore delle password non funziona.
 
-Se il criterio viene configurato, gli utenti non possono modificarlo in <ph name="PRODUCT_NAME" />.</translation>
+Se la policy viene configurata, gli utenti non possono modificarla in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="4322842393287974810">Consenti all'app kiosk avviata automaticamente senza ritardo di controllare la versione di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="4323412353642577604">Attiva l'attestazione da remoto per la protezione dei contenuti</translation>
 <translation id="4325690621216251241">Aggiungi un pulsante di disconnessione all'area di notifica</translation>
 <translation id="4329095223358818804">Consenti a Risposte rapide di accedere ai contenuti selezionati</translation>
 <translation id="4330908525441222205">Viene usato il comportamento AppCache predefinito</translation>
-<translation id="4331357743227845302">Questo criterio consente agli amministratori di configurare i servizi Bluetooth a cui <ph name="PRODUCT_OS_NAME" /> si può connettere.
+<translation id="4331357743227845302">Questa policy consente agli amministratori di configurare i servizi Bluetooth a cui <ph name="PRODUCT_OS_NAME" /> si può connettere.
 
-Se questo criterio viene configurato, <ph name="PRODUCT_OS_NAME" /> consente agli utenti di connettersi esclusivamente ai servizi Bluetooth specificati, a meno che l'elenco non sia vuoto, nel qual caso è possibile utilizzare tutti i servizi. Gli ID univoci universali prenotati da Bluetooth SIG possono essere rappresentati come <ph name="BLUETOOTH_RESERVED_UUID_WITH_0X" /> o <ph name="BLUETOOTH_RESERVED_UUID_WITHOUT_0X" />. Gli ID univoci universali personalizzati possono essere rappresentati come <ph name="BLUETOOTH_CUSTOM_UUID" />. Gli ID univoci universali non distinguono tra maiuscole e minuscole. Se questo criterio non viene configurato, gli utenti possono connettersi a qualsiasi servizio Bluetooth.</translation>
+Se questa policy viene configurata, <ph name="PRODUCT_OS_NAME" /> consente agli utenti di connettersi esclusivamente ai servizi Bluetooth specificati, a meno che l'elenco non sia vuoto, nel qual caso è possibile utilizzare tutti i servizi. Gli ID univoci universali prenotati da Bluetooth SIG possono essere rappresentati come <ph name="BLUETOOTH_RESERVED_UUID_WITH_0X" /> o <ph name="BLUETOOTH_RESERVED_UUID_WITHOUT_0X" />. Gli ID univoci universali personalizzati possono essere rappresentati come <ph name="BLUETOOTH_CUSTOM_UUID" />. Gli ID univoci universali non distinguono tra maiuscole e minuscole. Se questa policy non viene configurata, gli utenti possono connettersi a qualsiasi servizio Bluetooth.</translation>
 <translation id="4332177773549877617">Registra eventi per le installazioni di app Android</translation>
 <translation id="4333940819293342439">Frequenza di raccolta della telemetria di utilizzo delle app in millisecondi.</translation>
 <translation id="4340121900958123942">Imposta il livello di disponibilità del sistema di geolocalizzazione per <ph name="PRODUCT_OS_NAME" />.
 
-Si tratta di un livello di controllo aggiuntivo, che si trova sotto il livello di autorizzazione per le app e i siti web. Ad esempio, se questo criterio viene impostato su <ph name="GLS_BLOCKED" /> o <ph name="GLS_ONLY_ALLOWED_FOR_SYSTEM" />, nessuna app o nessun sito web può risolvere la posizione, indipendentemente dalla rispettiva autorizzazione di accesso alla posizione. Tuttavia, se viene impostato su <ph name="GLS_ALLOWED" />, le app e i siti web possono rilevare singolarmente la posizione se dispongono dell'autorizzazione.
+Si tratta di un livello di controllo aggiuntivo, che si trova sotto il livello di autorizzazione per le app e i siti web. Ad esempio, se questa policy viene impostata su <ph name="GLS_BLOCKED" /> o <ph name="GLS_ONLY_ALLOWED_FOR_SYSTEM" />, nessuna app o nessun sito web può risolvere la posizione, indipendentemente dalla rispettiva autorizzazione di accesso alla posizione. Tuttavia, se viene impostata su <ph name="GLS_ALLOWED" />, le app e i siti web possono rilevare singolarmente la posizione se dispongono dell'autorizzazione.
 
-Gli utenti non possono eseguire l'override della selezione dell'amministratore. Se il criterio non viene configurato, gli utenti possono personalizzare l'esperienza, ovvero possono modificare liberamente le impostazioni di geolocalizzazione del sistema e se il valore predefinito è <ph name="GLS_ALLOWED" />.
+Gli utenti non possono eseguire l'override della selezione dell'amministratore. Se la policy non viene configurata, gli utenti possono personalizzare l'esperienza, ovvero possono modificare liberamente le impostazioni di geolocalizzazione del sistema e se il valore predefinito è <ph name="GLS_ALLOWED" />.
 
-Nota: questo criterio comporta il ritiro del criterio <ph name="ARC_GLS_POLICY_NAME" />. Inoltre, se questo criterio viene configurato, <ph name="DEFAULT_GEO_SETTING_POLICY_NAME" /> non influirà più sulla preferenza di posizione <ph name="ANDROID_NAME" /> su <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="4341199399451274159">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENCODINGS_POLICY_NAME" /> consente di specificare le codifiche dei caratteri supportate dal provider di ricerca. Le codifiche sono nomi di pagine codificati come UTF-8, GB2312 e ISO-8859-1. Vengono provate nell'ordine indicato.
+Nota: questa policy comporta il ritiro della policy <ph name="ARC_GLS_POLICY_NAME" />. Inoltre, se questa policy viene configurata, <ph name="DEFAULT_GEO_SETTING_POLICY_NAME" /> non influirà più sulla preferenza di posizione <ph name="ANDROID_NAME" /> su <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="4341199399451274159">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_ENCODINGS_POLICY_NAME" /> consente di specificare le codifiche dei caratteri supportate dal provider di ricerca. Le codifiche sono nomi di pagine codificati come UTF-8, GB2312 e ISO-8859-1. Vengono provate nell'ordine indicato.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENCODINGS_POLICY_NAME" /> non viene configurato, viene utilizzato il valore UTF-8.</translation>
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENCODINGS_POLICY_NAME" /> non viene configurata, viene utilizzato il valore UTF-8.</translation>
 <translation id="4347908978527632940">Se la norma viene impostata su true e l'utente è supervisionato, le altre app Android possono chiedere le restrizioni web dell'utente tramite un provider di contenuti.
 
           Se la norma è impostata su false o non è impostata, il provider di contenuti non restituisce informazioni.</translation>
@@ -4554,22 +4554,22 @@
 
       Se questa impostazione non è configurata, gli utenti dovranno inserire manualmente il nome utente nella pagina di accesso dell'IdP SAML.
 
-      Questo criterio influisce sull'autenticazione online nelle schermate di accesso e di blocco.</translation>
-<translation id="4359886841380101831">Se per il criterio viene impostato un elenco di stringhe, ogni stringa viene passata al browser alternativo sotto forma di parametri della riga di comando separati. Su <ph name="MS_WIN_NAME" />, i parametri vengono uniti usando degli spazi. Su <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />, un parametro può contenere degli spazi ed essere comunque gestito come un singolo parametro.
+      Questa policy influisce sull'autenticazione online nelle schermate di accesso e di blocco.</translation>
+<translation id="4359886841380101831">Se per la policy viene impostato un elenco di stringhe, ogni stringa viene passata al browser alternativo sotto forma di parametri della riga di comando separati. Su <ph name="MS_WIN_NAME" />, i parametri vengono uniti usando degli spazi. Su <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />, un parametro può contenere degli spazi ed essere comunque gestito come un singolo parametro.
 
       Se un parametro contiene <ph name="URL_PLACEHOLDER" />, il valore <ph name="URL_PLACEHOLDER" /> viene sostituito con l'URL della pagina da aprire. Se nessun parametro contiene <ph name="URL_PLACEHOLDER" />, l'URL viene aggiunto alla fine della riga di comando.
 
       Le variabili di ambiente vengono espanse. Su <ph name="MS_WIN_NAME" />, il valore <ph name="ENV_VARIABLE_WIN_EXAMPLE" /> viene sostituito con il valore della variabile di ambiente <ph name="ENV_VARIABLE_VALUE" />. Su <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />, il valore <ph name="ENV_VARIABLE_UNIX_EXAMPLE" /> viene sostituito con il valore della variabile di ambiente <ph name="ENV_VARIABLE_VALUE" />.
 
-      Se il criterio non viene configurato, viene passato soltanto l'URL sotto forma di parametro della riga di comando.</translation>
+      Se la policy non viene configurata, viene passato soltanto l'URL sotto forma di parametro della riga di comando.</translation>
 <translation id="4363057787588706121">Consenti l'unione dei criteri nell'elenco provenienti da origini diverse</translation>
 <translation id="4363101430102811068">Attiva il rilevamento della divulgazione delle credenziali inserite</translation>
 <translation id="436581050240847513">Riporta interfacce di rete del dispositivo</translation>
-<translation id="4368848648036709662">Questo criterio è deprecato in M88 e Flash non è più supportato da Chrome. Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che possono eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />.
+<translation id="4368848648036709662">Questa policy è deprecata in M88 e Flash non è più supportato da Chrome. Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che possono eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />.
 
-      Se non viene configurato, viene applicato il criterio <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se non viene configurata, viene applicata la policy <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tuttavia, a partire dalla versione M85, i pattern con caratteri jolly "*" e "[*.]" nell'host non sono più supportati per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tuttavia, a partire dalla versione M85, i pattern con caratteri jolly "*" e "[*.]" nell'host non sono più supportati per questa policy.</translation>
 <translation id="4369307906396795087">Gli script worker (web worker, service worker ecc.) utilizzano il controllo non rigoroso del tipo MIME. Funzioneranno gli script worker con tipi MIME precedenti, come <ph name="MIMETYPE_TEXT_ASCII" />.</translation>
 <translation id="4370908590951861085">Endpoint reporting</translation>
 <translation id="4370937370030117032">Viene disattivato l'invio di nome utente e nome file alle stampanti native</translation>
@@ -4581,38 +4581,38 @@
 <translation id="4380159792986204036">Consenti a un'app web kiosk di aprire più di una finestra del browser in qualsiasi schermata</translation>
 <translation id="4381227367939912539">Viene disattivato il gioco del dinosauro</translation>
 <translation id="4382413175336720282">Controllo degli URL in tempo reale disattivato.</translation>
-<translation id="4384480363454039240">Se il criterio non viene configurato o se viene impostato su Attivato, gli utenti potranno monitorare i propri pacchetti su <ph name="PRODUCT_NAME" /> tramite la pagina Nuova scheda.
-Se viene disattivato, gli utenti non possono monitorare i loro pacchetti su <ph name="PRODUCT_NAME" /> tramite la pagina Nuova scheda.</translation>
-<translation id="4387741272680827493">La configurazione del criterio consente di specificare un elenco di nomi host che ignorano gli upgrade HSTS precaricati da http a https.
+<translation id="4384480363454039240">Se la policy non viene configurata o se viene impostata su Attivata, gli utenti potranno monitorare i propri pacchetti su <ph name="PRODUCT_NAME" /> tramite la pagina Nuova scheda.
+Se viene disattivata, gli utenti non possono monitorare i loro pacchetti su <ph name="PRODUCT_NAME" /> tramite la pagina Nuova scheda.</translation>
+<translation id="4387741272680827493">La configurazione della policy consente di specificare un elenco di nomi host che ignorano gli upgrade HSTS precaricati da http a https.
 
-      In questo criterio sono consentiti soltanto i nomi host con etichetta singola e questo criterio si applica soltanto alle voci HSTS precaricate "statiche" (ad esempio <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Questo criterio non impedisce gli upgrade HSTS per i server che hanno richiesto "in modo dinamico" tali upgrade usando un'intestazione della risposta <ph name="HSTS_HEADER_NAME" />.
+      In questa policy sono consentiti soltanto i nomi host con etichetta singola e questa policy si applica soltanto alle voci HSTS precaricate "statiche" (ad esempio <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Questa policy non impedisce gli upgrade HSTS per i server che hanno richiesto "in modo dinamico" tali upgrade usando un'intestazione della risposta <ph name="HSTS_HEADER_NAME" />.
 
-      I nomi host indicati devono essere canonicalizzati: ogni IDN deve essere convertito nel relativo formato A-label e tutte le lettere ASCII devono essere minuscole. Questo criterio viene applicato soltanto ai nomi host con etichetta singola specificati e non ai relativi sottodomini.</translation>
+      I nomi host indicati devono essere canonicalizzati: ogni IDN deve essere convertito nel relativo formato A-label e tutte le lettere ASCII devono essere minuscole. Questa policy viene applicata soltanto ai nomi host con etichetta singola specificati e non ai relativi sottodomini.</translation>
 <translation id="4389073105055031853">Consenti agli utenti di gestire tutti i certificati</translation>
 <translation id="4389091865841123886">Configura l'attestazione da remoto con meccanismo TPM.</translation>
 <translation id="4389113579547582722">Consenti la visualizzazione della promozione di valutazione dell'App Store</translation>
 <translation id="4394049700291259645">Disabilita</translation>
-<translation id="4395619678972620537">Se questo criterio viene attivato, è possibile eseguire il downgrade delle connessioni peer WebRTC a versioni obsolete dei protocolli TLS/DTLS (DTLS 1.0, TLS 1.0 e TLS 1.1).
-      Se questo criterio viene disattivato o se non viene configurato, queste versioni TLS/DTLS sono disattivate.
+<translation id="4395619678972620537">Se questa policy viene attivata, è possibile eseguire il downgrade delle connessioni peer WebRTC a versioni obsolete dei protocolli TLS/DTLS (DTLS 1.0, TLS 1.0 e TLS 1.1).
+      Se questa policy viene disattivata o se non viene configurata, queste versioni TLS/DTLS sono disattivate.
 
-      Questo criterio è stato rimosso nella versione M121 di <ph name="PRODUCT_NAME" />.</translation>
+      Questa policy è stata rimossa nella versione M121 di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="439661169333921592">Disattiva l'evidenziazione dell'elemento attivo tramite tastiera nella schermata di accesso</translation>
 <translation id="4397045637922200204">Disattiva recupero dell'account</translation>
 <translation id="4397157269508242312">La configurazione della policy specifica se gli utenti utilizzano gli strumenti di gestione dei corsi per inviare/ricevere contenuti, inviare/ricevere didascalie come studenti o insegnanti oppure se gli strumenti di gestione dei corsi sono disattivati per gli utenti.</translation>
 <translation id="4397464099112037398">Impostazione predefinita dell'autorizzazione per il posizionamento delle finestre</translation>
-<translation id="4398803806072237638">La sintassi <ph name="CUSTOM_STATE_DEPRECATED_SYNTAX" /> per la funzionalità di stato personalizzato CSS verrà sostituita da <ph name="CUSTOM_STATE_NEW_SYNTAX" /> in <ph name="PRODUCT_NAME" /> per conformarsi alle modifiche apportate in <ph name="FIREFOX_PRODUCT_NAME" /> e <ph name="SAFARI_PRODUCT_NAME" />. Questo criterio consente di attivare la sintassi deprecata precedente fino alla versione M133.
+<translation id="4398803806072237638">La sintassi <ph name="CUSTOM_STATE_DEPRECATED_SYNTAX" /> per la funzionalità di stato personalizzato CSS verrà sostituita da <ph name="CUSTOM_STATE_NEW_SYNTAX" /> in <ph name="PRODUCT_NAME" /> per conformarsi alle modifiche apportate in <ph name="FIREFOX_PRODUCT_NAME" /> e <ph name="SAFARI_PRODUCT_NAME" />. Questa policy consente di attivare la sintassi deprecata precedente fino alla versione M133.
 
 Il ritiro potrebbe causare problemi ad alcuni siti web unicamente di <ph name="PRODUCT_NAME" /> che utilizzano la sintassi <ph name="CUSTOM_STATE_DEPRECATED_SYNTAX" /> deprecata.
 
-Se questo criterio viene attivato, verrà attivata la sintassi deprecata precedente.
+Se questa policy viene attivata, verrà attivata la sintassi deprecata precedente.
 
-Se questo criterio viene disattivato, la sintassi deprecata precedente verrà disattivata.
+Se questa policy viene disattivata, la sintassi deprecata precedente verrà disattivata.
 
-Se questo criterio non viene configurato, la sintassi deprecata precedente verrà disattivata.</translation>
-<translation id="4401196752827224189">WebSQL in contesti non sicuri verrà rimosso a partire dalla versione M110. Questo criterio consente di riattivare l'API.
-          Se questo criterio viene impostato su true, WebSQL in contesti non sicuri sarà disponibile.
-          Se il criterio viene impostato su false o se non viene configurato, WebSQL in contesti non sicuri rimarrà disponibile fino alla versione M109, dopodiché non sarà disponibile a partire dalla versione M110.
-Questo criterio è stato rimosso nella versione M112.</translation>
+Se questa policy non viene configurata, la sintassi deprecata precedente verrà disattivata.</translation>
+<translation id="4401196752827224189">WebSQL in contesti non sicuri verrà rimosso a partire dalla versione M110. Questa policy consente di riattivare l'API.
+          Se questa policy viene impostata su true, WebSQL in contesti non sicuri sarà disponibile.
+          Se la policy viene impostata su false o se non viene configurata, WebSQL in contesti non sicuri rimarrà disponibile fino alla versione M109, dopodiché non sarà disponibile a partire dalla versione M110.
+Questa policy è stata rimossa nella versione M112.</translation>
 <translation id="4401357095119743747">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_FILE_TRANSFER_ENTERPRISE_CONNECTOR" />, che si attiva quando un file viene trasferito all'interno di <ph name="PRODUCT_OS_NAME" />.
 
       I campi <ph name="ENTERPRISE_CONNECTOR_SOURCE_DESTINATION_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> vengono utilizzati per stabilire se il connettore deve inviare un file per l'analisi quando viene trasferito tra un'origine e una destinazione e quali tag includere nella richiesta di analisi di quel file. Un tag che corrisponde a una regola "enable" verrà incluso nella richiesta di analisi se l'origine e la destinazione corrispondono alla regola associata a questo tag, purché nessuna regola "disable" con lo stesso tag corrisponda al trasferimento. L'analisi viene eseguita se almeno un tag deve essere incluso nella richiesta. Una regola <ph name="ENTERPRISE_CONNECTOR_SOURCE_DESTINATION_LIST_FIELD" /> è definita da un elenco di coppie, dove ogni coppia contiene un elenco di origini e un elenco di destinazioni. Il campo <ph name="ENTERPRISE_CONNECTOR_FILE_SYSTEM_TYPE_FIELD" /> definisce il file system a cui deve essere applicata una regola.
@@ -4631,18 +4631,18 @@
 
       I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" /> contiene un URL fornito dall'amministratore su cui l'utente potrà fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> è facoltativo e contiene la lingua del messaggio. Un campo <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> vuoto o con il valore "default" indica il messaggio da utilizzare se non è disponibile alcun messaggio nella lingua dell'utente. Il campo dei tag consente di specificare per quale tipo di scansioni viene visualizzato il messaggio. L'elenco <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" /> può avere alcune voci o nessuna, e per ciascuna voce i campi del messaggio e dei tag non devono essere vuoti.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="4402887080007986374">La versione valida dei Termini di servizio dell'account della scuola</translation>
 <translation id="4408428864159735559">Elenco di condivisioni di file di rete preconfigurate.</translation>
 <translation id="4410236409016356088">Attiva la limitazione della larghezza di banda della rete</translation>
 <translation id="4410361389637971319">Consenti alle origini delle app web isolate di utilizzare Direct Sockets</translation>
 <translation id="4411734231900934213">La differenza (in secondi) consentita tra gli orologi sui dispositivi di figli e genitori.</translation>
 <translation id="441217499641439905">Disattiva Google Drive su reti cellulari nell'app File di <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="4412885120239670573">Se il criterio viene impostato su Attivato, il visualizzatore di PDF interno viene disattivato in <ph name="PRODUCT_NAME" />, i file PDF vengono considerati come file scaricati e gli utenti possono aprire i PDF con l'applicazione predefinita.
+<translation id="4412885120239670573">Se la policy viene impostata su Attivata, il visualizzatore di PDF interno viene disattivato in <ph name="PRODUCT_NAME" />, i file PDF vengono considerati come file scaricati e gli utenti possono aprire i PDF con l'applicazione predefinita.
 
-Se il criterio viene impostato su Disattivato, i file PDF vengono aperti con il plug-in di PDF, a meno che disattivato dagli utenti.
+Se la policy viene impostata su Disattivata, i file PDF vengono aperti con il plug-in di PDF, a meno che disattivato dagli utenti.
 
-Se il criterio viene configurato, gli utenti non possono modificarlo in <ph name="PRODUCT_NAME" />. Se non viene impostato, gli utenti possono scegliere se aprire o meno i file PDF esternamente.</translation>
+Se la policy viene configurata, gli utenti non possono modificarla in <ph name="PRODUCT_NAME" />. Se non viene impostata, gli utenti possono scegliere se aprire o meno i file PDF esternamente.</translation>
 <translation id="4415603335307944578">Se questa norma è impostata su true o non è configurata, il browser mostrerà di nuovo la pagina di benvenuto al primo avvio successivo a un upgrade del sistema operativo.
 
       Se la norma è impostata su false, il browser non mostrerà di nuovo la pagina di benvenuto in occasione del primo avvio successivo a un upgrade del sistema operativo.</translation>
@@ -4675,23 +4675,23 @@
 <translation id="445270821089253489">Consente di stabilire i tipi di informazioni su dispositivi e utenti da segnalare.</translation>
 <translation id="4453913621209182880">Consenti solo la stampa con immagini di sfondo</translation>
 <translation id="4454820008017317557">Mostra l'icona della barra degli strumenti di <ph name="PRODUCT_NAME" /></translation>
-<translation id="445505634382262792">Se il criterio viene impostato su 3, i siti web possono richiedere l'accesso di scrittura di file e directory nel file system del sistema operativo host. Se il criterio viene impostato su 2, l'accesso viene negato.
+<translation id="445505634382262792">Se la policy viene impostata su 3, i siti web possono richiedere l'accesso di scrittura di file e directory nel file system del sistema operativo host. Se la policy viene impostata su 2, l'accesso viene negato.
 
-      Se non viene configurato, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
-<translation id="4455258118946528063">Questo criterio consente di stabilire se segnalare o meno le informazioni relative a estensioni e plug-in.
+      Se non viene configurata, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
+<translation id="4455258118946528063">Questa policy consente di stabilire se segnalare o meno le informazioni relative a estensioni e plug-in.
 
-Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, verrà ignorato.
+Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, verrà ignorata.
 
-Se il criterio non viene configurato o viene impostato su True, le informazioni relative a estensioni e plug-in vengono raccolte.
-Se il criterio viene impostato su False, le informazioni relative a estensioni e plug-in non vengono raccolte.
+Se la policy non viene configurata o viene impostata su True, le informazioni relative a estensioni e plug-in vengono raccolte.
+Se la policy viene impostata su False, le informazioni relative a estensioni e plug-in non vengono raccolte.
 
-Questo criterio viene applicato soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="4457113781439375078">Questo criterio è stato ritirato.
+Questa policy viene applicata soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+Questa policy viene sempre applicata per <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="4457113781439375078">Questa policy è stata ritirata.
 
-      Se il criterio viene attivato, i dispositivi registrati segnalano periodicamente la loro posizione.
+      Se la policy viene attivata, i dispositivi registrati segnalano periodicamente la loro posizione.
 
-      Se viene disattivato o se non viene configurato, i dispositivi registrati non segnalano la loro posizione.</translation>
+      Se viene disattivata o se non viene configurata, i dispositivi registrati non segnalano la loro posizione.</translation>
 <translation id="4461400898496433231">Non sostituire il controllo della connettività IPv6. Esegui una query sul record AAAA per la risoluzione dei nomi host soltanto quando il dispositivo può essere connesso a un host IPv6 globale.</translation>
 <translation id="4463467966408770621">Non consentire le funzionalità di AI generativa di DevTools.</translation>
 <translation id="4463675333222095358">Attiva conversione unità di Risposte rapide</translation>
@@ -4701,13 +4701,13 @@
 <translation id="4474167089968829729">Attiva il salvataggio delle password in Gestione password</translation>
 <translation id="447692108909279121">Gestione dell'IP di WebRTC</translation>
 <translation id="4478248026668918517">Blocca il rilevamento dell'ambito dei criteri.</translation>
-<translation id="4479671363221255277">La configurazione del criterio consente di elencare pattern URL che specificano quali siti possono richiedere agli utenti l'accesso di lettura di file o directory nel file system del sistema operativo host tramite l'API file system.
+<translation id="4479671363221255277">La configurazione della policy consente di elencare pattern URL che specificano quali siti possono richiedere agli utenti l'accesso di lettura di file o directory nel file system del sistema operativo host tramite l'API file system.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_FILE_SYSTEM_READ_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_FILE_SYSTEM_READ_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      I pattern URL non devono essere in conflitto con <ph name="FILE_SYSTEM_READ_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="FILE_SYSTEM_READ_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="4480694116501920047">Forza SafeSearch</translation>
 <translation id="4481202456143946404">La versione valida dei Termini di servizio recuperata da Google3 CL che ha introdotto la nuova versione dei Termini.</translation>
 <translation id="4481952213163895432">Disattiva l'hotword per l'Assistente Google</translation>
@@ -4717,25 +4717,25 @@
 <translation id="4483738129334574255">Disattiva il gioco del dinosauro sui dispositivi <ph name="PRODUCT_OS_NAME" /> registrati, attivalo in altre circostanze</translation>
 <translation id="4484515651939984695">Specifica per quanto tempo (in secondi) un dispositivo di trasmissione selezionato con un codice di accesso o un codice QR rimane nell'elenco del menu di <ph name="PRODUCT_NAME" /> dei dispositivi di trasmissione.</translation>
 <translation id="4485425108474077672">Configura l'URL per la pagina Nuova scheda</translation>
-<translation id="4488959486611931919">Nota: non sono stati segnalati problemi di interruzione dei siti da quando Chrome ha iniziato a bloccare questi cookie per impostazione predefinita a partire dalla versione M118, pertanto questa funzionalità non sarà configurabile (e questo criterio non avrà alcun effetto) a partire dalla versione M127.
+<translation id="4488959486611931919">Nota: non sono stati segnalati problemi di interruzione dei siti da quando Chrome ha iniziato a bloccare questi cookie per impostazione predefinita a partire dalla versione M118, pertanto questa funzionalità non sarà configurabile (e questa policy non avrà alcun effetto) a partire dalla versione M127.
 
-Questo criterio consente di disattivare temporaneamente le modifiche al modo in cui Chrome gestisce i cookie impostati tramite JavaScript che contengono determinati caratteri di controllo (null, ritorno a capo e avanzamento riga).
-In precedenza, la presenza di uno qualsiasi di questi caratteri in una stringa di cookie causava un troncamento ma il criterio veniva comunque impostato.
+Questa policy consente di disattivare temporaneamente le modifiche al modo in cui Chrome gestisce i cookie impostati tramite JavaScript che contengono determinati caratteri di controllo (null, ritorno a capo e avanzamento riga).
+In precedenza, la presenza di uno qualsiasi di questi caratteri in una stringa di cookie causava un troncamento ma la policy veniva comunque impostata.
 Ora, la presenza di questi caratteri farà sì che l'intera stringa di cookie venga ignorata.
 
-Se questo criterio viene impostato su True (valore predefinito), il nuovo comportamento viene attivato.
+Se questa policy viene impostata su True (valore predefinito), il nuovo comportamento viene attivato.
 
-Se questo criterio viene impostato su False, viene attivato il comportamento precedente.</translation>
+Se questa policy viene impostata su False, viene attivato il comportamento precedente.</translation>
 <translation id="4491607814095953976">Scegli se è possibile o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla misurazione degli annunci</translation>
 <translation id="4492287494009043413">Disabilita l'acquisizione di screenshot</translation>
 <translation id="4494132853995232608">DTC wilco</translation>
-<translation id="449419757874646879">Se questo criterio viene disattivato, non è possibile avviare sessioni di assistenza da remoto utilizzando la Console di amministrazione.
+<translation id="449419757874646879">Se questa policy viene disattivata, non è possibile avviare sessioni di assistenza da remoto utilizzando la Console di amministrazione.
 
-Questo criterio non influisce sugli scenari di accesso remoto.
+Questa policy non influisce sugli scenari di accesso remoto.
 
-Questo criterio impedisce agli amministratori aziendali di connettersi a dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti.
+Questa policy impedisce agli amministratori aziendali di connettersi a dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti.
 
-Questo criterio non ha effetto se viene attivato, lasciato vuoto o se non viene configurato.</translation>
+Questa policy non ha effetto se viene attivata, lasciata vuota o se non viene configurata.</translation>
 <translation id="449423975179525290">Imposta le norme relative a <ph name="PLUGIN_VM_NAME" />.</translation>
 <translation id="449561952193478261">Colore della retroilluminazione della tastiera blu</translation>
 <translation id="4497491764379007385">Partiziona gli URL dei blob durante il recupero e la navigazione.</translation>
@@ -4747,7 +4747,7 @@
 <translation id="45036050223225148">Disattiva l'esperimento TLS Encrypted ClientHello</translation>
 <translation id="4503935079903510542">L'immagine del disco di avvio UEFI utilizzata per installare la VM sui dispositivi x86_64.</translation>
 <translation id="4508728400492074981">Controlla i criteri relativi alla funzionalità First-Party Sets.</translation>
-<translation id="4510131075424939993">Specifica un valore di sale da usare nel criterio <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" /> durante la valutazione delle informazioni sull'identità</translation>
+<translation id="4510131075424939993">Specifica un valore di sale da usare nella policy <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" /> durante la valutazione delle informazioni sull'identità</translation>
 <translation id="4510923771103268849">L'utente può avere accesso root ai contenitori Crostini</translation>
 <translation id="4512407512989846472">Consente di impedire la copia negli appunti per URL specifici</translation>
 <translation id="4513691822411041977">Non viene forzato l'uso di SafeSearch nella Ricerca Google o nella Modalità con restrizioni di YouTube</translation>
@@ -4756,13 +4756,13 @@
 <translation id="4518251772179446575">Chiedi ogni volta che un sito desidera monitorare la posizione fisica degli utenti</translation>
 <translation id="4521193243799782295">Durante l'accesso, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline).
 
-      Se per questo criterio viene impostato il valore -1, non viene applicata l'autenticazione online e l'utente potrà usare l'autenticazione offline finché un motivo diverso da quello di questo criterio non applicherà un accesso online. Se per il criterio viene impostato il valore 0, sarà sempre richiesto l'accesso online. Se per questo criterio viene impostato qualsiasi altro valore, il criterio consente di specificare il periodo di tempo dall'ultima autenticazione online trascorso il quale l'utente deve usare di nuovo l'autenticazione online per l'accesso successivo.
+      Se per questa policy viene impostato il valore -1, non viene applicata l'autenticazione online e l'utente potrà usare l'autenticazione offline finché un motivo diverso da quello di questa policy non applicherà un accesso online. Se per la policy viene impostato il valore 0, sarà sempre richiesto l'accesso online. Se per questa policy viene impostato qualsiasi altro valore, la policy consente di specificare il periodo di tempo dall'ultima autenticazione online trascorso il quale l'utente deve usare di nuovo l'autenticazione online per l'accesso successivo.
 
-      Se questo criterio non viene configurato, in <ph name="PRODUCT_OS_NAME" /> verrà usato l'accesso offline.
+      Se questa policy non viene configurata, in <ph name="PRODUCT_OS_NAME" /> verrà usato l'accesso offline.
 
-      Questo criterio viene applicato soltanto per gli utenti che si sono autenticati tramite GAIA senza SAML.
+      Questa policy viene applicata soltanto per gli utenti che si sono autenticati tramite GAIA senza SAML.
 
-      Il valore del criterio deve essere specificato in giorni.</translation>
+      Il valore della policy deve essere specificato in giorni.</translation>
 <translation id="4525328580251166229">Consente di gestire i criteri relativi al sottosistema Bruschetta.</translation>
 <translation id="453031441196755904">Questa norma è obsoleta.</translation>
 <translation id="4531706050939927436">L'installazione di app Android può essere imposta dalla Console d'amministrazione Google tramite Google Play. Questa norma non viene utilizzata.</translation>
@@ -4785,19 +4785,19 @@
 <translation id="4543502256674577024">Impostazioni di aggiornamento dispositivo
 </translation>
 <translation id="454585952814397564">Viene usata la priorità normale per il processo audio</translation>
-<translation id="4546641664653711266">Si tratta di un criterio temporaneo che verrà rimosso nella versione M127.
-Questo criterio consente di controllare la visibilità dei badge aziendali sui profili gestiti. Si tratta di un'etichetta di gestione specifica per l'account mostrata nel menu del profilo, di una nuova etichetta associata a un profilo gestito dalla tua organizzazione, visibile nella barra degli strumenti e controllata dal criterio <ph name="PROFILE_LABEL_POLICY_NAME" /> e di un logo aziendale mostrato nel menu del profilo accanto all'immagine del profilo e controllato dal criterio <ph name="ENTERPRISE_LOGO_URL_POLICY_NAME" />.
+<translation id="4546641664653711266">Si tratta di una policy temporanea che verrà rimossa nella versione M127.
+Questa policy consente di controllare la visibilità dei badge aziendali sui profili gestiti. Si tratta di un'etichetta di gestione specifica per l'account mostrata nel menu del profilo, di una nuova etichetta associata a un profilo gestito dalla tua organizzazione, visibile nella barra degli strumenti e controllata dalla policy <ph name="PROFILE_LABEL_POLICY_NAME" /> e di un logo aziendale mostrato nel menu del profilo accanto all'immagine del profilo e controllato dalla policy <ph name="ENTERPRISE_LOGO_URL_POLICY_NAME" />.
 
-Se questo criterio non viene configurato o se viene impostato su "Nascondi tutti i badge aziendali (valore 0)", tutti i badge verranno nascosti, indipendentemente dalle impostazioni dei criteri che controllano ogni componente.
+Se questa policy non viene configurata o se viene impostata su "Nascondi tutti i badge aziendali (valore 0)", tutti i badge verranno nascosti, indipendentemente dalle impostazioni delle policy che controllano ogni componente.
 
-Se questo criterio viene impostato su "Mostra i badge aziendali solo sui dispositivi non gestiti (valore 1)", tutti i badge verranno mostrati quando un utente della tua organizzazione utilizza un profilo gestito su un dispositivo non gestito.
+Se questa policy viene impostata su "Mostra i badge aziendali solo sui dispositivi non gestiti (valore 1)", tutti i badge verranno mostrati quando un utente della tua organizzazione utilizza un profilo gestito su un dispositivo non gestito.
 
-Se questo criterio viene impostato su "Mostra i badge aziendali su tutti i dispositivi (valore 2)", tutti i badge verranno mostrati quando un utente della tua organizzazione utilizza un profilo gestito su qualsiasi dispositivo.
+Se questa policy viene impostata su "Mostra i badge aziendali su tutti i dispositivi (valore 2)", tutti i badge verranno mostrati quando un utente della tua organizzazione utilizza un profilo gestito su qualsiasi dispositivo.
 
-Se questo criterio viene impostato su "Mostra i badge aziendali solo sui dispositivi gestiti (valore 3)", tutti i badge verranno mostrati quando un utente della tua organizzazione utilizza un profilo gestito su un dispositivo gestito.
+Se questa policy viene impostata su "Mostra i badge aziendali solo sui dispositivi gestiti (valore 3)", tutti i badge verranno mostrati quando un utente della tua organizzazione utilizza un profilo gestito su un dispositivo gestito.
 
-Un dispositivo è considerato gestito utilizza una versione aziendale del sistema operativo o se vengono impostati criteri a livello di macchina che influiscono sul browser.</translation>
-<translation id="4548555985107150628">Questo criterio è obsoleto. Usa <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per controllare se si deve utilizzare il visualizzatore PDF integrato per aprire i file PDF.
+Un dispositivo è considerato gestito utilizza una versione aziendale del sistema operativo o se vengono impostate policy a livello di macchina che influiscono sul browser.</translation>
+<translation id="4548555985107150628">Questa policy è obsoleta. Usa <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per controllare se si deve utilizzare il visualizzatore PDF integrato per aprire i file PDF.
 
       Specifica un elenco di plug-in attivati in <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare questa impostazione.
 
@@ -4805,9 +4805,9 @@
 
       L'elenco di plug-in specificato è sempre utilizzato in <ph name="PRODUCT_NAME" /> se sono installati. I plug-in sono contrassegnati come attivati in "about:plugins" e gli utenti non possono disattivarli.
 
-      Tieni presente che questo criterio esegue l'override sia di DisabledPlugins sia di DisabledPluginsExceptions.
+      Tieni presente che questa policy esegue l'override sia di DisabledPlugins sia di DisabledPluginsExceptions.
 
-      Se il criterio non è impostato, l'utente può disattivare qualsiasi plug-in installato sul sistema.</translation>
+      Se la policy non è impostata, l'utente può disattivare qualsiasi plug-in installato sul sistema.</translation>
 <translation id="4549695018986780856">Manifest v2 abilitato</translation>
 <translation id="4554651132977135445">Modalità di elaborazione loopback dei criteri relativi agli utenti</translation>
 <translation id="4554991346503872538">Non offrire mai la traduzione</translation>
@@ -4815,55 +4815,55 @@
 <translation id="4557134566541205630">URL pagina Nuova scheda provider di ricerca predefinito</translation>
 <translation id="4558166110367609724">Salta automaticamente TdS e carica il browser</translation>
 <translation id="4559846397119102037">Consenti l'utilizzo di <ph name="LACROS_NAME" /></translation>
-<translation id="456018799964679771">Questo criterio a livello di dispositivo consente di configurare se <ph name="PRODUCT_OS_NAME" /> offrirà un algoritmo di accordo chiave post-quantistico in TLS utilizzando lo standard ML-KEM NIST. Prima di <ph name="PRODUCT_OS_NAME" /> versione 131, l'algoritmo era Kyber, un'iterazione bozza precedente dello standard. In questo modo, i server di supporto possono proteggere il traffico degli utenti dalla decrittografia successiva dei computer quantistici.
+<translation id="456018799964679771">Questa policy a livello di dispositivo consente di configurare se <ph name="PRODUCT_OS_NAME" /> offrirà un algoritmo di accordo chiave post-quantistico in TLS utilizzando lo standard ML-KEM NIST. Prima di <ph name="PRODUCT_OS_NAME" /> versione 131, l'algoritmo era Kyber, un'iterazione bozza precedente dello standard. In questo modo, i server di supporto possono proteggere il traffico degli utenti dalla decrittografia successiva dei computer quantistici.
 
-Se questo criterio viene attivato, <ph name="PRODUCT_OS_NAME" /> offrirà un accordo chiave post-quantistico nelle connessioni TLS. Il traffico degli utenti sarà poi protetto dai computer quantistici durante la comunicazione con i server compatibili.
+Se questa policy viene attivata, <ph name="PRODUCT_OS_NAME" /> offrirà un accordo chiave post-quantistico nelle connessioni TLS. Il traffico degli utenti sarà poi protetto dai computer quantistici durante la comunicazione con i server compatibili.
 
-Se questo criterio viene disattivato, <ph name="PRODUCT_OS_NAME" /> non offrirà un accordo chiave post-quantistico nelle connessioni TLS. In questo modo, il traffico degli utenti non verrà protetto dai computer quantistici.
+Se questa policy viene disattivata, <ph name="PRODUCT_OS_NAME" /> non offrirà un accordo chiave post-quantistico nelle connessioni TLS. In questo modo, il traffico degli utenti non verrà protetto dai computer quantistici.
 
-Se questo criterio non viene configurato, <ph name="PRODUCT_OS_NAME" /> seguirà la procedura di implementazione predefinita per l'offerta di un accordo chiave post-quantistico.
+Se questa policy non viene configurata, <ph name="PRODUCT_OS_NAME" /> seguirà la procedura di implementazione predefinita per l'offerta di un accordo chiave post-quantistico.
 
 L'offerta di Kyber è compatibile con le versioni precedenti. I server TLS e il middleware di rete esistenti dovrebbero ignorare la nuova opzione e continuare a selezionare le opzioni precedenti.
 
 Tuttavia, i dispositivi che non implementano correttamente TLS potrebbero non funzionare correttamente se viene offerta la nuova opzione. Ad esempio, potrebbero disconnettersi in risposta a opzioni non riconosciute o ai messaggi di dimensioni maggiori che ne derivano. Questi dispositivi non sono adatti alla tecnologia post-quantistica e interferiranno con la relativa transizione di un'azienda. In questo caso, gli amministratori dovrebbero contattare il fornitore per risolvere il problema.
 
-Questo criterio è una misura temporanea e verrà rimosso in un momento successivo alla versione 141 di <ph name="PRODUCT_OS_NAME" />. Potrebbe essere attivato per consentirti di testare i problemi e potrebbe essere disattivato durante la risoluzione di questi ultimi.
+Questa policy è una misura temporanea e verrà rimossa in un momento successivo alla versione 141 di <ph name="PRODUCT_OS_NAME" />. Potrebbe essere attivata per consentirti di testare i problemi e potrebbe essere disattivata durante la risoluzione di questi ultimi.
 
-Se vengono impostati sia questo criterio sia il criterio PostQuantumKeyAgreementEnabled, questo criterio avrà la precedenza.</translation>
+Se vengono impostate sia questa policy sia la policy PostQuantumKeyAgreementEnabled, questa policy avrà la precedenza.</translation>
 <translation id="4561560385824323005">Consente agli utenti di selezionare un layout desktop preconfigurato da caricare</translation>
 <translation id="4561940244682063697">Non consentire ai siti di richiedere all'utente la condivisione di un video stream del suo schermo</translation>
 <translation id="4562165737444703281">Consenti agli utenti di [attivare/configurare] il port forwarding in Crostini</translation>
 <translation id="456450545863578630">Attiva il trasferimento di file nelle connessioni di assistenza da remoto da parte degli amministratori aziendali</translation>
 <translation id="4567137030726189378">Consenti l'utilizzo degli Strumenti per sviluppatori</translation>
-<translation id="4570859815763368584">Criterio ritirato nella versione M68. Usa il criterio DefaultPopupsSetting.
+<translation id="4570859815763368584">Criterio ritirato nella versione M68. Usa la policy DefaultPopupsSetting.
 
       Per una spiegazione completa, visita la pagina https://www.chromestatus.com/feature/5675755719622656.
-      Se questo criterio viene attivato, sarà possibile contemporaneamente navigare nei siti e aprire nuove finestre/schede.
-      Se questo criterio viene disattivato o se non viene configurato, non sarà possibile contemporaneamente navigare nei siti e aprire nuove finestre/schede.</translation>
+      Se questa policy viene attivata, sarà possibile contemporaneamente navigare nei siti e aprire nuove finestre/schede.
+      Se questa policy viene disattivata o se non viene configurata, non sarà possibile contemporaneamente navigare nei siti e aprire nuove finestre/schede.</translation>
 <translation id="4572577129745420844">Non consentire agli utenti di aggiungere account Kerberos</translation>
-<translation id="457430673056611745">Criterio di configurazione per il connettore OnPrint <ph name="PRODUCT_NAME" /> Enterprise</translation>
+<translation id="457430673056611745">Policy di configurazione per il connettore OnPrint <ph name="PRODUCT_NAME" /> Enterprise</translation>
 <translation id="4575789820705765299">Consente l'uso dell'API Translator</translation>
 <translation id="4576760454200781316">Se viene attivata la funzionalità di <ph name="PRODUCT_NAME" />, i timer JavaScript nelle schede in background vengono limitati e uniti in modo aggressivo ed eseguiti non più di una volta al minuto dopo che la pagina è stata in background per almeno cinque minuti.
 
           Si tratta di una funzionalità conforme agli standard web, ma potrebbe causare interruzioni della funzionalità su alcuni siti web, facendo sì che determinate azioni vengano ritardate anche fino a un minuto. Se viene attivata, però, comporta un significativo risparmio della batteria e della CPU. Per ulteriori dettagli, visita il sito https://bit.ly/30b1XR4.
 
-          Se il criterio viene attivato, la funzionalità viene attivata forzatamente e gli utenti non potranno modificarla.
+          Se la policy viene attivata, la funzionalità viene attivata forzatamente e gli utenti non potranno modificarla.
 
-          Se il criterio viene disattivato, la funzionalità viene disattivata forzatamente e gli utenti non potranno modificarla.
+          Se la policy viene disattivata, la funzionalità viene disattivata forzatamente e gli utenti non potranno modificarla.
 
-          Se il criterio non viene configurato, la funzionalità verrà controllata dalla sua stessa logica interna, che può essere configurata manualmente dagli utenti.
+          Se la policy non viene configurata, la funzionalità verrà controllata dalla sua stessa logica interna, che può essere configurata manualmente dagli utenti.
 
-          Questo criterio viene applicato per processo del renderer, con il valore più recente dell'impostazione del criterio attivo all'inizio di un processo del renderer. È necessario un riavvio completo per garantire che tutte le schede caricate ricevano un'impostazione del criterio coerente. I processi possono essere eseguiti in sicurezza con valori diversi di questo criterio.
+          Questa policy viene applicata per processo del renderer, con il valore più recente dell'impostazione della policy attivo all'inizio di un processo del renderer. È necessario un riavvio completo per garantire che tutte le schede caricate ricevano un'impostazione della policy coerente. I processi possono essere eseguiti in sicurezza con valori diversi di questa policy.
           </translation>
 <translation id="4578265298946081589">Non riavviare all'uscita dell'utente.</translation>
 <translation id="4581507927311097234">Il periodo di tempo, in millisecondi, senza input dell'utente trascorso il quale lo schermo viene disattivato.</translation>
-<translation id="4582338216073557489">Se il criterio viene impostato su Nessuno, <ph name="PRODUCT_NAME" /> usa la dimensione predefinita della cache per l'archiviazione dei file memorizzati nella cache sul disco. Gli utenti non possono modificare l'impostazione.
+<translation id="4582338216073557489">Se la policy viene impostata su Nessuno, <ph name="PRODUCT_NAME" /> usa la dimensione predefinita della cache per l'archiviazione dei file memorizzati nella cache sul disco. Gli utenti non possono modificare l'impostazione.
 
-      Se il criterio viene configurato, <ph name="PRODUCT_NAME" /> usa la dimensione della cache da te fornita, indipendentemente dalla specificazione del flag --disk-cache-size da parte degli utenti. I valori inferiori ad alcuni megabyte vengono arrotondati.
+      Se la policy viene configurata, <ph name="PRODUCT_NAME" /> usa la dimensione della cache da te fornita, indipendentemente dalla specificazione del flag --disk-cache-size da parte degli utenti. I valori inferiori ad alcuni megabyte vengono arrotondati.
 
-      Se non viene configurato, <ph name="PRODUCT_NAME" /> usa la dimensione predefinita. Gli utenti possono modificare l'impostazione usando il flag --disk-cache-size.
+      Se non viene configurata, <ph name="PRODUCT_NAME" /> usa la dimensione predefinita. Gli utenti possono modificare l'impostazione usando il flag --disk-cache-size.
 
-      Nota: il valore specificato in questo criterio viene usato come hint per diversi sottosistemi della cache nel browser. Pertanto il consumo totale corrente del disco di tutte le cache sarà superiore, ma all'interno dello stesso ordine di grandezza specificato dal valore.</translation>
+      Nota: il valore specificato in questa policy viene usato come hint per diversi sottosistemi della cache nel browser. Pertanto il consumo totale corrente del disco di tutte le cache sarà superiore, ma all'interno dello stesso ordine di grandezza specificato dal valore.</translation>
 <translation id="458285976189239891">Per motivi di sicurezza, le API web
 <ph name="SHOW_OPEN_FILE_PICKER_API_NAME" />,
 <ph name="SHOW_SAVE_FILE_PICKER_API_NAME" /> e
@@ -4871,13 +4871,13 @@
 richiedono che l'utente abbia eseguito un gesto precedentemente ("attivazione temporanea"), in caso contrario la chiamata all'API
 non andrà a buon fine.
 
-Con questo criterio, gli amministratori possono specificare le origini da cui è possibile
+Con questa policy, gli amministratori possono specificare le origini da cui è possibile
 chiamare le API senza un gesto precedente dell'utente.
 
 Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. * non è
-un valore accettato per questo criterio.
+un valore accettato per questa policy.
 
-Se questo criterio non viene configurato, tutte le origini richiederanno un gesto precedente dell'utente per chiamare questa API.</translation>
+Se questa policy non viene configurata, tutte le origini richiederanno un gesto precedente dell'utente per chiamare questa API.</translation>
 <translation id="4584427961967778141">La configurazione della policy permette di controllare le impostazioni di gestione delle estensioni per <ph name="PRODUCT_NAME" />, incluse quelle controllate da policy relative alle estensioni esistenti. La policy prevale su tutte le policy precedenti che potrebbero essere state impostate.
 
 Questa policy consente di mappare un ID estensione o un URL di aggiornamento soltanto alla relativa impostazione specifica. È possibile impostare una configurazione predefinita per l'ID speciale <ph name="DEFAULT_SCOPE" />, che verrà applicata a tutte le estensioni senza una configurazione personalizzata in questa policy. Con un URL di aggiornamento, la configurazione verrà applicata alle estensioni con l'esatto URL di aggiornamento indicato nel file manifest dell'estensione (http://support.google.com/chrome/a?p=Configure_ExtensionSettings_policy). Se il flag "override_update_url" viene impostato su true, l'estensione verrà installata e aggiornata usando l'URL di aggiornamento ("update") specificato nella policy <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> o nel campo "update_url" di questa policy. Il flag "override_update_url" viene ignorato se il valore "update_url" è un URL del Chrome Web Store.
@@ -4891,18 +4891,18 @@
 <translation id="4594087525776615883">Consenti il monitoraggio delle spedizioni dei pacchi su Chrome</translation>
 <translation id="4594467366027975448">Consente di configurare la directory che <ph name="PRODUCT_NAME" /> utilizza per memorizzare la copia di roaming dei profili.
 
-      Se il criterio viene configurato, <ph name="PRODUCT_NAME" /> utilizza la directory indicata per memorizzare la copia di roaming dei profili se è stato attivato il criterio <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" />. Se il criterio <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> viene disattivato o se non viene configurato, il valore memorizzato in questo criterio non viene utilizzato.
+      Se la policy viene configurata, <ph name="PRODUCT_NAME" /> utilizza la directory indicata per memorizzare la copia di roaming dei profili se è stata attivata la policy <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" />. Se la policy <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> viene disattivata o se non viene configurata, il valore memorizzato in questa policy non viene utilizzato.
 
       Visita il sito https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables per consultare un elenco di variabili utilizzabili.
 
-      Sulle piattaforme non Windows, il criterio deve essere configurato affinché i profili di roaming funzionino.
+      Sulle piattaforme non Windows, la policy deve essere configurata affinché i profili di roaming funzionino.
 
-      Se non viene configurato su Windows, viene utilizzato il percorso di profilo di roaming predefinito.</translation>
+      Se non viene configurata su Windows, viene utilizzato il percorso di profilo di roaming predefinito.</translation>
 <translation id="4596517047440640833">Sblocco con PIN</translation>
 <translation id="4596742680861734343">Consente acquisizioni di pacchetti di rete sul dispositivo per il debug.
 
-      Se il criterio è impostato su vero o se non è configurato, l'utente può eseguire acquisizioni di pacchetti di rete sul dispositivo.
-      Se è impostato su falso, l'acquisizione di pacchetti di rete non è disponibile sul dispositivo.</translation>
+      Se la policy è impostata su true o se non è configurata, l'utente può eseguire acquisizioni di pacchetti di rete sul dispositivo.
+      Se è impostata su false, l'acquisizione di pacchetti di rete non è disponibile sul dispositivo.</translation>
 <translation id="4599810650416623373">Blocca le ottimizzazioni di JavaScript su questi siti</translation>
 <translation id="4600786265870346112">Attivazione del puntatore grande</translation>
 <translation id="4602988345256038309">Consenti le connessioni di assistenza da remoto a questo computer</translation>
@@ -4913,7 +4913,7 @@
 Su <ph name="MS_WIN_NAME" />, questa policy è disponibile soltanto per le istanze che sono aggiunte a un dominio <ph name="MS_AD_NAME" />, aggiunte a <ph name="MS_AAD_NAME" /> o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.
 
 Su <ph name="MAC_OS_NAME" />, questa policy è disponibile soltanto per le istanze che sono gestite tramite MDM, aggiunte a un dominio tramite MCX o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.</translation>
-<translation id="4607416370554533118">La configurazione del criterio consente di creare un elenco di pattern URL che specifica i siti per cui Chrome può selezionare automaticamente un certificato client. Il valore è un array di dizionari JSON sotto forma di stringa, ognuno nel formato <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, dove <ph name="URL_PATTERN_PLACEHOLDER" /> rappresenta un pattern di impostazioni contenuti. <ph name="FILTER_PLACEHOLDER" /> consente di limitare i certificati client che il browser può selezionare automaticamente. Indipendentemente dal filtro, vengono selezionati solo certificati che soddisfano la richiesta di certificato del server.
+<translation id="4607416370554533118">La configurazione della policy consente di creare un elenco di pattern URL che specifica i siti per cui Chrome può selezionare automaticamente un certificato client. Il valore è un array di dizionari JSON sotto forma di stringa, ognuno nel formato <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, dove <ph name="URL_PATTERN_PLACEHOLDER" /> rappresenta un pattern di impostazioni contenuti. <ph name="FILTER_PLACEHOLDER" /> consente di limitare i certificati client che il browser può selezionare automaticamente. Indipendentemente dal filtro, vengono selezionati solo certificati che soddisfano la richiesta di certificato del server.
 
       Esempi di utilizzo della sezione <ph name="FILTER_PLACEHOLDER" />:
 
@@ -4927,7 +4927,7 @@
 
       * Quando <ph name="FILTER_PLACEHOLDER" /> è impostato su <ph name="EMPTY_DICTIONARY" />, la selezione dei certificati client non viene limitata ulteriormente. Nota: si applicano ancora i filtri forniti dal server web.
 
-      Se il criterio non viene configurato, non viene eseguita la selezione automatica per nessun sito.</translation>
+      Se la policy non viene configurata, non viene eseguita la selezione automatica per nessun sito.</translation>
 <translation id="4611983465824842867">Non mostrare avvisi o non disattivare la compilazione automatica sui moduli non sicuri</translation>
 <translation id="4615003180013429835">Modalità di analisi degli elenchi dei siti</translation>
 <translation id="4615436471607987736">A partire da M131, questa policy è deprecata. Consente di disattivare temporaneamente due correzioni correlate al comportamento della finestra di dialogo di conferma mostrata dall'evento beforeunload.
@@ -4947,41 +4947,41 @@
 
           Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-          Le eccezioni relative ai criteri di JIT di JavaScript verranno applicate soltanto sito per sito (eTLD+1). Un criterio impostato soltanto per sottodominio.sito.com non verrà applicato correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcun criterio. In questo caso, il criterio deve essere impostato per sito.com per essere applicato correttamente sia a sito.com sia a sottodominio.sito.com.
+          Le eccezioni relative alle policy di JIT di JavaScript verranno applicate soltanto sito per sito (eTLD+1). Una policy impostata soltanto per sottodominio.sito.com non verrà applicata correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcuna policy. In questo caso, la policy deve essere impostata per sito.com per essere applicata correttamente sia a sito.com sia a sottodominio.sito.com.
 
-          Questo criterio viene applicato frame per frame e non si basa esclusivamente sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco del criterio <ph name="JAVA_SCRIPT_JIT_ALLOWED_FOR_SITES_POLICY_NAME" />, ma il sito carica un frame che contiene sito-due.com, sito-uno.com avrà attivato JIT di JavaScript, ma sito-due.com utilizzerà il criterio di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" />, se configurato, o JIT di JavaScript sarà attivato per impostazione predefinita.
+          Questa policy viene applicata frame per frame e non si basa esclusivamente sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco della policy <ph name="JAVA_SCRIPT_JIT_ALLOWED_FOR_SITES_POLICY_NAME" />, ma il sito carica un frame che contiene sito-due.com, sito-uno.com avrà attivato JIT di JavaScript, ma sito-due.com utilizzerà la policy di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" />, se configurata, o JIT di JavaScript sarà attivato per impostazione predefinita.
 
-          Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti JIT di JavaScript viene attivato per il sito.</translation>
+          Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti JIT di JavaScript viene attivato per il sito.</translation>
 <translation id="4636354638176939375">Disattiva la creazione di utenti supervisionati</translation>
 <translation id="46383668315040154">Consente di specificare il canale di rilascio su cui deve essere bloccato questo dispositivo.
 
 L'impostazione di <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> ha effetto solo se <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> è impostato su False.</translation>
 <translation id="4638906910792947645">Abilita sondaggi all'interno del prodotto</translation>
 <translation id="4641557638919545432">Verrà attivata la sintassi deprecata precedente.</translation>
-<translation id="4646626362889216307">L'impostazione di questo criterio consente di unire i criteri selezionati quando provengono da origini diverse, con stesso ambito e livello. L'unione avviene tra le chiavi di primo livello del dizionario di ogni origine. Avrà la priorità la chiave proveniente dall'origine con la priorità massima.
+<translation id="4646626362889216307">L'impostazione di questa policy consente di unire le policy selezionate quando provengono da origini diverse, con stesso ambito e livello. L'unione avviene tra le chiavi di primo livello del dizionario di ogni origine. Avrà la priorità la chiave proveniente dall'origine con la priorità massima.
 
-      Usa il carattere jolly "*" per consentire l'unione di tutti i criteri dei dizionari supportati.
+      Usa il carattere jolly "*" per consentire l'unione di tutte le policy dei dizionari supportati.
 
-      Se un criterio è nell'elenco, nel caso ci sia conflitto tra le origini:
+      Se una policy è nell'elenco, nel caso ci sia conflitto tra le origini:
 
-      * Se hanno lo stesso ambito e lo stesso livello: i valori verranno uniti in un nuovo dizionario dei criteri.
+      * Se hanno lo stesso ambito e lo stesso livello: i valori verranno uniti in un nuovo dizionario delle policy.
 
-      * Se hanno ambito o livello diversi: verrà applicato il criterio con la priorità massima.
+      * Se hanno ambito o livello diversi: verrà applicata la policy con la priorità massima.
 
-      Se un criterio non è nell'elenco, nel caso ci sia conflitto tra le origini, l'ambito o il livello, verrà applicato il criterio con la priorità massima.</translation>
+      Se una policy non è nell'elenco, nel caso ci sia conflitto tra le origini, l'ambito o il livello, verrà applicata la policy con la priorità massima.</translation>
 <translation id="4646739075621507361">Vengono segnalati i processi di stampa</translation>
 <translation id="4649395978608361979">Destinazioni stampanti locali</translation>
 <translation id="4650044303940238102">Impostazioni dei caratteri locali</translation>
 <translation id="4650759511838826572">Disabilita schemi di protocollo dell'URL</translation>
 <translation id="465099050592230505">URL del web store dell'azienda (obsoleta)</translation>
-<translation id="4653465451589191309">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono gestire (disconnettere o modificare) le connessioni VPN. Se la connessione VPN viene creata tramite un'app VPN, l'UI all'interno dell'app non viene influenzata. Pertanto, gli utenti potrebbero comunque essere in grado di utilizzare l'app per modificare la connessione VPN. Utilizza questo criterio con la funzionalità VPN sempre attiva; in questo modo l'amministratore può decidere di stabilire una connessione VPN all'avvio di un dispositivo.
+<translation id="4653465451589191309">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono gestire (disconnettere o modificare) le connessioni VPN. Se la connessione VPN viene creata tramite un'app VPN, l'UI all'interno dell'app non viene influenzata. Pertanto, gli utenti potrebbero comunque essere in grado di utilizzare l'app per modificare la connessione VPN. Utilizza questa policy con la funzionalità VPN sempre attiva; in questo modo l'amministratore può decidere di stabilire una connessione VPN all'avvio di un dispositivo.
 
-      Se il criterio viene impostato su Disattivato, vengono disattivate le interfacce utente di <ph name="PRODUCT_OS_NAME" /> che consentirebbero all'utente di disconnettere o modificare le connessioni VPN.</translation>
-<translation id="4654729794394330974">La configurazione del criterio consente di specificare i nomi di dominio dei client che vengono imposti per i client di accesso remoto e gli utenti non possono modificarli. Soltanto i client di uno dei domini specificati possono connettersi all'host.
+      Se la policy viene impostata su Disattivata, vengono disattivate le interfacce utente di <ph name="PRODUCT_OS_NAME" /> che consentirebbero all'utente di disconnettere o modificare le connessioni VPN.</translation>
+<translation id="4654729794394330974">La configurazione della policy consente di specificare i nomi di dominio dei client che vengono imposti per i client di accesso remoto e gli utenti non possono modificarli. Soltanto i client di uno dei domini specificati possono connettersi all'host.
 
-      Se per il criterio viene impostato un elenco vuoto o se il criterio non viene configurato, viene applicato il criterio predefinito per il tipo di connessione. Per l'assistenza remota, l'impostazione consente ai client di qualsiasi dominio di connettersi all'host. Per l'accesso remoto in qualsiasi momento, può connettersi solo il proprietario dell'host.
+      Se per la policy viene impostato un elenco vuoto o se la policy non viene configurata, viene applicato la policy predefinito per il tipo di connessione. Per l'assistenza remota, l'impostazione consente ai client di qualsiasi dominio di connettersi all'host. Per l'accesso remoto in qualsiasi momento, può connettersi solo il proprietario dell'host.
 
-      Vedi anche il criterio <ph name="REMOTE_ACCESS_HOST_DOMAIN_LIST_POLICY_NAME" />.
+      Vedi anche la policy <ph name="REMOTE_ACCESS_HOST_DOMAIN_LIST_POLICY_NAME" />.
 
       Nota: questa impostazione sostituisce <ph name="REMOTE_ACCESS_HOST_CLIENT_DOMAIN_POLICY_NAME" />, se presente.</translation>
 <translation id="4658380868451934335">Attiva la dettatura nella schermata di accesso</translation>
@@ -4993,28 +4993,28 @@
 <translation id="4665897631924472251">Impostazioni di gestione delle estensioni</translation>
 <translation id="4666930704271463612">Consente di specificare il sottoinsieme di server di stampa a cui verranno inviate query sulle stampanti.
 
-      Se viene usato questo criterio, gli utenti avranno a disposizione soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio.
+      Se viene usata questa policy, gli utenti avranno a disposizione soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy.
 
-      Gli ID devono corrispondere al campo "id" del file specificato nel criterio <ph name="EXTERNAL_PRINT_SERVERS_POLICY" />.
+      Gli ID devono corrispondere al campo "id" del file specificato nella policy <ph name="EXTERNAL_PRINT_SERVERS_POLICY" />.
 
-      Se questo criterio non viene impostato, il filtro viene omesso e vengono presi in considerazione tutti i server di stampa.
+      Se questa policy non viene impostata, il filtro viene omesso e vengono presi in considerazione tutti i server di stampa.
 
-      Questo criterio è deprecato, al suo posto utilizza <ph name="EXTERNAL_PRINT_SERVERS_ALLOWLIST" />.</translation>
-<translation id="4667462525936265103">Questo criterio consente di stabilire se gli utenti possono importare i dati di navigazione esistenti in un profilo gestito creato dopo che un account gestito ha eseguito l'accesso all'area dei contenuti.
+      Questa policy è deprecata, al suo posto utilizza <ph name="EXTERNAL_PRINT_SERVERS_ALLOWLIST" />.</translation>
+<translation id="4667462525936265103">Questa policy consente di stabilire se gli utenti possono importare i dati di navigazione esistenti in un profilo gestito creato dopo che un account gestito ha eseguito l'accesso all'area dei contenuti.
 
-Se questo criterio non viene impostato o se viene impostato su <ph name="USER_OPTIN_DATA_ENUM_NAME" /> (valore 1), l'utente può scegliere se importare i dati di navigazione esistenti nel profilo gestito. La casella di controllo nella finestra di dialogo di creazione del profilo sarà visibile e deselezionata per impostazione predefinita.
+Se questa policy non viene impostata o se viene impostata su <ph name="USER_OPTIN_DATA_ENUM_NAME" /> (valore 1), l'utente può scegliere se importare i dati di navigazione esistenti nel profilo gestito. La casella di controllo nella finestra di dialogo di creazione del profilo sarà visibile e deselezionata per impostazione predefinita.
 
-Se questo criterio viene impostato su <ph name="USER_OPTOUT_DATA_ENUM_NAME" /> (valore 2), l'utente può scegliere se importare i dati di navigazione esistenti nel profilo gestito. La casella di controllo nella finestra di dialogo di creazione del profilo sarà visibile e selezionata per impostazione predefinita. Questa opzione è consentita solo sui dispositivi gestiti.
+Se questa policy viene impostata su <ph name="USER_OPTOUT_DATA_ENUM_NAME" /> (valore 2), l'utente può scegliere se importare i dati di navigazione esistenti nel profilo gestito. La casella di controllo nella finestra di dialogo di creazione del profilo sarà visibile e selezionata per impostazione predefinita. Questa opzione è consentita solo sui dispositivi gestiti.
 
-Se questo criterio viene impostato su <ph name="USER_ALWAYS_SEPARATE_DATA_ENUM_NAME" /> (valore 3), l'utente non può importare i dati di navigazione esistenti nel profilo gestito. La casella di controllo nella finestra di dialogo di creazione del profilo non sarà visibile.
+Se questa policy viene impostata su <ph name="USER_ALWAYS_SEPARATE_DATA_ENUM_NAME" /> (valore 3), l'utente non può importare i dati di navigazione esistenti nel profilo gestito. La casella di controllo nella finestra di dialogo di creazione del profilo non sarà visibile.
 
 Se aggiungi i dati di navigazione esistenti nel profilo gestito, il profilo corrente diventerà gestito. Non verrà creato un nuovo profilo.
 
 Il mancato trasferimento dei dati di navigazione esistenti nel profilo gestito comporta la creazione di un nuovo profilo pulito. I dati di navigazione esistenti rimarranno in un profilo non gestito, che sarà comunque accessibile all'utente tramite il selettore del profilo.</translation>
 <translation id="4668325077104657568">Impostazione immagini predefinite</translation>
-<translation id="4669292863736266737">A meno che il criterio <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> sia impostato su <ph name="BLOCK_GEOLOCATION_SETTING" />, l'impostazione <ph name="GLS_ENABLED" /> attiva i Servizi di geolocalizzazione di Google durante la configurazione iniziale. Se il criterio è impostato su <ph name="GLS_DISABLED" /> o se non è configurato, i servizi di geolocalizzazione rimangono disattivati durante la configurazione.
+<translation id="4669292863736266737">A meno che la policy <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> sia impostata su <ph name="BLOCK_GEOLOCATION_SETTING" />, l'impostazione <ph name="GLS_ENABLED" /> attiva i Servizi di geolocalizzazione di Google durante la configurazione iniziale. Se la policy è impostata su <ph name="GLS_DISABLED" /> o se non è configurata, i servizi di geolocalizzazione rimangono disattivati durante la configurazione.
 
-Se il criterio è impostato su <ph name="BR_UNDER_USER_CONTROL" />, agli utenti viene chiesto se utilizzare o meno i Servizi di geolocalizzazione di Google. Se vengono attivati, le app Android utilizzano i servizi per cercare la posizione del dispositivo e inviare dati anonimi sulla posizione a Google.
+Se la policy è impostata su <ph name="BR_UNDER_USER_CONTROL" />, agli utenti viene chiesto se utilizzare o meno i Servizi di geolocalizzazione di Google. Se vengono attivati, le app Android utilizzano i servizi per cercare la posizione del dispositivo e inviare dati anonimi sulla posizione a Google.
 
 Dopo la configurazione iniziale, gli utenti possono attivare o disattivare i Servizi di geolocalizzazione di Google.</translation>
 <translation id="4670865688564083639">Minimo:</translation>
@@ -5031,45 +5031,45 @@
 <translation id="4680961954980851756">Abilita Compilazione automatica</translation>
 <translation id="46845898956959634">Consenti Aiutami a scrivere e migliora i modelli di AI.</translation>
 <translation id="4685721728282448265">Algoritmo di scambio di chiavi post-quantistico CECPQ2 attivo per TLS</translation>
-<translation id="468822697351680932">Utilizza il criterio SiteList di Internet Explorer come fonte di regole</translation>
+<translation id="468822697351680932">Utilizza la policy SiteList di Internet Explorer come fonte di regole</translation>
 <translation id="4693190628432874457">Attiva i report sulla posizione del dispositivo</translation>
 <translation id="4693779768620889402">Destinazioni basate su estensioni</translation>
-<translation id="4693861751987983072">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> segnala a Google metriche relative all'utilizzo e dati diagnostici, ad esempio report sugli arresti anomali. Se il criterio viene impostato su Disattivato, la segnalazione di metriche e dati diagnostici viene disattivata.
+<translation id="4693861751987983072">Se la policy viene impostata su Attivata, <ph name="PRODUCT_OS_NAME" /> segnala a Google metriche relative all'utilizzo e dati diagnostici, ad esempio report sugli arresti anomali. Se la policy viene impostata su Disattivata, la segnalazione di metriche e dati diagnostici viene disattivata.
 
-Per i dispositivi gestiti, questo criterio è attivo per impostazione predefinita e invia le metriche a Google.
+Per i dispositivi gestiti, questa policy è attiva per impostazione predefinita e invia le metriche a Google.
 
 Per i dispositivi non gestiti, l'utente può decidere di inviare le metriche.</translation>
 <translation id="4694138212536142867">Attiva i report sullo stato dell'hardware del dispositivo</translation>
 <translation id="4697581738794063407">Controlla la funzionalità di filtro del parametro URL</translation>
 <translation id="4698895924806859508">Non segnalare eventi di rete</translation>
 <translation id="4699172675775169585">Immagini e file memorizzati nella cache</translation>
-<translation id="4699592681017489215">Questo criterio consente di configurare un'opzione locale che permette di disattivare i controlli dell'intercettazione DNS. Lo scopo dei controlli è cercare di scoprire se il browser è protetto da un proxy che reindirizza i nomi host sconosciuti.
+<translation id="4699592681017489215">Questa policy consente di configurare un'opzione locale che permette di disattivare i controlli dell'intercettazione DNS. Lo scopo dei controlli è cercare di scoprire se il browser è protetto da un proxy che reindirizza i nomi host sconosciuti.
 
       Questo rilevamento potrebbe non essere necessario in un ambiente aziendale in cui la configurazione di rete è nota, perché causa del traffico DNS e HTTP all'avvio e a ogni modifica della configurazione DNS.
 
-      Se questo criterio non viene impostato o viene attivato, i controlli dell'intercettazione DNS vengono eseguiti. Se viene disattivato, i controlli non vengono eseguiti.</translation>
+      Se questa policy non viene impostata o viene attivata, i controlli dell'intercettazione DNS vengono eseguiti. Se viene disattivata, i controlli non vengono eseguiti.</translation>
 <translation id="4700190441681139987">Non consentire a nessun sito di accedere ai sensori</translation>
 <translation id="4703402283970867140">Attiva il modello di oscuramento smart per ritardare l'oscuramento dello schermo</translation>
 <translation id="4704958130749494760">Concedi automaticamente ai siti l'autorizzazione a connettersi a dispositivi seriali USB</translation>
-<translation id="4705329890928008808">Se il criterio è impostato su CopyCaCerts, per le app ARC sono disponibili tutti i certificati CA installati su ONC con <ph name="WEB_TRUSTED_BIT" />.
+<translation id="4705329890928008808">Se la policy è impostata su CopyCaCerts, per le app ARC sono disponibili tutti i certificati CA installati su ONC con <ph name="WEB_TRUSTED_BIT" />.
 
-Se è impostato su None o non è configurato, per le app ARC non sono disponibili certificati <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="4707142899480362007">La configurazione del criterio consente di elencare i pattern URL che specificano i siti a cui viene concessa automaticamente l'autorizzazione di accesso a un dispositivo USB con gli ID fornitore e prodotto indicati nella schermata di accesso. Perché il criterio sia valido, ogni elemento nell'elenco richiede entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> può avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="VENDOR_ID_FIELD_NAME" /> non viene specificato, il criterio può corrispondere a qualsiasi dispositivo. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> non viene specificato, il criterio può corrispondere a qualsiasi dispositivo con l'ID fornitore specificato. Un criterio con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valido.
+Se è impostata su None o non è configurata, per le app ARC non sono disponibili certificati <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="4707142899480362007">La configurazione della policy consente di elencare i pattern URL che specificano i siti a cui viene concessa automaticamente l'autorizzazione di accesso a un dispositivo USB con gli ID fornitore e prodotto indicati nella schermata di accesso. Perché la policy sia valida, ogni elemento nell'elenco richiede entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> può avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="VENDOR_ID_FIELD_NAME" /> non viene specificato, la policy può corrispondere a qualsiasi dispositivo. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> non viene specificato, la policy può corrispondere a qualsiasi dispositivo con l'ID fornitore specificato. Una policy con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valida.
 
-      Il modello di autorizzazioni USB consentirà all'URL specificato di accedere al dispositivo USB come origine di primo livello. Se i frame incorporati devono accedere ai dispositivi USB, per concedere l'accesso è necessario usare l'intestazione "usb" del criterio <ph name="FEATURE_POLICY_HEADER_NAME" />. Se l'URL non è valido, il criterio viene ignorato.
+      Il modello di autorizzazioni USB consentirà all'URL specificato di accedere al dispositivo USB come origine di primo livello. Se i frame incorporati devono accedere ai dispositivi USB, per concedere l'accesso è necessario usare l'intestazione "usb" della policy <ph name="FEATURE_POLICY_HEADER_NAME" />. Se l'URL non è valido, la policy viene ignorata.
 
       Deprecato. Il modello di autorizzazioni USB supportava la specifica di entrambi gli URL richiedente e di incorporamento. Questo modello è deprecato e supportato soltanto per la compatibilità con le versioni precedenti nel seguente modo: se vengono specificati entrambi gli URL richiedente e di incorporamento, all'URL di incorporamento verrà concessa l'autorizzazione come origine di primo livello, mentre l'URL richiedente verrà ignorato completamente.
 
-      Se il criterio non viene configurato, viene utilizzato il valore predefinito globale per tutti i siti (nessun accesso automatico).</translation>
+      Se la policy non viene configurata, viene utilizzato il valore predefinito globale per tutti i siti (nessun accesso automatico).</translation>
 <translation id="471360812659157054">window.webkitStorageInfo non sarà disponibile.</translation>
 <translation id="4715773950737036924">Controlla la disponibilità di estensioni non pubblicate sul Chrome Web Store.</translation>
 <translation id="4722122254122249791">Attiva isolamento dei siti per origini specificate
 </translation>
 <translation id="4722761845551711583">Consente di configurare il tempo di visualizzazione in secondi di un'immagine quando il salvaschermo per la schermata di accesso ha diverse immagini da visualizzare.
 
-I valori validi sono compresi tra 1 secondo e 9999 secondi. Se il criterio non viene configurato, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 60 secondi.
+I valori validi sono compresi tra 1 secondo e 9999 secondi. Se la policy non viene configurata, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 60 secondi.
 
-Questo criterio non avrà alcun effetto se il criterio <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" /> viene impostato su false.</translation>
+Questa policy non avrà alcun effetto se la policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" /> viene impostata su false.</translation>
 <translation id="4723829699367336876">Abilita attraversamento firewall da client di accesso remoto</translation>
 <translation id="4725528134735324213">Attiva Android Backup Service</translation>
 <translation id="4725691087141147920">Mostra il consenso alla sincronizzazione durante l'accesso</translation>
@@ -5085,78 +5085,78 @@
 <translation id="4746394249367607432">Gli utenti potranno partecipare ed essere aggiunti a una sessione di gestione dei corsi. Gli insegnanti potranno inviare contenuti a questi utenti.</translation>
 <translation id="4749670563834935149">Consente di attivare <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL nella schermata di accesso e di blocco.
 
-La configurazione di questo criterio consente di specificare gli URL offerti da <ph name="PRODUCT_OS_NAME" /> per avviare il flusso di attestazione. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
+La configurazione di questa policy consente di specificare gli URL offerti da <ph name="PRODUCT_OS_NAME" /> per avviare il flusso di attestazione. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
 
-Se questo criterio non viene impostato o se viene lasciato vuoto, nessun sito web potrà avviare il flusso di attestazione o ricevere segnali dal dispositivo.
+Se questa policy non viene impostata o se viene lasciata vuota, nessun sito web potrà avviare il flusso di attestazione o ricevere segnali dal dispositivo.
 
-Questo criterio inciderà soltanto sul flusso di attestazione nella schermata di accesso e di blocco. Per modificare il flusso di attestazione all'interno della sessione, utilizza il criterio <ph name="CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
+Questa policy inciderà soltanto sul flusso di attestazione nella schermata di accesso e di blocco. Per modificare il flusso di attestazione all'interno della sessione, utilizza la policy <ph name="CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />.
 
 Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation>
 <translation id="4752880493649142945">Certificato client per la connessione a RemoteAccessHostTokenValidationUrl</translation>
-<translation id="475479145997699293">Se il criterio è impostato su <ph name="ASK_FILE_HANDLING" />, le app web possono richiedere l'accesso ai tipi di file tramite l'API File Handling. Se è impostato su <ph name="BLOCK_FILE_HANDLING" />, viene negato l'accesso ai di file.
+<translation id="475479145997699293">Se la policy è impostata su <ph name="ASK_FILE_HANDLING" />, le app web possono richiedere l'accesso ai tipi di file tramite l'API File Handling. Se è impostata su <ph name="BLOCK_FILE_HANDLING" />, viene negato l'accesso ai di file.
 
-      Se non è configurato, le app web possono richiedere l'accesso, ma gli utenti possono modificare questa impostazione.</translation>
+      Se non è configurata, le app web possono richiedere l'accesso, ma gli utenti possono modificare questa impostazione.</translation>
 <translation id="4756953551789081500">Disattiva i report sullo stato di aggiornamento del sistema operativo del dispositivo</translation>
 <translation id="4757053978738874325">Consente di attivare la funzione di accessibilità di audio in formato mono.
 
           Questa funzione consente di emettere audio in formato stereo, che include diversi canali a destra e a sinistra, per cui ogni orecchio percepisce suoni diversi.
 
-          Se questo criterio viene attivato, l'audio in formato mono sarà sempre attivo.
+          Se questa policy viene attivata, l'audio in formato mono sarà sempre attivo.
 
-          Se questo criterio viene disattivato, l'audio in formato mono sarà sempre disattivato.
+          Se questa policy viene disattivata, l'audio in formato mono sarà sempre disattivato.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'audio in formato mono è disattivato, ma l'utente può attivarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'audio in formato mono è disattivato, ma l'utente può attivarlo in qualsiasi momento.</translation>
 <translation id="475736328056346227">Migliora la produttività consentendo la visualizzazione di informazioni delle app e dei servizi Google sulle piattaforme di sistema di <ph name="PRODUCT_OS_NAME" />.
 
 Se il servizio Google associato è attivo, verrà mostrata un'integrazione.
 
-Se il criterio <ph name="CONTEXTUAL_GOOGLE_INTEGRATIONS_ENABLED" /> viene disattivato, verranno disattivati tutti i servizi, indipendentemente dalle impostazioni di questo criterio.
+Se la policy <ph name="CONTEXTUAL_GOOGLE_INTEGRATIONS_ENABLED" /> viene disattivata, verranno disattivati tutti i servizi, indipendentemente dalle impostazioni di questa policy.
 
-Se il criterio <ph name="CONTEXTUAL_GOOGLE_INTEGRATIONS_ENABLED" /> viene attivato o se non viene configurato, questo criterio può essere selezionato per i servizi.
+Se la policy <ph name="CONTEXTUAL_GOOGLE_INTEGRATIONS_ENABLED" /> viene attivata o se non viene configurata, questa policy può essere selezionata per i servizi.
 
-Se questo criterio non viene configurato, verranno attivati tutti i servizi.
+Se questa policy non viene configurata, verranno attivati tutti i servizi.
 
 In caso contrario, verranno attivati solo i servizi selezionati.</translation>
 <translation id="4758335997982239449">Attiva la funzionalità di protezione IP di <ph name="PRIVACY_SANDBOX_NAME" />.</translation>
-<translation id="4767059955897420757">Se il criterio non viene configurato o se viene attivato, all'utente potrebbe essere mostrata la promozione dell'estensione fornitore di credenziali.
-Se viene disattivato, all'utente non viene mostrata la promozione dell'estensione fornitore di credenziali.</translation>
+<translation id="4767059955897420757">Se la policy non viene configurata o se viene attivata, all'utente potrebbe essere mostrata la promozione dell'estensione fornitore di credenziali.
+Se viene disattivata, all'utente non viene mostrata la promozione dell'estensione fornitore di credenziali.</translation>
 <translation id="4768446404233019970">Attiva le suite di crittografia 3DES in TLS</translation>
 <translation id="4770334626033858263">La configurazione usata per generare e verificare il codice accesso genitori.</translation>
 <translation id="4773997835955617342">Consente di modificare la configurazione <ph name="KRB5_CONFIG" /> suggerita per i nuovi ticket creati manualmente.
 
-      Se questo criterio viene attivato, il valore del criterio "KerberosCustomPrefilledConfig" viene applicato come configurazione suggerita e viene mostrato nella sezione "Avanzate" della finestra di dialogo dell'autenticazione Kerberos.
+      Se questa policy viene attivata, il valore della policy "KerberosCustomPrefilledConfig" viene applicato come configurazione suggerita e viene mostrato nella sezione "Avanzate" della finestra di dialogo dell'autenticazione Kerberos.
 
-      Se questo criterio viene disattivato o se non viene configurato, viene applicata la configurazione di <ph name="PRODUCT_OS_NAME" /> consigliata. Tieni presente che viene visualizzato anche nella sezione "Avanzate" della finestra di dialogo dell'autenticazione Kerberos.</translation>
+      Se questa policy viene disattivata o se non viene configurata, viene applicata la configurazione di <ph name="PRODUCT_OS_NAME" /> consigliata. Tieni presente che viene visualizzata anche nella sezione "Avanzate" della finestra di dialogo dell'autenticazione Kerberos.</translation>
 <translation id="4774030790286815890">Se questa impostazione viene attivata, gli utenti possono attivare Phone Hub, che consente loro di interagire con il proprio telefono su un dispositivo ChromeOS.
 
       Se viene disattivata, gli utenti non possono attivare Phone Hub.
 
-      Se il criterio non viene configurato, per impostazione predefinita, la funzionalità non è consentita per gli utenti gestiti a livello aziendale ed è consentita per gli utenti non gestiti.</translation>
-<translation id="4777573685807338095">Questo criterio consente di stabilire se mostrare o meno all'utente la schermata introduttiva per Gemini durante il primo flusso di accesso.
+      Se la policy non viene configurata, per impostazione predefinita, la funzionalità non è consentita per gli utenti gestiti a livello aziendale ed è consentita per gli utenti non gestiti.</translation>
+<translation id="4777573685807338095">Questa policy consente di stabilire se mostrare o meno all'utente la schermata introduttiva per Gemini durante il primo flusso di accesso.
 
-      Se impostato su Disattivato, la schermata introduttiva di Gemini non verrà mostrata.
+      Se impostata su Disattivata, la schermata introduttiva di Gemini non verrà mostrata.
 
-      Se impostato su Attivato, la schermata introduttiva di Gemini verrà mostrata.
+      Se impostata su Attivata, la schermata introduttiva di Gemini verrà mostrata.
 
-      Se non viene configurato, la schermata introduttiva di Gemini verrà ignorata per gli utenti gestiti a livello aziendale e mostrata per gli utenti non gestiti.</translation>
+      Se non viene configurata, la schermata introduttiva di Gemini verrà ignorata per gli utenti gestiti a livello aziendale e mostrata per gli utenti non gestiti.</translation>
 <translation id="4783415902268741066">Consenti la visualizzazione della pagina di risultati più recente del motore di ricerca predefinito in un riquadro laterale del browser</translation>
 <translation id="4786784434769279324">Azioni da eseguire quando il computer è inattivo</translation>
 <translation id="4787763197941188108">Consente di sostituire le dimensioni della pagina di stampa predefinita.
 
-      <ph name="PAGE_SIZE_NAME" /> non dovrebbe contenere uno dei formati elencati o "personalizzato" se la dimensione della carta richiesta non è nell'elenco. Se viene fornito il valore "personalizzato", deve essere specificata la proprietà <ph name="PAGE_SIZE_CUSTOM_SIZE" />. Descrive l'altezza e la larghezza desiderate in micrometri. Diversamente la proprietà <ph name="PAGE_SIZE_CUSTOM_SIZE" /> non deve essere specificata. Il criterio che viola queste regole viene ignorato.
+      <ph name="PAGE_SIZE_NAME" /> non dovrebbe contenere uno dei formati elencati o "personalizzato" se la dimensione della carta richiesta non è nell'elenco. Se viene fornito il valore "personalizzato", deve essere specificata la proprietà <ph name="PAGE_SIZE_CUSTOM_SIZE" />. Descrive l'altezza e la larghezza desiderate in micrometri. Diversamente la proprietà <ph name="PAGE_SIZE_CUSTOM_SIZE" /> non deve essere specificata. La policy che viola queste regole viene ignorata.
 
-      Se le dimensioni della pagina non sono disponibili nella stampante scelta dall'utente, questo criterio viene ignorato.</translation>
+      Se le dimensioni della pagina non sono disponibili nella stampante scelta dall'utente, questa policy viene ignorata.</translation>
 <translation id="4789450349513792856">Blocca popup su questi siti</translation>
 <translation id="4790391579868456557">Usa cookie essenziali e non essenziali nella ricerca.</translation>
 <translation id="4790588245699320140">Permetti all'Assistente Google di accedere al contesto dello schermo</translation>
 <translation id="4800438168909332958">Consente di attivare la funzionalità di cancellazione dell'eco per l'audio di sistema (AEC). La funzionalità AEC di sistema è un sistema di cancellazione dell'eco acustico, ovvero un modulo di elaborazione audio che rimuove la riproduzione dell'audio di sistema (eco) dal segnale del microfono.
-Questo criterio è temporaneo e verrà rimosso non appena verrà lanciata la funzionalità di cancellazione dell'eco per l'audio di sistema.
+Questa policy è temporanea e verrà rimossa non appena verrà lanciata la funzionalità di cancellazione dell'eco per l'audio di sistema.
 
-  Se questo criterio viene impostato su true, la cancellazione dell'eco per l'audio di sistema sarà sempre attiva.
+  Se questa policy viene impostata su true, la cancellazione dell'eco per l'audio di sistema sarà sempre attiva.
 
-  Se questo criterio viene impostato su false o se non viene configurato, la cancellazione dell'eco per l'audio di sistema potrebbe comunque essere attivata in base al relativo piano di lancio, ma non verrà applicata in modo forzato da questo criterio.</translation>
+  Se questa policy viene impostata su false o se non viene configurata, la cancellazione dell'eco per l'audio di sistema potrebbe comunque essere attivata in base al relativo piano di lancio, ma non verrà applicata in modo forzato da questa policy.</translation>
 <translation id="4800865664096110749">Attiva flusso di attestazione <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL sui profili gestiti</translation>
 <translation id="4801512016965057443">Consenti roaming dati mobile</translation>
 <translation id="4801647366128872782">Specifica gli URL che consentono la generazione di report sulla tecnologia precedente</translation>
@@ -5164,15 +5164,15 @@
 <translation id="4802905909524200151">Configura il comportamento di aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /></translation>
 <translation id="4804828344300125154">Riavvia sempre all'uscita dell'utente.</translation>
 <translation id="4807950475297505572">Gli utenti utilizzati meno di recente vengono rimossi fino alla disponibilità di spazio libero sufficiente</translation>
-<translation id="4812270373673968774">Se il criterio è impostato su Always, la barra delle app <ph name="PRODUCT_OS_NAME" /> viene nascosta automaticamente. Se il criterio è impostato su Never, la barra delle app non viene mai nascosta automaticamente.
+<translation id="4812270373673968774">Se la policy è impostata su Always, la barra delle app <ph name="PRODUCT_OS_NAME" /> viene nascosta automaticamente. Se la policy è impostata su Never, la barra delle app non viene mai nascosta automaticamente.
 
-      Se il criterio è configurato, gli utenti non possono apportare modifiche. Se non è configurato, gli utenti possono decidere se la barra delle app viene nascosta automaticamente.</translation>
+      Se la policy è configurata, gli utenti non possono apportare modifiche. Se non è configurata, gli utenti possono decidere se la barra delle app viene nascosta automaticamente.</translation>
 <translation id="4812309945046430049">Colore della retroilluminazione della tastiera rosso</translation>
-<translation id="4812714598405913256">Configura il messaggio della scadenza dell'aggiornamento automatico per il criterio DeviceMinimumVersion</translation>
+<translation id="4812714598405913256">Configura il messaggio della scadenza dell'aggiornamento automatico per la policy DeviceMinimumVersion</translation>
 <translation id="4815581264328351694">Mostra opzioni di accessibilità nel menu della barra delle applicazioni</translation>
 <translation id="4816674326202173458">Consenti all'utente aziendale di essere l'utente principale e secondario (comportamento predefinito per gli utenti non gestiti)</translation>
-<translation id="4819906370830175867">Se il criterio viene impostato su True, Native Client può continuare a essere eseguito anche se il comportamento predefinito prevede che sia disattivato.
-Se il criterio viene impostato su False, verrà utilizzato il comportamento predefinito.</translation>
+<translation id="4819906370830175867">Se la policy viene impostata su True, Native Client può continuare a essere eseguito anche se il comportamento predefinito prevede che sia disattivato.
+Se la policy viene impostata su False, verrà utilizzato il comportamento predefinito.</translation>
 <translation id="4820432864264617413">È vietata l'esecuzione di <ph name="BOREALIS_NAME" /> per un utente</translation>
 <translation id="4821987881803903281">Blocca l'autorizzazione per il posizionamento delle finestre su questi siti</translation>
 <translation id="4825653993105771848">Controlla l'accesso alla rete privata nell'API Direct Sockets</translation>
@@ -5186,8 +5186,8 @@
 <translation id="4834526953114077364">Gli utenti utilizzati meno di recente che non hanno eseguito l'accesso negli ultimi tre mesi vengono rimossi fino alla disponibilità di spazio libero sufficiente</translation>
 <translation id="4835470005923546373">Disattiva la modalità di stampa delle immagini di sfondo per impostazione predefinita</translation>
 <translation id="4835622243021053389">Attiva autenticazione NTLMv2</translation>
-<translation id="4840015507504937941">Questo criterio consente di impostare le dimensioni minime (in byte) dei dati negli appunti, che verranno controllate in base alle regole di limitazione relativa agli appunti definite nel criterio DataLeakPreventionRulesList.
-      Se non viene configurato, l'impostazione predefinita è 0, il che significa che tutti i dati incollati dagli appunti verranno controllati secondo le regole configurate.</translation>
+<translation id="4840015507504937941">Questa policy consente di impostare le dimensioni minime (in byte) dei dati negli appunti, che verranno controllate in base alle regole di limitazione relativa agli appunti definite nella policy DataLeakPreventionRulesList.
+      Se non viene configurata, l'impostazione predefinita è 0, il che significa che tutti i dati incollati dagli appunti verranno controllati secondo le regole configurate.</translation>
 <translation id="4843535028402307134">https://github.com/w3c/ServiceWorker/issues/765 chiede che l'iframe srcdoc con
 l'attributo sandbox "allow-same-origin" sia sotto il controllo di ServiceWorker.
 
@@ -5199,25 +5199,25 @@
 ServiceWorker.
 
 Questo criterio è stato pensato per essere temporaneo e verrà rimosso nel 2026.</translation>
-<translation id="4846678215172543001">Questo criterio impedisce la visualizzazione di avvisi di URL simili sui siti elencati. Questi avvisi sono solitamente mostrati sui siti in cui <ph name="PRODUCT_NAME" /> crede che sia in atto un tentativo di spoofing di un altro sito noto all'utente.
+<translation id="4846678215172543001">Questa policy impedisce la visualizzazione di avvisi di URL simili sui siti elencati. Questi avvisi sono solitamente mostrati sui siti in cui <ph name="PRODUCT_NAME" /> crede che sia in atto un tentativo di spoofing di un altro sito noto all'utente.
 
-       Se il criterio viene attivato e impostato su uno o più domini, non verrà visualizzata alcuna pagina di avviso di somiglianza quando l'utente visita le pagine di quel dominio.
+       Se la policy viene attivata e impostata su uno o più domini, non verrà visualizzata alcuna pagina di avviso di somiglianza quando l'utente visita le pagine di quel dominio.
 
-       Se il criterio non viene impostato o se viene impostato su un elenco vuoto, gli avvisi potrebbero essere visualizzati su qualunque sito visitato dall'utente.
+       Se la policy non viene impostata o se viene impostata su un elenco vuoto, gli avvisi potrebbero essere visualizzati su qualunque sito visitato dall'utente.
 
        Un nome host può essere consentito nel caso di una completa corrispondenza del nome host o di una corrispondenza con un qualsiasi dominio. Ad esempio, gli avvisi per un URL come "https://foo.example.com/bar" potrebbero essere eliminati se l'elenco include "foo.example.com" o "example.com".</translation>
 <translation id="4852900976354340846">Impostazioni relative a Direct Sockets</translation>
 <translation id="485419696366295465">Consente di gestire i criteri relativi al sottosistema <ph name="BOREALIS_NAME" />.</translation>
-<translation id="4855636880814771207">Se il criterio viene attivato o se non viene configurato, gli utenti possono attivare o disattivare il Bluetooth.
+<translation id="4855636880814771207">Se la policy viene attivata o se non viene configurata, gli utenti possono attivare o disattivare il Bluetooth.
 
-Se il criterio viene disattivato, <ph name="PRODUCT_OS_NAME" /> disattiva il Bluetooth e gli utenti non possono attivarlo.
+Se la policy viene disattivata, <ph name="PRODUCT_OS_NAME" /> disattiva il Bluetooth e gli utenti non possono attivarlo.
 
       Nota: per attivare il Bluetooth, gli utenti devono scollegarsi ed effettuare nuovamente l'accesso.</translation>
 <translation id="4856471929724652373">Consente di segnalare informazioni sull'aggiornamento del sistema operativo, ad esempio stato di aggiornamento, versione della piattaforma,
       controllo dell'ultimo aggiornamento e ultimo riavvio.
 
-      Se il criterio è impostato su false o non viene impostato, le informazioni sull'aggiornamento del sistema operativo non verranno
-      segnalate. Se è impostato su true, le informazioni sull'aggiornamento del sistema operativo verranno segnalate.</translation>
+      Se la policy è impostata su false o non viene impostata, le informazioni sull'aggiornamento del sistema operativo non verranno
+      segnalate. Se è impostata su true, le informazioni sull'aggiornamento del sistema operativo verranno segnalate.</translation>
 <translation id="4857223512478723171">Non consentire la modalità a schermo intero</translation>
 <translation id="4857888176748302062">Consenti alle origini di richiedere gli attributi dei dispositivi</translation>
 <translation id="4858735034935305895">Consenti modalità a schermo intero</translation>
@@ -5227,9 +5227,9 @@
 <translation id="4872803921706580974">Attiva la visualizzazione della schermata del sensore della presenza di persone durante l'accesso</translation>
 <translation id="4873380469296842901">Se questa impostazione viene attivata, gli utenti che hanno già attivato Phone Hub possono inviare e ricevere notifiche del loro telefono su ChromeOS.
 
-      Se viene disattivata, gli utenti non possono usare questa funzionalità. Gli utenti non possono usare questa funzionalità anche se viene disattivato il criterio PhoneHubAllowed.
+      Se viene disattivata, gli utenti non possono usare questa funzionalità. Gli utenti non possono usare questa funzionalità anche se viene disattivata la policy PhoneHubAllowed.
 
-      Se questo criterio non viene configurato, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
+      Se questa policy non viene configurata, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
 <translation id="487460824085252184">Esegui automaticamente la migrazione senza chiedere il consenso dell'utente</translation>
 <translation id="4874982543810021567">Blocca WebUSB su questi siti</translation>
 <translation id="4876805738539874299">Versione SSL massima abilitata</translation>
@@ -5239,125 +5239,125 @@
 
 <ph name="DBSC_FEATURE_NAME" /> protegge i cookie di autenticazione di Google dal furto fornendo regolarmente una prova crittografica del possesso del dispositivo ai server di Google.
 
-Se questo criterio viene impostato su false, la funzionalità <ph name="DBSC_FEATURE_NAME" /> viene disattivata.
+Se questa policy viene impostata su false, la funzionalità <ph name="DBSC_FEATURE_NAME" /> viene disattivata.
 
-Se viene impostato su true, la funzionalità di <ph name="DBSC_FEATURE_NAME" /> viene attivata.
+Se viene impostata su true, la funzionalità di <ph name="DBSC_FEATURE_NAME" /> viene attivata.
 
-Se non viene configurato, <ph name="PRODUCT_NAME" /> seguirà la procedura di implementazione predefinita per la funzionalità <ph name="DBSC_FEATURE_NAME" />, il che significa che la funzionalità viene implementata gradualmente per un numero crescente di utenti.</translation>
+Se non viene configurata, <ph name="PRODUCT_NAME" /> seguirà la procedura di implementazione predefinita per la funzionalità <ph name="DBSC_FEATURE_NAME" />, il che significa che la funzionalità viene implementata gradualmente per un numero crescente di utenti.</translation>
 <translation id="488996881569316769">Telemetria di rete</translation>
-<translation id="4890453377345554695">La configurazione del criterio consente di elencare i pattern URL che specificano i siti che possono richiedere agli utenti l'accesso di scrittura di file o directory nel file system del sistema operativo host.
+<translation id="4890453377345554695">La configurazione della policy consente di elencare i pattern URL che specificano i siti che possono richiedere agli utenti l'accesso di scrittura di file o directory nel file system del sistema operativo host.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_FILE_SYSTEM_WRITE_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_FILE_SYSTEM_WRITE_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      I pattern URL non devono essere in conflitto con <ph name="FILE_SYSTEM_WRITE_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="FILE_SYSTEM_WRITE_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="4891286600098289814">Ottimizzazione della ricarica della batteria</translation>
-<translation id="4892647988357350237">Per impostazione predefinita, i Termini di servizio vengono mostrati alla prima esecuzione di CCT. Se questo criterio viene impostato su <ph name="SKIP_TOS_DIALOG" />, la finestra di dialogo dei Termini di servizio non viene visualizzata né alla prima esecuzione né a quelle successive. Se questo criterio viene impostato su <ph name="STANDARD_TOS_DIALOG" /> o se non viene configurato, la finestra di dialogo dei Termini di servizio viene visualizzata alla prima esecuzione. Altre condizioni:
+<translation id="4892647988357350237">Per impostazione predefinita, i Termini di servizio vengono mostrati alla prima esecuzione di CCT. Se questa policy viene impostata su <ph name="SKIP_TOS_DIALOG" />, la finestra di dialogo dei Termini di servizio non viene visualizzata né alla prima esecuzione né a quelle successive. Se questa policy viene impostata su <ph name="STANDARD_TOS_DIALOG" /> o se non viene configurata, la finestra di dialogo dei Termini di servizio viene visualizzata alla prima esecuzione. Altre condizioni:
 
-      - Questo criterio funziona solo su dispositivi Android completamente gestiti che possono essere configurati da fornitori dell'Unified Endpoint Management.
+      - Questa policy funziona solo su dispositivi Android completamente gestiti che possono essere configurati da fornitori dell'Unified Endpoint Management.
 
-      - Se questo criterio viene impostato su <ph name="SKIP_TOS_DIALOG" />, il criterio BrowserSignin non ha effetto.
+      - Se questa policy viene impostata su <ph name="SKIP_TOS_DIALOG" />, la policy BrowserSignin non ha effetto.
 
-      - Se questo criterio viene impostato su <ph name="SKIP_TOS_DIALOG" />, le metriche​ non vengono inviate al server.
+      - Se questa policy viene impostata su <ph name="SKIP_TOS_DIALOG" />, le metriche​ non vengono inviate al server.
 
-      - Se questo criterio viene impostato su <ph name="SKIP_TOS_DIALOG" />, il browser ha una funzionalità limitata.
+      - Se questa policy viene impostata su <ph name="SKIP_TOS_DIALOG" />, il browser ha una funzionalità limitata.
 
-      - Se questo criterio viene impostato su <ph name="SKIP_TOS_DIALOG" />, gli amministratori devono comunicarlo agli utenti finali del dispositivo.</translation>
-<translation id="489760181463331251">Questo criterio modifica il livello di risparmio della funzionalità Risparmio memoria.
+      - Se questa policy viene impostata su <ph name="SKIP_TOS_DIALOG" />, gli amministratori devono comunicarlo agli utenti finali del dispositivo.</translation>
+<translation id="489760181463331251">Questa policy modifica il livello di risparmio della funzionalità Risparmio memoria.
 
-Questo criterio viene applicato soltanto quando il Risparmio memoria viene attivato tramite le impostazioni o mediante il criterio <ph name="HIGH_EFFICIENCY_MODE_ENABLED_POLICY_NAME" /> e inciderà sul modo in cui vengono utilizzate le euristiche per stabilire quando eliminare le schede. Ad esempio, ridurre la durata di una scheda inattiva prima di eliminarla può far risparmiare memoria, ma significa anche che le schede verranno ricaricate più di frequente. Ciò potrebbe comportare un'esperienza utente scadente e un maggiore traffico di rete.
+Questa policy viene applicata soltanto quando il Risparmio memoria viene attivato tramite le impostazioni o mediante la policy <ph name="HIGH_EFFICIENCY_MODE_ENABLED_POLICY_NAME" /> e inciderà sul modo in cui vengono utilizzate le euristiche per stabilire quando eliminare le schede. Ad esempio, ridurre la durata di una scheda inattiva prima di eliminarla può far risparmiare memoria, ma significa anche che le schede verranno ricaricate più di frequente. Ciò potrebbe comportare un'esperienza utente scadente e un maggiore traffico di rete.
 
-Se imposti il criterio su 0, il Risparmio memoria offrirà un risparmio di memoria moderato. Le schede diventano inattive dopo un periodo di tempo più lungo
+Se imposti la policy su 0, il Risparmio memoria offrirà un risparmio di memoria moderato. Le schede diventano inattive dopo un periodo di tempo più lungo
 
-Se imposti il criterio su 1, il Risparmio memoria offrirà un risparmio di memoria bilanciato. Le schede diventano inattive dopo un periodo di tempo ottimale.
+Se imposti la policy su 1, il Risparmio memoria offrirà un risparmio di memoria bilanciato. Le schede diventano inattive dopo un periodo di tempo ottimale.
 
-Se imposti il criterio su 2, il Risparmio memoria offrirà un risparmio di memoria massimo. Le schede diventano inattive dopo un periodo di tempo più breve.
+Se imposti la policy su 2, il Risparmio memoria offrirà un risparmio di memoria massimo. Le schede diventano inattive dopo un periodo di tempo più breve.
 
-Se questo criterio non è impostato, l'utente finale può controllare questa impostazione all'indirizzo chrome://settings/performance.</translation>
+Se questa policy non è impostata, l'utente finale può controllare questa impostazione all'indirizzo chrome://settings/performance.</translation>
 <translation id="489803897780524242">Parametro di controllo sostituzione termini di ricerca per fornitore ricerca predefinito</translation>
 <translation id="4899708173828500852">Consenti Navigazione sicura</translation>
-<translation id="490231389914389892">Questo criterio consente di stabilire il comportamento delle scorciatoie su <ph name="PRODUCT_OS_NAME" />.
+<translation id="490231389914389892">Questa policy consente di stabilire il comportamento delle scorciatoie su <ph name="PRODUCT_OS_NAME" />.
 
-Se questo criterio non viene configurato o se viene impostato su <ph name="NORMAL_SYSTEM_PRIORITY" />, tutte le scorciatoie di sistema <ph name="PRODUCT_OS_NAME" /> si attiveranno sempre come previsto.
+Se questa policy non viene configurata o se viene impostata su <ph name="NORMAL_SYSTEM_PRIORITY" />, tutte le scorciatoie di sistema <ph name="PRODUCT_OS_NAME" /> si attiveranno sempre come previsto.
 
-Se viene impostato su <ph name="SHOULD_IGNORE_COMMON_VDI_SHORTCUTS" />, un elenco predeterminato di scorciatoie da tastiera del tasto Avvio app non attiverà mai una scorciatoia.
+Se viene impostata su <ph name="SHOULD_IGNORE_COMMON_VDI_SHORTCUTS" />, un elenco predeterminato di scorciatoie da tastiera del tasto Avvio app non attiverà mai una scorciatoia.
 
-Se viene impostato su <ph name="SHOULD_IGNORE_COMMON_VDI_SHORTCUTS_FULLSCREEN_ONLY" />, un elenco predeterminato di scorciatoie da tastiera del tasto Avvio app non attiverà mai una scorciatoia quando un'app è in modalità a schermo intero.
+Se viene impostata su <ph name="SHOULD_IGNORE_COMMON_VDI_SHORTCUTS_FULLSCREEN_ONLY" />, un elenco predeterminato di scorciatoie da tastiera del tasto Avvio app non attiverà mai una scorciatoia quando un'app è in modalità a schermo intero.
 
-Se questo criterio viene impostato su <ph name="ALLOW_PASSTHROUGH_OF_SEARCH_BASED_SHORTCUTS" />, le scorciatoie con il tasto Ricerca vengono trasferite alle app e non vengono utilizzate dal sistema operativo.
+Se questa policy viene impostata su <ph name="ALLOW_PASSTHROUGH_OF_SEARCH_BASED_SHORTCUTS" />, le scorciatoie con il tasto Ricerca vengono trasferite alle app e non vengono utilizzate dal sistema operativo.
 
-Se questo criterio viene impostato su <ph name="ALLOW_PASSTHROUGH_OF_SEARCH_BASED_SHORTCUTS_FULLSCREEN_ONLY" />, le scorciatoie con il tasto di ricerca vengono trasferite alle app e non vengono utilizzate dal sistema operativo, ma solo quando l'app attiva è a schermo intero.</translation>
+Se questa policy viene impostata su <ph name="ALLOW_PASSTHROUGH_OF_SEARCH_BASED_SHORTCUTS_FULLSCREEN_ONLY" />, le scorciatoie con il tasto di ricerca vengono trasferite alle app e non vengono utilizzate dal sistema operativo, ma solo quando l'app attiva è a schermo intero.</translation>
 <translation id="4906194810004762807">Frequenza di aggiornamento per norma dispositivo</translation>
-<translation id="49093841899738146">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> può raccogliere log eventi WebRTC dai servizi Google, come Hangouts Meet, e caricarli su Google. Questi log hanno informazioni diagnostiche utili per il debug dei problemi relativi a riunioni audio e video in <ph name="PRODUCT_NAME" />, ad esempio data/ora e dimensioni dei pacchetti RTP, feedback sulla congestione della rete, nonché metadati su durata e qualità dei frame audio e video. Questi log non contengono l'audio o i video delle riunioni. Google potrebbe associare questi log tramite un ID sessione ad altri log raccolti dal servizio Google stesso al fine di semplificare il debug.
+<translation id="49093841899738146">Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> può raccogliere log eventi WebRTC dai servizi Google, come Hangouts Meet, e caricarli su Google. Questi log hanno informazioni diagnostiche utili per il debug dei problemi relativi a riunioni audio e video in <ph name="PRODUCT_NAME" />, ad esempio data/ora e dimensioni dei pacchetti RTP, feedback sulla congestione della rete, nonché metadati su durata e qualità dei frame audio e video. Questi log non contengono l'audio o i video delle riunioni. Google potrebbe associare questi log tramite un ID sessione ad altri log raccolti dal servizio Google stesso al fine di semplificare il debug.
 
-      Se il criterio viene impostato su Disattivato, tali log non vengono raccolti né caricati.
+      Se la policy viene impostata su Disattivata, tali log non vengono raccolti né caricati.
 
-      Se il criterio non viene impostato su versioni fino alla M76 inclusa, per impostazione predefinita <ph name="PRODUCT_NAME" /> non può raccogliere e caricare questi log. A partire dalla versione M77, per impostazione predefinita <ph name="PRODUCT_NAME" /> può raccogliere e caricare questi log dalla maggior parte dei profili interessati dai criteri aziendali a livello di utente basati su cloud. Dalla versione M77 fino alla M80 inclusa, <ph name="PRODUCT_NAME" /> può anche raccogliere e caricare questi log per impostazione predefinita dai profili soggetti alla gestione on-premise di <ph name="PRODUCT_NAME" />.</translation>
+      Se la policy non viene impostata su versioni fino alla M76 inclusa, per impostazione predefinita <ph name="PRODUCT_NAME" /> non può raccogliere e caricare questi log. A partire dalla versione M77, per impostazione predefinita <ph name="PRODUCT_NAME" /> può raccogliere e caricare questi log dalla maggior parte dei profili interessati dalle policy aziendali a livello di utente basati su cloud. Dalla versione M77 fino alla M80 inclusa, <ph name="PRODUCT_NAME" /> può anche raccogliere e caricare questi log per impostazione predefinita dai profili soggetti alla gestione on-premise di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="4911334289324462969">porta 989 (può essere sbloccata fino al 01/02/2022)</translation>
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4918150584200819898">Attiva l'avvio automatico della riautenticazione online.</translation>
 <translation id="4918261735182294270">Consenti agli utenti di scegliere se attivare <ph name="CHROME_SYNC_NAME" /></translation>
 <translation id="491889618361437456">Attiva integrazione di <ph name="GOOGLE_CALENDAR_NAME" /></translation>
 <translation id="4919122295221518724">Attiva trattamento più restrittivo per i contenuti misti</translation>
-<translation id="4921553515199936667">Se questo criterio non viene configurato o se viene impostato su true, la decodifica video verrà eseguita con accelerazione hardware, se disponibile.
+<translation id="4921553515199936667">Se questa policy non viene configurata o se viene impostata su true, la decodifica video verrà eseguita con accelerazione hardware, se disponibile.
 
-Se il criterio viene impostato su false, la decodifica video non verrà mai eseguita con accelerazione hardware.
+Se la policy viene impostata su false, la decodifica video non verrà mai eseguita con accelerazione hardware.
 
 La disattivazione della decodifica video con accelerazione hardware non è consigliata poiché determina un carico maggiore sulla CPU che, a sua volta, incide negativamente sulle prestazioni del dispositivo e sul consumo della batteria.</translation>
 <translation id="4922136799178503494">Blocca condivisioni file di rete</translation>
 <translation id="4923806312383904642">Consenti a WebDriver di eseguire l'override delle norme non compatibili</translation>
 <translation id="4924377847308623325">Sono vietati tipi di query DNS aggiuntivi</translation>
 <translation id="492685741837024549">Forza la possibilità di eseguire Native Client (NaCl).</translation>
-<translation id="4927214690104703256">La configurazione del criterio consente di specificare le estensioni consentite per utilizzare le funzioni di <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> per l'attestazione da remoto. Per utilizzare l'API, le estensioni devono essere presenti in questo elenco.
+<translation id="4927214690104703256">La configurazione della policy consente di specificare le estensioni consentite per utilizzare le funzioni di <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> per l'attestazione da remoto. Per utilizzare l'API, le estensioni devono essere presenti in questo elenco.
 
       Se un'estensione non è presente nell'elenco o se l'elenco non viene configurato, la chiamata all'API non va a buon fine e viene generato un codice di errore.</translation>
 <translation id="4927563541997547">Per impostazione predefinita, la tastiera virtuale ridimensiona l'area visibile del layout</translation>
-<translation id="4927797103413916381">Se il criterio <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> non viene disattivato, l'impostazione di <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> su Attivato o la mancata configurazione impedisce ai siti con esperienze intrusive di aprirsi in nuove schede o finestre.
+<translation id="4927797103413916381">Se la policy <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> non viene disattivata, l'impostazione di <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> su Attivata o la mancata configurazione impedisce ai siti con esperienze intrusive di aprirsi in nuove schede o finestre.
 
-       Se il criterio <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> o <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> viene impostato su Disattivato, i siti con esperienze intrusive possono aprirsi in nuove schede o finestre.</translation>
+       Se la policy <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> o <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> viene impostata su Disattivata, i siti con esperienze intrusive possono aprirsi in nuove schede o finestre.</translation>
 <translation id="4929721861648439998">Consente di attivare la funzione di accessibilità di audio in formato mono nella schermata di accesso.
 
           Questa funzione consente di cambiare la modalità del dispositivo dall'audio in formato stereo predefinito all'audio in formato mono.
 
-          Se questo criterio è impostato su true, l'audio in formato mono sarà sempre attivato nella schermata di accesso.
+          Se questa policy è impostata su true, l'audio in formato mono sarà sempre attivato nella schermata di accesso.
 
-          Se questo criterio è impostato su false, l'audio in formato mono sarà sempre disattivato nella schermata di accesso.
+          Se questa policy è impostata su false, l'audio in formato mono sarà sempre disattivato nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'audio in formato mono è disattivato nella schermata di accesso, ma l'utente può attivarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'audio in formato mono è disattivato nella schermata di accesso, ma l'utente può attivarlo in qualsiasi momento.</translation>
 <translation id="4933301190614090397">Consente di controllare la durata (in secondi) consentita per le richieste keepalive alla chiusura del browser.
 
       Se specificato, è possibile bloccare la chiusura del browser per un massimo di secondi specificati
       al fine di elaborare le richieste keepalive (https://fetch.spec.whatwg.org/#request-keepalive-flag).
 
       Il valore predefinito (0) significa che questa funzionalità è disattivata.</translation>
-<translation id="4933339133618140916">Se il criterio viene impostato su true o se non viene configurato, <ph name="PRODUCT_NAME" /> mostra agli utenti i contenuti promozionali dei prodotti.
+<translation id="4933339133618140916">Se la policy viene impostata su true o se non viene configurata, <ph name="PRODUCT_NAME" /> mostra agli utenti i contenuti promozionali dei prodotti.
 
-Se il criterio viene impostato su false, <ph name="PRODUCT_NAME" /> non può mostrare i contenuti promozionali dei prodotti.
+Se la policy viene impostata su false, <ph name="PRODUCT_NAME" /> non può mostrare i contenuti promozionali dei prodotti.
 
-La configurazione del criterio consente di controllare la presentazione dei contenuti promozionali, tra cui le pagine di benvenuto, che aiutano gli utenti ad accedere a <ph name="PRODUCT_NAME" />, di impostare <ph name="PRODUCT_NAME" /> come browser predefinito degli utenti oppure di fornire informazioni sulle caratteristiche del prodotto.</translation>
+La configurazione della policy consente di controllare la presentazione dei contenuti promozionali, tra cui le pagine di benvenuto, che aiutano gli utenti ad accedere a <ph name="PRODUCT_NAME" />, di impostare <ph name="PRODUCT_NAME" /> come browser predefinito degli utenti oppure di fornire informazioni sulle caratteristiche del prodotto.</translation>
 <translation id="4933780993367313536">Consenti le connessioni di accesso remoto da parte degli amministratori aziendali a questo computer</translation>
 <translation id="4937423591320233496">Disattiva i contenuti suggeriti</translation>
 <translation id="4942096314850617489">Disattiva l'attestazione da remoto per l'utente</translation>
-<translation id="4942681160308347946">Se il criterio è impostato su True, la funzione di lettura vocale viene attivata nella schermata di accesso. Se il criterio è impostato su False, la funzione di lettura vocale viene disattivata nella schermata.
+<translation id="4942681160308347946">Se la policy è impostata su True, la funzione di lettura vocale viene attivata nella schermata di accesso. Se la policy è impostata su False, la funzione di lettura vocale viene disattivata nella schermata.
 
-      Se imposti il criterio, gli utenti possono attivare o disattivare temporaneamente la funzione di lettura vocale. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, viene ripristinato lo stato originale della funzione.
+      Se imposti la policy, gli utenti possono attivare o disattivare temporaneamente la funzione di lettura vocale. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, viene ripristinato lo stato originale della funzione.
 
-      Se il criterio non è impostato, la funzione di lettura vocale risulta disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
+      Se la policy non è impostata, la funzione di lettura vocale risulta disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
 
-          Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_SPOKEN_FEEDBACK_ENABLED_POLICY_NAME" /> sostituisce questo criterio.</translation>
+          Nota: se specificata, <ph name="DEVICE_LOGIN_SCREEN_SPOKEN_FEEDBACK_ENABLED_POLICY_NAME" /> sostituisce questa policy.</translation>
 <translation id="4945419595339133946">Consente di specificare se le informazioni di sistema (ad es. la versione di ChromeOS, il numero di serie
       del dispositivo) debbano essere sempre mostrate (o nascoste) nella schermata di accesso.
 
-      Se il criterio viene impostato su true, le informazioni di sistema vengono visualizzate forzatamente.
-      Se il criterio viene impostato su false, le informazioni di sistema vengono nascoste forzatamente.
-      Se il criterio non viene configurato, ha validità il comportamento predefinito (visualizzato per Canary/canale
+      Se la policy viene impostata su true, le informazioni di sistema vengono visualizzate forzatamente.
+      Se la policy viene impostata su false, le informazioni di sistema vengono nascoste forzatamente.
+      Se la policy non viene configurata, ha validità il comportamento predefinito (visualizzato per Canary/canale
       Dev). Gli utenti possono attivare/disattivare la visibilità tramite operazioni specifiche (ad es. Alt + V).</translation>
-<translation id="4946124666877421935">La configurazione di questo criterio consente di specificare un elenco di app web installate automaticamente, senza interazione dell'utente, e che non possono essere disinstallate o disattivate dagli utenti.
+<translation id="4946124666877421935">La configurazione di questa policy consente di specificare un elenco di app web installate automaticamente, senza interazione dell'utente, e che non possono essere disinstallate o disattivate dagli utenti.
 
-      Ogni voce del criterio è un oggetto con un componente obbligatorio:
+      Ogni voce della policy è un oggetto con un componente obbligatorio:
       <ph name="URL_LABEL" /> (l'URL dell'app web da installare)
 
       e 6 componenti facoltativi:
@@ -5375,26 +5375,26 @@
       - <ph name="CUSTOM_ICON_LABEL" /> (a partire dalla versione 99 di <ph name="PRODUCT_OS_NAME" /> e dalla versione 112 su tutti gli altri sistemi operativi desktop, consente di sostituire l'icona delle app installate. Le icone devono essere quadrate, avere dimensioni massime pari a 1 MB ed essere in uno dei seguenti formati: jpeg, png, gif, webp, ico.
       Il valore hash deve essere l'hash SHA256 del file dell'icona. L'URL <ph name="URL_LABEL" /> deve essere accessibile senza autenticazione per garantire che l'icona possa essere utilizzata al momento dell'installazione dell'app.)
 
-      - <ph name="INSTALL_AS_SHORTCUT_LABEL" /> (a partire dalla versione 107 di <ph name="PRODUCT_NAME" />). Se il criterio viene attivato, l'<ph name="URL_LABEL" /> specificato verrà installato come scorciatoia, come se l'azione fosse stata compiuta tramite l'opzione "Crea scorciatoia…" nell'interfaccia utente del browser desktop.
+      - <ph name="INSTALL_AS_SHORTCUT_LABEL" /> (a partire dalla versione 107 di <ph name="PRODUCT_NAME" />). Se la policy viene attivata, l'<ph name="URL_LABEL" /> specificato verrà installato come scorciatoia, come se l'azione fosse stata compiuta tramite l'opzione "Crea scorciatoia…" nell'interfaccia utente del browser desktop.
       Tieni presente che se viene installato come scorciatoia, non verrà aggiornato se il file manifest in <ph name="URL_LABEL" /> cambia.
-      Se il criterio viene disattivato o se non viene configurato, l'app web all'<ph name="URL_LABEL" /> specificato verrà installata normalmente.
+      Se la policy viene disattivata o se non viene configurata, l'app web all'<ph name="URL_LABEL" /> specificato verrà installata normalmente.
 
-      Vedi il criterio <ph name="PINNED_LAUNCHER_APPS_POLICY_NAME" /> per bloccare app nella barra delle app di <ph name="PRODUCT_OS_NAME" />.</translation>
+      Vedi la policy <ph name="PINNED_LAUNCHER_APPS_POLICY_NAME" /> per bloccare app nella barra delle app di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="494613465159630803">Cast Receiver</translation>
 <translation id="494924690085329212">Riavvia all'uscita dell'utente se Android è stato avviato.</translation>
 <translation id="4950447493143157880">Non utilizzare mai il client DNS integrato</translation>
-<translation id="4954185885991137927">Se il criterio viene impostato su Attivato, i rapporti estesi su Navigazione sicura di <ph name="PRODUCT_NAME" /> vengono attivati, il che comporta l'invio di alcune informazioni di sistema e di contenuti di pagina ai server Google per contribuire a rilevare app e siti pericolosi.
+<translation id="4954185885991137927">Se la policy viene impostata su Attivata, i rapporti estesi su Navigazione sicura di <ph name="PRODUCT_NAME" /> vengono attivati, il che comporta l'invio di alcune informazioni di sistema e di contenuti di pagina ai server Google per contribuire a rilevare app e siti pericolosi.
 
-      Se il criterio viene impostato su Disattivato, i rapporti non vengono mai inviati.
+      Se la policy viene impostata su Disattivata, i rapporti non vengono mai inviati.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo. Se non viene configurato, gli utenti possono decidere se inviare o meno i rapporti.
+      Se la policy viene configurata, gli utenti non possono modificarla. Se non viene configurata, gli utenti possono decidere se inviare o meno i rapporti.
 
       Ulteriori informazioni su Navigazione sicura (https://developers.google.com/safe-browsing).</translation>
 <translation id="4954352279763128540">Consente di aggiungere un dominio precompilato alla finestra di dialogo dell'autenticazione Kerberos.
 
-          Se questo criterio viene impostato, nel campo "Nome utente di Kerberos", a destra, viene visualizzato il dominio precompilato. Se l'utente inserisce il proprio nome utente, questo verrà concatenato con il dominio precompilato. Se il valore inserito dall'utente contiene "@", il dominio precompilato non viene visualizzato e non influisce sul valore.
+          Se questa policy viene impostata, nel campo "Nome utente di Kerberos", a destra, viene visualizzato il dominio precompilato. Se l'utente inserisce il proprio nome utente, questo verrà concatenato con il dominio precompilato. Se il valore inserito dall'utente contiene "@", il dominio precompilato non viene visualizzato e non influisce sul valore.
 
-          Se questo criterio non viene impostato, non vengono mostrate informazioni aggiuntive e la creazione del ticket funziona come di consueto.</translation>
+          Se questa policy non viene impostata, non vengono mostrate informazioni aggiuntive e la creazione del ticket funziona come di consueto.</translation>
 <translation id="4958911425563967203">Consente di impostare un elenco di pattern URL per i siti che specifica i siti per i quali
 le ottimizzazioni JavaScript avanzate sono attivate.
 
@@ -5402,20 +5402,20 @@
 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
 I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-Le eccezioni relative ai criteri di ottimizzazione di JavaScript verranno applicate soltanto sito
-per sito (eTLD+1). Un criterio impostato soltanto per sottodominio.sito.com non verrà
-applicato correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti
-allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcun criterio. In questo caso, il criterio
-deve essere impostato per sito.com per essere applicato correttamente sia a sito.com sia a sottodominio.sito.com.
+Le eccezioni relative alle policy di ottimizzazione di JavaScript verranno applicate soltanto sito
+per sito (eTLD+1). Una policy impostata soltanto per sottodominio.sito.com non verrà
+applicata correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti
+allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcuna policy. In questo caso, la policy
+deve essere impostata per sito.com per essere applicata correttamente sia a sito.com sia a sottodominio.sito.com.
 
-Questo criterio viene applicato frame per frame e non si basa esclusivamente
-sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco del criterio <ph name="JAVA_SCRIPT_OPTIMIZER_ALLOWED_FOR_SITES_POLICY_NAME" />, ma carica un frame
+Questa policy viene applicata frame per frame e non si basa esclusivamente
+sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco della policy <ph name="JAVA_SCRIPT_OPTIMIZER_ALLOWED_FOR_SITES_POLICY_NAME" />, ma carica un frame
 che contiene sito-due.com, sito-uno.com avrà disattivato le ottimizzazioni di JavaScript,
-ma sito-due.com utilizzerà il criterio di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" />, se configurato, o le ottimizzazioni di JavaScript
+ma sito-due.com utilizzerà la policy di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" />, se configurato, o le ottimizzazioni di JavaScript
 saranno attivate per impostazione predefinita. Le voci della lista bloccata hanno una priorità maggiore rispetto alle voci della lista consentita,
 che a loro volta hanno la priorità sul valore predefinito configurato.
 
-Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti
+Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_JAVA_SCRIPT_OPTIMIZER_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti
 l'ottimizzazione di JavaScript viene attivata per il sito.</translation>
 <translation id="4960597185231686653">Un flag booleano che indica se la tastiera sullo schermo può offrire la funzionalità di input vocale.</translation>
 <translation id="4970046075219007744">Consenti alle app web di richiedere all'utente l'accesso ai tipi di file tramite l'API File Handling</translation>
@@ -5423,25 +5423,25 @@
 <translation id="4974091268178043378">Modalità colore di ChromeOS</translation>
 <translation id="4976825008579439428">Non consentire la funzionalità di ricerca nella cronologia basata sull'AI.</translation>
 <translation id="4978533099939732984">Mostra sempre gli avvisi relativi allo spazio su disco in esaurimento</translation>
-<translation id="4979614740553442831">Questo criterio controlla la disponibilità dell'integrazione di Lens nell'app Galleria su <ph name="PRODUCT_OS_NAME" />.
+<translation id="4979614740553442831">Questa policy controlla la disponibilità dell'integrazione di Lens nell'app Galleria su <ph name="PRODUCT_OS_NAME" />.
 
-Se il criterio viene attivato o se non viene configurato, gli utenti possono usare Lens per cercare selezioni di contenuti multimediali che stanno visualizzando nell'app Galleria.
-La disattivazione del criterio disattiva anche la funzionalità.</translation>
-<translation id="4979714585847741269">Se il criterio viene impostato su Attivato, un'app web kiosk può aprire un'altra finestra del browser che può essere posizionata sulla stessa schermata o su un'altra. Per aprire una nuova finestra, l'app web deve chiamare la funzione JavaScript di <ph name="OPEN_NEW_WINDOW_JS" />.
+Se la policy viene attivata o se non viene configurata, gli utenti possono usare Lens per cercare selezioni di contenuti multimediali che stanno visualizzando nell'app Galleria.
+La disattivazione della policy disattiva anche la funzionalità.</translation>
+<translation id="4979714585847741269">Se la policy viene impostata su Attivata, un'app web kiosk può aprire un'altra finestra del browser che può essere posizionata sulla stessa schermata o su un'altra. Per aprire una nuova finestra, l'app web deve chiamare la funzione JavaScript di <ph name="OPEN_NEW_WINDOW_JS" />.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, un'app web kiosk può usare solo la finestra principale del browser e non può aprire una nuova finestra. Le chiamate a qualsiasi funzione JavaScript per l'apertura di una nuova finestra verranno ignorate.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, un'app web kiosk può usare solo la finestra principale del browser e non può aprire una nuova finestra. Le chiamate a qualsiasi funzione JavaScript per l'apertura di una nuova finestra verranno ignorate.</translation>
 <translation id="4980635395568992380">Tipo di dati:</translation>
 <translation id="4981523774025330439">Certificati TLS che non sono considerati attendibili né non attendibili, ma che possono essere utilizzati nella creazione di percorsi per l'autenticazione del server</translation>
 <translation id="4981831669478419057">La funzionalità della lista della spesa non sarà a disposizione degli utenti.</translation>
 <translation id="4983201894483989687">Consenti esecuzione dei plug-in obsoleti</translation>
 <translation id="4986560318567565414">Percorso a Chrome per cambiare il browser alternativo.</translation>
-<translation id="4987813583395474995">Se viene impostato su Attivato, l'API U2F Security Key deprecata può essere usata e il promemoria sul ritiro mostrato per le richieste API U2F viene soppresso.
+<translation id="4987813583395474995">Se viene impostata su Attivata, l'API U2F Security Key deprecata può essere usata e il promemoria sul ritiro mostrato per le richieste API U2F viene soppresso.
 
-      Se viene impostato su Disattivato o se non viene configurato, viene applicato il comportamento predefinito.
+      Se viene impostata su Disattivata o se non viene configurata, viene applicato il comportamento predefinito.
 
       L'API U2F Security Key è deprecata e verrà disattivata per impostazione predefinita in Chrome 98.
 
-      Si tratta di un meccanismo di disattivazione temporaneo. L'API U2F verrà rimossa da Chrome in Chrome 104 e a questo punto il criterio non sarà più supportato.
+      Si tratta di un meccanismo di disattivazione temporaneo. L'API U2F verrà rimossa da Chrome in Chrome 104 e a questo punto la policy non sarà più supportata.
 
       Per maggiori informazioni sul ritiro dell'API U2F Security Key, fai riferimento alla pagina https://groups.google.com/a/chromium.org/g/blink-dev/c/xHC3AtU_65A.</translation>
 <translation id="4988291787868618635">Azione da compiere a raggiungimento ritardo inattività</translation>
@@ -5454,19 +5454,19 @@
 <translation id="4997074784107449343">L'opzione Stampa come immagine non viene impostata per impostazione predefinita per le anteprime di stampa dei documenti PDF quando disponibile.</translation>
 <translation id="500149597848135831">Attiva tutte le varianti</translation>
 <translation id="5006222080181284191">Controlla l'attivazione della funzionalità "Aiutami a scrivere" di ChromeOS</translation>
-<translation id="5017157692744444035">Questo criterio consente di stabilire se segnalare o meno le informazioni che possono essere utilizzate per identificare le macchine, come il nome della macchina e gli indirizzi di rete.
+<translation id="5017157692744444035">Questa policy consente di stabilire se segnalare o meno le informazioni che possono essere utilizzate per identificare le macchine, come il nome della macchina e gli indirizzi di rete.
 
-Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, verrà ignorato.
+Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, verrà ignorata.
 
-Se il criterio non viene configurato o viene impostato su True, le informazioni che possono essere utilizzate per identificare le macchine vengono raccolte.
-Se il criterio viene impostato su False, le informazioni che possono essere utilizzate per identificare le macchine non vengono raccolte.
+Se la policy non viene configurata o viene impostata su True, le informazioni che possono essere utilizzate per identificare le macchine vengono raccolte.
+Se la policy viene impostata su False, le informazioni che possono essere utilizzate per identificare le macchine non vengono raccolte.
 
-Questo criterio viene applicato soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.</translation>
-<translation id="5017369989680827157">Se il criterio è impostato su True o se non viene configurato, gli utenti possono controllare la compilazione automatica per gli indirizzi nella UI.
+Questa policy viene applicata soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.</translation>
+<translation id="5017369989680827157">Se la policy è impostata su True o se non viene configurata, gli utenti possono controllare la compilazione automatica per gli indirizzi nella UI.
 
-      Se il criterio è impostato su False, la compilazione automatica non fornisce mai suggerimenti né compila le informazioni relative agli indirizzi, né salva le nuove informazioni inviate dagli utenti durante la navigazione sul Web.</translation>
+      Se la policy è impostata su False, la compilazione automatica non fornisce mai suggerimenti né compila le informazioni relative agli indirizzi, né salva le nuove informazioni inviate dagli utenti durante la navigazione sul web.</translation>
 <translation id="5017691827598069017">Attiva la funzionalità Accoppiamento rapido (accoppiamento rapido tramite Bluetooth)</translation>
-<translation id="5021550478471824215">La configurazione del criterio consente di specificare un elenco di condivisioni file di rete preimpostate. Ogni elemento ha un oggetto con 2 proprietà: <ph name="SHARE_URL_FIELD_NAME" /> e <ph name="MODE_FIELD_NAME" />.
+<translation id="5021550478471824215">La configurazione della policy consente di specificare un elenco di condivisioni file di rete preimpostate. Ogni elemento ha un oggetto con 2 proprietà: <ph name="SHARE_URL_FIELD_NAME" /> e <ph name="MODE_FIELD_NAME" />.
 
       L'URL condivisione deve essere <ph name="SHARE_URL_FIELD_NAME" />.
 
@@ -5475,9 +5475,9 @@
       * <ph name="MODE_ENUM_DROP_DOWN" /> indica che il campo <ph name="SHARE_URL_FIELD_NAME" /> verrà aggiunto all'elenco di rilevamento delle condivisioni.
 
       * <ph name="MODE_ENUM_PRE_MOUNT" /> indica che il campo <ph name="SHARE_URL_FIELD_NAME" /> verrà montato.</translation>
-<translation id="5025239932007658691">Se il criterio viene impostato su Attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> invia query occasionali a un server di Google per recuperare un timestamp accurato.
+<translation id="5025239932007658691">Se la policy viene impostata su Attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> invia query occasionali a un server di Google per recuperare un timestamp accurato.
 
-      Se viene impostato su Disattivato, <ph name="PRODUCT_NAME" /> smette di inviare queste query.</translation>
+      Se viene impostata su Disattivata, <ph name="PRODUCT_NAME" /> smette di inviare queste query.</translation>
 <translation id="5028273030085046969">Presentazioni Google (supportato a partire dalla versione 135)</translation>
 <translation id="5030415914668947893">Consenti la raccolta di metriche con chiave URL</translation>
 <translation id="5033070732967197381">Consenti le richieste API WebAuthn su siti con certificati TLS inaccessibili.</translation>
@@ -5501,7 +5501,7 @@
 <translation id="5041315457555330432">Consenti a <ph name="PRODUCT_NAME" /> di connettersi solo a dispositivi su indirizzi IP privati, a meno che la funzionalità CastAllowAllIPs non sia attiva.</translation>
 <translation id="504689994545234073">Attiva l'archiviazione locale dei file degli utenti</translation>
 <translation id="5048890362473520096">Attiva sandbox LPAC per i servizi di stampa</translation>
-<translation id="5055474681190962362">Il giorno del mese [1-31] in cui dovrebbe essere eseguito il riavvio, nel fuso orario locale del dispositivo. Questo criterio viene usato soltanto se il valore del criterio "frequency" è "MONTHLY". Se questo numero supera il numero di giorni massimo presente in un mese specifico, verrà scelto l'ultimo giorno del mese.</translation>
+<translation id="5055474681190962362">Il giorno del mese [1-31] in cui dovrebbe essere eseguito il riavvio, nel fuso orario locale del dispositivo. Questa policy viene usata soltanto se il valore della policy "frequency" è "MONTHLY". Se questo numero supera il numero di giorni massimo presente in un mese specifico, verrà scelto l'ultimo giorno del mese.</translation>
 <translation id="5055513974503523022">Sfondo AI generativa per videoconferenze consente agli utenti di esprimersi utilizzando le funzionalità di AI generativa per creare sfondi personalizzati per le videoconferenze su <ph name="PRODUCT_OS_NAME" />.
 
 0 = Consente di utilizzare la funzionalità e permette al contempo a Google di utilizzare i dati pertinenti per migliorare i propri modelli di AI. A seconda della funzionalità, tra i dati pertinenti sono inclusi prompt, input, output, materiali originali e feedback scritto. Potrebbero anche essere esaminati da persone per migliorare i modelli di AI. 0 è il valore predefinito, ad eccezione dei casi riportati di seguito.
@@ -5516,23 +5516,23 @@
 <translation id="5056708224511062314">Ingrandimento dello schermo disattivato</translation>
 <translation id="5058573563327660283">Seleziona la strategia da utilizzare per liberare spazio su disco durante la pulizia automatica (obsoleta)</translation>
 <translation id="5060285390484464499">Consenti a ServiceWorker di controllare gli iframe srcdoc</translation>
-<translation id="5061114193960158745">Questo criterio consente di stabilire l'elenco di siti web che non causeranno mai un cambio di browser. Ogni elemento è considerato come una regola. Le regole con una corrispondenza non aprono un browser alternativo. A differenza del criterio <ph name="URL_LIST_POLICY_NAME" />, le regole vengono applicate in entrambe le direzioni. Quando il componente aggiuntivo <ph name="IE_PRODUCT_NAME" /> è attivo, il criterio consente di stabilire anche se <ph name="IE_PRODUCT_NAME" /> deve aprire questi URL in <ph name="PRODUCT_NAME" />.
+<translation id="5061114193960158745">Questa policy consente di stabilire l'elenco di siti web che non causeranno mai un cambio di browser. Ogni elemento è considerato come una regola. Le regole con una corrispondenza non aprono un browser alternativo. A differenza della policy <ph name="URL_LIST_POLICY_NAME" />, le regole vengono applicate in entrambe le direzioni. Quando il componente aggiuntivo <ph name="IE_PRODUCT_NAME" /> è attivo, la policy consente di stabilire anche se <ph name="IE_PRODUCT_NAME" /> deve aprire questi URL in <ph name="PRODUCT_NAME" />.
 
-      Se il criterio non viene impostato, non viene aggiunto alcun sito web all'elenco.
+      Se la policy non viene impostata, non viene aggiunto alcun sito web all'elenco.
 
-      Nota: puoi aggiungere elementi all'elenco anche tramite il criterio <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
+      Nota: puoi aggiungere elementi all'elenco anche tramite la policy <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="5063480226653192405">Utilizzo</translation>
 <translation id="5067143124345820993">Whitelist di utenti con accesso</translation>
 <translation id="50689955292091946">Attiva la tastiera virtuale di accessibilità nella schermata di accesso</translation>
 <translation id="5069522005630249098">Questa impostazione consente di stabilire la quantità di dati utente da conservare dopo la disattivazione di <ph name="LACROS_NAME" />.
 
-      Se il criterio viene impostato su <ph name="LACROS_BACKWARD_MIGRATION_NONE" /> o se non viene configurato, la migrazione dei dati a ritroso non viene eseguita.
+      Se la policy viene impostata su <ph name="LACROS_BACKWARD_MIGRATION_NONE" /> o se non viene configurata, la migrazione dei dati a ritroso non viene eseguita.
 
-      Se il criterio viene impostato su <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" />, tutti i dati utente vengono rimossi. Questa è l'opzione più sicura.
+      Se la policy viene impostata su <ph name="LACROS_BACKWARD_MIGRATION_KEEP_NONE" />, tutti i dati utente vengono rimossi. Questa è l'opzione più sicura.
 
-      Se il criterio viene impostato su <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />, la maggior parte dei dati utente viene rimossa. Vengono conservati solo i file indipendenti dal browser (come i download).
+      Se la policy viene impostata su <ph name="LACROS_BACKWARD_MIGRATION_KEEP_SAFE_DATA" />, la maggior parte dei dati utente viene rimossa. Vengono conservati solo i file indipendenti dal browser (come i download).
 
-      Se il criterio viene impostato su <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />, tutti i dati utente vengono conservati. Questa opzione presenta un rischio elevato di errore e richiede il Powerwash per il ripristino.</translation>
+      Se la policy viene impostata su <ph name="LACROS_BACKWARD_MIGRATION_KEEP_ALL" />, tutti i dati utente vengono conservati. Questa opzione presenta un rischio elevato di errore e richiede il Powerwash per il ripristino.</translation>
 <translation id="507032775281485106">Sfondo AI generativa consente agli utenti di esprimersi utilizzando le funzionalità di AI generativa per creare sfondi personalizzati su <ph name="PRODUCT_OS_NAME" />.
 
 0 = Consente di utilizzare la funzionalità e permette al contempo a Google di utilizzare i dati pertinenti per migliorare i propri modelli di AI. A seconda della funzionalità, tra i dati pertinenti sono inclusi prompt, input, output, materiali originali e feedback scritto. Potrebbero anche essere esaminati da persone per migliorare i modelli di AI. 0 è il valore predefinito, ad eccezione dei casi riportati di seguito.
@@ -5545,16 +5545,16 @@
 
 Per ulteriori informazioni sulla gestione dei dati per le funzionalità di AI generativa, visita la pagina https://support.google.com/chrome/a?p=generative_ai_settings.</translation>
 <translation id="5071303485174858500">Viene disattivata la sessione Ospite gestita limitata.</translation>
-<translation id="5073609397321802133">Se il criterio viene impostato su false, gli utenti non possono personalizzare lo sfondo della pagina Nuova scheda. L'eventuale sfondo personalizzato esistente viene rimosso definitivamente anche se il criterio viene impostato su true in un secondo momento.
+<translation id="5073609397321802133">Se la policy viene impostata su false, gli utenti non possono personalizzare lo sfondo della pagina Nuova scheda. L'eventuale sfondo personalizzato esistente viene rimosso definitivamente anche se la policy viene impostata su true in un secondo momento.
 
-      Se il criterio viene impostato su true o non viene impostato, gli utenti possono personalizzare lo sfondo della pagina Nuova scheda.</translation>
-<translation id="5073788301065423829">Questo criterio attiva o disattiva la funzionalità "Aiutami a scrivere" per ChromeOS.
+      Se la policy viene impostata su true o non viene impostata, gli utenti possono personalizzare lo sfondo della pagina Nuova scheda.</translation>
+<translation id="5073788301065423829">Questa policy attiva o disattiva la funzionalità "Aiutami a scrivere" per ChromeOS.
 
-Se viene attivato, la funzionalità "Aiutami a scrivere" verrà attivata.
+Se viene attivata, la funzionalità "Aiutami a scrivere" verrà attivata.
 
-Se viene disattivato, la funzionalità "Aiutami a scrivere" verrà disattivata.
+Se viene disattivata, la funzionalità "Aiutami a scrivere" verrà disattivata.
 
-Se non viene configurato, la funzionalità "Aiutami a scrivere" verrà attivata sui dispositivi non gestiti e verrà disattivata per i dispositivi gestiti dall'azienda.</translation>
+Se non viene configurata, la funzionalità "Aiutami a scrivere" verrà attivata sui dispositivi non gestiti e verrà disattivata per i dispositivi gestiti dall'azienda.</translation>
 <translation id="5076953589932162038">Impostazioni First-Party Sets</translation>
 <translation id="5078623750797048009">Attiva annotazioni PDF</translation>
 <translation id="5080300140183363718">Impostazioni di migrazione dei dati di separazione dei profili</translation>
@@ -5562,26 +5562,26 @@
 <translation id="5082296146261894974">Consente agli utenti di fare clic sulla notifica di Phone Hub per avviare l'applicazione Eche.</translation>
 <translation id="5082572440690475059">Consenti l'accesso di lettura tramite l'API file system su questi siti</translation>
 <translation id="5085647276663819155">Disattiva anteprima di stampa</translation>
-<translation id="5087932158260897375">Se questo criterio viene impostato su false, la segnalazione di dati diagnostici relativi all'attendibilità dei domini viene disattivata e non vengono inviati dati a Google.
-Se questo criterio viene impostato su true o se non viene configurato, la segnalazione di dati diagnostici relativi all'attendibilità dei domini ha lo stesso comportamento di MetricsReportingEnabled per <ph name="PRODUCT_NAME" /> o DeviceMetricsReportingEnabled per <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="5088284418186527880">Questo criterio consente di garantire la conformità alla specifica adottata di recente per lo zoom CSS.
+<translation id="5087932158260897375">Se questa policy viene impostata su false, la segnalazione di dati diagnostici relativi all'attendibilità dei domini viene disattivata e non vengono inviati dati a Google.
+Se questa policy viene impostata su true o se non viene configurata, la segnalazione di dati diagnostici relativi all'attendibilità dei domini ha lo stesso comportamento di MetricsReportingEnabled per <ph name="PRODUCT_NAME" /> o DeviceMetricsReportingEnabled per <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="5088284418186527880">Questa policy consente di garantire la conformità alla specifica adottata di recente per lo zoom CSS.
 
-Se questo criterio viene impostato su Attivato o se non viene configurato, la proprietà CSS "zoom" rispetterà la specifica:
+Se questa policy viene impostata su Attivata o se non viene configurata, la proprietà CSS "zoom" rispetterà la specifica:
 
   https://drafts.csswg.org/css-viewport/#zoom-property
 
-Se viene impostato su Disattivato, la proprietà CSS "zoom" utilizzerà il comportamento precedente pre-standardizzato.
+Se viene impostata su Disattivata, la proprietà CSS "zoom" utilizzerà il comportamento precedente pre-standardizzato.
 
-Questo criterio è una sospensione temporanea per consentire la migrazione dei contenuti web al nuovo comportamento. Esiste anche una prova dell'origine ("DisableStandardizedBrowserZoom") che corrisponde al comportamento quando questo criterio è impostato su Disattivato. Questo criterio verrà rimosso e il comportamento "Attivato" verrà reso permanente nella versione 134.</translation>
+Questa policy è una sospensione temporanea per consentire la migrazione dei contenuti web al nuovo comportamento. Esiste anche una prova dell'origine ("DisableStandardizedBrowserZoom") che corrisponde al comportamento quando questa policy è impostata su Disattivata. Questa policy verrà rimossa e il comportamento "Attivata" verrà reso permanente nella versione 134.</translation>
 <translation id="5088303895040832480">Utilizza UsbDeviceId nel nuovo codice.</translation>
 <translation id="5090791951240382356">Consenti l'unione dei criteri del dizionario provenienti da origini diverse</translation>
 <translation id="5091315650312105069">Consenti l'autenticazione <ph name="BASIC_AUTH" /> per HTTP</translation>
 <translation id="5093603777978346818">Non attivare il salvaschermo nella schermata di blocco.</translation>
-<translation id="5099239365323299669">L'avvio della quota permanente non sarà più supportato a partire dalla versione M106. Questo criterio consente di riattivare la funzionalità della quota permanente fino alla versione M107.
+<translation id="5099239365323299669">L'avvio della quota permanente non sarà più supportato a partire dalla versione M106. Questa policy consente di riattivare la funzionalità della quota permanente fino alla versione M107.
 
-      Se questo criterio viene impostato su Attivato, webkitRequestFileSystem con tipo permanente funzionerà con la quota permanente.
+      Se questa policy viene impostata su Attivata, webkitRequestFileSystem con tipo permanente funzionerà con la quota permanente.
 
-      Se questo criterio non viene configurato o se viene impostato su Disattivato, webkitRequestFileSystem con tipo permanente funzionerà con la quota temporanea.
+      Se questa policy non viene configurata o se viene impostata su Disattivata, webkitRequestFileSystem con tipo permanente funzionerà con la quota temporanea.
       </translation>
 <translation id="5104606191349861549">Scorciatoie da tastiera (supportate dalla versione 129)</translation>
 <translation id="5105313908130842249">Ritardo blocco schermo in caso di utilizzo della batteria</translation>
@@ -5589,26 +5589,26 @@
 
           Questa funzionalità consente di riprodurre il suono della batteria in esaurimento.
 
-          Se questo criterio viene attivato, il suono della batteria in esaurimento viene riprodotto quando il livello della batteria o il tempo rimanente scende al di sotto di una soglia.
+          Se questa policy viene attivata, il suono della batteria in esaurimento viene riprodotto quando il livello della batteria o il tempo rimanente scende al di sotto di una soglia.
 
-          Se questo criterio viene disattivato, non viene riprodotto alcun suono della batteria in esaurimento.
+          Se questa policy viene disattivata, non viene riprodotto alcun suono della batteria in esaurimento.
 
-          Se configuri questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se configuri questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se il criterio non viene configurato, questa funzionalità viene disattivata per gli utenti esistenti o viene inizialmente attivata per i nuovi utenti sui dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti, ma gli utenti possono attivarla o disattivarla in qualsiasi momento.</translation>
+          Se la policy non viene configurata, questa funzionalità viene disattivata per gli utenti esistenti o viene inizialmente attivata per i nuovi utenti sui dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti, ma gli utenti possono attivarla o disattivarla in qualsiasi momento.</translation>
 <translation id="5108031557082757679">Stampanti aziendali associate ai dispositivi disattivate</translation>
 <translation id="5109383437323376357">Determina la disponibilità delle varianti</translation>
-<translation id="5109866581154565900">Questo criterio consente di stabilire se mostrare o meno all'utente la schermata della direzione di scorrimento sul touchpad durante il primo accesso.
-      Se viene impostato su false, la schermata della direzione di scorrimento sul touchpad non verrà visualizzata.
-      Se viene impostato su true, la schermata della direzione di scorrimento sul touchpad verrà visualizzata.</translation>
-<translation id="5110138546901711282">Consente di controllare la tastiera virtuale touch nella schermata di accesso, fungendo da criterio aggiuntivo rispetto al criterio <ph name="VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
+<translation id="5109866581154565900">Questa policy consente di stabilire se mostrare o meno all'utente la schermata della direzione di scorrimento sul touchpad durante il primo accesso.
+      Se viene impostata su false, la schermata della direzione di scorrimento sul touchpad non verrà visualizzata.
+      Se viene impostata su true, la schermata della direzione di scorrimento sul touchpad verrà visualizzata.</translation>
+<translation id="5110138546901711282">Consente di controllare la tastiera virtuale touch nella schermata di accesso, fungendo da policy aggiuntiva rispetto alla policy <ph name="VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
 
-    Se la tastiera virtuale di accessibilità è attiva, questo criterio non ha effetto.
+    Se la tastiera virtuale di accessibilità è attiva, questa policy non ha effetto.
 
-    In caso contrario, questo criterio avrà il seguente effetto sulla schermata di accesso:
-    Se questo criterio non viene configurato, la tastiera virtuale viene visualizzata in base all'euristica di sistema predefinita, ad esempio se ci sono tastiere collegate.
-    Se questo criterio viene impostato su True, la tastiera virtuale viene sempre visualizzata.
-    Se questo criterio viene impostato su False, la tastiera virtuale non viene mai visualizzata.
+    In caso contrario, questa policy avrà il seguente effetto sulla schermata di accesso:
+    Se questa policy non viene configurata, la tastiera virtuale viene visualizzata in base all'euristica di sistema predefinita, ad esempio se ci sono tastiere collegate.
+    Se questa policy viene impostata su True, la tastiera virtuale viene sempre visualizzata.
+    Se questa policy viene impostata su False, la tastiera virtuale non viene mai visualizzata.
 
     Il layout della tastiera virtuale potrebbe diventare compatto, a seconda del metodo di immissione.</translation>
 <translation id="5117533544648311089">Ti consente di specificare le configurazioni per gli URL di autenticazione in <ph name="WEBVIEW_PRODUCT_NAME" />.
@@ -5624,11 +5624,11 @@
 <translation id="5118635822783657217">Disattiva gli aggiornamenti per i componenti non critici</translation>
 <translation id="5120168808610189805">Abilita l'importazione della home page alla prima esecuzione</translation>
 <translation id="5124368997194894978">Attiva avvio tramite CA (corrente alternata)</translation>
-<translation id="5130213897914754028">Impedisci ai siti di utilizzare il criterio SharedArrayBuffers</translation>
+<translation id="5130213897914754028">Impedisci ai siti di utilizzare la policy SharedArrayBuffers</translation>
 <translation id="5130935469849337738">Offri sempre la traduzione</translation>
-<translation id="5138579693170759139">Questo criterio consente agli amministratori di stabilire il modo in cui Google tratta i dati e i cookie inviati alla Ricerca tramite <ph name="PRODUCT_OS_NAME" />.
-Se il criterio viene attivato, l'utente potrà usare la casella di ricerca di Avvio app di <ph name="PRODUCT_OS_NAME" /> e la casella degli indirizzi del browser <ph name="PRODUCT_NAME" /> in <ph name="PRODUCT_OS_NAME" />. I dati e i cookie potranno essere usati soltanto per finalità essenziali.
-Se il criterio non viene configurato o se viene disattivato, i dati e i cookie potrebbero essere usati per finalità non essenziali.</translation>
+<translation id="5138579693170759139">Questa policy consente agli amministratori di stabilire il modo in cui Google tratta i dati e i cookie inviati alla Ricerca tramite <ph name="PRODUCT_OS_NAME" />.
+Se la policy viene attivata, l'utente potrà usare la casella di ricerca di Avvio app di <ph name="PRODUCT_OS_NAME" /> e la casella degli indirizzi del browser <ph name="PRODUCT_NAME" /> in <ph name="PRODUCT_OS_NAME" />. I dati e i cookie potranno essere usati soltanto per finalità essenziali.
+Se la policy non viene configurata o se viene disattivata, i dati e i cookie potrebbero essere usati per finalità non essenziali.</translation>
 <translation id="5141670636904227950">Impostazione tipo di ingrandimento dello schermo predefinito attivato nella schermata di accesso</translation>
 <translation id="5142301680741828703">Visualizza sempre i seguenti schemi di URL in <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Consente di specificare dei parametri aggiuntivi da utilizzare quando <ph name="PRODUCT_FRAME_NAME" /> avvia <ph name="PRODUCT_NAME" />.
@@ -5639,11 +5639,11 @@
 <translation id="5152787786897382519">Chromium e Google Chrome hanno alcuni gruppi di criteri che dipendono gli uni dagli altri per fornire il controllo di una funzionalità. Questi insiemi sono rappresentati dai seguenti gruppi di criteri. Dato che i criteri possono avere diverse origini, vengono applicati soltanto i valori provenienti dall'origine con la priorità massima. I valori dello stesso gruppo provenienti da un'origine con priorità inferiore vengono ignorati. L'ordine di priorità è definito in <ph name="POLICY_PRIORITY_DOC_URL" />.</translation>
 <translation id="5153187201534281749">Icona degli esperimenti del browser nella barra degli strumenti</translation>
 <translation id="5159674159887919923">Non inviare dati hardware aggiuntivi su ChromeOS Flex</translation>
-<translation id="5162982931329320509">Elenco dei domini da risolvere tramite DNS over HTTPS. Gli altri domini non inclusi nell'elenco non verranno risolti tramite DNS over HTTPS. Questo criterio viene ignorato quando la modalità DNS sicuro è disattivata (usa sempre DNS in testo normale).
+<translation id="5162982931329320509">Elenco dei domini da risolvere tramite DNS over HTTPS. Gli altri domini non inclusi nell'elenco non verranno risolti tramite DNS over HTTPS. Questa policy viene ignorata quando la modalità DNS sicuro è disattivata (usa sempre DNS in testo normale).
 
 Se l'elenco è vuoto o non è configurato, tutti i domini verranno risolti tramite DNS over HTTPS, se possibile. Si tratta dello stesso comportamento con un elenco di domini inclusi con il valore ["*"].
 
-Se è impostato anche <ph name="DOH_TEMPLATES_POLICY_NAME" />, viene preferito un dominio più specifico. La specificità si riferisce al numero di punti ('.') nel dominio. Quando un dominio corrisponde a entrambi i criteri, per impostazione predefinita viene utilizzato il protocollo DNS over HTTPS per il dominio.
+Se è impostata anche <ph name="DOH_TEMPLATES_POLICY_NAME" />, viene preferito un dominio più specifico. La specificità si riferisce al numero di punti ('.') nel dominio. Quando un dominio corrisponde a entrambe le policy, per impostazione predefinita viene utilizzato il protocollo DNS over HTTPS per il dominio.
 
 I domini devono essere indicati sotto forma di nome di dominio completo (FQDN) o come suffissi di dominio indicati utilizzando come prefisso il carattere jolly speciale "*".
 
@@ -5651,7 +5651,7 @@
 <translation id="5163002264923337812">Attiva il flusso di accesso basato sul Web precedente</translation>
 <translation id="5163889437570441600">Consenti la trasmissione di contenuti al dispositivo usando <ph name="PRODUCT_NAME" />.
 
-          Se questo criterio viene impostato su false, gli utenti non possono trasmettere contenuti al proprio dispositivo. Se viene impostato su true, gli utenti possono trasmettere contenuti. Se non viene configurato, gli utenti non possono trasmettere contenuti a dispositivi ChromeOS registrati, ma possono trasmetterli a dispositivi non registrati.</translation>
+          Se questa policy viene impostata su false, gli utenti non possono trasmettere contenuti al proprio dispositivo. Se viene impostata su true, gli utenti possono trasmettere contenuti. Se non viene configurata, gli utenti non possono trasmettere contenuti a dispositivi ChromeOS registrati, ma possono trasmetterli a dispositivi non registrati.</translation>
 <translation id="5168529971295111207">Questa norma è obsoleta, al suo posto usa ProxyMode.
 
           Consente di specificare il server proxy utilizzato da <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare le impostazioni proxy.
@@ -5670,92 +5670,92 @@
           Se attivi questa impostazione, <ph name="PRODUCT_NAME" /> ignora tutte le opzioni relative al proxy specificate dalla riga di comando.
 
           Se questa norma non è impostata, gli utenti potranno scegliere le impostazioni proxy autonomamente.</translation>
-<translation id="5169461017653366056">Questo criterio attiva la funzionalità Generatore codice QR in <ph name="PRODUCT_NAME" />.
+<translation id="5169461017653366056">Questa policy attiva la funzionalità Generatore codice QR in <ph name="PRODUCT_NAME" />.
 
-Se il criterio viene attivato o se non viene configurato, la funzionalità Generatore codice QR viene attivata.
+Se la policy viene attivata o se non viene configurata, la funzionalità Generatore codice QR viene attivata.
 
-Se il criterio viene disattivato, la funzionalità Generatore codice QR viene disabilitata.</translation>
+Se la policy viene disattivata, la funzionalità Generatore codice QR viene disabilitata.</translation>
 <translation id="5170018694841697392">Non viene forzato l'uso di SafeSearch nella Ricerca Google</translation>
-<translation id="5172841243186654432">A meno che il criterio <ph name="RESTORE_ON_STARTUP_POLICY_NAME" /> non sia impostato per ripristinare in modo permanente gli URL delle sessioni precedenti, l'impostazione di <ph name="COOKIES_SESSION_ONLY_FOR_URLS_POLICY_NAME" /> ti consente di creare un elenco di pattern URL che specificano i siti che possono o meno impostare i cookie per una sessione.
+<translation id="5172841243186654432">A meno che la policy <ph name="RESTORE_ON_STARTUP_POLICY_NAME" /> non sia impostata per ripristinare in modo permanente gli URL delle sessioni precedenti, l'impostazione di <ph name="COOKIES_SESSION_ONLY_FOR_URLS_POLICY_NAME" /> ti consente di creare un elenco di pattern URL che specificano i siti che possono o meno impostare i cookie per una sessione.
 
-      Se il criterio non viene configurato, viene usato <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente. In caso di URL non interessati dai pattern specificati, vengono applicate le impostazioni predefinite.
+      Se la policy non viene configurata, viene usata <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente. In caso di URL non interessati dai pattern specificati, vengono applicate le impostazioni predefinite.
 
-      Poiché nessun criterio specifico prevale, vedi <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. I pattern URL di questi tre criteri non devono essere in conflitto.
+      Poiché nessuna policy specifica prevale, vedi <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. I pattern URL di queste tre policy non devono essere in conflitto.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
-<translation id="5174547204575752627">Questo criterio consente di controllare il recente refactoring delle API VideoDecoder nel plug-in PPAPI.
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
+<translation id="5174547204575752627">Questa policy consente di controllare il recente refactoring delle API VideoDecoder nel plug-in PPAPI.
 
-La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questo criterio può essere utilizzato nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto.
+La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questa policy può essere utilizzata nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto.
 
-Se il criterio non viene configurato o se viene attivato, il browser deciderà quale implementazione usare.
-Se il criterio viene disattivato, il browser utilizzerà la vecchia implementazione fino alla scadenza del criterio.
+Se la policy non viene configurata o se viene attivata, il browser deciderà quale implementazione usare.
+Se la policy viene disattivata, il browser utilizzerà la vecchia implementazione fino alla scadenza della policy.
 
-NOTA: le modifiche apportate a questo criterio verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
-<translation id="5177260184597743704">Criterio di configurazione per il connettore OnSecurityEvent di Chrome Enterprise</translation>
-<translation id="5178479074002209469">Un flag booleano che indica se le sessioni utente non gestite devono ricevere o meno notifiche e forzare o meno l'uscita dall'account in caso di aggiornamento obbligatorio, in base a questo criterio.</translation>
+NOTA: le modifiche apportate a questa policy verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
+<translation id="5177260184597743704">Policy di configurazione per il connettore OnSecurityEvent di Chrome Enterprise</translation>
+<translation id="5178479074002209469">Un flag booleano che indica se le sessioni utente non gestite devono ricevere o meno notifiche e forzare o meno l'uscita dall'account in caso di aggiornamento obbligatorio, in base a questa policy.</translation>
 <translation id="5179853299156742425">L'URL da cui è possibile scaricare il modello di scrivania.</translation>
 <translation id="5182483318861266793">Posiziona la barra delle app sul lato destro dello schermo</translation>
 <translation id="51859390023061147">Disattiva la funzionalità di ripristino completo.</translation>
 <translation id="5189360528842591274">Consenti solo la connessione con i servizi Bluetooth nell'elenco</translation>
-<translation id="5190426551516379357">La configurazione del criterio applica un livello minimo della Modalità con restrizioni su YouTube e impedisce agli utenti di scegliere un livello meno restrittivo della modalità. Se il criterio viene impostato su:
+<translation id="5190426551516379357">La configurazione della policy applica un livello minimo della Modalità con restrizioni su YouTube e impedisce agli utenti di scegliere un livello meno restrittivo della modalità. Se la policy viene impostata su:
 
       * Restrizione massima, su YouTube sarà sempre attiva questa modalità.
 
       * Restrizione moderata, l'utente può scegliere solo le modalità Restrizione moderata e Restrizione massima su YouTube, ma non può disattivare la Modalità con restrizioni.
 
-      * Off, o se il valore non viene configurato, la Modalità con restrizioni su YouTube non viene applicata da Chrome. I criteri esterni, come quelli di YouTube, potrebbero applicare comunque la Modalità con restrizioni.</translation>
+      * Off, o se il valore non viene configurato, la Modalità con restrizioni su YouTube non viene applicata da Chrome. Le policy esterne, come quelle di YouTube, potrebbero applicare comunque la Modalità con restrizioni.</translation>
 <translation id="5191476996923842491">Comportamento predefinito per l'impostazione della funzione setTimeout().</translation>
 <translation id="519247340330463721">Configura le norme relative alla Navigazione sicura.</translation>
-<translation id="5192555640439947289">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> richiede agli utenti una password per sbloccare il dispositivo quando questo viene sospeso o il coperchio viene chiuso.
+<translation id="5192555640439947289">Se la policy viene impostata su Attivata, <ph name="PRODUCT_OS_NAME" /> richiede agli utenti una password per sbloccare il dispositivo quando questo viene sospeso o il coperchio viene chiuso.
 
       I dispositivi si bloccano quando il coperchio viene chiuso, tranne se sono agganciati alla base (utilizzando un monitor esterno).  In questo caso, il dispositivo non si blocca alla chiusura del coperchio, ma se il monitor esterno viene rimosso e il coperchio è ancora chiuso.
 
-      Fino a <ph name="PRODUCT_OS_NAME" /> M106, questo criterio bloccherà il dispositivo solo quando questo viene sospeso.  A partire da M106, questo criterio bloccherà il dispositivo quando questo viene sospeso o il coperchio viene chiuso.
+      Fino a <ph name="PRODUCT_OS_NAME" /> M106, questa policy bloccherà il dispositivo solo quando questo viene sospeso.  A partire da M106, questa policy bloccherà il dispositivo quando questo viene sospeso o il coperchio viene chiuso.
 
-      Se questo criterio viene impostato su Attivato e da <ph name="LID_CLOSE_ACTION_POLICY_NAME" /> a <ph name="LID_CLOSE_ACTION_ENUM_DO_NOTHING" />, il dispositivo si bloccherà quando il coperchio viene chiuso, ma verrà sospeso soltanto se e quando questo viene appositamente configurato in <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+      Se questa policy viene impostata su Attivata e da <ph name="LID_CLOSE_ACTION_POLICY_NAME" /> a <ph name="LID_CLOSE_ACTION_ENUM_DO_NOTHING" />, il dispositivo si bloccherà quando il coperchio viene chiuso, ma verrà sospeso soltanto se e quando questo viene appositamente configurato in <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
-      Tieni presente che se questo criterio viene impostato su Attivato e il criterio <ph name="ALLOW_SCREEN_LOCK_POLICY_NAME" /> viene impostato su Disattivato, il dispositivo non può essere bloccato e l'utente verrà disconnesso.
+      Tieni presente che se questa policy viene impostata su Attivata e la policy <ph name="ALLOW_SCREEN_LOCK_POLICY_NAME" /> viene impostata su Disattivata, il dispositivo non può essere bloccato e l'utente verrà disconnesso.
 
-      Se il criterio viene impostato su Disattivato, agli utenti non viene richiesta la password per sbloccare il dispositivo.
+      Se la policy viene impostata su Disattivata, agli utenti non viene richiesta la password per sbloccare il dispositivo.
 
-      Se non viene configurato, gli utenti possono scegliere se devono inserire una password o meno per sbloccare il dispositivo.</translation>
+      Se non viene configurata, gli utenti possono scegliere se devono inserire una password o meno per sbloccare il dispositivo.</translation>
 <translation id="5194683382395300627">Consenti l'utilizzo di <ph name="ASSISTANT_PRODUCT_NAME" /> sul Web, ad esempio per attivare la modifica automatica delle password</translation>
 <translation id="5196630732055960309">Consenti l'API File Handling su queste app web</translation>
 <translation id="5205352023880027050">Non attivare la funzionalità EphemeralNetworkPolicies.</translation>
-<translation id="5206454085187851382">Se per il criterio <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_ALLOWLIST" />, la configurazione del criterio <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
+<translation id="5206454085187851382">Se per la policy <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_ALLOWLIST" />, la configurazione della policy <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
 <translation id="5207543664699568887">Consente di configurare se <ph name="PRODUCT_NAME" /> utilizzerà notifiche di sistema su Linux.
 
-Se questo criterio viene impostato su Vero o se non viene impostato, <ph name="PRODUCT_NAME" /> potrà utilizzare notifiche di sistema.
+Se questa policy viene impostata su True o se non viene impostata, <ph name="PRODUCT_NAME" /> potrà utilizzare notifiche di sistema.
 
-Se questo criterio viene impostato su Falso, <ph name="PRODUCT_NAME" /> non utilizzerà notifiche di sistema. Il Centro messaggi di <ph name="PRODUCT_NAME" /> verrà utilizzato come riserva.</translation>
+Se questa policy viene impostata su False, <ph name="PRODUCT_NAME" /> non utilizzerà notifiche di sistema. Il Centro messaggi di <ph name="PRODUCT_NAME" /> verrà utilizzato come riserva.</translation>
 <translation id="5207700504551161524">Consente di configurare l'elenco di immagini da visualizzare nel salvaschermo per la schermata di accesso.
 
 Ogni voce deve essere un URL che fa riferimento a un file immagine. Il formato dell'immagine deve essere JPEG e le dimensioni del file non devono essere superiori a 8 MB. Gli URL non validi e le immagini non supportate verranno ignorati. Il dispositivo <ph name="PRODUCT_OS_NAME" /> scaricherà queste immagini e le conserverà in una cache locale.
 
 È possibile visualizzare massimo 25 immagini nel salvaschermo. Verranno utilizzate soltanto le prime 25 voci di URL dell'elenco.
 
-Questo criterio non avrà alcun effetto se il criterio <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" /> viene impostato su false.
+Questa policy non avrà alcun effetto se la policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" /> viene impostata su false.
 
-Se questo criterio non viene configurato o se l'elenco non contiene riferimenti a immagini validi, il salvaschermo per la schermata di accesso non verrà visualizzato, a prescindere dal valore impostato nel criterio <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" />.</translation>
-<translation id="5208675398826212411">Questo criterio consente di configurare il comportamento del reindirizzamento Intranet tramite controlli dell'intercettazione DNS. Lo scopo dei controlli è cercare di scoprire se il browser è protetto da un proxy che reindirizza i nomi host sconosciuti.
+Se questa policy non viene configurata o se l'elenco non contiene riferimenti a immagini validi, il salvaschermo per la schermata di accesso non verrà visualizzato, a prescindere dal valore impostato nella policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_ENABLED_POLICY_NAME" />.</translation>
+<translation id="5208675398826212411">Questa policy consente di configurare il comportamento del reindirizzamento Intranet tramite controlli dell'intercettazione DNS. Lo scopo dei controlli è cercare di scoprire se il browser è protetto da un proxy che reindirizza i nomi host sconosciuti.
 
-      Se questo criterio non viene impostato, il browser usa il comportamento predefinito dei controlli dell'intercettazione DNS e dei suggerimenti di reindirizzamento Intranet. In M88, queste funzionalità sono attive per impostazione predefinita, ma nella release futura saranno disattivate per impostazione predefinita.
+      Se questa policy non viene impostata, il browser usa il comportamento predefinito dei controlli dell'intercettazione DNS e dei suggerimenti di reindirizzamento Intranet. In M88, queste funzionalità sono attive per impostazione predefinita, ma nella release futura saranno disattivate per impostazione predefinita.
 
-      <ph name="DNS_INTERCEPTION_CHECKS_ENABLED_POLICY_NAME" /> è un criterio correlato che potrebbe anche disattivare i controlli dell'intercettazione DNS; questo criterio è una versione più flessibile che potrebbe controllare separatamente le barre di informazioni di reindirizzamento Intranet e potrebbe essere ampliato in futuro.
-      Se <ph name="DNS_INTERCEPTION_CHECKS_ENABLED_POLICY_NAME" /> o questo criterio richiedono la disattivazione dei controlli dell'intercettazione, i controlli vengono disattivati.</translation>
+      <ph name="DNS_INTERCEPTION_CHECKS_ENABLED_POLICY_NAME" /> è una policy correlata che potrebbe anche disattivare i controlli dell'intercettazione DNS; questa policy è una versione più flessibile che potrebbe controllare separatamente le barre di informazioni di reindirizzamento Intranet e potrebbe essere ampliata in futuro.
+      Se <ph name="DNS_INTERCEPTION_CHECKS_ENABLED_POLICY_NAME" /> o questa policy richiedono la disattivazione dei controlli dell'intercettazione, i controlli vengono disattivati.</translation>
 <translation id="5210133032276211845">Cancella immagini e file memorizzati nella cache</translation>
 <translation id="5212118847531454979">Consente di stabilire per quanto tempo, in millisecondi, gli utenti riceveranno notifiche relative alla necessità di riavviare <ph name="PRODUCT_NAME" /> o un dispositivo <ph name="PRODUCT_OS_NAME" /> per applicare un aggiornamento in sospeso.
 
-      Durante questo periodo di tempo l'utente verrà informato più volte della necessità di un aggiornamento. Per quanto riguarda i dispositivi <ph name="PRODUCT_OS_NAME" />, nella barra delle applicazioni viene mostrata una notifica relativa al riavvio in base al criterio <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Per quanto riguarda i browser <ph name="PRODUCT_NAME" />, il menu delle app cambia per indicare che è necessario il riavvio una volta trascorso un terzo del periodo di notifica. Questa notifica cambia colore una volta trascorsi due terzi del periodo di notifica e lo cambia di nuovo al termine dell'intero periodo di notifica. Le notifiche aggiuntive attivate in base al criterio <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seguono questa stessa pianificazione.
+      Durante questo periodo di tempo l'utente verrà informato più volte della necessità di un aggiornamento. Per quanto riguarda i dispositivi <ph name="PRODUCT_OS_NAME" />, nella barra delle applicazioni viene mostrata una notifica relativa al riavvio in base alla policy <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Per quanto riguarda i browser <ph name="PRODUCT_NAME" />, il menu delle app cambia per indicare che è necessario il riavvio una volta trascorso un terzo del periodo di notifica. Questa notifica cambia colore una volta trascorsi due terzi del periodo di notifica e lo cambia di nuovo al termine dell'intero periodo di notifica. Le notifiche aggiuntive attivate in base alla policy <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seguono questa stessa pianificazione.
 
-      Se il criterio non viene impostato, viene usato il periodo predefinito di 604800000 millisecondi (una settimana).</translation>
+      Se la policy non viene impostata, viene usato il periodo predefinito di 604800000 millisecondi (una settimana).</translation>
 <translation id="5212810195096589189">Specifica l'autorizzazione per l'interfaccia a riga di comando delle macchine virtuali</translation>
 <translation id="5213038356678567351">Siti web che non devono mai attivare il cambio di browser.</translation>
-<translation id="5216815237712190041">Configura l'immagine di sfondo a livello di dispositivo da mostrare nella schermata di accesso se ancora nessun utente ha effettuato l'accesso al dispositivo. Il criterio viene impostato specificando l'URL da cui il dispositivo ChromeOS può scaricare l'immagine di sfondo e un hash crittografico utilizzato per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 16 MB. L'URL deve essere accessibile senza autenticazione. L'immagine di sfondo viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash cambiano.
+<translation id="5216815237712190041">Configura l'immagine di sfondo a livello di dispositivo da mostrare nella schermata di accesso se ancora nessun utente ha effettuato l'accesso al dispositivo. La policy viene impostata specificando l'URL da cui il dispositivo ChromeOS può scaricare l'immagine di sfondo e un hash crittografico utilizzato per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 16 MB. L'URL deve essere accessibile senza autenticazione. L'immagine di sfondo viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash cambiano.
 
-      Se il criterio dello sfondo del dispositivo viene configurato, il dispositivo ChromeOS scarica e utilizza l'immagine di sfondo nella schermata di accesso se ancora nessun utente ha effettuato l'accesso al dispositivo. Quando un utente esegue l'accesso, si attiva il criterio dello sfondo dell'utente.
+      Se la policy dello sfondo del dispositivo viene configurata, il dispositivo ChromeOS scarica e utilizza l'immagine di sfondo nella schermata di accesso se ancora nessun utente ha effettuato l'accesso al dispositivo. Quando un utente esegue l'accesso, si attiva la policy dello sfondo dell'utente.
 
-      Se il criterio dello sfondo del dispositivo non viene configurato, è il criterio dello sfondo dell'utente a definire cosa mostrare se viene configurato.</translation>
+      Se la policy dello sfondo del dispositivo non viene configurata, è la policy dello sfondo dell'utente a definire cosa mostrare se viene configurata.</translation>
 <translation id="5217106427763720473">Attiva supporto per Extensible Enterprise SSO</translation>
 <translation id="5219844027738217407">Nell'ambito delle app Android, la norma influisce solo sul microfono. Se la norma viene impostata su true, il microfono viene disattivato per tutte le app Android, senza alcuna eccezione.</translation>
 <translation id="5222325605346216869">Forza la limitazione dei timer JavaScript in background</translation>
@@ -5764,45 +5764,45 @@
 
       Quando stampi con una stampante PostScript su <ph name="MS_WIN_NAME" />, metodi di generazione PostScript diversi possono incidere sulle prestazioni della stampa.
 
-      Se il criterio viene impostato su Default, <ph name="PRODUCT_NAME" /> userà un insieme di opzioni predefinite per generare PostScript. In particolare, il testo verrà sempre visualizzato con i caratteri Type 3.
+      Se la policy viene impostata su Default, <ph name="PRODUCT_NAME" /> userà un insieme di opzioni predefinite per generare PostScript. In particolare, il testo verrà sempre visualizzato con i caratteri Type 3.
 
-      Se il criterio viene impostato su Type42, <ph name="PRODUCT_NAME" /> visualizzerà il testo usando i caratteri Type 42, se possibile. In questo modo dovrebbe aumentare la velocità di stampa di alcune stampanti PostScript.
+      Se la policy viene impostata su Type42, <ph name="PRODUCT_NAME" /> visualizzerà il testo usando i caratteri Type 42, se possibile. In questo modo dovrebbe aumentare la velocità di stampa di alcune stampanti PostScript.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_NAME" /> sarà in modalità Default.</translation>
-<translation id="5227647876065695164">Questo criterio consente di specificare il comportamento del downgrade del canale sui dispositivi registrati. Per downgrade del canale si intende il passaggio a un canale più stabile, ad esempio da beta a stabile.
+      Se la policy non viene impostata, <ph name="PRODUCT_NAME" /> sarà in modalità Default.</translation>
+<translation id="5227647876065695164">Questa policy consente di specificare il comportamento del downgrade del canale sui dispositivi registrati. Per downgrade del canale si intende il passaggio a un canale più stabile, ad esempio da beta a stabile.
 
-      Il valore di questo criterio interessa i downgrade del canale avviati dall'utente e dall'amministratore.
+      Il valore di questa policy interessa i downgrade del canale avviati dall'utente e dall'amministratore.
 
       Con il downgrade di un canale, il dispositivo può tornare alla sua versione e ripristinarsi oppure attendere che la sua versione corrente o una successiva diventi disponibile sul canale senza ricevere alcun aggiornamento fino ad allora.
 
-      Se un utente registrato avvia il downgrade di un canale, può decidere di eseguire il ripristino o di attendere, in alternativa viene presa una decisione al suo posto in base al valore di questo criterio. Se un amministratore avvia il downgrade di un canale tramite l'impostazione <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" />, viene eseguito il rollback del dispositivo al controllo successivo della presenza di aggiornamenti solo se il rollback è selezionato. In caso contrario, il dispositivo attende che il canale di destinazione controlli la propria versione corrente.
+      Se un utente registrato avvia il downgrade di un canale, può decidere di eseguire il ripristino o di attendere, in alternativa viene presa una decisione al suo posto in base al valore di questa policy. Se un amministratore avvia il downgrade di un canale tramite l'impostazione <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" />, viene eseguito il rollback del dispositivo al controllo successivo della presenza di aggiornamenti solo se il rollback è selezionato. In caso contrario, il dispositivo attende che il canale di destinazione controlli la propria versione corrente.
 
-      Se il criterio non viene configurato o se non è valido, viene eseguito lo stesso comportamento dell'opzione "Attendi che il canale di destinazione controlli il downgrade del canale".</translation>
+      Se la policy non viene configurata o se non è valida, viene eseguito lo stesso comportamento dell'opzione "Attendi che il canale di destinazione controlli il downgrade del canale".</translation>
 <translation id="5229339291699779956">Viene attivato il tunneling PCIe per i dispositivi periferici Thunderbolt/USB4, i dispositivi periferici funzioneranno con le loro capacità complete</translation>
 <translation id="523505283826916779">Impostazioni di accessibilità</translation>
 <translation id="5235607513961923779">Consente di segnalare lo stato dell'attività del dispositivo su dispositivi registrati di utenti affiliati.
 
-      Se il criterio viene impostato su Disabled o se non viene configurato, lo stato dell'attività del dispositivo non verrà segnalato.
-      Se il criterio viene impostato su Enabled, lo stato dell'attività del dispositivo verrà segnalato al server, che potrà rilevare se il dispositivo è offline, purché l'utente sia affiliato.</translation>
+      Se la policy viene impostata su Disabled o se non viene configurata, lo stato dell'attività del dispositivo non verrà segnalato.
+      Se la policy viene impostata su Enabled, lo stato dell'attività del dispositivo verrà segnalato al server, che potrà rilevare se il dispositivo è offline, purché l'utente sia affiliato.</translation>
 <translation id="5238275681097851753">Consenti il blocco di determinati contenuti in <ph name="FLASH_PLUGIN_NAME" /></translation>
 <translation id="5238976843489093540">Forza l'attivazione della funzionalità Accoppiamento rapido (accoppiamento rapido tramite Bluetooth)</translation>
 <translation id="5239277956452384929">Consenti l'accesso a un elenco di URL durante l'autenticazione</translation>
-<translation id="5242361766432467515">Se il criterio viene impostato attivato o se non viene configurato, gli utenti collegati a un host di accesso remoto potrebbero aprire gli URL lato host nel browser client locale.
+<translation id="5242361766432467515">Se la policy viene attivata o se non viene configurata, gli utenti collegati a un host di accesso remoto potrebbero aprire gli URL lato host nel browser client locale.
 
-Se il criterio viene disattivato, l'host di accesso remoto non potrà inviare URL al client.
+Se la policy viene disattivata, l'host di accesso remoto non potrà inviare URL al client.
 
 L'impostazione non si applica alle connessioni di assistenza remota, perché questa modalità di connessione non supporta la funzionalità.
 
 Nota: questa funzionalità non è ancora disponibile per tutti gli utenti, quindi la sua attivazione non ne garantisce la visibilità nell'UI del client.</translation>
 <translation id="5245647012663146075">Non consentire l'attivazione di Phone Hub</translation>
 <translation id="5245671702326993331">Consente le notifiche native</translation>
-<translation id="524637053580639111">Questo criterio è stato rimosso nella versione M82. Usa il criterio DeviceMinimumVersion.
+<translation id="524637053580639111">Questa policy è stata rimossa nella versione M82. Usa la policy DeviceMinimumVersion.
 
       Consente di configurare il requisito della versione minima consentita di <ph name="PRODUCT_NAME" />. Le versioni indicate di seguito sono considerate obsolete e il dispositivo consentirà l'accesso da parte dell'utente solo dopo l'aggiornamento del sistema operativo.
 
       Se la versione corrente diventa obsoleta durante la sessione utente, verrà forzata la disconnessione dell'utente.
 
-      Se questo criterio non viene impostato, non saranno applicate limitazioni e l'utente potrà accedere qualunque sia la versione di <ph name="PRODUCT_NAME" />.
+      Se questa policy non viene impostata, non saranno applicate limitazioni e l'utente potrà accedere qualunque sia la versione di <ph name="PRODUCT_NAME" />.
 
       Per "versione" si intende sia una versione esatta, ad esempio "61.0.3163.120", sia un prefisso di versione, ad esempio "61.0".  </translation>
 <translation id="5247584184349816217">Attiva il salvaschermo nella schermata di blocco.</translation>
@@ -5810,18 +5810,18 @@
 <translation id="5249006530384016395">Consente di stabilire se la sintassi <ph name="CUSTOM_STATE_DEPRECATED_SYNTAX" /> deprecata per lo stato personalizzato CSS è attiva</translation>
 <translation id="5249453807420671499">Gli utenti possono aggiungere account Kerberos</translation>
 <translation id="5249555581286638799">Attiva la modalità ad alta efficienza</translation>
-<translation id="5252210248395576403">Questo criterio consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server per ricevere i risultati della traduzione.
+<translation id="5252210248395576403">Questa policy consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server per ricevere i risultati della traduzione.
 
-      Se il criterio è attivato o non impostato, la funzionalità di traduzione di Risposte rapide sarà attiva.
-      Se il criterio è disattivato, la funzionalità di traduzione di Risposte rapide sarà disattivata.</translation>
-<translation id="5252995168844634755">Se il criterio viene impostato su True, viene attivata la modalità Desktop unificato, che consente di visualizzare le applicazioni su più schermi. Gli utenti possono disattivare questa modalità per singoli schermi.
+      Se la policy è attivata o non impostata, la funzionalità di traduzione di Risposte rapide sarà attiva.
+      Se la policy è disattivata, la funzionalità di traduzione di Risposte rapide sarà disattivata.</translation>
+<translation id="5252995168844634755">Se la policy viene impostata su True, viene attivata la modalità Desktop unificato, che consente di visualizzare le applicazioni su più schermi. Gli utenti possono disattivare questa modalità per singoli schermi.
 
-      Se il criterio viene impostato su False o non viene impostato, la modalità Desktop unificato viene disattivata e gli utenti non possono attivarla.</translation>
+      Se la policy viene impostata su False o non viene impostata, la modalità Desktop unificato viene disattivata e gli utenti non possono attivarla.</translation>
 <translation id="5255162913209987122">Può essere consigliata</translation>
 <translation id="525543707238275321">Disattiva i report sulle informazioni relative alla CPU del dispositivo</translation>
-<translation id="5255790642269910630">La configurazione del criterio comporta la rotazione di ogni display nell'orientamento specificato a ogni riavvio e la prima volta che viene eseguita la connessione del display dopo la modifica del valore del criterio. Gli utenti possono modificare la rotazione del display tramite la pagina delle impostazioni dopo aver eseguito l'accesso, ma la rotazione tornerà allo stato precedente al riavvio successivo. Questo criterio si applica ai display primari e secondari.
+<translation id="5255790642269910630">La configurazione della policy comporta la rotazione di ogni display nell'orientamento specificato a ogni riavvio e la prima volta che viene eseguita la connessione del display dopo la modifica del valore della policy. Gli utenti possono modificare la rotazione del display tramite la pagina delle impostazioni dopo aver eseguito l'accesso, ma la rotazione tornerà allo stato precedente al riavvio successivo. Questa policy si applica ai display primari e secondari.
 
-Se non viene configurato, il valore predefinito è 0 e gli utenti sono liberi di modificarlo. In questo caso, il valore predefinito non viene applicato nuovamente al riavvio.</translation>
+Se non viene configurata, il valore predefinito è 0 e gli utenti sono liberi di modificarlo. In questo caso, il valore predefinito non viene applicato nuovamente al riavvio.</translation>
 <translation id="5257395339965216304">Dati app ospitate</translation>
 <translation id="5258445772095084618">Consenti agli utenti non affiliati di usare le macchine virtuali necessarie per supportare le app Linux</translation>
 <translation id="5258651513421638932">Consenti la connessione della smart card da parte delle app isolate</translation>
@@ -5831,13 +5831,13 @@
 <translation id="5272332743749468542">Rendi disponibile per l'utente l'opzione Escludi questo display in modalità Specchio</translation>
 <translation id="5273744932022326215">Consente di attivare la funzione di accessibilità di evidenziazione del cursore nella schermata di accesso.
 
-          Se questo criterio è impostato su true, l'evidenziazione del cursore sarà sempre attivata sulla schermata di accesso.
+          Se questa policy è impostata su true, l'evidenziazione del cursore sarà sempre attivata sulla schermata di accesso.
 
-          Se questo criterio è impostato su false, l'evidenziazione del cursore sarà sempre disattivata sulla schermata di accesso.
+          Se questa policy è impostata su false, l'evidenziazione del cursore sarà sempre disattivata sulla schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'evidenziazione del cursore è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'evidenziazione del cursore è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="528302483493794684">La configurazione di una VM. Indica un tipo di VM che l'utente può installare e che verrà associato in modo permanente all'ID di questa configurazione, nonché i controlli che si applicano a questo tipo di VM.</translation>
 <translation id="5283151872467063045">Impostare la preferenza per la regione di dati per l'archiviazione</translation>
 <translation id="5283457834853986457">Disattiva la ricerca dei plug-in (ritirata)</translation>
@@ -5857,7 +5857,7 @@
 
       I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. L'amministratore è in grado di configurare messaggi composti da 200 caratteri al massimo.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="5286579716704722323">Consenti il clickthrough degli utenti su pagine di avviso SSL</translation>
 <translation id="5288713554963040955">Attiva la visualizzazione della schermata di impostazione delle dimensioni di visualizzazione durante l'accesso</translation>
 <translation id="5288772341821359899">Se la norma viene impostata, l'intervallo di porte UDP utilizzato da WebRTC viene limitato all'intervallo di porte specificato (endpoint inclusi).
@@ -5885,60 +5885,60 @@
 <translation id="5293285950307241933">Cancella tutti i dati utente locali</translation>
 <translation id="5293619885162445352">Consenti a <ph name="PEPPER_NAME" /> di usare il nuovo decodificatore video.</translation>
 <translation id="529457411593078576">Attiva i TdS alla prima esecuzione di CCT</translation>
-<translation id="5297873769621042075">Questo criterio consente di specificare un elenco di nomi host o pattern di nomi host (ad esempio "[*.]example.com") che non verranno aggiornati a HTTPS e non mostreranno un interstitial di errore se viene attivata la modalità HTTPS-First. Le organizzazioni possono utilizzare questo criterio per mantenere l'accesso ai server che non supportano HTTPS, senza dover disattivare gli upgrade a HTTPS e/o la modalità HTTPS-First.
+<translation id="5297873769621042075">Questa policy consente di specificare un elenco di nomi host o pattern di nomi host (ad esempio "[*.]example.com") che non verranno aggiornati a HTTPS e non mostreranno un interstitial di errore se viene attivata la modalità HTTPS-First. Le organizzazioni possono utilizzare questa policy per mantenere l'accesso ai server che non supportano HTTPS, senza dover disattivare gli upgrade a HTTPS e/o la modalità HTTPS-First.
 
 I nomi host indicati devono essere canonicalizzati: ogni IDN deve essere convertito nel relativo formato A-label e tutte le lettere ASCII devono essere minuscole.
 
-I caratteri jolly nell'host globale (ad es. "*" o "[*]") non sono consentiti. La modalità HTTPS-First e gli upgrade a HTTPS devono essere disattivati esplicitamente tramite i relativi criteri specifici.
+I caratteri jolly nell'host globale (ad es. "*" o "[*]") non sono consentiti. La modalità HTTPS-First e gli upgrade a HTTPS devono essere disattivati esplicitamente tramite le relative policy specifiche.
 
-Nota: questo criterio non viene applicato agli upgrade a HSTS.</translation>
+Nota: questa policy non viene applicata agli upgrade a HSTS.</translation>
 <translation id="5297948043665200363">Consenti all'utente di mantenere l'accesso dopo che il suo account non è più autenticato</translation>
 <translation id="5298949392804966105">Nessuna limitazione per gli account gestiti</translation>
 <translation id="530111809849214840">Nascondi l'opzione <ph name="GOOGLE_DRIVE_NAME" />.</translation>
 <translation id="530134925949808452">L'ora del giorno, in ora locale, in cui viene rinnovata la quota di utilizzo.</translation>
-<translation id="5303080953475303561">La configurazione del criterio consente di stabilire la frequenza della richiesta della password nella schermata di blocco per lo sblocco rapido. Ogni volta che viene visualizzata la schermata di blocco, se l'ultimo inserimento della password si è verificato prima del periodo di tempo specificato dal valore scelto, lo sblocco rapido non sarà disponibile. Se l'utente rimane nella schermata di blocco per un tempo superiore a quello specificato in questo criterio, viene richiesta la password la volta successiva che inserisce il codice sbagliato o accede di nuovo alla schermata di blocco, a seconda dell'evento che si verifica per primo.
+<translation id="5303080953475303561">La configurazione della policy consente di stabilire la frequenza della richiesta della password nella schermata di blocco per lo sblocco rapido. Ogni volta che viene visualizzata la schermata di blocco, se l'ultimo inserimento della password si è verificato prima del periodo di tempo specificato dal valore scelto, lo sblocco rapido non sarà disponibile. Se l'utente rimane nella schermata di blocco per un tempo superiore a quello specificato in questa policy, viene richiesta la password la volta successiva che inserisce il codice sbagliato o accede di nuovo alla schermata di blocco, a seconda dell'evento che si verifica per primo.
 
-      Se il criterio non viene configurato, gli utenti che usano lo sblocco rapido devono inserire la password nella schermata di blocco ogni giorno.</translation>
+      Se la policy non viene configurata, gli utenti che usano lo sblocco rapido devono inserire la password nella schermata di blocco ogni giorno.</translation>
 <translation id="5306186200045823863">Considera attendibile l'infrastruttura PKI precedente di Symantec Corporation</translation>
 <translation id="5307432759655324440">Disponibilità della modalità di navigazione in incognito</translation>
 <translation id="5308551343115571396">Dopo la disattivazione di <ph name="LACROS_NAME" />, tentiamo di conservare il maggior numero possibile di dati utente, rimuovendo tutti i dati del browser.</translation>
 <translation id="530949964068726932">Nascondi opzioni di accessibilità nel menu della barra delle applicazioni</translation>
-<translation id="5310544046492594469">Se il criterio viene impostato su 0 (valore predefinito), è possibile accedere agli strumenti per sviluppatori e alla console JavaScript, ma non se ci sono estensioni installate in base ai criteri aziendali o, dalla versione 114 e se si tratta di un utente gestito, estensioni integrate nel browser. Se il criterio viene impostato su 1, è possibile accedere agli strumenti per sviluppatori e alla console JavaScript in ogni caso, anche se ci sono estensioni installate in base ai criteri aziendali. Se il criterio viene impostato su 2, non è possibile accedere agli strumenti per sviluppatori, né esaminare gli elementi dei siti web.
+<translation id="5310544046492594469">Se la policy viene impostata su 0 (valore predefinito), è possibile accedere agli strumenti per sviluppatori e alla console JavaScript, ma non se ci sono estensioni installate in base alle policy aziendali o, dalla versione 114 e se si tratta di un utente gestito, estensioni integrate nel browser. Se la policy viene impostata su 1, è possibile accedere agli strumenti per sviluppatori e alla console JavaScript in ogni caso, anche se ci sono estensioni installate in base alle policy aziendali. Se la policy viene impostata su 2, non è possibile accedere agli strumenti per sviluppatori, né esaminare gli elementi dei siti web.
 
       Questa impostazione disattiva anche le scorciatoie da tastiera e le voci dei menu o dei menu contestuali per aprire gli strumenti per sviluppatori o la console JavaScript.
 
-      A partire dalla versione 99 di <ph name="PRODUCT_NAME" />, questa impostazione consente anche di controllare i punti di ingresso per la funzionalità "Visualizza il codice sorgente della pagina". Se imposti questo criterio su "DeveloperToolsDisallowed" (valore 2), gli utenti non possono accedere alla visualizzazione del codice sorgente tramite scorciatoia da tastiera o il menu contestuale. Per bloccare completamente la visualizzazione del codice sorgente, devi anche aggiungere "view-source:*" al criterio <ph name="URL_BLOCKLIST_POLICY_NAME" />.
+      A partire dalla versione 99 di <ph name="PRODUCT_NAME" />, questa impostazione consente anche di controllare i punti di ingresso per la funzionalità "Visualizza il codice sorgente della pagina". Se imposti questa policy su "DeveloperToolsDisallowed" (valore 2), gli utenti non possono accedere alla visualizzazione del codice sorgente tramite scorciatoia da tastiera o il menu contestuale. Per bloccare completamente la visualizzazione del codice sorgente, devi anche aggiungere "view-source:*" alla policy <ph name="URL_BLOCKLIST_POLICY_NAME" />.
 
       A partire dalla versione 119 di <ph name="PRODUCT_NAME" />, questa impostazione consente anche di stabilire se è possibile attivare e utilizzare la modalità sviluppatore per le app web isolate.
 
-      A partire dalla versione 128 di <ph name="PRODUCT_NAME" />, questa impostazione non controllerà la modalità sviluppatore nella pagina delle estensioni se è impostato il criterio <ph name="EXTENSION_DEVELOPER_MODE_SETTINGS_POLICY_NAME" />.</translation>
+      A partire dalla versione 128 di <ph name="PRODUCT_NAME" />, questa impostazione non controllerà la modalità sviluppatore nella pagina delle estensioni se è impostata la policy <ph name="EXTENSION_DEVELOPER_MODE_SETTINGS_POLICY_NAME" />.</translation>
 <translation id="5311275381462687162">Impostazione del comportamento precedente predefinito <ph name="ATTRIBUTE_SAMESITE_NAME" /> per i cookie</translation>
 <translation id="5312253627576569499">La percentuale di regolazione del ritardo di oscuramento dello schermo quando viene osservata l'attività dell'utente mentre lo schermo è oscurato o subito dopo la disattivazione dello schermo.</translation>
 <translation id="5316856058059940708">Disabilita cursore grande</translation>
-<translation id="5317852436044398288">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che possono usare la funzionalità di acquisizione di finestre e schede.
+<translation id="5317852436044398288">Se la policy viene configurata, puoi impostare un elenco di pattern URL che possono usare la funzionalità di acquisizione di finestre e schede.
 
-      Se non viene configurato, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
+      Se non viene configurata, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
 
-      Il criterio non viene preso in considerazione se un sito corrisponde a un pattern URL in uno qualsiasi dei seguenti criteri: <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SAME_ORIGIN_TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />.
+      La policy non viene presa in considerazione se un sito corrisponde a un pattern URL in una qualsiasi delle seguenti policy: <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SAME_ORIGIN_TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />.
 
-      Se un sito corrisponde a un pattern URL in questo criterio, i seguenti criteri non saranno presi in considerazione: <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />.
+      Se un sito corrisponde a un pattern URL in questa policy, le seguenti policy non saranno prese in considerazione: <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
 <translation id="5318185076587284965">Attiva l'utilizzo dei server relay per l'host di accesso remoto</translation>
-<translation id="5321624917465764266">Se il criterio viene impostato su Attivato o se non viene configurato, la cronologia di navigazione e quella dei download possono essere eliminate in Chrome e gli utenti non possono modificare questa impostazione.
+<translation id="5321624917465764266">Se la policy viene impostata su Attivata o se non viene configurata, la cronologia di navigazione e quella dei download possono essere eliminate in Chrome e gli utenti non possono modificare questa impostazione.
 
-Se il criterio viene impostato su Disattivato, la cronologia di navigazione e quella dei download non possono essere eliminate. Non è garantita la memorizzazione della cronologia di navigazione e di quella dei download, anche se questo criterio viene disattivato. Gli utenti potrebbero essere in grado di modificare o eliminare direttamente i file dei database delle cronologie e il browser stesso potrebbe far scadere o archiviare una o tutte le voci delle cronologie in qualsiasi momento.</translation>
+Se la policy viene impostata su Disattivata, la cronologia di navigazione e quella dei download non possono essere eliminate. Non è garantita la memorizzazione della cronologia di navigazione e di quella dei download, anche se questa policy viene disattivata. Gli utenti potrebbero essere in grado di modificare o eliminare direttamente i file dei database delle cronologie e il browser stesso potrebbe far scadere o archiviare una o tutte le voci delle cronologie in qualsiasi momento.</translation>
 <translation id="5322649594584715998">Carica completamente la batteria con la modalità standard. Questa modalità disattiva le ricariche adattiva e limitata.</translation>
 <translation id="5323200200131319468">Attiva la funzione di lettura vocale nella schermata di accesso</translation>
 <translation id="5323271643727095577">Non mostrare la finestra di dialogo di annullamento quando viene chiamato event.preventDefault() per l'evento beforeunload. Mostra la finestra di dialogo di annullamento quando event.returnValue è la stringa vuota dell'evento beforeunload.</translation>
 <translation id="5324430722441910403">Impostazioni ricerca sui siti</translation>
-<translation id="5326431956495937408">Se il criterio viene attivato, gli utenti possono inviare le loro password ai membri del gruppo Famiglia (in base al servizio per le famiglie) e ricevere password dai membri.
-Se il criterio viene attivato o se non viene configurato, in Gestore delle password viene visualizzato un pulsante che consente di inviare una password.
+<translation id="5326431956495937408">Se la policy viene attivata, gli utenti possono inviare le loro password ai membri del gruppo Famiglia (in base al servizio per le famiglie) e ricevere password dai membri.
+Se la policy viene attivata o se non viene configurata, in Gestore delle password viene visualizzato un pulsante che consente di inviare una password.
 Le password ricevute vengono memorizzate nell'account dell'utente e sono disponibili in Gestore delle password.
 
-Se il criterio viene disattivato, gli utenti non possono inviare password da Gestore delle password ad altri utenti e non possono riceverle da altri utenti.
+Se la policy viene disattivata, gli utenti non possono inviare password da Gestore delle password ad altri utenti e non possono riceverle da altri utenti.
 
-La funzionalità non è disponibile se la sincronizzazione delle password viene disattivata (tramite le impostazioni dell'utente o attivando il criterio <ph name="SYNC_DISABLED" />).
+La funzionalità non è disponibile se la sincronizzazione delle password viene disattivata (tramite le impostazioni dell'utente o attivando la policy <ph name="SYNC_DISABLED" />).
 
 Gli account gestiti non sono idonei a far parte di un gruppo Famiglia o a crearli, pertanto non possono condividere le password.</translation>
 <translation id="532848608876725157">Attiva DNS over HTTPS con fallback non sicuro</translation>
@@ -5958,32 +5958,32 @@
 <translation id="5346587320074666194">Blocca l'accesso ai sensori su questi siti</translation>
 <translation id="534836255587440809">Disattiva i clic automatici nella schermata di accesso</translation>
 <translation id="5348658899015174540">L'API <ph name="GET_DISPLAY_MEDIA_SET_NAME" /> consente alle applicazioni web di acquisire più schermate contemporaneamente.
-      Questo criterio sblocca la proprietà <ph name="AUTO_SELECT_ALL_SCREENS_NAME" /> per le applicazioni web di origini definite.
+      Questa policy sblocca la proprietà <ph name="AUTO_SELECT_ALL_SCREENS_NAME" /> per le applicazioni web di origini definite.
       Se la proprietà <ph name="AUTO_SELECT_ALL_SCREENS_NAME" /> viene definita in una richiesta <ph name="GET_DISPLAY_MEDIA_SET_NAME" />, tutte le schermate vengono acquisite automaticamente senza chiedere esplicitamente l'autorizzazione dell'utente.
-      Se il criterio non viene configurato, <ph name="AUTO_SELECT_ALL_SCREENS_NAME" /> non è disponibile per alcuna applicazione web.
-Per migliorare la privacy, a partire dalla versione 116 di <ph name="PRODUCT_NAME" />, questo criterio non supporterà più l'aggiornamento dinamico. Pertanto, l'utente potrà assicurarsi che dopo l'accesso le altre pagine non saranno in grado di acquisire le schermate, se non era già stato consentito all'inizio della sessione.</translation>
-<translation id="5351946114524094311">Se questo criterio viene configurato, tutti i tipi di dati specificati verranno esclusi dalla sincronizzazione sia per <ph name="CHROME_SYNC_NAME" /> sia per la sincronizzazione del profilo di roaming. Questa operazione può essere utile per ridurre le dimensioni del profilo di roaming o per limitare il tipo di dati caricati sui server di <ph name="CHROME_SYNC_NAME" />.
+      Se la policy non viene configurata, <ph name="AUTO_SELECT_ALL_SCREENS_NAME" /> non è disponibile per alcuna applicazione web.
+Per migliorare la privacy, a partire dalla versione 116 di <ph name="PRODUCT_NAME" />, questa policy non supporterà più l'aggiornamento dinamico. Pertanto, l'utente potrà assicurarsi che dopo l'accesso le altre pagine non saranno in grado di acquisire le schermate, se non era già stato consentito all'inizio della sessione.</translation>
+<translation id="5351946114524094311">Se questa policy viene configurata, tutti i tipi di dati specificati verranno esclusi dalla sincronizzazione sia per <ph name="CHROME_SYNC_NAME" /> sia per la sincronizzazione del profilo di roaming. Questa operazione può essere utile per ridurre le dimensioni del profilo di roaming o per limitare il tipo di dati caricati sui server di <ph name="CHROME_SYNC_NAME" />.
 
-      Attualmente i tipi di dati per questo criterio sono: "apps", "autofill", "bookmarks", "extensions", "preferences", "passwords", "payments", "productComparison", "readingList", "savedTabGroups", "tabs", "themes", "typedUrls", "wifiConfigurations". Questi nomi sono sensibili alle maiuscole.
+      Attualmente i tipi di dati per questa policy sono: "apps", "autofill", "bookmarks", "extensions", "preferences", "passwords", "payments", "productComparison", "readingList", "savedTabGroups", "tabs", "themes", "typedUrls", "wifiConfigurations". Questi nomi sono sensibili alle maiuscole.
 
-      Note: l'aggiornamento dinamico dei criteri è supportato solo in <ph name="PRODUCT_NAME" /> 123 e versioni successive. La disattivazione di "autofill" disattiva anche "payments". "typedUrls" si riferisce all'intera cronologia di navigazione.</translation>
+      Note: l'aggiornamento dinamico delle policy è supportato solo in <ph name="PRODUCT_NAME" /> 123 e versioni successive. La disattivazione di "autofill" disattiva anche "payments". "typedUrls" si riferisce all'intera cronologia di navigazione.</translation>
 <translation id="5361167871898066799">Controlla la funzionalità di correzione automatica sulla tastiera fisica</translation>
-<translation id="5361708558735884308">La configurazione del criterio consente di fornire l'accesso agli URL elencati, sotto forma di eccezioni a <ph name="URL_BLOCKLIST_POLICY_NAME" />. Leggi la descrizione del criterio per conoscere il formato delle voci di questo elenco. Ad esempio, se imposti il criterio <ph name="URL_BLOCKLIST_POLICY_NAME" /> su *, tutte le richieste verranno bloccate e puoi utilizzare questo criterio per consentire l'accesso a un elenco limitato di URL. Utilizzalo per aprire le eccezioni di alcuni schemi, sottodomini di altri domini, porte o percorsi specifici utilizzando il formato specificato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Il filtro più specifico consente di determinare se un URL è bloccato o consentito. Il criterio <ph name="URL_ALLOWLIST_POLICY_NAME" /> ha la precedenza sul criterio <ph name="URL_BLOCKLIST_POLICY_NAME" />. Per questo criterio è possibile definire al massimo 1000 voci.
+<translation id="5361708558735884308">La configurazione della policy consente di fornire l'accesso agli URL elencati, sotto forma di eccezioni a <ph name="URL_BLOCKLIST_POLICY_NAME" />. Leggi la descrizione della policy per conoscere il formato delle voci di questo elenco. Ad esempio, se imposti la policy <ph name="URL_BLOCKLIST_POLICY_NAME" /> su *, tutte le richieste verranno bloccate e puoi utilizzare questa policy per consentire l'accesso a un elenco limitato di URL. Utilizzalo per aprire le eccezioni di alcuni schemi, sottodomini di altri domini, porte o percorsi specifici utilizzando il formato specificato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Il filtro più specifico consente di determinare se un URL è bloccato o consentito. La policy <ph name="URL_ALLOWLIST_POLICY_NAME" /> ha la precedenza sulla policy <ph name="URL_BLOCKLIST_POLICY_NAME" />. Per questa policy è possibile definire al massimo 1000 voci.
 
-Questo criterio consente anche di attivare la chiamata automatica da parte del browser di applicazioni esterne registrate come gestori di protocollo per i protocolli elencati come "tel:" o "ssh:".
+Questa policy consente anche di attivare la chiamata automatica da parte del browser di applicazioni esterne registrate come gestori di protocollo per i protocolli elencati come "tel:" o "ssh:".
 
-Se il criterio non viene configurato, non sono consentite eccezioni a <ph name="URL_BLOCKLIST_POLICY_NAME" />.
+Se la policy non viene configurata, non sono consentite eccezioni a <ph name="URL_BLOCKLIST_POLICY_NAME" />.
 
-A partire dalla versione 92 di <ph name="PRODUCT_NAME" />, questo criterio è supportato anche nella modalità headless.</translation>
+A partire dalla versione 92 di <ph name="PRODUCT_NAME" />, questa policy è supportata anche nella modalità headless.</translation>
 <translation id="5362531528507578966">Consente di sostituire la modalità di stampa predefinita delle immagini di sfondo.</translation>
 <translation id="5365476955714838841">Parametri della riga di comando per il browser alternativo.</translation>
 <translation id="5365946944967967336">Mostra il pulsante Pagina iniziale nella barra degli strumenti</translation>
 <translation id="5366977351895725771">Se questa norma è impostata su false, la creazione di utenti supervisionati da parte di questo utente sarà disabilitata. Gli eventuali utenti supervisionati esistenti saranno comunque disponibili.
 
           Se questa norma è impostata su true o non è configurata, questo utente può creare e gestire utenti supervisionati.</translation>
-<translation id="5367255280764736002">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> consente di specificare i parametri durante la ricerca immagini con POST. Si tratta di coppie di tipo nome-valore separate da virgole. Se un valore è il parametro di un modello, ad esempio {imageThumbnail}, viene sostituito con i dati delle miniature di immagini reali.
+<translation id="5367255280764736002">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> consente di specificare i parametri durante la ricerca immagini con POST. Si tratta di coppie di tipo nome-valore separate da virgole. Se un valore è il parametro di un modello, ad esempio {imageThumbnail}, viene sostituito con i dati delle miniature di immagini reali.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> non viene configurato, la richiesta di ricerca immagini viene inviata utilizzando il metodo Get.
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> non viene configurata, la richiesta di ricerca immagini viene inviata utilizzando il metodo Get.
 
       L'URL deve specificare il parametro delle immagini utilizzando una combinazione valida dei seguenti segnaposto, a seconda di ciò che viene supportato dal motore di ricerca:
       <ph name="IMAGE_IMAGE_URL" />,
@@ -5995,9 +5995,9 @@
       <ph name="IMAGE_THUMBNAIL_BASE64" />.</translation>
 <translation id="5369937289900051171">Solo stampa a colori</translation>
 <translation id="5370279767682621504">Attiva il supporto HTTP/0.9 sulle porte non predefinite</translation>
-<translation id="5370765433640162225">Se il criterio viene impostato su vero, la pulizia automatica viene eseguita durante l'accesso per garantire che sia disponibile spazio su disco libero a sufficienza.
+<translation id="5370765433640162225">Se la policy viene impostata su true, la pulizia automatica viene eseguita durante l'accesso per garantire che sia disponibile spazio su disco libero a sufficienza.
       La pulizia verrà eseguita solo se strettamente necessario, ma avrà comunque un impatto sull'ora di accesso.
-      Se il criterio viene impostato su falso (impostazione predefinita), non ci saranno ripercussioni sull'ora di accesso.</translation>
+      Se la policy viene impostata su false (impostazione predefinita), non ci saranno ripercussioni sull'ora di accesso.</translation>
 <translation id="5371152055157582429">Gli utenti possono personalizzare lo sfondo della pagina Nuova scheda</translation>
 <translation id="5372698090378600633">Blocca l'API Direct Sockets su questi siti</translation>
 <translation id="5373552304217872025">Se la policy viene impostata su true o se non viene configurata, <ph name="PRODUCT_NAME" /> e <ph name="LACROS_NAME" /> consentono l'aggiunta di una nuova persona da Gestione utenti.
@@ -6029,27 +6029,27 @@
 <translation id="5385337904220716757">Consenti l'accesso alla geolocalizzazione del sistema solo per i servizi di sistema</translation>
 <translation id="538768040137709073">Consente di attivare la funzione Appunti condivisi che permette agli utenti di inviare testi tra computer desktop Chrome e un dispositivo Android quando la sincronizzazione è attivata e l'utente ha effettuato l'accesso.
 
-          Se il criterio è impostato su true, la funzionalità di invio testi tra dispositivi è attivata per gli utenti Chrome.
+          Se la policy è impostata su true, la funzionalità di invio testi tra dispositivi è attivata per gli utenti Chrome.
 
-          Se il criterio è impostato su false, la funzionalità di invio testi tra dispositivi è disattivata per gli utenti Chrome.
+          Se la policy è impostata su false, la funzionalità di invio testi tra dispositivi è disattivata per gli utenti Chrome.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, la funzione Appunti condivisi è attivata per impostazione predefinita.
+          Se questa policy non viene impostata, la funzione Appunti condivisi è attivata per impostazione predefinita.
 
-          Spetta agli amministratori scegliere se impostare i criteri su tutte le piattaforme a cui sono interessati. Consigliamo di impostare questo criterio su un valore unico per tutte le piattaforme.</translation>
+          Spetta agli amministratori scegliere se impostare le policy su tutte le piattaforme a cui sono interessati. Consigliamo di impostare questa policy su un valore unico per tutte le piattaforme.</translation>
 <translation id="5389708774452952523">Consenti l'esecuzione del processo audio con priorità sopra la norma su Windows</translation>
 <translation id="5390083518957894426">Consenti la riautenticazione online nella schermata di blocco per gli utenti SAML</translation>
 <translation id="5391388690191341203">Account locale del dispositivo per l'accesso automatico</translation>
-<translation id="5391867362692016532">La configurazione del criterio consente di elencare i pattern URL che specificano quali app web possono chiedere agli utenti l'autorizzazione ad accedere a determinati tipi di file.
+<translation id="5391867362692016532">La configurazione della policy consente di elencare i pattern URL che specificano quali app web possono chiedere agli utenti l'autorizzazione ad accedere a determinati tipi di file.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> si applica per tutte le app web, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> si applica per tutte le app web, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Per i pattern URL che non presentano corrispondenze né con il criterio <ph name="FILE_HANDLING_ALLOWED_FOR_URLS_POLICY_NAME" /> né con <ph name="FILE_HANDLING_BLOCKED_FOR_URLS_POLICY_NAME" />, verranno utilizzati <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> o le impostazioni personali degli utenti in quest'ordine.
+      Per i pattern URL che non presentano corrispondenze né con la policy <ph name="FILE_HANDLING_ALLOWED_FOR_URLS_POLICY_NAME" /> né con <ph name="FILE_HANDLING_BLOCKED_FOR_URLS_POLICY_NAME" />, verranno utilizzati <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> o le impostazioni personali degli utenti in quest'ordine.
 
-      I pattern URL non devono essere in conflitto con <ph name="FILE_HANDLING_ALLOWED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="FILE_HANDLING_ALLOWED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="5393009997533871906">Agli utenti vengono mostrate soltanto le stampanti indicate nella lista consentita</translation>
 <translation id="5395778184390568113">Controlla la scorciatoia usata per attivare i tasti Inizio/Fine del "pacchetto da sei"</translation>
 <translation id="5396322417222266779">Consenti all'utente di personalizzare le scorciatoie di sistema</translation>
@@ -6063,72 +6063,72 @@
 <translation id="5407008856008996384">Consenti l'accesso alle stampanti CUPS</translation>
 <translation id="5413051574966911176">Disattiva l'UI relativa alla connessione sul computer desktop host remoto quando è attiva una connessione</translation>
 <translation id="5415713057512333739">URL dei dati da scaricare.</translation>
-<translation id="5416263061774624216">Non utilizzare il criterio SiteList di Internet Explorer come fonte di regole</translation>
+<translation id="5416263061774624216">Non utilizzare la policy SiteList di Internet Explorer come fonte di regole</translation>
 <translation id="5416663929864223914">Controlla la scorciatoia utilizzata per attivare il tasto Elimina del "pacchetto da sei"</translation>
-<translation id="5417857116982992260">Questo criterio determina il comportamento predefinito per la rimappatura del tasto Inserisci
+<translation id="5417857116982992260">Questa policy determina il comportamento predefinito per la rimappatura del tasto Inserisci
 nella pagina secondaria "Rimappa i tasti". La pagina secondaria "Rimappa i tasti" consente agli utenti di
-personalizzare i tasti della tastiera. Se abilitato, questo criterio impedisce agli utenti di
-personalizzare queste rimappature specifiche. Se il criterio non viene configurato,
+personalizzare i tasti della tastiera. Se abilitata, questa policy impedisce agli utenti di
+personalizzare queste rimappature specifiche. Se la policy non viene configurata,
 le scorciatoie basate sul tasto Ricerca saranno quelle predefinite.</translation>
 <translation id="5417906792459853336">Consente di segnalare informazioni sull'inventario delle applicazioni di un dispositivo e sul relativo utilizzo.
 
-      Se il criterio viene impostato su false o non viene impostato, le informazioni non vengono segnalate.
-      Se viene impostato su true, le informazioni sulle applicazioni del dispositivo e sul relativo utilizzo vengono segnalate.</translation>
+      Se la policy viene impostata su false o non viene impostata, le informazioni non vengono segnalate.
+      Se viene impostata su true, le informazioni sulle applicazioni del dispositivo e sul relativo utilizzo vengono segnalate.</translation>
 <translation id="5420245232720940848">Viene disattivato il tunneling PCIe per i dispositivi periferici Thunderbolt/USB4, limitando così le capacità dei dispositivi</translation>
 <translation id="5420673997623782432">Blocca l'accesso alla geolocalizzazione del sistema per tutti i client</translation>
-<translation id="5420774177427557782">Consente di stabilire se le VM che utilizzano questa configurazione possono essere installate ed eseguite (<ph name="INSTALL_ALLOWED" />), eseguite ma non installate (<ph name="RUN_ALLOWED" />) o se non possono essere eseguite (<ph name="BLOCKED" />). Tieni presente che per installare una VM è necessario impostare anche la chiave installer_image_x86_64. Se una configurazione viene rimossa completamente, viene impostato in modo implicito il valore <ph name="BLOCKED" />, che impedisce l'esecuzione delle VM senza un criterio.</translation>
+<translation id="5420774177427557782">Consente di stabilire se le VM che utilizzano questa configurazione possono essere installate ed eseguite (<ph name="INSTALL_ALLOWED" />), eseguite ma non installate (<ph name="RUN_ALLOWED" />) o se non possono essere eseguite (<ph name="BLOCKED" />). Tieni presente che per installare una VM è necessario impostare anche la chiave installer_image_x86_64. Se una configurazione viene rimossa completamente, viene impostato in modo implicito il valore <ph name="BLOCKED" />, che impedisce l'esecuzione delle VM senza una policy.</translation>
 <translation id="5422643441807528365">Codice licenza <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="5423197884968724595">Nome della limitazione di Android WebView:</translation>
 <translation id="5424147596523390018">Consenti tutte le modalità a colori</translation>
-<translation id="5427879482805712214">Questo criterio consente di configurare l'immagine avatar che rappresenta l'utente sulla schermata di accesso. Il criterio viene impostato specificando l'URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare l'immagine e un hash crittografico utilizzato per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 512 kB. L'URL deve essere accessibile senza nessuna autenticazione.
+<translation id="5427879482805712214">Questa policy consente di configurare l'immagine avatar che rappresenta l'utente sulla schermata di accesso. La policy viene impostata specificando l'URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare l'immagine e un hash crittografico utilizzato per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 512 kB. L'URL deve essere accessibile senza nessuna autenticazione.
 
       L'immagine avatar viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash vengono modificati.
 
-      Se il criterio è impostato, <ph name="PRODUCT_OS_NAME" /> scaricherà e utilizzerà l'immagine avatar.
+      Se la policy è impostata, <ph name="PRODUCT_OS_NAME" /> scaricherà e utilizzerà l'immagine avatar.
 
-      Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+      Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-      Se il criterio non viene impostato, l'utente può scegliere l'immagine avatar che lo rappresenta sulla schermata di accesso.</translation>
+      Se la policy non viene impostata, l'utente può scegliere l'immagine avatar che lo rappresenta sulla schermata di accesso.</translation>
 <translation id="5428716437928918274">Controlli delle impostazioni di Privacy Sandbox</translation>
 <translation id="5430760800138878127">Verrà attivato il nuovo comportamento del parser HTML che consente l'uso di più tag.</translation>
-<translation id="5431392643649571773">Se il criterio è attivato, la funzionalità <ph name="PRODUCT_NAME" /> consente di utilizzare la cache back-forward. Quando esci da una pagina, il suo stato corrente (documento con struttura ad albero, script e così via) potrebbe essere mantenuto nella cache back-forward. Se il browser torna alla pagina, questa potrebbe essere ripristinata dalla cache back-forward e mostrata nello stato in cui era prima di essere memorizzata nella cache.
+<translation id="5431392643649571773">Se la policy è attivata, la funzionalità <ph name="PRODUCT_NAME" /> consente di utilizzare la cache back-forward. Quando esci da una pagina, il suo stato corrente (documento con struttura ad albero, script e così via) potrebbe essere mantenuto nella cache back-forward. Se il browser torna alla pagina, questa potrebbe essere ripristinata dalla cache back-forward e mostrata nello stato in cui era prima di essere memorizzata nella cache.
 
           Questa funzionalità potrebbe causare problemi per alcuni siti web che non sono preparati per la memorizzazione nella cache. In particolare, alcuni siti web dipendono dall'invio dell'evento "<ph name="UNLOAD_HANDLER_NAME" />" quando il browser esce dalla pagina. L'evento "<ph name="UNLOAD_HANDLER_NAME" />" non verrà inviato se la pagina viene inserita nella cache back-forward.
 
-          Se questo criterio viene impostato su Attivato o se non viene configurato,
+          Se questa policy viene impostata su Attivata o se non viene configurata,
           la funzionalità <ph name="PRODUCT_NAME" /> viene attivata.
 
-          Se questo criterio viene impostato su Disattivato, la funzionalità viene disattivata forzatamente.
+          Se questa policy viene impostata su Disattivata, la funzionalità viene disattivata forzatamente.
           </translation>
 <translation id="5433865420958136693">Usa l'accelerazione grafica quando disponibile</translation>
 <translation id="5435888298115339571">Attiva la condivisione desktop nel menu con tre puntini e in omnibox</translation>
 <translation id="5441508088704391614">Nessuna limitazione speciale (opzione predefinita).</translation>
 <translation id="5442026853063570579">Questa norma consente di controllare anche l'accesso alle Opzioni sviluppatore di Android. Se la norma viene impostata su "DeveloperToolsDisallowed" (valore 2), gli utenti non potranno accedere alle Opzioni sviluppatore. Se la norma viene impostata su un altro valore o non viene impostata, gli utenti potranno accedere alle Opzioni sviluppatore toccando sette volte il numero di build nell'app Impostazioni di Android.</translation>
-<translation id="5443582909255996887">Se il criterio viene impostato su Attivato, tutti i siti vengono isolati su Android, così che ogni sito venga eseguito nel proprio processo e la disattivazione da parte degli utenti viene impedita. Ogni sito è uno schema più eTLD+1 (ad es. https://example.com). Tieni presente che Android isola alcuni siti sensibili per impostazione predefinita a partire da <ph name="PRODUCT_NAME" /> 77 e il criterio estende questa modalità di isolamento dei siti predefinita affinché venga applicata a tutti i siti.
+<translation id="5443582909255996887">Se la policy viene impostata su Attivata, tutti i siti vengono isolati su Android, così che ogni sito venga eseguito nel proprio processo e la disattivazione da parte degli utenti viene impedita. Ogni sito è uno schema più eTLD+1 (ad es. https://example.com). Tieni presente che Android isola alcuni siti sensibili per impostazione predefinita a partire da <ph name="PRODUCT_NAME" /> 77 e la policy estende questa modalità di isolamento dei siti predefinita affinché venga applicata a tutti i siti.
 
-      Se il criterio viene impostato su Disattivato, vengono disattivati tutti i tipi di isolamento dei siti, inclusi quelli di siti sensibili, prove sul campo di IsolateOriginsAndroid, SitePerProcessAndroid e altre modalità di isolamento dei siti. Gli utenti possono comunque attivare il criterio manualmente.
+      Se la policy viene impostata su Disattivata, vengono disattivati tutti i tipi di isolamento dei siti, inclusi quelli di siti sensibili, prove sul campo di IsolateOriginsAndroid, SitePerProcessAndroid e altre modalità di isolamento dei siti. Gli utenti possono comunque attivare la policy manualmente.
 
-      Se il criterio non viene configurato, gli utenti possono modificare questa impostazione.
+      Se la policy non viene configurata, gli utenti possono modificare questa impostazione.
 
       <ph name="ISOLATE_ORIGINS_ANDROID_POLICY_NAME" /> potrebbe anche essere utile per l'isolamento di origini specifiche a una granularità maggiore rispetto al sito (ad es. https://a.example.com).
 
-      Nota: il supporto dell'isolamento verrà migliorato per tutti i siti su Android, ma al momento potrebbe causare problemi di prestazioni, specialmente sui dispositivi di fascia bassa. Questo criterio viene applicato solo a Chrome su dispositivi Android con più di 1 GB di RAM. Per isolare siti specifici limitando l'impatto sulle prestazioni per gli utenti, utilizza <ph name="ISOLATE_ORIGINS_ANDROID_POLICY_NAME" /> con un elenco di siti che vuoi isolare.  Per applicare il criterio a piattaforme non Androd, utilizza <ph name="SITE_PER_PROCESS_POLICY_NAME" />.</translation>
+      Nota: il supporto dell'isolamento verrà migliorato per tutti i siti su Android, ma al momento potrebbe causare problemi di prestazioni, specialmente sui dispositivi di fascia bassa. Questa policy viene applicata solo a Chrome su dispositivi Android con più di 1 GB di RAM. Per isolare siti specifici limitando l'impatto sulle prestazioni per gli utenti, utilizza <ph name="ISOLATE_ORIGINS_ANDROID_POLICY_NAME" /> con un elenco di siti che vuoi isolare.  Per applicare la policy a piattaforme non Androd, utilizza <ph name="SITE_PER_PROCESS_POLICY_NAME" />.</translation>
 <translation id="5443719869259235874">Estensioni a cui è consentito ignorare le finestre di dialogo di conferma durante l'accesso agli scanner tramite l'API chrome.documentScan</translation>
-<translation id="5445596354079213552">Questo criterio viene applicato soltanto se il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico e non rispetta la versione minima consentita di <ph name="PRODUCT_OS_NAME" /> impostata tramite il criterio <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />.
+<translation id="5445596354079213552">Questa policy viene applicata soltanto se il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico e non rispetta la versione minima consentita di <ph name="PRODUCT_OS_NAME" /> impostata tramite la policy <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />.
 
-      Se il criterio viene impostato su una stringa non vuota:
-      Se il tempo di avviso menzionato nel criterio <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" /> è scaduto, questo messaggio viene mostrato nella schermata di accesso quando il dispositivo è bloccato e nessun utente può eseguire l'accesso.
-      Se il tempo di avviso menzionato nel criterio <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" /> non è scaduto, questo messaggio viene mostrato nella pagina di gestione di Chrome dopo l'accesso da parte dell'utente.
+      Se la policy viene impostata su una stringa non vuota:
+      Se il tempo di avviso menzionato nella policy <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" /> è scaduto, questo messaggio viene mostrato nella schermata di accesso quando il dispositivo è bloccato e nessun utente può eseguire l'accesso.
+      Se il tempo di avviso menzionato nella policy <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" /> non è scaduto, questo messaggio viene mostrato nella pagina di gestione di Chrome dopo l'accesso da parte dell'utente.
 
-      Se questo criterio non viene impostato o viene lasciato vuoto, il messaggio predefinito della scadenza dell'aggiornamento automatico viene mostrato all'utente in entrambi i casi citati.
+      Se questa policy non viene impostata o viene lasciata vuota, il messaggio predefinito della scadenza dell'aggiornamento automatico viene mostrato all'utente in entrambi i casi citati.
       Il messaggio della scadenza dell'aggiornamento automatico deve essere composto da testo normale, senza alcuna formattazione. Non sono consentiti markup.</translation>
-<translation id="544654037134815017">Questo criterio controlla la visibilità delle schede visualizzate nella pagina Nuova scheda. Le schede indicano i punti di ingresso per iniziare i percorsi utente più comuni in base al comportamento di navigazione degli utenti.
+<translation id="544654037134815017">Questa policy controlla la visibilità delle schede visualizzate nella pagina Nuova scheda. Le schede indicano i punti di ingresso per iniziare i percorsi utente più comuni in base al comportamento di navigazione degli utenti.
 
-      Se il criterio è impostato su Attivato e se sono disponibili contenuti, la pagina Nuova scheda mostrerà le schede.
+      Se la policy è impostata su Attivata e se sono disponibili contenuti, la pagina Nuova scheda mostrerà le schede.
 
-      Se il criterio è impostato su Disattivato, la pagina Nuova scheda non mostrerà le schede.
+      Se la policy è impostata su Disattivata, la pagina Nuova scheda non mostrerà le schede.
 
-      Se il criterio non viene impostato, l'utente può controllare la visibilità delle schede. Nell'impostazione predefinita, le schede sono visibili.
+      Se la policy non viene impostata, l'utente può controllare la visibilità delle schede. Nell'impostazione predefinita, le schede sono visibili.
       </translation>
 <translation id="5448022937220253000">Scegli cosa fare con i dati utente dopo la disattivazione di <ph name="LACROS_NAME" /></translation>
 <translation id="5449690328792750354">L'API Event.path sarà disponibile.</translation>
@@ -6137,36 +6137,36 @@
 Viene eseguito l'override di questa policy da <ph name="POLICY_NAME" />; in particolare, se il valore di una lista bloccata è <ph name="ALL_ISOLATED_WEB_APPS" />, nessuna IWA potrà connettersi ai lettori di smart card (non verrà nemmeno chiesto agli utenti di concedere l'autorizzazione), ad eccezione di quelle elencate in <ph name="POLICY_NAME" />.
 
 Per impostazione predefinita, le IWA che specificano le autorizzazioni per le smart card all'interno del manifest possono connettersi alle smart card a condizione che l'utente conceda l'autorizzazione in modo interattivo per ogni lettore.</translation>
-<translation id="5452024130413254050">Consente di stabilire se le VM che utilizzano questa configurazione hanno accesso a un vTPM; il valore predefinito è false e, se il criterio non viene configurato, viene usato il valore <ph name="FORCE_SHUTDOWN_IF_MORE_RESTRICTED" />.</translation>
+<translation id="5452024130413254050">Consente di stabilire se le VM che utilizzano questa configurazione hanno accesso a un vTPM; il valore predefinito è false e, se la policy non viene configurata, viene usato il valore <ph name="FORCE_SHUTDOWN_IF_MORE_RESTRICTED" />.</translation>
 <translation id="5454128917282602937">Quando un utente passa da un dispositivo <ph name="PRODUCT_OS_NAME" /> a un altro dello stesso tipo, il servizio <ph name="PRODUCT_NAME" /> V2 avvia le finestre del browser e delle app del dispositivo precedente su quello nuovo.
-Se il criterio viene impostato su Enabled, le finestre del browser e delle app verranno avviate automaticamente al momento dell'accesso dall'ultimo dispositivo <ph name="PRODUCT_OS_NAME" /> utilizzato dall'utente corrente.
-Se il criterio viene impostato su Disabled o se non viene configurato, gli elementi da avviare al momento dell'accesso verranno determinati in base alle impostazioni di ripristino totale.</translation>
-<translation id="5455609857202311243">Ignora l'approvazione del criterio KDC durante l'autenticazione HTTP</translation>
+Se la policy viene impostata su Enabled, le finestre del browser e delle app verranno avviate automaticamente al momento dell'accesso dall'ultimo dispositivo <ph name="PRODUCT_OS_NAME" /> utilizzato dall'utente corrente.
+Se la policy viene impostata su Disabled o se non viene configurata, gli elementi da avviare al momento dell'accesso verranno determinati in base alle impostazioni di ripristino totale.</translation>
+<translation id="5455609857202311243">Ignora l'approvazione della policy KDC durante l'autenticazione HTTP</translation>
 <translation id="5455888515928026628">Durante l'accesso tramite la schermata di blocco, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline).
 
-      Se per questo criterio viene impostato il valore -2, verrà usato lo stesso valore del limite relativo al tempo di accesso offline nella schermata di accesso del criterio <ph name="POLICY" />.
+      Se per questa policy viene impostato il valore -2, verrà usato lo stesso valore del limite relativo al tempo di accesso offline nella schermata di accesso della policy <ph name="POLICY" />.
 
-      Se questo criterio non viene configurato o se viene impostato il valore -1, non viene applicata l'autenticazione online nella schermata di blocco e l'utente potrà usare l'autenticazione offline finché un motivo diverso da quello di questo criterio non applicherà un'autenticazione online.
+      Se questa policy non viene configurata o se viene impostato il valore -1, non viene applicata l'autenticazione online nella schermata di blocco e l'utente potrà usare l'autenticazione offline finché un motivo diverso da quello di questa policy non applicherà un'autenticazione online.
 
-      Se per il criterio viene impostato il valore 0, sarà sempre richiesta l'autenticazione online.
+      Se per la policy viene impostato il valore 0, sarà sempre richiesta l'autenticazione online.
 
-      Se per questo criterio viene impostato qualsiasi altro valore, il criterio consente di specificare il numero di giorni dall'ultima autenticazione online trascorsi i quali l'utente deve usare di nuovo l'autenticazione online per l'accesso successivo tramite la schermata di blocco.
+      Se per questa policy viene impostato qualsiasi altro valore, la policy consente di specificare il numero di giorni dall'ultima autenticazione online trascorsi i quali l'utente deve usare di nuovo l'autenticazione online per l'accesso successivo tramite la schermata di blocco.
 
-      Questo criterio viene applicato per gli utenti che si sono autenticati tramite SAML.
+      Questa policy viene applicata per gli utenti che si sono autenticati tramite SAML.
 
-      Il valore del criterio deve essere specificato in giorni.</translation>
+      Il valore della policy deve essere specificato in giorni.</translation>
 <translation id="5457065417344056871">Attiva modalità ospite nel browser</translation>
 <translation id="5457924070961220141">Consente di configurare il renderer HTML predefinito se <ph name="PRODUCT_FRAME_NAME" /> è installato. Se questa norma non viene impostata, per impostazione predefinita il rendering viene eseguito dal browser host; tuttavia, in alternativa, puoi sostituire tale impostazione e consentire che l'esecuzione del rendering delle pagine HTML venga eseguita, per impostazione predefinita, da <ph name="PRODUCT_FRAME_NAME" />.</translation>
 <translation id="545817252640069915">Attiva l'intercettazione dell'accesso</translation>
 <translation id="5460797984317417682">Attiva avviso schermo intero</translation>
 <translation id="5462898272514237681">Controlla l'accesso di <ph name="PRODUCT_OS_NAME" /> ai Servizi di geolocalizzazione di Google</translation>
-<translation id="5464786290880338716">Un criterio per controllare se la funzionalità di protezione IP di <ph name="PRIVACY_SANDBOX_NAME" /> deve essere attivata o meno.
+<translation id="5464786290880338716">Una policy per controllare se la funzionalità di protezione IP di <ph name="PRIVACY_SANDBOX_NAME" /> deve essere attivata o meno.
 
-Se il criterio viene disattivato, la funzionalità di protezione IP verrà disattivata e gli utenti non potranno attivarla tramite le impostazioni della UI.
-Se il criterio viene attivato, la funzionalità di protezione IP verrà attivata e gli utenti non potranno disattivarla tramite le impostazioni della UI.
-Se il criterio non viene configurato, la funzionalità di protezione IP verrà disattivata per gli utenti il cui browser o dispositivo viene gestito e non potranno attivare la funzionalità tramite le impostazioni della UI. Gli utenti su browser e dispositivi non gestiti potranno attivare o disattivare la funzionalità di protezione IP sul proprio dispositivo tramite le impostazioni della UI.
+Se la policy viene disattivata, la funzionalità di protezione IP verrà disattivata e gli utenti non potranno attivarla tramite le impostazioni della UI.
+Se la policy viene attivata, la funzionalità di protezione IP verrà attivata e gli utenti non potranno disattivarla tramite le impostazioni della UI.
+Se la policy non viene configurata, la funzionalità di protezione IP verrà disattivata per gli utenti il cui browser o dispositivo viene gestito e non potranno attivare la funzionalità tramite le impostazioni della UI. Gli utenti su browser e dispositivi non gestiti potranno attivare o disattivare la funzionalità di protezione IP sul proprio dispositivo tramite le impostazioni della UI.
 
-Nota: il comportamento della funzionalità di protezione IP per gli utenti aziendali potrebbe variare nel tempo se il criterio viene attivato o se non viene configurato e la funzionalità viene attivata tramite le impostazioni della UI.</translation>
+Nota: il comportamento della funzionalità di protezione IP per gli utenti aziendali potrebbe variare nel tempo se la policy viene attivata o se non viene configurata e la funzionalità viene attivata tramite le impostazioni della UI.</translation>
 <translation id="5464816904705580310">Configurazione delle impostazioni per gli utenti gestiti.</translation>
 <translation id="5466596281866046569">Segnala informazioni sulle applicazioni</translation>
 <translation id="5467175549232776406">La pagina di test dei criteri è accessibile</translation>
@@ -6179,7 +6179,7 @@
 <translation id="547601067149622666">Non consentire gli annunci su siti con annunci invasivi</translation>
 <translation id="5476152378885134514">Blocca gli appunti su questi siti</translation>
 <translation id="5479841110985196412">Attiva tastiera virtuale di accessibilità</translation>
-<translation id="5480380613778757009">Se questo criterio viene disattivato o se non viene configurato, tutte le impostazioni di visualizzazione configurate nella sessione Ospite gestita verranno reimpostate al termine della sessione. Se questo criterio viene impostato su Vero, le proprietà di visualizzazione verranno memorizzate dopo la chiusura della sessione Ospite gestita.</translation>
+<translation id="5480380613778757009">Se questa policy viene disattivata o se non viene configurata, tutte le impostazioni di visualizzazione configurate nella sessione Ospite gestita verranno reimpostate al termine della sessione. Se questa policy viene impostata su True, le proprietà di visualizzazione verranno memorizzate dopo la chiusura della sessione Ospite gestita.</translation>
 <translation id="5483012943408894695">Origini o pattern di nomi host a cui non dovrebbero essere applicate limitazioni previste per le origini non sicure.</translation>
 <translation id="5483065054530244863">Consenti i certificati SHA-1 firmati emessi dai trust anchor locali</translation>
 <translation id="5486352219019836984">Se questa policy viene attivata, si consiglia di attivare per impostazione predefinita la segnalazione anonima a Google dei dati sull'utilizzo e sugli arresti anomali di <ph name="PRODUCT_NAME" />. Gli utenti potranno comunque modificare questa impostazione.
@@ -6193,40 +6193,40 @@
 Su <ph name="MAC_OS_NAME" />, questa policy è disponibile soltanto per le istanze che sono gestite tramite MDM, aggiunte a un dominio tramite MCX o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.
 
 Per <ph name="PRODUCT_OS_NAME" />, vedi <ph name="DEVICE_METRICS_REPORTING_ENABLED_POLICY_NAME" />.</translation>
-<translation id="5486917900445838803">Se il criterio viene impostato su Attivato o se non viene configurato, viene abilitata l'accelerazione grafica, se disponibile.
+<translation id="5486917900445838803">Se la policy viene impostata su Attivata o se non viene configurata, viene abilitata l'accelerazione grafica, se disponibile.
 
-      Se il criterio viene impostato su Disattivato, l'accelerazione grafica viene disabilitata.</translation>
+      Se la policy viene impostata su Disattivata, l'accelerazione grafica viene disabilitata.</translation>
 <translation id="5487758664517243511">Se questa impostazione viene attivata, gli utenti che hanno già attivato Phone Hub possono continuare attività su ChromeOS, come ad esempio la visualizzazione di pagine web che avevano iniziato a consultare sul telefono.
 
-      Se viene disattivata, gli utenti non possono usare questa funzionalità. Gli utenti non possono usare questa funzionalità anche se viene disattivato il criterio PhoneHubAllowed.
+      Se viene disattivata, gli utenti non possono usare questa funzionalità. Gli utenti non possono usare questa funzionalità anche se viene disattivata la policy PhoneHubAllowed.
 
-      Se questo criterio non viene configurato, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
-<translation id="5488268615614906498">Questo criterio consente di stabilire se all'utente è consentito salvare file su <ph name="GOOGLE_DRIVE_NAME" /> direttamente da Gestione dei download.
-Se il criterio viene attivato o se non viene configurato, all'utente è consentito salvare file su <ph name="GOOGLE_DRIVE_NAME" /> da Gestione dei download. Se viene disattivato, gli utenti non visualizzano l'opzione in Gestione dei download.
-Questo criterio non impedisce agli utenti di salvare file su <ph name="GOOGLE_DRIVE_NAME" /> utilizzando metodi diversi da Gestione dei download.</translation>
+      Se questa policy non viene configurata, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
+<translation id="5488268615614906498">Questa policy consente di stabilire se all'utente è consentito salvare file su <ph name="GOOGLE_DRIVE_NAME" /> direttamente da Gestione dei download.
+Se la policy viene attivata o se non viene configurata, all'utente è consentito salvare file su <ph name="GOOGLE_DRIVE_NAME" /> da Gestione dei download. Se viene disattivata, gli utenti non visualizzano l'opzione in Gestione dei download.
+Questa policy non impedisce agli utenti di salvare file su <ph name="GOOGLE_DRIVE_NAME" /> utilizzando metodi diversi da Gestione dei download.</translation>
 <translation id="5494322570831642650">Consente di specificare se l'utente può aprire o meno le pagine in modalità di navigazione in incognito in <ph name="PRODUCT_NAME" />.
 
-      Se viene selezionata l'opzione "Enabled" o se il criterio non viene impostato, è possibile aprire le pagine in modalità di navigazione in incognito.
+      Se viene selezionata l'opzione "Enabled" o se la policy non viene impostata, è possibile aprire le pagine in modalità di navigazione in incognito.
 
       Se viene selezionata l'opzione "Disabled", non è possibile aprire le pagine in modalità di navigazione in incognito.
 
       Se viene selezionata l'opzione "Forced", è possibile aprire le pagine SOLTANTO in modalità di navigazione in incognito. Tieni presente che l'opzione "Forced" non funziona per Android-on-Chrome.
 
-      Nota: su iOS, se il criterio viene modificato durante una sessione, avrà effetto solamente al riavvio.</translation>
+      Nota: su iOS, se la policy viene modificata durante una sessione, avrà effetto solamente al riavvio.</translation>
 <translation id="549471902631700911">Disattiva la ricezione di sondaggi di Navigazione sicura</translation>
 <translation id="5499375345075963939">Questa norma è attiva soltanto in modalità retail.
 
       Quando il valore di questa norma è impostato e non è 0, l'utente Demo correntemente connesso verrà disconnesso automaticamente dopo che sarà trascorso il tempo di inattività della durata specificata.
 
       Il valore della norma deve essere specificato in millisecondi.</translation>
-<translation id="5501031245538651575">A partire dalla versione M110, verrà rimossa l'API window.webkitStorageInfo non standard. Questo criterio consente di riattivare l'API.
-Se questo criterio viene impostato su Enabled, l'API window.webkitStorageInfo sarà disponibile.
-Se questo criterio viene impostato su Disabled o se non viene configurato, l'API window.webkitStorageInfo non sarà disponibile.
-Questo criterio è stato rimosso nella versione M112.</translation>
-<translation id="5502683401545256109">Questo criterio controlla se all'utente viene richiesto di selezionare un certificato client nella schermata di accesso nel frame che ospita il flusso SAML quando più certificati corrispondono a <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_POLICY_NAME" />.
-      Se il criterio viene impostato su Attivato, all'utente viene richiesto di selezionare il certificato client quando il criterio di selezione automatica corrisponde a più certificati.
-      Se il criterio viene impostato su Disattivato o se non viene configurato, all'utente non verrà mai richiesto di selezionare un certificato client nella schermata di accesso.
-      Nota: in genere questo criterio non è consigliato, poiché impone dei potenziali rischi per la privacy (nel caso in cui vengano usati certificati basati su TPM a livello del dispositivo) e presenta un'esperienza utente di scarsa qualità.</translation>
+<translation id="5501031245538651575">A partire dalla versione M110, verrà rimossa l'API window.webkitStorageInfo non standard. Questa policy consente di riattivare l'API.
+Se questa policy viene impostata su Enabled, l'API window.webkitStorageInfo sarà disponibile.
+Se questa policy viene impostata su Disabled o se non viene configurata, l'API window.webkitStorageInfo non sarà disponibile.
+Questa policy è stata rimossa nella versione M112.</translation>
+<translation id="5502683401545256109">Questa policy controlla se all'utente viene richiesto di selezionare un certificato client nella schermata di accesso nel frame che ospita il flusso SAML quando più certificati corrispondono a <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_POLICY_NAME" />.
+      Se la policy viene impostata su Attivata, all'utente viene richiesto di selezionare il certificato client quando la policy di selezione automatica corrisponde a più certificati.
+      Se la policy viene impostata su Disattivata o se non viene configurata, all'utente non verrà mai richiesto di selezionare un certificato client nella schermata di accesso.
+      Nota: in genere questa policy non è consigliata, poiché impone dei potenziali rischi per la privacy (nel caso in cui vengano usati certificati basati su TPM a livello del dispositivo) e presenta un'esperienza utente di scarsa qualità.</translation>
 <translation id="5503933085302625442">Non eseguire il rollback del sistema operativo alla versione target</translation>
 <translation id="55057839818162162">Consenti la ricerca tramite fotocamera con <ph name="GOOGLE_LENS_PRODUCT_NAME" /></translation>
 <translation id="55057971769693300">Disattiva l'evidenziazione del cursore</translation>
@@ -6235,23 +6235,23 @@
 <translation id="5511702823008968136">Attiva barra dei Preferiti</translation>
 <translation id="5512418063782665071">URL pagina iniziale</translation>
 <translation id="5516293691820655022">Chiudi completamente Chrome</translation>
-<translation id="551639594034811656">Questo criterio definisce un elenco di percentuali che definiranno la frazione dei dispositivi di <ph name="PRODUCT_OS_NAME" /> nell'UO da aggiornare ogni giorno a partire dal giorno in cui l'aggiornamento viene rilevato la prima volta. L'ora del rilevamento è successiva all'ora in cui l'aggiornamento viene pubblicato, perché potrebbe passare del tempo tra la pubblicazione dell'aggiornamento e il momento in cui il dispositivo controlla la disponibilità di aggiornamenti.
+<translation id="551639594034811656">Questa policy definisce un elenco di percentuali che definiranno la frazione dei dispositivi di <ph name="PRODUCT_OS_NAME" /> nell'UO da aggiornare ogni giorno a partire dal giorno in cui l'aggiornamento viene rilevato la prima volta. L'ora del rilevamento è successiva all'ora in cui l'aggiornamento viene pubblicato, perché potrebbe passare del tempo tra la pubblicazione dell'aggiornamento e il momento in cui il dispositivo controlla la disponibilità di aggiornamenti.
 
       Ogni coppia (giorno, percentuale) contiene la percentuale dei gruppi da aggiornare entro il numero di giorni stabilito a partire dal giorno in cui l'aggiornamento viene rilevato. Ad esempio, se abbiamo le coppie [(4, 40), (10, 70), (15, 100)], allora il 40% dei gruppi deve essere aggiornato entro 4 giorni dal rilevamento dell'aggiornamento; il 70% deve essere aggiornato dopo 10 giorni e così via.
 
-      Se viene definito un valore per questo criterio, gli aggiornamenti ignoreranno il criterio <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguiranno invece questo criterio.
+      Se viene definito un valore per questa policy, gli aggiornamenti ignoreranno la policy <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguiranno invece questa policy.
 
-      Se quest'elenco è vuoto, non verrà eseguita alcuna gestione temporanea e gli aggiornamenti verranno applicati in base agli altri criteri del dispositivo.
+      Se quest'elenco è vuoto, non verrà eseguita alcuna gestione temporanea e gli aggiornamenti verranno applicati in base alle altre policy del dispositivo.
 
-      Questo criterio non viene applicato agli switch del canale.</translation>
+      Questa policy non viene applicata agli switch del canale.</translation>
 <translation id="5517825566262498086">Cancella i dati delle app ospitate</translation>
 <translation id="5519331583722582543">Un flag booleano che indica se la tastiera sullo schermo può offrire la funzionalità di inserimento tramite riconoscimento della scrittura a mano libera.</translation>
 <translation id="5519619299971727565">Disattiva la generazione di report sull'utilizzo delle app Linux</translation>
 <translation id="5521035900165046997">Attiva i report sulle informazioni Bluetooth del dispositivo</translation>
 <translation id="5521875416764302911">Impedisci agli utenti di accedere a <ph name="PRODUCT_NAME" /></translation>
-<translation id="5524944713447898270">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono aprire popup.
+<translation id="5524944713447898270">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che non possono aprire popup.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="552607466422196365">Disattiva <ph name="DBSC_FEATURE_NAME" />.</translation>
@@ -6263,16 +6263,16 @@
 <translation id="5537400155400537818">Disattivato: lo zoom CSS mantiene il comportamento pre-standard precedente.</translation>
 <translation id="553806128266843748">Un flag booleano che indica se la limitazione è attiva o meno.</translation>
 <translation id="5540885720415375851">Consenti rilevamento dei dispositivi locali</translation>
-<translation id="5542235730745104308">Se il criterio viene impostato su true, <ph name="PRODUCT_NAME" /> consente l'utilizzo di pagine di errore alternative integrate nel browser (come "pagina non trovata"). Se il criterio viene impostato su false, <ph name="PRODUCT_NAME" /> non consente mai l'utilizzo di pagine di errore alternative.
+<translation id="5542235730745104308">Se la policy viene impostata su true, <ph name="PRODUCT_NAME" /> consente l'utilizzo di pagine di errore alternative integrate nel browser (come "pagina non trovata"). Se la policy viene impostata su false, <ph name="PRODUCT_NAME" /> non consente mai l'utilizzo di pagine di errore alternative.
 
-Se il criterio viene configurato, gli utenti non possono modificarlo. Se non viene configurato, il criterio è attivo, ma gli utenti possono modificare questa impostazione.</translation>
-<translation id="5544059132156503357">La configurazione del criterio consente di determinare quali tipi di crittografia sono consentiti quando vengono richiesti ticket Kerberos a un server <ph name="MS_AD_NAME" />.
+Se la policy viene configurata, gli utenti non possono modificarla. Se non viene configurata, la policy è attiva, ma gli utenti possono modificare questa impostazione.</translation>
+<translation id="5544059132156503357">La configurazione della policy consente di determinare quali tipi di crittografia sono consentiti quando vengono richiesti ticket Kerberos a un server <ph name="MS_AD_NAME" />.
 
-La configurazione del criterio su:
+La configurazione della policy su:
 
 * Tutti consente i tipi di crittografia AES aes256-cts-hmac-sha1-96 e aes128-cts-hmac-sha1-96 e il tipo di crittografia RC4 rc4-hmac. Se il server supporta entrambi i tipi di crittografia, AES ha la precedenza.
 
-* Forte o se non viene impostato, sono consentiti solo i tipi AES.
+* Forte o se non viene impostata, sono consentiti solo i tipi AES.
 
 * Precedente, è consentito solo il tipo RC4. RC4 non è un tipo di crittografia sicuro. Dovrebbe essere utilizzato solo in circostanze molto specifiche. Se possibile, riconfigura il server perché possa supportare la crittografia AES.
 
@@ -6280,13 +6280,13 @@
 <translation id="554903022911579950">Kerberos</translation>
 <translation id="555022085242359084">Attiva l'alto contrasto nella schermata di accesso</translation>
 <translation id="555077880566103058">Consenti l'esecuzione automatica del plug-in <ph name="FLASH_PLUGIN_NAME" /> in tutti i siti</translation>
-<translation id="5555361544583789006">Se il criterio viene impostato su true o se non viene configurato, <ph name="PRODUCT_NAME" /> mostra agli utenti informazioni sul prodotto come contenuti a scheda intera.
+<translation id="5555361544583789006">Se la policy viene impostata su true o se non viene configurata, <ph name="PRODUCT_NAME" /> mostra agli utenti informazioni sul prodotto come contenuti a scheda intera.
 
-      Se il criterio viene impostato su false, <ph name="PRODUCT_NAME" /> non può mostrare le informazioni sul prodotto come contenuti a scheda intera.
+      Se la policy viene impostata su false, <ph name="PRODUCT_NAME" /> non può mostrare le informazioni sul prodotto come contenuti a scheda intera.
 
-      La configurazione del criterio consente di controllare la presentazione delle pagine di benvenuto che aiutano gli utenti ad accedere a <ph name="PRODUCT_NAME" />, di impostare <ph name="PRODUCT_NAME" /> come browser predefinito degli utenti oppure di fornire informazioni sulle caratteristiche del prodotto.
+      La configurazione della policy consente di controllare la presentazione delle pagine di benvenuto che aiutano gli utenti ad accedere a <ph name="PRODUCT_NAME" />, di impostare <ph name="PRODUCT_NAME" /> come browser predefinito degli utenti oppure di fornire informazioni sulle caratteristiche del prodotto.
 
-      Questo criterio è deprecato. Utilizza <ph name="PROMOTIONS_ENABLED_POLICY_NAME" />.</translation>
+      Questa policy è deprecata. Utilizza <ph name="PROMOTIONS_ENABLED_POLICY_NAME" />.</translation>
 <translation id="5556607617517096419">Borealis</translation>
 <translation id="5557753512027261467">Mostra l'opzione <ph name="GOOGLE_DRIVE_NAME" />.</translation>
 <translation id="5558394213067608844">Attiva il controller DTC (Diagnostics and Telemetry Controller) wilco</translation>
@@ -6299,33 +6299,33 @@
 <translation id="5561811616825571914">Seleziona automaticamente i certificati client per questi siti nella schermata di accesso</translation>
 <translation id="5561893881195372931">Disabilita alto contrasto</translation>
 <translation id="5563240289883266691">Attiva la generazione di report sull'utilizzo delle app Linux</translation>
-<translation id="5564424694465792000">Questo criterio consente di stabilire il comportamento di accesso del browser. Consente di specificare se l'utente può accedere a <ph name="PRODUCT_NAME" /> con il proprio account e usare i servizi correlati all'account come Sincronizzazione <ph name="PRODUCT_NAME" />.
+<translation id="5564424694465792000">Questa policy consente di stabilire il comportamento di accesso del browser. Consente di specificare se l'utente può accedere a <ph name="PRODUCT_NAME" /> con il proprio account e usare i servizi correlati all'account come Sincronizzazione <ph name="PRODUCT_NAME" />.
 
-      Se il criterio viene impostato su "Disattiva accesso al browser", l'utente non potrà accedere al browser e usare i servizi basati sull'account. In questo caso, le funzionalità a livello di browser come Sincronizzazione <ph name="PRODUCT_NAME" /> non potranno essere usate e non saranno disponibili. Su <ph name="IOS_NAME" />, se il criterio viene impostato su "Disattivato" dopo che l'utente ha eseguito l'accesso, l'utente verrà scollegato immediatamente. Su altre piattaforme, l'utente verrà scollegato alla successiva esecuzione di <ph name="PRODUCT_NAME" />. Su tutte le piattaforme, i dati locali del profilo, come preferiti, password e così via, verranno mantenuti e potranno essere utilizzati. L'utente potrà comunque accedere e usare i web service di Google come Gmail.
+      Se la policy viene impostata su "Disattiva accesso al browser", l'utente non potrà accedere al browser e usare i servizi basati sull'account. In questo caso, le funzionalità a livello di browser come Sincronizzazione <ph name="PRODUCT_NAME" /> non potranno essere usate e non saranno disponibili. Su <ph name="IOS_NAME" />, se la policy viene impostata su "Disattivato" dopo che l'utente ha eseguito l'accesso, l'utente verrà scollegato immediatamente. Su altre piattaforme, l'utente verrà scollegato alla successiva esecuzione di <ph name="PRODUCT_NAME" />. Su tutte le piattaforme, i dati locali del profilo, come preferiti, password e così via, verranno mantenuti e potranno essere utilizzati. L'utente potrà comunque accedere e usare i web service di Google come Gmail.
 
-      Se il criterio viene impostato su "Attiva accesso al browser", l'utente potrà accedere al browser. Su tutte le piattaforme, tranne su <ph name="IOS_NAME" />, l'utente accederà automaticamente al browser dopo che avrà eseguito l'accesso a web service di Google come Gmail. Se viene eseguito l'accesso al browser, i dati dell'account dell'utente verranno memorizzati dal browser, ma la funzione Sincronizzazione <ph name="PRODUCT_NAME" /> non verrà attivata per impostazione predefinita; per poter utilizzare questa funzionalità, l'utente dovrà attivarla separatamente. Se questo criterio viene attivato, l'utente non potrà disattivare l'impostazione che consente l'accesso al browser. Per gestire la disponibilità della funzionalità Sincronizzazione <ph name="PRODUCT_NAME" />, usa il criterio <ph name="SYNC_POLICY_NAME" />.
+      Se la policy viene impostata su "Attiva accesso al browser", l'utente potrà accedere al browser. Su tutte le piattaforme, tranne su <ph name="IOS_NAME" />, l'utente accederà automaticamente al browser dopo che avrà eseguito l'accesso a web service di Google come Gmail. Se viene eseguito l'accesso al browser, i dati dell'account dell'utente verranno memorizzati dal browser, ma la funzione Sincronizzazione <ph name="PRODUCT_NAME" /> non verrà attivata per impostazione predefinita; per poter utilizzare questa funzionalità, l'utente dovrà attivarla separatamente. Se questa policy viene attivata, l'utente non potrà disattivare l'impostazione che consente l'accesso al browser. Per gestire la disponibilità della funzionalità Sincronizzazione <ph name="PRODUCT_NAME" />, usa la policy <ph name="SYNC_POLICY_NAME" />.
 
-      Se il criterio viene impostato su "Forza accesso al browser", all'utente verrà mostrata una finestra di dialogo di selezione dell'account, da cui dovrà scegliere un account a cui accedere per usare il browser. Questa misura garantisce l'applicazione dei criteri associati all'account nell'ambito degli account gestiti. Il valore predefinito del criterio <ph name="GUEST_MODE_POLICY_NAME" /> sarà disattivato. Tieni presente che i profili esistenti a cui non viene eseguito l'accesso saranno bloccati e inaccessibili dopo l'attivazione di questo criterio. Per maggiori informazioni, leggi il seguente articolo del Centro assistenza: https://support.google.com/chrome/a/answer/7572556. Questa opzione non è supportata su <ph name="LINUX_OS_NAME" /> né su <ph name="ANDROID_NAME" />, dove, se utilizzata, verrà impostata su "Attiva accesso al browser".
+      Se la policy viene impostata su "Forza accesso al browser", all'utente verrà mostrata una finestra di dialogo di selezione dell'account, da cui dovrà scegliere un account a cui accedere per usare il browser. Questa misura garantisce l'applicazione delle policy associate all'account nell'ambito degli account gestiti. Il valore predefinito della policy <ph name="GUEST_MODE_POLICY_NAME" /> sarà disattivato. Tieni presente che i profili esistenti a cui non viene eseguito l'accesso saranno bloccati e inaccessibili dopo l'attivazione di questa policy. Per maggiori informazioni, leggi il seguente articolo del Centro assistenza: https://support.google.com/chrome/a/answer/7572556. Questa opzione non è supportata su <ph name="LINUX_OS_NAME" /> né su <ph name="ANDROID_NAME" />, dove, se utilizzata, verrà impostata su "Attiva accesso al browser".
 
-      Se questo criterio non viene configurato, l'utente potrà decidere se attivare o meno l'opzione di accesso al browser nelle impostazioni di <ph name="PRODUCT_NAME" /> e di usarla in base alle necessità.</translation>
+      Se questa policy non viene configurata, l'utente potrà decidere se attivare o meno l'opzione di accesso al browser nelle impostazioni di <ph name="PRODUCT_NAME" /> e di usarla in base alle necessità.</translation>
 <translation id="5565178130821694365">Inserimento della password richiesto ogni due giorni (48 ore)</translation>
 <translation id="5566210228171064229">Consenti la stampa con e senza PIN</translation>
 <translation id="5569504149646180067">Consente di configurare l'accesso automatico degli utenti per gli account supportati da un provider di identità cloud Microsoft®.
 
-Se questo criterio viene impostato su 1 (<ph name="POLICY_VALUE_ENABLED" />), gli utenti che accedono al computer con un account supportato da un provider di identità cloud Microsoft® (ad esempio <ph name="MS_AAD_NAME" /> o il provider di identità dell'account Microsoft® di consumo) oppure che hanno aggiunto un account di lavoro o della scuola a <ph name="MS_WIN_NAME" /> possono accedere automaticamente alle proprietà web utilizzando questa identità. Le informazioni relative al dispositivo e all'account dell'utente vengono trasmesse al provider di identità cloud dell'utente per ogni evento di autenticazione.
+Se questa policy viene impostata su 1 (<ph name="POLICY_VALUE_ENABLED" />), gli utenti che accedono al computer con un account supportato da un provider di identità cloud Microsoft® (ad esempio <ph name="MS_AAD_NAME" /> o il provider di identità dell'account Microsoft® di consumo) oppure che hanno aggiunto un account di lavoro o della scuola a <ph name="MS_WIN_NAME" /> possono accedere automaticamente alle proprietà web utilizzando questa identità. Le informazioni relative al dispositivo e all'account dell'utente vengono trasmesse al provider di identità cloud dell'utente per ogni evento di autenticazione.
 
-Se questo criterio viene impostato su 0 (<ph name="POLICY_VALUE_DISABLED" />) o se non viene configurato, l'accesso automatico come descritto sopra è disattivato.
+Se questa policy viene impostata su 0 (<ph name="POLICY_VALUE_DISABLED" />) o se non viene configurata, l'accesso automatico come descritto sopra è disattivato.
 
 Questa funzionalità è disponibile a partire da <ph name="WIN_NAME" /> 10.
 
-Nota: questo criterio non viene applicato alle modalità ospite o di navigazione in incognito.</translation>
-<translation id="5572971233886879856">Consente di specificare il sottoinsieme di server di stampa a cui verranno inviate query sulle stampanti. Si applica solo al criterio <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY" />.
+Nota: questa policy non viene applicata alle modalità ospite o di navigazione in incognito.</translation>
+<translation id="5572971233886879856">Consente di specificare il sottoinsieme di server di stampa a cui verranno inviate query sulle stampanti. Si applica solo alla policy <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY" />.
 
-      Se viene utilizzato questo criterio, soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno disponibili all'utente tramite i criteri relativi ai dispositivi.
+      Se viene utilizzata questa policy, soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy saranno disponibili all'utente tramite le policy relative ai dispositivi.
 
-      Gli ID devono corrispondere al campo "id" del file specificato nel criterio <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY" />.
+      Gli ID devono corrispondere al campo "id" del file specificato nella policy <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY" />.
 
-      Se il criterio non è configurato, il filtro viene omesso e vengono considerati tutti i server di stampa forniti da <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY" />.</translation>
+      Se la policy non è configurata, il filtro viene omesso e vengono considerati tutti i server di stampa forniti da <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY" />.</translation>
 <translation id="5573207364545428684">Consente agli utenti che accedono da remoto di trasferire file da e verso l'host remoto</translation>
 <translation id="557360560705413259">Quando questa impostazione è attiva, <ph name="PRODUCT_NAME" /> usa il nome comune di un certificato server per associare un nome host se il certificato è privo di un'estensione subjectAlternativeName, purché venga convalidato correttamente e collegato a un certificato CA installato in una posizione locale.
 
@@ -6336,11 +6336,11 @@
 <translation id="5577475143148445339">Contiene il numero di giorni e la percentuale del parco di dispositivi che dovrebbe essere aggiornata una volta trascorso il periodo indicato.</translation>
 <translation id="5582429816116769246">Consente di controllare se gli utenti possono accedere alle stampanti non aziendali.
 
-      Se il criterio viene impostato su Vero o se non viene configurato, gli utenti possono aggiungere, configurare e utilizzare le proprie stampanti native.
+      Se la policy viene impostata su True o se non viene configurata, gli utenti possono aggiungere, configurare e utilizzare le proprie stampanti native.
 
-      Se il criterio viene impostato su Falso, gli utenti non possono aggiungere né configurare le proprie stampanti native. Inoltre, non possono utilizzare nessuna delle stampanti native precedentemente configurate.
+      Se la policy viene impostata su False, gli utenti non possono aggiungere né configurare le proprie stampanti native. Inoltre, non possono utilizzare nessuna delle stampanti native precedentemente configurate.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="USER_PRINTERS_ALLOWED" />.
+      Questa policy è deprecata. Usa la policy <ph name="USER_PRINTERS_ALLOWED" />.
       </translation>
 <translation id="5582570632838248297">Confronta schede è uno strumento basato sull'AI per confrontare le informazioni nelle schede di un utente. Ad esempio, la funzionalità può essere offerta all'utente quando sono aperte più schede con prodotti in una categoria simile.
 
@@ -6360,40 +6360,40 @@
       Se questa norma non è impostata, per impostazione predefinita la funzione non è consentita per gli utenti gestiti dall'azienda ed è consentita per gli utenti non gestiti.</translation>
 <translation id="5584132346604748282">Controlla i servizi di geolocalizzazione di Google per Android</translation>
 <translation id="5584609869321980122">Avvia i ritardi di gestione dell'alimentazione e i limiti di durata delle sessioni dopo l'attività utente iniziale</translation>
-<translation id="5585298198686067735">La configurazione di questo criterio consente ai domini elencati di accedere agli URL file:// nel Visualizzatore PDF.
-Un dominio aggiunto al criterio può accedere agli URL file:// nel Visualizzatore PDF.
-Un dominio rimosso dal criterio non può accedere agli URL file:// nel Visualizzatore PDF.
-Se il criterio non viene configurato, tutti i domini non possono accedere agli URL file:// nel Visualizzatore PDF.</translation>
+<translation id="5585298198686067735">La configurazione di questa policy consente ai domini elencati di accedere agli URL file:// nel Visualizzatore PDF.
+Un dominio aggiunto alla policy può accedere agli URL file:// nel Visualizzatore PDF.
+Un dominio rimosso dalla policy non può accedere agli URL file:// nel Visualizzatore PDF.
+Se la policy non viene configurata, tutti i domini non possono accedere agli URL file:// nel Visualizzatore PDF.</translation>
 <translation id="5585424654425017599">Consenti integrazioni</translation>
 <translation id="5586942249556966598">Non fare niente</translation>
 <translation id="5598417829613725146">Canvas (supportata dalla versione 90)</translation>
-<translation id="5598821717813911176">Questo criterio consente di specificare le estensioni a cui è consentito ignorare le finestre di dialogo di conferma quando utilizzano le funzioni <ph name="GET_SCANNER_LIST_FUNCTION" /> e <ph name="START_SCAN_FUNCTION" /> di <ph name="DOCUMENTSCAN_API" />.
+<translation id="5598821717813911176">Questa policy consente di specificare le estensioni a cui è consentito ignorare le finestre di dialogo di conferma quando utilizzano le funzioni <ph name="GET_SCANNER_LIST_FUNCTION" /> e <ph name="START_SCAN_FUNCTION" /> di <ph name="DOCUMENTSCAN_API" />.
 
-Se il criterio viene impostato un elenco non vuoto ed è presente un'estensione, le relative finestre di dialogo per la conferma della scansione, in genere mostrate all'utente quando vengono chiamate le funzioni <ph name="GET_SCANNER_LIST_FUNCTION" /> o <ph name="START_SCAN_FUNCTION" />, verranno soppresse.
+Se la policy viene impostata su un elenco non vuoto ed è presente un'estensione, le relative finestre di dialogo per la conferma della scansione, in genere mostrate all'utente quando vengono chiamate le funzioni <ph name="GET_SCANNER_LIST_FUNCTION" /> o <ph name="START_SCAN_FUNCTION" />, verranno soppresse.
 
-Se il criterio non viene configurato o se viene impostato un elenco vuoto, all'utente verranno mostrate finestre di dialogo per la conferma della scansione quando vengono chiamate le funzioni <ph name="GET_SCANNER_LIST_FUNCTION" /> o <ph name="START_SCAN_FUNCTION" />.</translation>
+Se la policy non viene configurata o se viene impostato un elenco vuoto, all'utente verranno mostrate finestre di dialogo per la conferma della scansione quando vengono chiamate le funzioni <ph name="GET_SCANNER_LIST_FUNCTION" /> o <ph name="START_SCAN_FUNCTION" />.</translation>
 <translation id="5599461642204007579">Impostazioni di gestione di <ph name="MS_AD_NAME" /></translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5607021831414604820">Attiva i report sullo stato di archiviazione del dispositivo</translation>
 <translation id="5608114828230655271">Comportamento predefinito del dispositivo</translation>
-<translation id="561001683838346956">Questo criterio è stato rimosso nella versione 124 di <ph name="PRODUCT_NAME" />. A partire da quella versione, gli hash non sicuri sono sempre non consentiti. Nelle versioni precedenti, questo criterio controllava se il browser consentiva hash non sicuri precedenti durante la procedura di TLS handshake.
+<translation id="561001683838346956">Questa policy è stata rimossa nella versione 124 di <ph name="PRODUCT_NAME" />. A partire da quella versione, gli hash non sicuri sono sempre non consentiti. Nelle versioni precedenti, questa policy controllava se il browser consentiva hash non sicuri precedenti durante la procedura di TLS handshake.
 
-      Se questo criterio non viene configurato, <ph name="PRODUCT_NAME" /> segue la procedura di implementazione predefinita per non consentire gli hash non sicuri. Se il criterio viene attivato, <ph name="PRODUCT_NAME" /> consente l'uso di hash non sicuri da parte di un server durante la negoziazione di un TLS handshake. Se viene disattivato, <ph name="PRODUCT_NAME" /> non consente l'uso di hash non sicuri da parte di un server durante la negoziazione di un TLS handshake.</translation>
+      Se questa policy non viene configurata, <ph name="PRODUCT_NAME" /> segue la procedura di implementazione predefinita per non consentire gli hash non sicuri. Se la policy viene attivata, <ph name="PRODUCT_NAME" /> consente l'uso di hash non sicuri da parte di un server durante la negoziazione di un TLS handshake. Se viene disattivata, <ph name="PRODUCT_NAME" /> non consente l'uso di hash non sicuri da parte di un server durante la negoziazione di un TLS handshake.</translation>
 <translation id="5611869109049836323">Forza l'applicazione di vincoli nei trust anchor aggiunti localmente</translation>
 <translation id="561480358503796257">L'URL di un'immagine che verrà utilizzata come badge aziendale per un profilo gestito. L'URL deve indirizzare a un'immagine.
 
 Questa policy può essere impostata soltanto come policy per gli utenti.
 
 Si consiglia di utilizzare la favicon (ad esempio https://www.google.com/favicon.ico) o un'icona di dimensioni non inferiori a 48 x 48 px.</translation>
-<translation id="5614865701790130558">Registra eventi per le installazioni di estensioni basate sul criterio</translation>
-<translation id="561493980641967737">Se il criterio viene attivato, la raccolta di dati anonimizzati con chiave URL, che invia a Google gli URL delle pagine visitate dagli utenti per migliorare le ricerche e la navigazione, è sempre attiva.
+<translation id="5614865701790130558">Registra eventi per le installazioni di estensioni basate sulla policy</translation>
+<translation id="561493980641967737">Se la policy viene attivata, la raccolta di dati anonimizzati con chiave URL, che invia a Google gli URL delle pagine visitate dagli utenti per migliorare le ricerche e la navigazione, è sempre attiva.
 
-Se viene disattivato, la raccolta di dati anonimizzati con chiave URL non viene attivata.
+Se viene disattivata, la raccolta di dati anonimizzati con chiave URL non viene attivata.
 
-Se questo criterio non viene configurato, l'utente potrà modificare manualmente questa impostazione.
+Se questa policy non viene configurata, l'utente potrà modificare manualmente questa impostazione.
 
-Nel kiosk <ph name="PRODUCT_OS_NAME" />, questo criterio non offre l'opzione per consentire all'utente di decidere. Se questo criterio non viene configurato per il kiosk <ph name="PRODUCT_OS_NAME" />, la raccolta di dati anonimizzati con chiave URL è sempre attiva.
-Se viene configurato per il kiosk <ph name="PRODUCT_OS_NAME" />, questo criterio consente la raccolta di metriche con chiave URL per le app kiosk.</translation>
+Nel kiosk <ph name="PRODUCT_OS_NAME" />, questa policy non offre l'opzione per consentire all'utente di decidere. Se questa policy non viene configurata per il kiosk <ph name="PRODUCT_OS_NAME" />, la raccolta di dati anonimizzati con chiave URL è sempre attiva.
+Se viene configurata per il kiosk <ph name="PRODUCT_OS_NAME" />, questa policy consente la raccolta di metriche con chiave URL per le app kiosk.</translation>
 <translation id="5618398258385745432">L'impostazione associata veniva utilizzata prima dell'introduzione della riautenticazione per la visualizzazione delle password. Dopodiché l'impostazione e quindi la norma non hanno più inciso sul comportamento di Chrome. Ora Chrome funziona come se la norma fosse impostata in modo da disattivare la visualizzazione delle password in testo non criptato nella pagina delle impostazioni di Gestione password. Ciò significa che la pagina delle impostazioni contiene soltanto un segnaposto e che Chrome mostra la password soltanto se l'utente fa clic su "Mostra" (ed esegue la riautenticazione, se possibile). Di seguito è riportata la descrizione originale della norma.
 
           Consente di stabilire se l'utente può visualizzare le password in testo non criptato in Gestione password.
@@ -6401,13 +6401,13 @@
           Se disattivi questa impostazione, Gestione password impedisce la visualizzazione delle password memorizzate in testo non criptato nella finestra Gestione password.
 
           Se attivi questa norma o non la imposti, gli utenti potranno visualizzare le loro password in testo non criptato in Gestione password.</translation>
-<translation id="5619498195290770056">Se il criterio viene configurato, puoi creare un elenco di pattern URL che specificano i siti che non possono impostare i cookie.
+<translation id="5619498195290770056">Se la policy viene configurata, puoi creare un elenco di pattern URL che specificano i siti che non possono impostare i cookie.
 
-      Se il criterio non viene configurato, viene usato <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, viene usata <ph name="DEFAULT_COOKIES_SETTINGS_POLICY_NAME" /> per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Poiché nessun criterio specifico prevale, vedi <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_SESSION_ONLY_FOR_URLS_POLICY_NAME" />. I pattern URL di questi tre criteri non devono essere in conflitto.
+      Poiché nessuna policy specifica prevale, vedi <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_SESSION_ONLY_FOR_URLS_POLICY_NAME" />. I pattern URL di queste tre policy non devono essere in conflitto.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="5620392548325769024">Attiva la visualizzazione della pagina di benvenuto al primo avvio del browser successivo all'upgrade del sistema operativo</translation>
 <translation id="5621503441067774084">Attiva l'evidenziazione del cursore nella schermata di accesso</translation>
 <translation id="5622590774455244290">Le app per Android potrebbero decidere volontariamente se rispettare o meno questo elenco. Non è possibile imporre il rispetto dell'elenco.</translation>
@@ -6424,59 +6424,59 @@
       - Controllare i dati degli appunti condivisi tra le origini e le destinazioni.
       - Controllare il blocco degli screenshot in base alle schede di origine.
 
-      Se il criterio <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> viene impostato su True, le regole attivate vengono segnalate all'amministratore.
+      Se la policy <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> viene impostata su True, le regole attivate vengono segnalate all'amministratore.
       Il livello di limitazione può essere impostato su BLOCK, WARN o REPORT.
       - Se il livello di limitazione è impostato su BLOCK, l'azione non sarà consentita.
       - Se il livello di limitazione è impostato su WARN, l'utente verrà avvisato e potrà scegliere se continuare o annullare l'azione.
-      - Se il livello di limitazione è impostato su REPORT, l'azione dell'utente non verrà interrotta, ma verrà inviata una segnalazione se il criterio <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> è attivo.
+      - Se il livello di limitazione è impostato su REPORT, l'azione dell'utente non verrà interrotta, ma verrà inviata una segnalazione se la policy <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> è attiva.
 
       Note:
       - I pattern URL devono avere il formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
-      - Per conoscere le regole per la prevenzione delle fughe di dati specifiche di <ph name="PRODUCT_OS_NAME" />, vedi anche il criterio <ph name="DATA_LEAK_PREVENTION_RULES_LIST" />.
+      - Per conoscere le regole per la prevenzione delle fughe di dati specifiche di <ph name="PRODUCT_OS_NAME" />, vedi anche la policy <ph name="DATA_LEAK_PREVENTION_RULES_LIST" />.
 
-      Se il criterio non viene configurato, non verranno applicate limitazioni.
+      Se la policy non viene configurata, non verranno applicate limitazioni.
 
-      Questo criterio è disponibile solo per gli utenti a cui è stata assegnata una licenza Chrome Enterprise Premium.</translation>
+      Questa policy è disponibile solo per gli utenti a cui è stata assegnata una licenza Chrome Enterprise Premium.</translation>
 <translation id="5625771176514429288">Sarà consentita l'esecuzione delle app di Chrome su queste piattaforme</translation>
 <translation id="5630352020869108293">Ripristina l'ultima sessione</translation>
 <translation id="5633871703004128675">Attiva la funzione di accessibilità di evidenziazione del cursore di testo</translation>
 <translation id="5634032995857968056">Abilita la sandbox del container dell'app del renderer</translation>
 <translation id="5638334542697444045">Non consentire agli utenti di utilizzare il tethering istantaneo</translation>
-<translation id="5639454129004500060">Se viene configurato, questo criterio contiene informazioni per scaricare il file di un modello di scrivania da fornire all'utente corrente.
-      Se non viene configurato, nell'elenco di modelli di scrivanie non sarà incluso alcun modello di scrivania preconfigurato.  Se il criterio <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" /> non viene impostato su vero, questo criterio non ha alcun effetto.</translation>
+<translation id="5639454129004500060">Se viene configurata, questa policy contiene informazioni per scaricare il file di un modello di scrivania da fornire all'utente corrente.
+      Se non viene configurata, nell'elenco di modelli di scrivanie non sarà incluso alcun modello di scrivania preconfigurato.  Se la policy <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" /> non viene impostata su true, questa policy non ha alcun effetto.</translation>
 <translation id="5644038505105689131">Origine immagine schermata di accesso salvaschermo dispositivo.</translation>
 <translation id="5645779841392247734">Consenti i cookie in questi siti</translation>
-<translation id="5646234199535103501">Criterio di configurazione per il connettore OnBulkDataEntry di Chrome Enterprise</translation>
+<translation id="5646234199535103501">Policy di configurazione per il connettore OnBulkDataEntry di Chrome Enterprise</translation>
 <translation id="5648016151508002741">Impedisci l'esecuzione dei controlli <ph name="OCSP_CRL_LABEL" /> online</translation>
-<translation id="5649046890958064703">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLACKLIST" />, la configurazione del criterio <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. Gli utenti avranno a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questo criterio. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
+<translation id="5649046890958064703">Se per la policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLACKLIST" />, la configurazione della policy <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. Gli utenti avranno a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questa policy. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
-<translation id="5649773663020498924">Se questo criterio viene impostato su 2, i siti non possono usare l'autorizzazione di accesso dei siti agli appunti. Se il criterio viene impostato su 3 o se non viene configurato, l'utente può cambiare l'impostazione e stabilire se le API Clipboard sono disponibili quando un sito vuole usarne una.
+      Questa policy è deprecata. Usa la policy <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
+<translation id="5649773663020498924">Se questa policy viene impostata su 2, i siti non possono usare l'autorizzazione di accesso dei siti agli appunti. Se la policy viene impostata su 3 o se non viene configurata, l'utente può cambiare l'impostazione e stabilire se le API Clipboard sono disponibili quando un sito vuole usarne una.
 
-      È possibile eseguire l'override del criterio per pattern URL specifici utilizzando i criteri <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />.
+      È possibile eseguire l'override della policy per pattern URL specifici utilizzando le policy <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />.
 
-      Questo criterio incide soltanto sulle operazioni relative agli appunti controllate dall'autorizzazione di accesso dei siti agli appunti e non sulle scritture di appunti purificate o sulle operazioni di copia e incolla affidabili.</translation>
+      Questa policy incide soltanto sulle operazioni relative agli appunti controllate dall'autorizzazione di accesso dei siti agli appunti e non sulle scritture di appunti purificate o sulle operazioni di copia e incolla affidabili.</translation>
 <translation id="5650256117857913687">Non consente agli utenti che accedono da remoto di aprire gli URL lato host nel browser client locale</translation>
 <translation id="5650716720715977549">Applica limitazioni alle richieste agli endpoint di rete con un livello di protezione più alto</translation>
-<translation id="5651538748810288218">Se il criterio viene impostato su 1, i siti web possono accedere ai sensori, ad esempio di movimento e di luce, e usarli. Se il criterio viene impostato su 2, viene negato l'accesso ai sensori.
+<translation id="5651538748810288218">Se la policy viene impostata su 1, i siti web possono accedere ai sensori, ad esempio di movimento e di luce, e usarli. Se la policy viene impostata su 2, viene negato l'accesso ai sensori.
 
-      Se non viene configurato, si applica il criterio <ph name="ALLOW_SENSORS_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
+      Se non viene configurata, si applica la policy <ph name="ALLOW_SENSORS_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="5652250453612826983">Consente di controllare i criteri relativi alla supervisione dei genitori. Questi criteri vengono applicati soltanto agli account di minori
       e non sono configurati nella Console di amministrazione, ma direttamente dal server API Kids.</translation>
-<translation id="5654682237531873653">Se il criterio viene impostato su Attivato, viene attivata la funzionalità di controllo ortografico e gli utenti non potranno disattivarla. Su <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> e <ph name="LINUX_OS_NAME" />, le lingue per il controllo ortografico possono essere attivate o disattivate singolarmente, pertanto gli utenti possono disattivare la funzionalità di controllo ortografico disattivando ognuna di queste lingue. Per evitare questo, usa il criterio <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> per forzare l'attivazione di specifiche lingue per il controllo ortografico.
+<translation id="5654682237531873653">Se la policy viene impostata su Attivata, viene attivata la funzionalità di controllo ortografico e gli utenti non potranno disattivarla. Su <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> e <ph name="LINUX_OS_NAME" />, le lingue per il controllo ortografico possono essere attivate o disattivate singolarmente, pertanto gli utenti possono disattivare la funzionalità di controllo ortografico disattivando ognuna di queste lingue. Per evitare questo, usa la policy <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> per forzare l'attivazione di specifiche lingue per il controllo ortografico.
 
-      Se il criterio viene impostato su Disattivato, la funzionalità di controllo ortografico viene disattivata da tutte le origini e gli utenti non potranno attivarla. I criteri <ph name="SPELL_CHECK_SERVICE_ENABLED_POLICY_NAME" />, <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> e <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" /> non hanno effetto se questo criterio viene impostato su Falso.
+      Se la policy viene impostata su Disattivata, la funzionalità di controllo ortografico viene disattivata da tutte le origini e gli utenti non potranno attivarla. Le policy <ph name="SPELL_CHECK_SERVICE_ENABLED_POLICY_NAME" />, <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> e <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" /> non hanno effetto se questa policy viene impostata su False.
 
-      Se il criterio non viene configurato, gli utenti possono attivare o disattivare la funzionalità di controllo ortografico nelle impostazioni relative alla lingua. </translation>
+      Se la policy non viene configurata, gli utenti possono attivare o disattivare la funzionalità di controllo ortografico nelle impostazioni relative alla lingua. </translation>
 <translation id="5655060841667911118">Consente di specificare i certificati client che dovrebbero essere registrati usando il protocollo
 di gestione del dispositivo.
 
 L'opzione dell'algoritmo chiave <ph name="EC_KEY_ALGORITHM_VALUE_NAME" /> è supportata a partire dalla versione 132 di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="5655553344896004108">Consenti l'utilizzo dell'API U2F Security Key deprecata</translation>
 <translation id="5656177735561364047">Attiva la funzione Appunti condivisi</translation>
-<translation id="5657752663637568277">Il criterio consente di stabilire se gli avvisi relativi al ritiro di <ph name="CLOUD_PRINT_NAME" /> vengono mostrati agli utenti nella finestra di anteprima di stampa o nelle pagine di impostazioni.
-      Se il criterio viene impostato su True, gli avvisi relativi al ritiro verranno nascosti.
-      Se il criterio viene impostato su False o non viene impostato, gli avvisi relativi al ritiro verranno mostrati.</translation>
+<translation id="5657752663637568277">La policy consente di stabilire se gli avvisi relativi al ritiro di <ph name="CLOUD_PRINT_NAME" /> vengono mostrati agli utenti nella finestra di anteprima di stampa o nelle pagine di impostazioni.
+      Se la policy viene impostata su True, gli avvisi relativi al ritiro verranno nascosti.
+      Se la policy viene impostata su False o non viene impostata, gli avvisi relativi al ritiro verranno mostrati.</translation>
 <translation id="5659776687676755342">Attiva il suono della batteria in esaurimento</translation>
 <translation id="5660950553460381588">Imposta come predefinita la creazione di passkey nel portachiavi iCloud quando possibile.</translation>
 <translation id="5664848079661901346">L'API Direct Sockets consente la comunicazione con endpoint arbitrari che utilizzano TCP e UDP.
@@ -6496,20 +6496,20 @@
 Tieni presente che questa policy si applica solo se l'origine è autorizzata a utilizzare l'API Direct Sockets.
 Per maggiori dettagli, consulta <ph name="DEFAULT_DIRECT_SOCKETS_SETTING_POLICY_NAME" />, <ph name="DIRECT_SOCKETS_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="DIRECT_SOCKETS_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="5666457529647159548">Consenti agli utenti di gestire i certificati client installati.</translation>
-<translation id="5670249935663090320">Se il criterio viene attivato o se non viene configurato, si attiva <ph name="PRODUCT_NAME" /> e gli utenti possono avviarlo dal menu delle app, dai menu contestuali delle pagine, dai controlli multimediali nei siti web compatibili con Google Cast e (se presente) dall'icona Trasmetti nella barra degli strumenti.
+<translation id="5670249935663090320">Se la policy viene attivata o se non viene configurata, si attiva <ph name="PRODUCT_NAME" /> e gli utenti possono avviarlo dal menu delle app, dai menu contestuali delle pagine, dai controlli multimediali nei siti web compatibili con Google Cast e (se presente) dall'icona Trasmetti nella barra degli strumenti.
 
-Se il criterio viene disattivato, <ph name="PRODUCT_NAME" /> viene disattivato.</translation>
+Se la policy viene disattivata, <ph name="PRODUCT_NAME" /> viene disattivato.</translation>
 <translation id="5673254755365419402">Attiva la funzionalità di protezione dal fingerprinting di <ph name="PRIVACY_SANDBOX_NAME" />.</translation>
-<translation id="567377007899266033">Se il criterio viene impostato su True, Google riceverà rapporti sui principali eventi di installazione delle estensioni attivati dal criterio. Se il criterio viene impostato su False, non viene acquisito alcun evento. Se il criterio non viene impostato, il valore predefinito è True.</translation>
-<translation id="5673780539191375049">Consente di impostare l'intervallo di tempo (in minuti) utilizzato per ricaricare automaticamente il flusso di autenticazione dell'utente su <ph name="PRODUCT_OS_NAME" />. Questo criterio viene introdotto per gestire la scadenza di alcuni servizi utilizzati nei flussi di autenticazione quando il dispositivo rimane inattivo per un po' di tempo.
+<translation id="567377007899266033">Se la policy viene impostata su True, Google riceverà rapporti sui principali eventi di installazione delle estensioni attivati dalla policy. Se la policy viene impostata su False, non viene acquisito alcun evento. Se la policy non viene impostata, il valore predefinito è True.</translation>
+<translation id="5673780539191375049">Consente di impostare l'intervallo di tempo (in minuti) utilizzato per ricaricare automaticamente il flusso di autenticazione dell'utente su <ph name="PRODUCT_OS_NAME" />. Questa policy viene introdotta per gestire la scadenza di alcuni servizi utilizzati nei flussi di autenticazione quando il dispositivo rimane inattivo per un po' di tempo.
 
-Se il criterio non viene configurato o ha un valore pari a zero, il flusso di autenticazione non verrà mai ricaricato.
+Se la policy non viene configurata o ha un valore pari a zero, il flusso di autenticazione non verrà mai ricaricato.
 
-Se il criterio viene impostato su un valore positivo, il flusso di autenticazione verrà ricaricato automaticamente in base all'intervallo impostato.
+Se la policy viene impostata su un valore positivo, il flusso di autenticazione verrà ricaricato automaticamente in base all'intervallo impostato.
 
 L'intervallo di ricaricamento massimo è di una settimana (10.080 minuti).
 
-Il criterio riguarda i flussi di autenticazione di accesso e della schermata di blocco.</translation>
+La policy riguarda i flussi di autenticazione di accesso e della schermata di blocco.</translation>
 <translation id="5676740747107495269">Mostra le opzioni di accessibilità nel menu della barra delle applicazioni nella schermata di accesso</translation>
 <translation id="5679540979548648200">Impedisci agli utenti di questo dispositivo di utilizzare il processo sideload ADB e forza la funzione Powerwash del dispositivo se tale processo è stato attivato in precedenza</translation>
 <translation id="5681258683432554972">Impostazione popup predefiniti</translation>
@@ -6517,9 +6517,9 @@
 <translation id="5684501593989438324">Attiva l'hotword per l'Assistente Google</translation>
 <translation id="5688951037082618146">Mostra i badge aziendali su tutti i dispositivi</translation>
 <translation id="5689430183304951538">Dimensioni predefinite delle pagine di stampa</translation>
-<translation id="5691637243722588222">La configurazione del criterio consente di specificare quali schemi di autenticazione HTTP sono supportati da <ph name="PRODUCT_NAME" />.
+<translation id="5691637243722588222">La configurazione della policy consente di specificare quali schemi di autenticazione HTTP sono supportati da <ph name="PRODUCT_NAME" />.
 
-      Se il criterio non viene configurato, vengono utilizzati tutti e 4 gli schemi.
+      Se la policy non viene configurata, vengono utilizzati tutti e 4 gli schemi.
 
       Valori validi:
 
@@ -6536,11 +6536,11 @@
 <translation id="56936613186060503">In Gestione dei download non sarà disponibile un'opzione per salvare i file su <ph name="GOOGLE_DRIVE_NAME" />.</translation>
 <translation id="5695209488612697377">Consente di attivare l'utilizzo di un provider di ricerca predefinito nel menu contestuale.
 
-          Se il criterio viene disattivato, la voce del menu contestuale di ricerca che si basa sul tuo provider di ricerca predefinito non è disponibile.
+          Se la policy viene disattivata, la voce del menu contestuale di ricerca che si basa sul tuo provider di ricerca predefinito non è disponibile.
 
-          Se il criterio viene attivato o se non viene configurato, la voce del menu contestuale per il tuo provider di ricerca predefinito è disponibile.
+          Se la policy viene attivata o se non viene configurata, la voce del menu contestuale per il tuo provider di ricerca predefinito è disponibile.
 
-          Il valore del criterio viene applicato solo se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> viene attivato e non è applicabile in caso contrario.</translation>
+          Il valore della policy viene applicato solo se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> viene attivata e non è applicabile in caso contrario.</translation>
 <translation id="5697306356229823047">Segnala utenti dispositivo</translation>
 <translation id="5697387906103995839">Disattiva il log di sistema per le estensioni aziendali</translation>
 <translation id="569777361305162263">Disattiva la visualizzazione di contenuti promozionali a scheda intera</translation>
@@ -6563,54 +6563,54 @@
 <translation id="5728154254076636808">Consente la creazione di copie di roaming per i dati dei profili <ph name="PRODUCT_NAME" /></translation>
 <translation id="5729308727912841256">La password Kerberos. Il segnaposto <ph name="PASSWORD_PLACEHOLDER" /> viene sostituito dalla password di accesso.</translation>
 <translation id="5732972008943405952">Importa i dati della compilazione automatica dei moduli dal browser predefinito alla prima esecuzione</translation>
-<translation id="5733040281451845496">Se il criterio viene impostato su Attivato, i ritardi di gestione dell'alimentazione e i limiti di durata delle sessioni iniziano soltanto dopo il rilevamento della prima attività dell'utente in una sessione.
+<translation id="5733040281451845496">Se la policy viene impostata su Attivata, i ritardi di gestione dell'alimentazione e i limiti di durata delle sessioni iniziano soltanto dopo il rilevamento della prima attività dell'utente in una sessione.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i ritardi di gestione dell'alimentazione e il limite di tempo iniziano immediatamente all'avvio della sessione.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, i ritardi di gestione dell'alimentazione e il limite di tempo iniziano immediatamente all'avvio della sessione.</translation>
 <translation id="5733357908790472408">Utilizza Chrome Root Store.</translation>
 <translation id="5735348887833535655">Consente di stabilire se le VM che utilizzano questa configurazione hanno accesso a un vTPM; il valore predefinito è false.</translation>
 <translation id="5735915264686983150">Nascondi e blocca le funzionalità disattivate</translation>
 <translation id="5736498355107027047">Mostra il pulsante di disconnessione nella barra delle applicazioni</translation>
-<translation id="5737394734996319911">La funzione di accessibilità <ph name="PRODUCT_NAME" /> consente agli utenti di screen reader con disabilità visiva di recuperare le descrizioni delle immagini senza etichetta sul Web. Gli utenti che decidono di attivarla avranno la possibilità di usare un servizio Google anonimo per avere descrizioni automatiche delle immagini senza etichetta che trovano sul Web.
+<translation id="5737394734996319911">La funzione di accessibilità <ph name="PRODUCT_NAME" /> consente agli utenti di screen reader con disabilità visiva di recuperare le descrizioni delle immagini senza etichetta sul web. Gli utenti che decidono di attivarla avranno la possibilità di usare un servizio Google anonimo per avere descrizioni automatiche delle immagini senza etichetta che trovano sul web.
 
           Se questa funzione viene attivata, i contenuti delle immagini vengono inviati ai server di Google per generare una descrizione. Non vengono inviati cookie o altri dati utente e Google non salva né registra i contenuti delle immagini.
 
-          Se questo criterio viene impostato su Attivato, la funzione <ph name="PRODUCT_NAME" /> viene attivata, ma sarà disponibile soltanto per gli utenti che usano uno screen reader o altre tecnologie per la disabilità simili.
+          Se questa policy viene impostata su Attivata, la funzione <ph name="PRODUCT_NAME" /> viene attivata, ma sarà disponibile soltanto per gli utenti che usano uno screen reader o altre tecnologie per la disabilità simili.
 
-          Se questo criterio viene impostato su Disattivato, gli utenti non avranno la possibilità di attivare la funzione.
+          Se questa policy viene impostata su Disattivata, gli utenti non avranno la possibilità di attivare la funzione.
 
-          Se questo criterio non viene impostato, gli utenti possono decidere se usare o meno questa funzione.
+          Se questa policy non viene impostata, gli utenti possono decidere se usare o meno questa funzione.
           </translation>
-<translation id="5738766588683307797">Se il criterio <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME" /> è impostato su Disattivato, l'impostazione del criterio <ph name="USER_ACTIVITY_SCREEN_DIM_DELAY_SCALE_POLICY_NAME" /> consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando viene rilevata attività utente mentre lo schermo è oscurato o subito dopo lo spegnimento dello schermo. Quando il ritardo di oscuramento viene regolato, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo impostato in origine.
+<translation id="5738766588683307797">Se la policy <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME" /> è impostata su Disattivata, l'impostazione della policy <ph name="USER_ACTIVITY_SCREEN_DIM_DELAY_SCALE_POLICY_NAME" /> consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando viene rilevata attività utente mentre lo schermo è oscurato o subito dopo lo spegnimento dello schermo. Quando il ritardo di oscuramento viene regolato, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo impostato in origine.
 
-      Se il criterio non viene configurato, viene usato un fattore di regolazione predefinito.
+      Se la policy non viene configurata, viene usato un fattore di regolazione predefinito.
 
       Nota: il fattore di regolazione minimo deve essere 100%.</translation>
 <translation id="5740636973289452345">Attiva la generazione di report sulle informazioni relative a estensioni e plug-in</translation>
 <translation id="5741110260062082926">Disattiva Orca</translation>
 <translation id="5746149754419996562">Consente la presenza di widget Glanceables su <ph name="PRODUCT_OS_NAME" />. In particolare, i widget accessibili tramite il chip di data nella barra delle app.
-Se questo criterio viene attivato, i Glanceables sono attivati su <ph name="PRODUCT_OS_NAME" />.
-Se questo criterio viene disattivato o se non viene configurato, i Glanceables non sono attivi su <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="5749396052108288586">Questo criterio è deprecato. Usa il criterio <ph name="REMOTE_ACCESS_HOST_CLIENT_DOMAIN_LIST_POLICY_NAME" />.</translation>
+Se questa policy viene attivata, i Glanceables sono attivati su <ph name="PRODUCT_OS_NAME" />.
+Se questa policy viene disattivata o se non viene configurata, i Glanceables non sono attivi su <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="5749396052108288586">Questa policy è deprecata. Usa la policy <ph name="REMOTE_ACCESS_HOST_CLIENT_DOMAIN_LIST_POLICY_NAME" />.</translation>
 <translation id="574983287620584622">Attiva le scorciatoie delle funzioni di accessibilità nella schermata di accesso</translation>
-<translation id="5755002458331714762"> Le API Web Components v0 (Shadow DOM v0, Custom Elements v0 e HTML Imports) sono state ritirate nel 2018 e sono state disattivate per impostazione predefinita a partire dalla versione M80. Questo criterio consente di riattivare selettivamente queste funzionalità fino alla versione M84.
+<translation id="5755002458331714762"> Le API Web Components v0 (Shadow DOM v0, Custom Elements v0 e HTML Imports) sono state ritirate nel 2018 e sono state disattivate per impostazione predefinita a partire dalla versione M80. Questa policy consente di riattivare selettivamente queste funzionalità fino alla versione M84.
 
-      Se questo criterio viene impostato su True, le funzionalità Web Components v0 verranno attivate per tutti i siti.
+      Se questa policy viene impostata su True, le funzionalità Web Components v0 verranno attivate per tutti i siti.
 
-      Se questo criterio viene impostato su False o non viene impostato, le funzionalità Web Components v0 verranno disattivate per impostazione predefinita a partire dalla versione M80.
+      Se questa policy viene impostata su False o non viene impostata, le funzionalità Web Components v0 verranno disattivate per impostazione predefinita a partire dalla versione M80.
 
-      Questo criterio verrà rimosso nelle versioni successive alla versione 84 di Chrome.</translation>
+      Questa policy verrà rimossa nelle versioni successive alla versione 84 di Chrome.</translation>
 <translation id="575647238840663288">Per impostazione predefinita, i documenti potrebbero essere inseriti in cluster di agenti in base all'origine. La funzione di accesso document.domain non è configurabile per questi documenti.</translation>
 <translation id="5756680608782814094">Segnala informazioni sui VPD di un dispositivo.
 
-      Se il criterio è impostato su False o non è configurato, le informazioni non vengono segnalate.
-      Se è impostato su True, le informazioni sui VPD del dispositivo vengono segnalate.
+      Se la policy è impostata su False o non è configurata, le informazioni non vengono segnalate.
+      Se è impostata su True, le informazioni sui VPD del dispositivo vengono segnalate.
       I Vital Product Data (VPD) sono una raccolta di dati informativi e di configurazione (come numeri di serie o di componenti) associati al dispositivo.</translation>
 <translation id="5762969307102447459">Disattiva la compilazione automatica per gli indirizzi</translation>
 <translation id="5765780083710877561">Descrizione:</translation>
 <translation id="5766438888216077649">Non impostare <ph name="WINDOW_OPENER_PROPERTY" /> per i link indirizzati alla pagina <ph name="BLANK_PAGE_NAME" /></translation>
 <translation id="5767776869128458023">Disattiva pagine di errore sostitutive</translation>
 <translation id="5770738360657678870">Canale Dev (potrebbe essere instabile)</translation>
-<translation id="5774345930803672932">Se il criterio viene impostato su Vero o se non viene configurato, gli eventi, la telemetria e le informazioni possono essere segnalati alla Pipeline di reporting criptato. Se il criterio viene impostato su Falso, la Pipeline di reporting criptato viene disabilitata.</translation>
+<translation id="5774345930803672932">Se la policy viene impostata su True o se non viene configurata, gli eventi, la telemetria e le informazioni possono essere segnalati alla Pipeline di reporting criptato. Se la policy viene impostata su False, la Pipeline di reporting criptato viene disabilitata.</translation>
 <translation id="5774856474228476867">URL di ricerca del provider di ricerca predefinito</translation>
 <translation id="5775235485119094648">Carica la batteria mentre si trova in un intervallo stabilito.</translation>
 <translation id="5776485039795852974">Chiedi ogni volta che un sito desidera mostrare le notifiche desktop</translation>
@@ -6623,18 +6623,18 @@
 Se la policy viene disattivata o se non viene configurata, il processo di lancio della funzionalità del browser deciderà se utilizzare il buffering adattivo.</translation>
 <translation id="5800329278018669527">Disattiva la richiesta di configurazione di rete in modalità offline</translation>
 <translation id="5802931736499687181">Disabilita la Pipeline di reporting criptato</translation>
-<translation id="5803715507113569033">Questo criterio consente agli amministratori di configurare il montaggio di <ph name="MICROSOFT_ONE_DRIVE_NAME" />.
+<translation id="5803715507113569033">Questa policy consente agli amministratori di configurare il montaggio di <ph name="MICROSOFT_ONE_DRIVE_NAME" />.
 
-Se il criterio viene impostato su "<ph name="ALLOWED_NAME" />", l'utente può configurare <ph name="MICROSOFT_ONE_DRIVE_NAME" /> se vuole.
+Se la policy viene impostata su "<ph name="ALLOWED_NAME" />", l'utente può configurare <ph name="MICROSOFT_ONE_DRIVE_NAME" /> se vuole.
 Dopo aver completato la procedura di configurazione, <ph name="MICROSOFT_ONE_DRIVE_NAME" /> verrà montato in gestore di file.
 
-Se il criterio viene impostato su "<ph name="DISALLOWED_NAME" />", l'utente non può configurare <ph name="MICROSOFT_ONE_DRIVE_NAME" />.
+Se la policy viene impostata su "<ph name="DISALLOWED_NAME" />", l'utente non può configurare <ph name="MICROSOFT_ONE_DRIVE_NAME" />.
 
-Se il criterio viene impostato su "<ph name="AUTOMATED_NAME" />", questo tenta di configurare <ph name="MICROSOFT_ONE_DRIVE_NAME" /> automaticamente. L'utente deve accedere a <ph name="PRODUCT_OS_NAME" /> con un account Microsoft. In caso di errore, torna al flusso di configurazione.
+Se la policy viene impostata su "<ph name="AUTOMATED_NAME" />", questo tenta di configurare <ph name="MICROSOFT_ONE_DRIVE_NAME" /> automaticamente. L'utente deve accedere a <ph name="PRODUCT_OS_NAME" /> con un account Microsoft. In caso di errore, torna al flusso di configurazione.
 
-Se il criterio non viene configurato, in pratica equivale a impostarlo su "<ph name="ALLOWED_NAME" />" per gli utenti normali e su "<ph name="DISALLOWED_NAME" />" per gli utenti aziendali.
+Se la policy non viene configurata, in pratica equivale a impostarlo su "<ph name="ALLOWED_NAME" />" per gli utenti normali e su "<ph name="DISALLOWED_NAME" />" per gli utenti aziendali.
 
-È possibile aggiungere ulteriori limitazioni per gli account con il criterio <ph name="MICROSOFT_ONE_DRIVE_ACCOUNT_RESTRICTIONS" />.</translation>
+È possibile aggiungere ulteriori limitazioni per gli account con la policy <ph name="MICROSOFT_ONE_DRIVE_ACCOUNT_RESTRICTIONS" />.</translation>
 <translation id="5804795151506109282">Non chiedere agli utenti di eseguire la migrazione.</translation>
 <translation id="5806128552675651249">Consenti solo la stampa senza immagini di sfondo</translation>
 <translation id="5809210507920527553">Consente di gestire le impostazioni relative al container Linux (Crostini).</translation>
@@ -6657,11 +6657,11 @@
 
       I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo learn_more_url contiene un URL fornito dall'amministratore su cui l'utente può fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo della lingua è facoltativo e contiene la lingua in cui è scritto il messaggio. Il campo della lingua vuoto o con il valore "predefinito" indica un messaggio da utilizzare se la lingua dell'utente non ne ha uno. Il campo dei tag consente di specificare il tipo di scansioni per cui viene visualizzato il messaggio. L'elenco custom_messages può avere alcune voci o nessuna, dove per ognuna di queste i campi del messaggio e dei tag non devono essere vuoti.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="5812539307212402176">Nascondi tutti i badge aziendali</translation>
 <translation id="5814301096961727113">Impostazione stato predefinito della lettura vocale nella schermata di accesso</translation>
 <translation id="5815129011704381141">Riavvia automaticamente dopo l'aggiornamento</translation>
-<translation id="5815990343032461023">Comportamento precedente: le app di Chrome Kiosk verranno aggiornate dal sistema di estensione utilizzando l'URL di aggiornamento dal manifest dell'estensione, nonché memorizzando nella cache il gestore usando l'URL di aggiornamento dal criterio</translation>
+<translation id="5815990343032461023">Comportamento precedente: le app di Chrome Kiosk verranno aggiornate dal sistema di estensione utilizzando l'URL di aggiornamento dal manifest dell'estensione, nonché memorizzando nella cache il gestore usando l'URL di aggiornamento dalla policy</translation>
 <translation id="5816688024515869030">Disattiva il provider di <ph name="UIA_NAME" />.</translation>
 <translation id="5828008775808363753">Non aprire il browser all'avvio</translation>
 <translation id="582857022372205358">Attiva la stampa fronte/retro su lato corto</translation>
@@ -6679,72 +6679,72 @@
 <translation id="5843736977964493779">Non consentire il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /></translation>
 <translation id="5847509620317822100">Questa funzionalità è stata rimossa in Chrome 100.
 
-      Se il criterio viene impostato su Enabled, vengono visualizzati dei consigli per le app precedentemente installate dall'utente su altri dispositivi. Questi consigli vengono visualizzati in Avvio app dopo i consigli sulle app locali, se non viene inserito alcun testo di ricerca.
+      Se la policy viene impostata su Enabled, vengono visualizzati dei consigli per le app precedentemente installate dall'utente su altri dispositivi. Questi consigli vengono visualizzati in Avvio app dopo i consigli sulle app locali, se non viene inserito alcun testo di ricerca.
 
-      Se il criterio viene impostato su Disabled o se non viene configurato, questi consigli non vengono visualizzati.
+      Se la policy viene impostata su Disabled o se non viene configurata, questi consigli non vengono visualizzati.
 
-      Se viene configurato, gli utenti non possono modificarlo.</translation>
+      Se viene configurata, gli utenti non possono modificarla.</translation>
 <translation id="5851248808417680865">Usa il tema scuro</translation>
 <translation id="585270638818921943">Impedisci all'utente di usare app Android di fonti non attendibili</translation>
-<translation id="5859344336338527083">Impostare il criterio specifica quali URL sono autorizzati a installare estensioni, app e temi. Prima di <ph name="PRODUCT_NAME" /> 21, gli utenti potevano fare clic su un link a un file *.crx e <ph name="PRODUCT_NAME" /> avrebbe proposto di installare il file dopo alcuni avvisi. Successivamente, tali file devono essere scaricati e trascinati nella pagina delle impostazioni di <ph name="PRODUCT_NAME" />. Questa impostazione consente a URL specifici di utilizzare il precedente flusso di installazione semplificato.
+<translation id="5859344336338527083">Impostare la policy specifica quali URL sono autorizzati a installare estensioni, app e temi. Prima di <ph name="PRODUCT_NAME" /> 21, gli utenti potevano fare clic su un link a un file *.crx e <ph name="PRODUCT_NAME" /> avrebbe proposto di installare il file dopo alcuni avvisi. Successivamente, tali file devono essere scaricati e trascinati nella pagina delle impostazioni di <ph name="PRODUCT_NAME" />. Questa impostazione consente a URL specifici di utilizzare il precedente flusso di installazione semplificato.
 
       Ogni voce di questo elenco è un pattern di corrispondenza in stile di estensione (vedi https://developer.chrome.com/extensions/match_patterns). Gli utenti possono installare facilmente elementi da qualsiasi URL che corrisponda a una voce nell'elenco. Questi pattern devono consentire sia la posizione del file *.crx sia la pagina da cui viene avviato il download (il referrer).
 
-      <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME" /> ha la precedenza su questo criterio. Ciò significa che un'estensione presente nella lista bloccata non verrà installata, anche se è di un sito presente in questo elenco.</translation>
-<translation id="5860010874344790473">Se il criterio viene impostato su Attivato, i log di sistema vengono inviati al server di gestione per consentire agli amministratori di monitorarli.
+      <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME" /> ha la precedenza su questa policy. Ciò significa che un'estensione presente nella lista bloccata non verrà installata, anche se è di un sito presente in questo elenco.</translation>
+<translation id="5860010874344790473">Se la policy viene impostata su Attivata, i log di sistema vengono inviati al server di gestione per consentire agli amministratori di monitorarli.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i log di sistema non vengono segnalati.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, i log di sistema non vengono segnalati.</translation>
 <translation id="5861856285460256766">Configurazione codice di accesso genitori</translation>
 <translation id="5868414965372171132">Configurazione di rete a livello di utente</translation>
 <translation id="5868454276721377379">Quando un utente passa da un dispositivo <ph name="PRODUCT_OS_NAME" /> a un altro, il servizio SSO mobile ripristina lo stato dell'autenticazione dell'utente nel web service dal dispositivo precedente a quello nuovo. Ciò si ottiene trasferendo i cookie dell'utente tra i dispositivi.
 
-Se il criterio viene attivato, al momento dell'accesso lo stato dell'autenticazione dell'utente nel web service verrà ripristinato automaticamente dall'ultimo dispositivo <ph name="PRODUCT_OS_NAME" /> usato.
-Se il criterio viene disattivato o se non viene configurato, al momento dell'accesso lo stato dell'autenticazione dell'utente nel web service non verrà ripristinato su un altro dispositivo.
+Se la policy viene attivata, al momento dell'accesso lo stato dell'autenticazione dell'utente nel web service verrà ripristinato automaticamente dall'ultimo dispositivo <ph name="PRODUCT_OS_NAME" /> usato.
+Se la policy viene disattivata o se non viene configurata, al momento dell'accesso lo stato dell'autenticazione dell'utente nel web service non verrà ripristinato su un altro dispositivo.
 
-I domini dei web service di cui è stato bloccato il ripristino possono essere configurati utilizzando il criterio <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_POLICY_NAME" />, mentre le eccezioni a questo criterio possono essere configurate utilizzando il criterio <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_EXCEPTIONS_POLICY_NAME" />.
-Se entrambi i criteri non vengono configurati, tutte le autenticazioni dei web service, ad eccezione di quelle di Google, verranno trasferite.</translation>
+I domini dei web service di cui è stato bloccato il ripristino possono essere configurati utilizzando la policy <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_POLICY_NAME" />, mentre le eccezioni a questa policy possono essere configurate utilizzando la policy <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_EXCEPTIONS_POLICY_NAME" />.
+Se entrambe le policy non vengono configurate, tutte le autenticazioni dei web service, ad eccezione di quelle di Google, verranno trasferite.</translation>
 <translation id="5871786561822073630">Non consentire l'utilizzo della funzionalità di trasporto dei dizionari di compressione</translation>
-<translation id="5872327206018094848">Questo criterio consente di stabilire l'opzione della scorciatoia selezionata per la rimappatura degli eventi a
+<translation id="5872327206018094848">Questa policy consente di stabilire l'opzione della scorciatoia selezionata per la rimappatura degli eventi a
 F11 nella pagina secondaria per rimappare i tasti. Queste impostazioni si applicano solo alle
 tastiere di <ph name="PRODUCT_OS_NAME" />
-e sono disattivate per impostazione predefinita se il criterio non viene configurato. Se configuri questo criterio,
-gli utenti non potranno modificarlo o eseguirne l'override.</translation>
+e sono disattivate per impostazione predefinita se la policy non viene configurata. Se configuri questa policy,
+gli utenti non potranno modificarla o eseguirne l'override.</translation>
 <translation id="587242272905978723">Consenti a <ph name="PLUGIN_VM_NAME" /> di raccogliere i dati sull'utilizzo di <ph name="PLUGIN_VM_NAME" />.
 
-      Se il criterio è impostato su False o se non viene configurato, <ph name="PLUGIN_VM_NAME" /> non è autorizzato a raccogliere i dati.
-      Se è impostato su True, <ph name="PLUGIN_VM_NAME" /> potrebbe raccogliere i dati sull'utilizzo di <ph name="PLUGIN_VM_NAME" /> che verranno poi combinati e analizzati nel dettaglio per migliorare l'esperienza di <ph name="PLUGIN_VM_NAME" />.</translation>
+      Se la policy è impostata su False o se non viene configurata, <ph name="PLUGIN_VM_NAME" /> non è autorizzato a raccogliere i dati.
+      Se è impostata su True, <ph name="PLUGIN_VM_NAME" /> potrebbe raccogliere i dati sull'utilizzo di <ph name="PLUGIN_VM_NAME" /> che verranno poi combinati e analizzati nel dettaglio per migliorare l'esperienza di <ph name="PLUGIN_VM_NAME" />.</translation>
 <translation id="5872738620659477303">Associa le credenziali Google a un dispositivo</translation>
 <translation id="5875873062228321803">Consente di configurare il requisito della versione minima consentita di <ph name="PRODUCT_OS_NAME" />.
 
-      Se per questo criterio viene impostato un elenco non vuoto:
+      Se per questa policy viene impostato un elenco non vuoto:
       Se nessuna voce ha un valore <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> superiore alla versione corrente del dispositivo, non vengono applicate limitazioni e quelle esistenti vengono revocate.
       Se almeno una voce ha un valore <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> superiore alla versione corrente, viene scelta la voce la cui versione è superiore e più simile a quella corrente.
-      In caso di conflitto, si preferisce la voce con il valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> inferiore e il criterio viene applicato usando tale voce.
+      In caso di conflitto, si preferisce la voce con il valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> inferiore e la policy viene applicata usando tale voce.
 
       Se la versione corrente diventa obsoleta durante la sessione utente e la rete in uso limita gli aggiornamenti automatici, sullo schermo viene mostrata una notifica che invita l'utente ad aggiornare il dispositivo entro il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> mostrato nella notifica.
       Se la rete in uso consente gli aggiornamenti automatici e il dispositivo deve essere aggiornato entro il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" />, non viene mostrata alcuna notifica.
-      Il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> parte dal momento in cui viene applicato il criterio.
+      Il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> parte dal momento in cui viene applicata la policy.
       Se il dispositivo non viene aggiornato entro la scadenza del periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" />, l'utente viene disconnesso dalla sessione.
       Se la versione corrente risulta obsoleta al momento dell'accesso con il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> scaduto, all'utente viene richiesto di aggiornare il dispositivo prima di accedere.
 
       Se la versione corrente diventa obsoleta durante la sessione utente e il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico, sullo schermo viene mostrata una notifica che invita l'utente a restituire il dispositivo entro il periodo indicato nel valore <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
       Se risulta che il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico al momento dell'accesso con il periodo indicato nel valore <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> scaduto, il dispositivo viene bloccato e nessun utente può eseguire l'accesso.
 
-      Se il valore <ph name="UNMANAGED_USER_RESTRICTED_PROPERTY_NAME" /> non viene configurato o se viene impostato su Falso, le sessioni utente non gestite non ricevono notifiche e viene forzata la disconnessione.
+      Se il valore <ph name="UNMANAGED_USER_RESTRICTED_PROPERTY_NAME" /> non viene configurato o se viene impostato su False, le sessioni utente non gestite non ricevono notifiche e viene forzata la disconnessione.
 
-      Se questo criterio non viene configurato o se viene lasciato vuoto, non vengono applicate limitazioni, vengono revocate quelle esistenti e l'utente può accedere qualunque sia la versione di <ph name="PRODUCT_OS_NAME" />.
+      Se questa policy non viene configurata o se viene lasciata vuota, non vengono applicate limitazioni, vengono revocate quelle esistenti e l'utente può accedere qualunque sia la versione di <ph name="PRODUCT_OS_NAME" />.
 
       Il valore <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> può essere una versione esatta, ad esempio "13305.0.0" oppure un prefisso di versione, ad esempio "13305".
       I valori <ph name="WARNING_PERIOD_PROPERTY_NAME" /> e <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> sono facoltativi e specificati in numero di giorni. Il valore predefinito è 0, a indicare nessun periodo di avviso.
-      Il valore <ph name="UNMANAGED_USER_RESTRICTED_PROPERTY_NAME" /> è una proprietà facoltativa, il cui valore predefinito è Falso.</translation>
+      Il valore <ph name="UNMANAGED_USER_RESTRICTED_PROPERTY_NAME" /> è una proprietà facoltativa, il cui valore predefinito è False.</translation>
 <translation id="5879014913445067283">Consente di controllare la funzione Condivisioni file di rete tramite il protocollo <ph name="NETBIOS_NAME" /></translation>
 <translation id="588135807064822874">Attiva la funzione Tocca per cercare</translation>
 <translation id="5882345429632338713">Ritardo prima di avviare il browser alternativo (in millisecondi)</translation>
 <translation id="5883015257301027298">Impostazione cookie predefiniti</translation>
 <translation id="5883631290631802010">Attiva Traduzione dal Vivo</translation>
-<translation id="5883754873839596178">La configurazione del criterio consente di specificare il numero massimo di connessioni simultanee al server proxy. Alcuni server proxy non riescono a gestire un numero elevato di connessioni contemporanee per client, ma è sufficiente impostare il criterio su un numero inferiore per risolvere questo problema. Il valore deve essere inferiore a 100 e superiore a 6. Alcune app web sono note per richiedere molte connessioni con Hanging-GET, pertanto impostare un valore inferiore a 32 potrebbe causare interruzioni di rete del browser se sono aperte troppe app web di questo tipo. È sconsigliato utilizzare un valore inferiore a quello predefinito.
+<translation id="5883754873839596178">La configurazione della policy consente di specificare il numero massimo di connessioni simultanee al server proxy. Alcuni server proxy non riescono a gestire un numero elevato di connessioni contemporanee per client, ma è sufficiente impostare la policy su un numero inferiore per risolvere questo problema. Il valore deve essere inferiore a 100 e superiore a 6. Alcune app web sono note per richiedere molte connessioni con Hanging-GET, pertanto impostare un valore inferiore a 32 potrebbe causare interruzioni di rete del browser se sono aperte troppe app web di questo tipo. È sconsigliato utilizzare un valore inferiore a quello predefinito.
 
-      Se il criterio non viene configurato, viene utilizzato il valore predefinito 32.</translation>
+      Se la policy non viene configurata, viene utilizzato il valore predefinito 32.</translation>
 <translation id="5887414688706570295">Consente di configurare il prefisso TalkGadget che verrà utilizzato dagli host di accesso remoto e impedisce agli utenti di modificarlo.
 
           Se specificato, questo prefisso viene anteposto al nome TalkGadget di base per creare un nome di dominio completo per TalkGadget. Il nome TalkGadget di base del dominio è "Talkgadget.google.com".
@@ -6754,33 +6754,33 @@
           Se questa impostazione è disabilitata o non è impostata, verrà utilizzato il nome di dominio predefinito di TalkGadget ("chromoting-host.talkgadget.google.com") per tutti gli host.
 
           I client di accesso remoto non sono interessati da questa impostazione e utilizzeranno sempre "chromoting-client.talkgadget.google.com" per accedere a TalkGadget.</translation>
-<translation id="5887517293968987221">Questo criterio consente di stabilire se avviare gli eseguibili dell'host nativo direttamente su Windows.
+<translation id="5887517293968987221">Questa policy consente di stabilire se avviare gli eseguibili dell'host nativo direttamente su Windows.
 
-      Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> deve avviare host di messaggistica nativi implementati direttamente come eseguibili.
+      Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> deve avviare host di messaggistica nativi implementati direttamente come eseguibili.
 
-      Se il criterio viene impostato su Disattivato, <ph name="PRODUCT_NAME" /> avvierà gli host che utilizzano cmd.exe come processo intermedio.
+      Se la policy viene impostata su Disattivata, <ph name="PRODUCT_NAME" /> avvierà gli host che utilizzano cmd.exe come processo intermedio.
 
-      Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> può decidere quale approccio usare.</translation>
+      Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> può decidere quale approccio usare.</translation>
 <translation id="5888645257599699215">Segnala lo stato dell'audio dei dispositivi</translation>
-<translation id="5888861702011257917">La modalità Niente distrazioni è una funzionalità che controlla la modalità Non disturbare con un timer e ha lo scopo di ridurre le distrazioni dell'utente. Una funzionalità della modalità Niente distrazioni consente agli utenti di ascoltare un numero limitato di brani per aiutarli a concentrarsi. Questo criterio consente di stabilire l'accesso a questa funzionalità.
+<translation id="5888861702011257917">La modalità Niente distrazioni è una funzionalità che controlla la modalità Non disturbare con un timer e ha lo scopo di ridurre le distrazioni dell'utente. Una funzionalità della modalità Niente distrazioni consente agli utenti di ascoltare un numero limitato di brani per aiutarli a concentrarsi. Questa policy consente di stabilire l'accesso a questa funzionalità.
 
-Se il criterio non viene configurato, tutti i suoni sono disattivati per gli utenti gestiti.
+Se la policy non viene configurata, tutti i suoni sono disattivati per gli utenti gestiti.
 
-Se il criterio viene attivato, sarà possibile accedere a tutti i suoni in modalità Niente distrazioni.
+Se la policy viene attivata, sarà possibile accedere a tutti i suoni in modalità Niente distrazioni.
 
-Se il criterio viene impostato su EnabledFocusSoundsOnly, l'audio verrà attivato solo con Suoni della modalità Niente distrazioni.
+Se la policy viene impostata su EnabledFocusSoundsOnly, l'audio verrà attivato solo con Suoni della modalità Niente distrazioni.
 
-Se il criterio viene disattivato, l'audio verrà disattivato in modalità Niente distrazioni.</translation>
+Se la policy viene disattivata, l'audio verrà disattivato in modalità Niente distrazioni.</translation>
 <translation id="5890063326284543943">Controlla l'utilizzo dell'API Serial</translation>
 <translation id="5893223274510346852">Disattiva la funzionalità di protezione IP di <ph name="PRIVACY_SANDBOX_NAME" />.</translation>
-<translation id="5893303508158298667">Se il criterio <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> è impostato su Attivato e il criterio <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> viene impostato su Attivato o non viene configurato, viene consentito l'utilizzo di client remoti per usare relay server per collegarsi al computer quando non è disponibile una connessione diretta, ad esempio a causa di limitazioni del firewall.
+<translation id="5893303508158298667">Se la policy <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> è impostata su Attivata e la policy <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> viene impostata su Attivata o non viene configurata, viene consentito l'utilizzo di client remoti per usare relay server per collegarsi al computer quando non è disponibile una connessione diretta, ad esempio a causa di limitazioni del firewall.
 
-      Se il criterio viene impostato su Disattivato, non viene disattivato l'accesso remoto, ma sono consentite soltanto connessioni dalla stessa rete (non da NAT Traversal o relay).</translation>
+      Se la policy viene impostata su Disattivata, non viene disattivato l'accesso remoto, ma sono consentite soltanto connessioni dalla stessa rete (non da NAT Traversal o relay).</translation>
 <translation id="5895569286536062756">Attiva Seleziona per ascoltare nella schermata di accesso</translation>
 <translation id="5895861015839311441">Consente di generare report sui dati di telemetria di utilizzo delle app per gli utenti affiliati.
 
-      La configurazione del criterio consente di controllare i report sulla telemetria di utilizzo delle app per i tipi di app specificati.
-      Se il criterio non viene configurato, non verranno generati report sulla telemetria di utilizzo delle app.</translation>
+      La configurazione della policy consente di controllare i report sulla telemetria di utilizzo delle app per i tipi di app specificati.
+      Se la policy non viene configurata, non verranno generati report sulla telemetria di utilizzo delle app.</translation>
 <translation id="5897234314586602143">Mostra intestazioni e piè di pagina nell'anteprima di stampa</translation>
 <translation id="5897913798715600338">Carica la batteria con la tecnologia di ricarica veloce.</translation>
 <translation id="5898486742390981550">Quando più utenti eseguono l'accesso, solo l'utente principale può utilizzare le app Android.</translation>
@@ -6817,16 +6817,16 @@
 Su <ph name="MAC_OS_NAME" />, questa policy è disponibile soltanto per le istanze che sono gestite tramite MDM, aggiunte a un dominio tramite MCX o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.</translation>
 <translation id="5905114360004248993">Consenti popup su questi siti</translation>
 <translation id="5905473632148429217">Attiva controlli OCSP/CRL online</translation>
-<translation id="5908808391744484238">Se viene attivato o se non viene configurato, il filtro del parametro URL potrebbe rimuovere alcuni parametri quando un utente seleziona "Apri link in finestra di navigazione in incognito" dal menu contestuale.
-      Se viene disattivato, non viene applicato alcun filtro.
-      Questo criterio è temporaneo e potrebbe essere rimosso in una release futura.</translation>
-<translation id="5910810837616572201">Se per il criterio <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLACKLIST" />, la configurazione del criterio <ph name="NATIVE_PRINTERS_BULK_BLACKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. L'utente avrà a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questo criterio. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="BULK_PRINTERS_POLICY_NAME" />.
+<translation id="5908808391744484238">Se viene attivata o se non viene configurata, il filtro del parametro URL potrebbe rimuovere alcuni parametri quando un utente seleziona "Apri link in finestra di navigazione in incognito" dal menu contestuale.
+      Se viene disattivata, non viene applicato alcun filtro.
+      Questa policy è temporanea e potrebbe essere rimossa in una release futura.</translation>
+<translation id="5910810837616572201">Se per la policy <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLACKLIST" />, la configurazione della policy <ph name="NATIVE_PRINTERS_BULK_BLACKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. L'utente avrà a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questa policy. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="BULK_PRINTERS_POLICY_NAME" />.
 
-      Questo criterio è deprecato. Usa il criterio <ph name="PRINTERS_BULK_BLOCKLIST" />.</translation>
+      Questa policy è deprecata. Usa la policy <ph name="PRINTERS_BULK_BLOCKLIST" />.</translation>
 <translation id="591088232153082363">Ricarica adattiva della batteria sulla base dei pattern di utilizzo batteria.</translation>
-<translation id="5915023683182228340">Se il criterio viene impostato su Attivato o se non viene configurato, è consentito utilizzare il protocollo QUIC in <ph name="PRODUCT_NAME" />.
+<translation id="5915023683182228340">Se la policy viene impostata su Attivata o se non viene configurata, è consentito utilizzare il protocollo QUIC in <ph name="PRODUCT_NAME" />.
 
-      Se viene impostato su Disattivato, non è consentito utilizzare il protocollo QUIC.</translation>
+      Se viene impostata su Disattivata, non è consentito utilizzare il protocollo QUIC.</translation>
 <translation id="5916855682471300200">I criteri relativi al cloud in ambito computer hanno la precedenza sui criteri relativi al computer della piattaforma</translation>
 <translation id="5917425424971710623">Non segnalare informazioni su eventi di rilevamento e risposta estesi (XDR)</translation>
 <translation id="5917897389577978190">Gmail (supportato a partire dalla versione 135)</translation>
@@ -6841,50 +6841,50 @@
 <translation id="5927903236543424081">Obbliga gli utenti ad accedere prima di utilizzare il browser</translation>
 <translation id="5928633129285224981">Controlla se <ph name="PRODUCT_NAME" /> rende l'opzione Stampa come immagine da impostare per impostazione predefinita per la stampa di un PDF.
 
-      Se questo criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> imposterà per impostazione predefinita l'opzione Stampa come immagine nella finestra Anteprima di stampa per la stampa di un PDF.
+      Se questa policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> imposterà per impostazione predefinita l'opzione Stampa come immagine nella finestra Anteprima di stampa per la stampa di un PDF.
 
-      Se questo criterio è impostato su Disattivato o non viene impostato, in <ph name="PRODUCT_NAME" /> la selezione dell'utente per l'opzione Stampa come immagine sarà inizialmente non impostata.  L'utente potrà selezionarla per ogni singolo processo di stampa PDF, se l'opzione è disponibile.
+      Se questa policy è impostata su Disattivata o non viene impostata, in <ph name="PRODUCT_NAME" /> la selezione dell'utente per l'opzione Stampa come immagine sarà inizialmente non impostata.  L'utente potrà selezionarla per ogni singolo processo di stampa PDF, se l'opzione è disponibile.
 
-      Per <ph name="MS_WIN_NAME" /> o <ph name="MAC_OS_NAME" /> questo criterio ha un solo effetto se è selezionato anche <ph name="PRINT_PDF_AS_IMAGE_AVAILABILITY_POLICY_NAME" />.</translation>
-<translation id="5932383301001325587">Questo criterio è stato rimosso da M53 dopo la rimozione del fallback della versione TLS da <ph name="PRODUCT_NAME" />.
+      Per <ph name="MS_WIN_NAME" /> o <ph name="MAC_OS_NAME" /> questa policy ha un solo effetto se è selezionato anche <ph name="PRINT_PDF_AS_IMAGE_AVAILABILITY_POLICY_NAME" />.</translation>
+<translation id="5932383301001325587">Questa policy è stata rimossa da M53 dopo la rimozione del fallback della versione TLS da <ph name="PRODUCT_NAME" />.
 
       Se un handshake TLS non va a buon fine, <ph name="PRODUCT_NAME" /> riproverà a stabilire la connessione con una versione precedente di TLS per risolvere i bug nei server HTTPS. Questa impostazione consente di configurare la versione in cui verrà interrotto questo processo di fallback. Se un server esegue correttamente la negoziazione della versione (cioè senza interrompere la connessione), questa impostazione non viene applicata. In ogni caso, la connessione risultante deve essere conforme a SSLVersionMin.
 
-      Se questo criterio non viene configurato o se viene impostato su "tls1.2", <ph name="PRODUCT_NAME" /> non eseguirà più il fallback. Il supporto per le versioni precedenti di TLS non viene disattivato, solo se <ph name="PRODUCT_NAME" /> eviterà i server che presentano errori e che non sono in grado di negoziare correttamente le versioni.
+      Se questa policy non viene configurata o se viene impostata su "tls1.2", <ph name="PRODUCT_NAME" /> non eseguirà più il fallback. Il supporto per le versioni precedenti di TLS non viene disattivato, solo se <ph name="PRODUCT_NAME" /> eviterà i server che presentano errori e che non sono in grado di negoziare correttamente le versioni.
 
-      In caso contrario, se è necessario mantenere la compatibilità con un server con errori, è possibile impostare questo criterio su "tls1.1". Si tratta di una misura temporanea ed è necessario sistemare rapidamente il server.</translation>
+      In caso contrario, se è necessario mantenere la compatibilità con un server con errori, è possibile impostare questa policy su "tls1.1". Si tratta di una misura temporanea ed è necessario sistemare rapidamente il server.</translation>
 <translation id="5932767795525445337">Questa policy può essere utilizzata anche per bloccare app per Android.</translation>
 <translation id="5936193585187054065">Encrypted ClientHello (ECH) è un'estensione TLS per criptare i campi sensibili di ClientHello e aumentare la privacy.
 
-      Se questo criterio non viene configurato o se viene impostato su enabled, <ph name="PRODUCT_NAME" /> seguirà la procedura di lancio predefinita di ECH. Se viene disattivato, <ph name="PRODUCT_NAME" /> non abiliterà ECH.
+      Se questa policy non viene configurata o se viene impostata su enabled, <ph name="PRODUCT_NAME" /> seguirà la procedura di lancio predefinita di ECH. Se viene disattivata, <ph name="PRODUCT_NAME" /> non abiliterà ECH.
 
       Se la funzionalità viene attivata, <ph name="PRODUCT_NAME" /> potrebbe utilizzare o meno ECH, a seconda del supporto del server, della disponibilità del record DNS HTTPS o dello stato del lancio.
 
-      ECH è un protocollo in continua evoluzione, quindi l'implementazione di <ph name="PRODUCT_NAME" /> è soggetta a modifiche. Pertanto, questo criterio è una misura temporanea per controllare l'implementazione sperimentale iniziale. Verrà sostituito con i controlli finali una volta completato il protocollo.</translation>
+      ECH è un protocollo in continua evoluzione, quindi l'implementazione di <ph name="PRODUCT_NAME" /> è soggetta a modifiche. Pertanto, questa policy è una misura temporanea per controllare l'implementazione sperimentale iniziale. Verrà sostituita con i controlli finali una volta completato il protocollo.</translation>
 <translation id="5939873071468124100">Limita gli account che possono utilizzare l'integrazione <ph name="MICROSOFT_ONE_DRIVE_NAME" /></translation>
 <translation id="5945312246863177268">Non consente agli utenti di fare clic sulla notifica di Phone Hub per avviare l'applicazione Eche.</translation>
 <translation id="5946082169633555022">Canale Beta</translation>
 <translation id="5946329690214660966">Imposta una pianificazione personalizzata per verificare la presenza di aggiornamenti</translation>
 <translation id="5946401994049024050">Impostazioni di connessione alle smart card</translation>
-<translation id="5950069117106131681">Se il criterio viene impostato su Attivato, vengono attivati intestazioni e piè di pagina nell'anteprima di stampa. Se il criterio viene impostato su Disattivato, questi elementi vengono disattivati nell'anteprima di stampa.
+<translation id="5950069117106131681">Se la policy viene impostata su Attivata, vengono attivati intestazioni e piè di pagina nell'anteprima di stampa. Se la policy viene impostata su Disattivata, questi elementi vengono disattivati nell'anteprima di stampa.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo. In caso contrario, gli utenti possono decidere se visualizzare o meno intestazioni e piè di pagina.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla. In caso contrario, gli utenti possono decidere se visualizzare o meno intestazioni e piè di pagina.</translation>
 <translation id="5951418260805607969">Mostra una notifica quando lo spazio sul disco è in esaurimento</translation>
 <translation id="5958746038080720143">Attiva le ottimizzazioni WPAD (Web Proxy Auto-Discovery)</translation>
 <translation id="5961137303188584693">Indirizzo MAC NIC integrato del dispositivo</translation>
-<translation id="5961565154633996542">Se il criterio viene impostato, le origini aggiuntive elencate possono accedere alle autorizzazioni del browser (ad esempio posizione, fotocamera, microfono) già disponibili per l'origine di installazione delle applicazioni kiosk web.
+<translation id="5961565154633996542">Se la policy viene impostata, le origini aggiuntive elencate possono accedere alle autorizzazioni del browser (ad esempio posizione, fotocamera, microfono) già disponibili per l'origine di installazione delle applicazioni kiosk web.
 
-Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="5962271004971310788">Estensioni di cui l'utente deve consentire l'esecuzione in incognito per poter navigare in questa modalità</translation>
 <translation id="5963752574792883406">porta 990 (può essere sbloccata fino al 01/02/2022)</translation>
-<translation id="596523880465577341">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="EXTENSION_INSTALL_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="596523880465577341">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="EXTENSION_INSTALL_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="5966615072639944554">Estensioni autorizzate a utilizzare l'API di attestazione da remoto</translation>
 <translation id="596732417280023843">Il nome del profilo di certificato.</translation>
 <translation id="5972538402066550344">Consenti i controlli di reporting granulare</translation>
 <translation id="5973437409890460481">Consenti le connessioni di accesso remoto aziendali a questo computer</translation>
-<translation id="5975765799383881158">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono inviare dei feedback a Google tramite una combinazione di tasti o nella sezione Menu &gt; Guida &gt; Segnala un problema.
+<translation id="5975765799383881158">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono inviare dei feedback a Google tramite una combinazione di tasti o nella sezione Menu &gt; Guida &gt; Segnala un problema.
 
-      Se viene impostato su Disattivato, gli utenti non possono inviare dei feedback a Google.</translation>
+      Se viene impostata su Disattivata, gli utenti non possono inviare dei feedback a Google.</translation>
 <translation id="5976636832661103220">Le impostazioni di F11 usano la scorciatoia che contiene il tasto di modifica Maiusc</translation>
 <translation id="5979376378555121803">Applicazione in hosting</translation>
 <translation id="5981308440856672205">L'API Direct Sockets consente la comunicazione con endpoint arbitrari che utilizzano TCP e UDP.
@@ -6911,64 +6911,64 @@
 <translation id="5984237109586500246">Accetta i contenuti web pubblicati con la tecnologia Signed HTTP Exchange</translation>
 <translation id="5987654816293745077">Segnala i contatori del tempo di esecuzione del dispositivo</translation>
 <translation id="5991707691018985057">Mostra la finestra di dialogo di annullamento quando viene chiamato event.preventDefault() per l'evento beforeunload. Non mostrare la finestra di dialogo di annullamento quando event.returnValue è la stringa vuota dell'evento beforeunload.</translation>
-<translation id="5992485316563377005">Se il criterio viene impostato su Attivato o se non viene configurato, l'integrità del codice del renderer viene attivata.
+<translation id="5992485316563377005">Se la policy viene impostata su Attivata o se non viene configurata, l'integrità del codice del renderer viene attivata.
 
-      Se viene impostato su Disattivato, la sicurezza e la stabilità di <ph name="PRODUCT_NAME" /> diminuiranno, in quanto codice sconosciuto e potenzialmente dannoso può essere caricato all'interno dei processi del renderer di <ph name="PRODUCT_NAME" />. Disattivalo solo se si verificano dei problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno dei processi del renderer di <ph name="PRODUCT_NAME" />.
+      Se viene impostata su Disattivata, la sicurezza e la stabilità di <ph name="PRODUCT_NAME" /> diminuiranno, in quanto codice sconosciuto e potenzialmente dannoso può essere caricato all'interno dei processi del renderer di <ph name="PRODUCT_NAME" />. Disattivala solo se si verificano dei problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno dei processi del renderer di <ph name="PRODUCT_NAME" />.
 
-      Questo criterio è stato rimosso nella versione 118 di Chrome e viene ignorato se viene impostato.
+      Questa policy è stata rimossa nella versione 118 di Chrome e viene ignorata se viene impostata.
 
-      Nota: scopri di più sui criteri relativi alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
+      Nota: scopri di più sulle policy relative alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
 <translation id="5994438001592408007">I Glanceables sono attivati per gli utenti.</translation>
 <translation id="5997543603646547632">Utilizza orologio di 24 ore per impostazione predefinita</translation>
 <translation id="5997846976342452720">Specifica se disattivare o meno la ricerca dei plug-in (ritirata)</translation>
-<translation id="5998198091336830580">Questo criterio fa parte del seguente gruppo atomico (vengono applicati soltanto i criteri dell'origine con la priorità massima presenti nel gruppo):</translation>
+<translation id="5998198091336830580">Questa policy fa parte del seguente gruppo atomico (vengono applicati soltanto le policy dell'origine con la priorità massima presenti nel gruppo):</translation>
 <translation id="6001621991816939414">Cancella la cronologia dei download</translation>
 <translation id="600402562436559989">Consenti la sincronizzazione delle configurazioni di reti Wi-Fi tra i dispositivi <ph name="PRODUCT_OS_NAME" /> e un telefono Android connesso</translation>
 <translation id="6004575267180297869">
-      Consente di specificare se i moduli WebAssembly possono essere inviati a un'altra finestra o un altro worker tra origini. La condivisione di moduli WebAssembly tra origini sarà deprecata nell'ambito del lavoro per ritirare document.domain; visita la pagina https://github.com/mikewest/deprecating-document-domain. Questo criterio consente di riattivare la condivisione di moduli WebAssembly tra origini per offrire un periodo di transizione più lungo durante la procedura di ritiro.
+      Consente di specificare se i moduli WebAssembly possono essere inviati a un'altra finestra o un altro worker tra origini. La condivisione di moduli WebAssembly tra origini sarà deprecata nell'ambito del lavoro per ritirare document.domain; visita la pagina https://github.com/mikewest/deprecating-document-domain. Questa policy consente di riattivare la condivisione di moduli WebAssembly tra origini per offrire un periodo di transizione più lungo durante la procedura di ritiro.
 
-      Se questo criterio viene impostato su Vero, i siti possono inviare moduli WebAssembly anche tra origini senza limitazioni.
+      Se questa policy viene impostata su True, i siti possono inviare moduli WebAssembly anche tra origini senza limitazioni.
 
-      Se viene impostato su Falso o se non viene configurato, i siti possono inviare moduli WebAssembly solo a finestre e worker nella stessa origine.</translation>
+      Se viene impostata su False o se non viene configurata, i siti possono inviare moduli WebAssembly solo a finestre e worker nella stessa origine.</translation>
 <translation id="6008497706608447728">Elenco di domini bloccati del servizio SSO mobile</translation>
-<translation id="6009419785187615211">Questo criterio consente di stabilire il trattamento dei moduli non sicuri (i moduli inviati tramite HTTP) incorporati in siti protetti (HTTPS) nel browser.
-       Se il criterio viene attivato o non viene configurato, viene mostrato un avviso a pagina intera quando viene inviato un modulo non sicuro. Viene inoltre mostrato un fumetto di avviso accanto ai campi dei moduli quando vengono selezionati e la compilazione automatica viene disattivata per questi moduli.
-       Se il criterio viene disattivato, non vengono mostrati avvisi per i moduli non sicuri e la compilazione automatica funzionerà normalmente.
+<translation id="6009419785187615211">Questa policy consente di stabilire il trattamento dei moduli non sicuri (i moduli inviati tramite HTTP) incorporati in siti protetti (HTTPS) nel browser.
+       Se la policy viene attivata o non viene configurata, viene mostrato un avviso a pagina intera quando viene inviato un modulo non sicuro. Viene inoltre mostrato un fumetto di avviso accanto ai campi dei moduli quando vengono selezionati e la compilazione automatica viene disattivata per questi moduli.
+       Se la policy viene disattivata, non vengono mostrati avvisi per i moduli non sicuri e la compilazione automatica funzionerà normalmente.
 
-       Questo criterio è stato pensato per essere rimosso in Chrome 130.</translation>
+       Questa policy è stata pensata per essere rimossa in Chrome 130.</translation>
 <translation id="6011193465932186973">Impronta</translation>
 <translation id="6011969832398368671">Consenti ai siti di richiedere all'utente l'accesso di scrittura di file e directory</translation>
 <translation id="601234435141599215">Consenti il port forwarding nelle macchine virtuali Linux</translation>
 <translation id="6012952794649558174">Usa comportamento predefinito del browser</translation>
-<translation id="6015281292796053435">Questo criterio consente di stabilire se segnalare o meno le informazioni di Navigazione sicura, inclusi il numero dell'avviso di Navigazione sicura e il numero del relativo clickthrough.
+<translation id="6015281292796053435">Questa policy consente di stabilire se segnalare o meno le informazioni di Navigazione sicura, inclusi il numero dell'avviso di Navigazione sicura e il numero del relativo clickthrough.
 
-      Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, viene ignorato.
+      Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, viene ignorata.
 
-      Se il criterio non viene configurato o viene impostato su True, i dati di Navigazione sicura vengono raccolti.
-      Se il criterio viene impostato su False, i dati di Navigazione sicura non vengono raccolti.
+      Se la policy non viene configurata o viene impostata su True, i dati di Navigazione sicura vengono raccolti.
+      Se la policy viene impostata su False, i dati di Navigazione sicura non vengono raccolti.
 
-      Questo criterio viene applicato soltanto se la macchina viene registrata con il criterio <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-      Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="6016304107003486747">Questo criterio determina il comportamento della rimappatura del tasto Canc nella
+      Questa policy viene applicata soltanto se la macchina viene registrata con la policy <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+      Questa policy viene sempre applicata per <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="6016304107003486747">Questa policy determina il comportamento della rimappatura del tasto Canc nella
 pagina secondaria "Rimappa i tasti". La pagina secondaria "Rimappa i tasti" consente agli utenti di
-personalizzare i tasti della tastiera. Se abilitato, questo criterio impedisce agli utenti di
-personalizzare queste rimappature specifiche. Se il criterio non viene configurato,
+personalizzare i tasti della tastiera. Se abilitata, questa policy impedisce agli utenti di
+personalizzare queste rimappature specifiche. Se la policy non viene configurata,
 le scorciatoie basate sul tasto Ricerca saranno quelle predefinite e agli utenti sarà consentita
 la configurazione.</translation>
 <translation id="6019162469732742754">Usa la Modalità automatica</translation>
 <translation id="6019606564278029236">Attiva l'interazione degli utenti remoti con finestre con privilegi più elevati nelle sessioni di assistenza remota</translation>
-<translation id="602038990586229155">Questo criterio controlla le richieste di installazione delle estensioni di <ph name="PRODUCT_NAME" /> consentendo agli utenti di inviare alla Console di amministrazione Google le richieste per l'approvazione.
+<translation id="602038990586229155">Questa policy controlla le richieste di installazione delle estensioni di <ph name="PRODUCT_NAME" /> consentendo agli utenti di inviare alla Console di amministrazione Google le richieste per l'approvazione.
 
-Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, questo criterio viene ignorato e le richieste di installazione delle estensioni non vengono create né caricate.
-Se questo criterio non viene configurato o viene disattivato, le richieste di installazione delle estensioni non vengono create né caricate.
-Se il criterio viene attivato, le richieste di installazione delle estensioni vengono create e caricate nella Console di amministrazione Google.
+Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, questa policy viene ignorata e le richieste di installazione delle estensioni non vengono create né caricate.
+Se questa policy non viene configurata o viene disattivata, le richieste di installazione delle estensioni non vengono create né caricate.
+Se la policy viene attivata, le richieste di installazione delle estensioni vengono create e caricate nella Console di amministrazione Google.
 
-Le richieste di installazione delle estensioni vengono create quando gli utenti tentano di installare un'estensione non autorizzata dal criterio <ph name="EXTENSION_INSTALL_ALLOWLIST" /> o <ph name="EXTENSION_SETTINGS" />.
+Le richieste di installazione delle estensioni vengono create quando gli utenti tentano di installare un'estensione non autorizzata da <ph name="EXTENSION_INSTALL_ALLOWLIST" /> o <ph name="EXTENSION_SETTINGS" />.
 
-Questo criterio viene applicato soltanto se la macchina viene registrata con il criterio <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="6020795917180493154">A partire dalla versione M119, se questo criterio viene impostato su false o se non viene configurato, WebSQL è disattivato, ma può essere attivato tramite il flag di Chrome "web-sql-access". Se il criterio viene impostato su true, l'accesso a WebSQL viene attivato.
-Questo criterio è stato ritirato a partire dalla versione M124.</translation>
+Questa policy viene applicata soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+Questa policy viene sempre applicata per <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="6020795917180493154">A partire dalla versione M119, se questa policy viene impostata su false o se non viene configurata, WebSQL è disattivato, ma può essere attivato tramite il flag di Chrome "web-sql-access". Se la policy viene impostata su true, l'accesso a WebSQL viene attivato.
+Questa policy è stata ritirata a partire dalla versione M124.</translation>
 <translation id="6022948604095165524">Azione all'avvio</translation>
 <translation id="602318745029752898">Consenti le voci di sintesi vocale di rete migliorate in di Seleziona per ascoltare</translation>
 <translation id="6026722971789064331">Controlla l'utilizzo dell'API file system per la scrittura</translation>
@@ -6976,11 +6976,11 @@
 <translation id="603410445099326293">Parametri per l'URL del suggerimento che utilizza POST</translation>
 <translation id="6034341625190551415">Consente di controllare tipi di account kiosk e sessioni pubbliche.</translation>
 <translation id="6035597431797865964">Consenti di memorizzare le proprietà di visualizzazione della sessione Ospite gestita</translation>
-<translation id="6036459377708946958">Il giorno del mese [1-31] in cui dovrebbe essere eseguito il controllo della disponibilità di aggiornamenti, nel fuso orario locale del dispositivo. Questo criterio viene usato soltanto se il valore del criterio "frequency" è "MONTHLY". Se questo numero supera il numero di giorni massimo presente in un mese specifico, verrà scelto l'ultimo giorno del mese.</translation>
+<translation id="6036459377708946958">Il giorno del mese [1-31] in cui dovrebbe essere eseguito il controllo della disponibilità di aggiornamenti, nel fuso orario locale del dispositivo. Questa policy viene usata soltanto se il valore della policy "frequency" è "MONTHLY". Se questo numero supera il numero di giorni massimo presente in un mese specifico, verrà scelto l'ultimo giorno del mese.</translation>
 <translation id="6036523166753287175">Abilita attraversamento firewall da host di accesso remoto</translation>
-<translation id="603768430528561926">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti dei dispositivi aziendali possono riscattare le offerte tramite la registrazione a <ph name="PRODUCT_OS_NAME" />.
+<translation id="603768430528561926">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti dei dispositivi aziendali possono riscattare le offerte tramite la registrazione a <ph name="PRODUCT_OS_NAME" />.
 
-      Se viene impostato su Disattivato, gli utenti non possono riscattare tali offerte.</translation>
+      Se viene impostata su Disattivata, gli utenti non possono riscattare tali offerte.</translation>
 <translation id="603779881955332593">Fogli Google (supportato a partire versione 135)</translation>
 <translation id="6042407236638640864">Consenti la memorizzazione nella cache back-forward delle pagine con l'intestazione <ph name="CACHE_CONTROL_NO_STORE_NAME" /></translation>
 <translation id="604243460476563291">Disattiva il trasferimento di file nelle connessioni di assistenza da remoto da parte degli amministratori aziendali</translation>
@@ -6994,34 +6994,34 @@
 <translation id="6053260874233331700">Non consentire l'accesso alla geolocalizzazione nella schermata di accesso.</translation>
 <translation id="6053681087509103368">Consenti a WebRTC di usare versioni obsolete del protocollo TLS/DTLS</translation>
 <translation id="6056517174496942473">Attiva flusso di attestazione <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL</translation>
-<translation id="6058879286588763839">A meno che <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> non venga specificato, sovrascrivendo <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> consente di specificare il criterio di gestione della modalità di ricarica della batteria (se supportato dal dispositivo). Per estendere la durata della batteria, il criterio controlla dinamicamente la ricarica della batteria riducendo al minimo l'usura e preservandone l'efficienza.
+<translation id="6058879286588763839">A meno che <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> non venga specificata, sovrascrivendo <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> consente di specificare la policy di gestione della modalità di ricarica della batteria (se supportato dal dispositivo). Per estendere la durata della batteria, la policy controlla dinamicamente la ricarica della batteria riducendo al minimo l'usura e preservandone l'efficienza.
 
-      Se il criterio non viene configurato (se l'impostazione è supportata dal dispositivo), viene applicata la modalità di ricarica standard della batteria e gli utenti non possono modificarlo.
+      Se la policy non viene configurata (se l'impostazione è supportata dal dispositivo), viene applicata la modalità di ricarica standard della batteria e gli utenti non possono modificarlo.
 
-      Nota: se viene selezionata la modalità di ricarica personalizzata della batteria, vengono specificati anche i criteri <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME" /> e <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" />.</translation>
-<translation id="6066761914755798079">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_SUGGEST_URL_POLICY_NAME" /> consente di specificare l'URL del motore di ricerca per fornire suggerimenti per le ricerche. L'URL dovrebbe includere la stringa <ph name="SEARCH_TERM_MARKER" />, sostituita nella query dai termini di ricerca degli utenti.
+      Nota: se viene selezionata la modalità di ricarica personalizzata della batteria, vengono specificate anche le policy <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME" /> e <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" />.</translation>
+<translation id="6066761914755798079">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_SUGGEST_URL_POLICY_NAME" /> consente di specificare l'URL del motore di ricerca per fornire suggerimenti per le ricerche. L'URL dovrebbe includere la stringa <ph name="SEARCH_TERM_MARKER" />, sostituita nella query dai termini di ricerca degli utenti.
 
       Puoi specificare l'URL di ricerca di Google come: <ph name="GOOGLE_SUGGEST_SEARCH_URL" />.</translation>
 <translation id="606742564823687992">Non vengono segnalati i processi di stampa</translation>
 <translation id="6070667616071269965">Layout da tastiera della schermata di accesso del dispositivo</translation>
 <translation id="6074963268421707432">Non consentire la visualizzazione di notifiche desktop da parte dei siti</translation>
 <translation id="6074964551275531965">Imposta il periodo di tempo per le notifiche relative agli aggiornamenti</translation>
-<translation id="6075316301208933536">Se il criterio <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> viene impostato su <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" /> consente di personalizzare quando viene interrotta la ricarica della batteria, in base alla percentuale di carica. Il valore del criterio <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME" /> deve essere inferiore di almeno 5 punti percentuali rispetto a quello del criterio <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" />.
+<translation id="6075316301208933536">Se la policy <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> viene impostata su <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" /> consente di personalizzare quando viene interrotta la ricarica della batteria, in base alla percentuale di carica. Il valore della policy <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME" /> deve essere inferiore di almeno 5 punti percentuali rispetto a quello della policy <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" />.
 
-      Se il criterio non viene configurato, viene applicata la modalità di ricarica della batteria di <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" />.</translation>
-<translation id="6082161804984853051">L'impostazione del criterio determina l'utilizzo da parte di <ph name="PRODUCT_NAME" /> della directory che fornisci per l'archiviazione dei file memorizzati nella cache sul disco, indipendentemente dalla specificazione del flag --disk-cache-dir da parte degli utenti.
+      Se la policy non viene configurata, viene applicata la modalità di ricarica della batteria di <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" />.</translation>
+<translation id="6082161804984853051">L'impostazione della policy determina l'utilizzo da parte di <ph name="PRODUCT_NAME" /> della directory che fornisci per l'archiviazione dei file memorizzati nella cache sul disco, indipendentemente dalla specificazione del flag --disk-cache-dir da parte degli utenti.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_NAME" /> utilizza la directory della cache predefinita, ma gli utenti possono modificare l'impostazione tramite il flag della riga di comando --disk-cache-dir.
+      Se la policy non viene impostata, <ph name="PRODUCT_NAME" /> utilizza la directory della cache predefinita, ma gli utenti possono modificare l'impostazione tramite il flag della riga di comando --disk-cache-dir.
 
-      <ph name="PRODUCT_NAME" /> gestisce i contenuti della directory principale di un volume. Per prevenire la perdita di dati o altri errori, non impostare questo criterio nella directory principale né sulle directory utilizzate per altri scopi. Vedi le variabili che puoi utilizzare (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation>
-<translation id="6082391187598394288">Questo criterio può essere usato temporaneamente per forzare l'attivazione del supporto dell'API PPB_VideoDecoder(Dev).
+      <ph name="PRODUCT_NAME" /> gestisce i contenuti della directory principale di un volume. Per prevenire la perdita di dati o altri errori, non impostare questa policy nella directory principale né sulle directory utilizzate per altri scopi. Vedi le variabili che puoi utilizzare (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation>
+<translation id="6082391187598394288">Questa policy può essere usata temporaneamente per forzare l'attivazione del supporto dell'API PPB_VideoDecoder(Dev).
 
-Se il criterio non viene configurato o se viene impostato su Disabled, il browser deciderà se l'API è supportata o meno.
-Se il criterio viene impostato su Enabled, l'API sarà supportata.
+Se la policy non viene configurata o se viene impostata su Disabled, il browser deciderà se l'API è supportata o meno.
+Se la policy viene impostata su Enabled, l'API sarà supportata.
 
-Questo criterio può essere usato qualora la nostra procedura in corso di eliminazione del supporto di questa API presenti problemi. Se devi usare il criterio, invia una segnalazione di bug su crbug.com spiegando il tuo caso d'uso e aggiungendo in copia per conoscenza {blundell, vasilyt}@chromium.org. Il criterio è disponibile tramite la versione 114 di <ph name="PRODUCT_NAME" />, dopodiché il supporto per questa API è stato eliminato incondizionatamente.
+Questa policy può essere usata qualora la nostra procedura in corso di eliminazione del supporto di questa API presenti problemi. Se devi usare la policy, invia una segnalazione di bug su crbug.com spiegando il tuo caso d'uso e aggiungendo in copia per conoscenza {blundell, vasilyt}@chromium.org. La policy è disponibile tramite la versione 114 di <ph name="PRODUCT_NAME" />, dopodiché il supporto per questa API è stato eliminato incondizionatamente.
 
-NOTA: le modifiche apportate a questo criterio verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
+NOTA: le modifiche apportate a questa policy verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
 <translation id="6083631234867522991">Windows (client Windows):</translation>
 <translation id="608788685013546076">Imposta un valore percentuale per il limite di consumo della batteria per la variazione dei picchi energetici</translation>
 <translation id="6089679180657323464">Consente di stabilire le impostazioni del controller DTC (Diagnostics and Telemetry Controller) wilco.</translation>
@@ -7051,11 +7051,11 @@
 <translation id="610892566190435199">Attiva i report sullo stato di alimentazione del dispositivo</translation>
 <translation id="6111936128861357925">Attiva il gioco del dinosauro</translation>
 <translation id="6118226055960302400">Ripristina il comportamento permissivo.</translation>
-<translation id="6119207979839638596">Questo criterio è stato rimosso da M75 dopo la rimozione del criterio della versione TLS massima da <ph name="PRODUCT_NAME" />.
+<translation id="6119207979839638596">Questa policy è stata rimossa da M75 dopo la rimozione della policy della versione TLS massima da <ph name="PRODUCT_NAME" />.
 
-      Se questo criterio non viene configurato, <ph name="PRODUCT_NAME" /> utilizza la versione massima predefinita.
+      Se questa policy non viene configurata, <ph name="PRODUCT_NAME" /> utilizza la versione massima predefinita.
 
-      In caso contrario, il criterio potrebbe essere impostato su uno dei seguenti valori: "tls1.2" o "tls1.3". Se viene impostato, <ph name="PRODUCT_NAME" /> non utilizzerà versioni di SSL/TLS successive alla versione specificata. Un valore non riconosciuto verrà ignorato.</translation>
+      In caso contrario, la policy potrebbe essere impostata su uno dei seguenti valori: "tls1.2" o "tls1.3". Se viene impostata, <ph name="PRODUCT_NAME" /> non utilizzerà versioni di SSL/TLS successive alla versione specificata. Un valore non riconosciuto verrà ignorato.</translation>
 <translation id="6120909112796019291">Consenti l'editing di foto con AI generativa e migliora i modelli di AI.</translation>
 <translation id="6123052603197028610">Non consentire query ai server Google per recuperare i timestamp</translation>
 <translation id="6128539430475678271">Blocca l'API Controlled Frame su questi siti</translation>
@@ -7069,34 +7069,34 @@
 
 È possibile visualizzare massimo 25 immagini nel salvaschermo. Verranno utilizzate soltanto le prime 25 voci di URL dell'elenco.
 
-Questo criterio non avrà alcun effetto se il criterio <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" /> viene impostato su false.
+Questa policy non avrà alcun effetto se la policy <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" /> viene impostata su false.
 
-Se questo criterio non viene configurato o se l'elenco non contiene riferimenti a immagini validi, il salvaschermo per la schermata di blocco non verrà visualizzato, a prescindere dal valore impostato nel criterio <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" />.</translation>
+Se questa policy non viene configurata o se l'elenco non contiene riferimenti a immagini validi, il salvaschermo per la schermata di blocco non verrà visualizzato, a prescindere dal valore impostato nella policy <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" />.</translation>
 <translation id="6135398260575578389">Navigazione sicura è attiva in modalità potenziata. Questa modalità fornisce maggior sicurezza, ma non richiede la condivisione di ulteriori dati di navigazione con Google.</translation>
 <translation id="6135552820180449830">Crosh (supporto dalla versione 99)</translation>
 <translation id="6138636318340561140">Controlla lo stato degli URL in tempo reale con Navigazione sicura</translation>
 <translation id="6141402445226505817">Utilizza sempre il rilevamento approssimativo del fuso orario</translation>
 <translation id="6141944295566709543">Consenti agli utenti di riprodurre contenuti multimediali quando il dispositivo è bloccato</translation>
 <translation id="6142501278956229253">DPI stampa PDF con rasterizzazione</translation>
-<translation id="6143167485225352920">Se il criterio viene impostato su true o se non viene configurato, gli utenti gestiti possono utilizzare ARC su dispositivi non affiliati, a meno che ARC sia stato disattivato in altri modi. Se il criterio viene impostato su false, gli utenti gestiti non possono utilizzare ARC su dispositivi non affiliati.
+<translation id="6143167485225352920">Se la policy viene impostata su true o se non viene configurata, gli utenti gestiti possono utilizzare ARC su dispositivi non affiliati, a meno che ARC sia stato disattivato in altri modi. Se la policy viene impostata su false, gli utenti gestiti non possono utilizzare ARC su dispositivi non affiliati.
 
-Tieni presente che altre limitazioni, come quelle imposte dai criteri ArcEnabled e UnaffiliatedArcAllowed, continuano a essere rispettate e ARC viene disattivato se uno dei criteri lo specifica.</translation>
-<translation id="6144046700495610112">Se il criterio viene impostato su Attivato, i dati di compilazione automatica dei moduli nel precedente browser predefinito verranno importati alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, nessun dato di compilazione automatica dei moduli verrà importato alla prima esecuzione.
+Tieni presente che altre limitazioni, come quelle imposte dalle policy ArcEnabled e UnaffiliatedArcAllowed, continuano a essere rispettate e ARC viene disattivato se una delle policy lo specifica.</translation>
+<translation id="6144046700495610112">Se la policy viene impostata su Attivata, i dati di compilazione automatica dei moduli nel precedente browser predefinito verranno importati alla prima esecuzione. Se la policy viene impostata su Disattivata o se non viene configurata, nessun dato di compilazione automatica dei moduli verrà importato alla prima esecuzione.
 
-      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo dei dati di compilazione automatica dei moduli verrà selezionata o deselezionata in modo che corrisponda al valore del criterio.</translation>
+      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo dei dati di compilazione automatica dei moduli verrà selezionata o deselezionata in modo che corrisponda al valore della policy.</translation>
 <translation id="614551633868957694">App ed estensioni di Chrome</translation>
 <translation id="614616930188030377">I pattern di questo elenco verranno confrontati con l'origine di sicurezza dell'URL richiedente.
       Se viene trovata una corrispondenza o se chrome://flags/#enable-webrtc-hide-local-ips-with-mdns è disattivato, gli indirizzi IP locali vengono mostrati nei candidati ICE WebRTC.
       In caso contrario, gli indirizzi IP locali vengono nascosti tramite nomi host mDNS.
-      Tieni presente che questo criterio riduce la sicurezza degli indirizzi IP locali se richiesto dagli amministratori.</translation>
+      Tieni presente che questa policy riduce la sicurezza degli indirizzi IP locali se richiesto dagli amministratori.</translation>
 <translation id="614662973812186053">Questa norma controlla anche la raccolta dei dati diagnostici e sull'utilizzo di Android.</translation>
 <translation id="614665605501218241">Consenti ai siti elencati di effettuare richieste agli endpoint di rete con un livello di protezione più alto in modo non sicuro.</translation>
 <translation id="614753473456574270">Non consentire agli utenti di impostare un PIN inefficace</translation>
-<translation id="6150044272483721831">Questo criterio consente di stabilire se la personalizzazione delle scorciatoie di sistema è consentita.
+<translation id="6150044272483721831">Questa policy consente di stabilire se la personalizzazione delle scorciatoie di sistema è consentita.
 
-Se questo criterio viene attivato o se non viene configurato, gli utenti potranno personalizzare le scorciatoie di sistema tramite l'app Scorciatoie da tastiera.
+Se questa policy viene attivata o se non viene configurata, gli utenti potranno personalizzare le scorciatoie di sistema tramite l'app Scorciatoie da tastiera.
 
-Se questo criterio viene disattivato, l'app Scorciatoie da tastiera sarà in modalità di sola lettura, impedendo qualsiasi personalizzazione.</translation>
+Se questa policy viene disattivata, l'app Scorciatoie da tastiera sarà in modalità di sola lettura, impedendo qualsiasi personalizzazione.</translation>
 <translation id="6150320133676152520">Disattiva l'invio automatico del PIN nella schermata di blocco e accesso</translation>
 <translation id="6155350825868160236">Consenti all'utente di decidere se usare o meno servizi web di Google per correggere gli errori ortografici</translation>
 <translation id="6155936611791017817">Impostazione stato predefinito del puntatore grande nella schermata di accesso</translation>
@@ -7104,66 +7104,66 @@
 <translation id="6158324314836466367">Nome del web store dell'azienda (obsoleta)</translation>
 <translation id="6162385223000257668">Esegui la migrazione dei file locali su Google Drive e nascondi le cartelle locali</translation>
 <translation id="6164441518097008843">Limita l'accesso a un elenco di utenti</translation>
-<translation id="6169504363239921686">Se il criterio è impostato su <ph name="BR_ENABLED" />, il backup e ripristino di Android è inizialmente attivo. Se il criterio è impostato su <ph name="BR_DISABLED" /> o se non è configurato, il backup e ripristino rimane disattivato durante la configurazione.
+<translation id="6169504363239921686">Se la policy è impostata su <ph name="BR_ENABLED" />, il backup e ripristino di Android è inizialmente attivo. Se la policy è impostata su <ph name="BR_DISABLED" /> o se non è configurata, il backup e ripristino rimane disattivato durante la configurazione.
 
-Se il criterio è impostato su <ph name="BR_UNDER_USER_CONTROL" />, agli utenti viene chiesto di utilizzare il backup e ripristino. Se gli utenti attivano il backup e ripristino, i dati delle app Android vengono caricati sui server di backup di Android e ripristinati durante la reinstallazione delle app.
+Se la policy è impostata su <ph name="BR_UNDER_USER_CONTROL" />, agli utenti viene chiesto di utilizzare il backup e ripristino. Se gli utenti attivano il backup e ripristino, i dati delle app Android vengono caricati sui server di backup di Android e ripristinati durante la reinstallazione delle app.
 
 Dopo la configurazione iniziale, gli utenti possono attivare o disattivare il backup e ripristino.</translation>
 <translation id="6169768162756928771">Impostazioni di gestione dell'identità degli utenti GAIA</translation>
 <translation id="6170316094401732532">Non limitare l'impostazione Modalità solo HTTPS degli utenti</translation>
 <translation id="6172110090237528457">Consente di configurare il salvaschermo a livello di dispositivo per la schermata di accesso.
 
-Se questo criterio viene impostato su true, quando il dispositivo <ph name="PRODUCT_OS_NAME" /> sarà inattivo verrà mostrato un salvaschermo nella schermata di accesso.
+Se questa policy viene impostata su true, quando il dispositivo <ph name="PRODUCT_OS_NAME" /> sarà inattivo verrà mostrato un salvaschermo nella schermata di accesso.
 
-Se questo criterio viene impostato su false o se non viene configurato, il salvaschermo non verrà visualizzato nella schermata di accesso.
+Se questa policy viene impostata su false o se non viene configurata, il salvaschermo non verrà visualizzato nella schermata di accesso.
 
-Il salvaschermo del dispositivo mostra le immagini a cui fa riferimento il criterio <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_IMAGES_POLICY_NAME" />. Se il criterio <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_IMAGES_POLICY_NAME" /> non viene configurato o se viene impostato un elenco vuoto oppure un elenco senza immagini valide, il salvaschermo per la schermata di accesso non verrà visualizzato.
+Il salvaschermo del dispositivo mostra le immagini a cui fa riferimento la policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_IMAGES_POLICY_NAME" />. Se la policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_IMAGES_POLICY_NAME" /> non viene configurata o se viene impostato un elenco vuoto oppure un elenco senza immagini valide, il salvaschermo per la schermata di accesso non verrà visualizzato.
 
-È possibile modificare il timeout di inattività per l'avvio del salvaschermo e il tempo di visualizzazione di un'immagine rispettivamente con i criteri <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_IDLE_TIMEOUT_SECONDS_POLICY_NAME" /> e <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_DISPLAY_INTERVAL_SECONDS_POLICY_NAME" />. Se questi criteri non vengono configurati, verranno usati i relativi valori predefiniti.</translation>
-<translation id="6172896675583897796">Se il criterio viene impostato su Attivato, l'Assistente Google potrà accedere al contesto dello schermo e inviare i dati al server. Se il criterio è impostato su Disattivato, l'Assistente Google non potrà accedere al contesto dello schermo.
+È possibile modificare il timeout di inattività per l'avvio del salvaschermo e il tempo di visualizzazione di un'immagine rispettivamente con le policy <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_IDLE_TIMEOUT_SECONDS_POLICY_NAME" /> e <ph name="DEVICE_SCREENSAVER_LOGIN_SCREEN_DISPLAY_INTERVAL_SECONDS_POLICY_NAME" />. Se queste policy non vengono configurate, verranno usati i relativi valori predefiniti.</translation>
+<translation id="6172896675583897796">Se la policy viene impostata su Attivata, l'Assistente Google potrà accedere al contesto dello schermo e inviare i dati al server. Se la policy è impostata su Disattivata, l'Assistente Google non potrà accedere al contesto dello schermo.
 
-      Se il criterio non viene configurato, gli utenti potranno decidere se attivare o disattivare la funzionalità.</translation>
+      Se la policy non viene configurata, gli utenti potranno decidere se attivare o disattivare la funzionalità.</translation>
 <translation id="6173712557351728099">Consenti agli utenti di attivare o disattivare il Wi-Fi</translation>
 <translation id="6178075938488052838">Questa norma consente di stabilire chi può avviare una sessione di <ph name="PRODUCT_OS_NAME" />. Non impedisce agli utenti di accedere ad altri Account Google su Android. Se invece vuoi impedirlo, configura la norma <ph name="ACCOUNT_TYPES_WITH_MANAGEMENT_DISABLED_CLOUDDPC_POLICY_NAME" /> specifica per Android nell'ambito della norma <ph name="ARC_POLICY_POLICY_NAME" />.</translation>
 <translation id="6181304954168534748">L'hash SHA-256 del modello di scrivania.</translation>
 <translation id="6181618732396778048">Non consentire a nessun sito di richiedere l'accesso di scrittura di file e directory</translation>
-<translation id="6181783961196084973">Il valore dell'opzione di attivazione/disattivazione della raccolta di attività nelle app. Se il criterio viene impostato su vero, l'attività nelle app dell'utente verrà segnalata al server per poter essere visualizzata nell'app <ph name="PRODUCT_NAME" /> del figlio e del genitore. Se il criterio viene impostato su falso, la funzionalità Limiti di utilizzo per app rimarrà disponibile, ma non verranno segnalati dati al server, che quindi non verranno visualizzati in <ph name="PRODUCT_NAME" />.</translation>
+<translation id="6181783961196084973">Il valore dell'opzione di attivazione/disattivazione della raccolta di attività nelle app. Se la policy viene impostata su true, l'attività nelle app dell'utente verrà segnalata al server per poter essere visualizzata nell'app <ph name="PRODUCT_NAME" /> del figlio e del genitore. Se la policy viene impostata su false, la funzionalità Limiti di utilizzo per app rimarrà disponibile, ma non verranno segnalati dati al server, che quindi non verranno visualizzati in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6182206125906000651">Disattiva gli upgrade a HTTPS.</translation>
 <translation id="6182563940865917569">Consenti a Chrome di riprodurre automaticamente i contenuti multimediali</translation>
-<translation id="618635925649844912">Questo criterio consente di stabilire se mostrare o meno all'utente la schermata introduttiva per le funzionalità di AI all'interno della sessione durante il primo flusso di accesso.
+<translation id="618635925649844912">Questa policy consente di stabilire se mostrare o meno all'utente la schermata introduttiva per le funzionalità di AI all'interno della sessione durante il primo flusso di accesso.
 
-      Se impostato su Disattivato, la schermata introduttiva dell'AI non verrà mostrata.
+      Se impostata su Disattivata, la schermata introduttiva dell'AI non verrà mostrata.
 
-      Se impostato su Attivato, la schermata introduttiva dell'AI verrà mostrata.
+      Se impostata su Attivata, la schermata introduttiva dell'AI verrà mostrata.
 
-      Se non viene configurato, la schermata introduttiva dell'AI verrà ignorata per gli utenti gestiti a livello aziendale e mostrata per gli utenti non gestiti.</translation>
+      Se non viene configurata, la schermata introduttiva dell'AI verrà ignorata per gli utenti gestiti a livello aziendale e mostrata per gli utenti non gestiti.</translation>
 <translation id="6187632100458475876">Impostazione dell'etichetta per l'avatar della barra degli strumenti gestita</translation>
 <translation id="6190367314942602985">Segnala informazioni di identificazione degli utenti</translation>
-<translation id="6191963383731098056">Questo criterio consente agli amministratori di configurare il colore del tema di <ph name="PRODUCT_NAME" />. La stringa di input deve essere una stringa di colore esadecimale valido corrispondente al formato "#RRGGBB".
+<translation id="6191963383731098056">Questa policy consente agli amministratori di configurare il colore del tema di <ph name="PRODUCT_NAME" />. La stringa di input deve essere una stringa di colore esadecimale valido corrispondente al formato "#RRGGBB".
 
-      L'impostazione del criterio su un colore esadecimale valido fa sì che venga automaticamente generato e applicato al browser un tema basato su quel colore. Gli utenti non potranno modificare il tema impostato dal criterio.
+      L'impostazione della policy su un colore esadecimale valido fa sì che venga automaticamente generato e applicato al browser un tema basato su quel colore. Gli utenti non potranno modificare il tema impostato dalla policy.
 
-      Lasciare il criterio non impostato consente agli utenti di modificare il tema del browser come preferiscono.</translation>
+      Lasciare la policy non impostata consente agli utenti di modificare il tema del browser come preferiscono.</translation>
 <translation id="6195356309340063061">Attiva <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL.
 
-La configurazione di questo criterio consente di specificare gli URL che <ph name="PRODUCT_NAME" /> offre per avviare il flusso di attestazione per i browser gestiti. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
-Questo criterio può essere configurato solo tramite la pagina Chrome Enterprise Connectors su <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
+La configurazione di questa policy consente di specificare gli URL che <ph name="PRODUCT_NAME" /> offre per avviare il flusso di attestazione per i browser gestiti. Il secondo consente a questi siti web di ricevere dal dispositivo un insieme attestato di indicatori sensibili al contesto.
+Questa policy può essere configurata solo tramite la pagina Chrome Enterprise Connectors su <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
-Se questo criterio non viene impostato o se viene lasciato vuoto, nessun sito web potrà avviare un flusso di attestazione a livello di browser e ricevere indicatori dal dispositivo. Tuttavia, se viene attivato il criterio <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" />, il flusso di attestazione può essere avviato per il profilo gestito e gli indicatori dei dispositivi possono essere raccolti.
+Se questa policy non viene impostata o se viene lasciata vuota, nessun sito web potrà avviare un flusso di attestazione a livello di browser e ricevere indicatori dal dispositivo. Tuttavia, se viene attivata la policy <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" />, il flusso di attestazione può essere avviato per il profilo gestito e gli indicatori dei dispositivi possono essere raccolti.
 
 Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation>
 <translation id="6195802366906945965">Consente di stabilire se verrà utilizzato lo strumento di verifica dei certificati integrato per verificare i certificati dei server</translation>
-<translation id="6198947200418556248">Questo criterio è deprecato. Se hai ancora bisogno del comportamento dei cookie precedente, usa il criterio <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Ti consente di ripristinare il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> precedente per tutti i cookie. Se ripristini il comportamento precedente, i cookie per cui non è specificato un attributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> vengono considerati come se avessero il valore "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />"; viene rimosso il requisito che richiede che i cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" abbiano l'attributo "<ph name="ATTRIBUTE_SECURE_NAME" />" e viene ignorato il confronto tra schemi nel valutare se due siti sono uno stesso sito. Per una descrizione completa, visita la pagina https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+<translation id="6198947200418556248">Questa policy è deprecata. Se hai ancora bisogno del comportamento dei cookie precedente, usa la policy <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Ti consente di ripristinare il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> precedente per tutti i cookie. Se ripristini il comportamento precedente, i cookie per cui non è specificato un attributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> vengono considerati come se avessero il valore "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />"; viene rimosso il requisito che richiede che i cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" abbiano l'attributo "<ph name="ATTRIBUTE_SECURE_NAME" />" e viene ignorato il confronto tra schemi nel valutare se due siti sono uno stesso sito. Per una descrizione completa, visita la pagina https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
 
-          Se questo criterio non viene impostato, il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> predefinito per i cookie dipenderà dalla configurazione personale dell'utente per la funzionalità <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, la funzionalità <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> e la funzionalità <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, che potrebbero essere impostate in base a una prova pubblica o tramite l'attivazione o disattivazione rispettivamente dei flag <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> o <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />.</translation>
-<translation id="6200225675236107198">Se il criterio viene impostato su <ph name="BLOCK_LOCAL_FONTS_POLICY_NAME" /> (valore 2), per impostazione predefinita viene automaticamente negata ai siti l'autorizzazione per i caratteri locali. Ciò limiterà la capacità dei siti di vedere le informazioni sui caratteri locali.
+          Se questa policy non viene impostata, il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> predefinito per i cookie dipenderà dalla configurazione personale dell'utente per la funzionalità <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, la funzionalità <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> e la funzionalità <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, che potrebbero essere impostate in base a una prova pubblica o tramite l'attivazione o disattivazione rispettivamente dei flag <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> o <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />.</translation>
+<translation id="6200225675236107198">Se la policy viene impostata su <ph name="BLOCK_LOCAL_FONTS_POLICY_NAME" /> (valore 2), per impostazione predefinita viene automaticamente negata ai siti l'autorizzazione per i caratteri locali. Ciò limiterà la capacità dei siti di vedere le informazioni sui caratteri locali.
 
-      Se il criterio viene impostato su <ph name="ASK_LOCAL_FONTS_POLICY_NAME" /> (valore 3), per impostazione predefinita viene mostrata all'utente la richiesta di autorizzazione per i caratteri locali. Se l'utente concede l'autorizzazione, i siti potranno vedere le informazioni sui caratteri locali.
+      Se la policy viene impostata su <ph name="ASK_LOCAL_FONTS_POLICY_NAME" /> (valore 3), per impostazione predefinita viene mostrata all'utente la richiesta di autorizzazione per i caratteri locali. Se l'utente concede l'autorizzazione, i siti potranno vedere le informazioni sui caratteri locali.
 
-      Se il criterio non viene configurato, si applica il comportamento predefinito che prevede di chiedere all'utente. Gli utenti possono cambiare l'impostazione.</translation>
-<translation id="6203715554101884845">Questo criterio consente di elencare gli URL che specificano i siti a cui viene concessa automaticamente l'autorizzazione di accesso a un dispositivo HID con gli ID fornitore e prodotto indicati nella schermata di accesso. Ogni elemento nell'elenco richiede entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" /> per essere valido, altrimenti viene ignorato. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> deve avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e potrebbe avere un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> viene omesso, il criterio può corrispondere a qualsiasi dispositivo con l'ID fornitore specificato. Un elemento con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valido e viene ignorato.
+      Se la policy non viene configurata, si applica il comportamento predefinito che prevede di chiedere all'utente. Gli utenti possono cambiare l'impostazione.</translation>
+<translation id="6203715554101884845">Questa policy consente di elencare gli URL che specificano i siti a cui viene concessa automaticamente l'autorizzazione di accesso a un dispositivo HID con gli ID fornitore e prodotto indicati nella schermata di accesso. Ogni elemento nell'elenco richiede entrambi i campi <ph name="DEVICES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" /> per essere valido, altrimenti viene ignorato. Ogni elemento nel campo <ph name="DEVICES_FIELD_NAME" /> deve avere un campo <ph name="VENDOR_ID_FIELD_NAME" /> e potrebbe avere un campo <ph name="PRODUCT_ID_FIELD_NAME" />. Se il campo <ph name="PRODUCT_ID_FIELD_NAME" /> viene omesso, la policy può corrispondere a qualsiasi dispositivo con l'ID fornitore specificato. Un elemento con un campo <ph name="PRODUCT_ID_FIELD_NAME" /> senza un campo <ph name="VENDOR_ID_FIELD_NAME" /> non è valido e viene ignorato.
 
-Se il criterio non viene configurato, viene utilizzato il valore predefinito globale per tutti i siti (nessun accesso automatico).</translation>
+Se la policy non viene configurata, viene utilizzato il valore predefinito globale per tutti i siti (nessun accesso automatico).</translation>
 <translation id="6205472215607025971">Organizza schede è uno strumento basato sull'AI che crea automaticamente gruppi di schede in base alle schede aperte di un utente. I suggerimenti si basano sulle schede aperte, non sui contenuti delle pagine.
 
 0 = Consente di utilizzare la funzionalità e permette al contempo a Google di utilizzare i dati pertinenti per migliorare i propri modelli di AI. A seconda della funzionalità, tra i dati pertinenti sono inclusi prompt, input, output, materiali originali e feedback scritto. Potrebbero anche essere esaminati da persone per migliorare i modelli di AI. 0 è il valore predefinito, ad eccezione dei casi riportati di seguito.
@@ -7180,78 +7180,78 @@
 <translation id="6210259502936598222">Segnala informazioni sulla versione del sistema operativo e di <ph name="PRODUCT_NAME" /></translation>
 <translation id="6215023506958127056">Consente di controllare l'installazione delle estensioni esterne.
 
-Se questo criterio viene attivato, le estensioni esterne non possono essere installate.
+Se questa policy viene attivata, le estensioni esterne non possono essere installate.
 
-Se questo criterio viene disattivato o se non viene configurato, le estensioni esterne possono essere installate.
+Se questa policy viene disattivata o se non viene configurata, le estensioni esterne possono essere installate.
 
 Le estensioni esterne e la relativa installazione sono illustrate all'indirizzo https://developer.chrome.com/docs/extensions/how-to/distribute/install-extensions.</translation>
-<translation id="6220835555850906733">Se il criterio viene attivato o se non viene configurato, tutti gli output audio supportati sono consentiti sui dispositivi degli utenti.
+<translation id="6220835555850906733">Se la policy viene attivata o se non viene configurata, tutti gli output audio supportati sono consentiti sui dispositivi degli utenti.
 
-      Se il criterio viene disattivato, nessun output audio è consentito se gli utenti hanno effettuato l'accesso.
+      Se la policy viene disattivata, nessun output audio è consentito se gli utenti hanno effettuato l'accesso.
 
-      Nota: il criterio ha effetto su tutti gli output audio, incluse le funzioni di accessibilità audio. Non disattivare il criterio se un utente richiede uno screen reader.</translation>
+      Nota: la policy ha effetto su tutti gli output audio, incluse le funzioni di accessibilità audio. Non disattivare la policy se un utente richiede uno screen reader.</translation>
 <translation id="6221175752766085998">Consenti i certificati privi dell'estensione subjectAlternativeName emessi dai trust anchor locali</translation>
 <translation id="6221327862246049151">Questo sale viene utilizzato come valore di sale quando viene eseguito l'hashing delle informazioni sull'identità incluse nella stringa <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" />.
 
 Il sale deve essere una stringa con una lunghezza compresa tra 8 e 32 caratteri.
 
-Dalla versione 114 in poi, questo criterio è facoltativo se viene configurato il criterio <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" />. Se il criterio non viene configurato, gli identificatori negli URI del modello configurati tramite il criterio <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" /> vengono sottoposti ad hashing senza sale.</translation>
+Dalla versione 114 in poi, questa policy è facoltativa se viene configurata la policy <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" />. Se la policy non viene configurata, gli identificatori negli URI del modello configurati tramite la policy <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" /> vengono sottoposti ad hashing senza sale.</translation>
 <translation id="622197575020133151">Consente di configurare le varie funzionalità che usano l'IA generativa.</translation>
 <translation id="6224070048795197148">Consenti agli utenti di usare il browser senza accedere</translation>
 <translation id="6224304369267200483">URL/domini per cui è consentita automaticamente l'attestazione diretta dei token di sicurezza</translation>
-<translation id="6225938950222983458">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="NOTE_TAKING_APPS_LOCK_SCREEN_ALLOWLIST" />.</translation>
+<translation id="6225938950222983458">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="NOTE_TAKING_APPS_LOCK_SCREEN_ALLOWLIST" />.</translation>
 <translation id="6230442621691161858">Questa funzionalità consente di attivare suggerimenti relativi a nuovi contenuti da esplorare. Sono incluse app, pagine web e altro.
-      Se questo criterio viene impostato su True, i suggerimenti relativi a nuovi contenuti da esplorare vengono attivati.
-      Se questo criterio viene impostato su False, i suggerimenti relativi a nuovi contenuti da esplorare vengono disattivati.
-      Se questo criterio non viene configurato, i suggerimenti per i nuovi contenuti da esplorare saranno disattivati per gli utenti gestiti e attivati per altri utenti.
+      Se questa policy viene impostata su True, i suggerimenti relativi a nuovi contenuti da esplorare vengono attivati.
+      Se questa policy viene impostata su False, i suggerimenti relativi a nuovi contenuti da esplorare vengono disattivati.
+      Se questa policy non viene configurata, i suggerimenti per i nuovi contenuti da esplorare saranno disattivati per gli utenti gestiti e attivati per altri utenti.
       </translation>
 <translation id="6233173491898450179">Imposta directory di download</translation>
 <translation id="6234167788423986573">La raccolta di dati anonimizzati con chiave URL non è mai attiva</translation>
 <translation id="6234177445959386333">Configura l'elenco di URL di accesso aziendale in cui il servizio di protezione tramite password deve acquisire gli hash con salt delle password.</translation>
 <translation id="6236880578835238059">Consente di configurare un elenco di URL che possono rimanere in modalità a schermo intero senza mostrare una notifica quando il dispositivo torna attivo dalla schermata di blocco.
 
-          Generalmente, la modalità a schermo intero viene disattivata dopo la riattivazione dalla schermata di blocco per ridurre il rischio di attacchi di phishing. Questo criterio consente di specificare gli URL considerati origini attendibili che possono rimanere in modalità a schermo intero al momento dello sblocco. Viene configurato tramite la specifica di un elenco di pattern URL nel formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Ad esempio, è possibile mantenere sempre attiva la modalità a schermo intero al momento dello sblocco e disattivare tutte le notifiche specificando il carattere jolly <ph name="WILDCARD_VALUE" />, che corrisponde a tutti gli URL.
+          Generalmente, la modalità a schermo intero viene disattivata dopo la riattivazione dalla schermata di blocco per ridurre il rischio di attacchi di phishing. Questa policy consente di specificare gli URL considerati origini attendibili che possono rimanere in modalità a schermo intero al momento dello sblocco. Viene configurata tramite la specifica di un elenco di pattern URL nel formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Ad esempio, è possibile mantenere sempre attiva la modalità a schermo intero al momento dello sblocco e disattivare tutte le notifiche specificando il carattere jolly <ph name="WILDCARD_VALUE" />, che corrisponde a tutti gli URL.
 
-          Se il criterio viene impostato su un elenco vuoto o se non viene configurato, nessun URL può rimanere in modalità a schermo intero senza mostrare una notifica.</translation>
+          Se la policy viene impostata su un elenco vuoto o se non viene configurata, nessun URL può rimanere in modalità a schermo intero senza mostrare una notifica.</translation>
 <translation id="6240222568708113780">Consenti l'analisi approfondita dei download per gli utenti che hanno abilitato la Navigazione sicura</translation>
 <translation id="624080397610861618">Disattiva il layout Hindi Inscript</translation>
 <translation id="6242147107333796512">Segnala informazioni relative ai report sugli arresti anomali, come ID remoto,
       timestamp di acquisizione e causa.
 
-      Se il criterio è impostato su false o non viene configurato, le informazioni relative ai report sugli arresti anomali
-      non verranno segnalate. Se viene impostato su true, le informazioni relative ai report sugli arresti anomali verranno
+      Se la policy è impostata su false o non viene configurata, le informazioni relative ai report sugli arresti anomali
+      non verranno segnalate. Se viene impostata su true, le informazioni relative ai report sugli arresti anomali verranno
       segnalate.</translation>
 <translation id="624219423122512710">Azioni per browser inattivo</translation>
 <translation id="6244061205361004687">Consenti all'utente di disconnettere o modificare manualmente una VPN</translation>
 <translation id="6244210204546589761">Pagine da aprire all'avvio</translation>
 <translation id="624595269193747921">Consente di stabilire se limitare o meno la ricerca della stampante corrispondente a un insieme specifico di stampanti.</translation>
 <translation id="6246290059248303618">Mostra i controlli multimediali per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi sulla rete locale</translation>
-<translation id="6247316685259031374">Questo criterio consente di controllare la sandbox del processo audio.
-      Se questo criterio viene attivato, il processo audio verrà eseguito con limitazione tramite sandbox.
-      Se il criterio viene disattivato, il processo audio verrà eseguito senza limitazione tramite sandbox e il modulo di elaborazione audio WebRTC verrà eseguito nel processo di rendering.
+<translation id="6247316685259031374">Questa policy consente di controllare la sandbox del processo audio.
+      Se questa policy viene attivata, il processo audio verrà eseguito con limitazione tramite sandbox.
+      Se la policy viene disattivata, il processo audio verrà eseguito senza limitazione tramite sandbox e il modulo di elaborazione audio WebRTC verrà eseguito nel processo di rendering.
       Ciò espone gli utenti a rischi di sicurezza correlati all'esecuzione del sottosistema audio senza limitazione tramite sandbox.
-      Se questo criterio non viene impostato, verrà usata la configurazione predefinita per la sandbox dell'audio, che potrebbe differire in base alla piattaforma.
-      Lo scopo di questo criterio è fornire alle imprese la flessibilità di disattivare la sandbox dell'audio qualora interferisca con le configurazioni software di sicurezza utilizzate.</translation>
+      Se questa policy non viene impostata, verrà usata la configurazione predefinita per la sandbox dell'audio, che potrebbe differire in base alla piattaforma.
+      Lo scopo di questa policy è fornire alle imprese la flessibilità di disattivare la sandbox dell'audio qualora interferisca con le configurazioni software di sicurezza utilizzate.</translation>
 <translation id="624818583115864448">porta 554 (può essere sbloccata fino al 15/10/2021)</translation>
 <translation id="6249912382559535329">Consente di attivare la funzione di accessibilità della tastiera virtuale nella schermata di accesso.
 
-          Se questo criterio viene impostato su True, la tastiera virtuale di accessibilità sarà sempre attiva nella schermata di accesso.
+          Se questa policy viene impostata su True, la tastiera virtuale di accessibilità sarà sempre attiva nella schermata di accesso.
 
-          Se questo criterio viene impostato su False, la tastiera virtuale di accessibilità sarà sempre disattivata nella schermata di accesso.
+          Se questa policy viene impostata su False, la tastiera virtuale di accessibilità sarà sempre disattivata nella schermata di accesso.
 
-          Se configuri questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se configuri questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la tastiera virtuale di accessibilità è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento tramite le impostazioni di accessibilità.
+          Se questa policy non viene impostata, inizialmente la tastiera virtuale di accessibilità è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento tramite le impostazioni di accessibilità.
 
-          Questo criterio non influisce sull'attivazione o meno della tastiera virtuale touch. Ad esempio, la tastiera virtuale touch viene comunque visualizzata sui tablet anche se il criterio viene impostato su False.</translation>
+          Questa policy non influisce sull'attivazione o meno della tastiera virtuale touch. Ad esempio, la tastiera virtuale touch viene comunque visualizzata sui tablet anche se la policy viene impostata su False.</translation>
 <translation id="6254498834449523938">Non consentire agli utenti di bypassare l'avviso di Navigazione sicura</translation>
 <translation id="625580680776945310">La modalità ad alta efficienza verrà attivata.</translation>
 <translation id="6258314216623064461">Impostazioni per Aiutami a scrivere</translation>
 <translation id="6258502079038650092">Consente di stabilire se gli utenti possono utilizzare Chrome for Testing.
 
-      Se il criterio viene attivato o se non viene configurato, gli utenti possono installare ed eseguire Chrome for Testing.
+      Se la policy viene attivata o se non viene configurata, gli utenti possono installare ed eseguire Chrome for Testing.
 
-      Se viene disattivato, gli utenti non possono eseguire Chrome for Testing. Gli utenti potranno comunque installare Chrome for Testing, ma non verrà eseguito con i profili per cui questo criterio è disattivato.</translation>
+      Se viene disattivata, gli utenti non possono eseguire Chrome for Testing. Gli utenti potranno comunque installare Chrome for Testing, ma non verrà eseguito con i profili per cui questa policy è disattivata.</translation>
 <translation id="6258658183356534534">Controlla la funzionalità di aggiornamento User-Agent Client Hints GREASE.</translation>
 <translation id="6261643884958898336">Segnala informazioni di identificazione dei computer</translation>
 <translation id="6262668203803408414">Se la policy viene impostata su true, tutti i metodi di immissione della policy <ph name="ALLOWED_INPUT_METHODS_POLICY_NAME" /> vengono abilitati nelle sessioni <ph name="PRODUCT_OS_NAME" />.
@@ -7259,21 +7259,21 @@
 Se la policy viene impostata su false o se non viene configurata, non vengono imposti i metodi di immissione abilitati e la policy <ph name="ALLOWED_INPUT_METHODS_POLICY_NAME" /> configura solo i metodi di immissione disponibili per l'utente.
 
 Se la policy <ph name="ALLOWED_INPUT_METHODS_POLICY_NAME" /> non viene configurata o se viene impostata su un elenco vuoto, questa policy viene ignorata e gli utenti possono abilitare qualsiasi metodo di immissione.</translation>
-<translation id="6264247808139384018">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti che hanno effettuato l'autenticazione con una password possono bloccare lo schermo.
+<translation id="6264247808139384018">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti che hanno effettuato l'autenticazione con una password possono bloccare lo schermo.
 
-Se viene impostato su Disattivato, gli utenti non possono bloccare lo schermo e possono soltanto uscire dalla sessione utente.</translation>
+Se viene impostata su Disattivata, gli utenti non possono bloccare lo schermo e possono soltanto uscire dalla sessione utente.</translation>
 <translation id="6265892395051519509">Consenti l'accesso ai sensori su questi siti</translation>
 <translation id="6266043141694454734">Determina se verranno utilizzati Chrome Root Store e lo strumento di verifica dei certificati integrato per verificare i certificati del server</translation>
 <translation id="6266686172120601139">Attiva il buffering adattivo per Web Audio</translation>
-<translation id="6267130578410325007">Questo criterio consente per impostazione predefinita il clustering di agenti con chiave di origine.
+<translation id="6267130578410325007">Questa policy consente per impostazione predefinita il clustering di agenti con chiave di origine.
 
 L'intestazione HTTP Origin-Agent-Cluster consente di stabilire se un documento viene isolato in un cluster di agenti con chiave di origine o in un cluster di agenti con chiave del sito. Questo comporta implicazioni relative alla sicurezza perché un cluster di agenti con chiave di origine consente di isolare i documenti per origine. La conseguenza evidente di questo comportamento per gli sviluppatori è che non è più possibile impostare la funzione di accesso document.domain.
 
 Il comportamento predefinito (se non è stata impostata alcuna intestazione Origin-Agent-Cluster) cambia in M111 da "con chiave del sito" a "con chiave di origine".
 
-Se questo criterio viene attivato o se non viene configurato, il browser seguirà questo nuovo comportamento predefinito a partire dalla versione indicata.
+Se questa policy viene attivata o se non viene configurata, il browser seguirà questo nuovo comportamento predefinito a partire dalla versione indicata.
 
-Se il criterio viene disattivato, questa modifica viene annullata e i documenti senza intestazioni Origin-Agent-Cluster verranno assegnati a cluster di agenti con chiave del sito. Di conseguenza, la funzione di accesso document.domain rimane configurabile per impostazione predefinita (comportamento precedente).
+Se la policy viene disattivata, questa modifica viene annullata e i documenti senza intestazioni Origin-Agent-Cluster verranno assegnati a cluster di agenti con chiave del sito. Di conseguenza, la funzione di accesso document.domain rimane configurabile per impostazione predefinita (comportamento precedente).
 
 Per maggiori informazioni, visita la pagina https://developer.chrome.com/blog/immutable-document-domain/.</translation>
 <translation id="6270615143812355589">Attiva l'input audio</translation>
@@ -7287,37 +7287,37 @@
 
       Se un'app o un'estensione di cui è stata precedentemente forzata l'installazione viene rimossa da questo elenco, tale app o estensione viene disinstallata automaticamente da <ph name="PRODUCT_NAME" />.
 
-      Ogni elemento nell'elenco del criterio è una stringa contenente un ID estensione e, facoltativamente, un URL "di aggiornamento" separati da punto e virgola (<ph name="SEMICOLON" />). L'ID estensione è la stringa di 32 lettere che si trova, ad esempio, all'indirizzo <ph name="CHROME_EXTENSIONS_LINK" /> quando è attiva la modalità sviluppatore. L'URL "di aggiornamento", se specificato, deve indirizzare a un documento XML manifest di aggiornamento come descritto all'indirizzo <ph name="LINK_TO_EXTENSION_DOC1" />. Per impostazione predefinita, viene utilizzato l'URL di aggiornamento del Chrome Web Store (che attualmente è "https://clients2.google.com/service/update2/crx"). Tieni presente che l'URL "di aggiornamento" impostato in questo criterio viene utilizzato esclusivamente per l'installazione iniziale; per i successivi aggiornamenti dell'estensione viene utilizzato l'URL di aggiornamento indicato nel file manifest dell'estensione.
+      Ogni elemento nell'elenco della policy è una stringa contenente un ID estensione e, facoltativamente, un URL "di aggiornamento" separati da punto e virgola (<ph name="SEMICOLON" />). L'ID estensione è la stringa di 32 lettere che si trova, ad esempio, all'indirizzo <ph name="CHROME_EXTENSIONS_LINK" /> quando è attiva la modalità sviluppatore. L'URL "di aggiornamento", se specificato, deve indirizzare a un documento XML manifest di aggiornamento come descritto all'indirizzo <ph name="LINK_TO_EXTENSION_DOC1" />. Per impostazione predefinita, viene utilizzato l'URL di aggiornamento del Chrome Web Store (che attualmente è "https://clients2.google.com/service/update2/crx"). Tieni presente che l'URL "di aggiornamento" impostato in questa policy viene utilizzato esclusivamente per l'installazione iniziale; per i successivi aggiornamenti dell'estensione viene utilizzato l'URL di aggiornamento indicato nel file manifest dell'estensione.
 
       Ad esempio, <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> installa l'app <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> dall'URL "di aggiornamento" standard del Chrome Web Store. Ulteriori informazioni sulle estensioni in hosting sono disponibili all'indirizzo: <ph name="LINK_TO_EXTENSION_DOC2" />.</translation>
-<translation id="6273107124506133797">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="USB_DETACHABLE_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="6273107124506133797">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="USB_DETACHABLE_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="6274202259872570803">Registra schermo</translation>
 <translation id="6275497712828649588">Nascondi avvisi di sicurezza quando vengono usati flag della riga di comando potenzialmente pericolosi</translation>
 <translation id="6275833043726517413">Consente di usare l'implementazione <ph name="CORS" /> legacy anziché la nuova implementazione <ph name="CORS" />.
 
-      Se questo criterio viene impostato su True, viene usata l'implementazione legacy, che dovrebbe essere compatibile con le versioni precedenti.
+      Se questa policy viene impostata su True, viene usata l'implementazione legacy, che dovrebbe essere compatibile con le versioni precedenti.
 
-      Se questo criterio viene impostato su False o non viene impostato, viene usata la nuova implementazione, che potrebbe causare problemi di compatibilità per le aziende.
+      Se questa policy viene impostata su False o non viene impostata, viene usata la nuova implementazione, che potrebbe causare problemi di compatibilità per le aziende.
 
-      Questo criterio verrà rimosso dopo il lancio di un paio di nuove funzionalità.
+      Questa policy verrà rimossa dopo il lancio di un paio di nuove funzionalità.
 
       Per informazioni dettagliate su <ph name="CORS" />, visita la pagina <ph name="CORS_HELP_URL" />.
 
-      Tieni presente che, nonostante sia stata comunicata la rimozione di questo criterio nella versione 82 di <ph name="PRODUCT_NAME" />, il criterio è stato rimosso nella versione 84.</translation>
+      Tieni presente che, nonostante sia stata comunicata la rimozione di questa policy nella versione 82 di <ph name="PRODUCT_NAME" />, la policy è stata rimossa nella versione 84.</translation>
 <translation id="6276087670023098167">Disattiva la generazione di report sulle informazioni di identificazione delle macchine</translation>
 <translation id="627645565733796818">I certificati X.509 possono codificare i vincoli, ad esempio i vincoli relativi ai nomi, nelle estensioni dei certificati. RFC 5280 specifica che l'applicazione forzata di questi vincoli sui certificati per trust anchor è facoltativa. A partire dalla versione 112 di <ph name="PRODUCT_NAME" />, questi vincoli nei certificati caricati dall'archivio certificati della piattaforma verranno applicati.
 
-Questo criterio è una soluzione di disattivazione temporanea nel caso in cui un'azienda riscontri problemi con i vincoli codificati nei propri certificati root privati. In questo caso è possibile usare questo criterio per disattivare temporaneamente l'applicazione forzata dei vincoli durante la risoluzione dei problemi dei certificati.
+Questa policy è una soluzione di disattivazione temporanea nel caso in cui un'azienda riscontri problemi con i vincoli codificati nei propri certificati root privati. In questo caso è possibile usare questa policy per disattivare temporaneamente l'applicazione forzata dei vincoli durante la risoluzione dei problemi dei certificati.
 
-Se questo criterio non viene configurato o se viene attivato, <ph name="PRODUCT_NAME" /> forzerà l'applicazione dei vincoli codificati nei trust anchor caricati dall'archivio di attendibilità della piattaforma.
+Se questa policy non viene configurata o se viene attivata, <ph name="PRODUCT_NAME" /> forzerà l'applicazione dei vincoli codificati nei trust anchor caricati dall'archivio di attendibilità della piattaforma.
 
-Se questo criterio viene disattivato, <ph name="PRODUCT_NAME" /> non forzerà l'applicazione dei vincoli codificati nei trust anchor caricati dall'archivio di attendibilità della piattaforma.
+Se questa policy viene disattivata, <ph name="PRODUCT_NAME" /> non forzerà l'applicazione dei vincoli codificati nei trust anchor caricati dall'archivio di attendibilità della piattaforma.
 
-Nella versione 112 di <ph name="PRODUCT_NAME" />, questo criterio non ha effetto se il criterio <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> viene disattivato.
+Nella versione 112 di <ph name="PRODUCT_NAME" />, questa policy non ha effetto se la policy <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> viene disattivata.
 
-Questo criterio è stato rimosso nella versione 126 di <ph name="PRODUCT_NAME" />. A partire da quella versione, i vincoli nei trust anchor vengono sempre applicati.</translation>
+Questa policy è stata rimossa nella versione 126 di <ph name="PRODUCT_NAME" />. A partire da quella versione, i vincoli nei trust anchor vengono sempre applicati.</translation>
 <translation id="627672037430076089">Impedisci le connessioni di assistenza da remoto a questo computer</translation>
-<translation id="6277314550042130537">Utilizza l'approvazione del criterio KDC durante l'autenticazione HTTP</translation>
+<translation id="6277314550042130537">Utilizza l'approvazione della policy KDC durante l'autenticazione HTTP</translation>
 <translation id="6278428485366576908">Tema</translation>
 <translation id="6279010879606347019">Se la policy viene attivata, la pagina Nuova scheda viene impostata come home page dell'utente e l'eventuale URL della home page specificato viene ignorato. Se viene disattivata, la home page dell'utente non sarà mai la pagina Nuova scheda, a meno che chrome://newtab venga impostato come URL della home page dell'utente.
 
@@ -7331,11 +7331,11 @@
 <translation id="6282524907402492171">Mostra avvisi ritiro di <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="6282799760374509080">Consenti o nega acquisizione audio</translation>
 <translation id="6284362063448764300">TLS 1.1</translation>
-<translation id="6286082501885452957">La configurazione del criterio consente alle origini elencate di ottenere gli attributi dei dispositivi (ad es. numero di serie, nome host) utilizzando l'API Device Attributes.
+<translation id="6286082501885452957">La configurazione della policy consente alle origini elencate di ottenere gli attributi dei dispositivi (ad es. numero di serie, nome host) utilizzando l'API Device Attributes.
 
-Le origini devono corrispondere alle applicazioni web con installazione forzata tramite il criterio <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> o <ph name="ISOLATED_WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> (dalla versione 125) o configurate come app kiosk. Per le specifiche dell'API Device Attributes, visita la pagina https://wicg.github.io/WebApiDevice/device_attributes.
+Le origini devono corrispondere alle applicazioni web con installazione forzata tramite la policy <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> o <ph name="ISOLATED_WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> (dalla versione 125) o configurate come app kiosk. Per le specifiche dell'API Device Attributes, visita la pagina https://wicg.github.io/WebApiDevice/device_attributes.
 
-Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi (dalla versione 127), visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi (dalla versione 127), visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="6287128640500683781">Consenti a qualsiasi utente di accedere</translation>
 <translation id="6287310684159482272">Impostazioni dei cookie</translation>
 <translation id="6287742528823584153">Attiva il servizio <ph name="PRODUCT_NAME" /> e avvia la scrivania remota all'accesso</translation>
@@ -7344,81 +7344,81 @@
 <translation id="6302021021024941085">Disattiva gli strumenti per la risoluzione dei problemi relativi a Kiosk.</translation>
 <translation id="6303118494824248488">URL dell'immagine disco da scaricare.</translation>
 <translation id="6303278429164386663">Consente di controllare l'attivazione della funzionalità EphemeralNetworkPolicies</translation>
-<translation id="6305373713165475629">La configurazione di questo criterio consente di sostituire la modalità di stampa a colori predefinita. Se la modalità non è disponibile, questo criterio viene ignorato.</translation>
-<translation id="6308109234708949641">Questo criterio consente di attivare la funzionalità Registra schermo per gli utenti di Family Link e la autorizza a creare e trascrivere la registrazione dello schermo e a caricarla su Drive.
-      Questo criterio non influisce su altri tipi di utenti.
-      Questo criterio non influisce sul criterio <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> per gli utenti aziendali.
+<translation id="6305373713165475629">La configurazione di questa policy consente di sostituire la modalità di stampa a colori predefinita. Se la modalità non è disponibile, questa policy viene ignorata.</translation>
+<translation id="6308109234708949641">Questa policy consente di attivare la funzionalità Registra schermo per gli utenti di Family Link e la autorizza a creare e trascrivere la registrazione dello schermo e a caricarla su Drive.
+      Questa policy non influisce su altri tipi di utenti.
+      Questa policy non influisce sulla policy <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> per gli utenti aziendali.
 
-      Se il criterio viene attivato, la versione sperimentale di Registra schermo verrà attivata per gli utenti di Family Link.
-      Se viene disattivato, la versione sperimentale di Registra schermo verrà disattivata per gli utenti di Family Link.
-      Se non viene configurato, la versione sperimentale di Registra schermo sarà disattivata per impostazione predefinita per gli utenti di Family Link.</translation>
+      Se la policy viene attivata, la versione sperimentale di Registra schermo verrà attivata per gli utenti di Family Link.
+      Se viene disattivata, la versione sperimentale di Registra schermo verrà disattivata per gli utenti di Family Link.
+      Se non viene configurata, la versione sperimentale di Registra schermo sarà disattivata per impostazione predefinita per gli utenti di Family Link.</translation>
 <translation id="6310223829319187614">Consente il completamento automatico del nome di dominio durante l'accesso dell'utente</translation>
 <translation id="6310756730808079944">Attiva Registra schermo</translation>
 <translation id="631081324835911099">Consente di forzare la disconnessione dell'utente quando il token di autenticazione del suo account principale non è più valido.
-        Questo criterio può proteggere l'utente dall'accesso a contenuti con limitazioni sulle proprietà web di Google.
-        Se questo criterio viene impostato su True, l'utente sarà disconnesso dall'account non appena il suo token di autenticazione non sarà più valido e se i tentativi di ripristinarlo non andranno a buon fine.
-        Se questo criterio viene impostato su False o non viene impostato, l'utente può continuare le proprie operazioni in uno stato non autenticato.</translation>
+        Questa policy può proteggere l'utente dall'accesso a contenuti con limitazioni sulle proprietà web di Google.
+        Se questa policy viene impostata su True, l'utente sarà disconnesso dall'account non appena il suo token di autenticazione non sarà più valido e se i tentativi di ripristinarlo non andranno a buon fine.
+        Se questa policy viene impostata su False o non viene impostata, l'utente può continuare le proprie operazioni in uno stato non autenticato.</translation>
 <translation id="631183702829488873">Se attivata, questa funzionalità mostra un pulsante nella schermata di accesso e di blocco per la visualizzazione della password.
           È rappresentata con un'icona a forma di occhio nel campo della password. Il pulsante non è presente quando la funzionalità è disattivata.
       </translation>
-<translation id="6313108604615108577">Questo criterio consente di stabilire se bloccare o meno la versione principale della stringa user agent a 99.
+<translation id="6313108604615108577">Questa policy consente di stabilire se bloccare o meno la versione principale della stringa user agent a 99.
 
       L'intestazione della richiesta dello user agent consente ai siti web di identificare l'applicazione, il sistema operativo, il fornitore e/o la versione dello user agent richiedente.
       Alcuni siti web fanno supposizioni in merito al tipo di formattazione dell'intestazione e potrebbero riscontrare problemi con le stringhe di versione che includono tre cifre nella posizione principale (ad esempio 100.0.0.0).
 
-      Se il criterio viene impostato su "Predefinito" o se non viene configurato, per la versione principale della stringa user agent verranno usate per impostazione predefinita le impostazioni del browser.
-      Se viene impostato su "ForceDisabled", la stringa user agent non bloccherà la versione principale.
-      Se viene impostato su "ForceEnabled", la stringa user agent segnalerà sempre la versione principale 99 e includerà la versione principale del browser nella posizione secondaria. Ad esempio, la versione del browser 101.0.0.0 invierebbe un'intestazione della richiesta dello user agent che segnala la versione 99.101.0.0.
+      Se la policy viene impostata su "Predefinito" o se non viene configurata, per la versione principale della stringa user agent verranno usate per impostazione predefinita le impostazioni del browser.
+      Se viene impostata su "ForceDisabled", la stringa user agent non bloccherà la versione principale.
+      Se viene impostata su "ForceEnabled", la stringa user agent segnalerà sempre la versione principale 99 e includerà la versione principale del browser nella posizione secondaria. Ad esempio, la versione del browser 101.0.0.0 invierebbe un'intestazione della richiesta dello user agent che segnala la versione 99.101.0.0.
 
-      Questo criterio è temporaneo e verrà ritirato in futuro. Tieni presente che se questo criterio e il criterio <ph name="USER_AGENT_REDUCTION_POLICY_NAME" /> sono entrambi attivi, la stringa della versione dello user agent sarà sempre 99.0.0.0.</translation>
-<translation id="6313170479290171718">Questo criterio è deprecato. Utilizza il criterio <ph name="DEVICE_LOGIN_SCREEN_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
+      Questa policy è temporanea e verrà ritirata in futuro. Tieni presente che se questa policy e la policy <ph name="USER_AGENT_REDUCTION_POLICY_NAME" /> sono entrambe attive, la stringa della versione dello user agent sarà sempre 99.0.0.0.</translation>
+<translation id="6313170479290171718">Questa policy è deprecata. Utilizza la policy <ph name="DEVICE_LOGIN_SCREEN_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
 
-      Se il criterio è impostato su True, la tastiera sullo schermo è attivata all'accesso. Se il criterio è impostato su False, la tastiera sullo schermo è disattivata all'accesso.
+      Se la policy è impostata su True, la tastiera sullo schermo è attivata all'accesso. Se la policy è impostata su False, la tastiera sullo schermo è disattivata all'accesso.
 
-      Se imposti il criterio, gli utenti possono attivare o disattivare temporaneamente la tastiera sullo schermo. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, la tastiera sullo schermo torna allo stato originale.
+      Se imposti la policy, gli utenti possono attivare o disattivare temporaneamente la tastiera sullo schermo. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, la tastiera sullo schermo torna allo stato originale.
 
-      Se il criterio non è impostato, la tastiera sullo schermo è disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
+      Se la policy non è impostata, la tastiera sullo schermo è disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
 
-      Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" /> sostituisce questo criterio.</translation>
+      Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" /> sostituisce questa policy.</translation>
 <translation id="6315039134652691025">Gli utenti non possono includere i dati di navigazione esistenti nel proprio profilo gestito</translation>
 <translation id="6316678265585263617">Consente a <ph name="PRODUCT_NAME" /> di decidere quale approccio usare</translation>
-<translation id="6316885783540658874">Questo criterio consente di controllare se attivare o meno l'implementazione di <ph name="AES_KL_NAME" /> per la crittografia dello spazio di archiviazione degli utenti, se è supportata, per le home page degli utenti <ph name="DM_CRYPT" /> su ChromeOS.
+<translation id="6316885783540658874">Questa policy consente di controllare se attivare o meno l'implementazione di <ph name="AES_KL_NAME" /> per la crittografia dello spazio di archiviazione degli utenti, se è supportata, per le home page degli utenti <ph name="DM_CRYPT" /> su ChromeOS.
 
-       Questo criterio viene applicato soltanto alle home page degli utenti che usano <ph name="DM_CRYPT" /> per la crittografia. Le home page degli utenti precedenti (che non usano <ph name="DM_CRYPT" />) non supportano l'uso di <ph name="AES_KL_NAME" /> e per impostazione predefinita usano <ph name="AES_NI_NAME" />.
+       Questa policy viene applicata soltanto alle home page degli utenti che usano <ph name="DM_CRYPT" /> per la crittografia. Le home page degli utenti precedenti (che non usano <ph name="DM_CRYPT" />) non supportano l'uso di <ph name="AES_KL_NAME" /> e per impostazione predefinita usano <ph name="AES_NI_NAME" />.
 
-       Se il valore di questo criterio cambia, è possibile accedere alle home page degli utenti <ph name="DM_CRYPT" /> esistenti usando l'implementazione della crittografia configurata nel criterio perché le implementazioni <ph name="AES_ALGORITHM_NAME" /> sono compatibili.
-       Se il criterio viene disattivato o se non viene configurato, per la crittografia dello spazio di archiviazione degli utenti per le home page degli utenti <ph name="DM_CRYPT" /> viene usato <ph name="AES_NI_NAME" /> per impostazione predefinita.</translation>
+       Se il valore di questa policy cambia, è possibile accedere alle home page degli utenti <ph name="DM_CRYPT" /> esistenti usando l'implementazione della crittografia configurata nella policy perché le implementazioni <ph name="AES_ALGORITHM_NAME" /> sono compatibili.
+       Se la policy viene disattivata o se non viene configurata, per la crittografia dello spazio di archiviazione degli utenti per le home page degli utenti <ph name="DM_CRYPT" /> viene usato <ph name="AES_NI_NAME" /> per impostazione predefinita.</translation>
 <translation id="6316971721180184579">Disattiva il suono della batteria in esaurimento</translation>
 <translation id="6319198883324703402">Imposta il tempo della prima notifica del riavvio per l'utente</translation>
-<translation id="6319907968994678054">Se il criterio viene impostato su Attivato, viene disattivata la sincronizzazione dei dati in <ph name="PRODUCT_NAME" /> tramite servizi di sincronizzazione ospitati su Google.
+<translation id="6319907968994678054">Se la policy viene impostata su Attivata, viene disattivata la sincronizzazione dei dati in <ph name="PRODUCT_NAME" /> tramite servizi di sincronizzazione ospitati su Google.
       Per disattivare completamente i servizi <ph name="CHROME_SYNC_NAME" />, è consigliabile disattivarli in <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, gli utenti potranno scegliere se usare o meno <ph name="CHROME_SYNC_NAME" />.
+      Se la policy viene impostata su Disattivata o se non viene configurata, gli utenti potranno scegliere se usare o meno <ph name="CHROME_SYNC_NAME" />.
 
-      Nota: non attivare questo criterio se il criterio <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> è impostato su Attivato perché quest'ultimo ha la stessa funzione lato client. La sincronizzazione ospitata su Google viene disattivata completamente in questo caso.</translation>
+      Nota: non attivare questa policy se la policy <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> è impostata su Attivata perché quest'ultima ha la stessa funzione lato client. La sincronizzazione ospitata su Google viene disattivata completamente in questo caso.</translation>
 <translation id="6320935916601887506">Per impostazione predefinita verrà utilizzato il nuovo comportamento offsetParent.</translation>
 <translation id="6321635563435539529">Impostazioni del servizio SSO mobile</translation>
 <translation id="632248221998836641">Sostituisci il controllo della connettività IPv6. Esegui sempre una query sul record AAAA per la risoluzione dei nomi host.</translation>
 <translation id="6324274808543634377">Le impostazioni F11/F12 utilizzano la scorciatoia che contiene il tasto di modifica Alt</translation>
 <translation id="6327643515544933974">Impostazioni USB web</translation>
 <translation id="6330882599388782338">Consenti ai siti di accedere ai sensori</translation>
-<translation id="6331167725613770725">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="6331167725613770725">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale viene mostrata una finestra di dialogo di avviso quando viene usata la corrente alternata.
 
-          Se viene impostato, questo criterio specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> mostri una finestra di dialogo di avviso per comunicare all'utente che sta per essere compiuta l'azione stabilita in caso di inattività.
+          Se viene impostata, questa policy specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> mostri una finestra di dialogo di avviso per comunicare all'utente che sta per essere compiuta l'azione stabilita in caso di inattività.
 
-          Se questo criterio non viene impostato, non viene visualizzata alcuna finestra di dialogo di avviso.
+          Se questa policy non viene impostata, non viene visualizzata alcuna finestra di dialogo di avviso.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.
 
           L'avviso viene mostrato solo se l'azione stabilita in caso di inattività è la disconnessione o lo spegnimento.</translation>
 <translation id="6331943515692769234">Forza l'utilizzo dell'algoritmo User-Agent GREASE precedente.</translation>
 <translation id="6332546092866098577">Blocca l'accesso di lettura tramite l'API file system su questi siti</translation>
 <translation id="6333338054007607863">Consente di scaricare il modello automaticamente</translation>
-<translation id="6334330017384340264">Questo criterio consente di specificare le applicazioni e gli URL da autorizzare per i limiti di utilizzo per app.
+<translation id="6334330017384340264">Questa policy consente di specificare le applicazioni e gli URL da autorizzare per i limiti di utilizzo per app.
         La lista consentita configurata viene applicata alle app installate su <ph name="PRODUCT_OS_NAME" /> per l'utente in questione con limiti di utilizzo per app.
-        La lista consentita configurata può essere applicata soltanto agli account per bambini e diventa effettiva quando viene impostato il criterio <ph name="PER_APP_TIME_LIMITS_POLICY_NAME" />.
+        La lista consentita configurata può essere applicata soltanto agli account per bambini e diventa effettiva quando viene impostata la policy <ph name="PER_APP_TIME_LIMITS_POLICY_NAME" />.
         La lista consentita configurata viene applicata alle applicazioni e agli URL affinché non vengano bloccati secondo i limiti di utilizzo per app.
         L'accesso agli URL autorizzati non viene considerato per il limite di utilizzo di Chrome.
         Aggiungi espressioni regolari degli URL a |url_list| per autorizzare gli URL corrispondenti alle espressioni regolari nell'elenco.
@@ -7426,43 +7426,43 @@
        </translation>
 <translation id="6334397544347592516">Consenti le connessioni di assistenza da remoto da parte degli amministratori aziendali a questa macchina</translation>
 <translation id="6335206050538331829">Strategia per la migrazione dei dati ARC VM</translation>
-<translation id="6337782882143073193">Questo criterio è deprecato, al suo posto utilizza <ph name="URL_BLOCKLIST_POLICY_NAME" />.
+<translation id="6337782882143073193">Questa policy è deprecata, al suo posto utilizza <ph name="URL_BLOCKLIST_POLICY_NAME" />.
 
       Disattiva in <ph name="PRODUCT_NAME" /> gli schemi di protocollo elencati.
 
       Gli URL che utilizzano uno schema riportato nell'elenco non verranno caricati e non potranno essere raggiunti.
 
-      Se questo criterio non viene impostato o se l'elenco è vuoto, sarà possibile accedere a tutti gli schemi in <ph name="PRODUCT_NAME" />.</translation>
+      Se questa policy non viene impostata o se l'elenco è vuoto, sarà possibile accedere a tutti gli schemi in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6338831500376286321">Imposta il livello di accesso alla geolocalizzazione a livello di dispositivo per il sistema
 <ph name="PRODUCT_OS_NAME" />, che viene
 applicato prima dell'accesso dell'utente. Dopo l'accesso, gli utenti possono controllare il
 livello di accesso alla geolocalizzazione tramite le impostazioni per utente.
 
-Se il criterio non viene configurato o se viene impostato su <ph name="ALLOW" />, l'accesso alla geolocalizzazione nella schermata
-di accesso sarà consentito per i dispositivi gestiti. Se viene inviato un valore del criterio non valido,
+Se la policy non viene configurata o se viene impostata su <ph name="ALLOW" />, l'accesso alla geolocalizzazione nella schermata
+di accesso sarà consentito per i dispositivi gestiti. Se viene inviato un valore della policy non valido,
 l'accesso viene reimpostato su
 <ph name="DISALLOW" />. Per i dispositivi non gestiti il valore è sempre
 <ph name="ALLOW" />.
 
-AVVISO: fai attenzione quando modifichi questa impostazione perché potrebbe violare altri criteri
+AVVISO: fai attenzione quando modifichi questa impostazione perché potrebbe violare altre policy
 che riguardano la geolocalizzazione
 (ad es. <ph name="SYSTEM_TIMEZONE_AUTOMATIC_DETECTION_POLICY" />).
-In particolare, se questo criterio viene impostato su <ph name="DISALLOW" />,
+In particolare, se questa policy viene impostata su <ph name="DISALLOW" />,
 le opzioni
 <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TIMEZONEAUTOMATICDETECTIONSENDWIFIACCESSPOINTS" />
 e
 <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TIMEZONEAUTOMATICDETECTIONSENDALLLOCATIONINFO" />
-del criterio
+della policy
 <ph name="SYSTEM_TIMEZONE_AUTOMATIC_DETECTION_POLICY" />
 non funzioneranno correttamente e nella schermata di <ph name="LOG_IN" />
 verrà usata soltanto la risoluzione della posizione basata sull'<ph name="IP" />.</translation>
 <translation id="6338982178236723271">Segnala informazioni sul sistema</translation>
 <translation id="6339355882150329269">Non considerare l'utente come inattivo quando il video viene riprodotto</translation>
-<translation id="6352714113109004581">Se il criterio viene configurato, puoi elencare i pattern URL che specificano i siti che possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo HID.
+<translation id="6352714113109004581">Se la policy viene configurata, puoi elencare i pattern URL che specificano i siti che possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo HID.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      Per i pattern URL che non presentano corrispondenze con il criterio, hanno la precedenza i seguenti elementi, in questo ordine:
+      Per i pattern URL che non presentano corrispondenze con la policy, hanno la precedenza i seguenti elementi, in questo ordine:
 
         * <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" /> (se c'è una corrispondenza),
 
@@ -7470,22 +7470,22 @@
 
         * impostazioni personali degli utenti.
 
-      I pattern URL non devono essere in conflitto con <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
-<translation id="6353890097388312479">Se il criterio viene impostato su All (0) o se non viene configurato, gli utenti possono modificare le impostazioni di attendibilità per tutti i certificati CA, rimuovere i certificati importati dagli utenti e importare certificati tramite Gestione certificati. Se viene impostato su UserOnly (1), gli utenti possono gestire solo i certificati importati dagli utenti, ma non possono modificare le impostazioni di attendibilità dei certificati integrati. Se viene impostato su None (2), gli utenti possono visualizzare i certificati CA, ma non possono gestirli.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
+<translation id="6353890097388312479">Se la policy viene impostata su All (0) o se non viene configurata, gli utenti possono modificare le impostazioni di attendibilità per tutti i certificati CA, rimuovere i certificati importati dagli utenti e importare certificati tramite Gestione certificati. Se viene impostata su UserOnly (1), gli utenti possono gestire solo i certificati importati dagli utenti, ma non possono modificare le impostazioni di attendibilità dei certificati integrati. Se viene impostata su None (2), gli utenti possono visualizzare i certificati CA, ma non possono gestirli.</translation>
 <translation id="6358320368815225772">Disattiva l'attestazione da remoto per il dispositivo</translation>
 <translation id="6362589180545896213">Disattiva decodifica video hardware GPU</translation>
 <translation id="6362805033373293870">Consenti Organizza schede senza migliorare i modelli di AI.</translation>
-<translation id="6362856770865555544">Se il criterio viene impostato su Attivato o se non viene configurato, l'ottimizzazione WPAD (Web Proxy Auto-Discovery) viene attivata in <ph name="PRODUCT_NAME" />.
+<translation id="6362856770865555544">Se la policy viene impostata su Attivata o se non viene configurata, l'ottimizzazione WPAD (Web Proxy Auto-Discovery) viene attivata in <ph name="PRODUCT_NAME" />.
 
-      Se viene impostato su Disattivato, l'ottimizzazione WPAD viene disattivata, aumentando così i tempi di attesa da parte di <ph name="PRODUCT_NAME" /> dei server WPAD basati su DNS.
+      Se viene impostata su Disattivata, l'ottimizzazione WPAD viene disattivata, aumentando così i tempi di attesa da parte di <ph name="PRODUCT_NAME" /> dei server WPAD basati su DNS.
 
-      Gli utenti non possono modificare l'impostazione dell'ottimizzazione WPAD, a prescindere dalla configurazione del criterio.</translation>
+      Gli utenti non possono modificare l'impostazione dell'ottimizzazione WPAD, a prescindere dalla configurazione della policy.</translation>
 <translation id="6363485842496031347">L'impostazione della scorciatoia Elimina usa la scorciatoia che contiene il tasto di modifica Alt</translation>
-<translation id="6366574325767783825">Se il criterio viene impostato su True o non viene impostato, <ph name="PRODUCT_NAME" /> accetterà i contenuti web pubblicati con la tecnologia Signed HTTP Exchange.
+<translation id="6366574325767783825">Se la policy viene impostata su True o non viene impostata, <ph name="PRODUCT_NAME" /> accetterà i contenuti web pubblicati con la tecnologia Signed HTTP Exchange.
 
-      Se il criterio viene impostato su False, i contenuti pubblicati con la tecnologia Signed HTTP Exchange non vengono caricati.</translation>
+      Se la policy viene impostata su False, i contenuti pubblicati con la tecnologia Signed HTTP Exchange non vengono caricati.</translation>
 <translation id="6368011194414932347">Configura l'URL della pagina iniziale</translation>
 <translation id="6368403635025849609">Consenti JavaScript su questi siti</translation>
 <translation id="6368671810229507360">WebRTC</translation>
@@ -7504,27 +7504,27 @@
 <translation id="6376540107659524656">Disattiva SSH in Terminal System App</translation>
 <translation id="6376659517206731212">Può essere obbligatorio</translation>
 <translation id="637677821295115289">Imposta la directory in cui vengono salvate le acquisizioni schermo (screenshot e registrazioni dello schermo).
-Se il criterio viene impostato come consigliato, il valore verrà utilizzato per impostazione predefinita, ma l'utente potrà modificarlo.
+Se la policy viene impostata come consigliato, il valore verrà utilizzato per impostazione predefinita, ma l'utente potrà modificarlo.
 In caso contrario, l'utente non potrà modificarlo e le acquisizioni verranno salvate sempre nella directory definita.
 
-Il criterio utilizza lo stesso formato del criterio <ph name="DOWNLOAD_DIRECTORY_POLICY_NAME" />
+La policy utilizza lo stesso formato della policy <ph name="DOWNLOAD_DIRECTORY_POLICY_NAME" />
 La posizione può essere impostata su un file system locale o su <ph name="GOOGLE_DRIVE_NAME" /> (con prefisso "${google_drive}") o <ph name="MICROSOFT_ONE_DRIVE_NAME" /> (con prefisso "${microsoft_onedrive}").
-Se il criterio non viene configurato, le acquisizioni schermo verranno archiviate nella directory locale "Download".
+Se la policy non viene configurata, le acquisizioni schermo verranno archiviate nella directory locale "Download".
 Vedi l'elenco di variabili che puoi utilizzare (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).
 
-Se il criterio non viene configurato, significa che <ph name="PRODUCT_OS_NAME" /> utilizza la directory "Download" predefinita per archiviare le acquisizioni schermo e gli utenti possono modificarla.</translation>
+Se la policy non viene configurata, significa che <ph name="PRODUCT_OS_NAME" /> utilizza la directory "Download" predefinita per archiviare le acquisizioni schermo e gli utenti possono modificarla.</translation>
 <translation id="6377031865393559909">Gli utenti possono usare i modelli di scrivanie</translation>
 <translation id="6378076389057087301">Specifica se l'attività audio incide sulla gestione dell'alimentazione</translation>
-<translation id="6378393933102834628">Se il criterio è impostato su True, la scorciatoia per le app viene visualizzata. Se il criterio è impostato su False, tale scorciatoia non viene mai visualizzata.
+<translation id="6378393933102834628">Se la policy è impostata su True, la scorciatoia per le app viene visualizzata. Se la policy è impostata su False, tale scorciatoia non viene mai visualizzata.
 
-      Se il criterio è configurato, gli utenti non possono apportare modifiche. Se non è configurato, gli utenti possono decidere se mostrare o nascondere la scorciatoia per le app dal menu contestuale della barra dei Preferiti.</translation>
+      Se la policy è configurata, gli utenti non possono apportare modifiche. Se non è configurata, gli utenti possono decidere se mostrare o nascondere la scorciatoia per le app dal menu contestuale della barra dei Preferiti.</translation>
 <translation id="638003144128412430">Disattiva i report sulle informazioni relative al fuso orario del dispositivo</translation>
 <translation id="6382209369210116232">Disattiva le estensioni non pubblicate</translation>
 <translation id="6382351416269252693">Consente di impostare un elenco di pattern URL per i siti che specifica i siti a cui viene negata automaticamente l'autorizzazione per i caratteri locali. Ciò limiterà la capacità dei siti di vedere le informazioni sui caratteri locali.
 
-      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
+      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
 
-      Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
+      Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
 <translation id="6383774771168138899">Configura il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /></translation>
 <translation id="6384542789059421431">Attiva la visualizzazione delle pagine di risultati del motore di ricerca predefinito in un riquadro laterale del browser.</translation>
 <translation id="6389240462871677239">Consenti alle origini delle app web isolate di utilizzare Controlled Frame</translation>
@@ -7549,24 +7549,24 @@
 <translation id="6394350458541421998">La norma non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_OS_NAME" />. Utilizza la norma PresentationScreenDimDelayScale.</translation>
 <translation id="6397588391180665797">Consente di segnalare eventi di configurazione di rete degli utenti su dispositivi registrati.
 
-      Se il criterio viene impostato su Falso, le informazioni non vengono segnalate.
-      Se impostato su Vero o non impostato, verrà segnalata la configurazione di rete del dispositivo.</translation>
-<translation id="6398489342702562818">Se questo criterio viene configurato, viene forzata l'attivazione o la disattivazione della funzionalità Accoppiamento rapido.
+      Se la policy viene impostata su False, le informazioni non vengono segnalate.
+      Se impostata su True o non impostata, verrà segnalata la configurazione di rete del dispositivo.</translation>
+<translation id="6398489342702562818">Se questa policy viene configurata, viene forzata l'attivazione o la disattivazione della funzionalità Accoppiamento rapido.
       Accoppiamento rapido è un nuovo flusso di accoppiamento tramite Bluetooth che consente di collegare periferiche accoppiate a un account GAIA.
       In questo modo possono essere accoppiati automaticamente altri dispositivi ChromeOS (e Android) su cui è stato eseguito l'accesso con lo stesso account GAIA.
-      Se non viene configurato, il valore predefinito è disabled per gli utenti aziendali ed enabled per gli account
+      Se non viene configurata, il valore predefinito è disabled per gli utenti aziendali ed enabled per gli account
       non gestiti.</translation>
 <translation id="6401669939808766804">Disconnetti l'utente</translation>
 <translation id="640244877779556713">Attiva suggerimento di emoji</translation>
 <translation id="6402928885627067154">Specifica intervalli settimanali in cui non è possibile utilizzare i dispositivi ChromeOS</translation>
-<translation id="6403114173011456561">Consente di controllare la tastiera virtuale touch, fungendo da criterio aggiuntivo rispetto al criterio <ph name="VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
+<translation id="6403114173011456561">Consente di controllare la tastiera virtuale touch, fungendo da policy aggiuntiva rispetto alla policy <ph name="VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
 
-      Se la tastiera virtuale di accessibilità è attiva, questo criterio non ha effetto.
+      Se la tastiera virtuale di accessibilità è attiva, questa policy non ha effetto.
 
-      In caso contrario, questo criterio ha il seguente effetto:
-      Se questo criterio non viene configurato, la tastiera virtuale viene visualizzata in base all'euristica di sistema predefinita, ad esempio se ci sono tastiere collegate.
-      Se questo criterio viene impostato su True, la tastiera virtuale viene sempre visualizzata.
-      Se questo criterio viene impostato su False, la tastiera virtuale non viene mai visualizzata.
+      In caso contrario, questa policy ha il seguente effetto:
+      Se questa policy non viene configurata, la tastiera virtuale viene visualizzata in base all'euristica di sistema predefinita, ad esempio se ci sono tastiere collegate.
+      Se questa policy viene impostata su True, la tastiera virtuale viene sempre visualizzata.
+      Se questa policy viene impostata su False, la tastiera virtuale non viene mai visualizzata.
 
       Il layout della tastiera virtuale potrebbe diventare compatto, a seconda del metodo di immissione.</translation>
 <translation id="6404064917675764807">Non segnalare eventi di sessioni CRD</translation>
@@ -7580,46 +7580,46 @@
 <translation id="6416916931494972926">Attiva i report sulla telemetria di Kiosk Vision.</translation>
 <translation id="6417265370957905582">Assistente Google</translation>
 <translation id="6419001911253110938">Attiva la visualizzazione della schermata introduttiva per le funzionalità di AI all'interno della sessione durante il flusso di accesso</translation>
-<translation id="6421254653839955267">Impostando il criterio su Attivato, la ricerca CNAME viene saltata. Il nome del server viene utilizzato come valore inserito durante la generazione del Kerberos SPN.
+<translation id="6421254653839955267">Impostando la policy su Attivata, la ricerca CNAME viene saltata. Il nome del server viene utilizzato come valore inserito durante la generazione del Kerberos SPN.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, la ricerca CNAME determina il nome canonico del server durante la generazione del Kerberos SPN.</translation>
+Se la policy viene impostata su Disattivata o se non viene configurata, la ricerca CNAME determina il nome canonico del server durante la generazione del Kerberos SPN.</translation>
 <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation>
 <translation id="6424486395812679373">Esegui i controlli di Navigazione sicura per tutti i file scaricati</translation>
 <translation id="6426899507714989471">Disattiva l'accelerazione grafica</translation>
-<translation id="6430793593318487825">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono accedere ai sensori, come i sensori di movimento e di luce.
+<translation id="6430793593318487825">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che non possono accedere ai sensori, come i sensori di movimento e di luce.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Se lo stesso pattern URL esiste sia in questo criterio sia nel criterio <ph name="SENSORS_ALLOWED_FOR_URLS_POLICY_NAME" />, questo criterio ha la priorità e l'accesso ai sensori di movimento o di luce verrà bloccato.
+      Se lo stesso pattern URL esiste sia in questa policy sia nella policy <ph name="SENSORS_ALLOWED_FOR_URLS_POLICY_NAME" />, questa policy ha la priorità e l'accesso ai sensori di movimento o di luce verrà bloccato.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="6431446111529802555">Europa.</translation>
 <translation id="6433697627431665375">Impedisci l'inclusione dei dati di <ph name="PRODUCT_NAME" /> nei backup</translation>
 <translation id="6436052172226685535">Comportamento predefinito di LBS</translation>
-<translation id="6438472072089952201"><ph name="PRODUCT_NAME" /> tenta di eseguire l'upgrade di alcune navigazioni da HTTP a HTTPS, se possibile. È possibile utilizzare questo criterio per disabilitare questo comportamento. Se viene impostata su "true" o non viene impostata, questa funzionalità verrà attivata per impostazione predefinita.
+<translation id="6438472072089952201"><ph name="PRODUCT_NAME" /> tenta di eseguire l'upgrade di alcune navigazioni da HTTP a HTTPS, se possibile. È possibile utilizzare questa policy per disabilitare questo comportamento. Se viene impostata su "true" o non viene impostata, questa funzionalità verrà attivata per impostazione predefinita.
 
-Il criterio <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> separato può essere utilizzato per escludere determinati nomi host o pattern dei nomi host dall'upgrade a HTTPS da parte di questa funzionalità.
+La policy <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> separata può essere utilizzata per escludere determinati nomi host o pattern dei nomi host dall'upgrade a HTTPS da parte di questa funzionalità.
 
-Vedi anche il criterio <ph name="HTTPS_ONLY_MODE_POLICY_NAME" />.</translation>
+Vedi anche la policy <ph name="HTTPS_ONLY_MODE_POLICY_NAME" />.</translation>
 <translation id="6440051664870270040">Consenti ai siti di navigare e aprire popup contemporaneamente</translation>
 <translation id="6441781723322254041">Consenti cookie troncati</translation>
 <translation id="6446366416439249472">Disattiva la sincronizzazione Google Drive tramite reti cellulari</translation>
-<translation id="6447628816682315403">Un criterio per stabilire se i tuoi utenti possono attivare o disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla protezione dal fingerprinting.
+<translation id="6447628816682315403">Una policy per stabilire se i tuoi utenti possono attivare o disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla protezione dal fingerprinting.
 
-Se imposti questo criterio su Disattivato, l'impostazione della funzionalità di protezione dal fingerprinting verrà disattivata per i tuoi utenti.
-Se imposti questo criterio su Attivato, l'impostazione della funzionalità di protezione dal fingerprinting verrà attivata per i tuoi utenti.
-Se il criterio non viene configurato, gli utenti potranno attivare o disattivare la funzionalità di protezione dal fingerprinting tramite le impostazioni della UI. Lo stato predefinito sarà false o disattivato, il che significa che la funzionalità di protezione dal fingerprinting verrà disattivata.</translation>
+Se imposti questa policy su Disattivata, l'impostazione della funzionalità di protezione dal fingerprinting verrà disattivata per i tuoi utenti.
+Se imposti questa policy su Attivata, l'impostazione della funzionalità di protezione dal fingerprinting verrà attivata per i tuoi utenti.
+Se la policy non viene configurata, gli utenti potranno attivare o disattivare la funzionalità di protezione dal fingerprinting tramite le impostazioni della UI. Lo stato predefinito sarà false o disattivata, il che significa che la funzionalità di protezione dal fingerprinting verrà disattivata.</translation>
 <translation id="6447948611083700881">Backup e ripristino disabilitati</translation>
 <translation id="6449476513004303784">Non consentire agli utenti di gestire i certificati
 </translation>
 <translation id="6449541189334851559">Consente di attivare l'integrazione di <ph name="GOOGLE_CALENDAR_NAME" />, che permette agli utenti di <ph name="PRODUCT_OS_NAME" /> di recuperare eventi da <ph name="GOOGLE_CALENDAR_NAME" /> per completare il widget calendario di <ph name="PRODUCT_OS_NAME" /> nella barra di stato del sistema.
 
-          Se questo criterio viene attivato, il dispositivo <ph name="PRODUCT_OS_NAME" /> può recuperare gli eventi <ph name="GOOGLE_CALENDAR_NAME" /> per completare il widget calendario di <ph name="PRODUCT_OS_NAME" /> nella barra di stato del sistema per l'utente che ha eseguito l'accesso.
+          Se questa policy viene attivata, il dispositivo <ph name="PRODUCT_OS_NAME" /> può recuperare gli eventi <ph name="GOOGLE_CALENDAR_NAME" /> per completare il widget calendario di <ph name="PRODUCT_OS_NAME" /> nella barra di stato del sistema per l'utente che ha eseguito l'accesso.
 
-          Se questo criterio viene disattivato, il dispositivo <ph name="PRODUCT_OS_NAME" /> non può recuperare eventi <ph name="GOOGLE_CALENDAR_NAME" /> per completare il widget calendario di <ph name="PRODUCT_OS_NAME" /> nella barra di stato del sistema per l'utente che ha eseguito l'accesso.
+          Se questa policy viene disattivata, il dispositivo <ph name="PRODUCT_OS_NAME" /> non può recuperare eventi <ph name="GOOGLE_CALENDAR_NAME" /> per completare il widget calendario di <ph name="PRODUCT_OS_NAME" /> nella barra di stato del sistema per l'utente che ha eseguito l'accesso.
 
-          Se questo criterio non viene configurato, la funzionalità <ph name="GOOGLE_CALENDAR_NAME" /> è attiva per impostazione predefinita per gli utenti aziendali.</translation>
-<translation id="6452882999388592166">Se impostato su Attivato, l'estensione del componente CryptoToken integrata viene caricata all'avvio. Se impostato su Disattivato o se non viene configurato, CryptoToken non viene caricato all'avvio del browser. Questo criterio è inteso come soluzione alternativa temporanea per i siti non funzionanti perché "chrome.runtime" non è definito come effetto collaterale della rimozione di CryptoToken nella versione M106. I siti web non devono dipendere dalla definizione senza condizioni di "chrome.runtime".</translation>
+          Se questa policy non viene configurata, la funzionalità <ph name="GOOGLE_CALENDAR_NAME" /> è attiva per impostazione predefinita per gli utenti aziendali.</translation>
+<translation id="6452882999388592166">Se impostata su Attivata, l'estensione del componente CryptoToken integrata viene caricata all'avvio. Se impostata su Disattivata o se non viene configurata, CryptoToken non viene caricato all'avvio del browser. Questa policy è intesa come soluzione alternativa temporanea per i siti non funzionanti perché "chrome.runtime" non è definito come effetto collaterale della rimozione di CryptoToken nella versione M106. I siti web non devono dipendere dalla definizione senza condizioni di "chrome.runtime".</translation>
 <translation id="6453641799812499182">Attiva le mitigazioni dei controlli <ph name="CORS" /> nella nuova implementazione <ph name="CORS" /></translation>
 <translation id="645425387487868471">Attiva l'accesso forzato per <ph name="PRODUCT_NAME" /></translation>
 <translation id="6454450724849956537">Attiva le barre di scorrimento attivabili da tastiera</translation>
@@ -7627,38 +7627,38 @@
 
       Consente di attivare all'indirizzo chrome://password-change una pagina che permette agli utenti SAML di cambiare le loro password SAML all'interno della sessione, il che assicura che le password SAML e quelle per la schermata di blocco del dispositivo rimangano sincronizzate.
 
-      Questo criterio inoltre consente le notifiche che avvisano gli utenti SAML se le loro password SAML stanno per scadere, in modo che possano organizzarsi immediatamente ed effettuare una modifica della password all'interno della sessione.
+      Questa policy inoltre consente le notifiche che avvisano gli utenti SAML se le loro password SAML stanno per scadere, in modo che possano organizzarsi immediatamente ed effettuare una modifica della password all'interno della sessione.
       Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal provider di identità SAML durante il flusso di accesso SAML.
 
-      Se questo criterio viene impostato su Disattivato o se non viene configurato, non è possibile modificare le password SAML all'indirizzo chrome://password-change e non verranno mostrate notifiche quando tali password stanno per scadere.</translation>
+      Se questa policy viene impostata su Disattivata o se non viene configurata, non è possibile modificare le password SAML all'indirizzo chrome://password-change e non verranno mostrate notifiche quando tali password stanno per scadere.</translation>
 <translation id="6457477291648119596">Type42</translation>
-<translation id="6457901822929629835">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che possono eseguire JavaScript.
+<translation id="6457901822929629835">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che possono eseguire JavaScript.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_JAVA_SCRIPT_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_JAVA_SCRIPT_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
-<translation id="6458361632497500815">Se il criterio viene impostato su Attivato o se non viene configurato, tutti gli utenti possono utilizzare <ph name="PRODUCT_CROSTINI_NAME" /> finché tutti e tre i criteri, <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" />, <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> e <ph name="DEVICE_UNAFFILIATED_CROSTINI_ALLOWED_POLICY_NAME" /> sono impostati su Attivato. Se il criterio viene impostato su Disattivato, gli utenti non affiliati non possono utilizzare <ph name="PRODUCT_CROSTINI_NAME" />. Impostando il criterio su Disattivato, questo viene applicato all'avvio di nuovi container <ph name="PRODUCT_CROSTINI_NAME" />, non a quelli già in esecuzione.</translation>
-<translation id="6462604655173570082">Se il criterio non viene configurato o se viene impostato su Attivato, gli utenti possono visualizzare e usare il pulsante <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nella casella di ricerca della pagina Nuova scheda. Se il criterio viene impostato su Disattivato, gli utenti non vedranno il pulsante <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nella casella di ricerca della pagina Nuova scheda.</translation>
+<translation id="6458361632497500815">Se la policy viene impostata su Attivata o se non viene configurata, tutti gli utenti possono utilizzare <ph name="PRODUCT_CROSTINI_NAME" /> finché tutte e tre le policy, <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" />, <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> e <ph name="DEVICE_UNAFFILIATED_CROSTINI_ALLOWED_POLICY_NAME" /> sono impostate su Attivata. Se la policy viene impostata su Disattivata, gli utenti non affiliati non possono utilizzare <ph name="PRODUCT_CROSTINI_NAME" />. Impostando la policy su Disattivata, questa viene applicata all'avvio di nuovi container <ph name="PRODUCT_CROSTINI_NAME" />, non a quelli già in esecuzione.</translation>
+<translation id="6462604655173570082">Se la policy non viene configurata o se viene impostata su Attivata, gli utenti possono visualizzare e usare il pulsante <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nella casella di ricerca della pagina Nuova scheda. Se la policy viene impostata su Disattivata, gli utenti non vedranno il pulsante <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nella casella di ricerca della pagina Nuova scheda.</translation>
 <translation id="6464074037294098618">Attiva la Compilazione automatica per gli indirizzi</translation>
-<translation id="6464564464230511695">Se questo criterio viene attivato o se non viene configurato, la funzionalità <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> è consentita in tutte le pagine web.
+<translation id="6464564464230511695">Se questa policy viene attivata o se non viene configurata, la funzionalità <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> è consentita in tutte le pagine web.
 
-Se viene disattivato, <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> non è disponibile in nessuna pagina web.
+Se viene disattivata, <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> non è disponibile in nessuna pagina web.
 
 Le funzionalità di IA generativa che fanno parte di questa funzionalità non sono disponibili per gli account aziendali o scolastici.</translation>
 <translation id="6467613372414922590">Consenti host di messaggistica nativi a livello di utente (installati senza privilegi di amministratore)</translation>
 <translation id="6467707081687600148">Programma un riavvio automatico dopo l'applicazione di un aggiornamento di <ph name="PRODUCT_OS_NAME" />.
 
-Se il criterio viene impostato su true, viene programmato un riavvio automatico dopo l'applicazione di un aggiornamento di <ph name="PRODUCT_OS_NAME" /> e il riavvio è necessario per completare il processo di aggiornamento. Il riavvio è programmato immediatamente, ma può essere ritardato sul dispositivo fino a 24 ore, se questo è attualmente in uso.
+Se la policy viene impostata su true, viene programmato un riavvio automatico dopo l'applicazione di un aggiornamento di <ph name="PRODUCT_OS_NAME" /> e il riavvio è necessario per completare il processo di aggiornamento. Il riavvio è programmato immediatamente, ma può essere ritardato sul dispositivo fino a 24 ore, se questo è attualmente in uso.
 
-Se il criterio viene impostato su false, dopo l'applicazione di un aggiornamento di <ph name="PRODUCT_OS_NAME" /> non viene programmato il riavvio automatico. Il processo di aggiornamento viene completato al successivo riavvio del dispositivo da parte dell'utente.
+Se la policy viene impostata su false, dopo l'applicazione di un aggiornamento di <ph name="PRODUCT_OS_NAME" /> non viene programmato il riavvio automatico. Il processo di aggiornamento viene completato al successivo riavvio del dispositivo da parte dell'utente.
 
-Se configuri questo criterio, gli utenti non possono modificarlo o eseguirne l'override.
+Se configuri questa policy, gli utenti non possono modificarloa o eseguirne l'override.
 
 Nota: al momento i riavvii automatici sono abilitati solo quando la schermata di accesso è in visualizzazione o è in corso una sessione di app kiosk.</translation>
 <translation id="6471018476824827813">La raccolta di metriche con chiave URL è consentita</translation>
 <translation id="6471927932956897852">Consente di specificare se è necessario usare P2P per i payload di aggiornamento del sistema operativo.
-Se questo criterio viene impostato su True, i dispositivi condivideranno e proveranno a consumare i payload di aggiornamento sulla LAN, riducendo potenzialmente l'utilizzo e la congestione della larghezza di banda internet. Se il payload di aggiornamento non è disponibile sulla LAN, il dispositivo ricorrerà al download da un server di aggiornamento.
-Se il criterio viene impostato su False, non verrà utilizzato P2P.
+Se questa policy viene impostata su True, i dispositivi condivideranno e proveranno a consumare i payload di aggiornamento sulla LAN, riducendo potenzialmente l'utilizzo e la congestione della larghezza di banda internet. Se il payload di aggiornamento non è disponibile sulla LAN, il dispositivo ricorrerà al download da un server di aggiornamento.
+Se la policy viene impostata su False, non verrà utilizzato P2P.
 
 NOTA: il comportamento predefinito per i dispositivi di consumatori e aziende è diverso perché sui dispositivi gestiti verrà attivato P2P, che invece non verrà attivato sui dispositivi non gestiti.</translation>
 <translation id="6473623140202114570">Configura l'elenco di domini sui quali Navigazione sicura non attiverà avvisi.</translation>
@@ -7668,74 +7668,74 @@
 <translation id="6477685422297715670">Colore della retroilluminazione della tastiera verde</translation>
 <translation id="6477933144150138501">Consenti alle origini delle app web isolate di comunicare con gli endpoint di rete privata nell'API Direct Sockets</translation>
 <translation id="6478258366184919502">Origini della schermata di accesso</translation>
-<translation id="6478261301433199402">La configurazione del criterio consente di specificare l'immagine <ph name="PLUGIN_VM_NAME" /> per un utente. È necessario specificare il criterio come stringa in formato JSON, con <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> che specifica da dove viene scaricata l'immagine e l'hash SHA-256 <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> utilizzato per verificare l'integrità del download.</translation>
+<translation id="6478261301433199402">La configurazione della policy consente di specificare l'immagine <ph name="PLUGIN_VM_NAME" /> per un utente. È necessario specificare la policy come stringa in formato JSON, con <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> che specifica da dove viene scaricata l'immagine e l'hash SHA-256 <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> utilizzato per verificare l'integrità del download.</translation>
 <translation id="6481245670325946423">È consentito l'uso della modalità headless</translation>
-<translation id="648158446793103284">Se il criterio viene impostato, gli utenti possono scegliere uno dei metodi di immissione per le sessioni <ph name="PRODUCT_OS_NAME" /> specificate.
+<translation id="648158446793103284">Se la policy viene impostata, gli utenti possono scegliere uno dei metodi di immissione per le sessioni <ph name="PRODUCT_OS_NAME" /> specificate.
 
-       Se il criterio non viene configurato o se è impostato su un elenco vuoto, gli utenti possono selezionare tutti i metodi di immissione supportati.
+       Se la policy non viene configurata o se è impostata su un elenco vuoto, gli utenti possono selezionare tutti i metodi di immissione supportati.
 
        A partire dalla versione M106, i metodi di immissione consentiti vengono attivati automaticamente nella sessione kiosk.
 
-      Nota: se il metodo di immissione corrente non è supportato, il criterio passa automaticamente al layout della tastiera hardware (se consentito) o alla prima voce valida in questo elenco. I metodi non supportati o non validi vengono ignorati.</translation>
+      Nota: se il metodo di immissione corrente non è supportato, la policy passa automaticamente al layout della tastiera hardware (se consentito) o alla prima voce valida in questo elenco. I metodi non supportati o non validi vengono ignorati.</translation>
 <translation id="6483115462650732746">Mostra il menu Accessibilità mobile in modalità kiosk</translation>
 <translation id="6491139795995924304">Consenti Bluetooth sul dispositivo</translation>
 <translation id="6491305972928809525">Non mostrare il menu Accessibilità mobile in modalità kiosk</translation>
-<translation id="6491872498385040936">Questo criterio è deprecato. È possibile utilizzare il criterio <ph name="FORCE_YOUTUBE_RESTRICT_POLICY_NAME" />, che sostituisce questo criterior e consente un perfezionamento più preciso.
+<translation id="6491872498385040936">Questa policy è deprecata. È possibile utilizzare la policy <ph name="FORCE_YOUTUBE_RESTRICT_POLICY_NAME" />, che sostituisce questa policy e consente un perfezionamento più preciso.
 
       Forza la modalità Restrizione moderata di YouTube e impedisce agli utenti di modificare l'impostazione.
 
       Se questa impostazione viene attivata, verrà sempre applicata almeno la modalità Restrizione moderata di YouTube.
 
-      Se questa impostazione viene disattivata o non viene impostato alcun valore, la Modalità con restrizioni su YouTube non verrà applicata da <ph name="PRODUCT_NAME" />. La Modalità con restrizioni potrebbe essere comunque applicata da criteri esterni, ad esempio dalle norme di YouTube.</translation>
+      Se questa impostazione viene disattivata o non viene impostato alcun valore, la Modalità con restrizioni su YouTube non verrà applicata da <ph name="PRODUCT_NAME" />. La Modalità con restrizioni potrebbe essere comunque applicata da policy esterne, ad esempio dalle norme di YouTube.</translation>
 <translation id="6492177700737407141">Gli utenti registrati al programma di protezione avanzata riceveranno solo le protezioni per i consumatori standard</translation>
-<translation id="6492737559291967859">Questo criterio consente di specificare la lingua da utilizzare per <ph name="PRODUCT_NAME" />.
+<translation id="6492737559291967859">Questa policy consente di specificare la lingua da utilizzare per <ph name="PRODUCT_NAME" />.
 
-      Se il criterio viene disattivato o non viene impostato, significa che saranno utilizzate le prime impostazioni internazionali valide provenienti da:
+      Se la policy viene disattivata o non viene impostata, significa che saranno utilizzate le prime impostazioni internazionali valide provenienti da:
       1) Le impostazioni internazionali specificate dall'utente (se configurate).
       2) Le impostazioni internazionali di sistema.
       3) Le impostazioni internazionali di riserva (en-US).</translation>
 <translation id="6493089139124468815">Consenti ai siti di chiedere all'utente di concedere l'autorizzazione di accesso dei siti agli appunti</translation>
 <translation id="6493918190032622602">Versione minima consentita di <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="6495337487202227251">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
+<translation id="6495337487202227251">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale lo schermo viene bloccato quando viene usata la batteria.
 
-          Se questo criterio viene impostato su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> blocchi lo schermo.
+          Se questa policy viene impostata su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> blocchi lo schermo.
 
-          Se questo criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non blocca lo schermo quando l'utente diventa inattivo.
+          Se questa policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non blocca lo schermo quando l'utente diventa inattivo.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il metodo consigliato per bloccare lo schermo in caso di inattività consiste nell'attivare il blocco dello schermo in caso di sospensione e fare in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Questo criterio dovrebbe essere usato soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non si vuole affatto la sospensione in caso di inattività.
+          Il metodo consigliato per bloccare lo schermo in caso di inattività consiste nell'attivare il blocco dello schermo in caso di sospensione e fare in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Questa policy dovrebbe essere usata soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non si vuole affatto la sospensione in caso di inattività.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori al ritardo di inattività.</translation>
-<translation id="6496139622896320246">Se il criterio viene attivato, <ph name="PRODUCT_OS_NAME" /> salverà automaticamente le credenziali Wi-Fi attive del kiosk a livello di dispositivo: il Wi-Fi attivo può essere utilizzato da qualsiasi altra app kiosk o qualsiasi altro relativo utente sul dispositivo.
-Se questo criterio non viene configurato o se viene disattivato, le credenziali Wi-Fi attive del kiosk vengono memorizzate a livello di kiosk: il Wi-Fi configurato in un'app kiosk può essere utilizzato solo all'interno di quell'app.
-Questo criterio non è consigliato e deve essere utilizzato quando non sono disponibili altre opzioni, come il criterio OpenNetworkConfiguration.</translation>
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori al ritardo di inattività.</translation>
+<translation id="6496139622896320246">Se la policy viene attivata, <ph name="PRODUCT_OS_NAME" /> salverà automaticamente le credenziali Wi-Fi attive del kiosk a livello di dispositivo: il Wi-Fi attivo può essere utilizzato da qualsiasi altra app kiosk o qualsiasi altro relativo utente sul dispositivo.
+Se questa policy non viene configurata o se viene disattivata, le credenziali Wi-Fi attive del kiosk vengono memorizzate a livello di kiosk: il Wi-Fi configurato in un'app kiosk può essere utilizzato solo all'interno di quell'app.
+Questa policy non è consigliata e deve essere utilizzata quando non sono disponibili altre opzioni, come la policy OpenNetworkConfiguration.</translation>
 <translation id="6497085755801788141">Utilizza lo strumento di verifica dei certificati integrato</translation>
 <translation id="6499579502664610993">Esegui l'override degli insiemi di siti web correlati.</translation>
-<translation id="6504720469162323184">La configurazione del criterio consente di determinare la quantità di tempo in millisecondi trascorsa senza attività utente prima che venga effettuato l'accesso automatico all'account locale del dispositivo specificato dal criterio <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />.
+<translation id="6504720469162323184">La configurazione della policy consente di determinare la quantità di tempo in millisecondi trascorsa senza attività utente prima che venga effettuato l'accesso automatico all'account locale del dispositivo specificato dalla policy <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />.
 
-Se il criterio non viene configurato, il timeout è 0 millisecondi.
+Se la policy non viene configurata, il timeout è 0 millisecondi.
 
-Se il criterio <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> non viene configurato, questo criterio non ha alcun effetto.</translation>
-<translation id="65055701428353978">La configurazione di questo criterio consente di specificare per ogni estensione interessata un elenco di URL di reindirizzamento OAuth che possono essere utilizzati dalle estensioni con l'API <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />), oltre all'URL di reindirizzamento standard https://&lt;extension id&gt;.chromiumapp.org/.
+Se la policy <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> non viene configurata, questa policy non ha alcun effetto.</translation>
+<translation id="65055701428353978">La configurazione di questa policy consente di specificare per ogni estensione interessata un elenco di URL di reindirizzamento OAuth che possono essere utilizzati dalle estensioni con l'API <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />), oltre all'URL di reindirizzamento standard https://&lt;extension id&gt;.chromiumapp.org/.
 
-Se il criterio non viene configurato o se viene fornito un elenco vuoto di URL, tutte le app o le estensioni possono usare solo l'URL di reindirizzamento standard quando viene usata l'API <ph name="IDENTITY_API_NAME" />.</translation>
-<translation id="6506486086262398387">Se il criterio viene impostato su Attivato, la funzionalità Condivisione file di rete di <ph name="PRODUCT_OS_NAME" /> utilizza l'autenticazione NTLM per le condivisioni SMB, se necessario. Se viene impostato su Disattivato, l'autenticazione NTLM per le condivisioni SMB viene disattivata.
+Se la policy non viene configurata o se viene fornito un elenco vuoto di URL, tutte le app o le estensioni possono usare solo l'URL di reindirizzamento standard quando viene usata l'API <ph name="IDENTITY_API_NAME" />.</translation>
+<translation id="6506486086262398387">Se la policy viene impostata su Attivata, la funzionalità Condivisione file di rete di <ph name="PRODUCT_OS_NAME" /> utilizza l'autenticazione NTLM per le condivisioni SMB, se necessario. Se viene impostata su Disattivata, l'autenticazione NTLM per le condivisioni SMB viene disattivata.
 
-      Se non viene configurato, il comportamento predefinito è off per gli utenti gestiti e on per gli altri utenti.</translation>
-<translation id="6508403116553969858">Imposta il valore predefinito del criterio per le funzionalità di AI generativa incluse in <ph name="PRODUCT_NAME" /></translation>
+      Se non viene configurata, il comportamento predefinito è off per gli utenti gestiti e on per gli altri utenti.</translation>
+<translation id="6508403116553969858">Imposta il valore predefinito della policy per le funzionalità di AI generativa incluse in <ph name="PRODUCT_NAME" /></translation>
 <translation id="6508882314969525299">Disattiva i report sulla telemetria di Kiosk Vision.</translation>
 <translation id="6509376413448002446">Consente di configurare il salvaschermo dell'utente per la schermata di blocco.
 
-Se questo criterio viene impostato su true, quando il dispositivo <ph name="PRODUCT_OS_NAME" /> sarà inattivo verrà mostrato un salvaschermo nella schermata di blocco.
+Se questa policy viene impostata su true, quando il dispositivo <ph name="PRODUCT_OS_NAME" /> sarà inattivo verrà mostrato un salvaschermo nella schermata di blocco.
 
-Se questo criterio viene impostato su false o se non viene configurato, il salvaschermo non verrà visualizzato nella schermata di blocco.
+Se questa policy viene impostata su false o se non viene configurata, il salvaschermo non verrà visualizzato nella schermata di blocco.
 
-Il salvaschermo dell'utente mostra le immagini a cui fa riferimento il criterio <ph name="SCREENSAVER_LOCK_SCREEN_IMAGES_POLICY_NAME" />. Se il criterio <ph name="SCREENSAVER_LOCK_SCREEN_IMAGES_POLICY_NAME" /> non viene configurato o se viene impostato un elenco vuoto oppure un elenco senza immagini valide, il salvaschermo per la schermata di blocco non verrà visualizzato.
+Il salvaschermo dell'utente mostra le immagini a cui fa riferimento la policy <ph name="SCREENSAVER_LOCK_SCREEN_IMAGES_POLICY_NAME" />. Se la policy <ph name="SCREENSAVER_LOCK_SCREEN_IMAGES_POLICY_NAME" /> non viene configurata o se viene impostato un elenco vuoto oppure un elenco senza immagini valide, il salvaschermo per la schermata di blocco non verrà visualizzato.
 
-È possibile modificare il timeout di inattività per l'avvio del salvaschermo e il tempo di visualizzazione di un'immagine rispettivamente con i criteri <ph name="SCREENSAVER_LOCK_SCREEN_IDLE_TIMEOUT_SECONDS_POLICY_NAME" /> e <ph name="SCREENSAVER_LOCK_SCREEN_DISPLAY_INTERVAL_SECONDS_POLICY_NAME" />. Se questi criteri non vengono configurati, verranno usati i relativi valori predefiniti.</translation>
+È possibile modificare il timeout di inattività per l'avvio del salvaschermo e il tempo di visualizzazione di un'immagine rispettivamente con le policy <ph name="SCREENSAVER_LOCK_SCREEN_IDLE_TIMEOUT_SECONDS_POLICY_NAME" /> e <ph name="SCREENSAVER_LOCK_SCREEN_DISPLAY_INTERVAL_SECONDS_POLICY_NAME" />. Se queste policy non vengono configurate, verranno usati i relativi valori predefiniti.</translation>
 <translation id="651248769129998376">Non creare o caricare richieste di installazione di estensioni nella Console di amministrazione</translation>
 <translation id="6513453889192806240">Latenza HTTPS</translation>
 <translation id="6515357889978918016">Immagine <ph name="PLUGIN_VM_NAME" /></translation>
@@ -7748,36 +7748,36 @@
 non andrà a buon fine. Inoltre, all'utente verrà chiesto di confermare
 l'operazione tramite una finestra di dialogo.
 
-Con questo criterio, gli amministratori possono specificare le origini da cui è possibile
+Con questa policy, gli amministratori possono specificare le origini da cui è possibile
 chiamare le API senza un gesto precedente dell'utente né la richiesta di conferma.
 
 Per informazioni dettagliate sui pattern URL validi, visita la pagina
 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. * non è
-un valore accettato per questo criterio.
+un valore accettato per questa policy.
 
-Se questo criterio non viene impostato, tutte le origini richiederanno un gesto precedente dell'utente per chiamare
+Se questa policy non viene impostata, tutte le origini richiederanno un gesto precedente dell'utente per chiamare
 queste API e all'utente verrà mostrata una finestra di dialogo di conferma.</translation>
-<translation id="6520053715392444458">Se questo criterio viene attivato o non viene configurato, <ph name="PRODUCT_NAME" /> potrà inviare a Google download sospetti da utenti che hanno attivato Navigazione sicura per verificare la presenza di malware o chiedere agli utenti di fornire una password per gli archivi criptati.
-Se questo criterio viene disattivato, l'analisi non verrà eseguita.
-Questo criterio non influisce sull'analisi dei contenuti dei download configurata da Chrome Enterprise Connectors.</translation>
+<translation id="6520053715392444458">Se questa policy viene attivata o non viene configurata, <ph name="PRODUCT_NAME" /> potrà inviare a Google download sospetti da utenti che hanno attivato Navigazione sicura per verificare la presenza di malware o chiedere agli utenti di fornire una password per gli archivi criptati.
+Se questa policy viene disattivata, l'analisi non verrà eseguita.
+Questa policy non influisce sull'analisi dei contenuti dei download configurata da Chrome Enterprise Connectors.</translation>
 <translation id="6520802717075138474">Importa motori di ricerca dal browser predefinito alla prima esecuzione</translation>
 <translation id="6521971538031711337">Evita che un utente gestito configuri il nome host del dispositivo</translation>
 <translation id="6523079496775454310">Attiva il consenso degli indicatori dei dispositivi per gli utenti gestiti su dispositivi non gestiti</translation>
 <translation id="6527674993612811419">Mostra avvisi e disattiva la compilazione automatica sui moduli non sicuri</translation>
 <translation id="6532769014584932288">Consenti i wakelock</translation>
 <translation id="6533881418188970751">Chiedi all'utente dove salvare il file prima di avviare il download</translation>
-<translation id="6534181153831265700">La configurazione del criterio consente di specificare la frequenza in giorni con cui un client modifica la password dell'account della propria macchina. La password viene generata automaticamente dal client e non può essere visualizzata dall'utente. Se il criterio viene disattivato o se viene impostato su un numero alto di giorni, la sicurezza potrebbe risentirne, poiché i potenziali utenti malintenzionati hanno più tempo a disposizione per scoprire e utilizzare la password dell'account della macchina.
+<translation id="6534181153831265700">La configurazione della policy consente di specificare la frequenza in giorni con cui un client modifica la password dell'account della propria macchina. La password viene generata automaticamente dal client e non può essere visualizzata dall'utente. Se la policy viene disattivata o se viene impostata su un numero alto di giorni, la sicurezza potrebbe risentirne, poiché i potenziali utenti malintenzionati hanno più tempo a disposizione per scoprire e utilizzare la password dell'account della macchina.
 
-Se non viene configurato, la password dell'account della macchina viene modificata ogni 30 giorni.
+Se non viene configurata, la password dell'account della macchina viene modificata ogni 30 giorni.
 
-Se viene impostato su 0, la password dell'account della macchina non viene mai modificata.
+Se viene impostata su 0, la password dell'account della macchina non viene mai modificata.
 
 Nota: se il client è stato offline per un periodo di tempo maggiore del numero di giorni specificato, le password potrebbero durare più a lungo.</translation>
 <translation id="653616551212414363">Se questa impostazione viene attivata, all'utente verrà mostrata una notifica quando verrà collegato un dispositivo USB su <ph name="PRODUCT_OS_NAME" />.
 
       Se questa impostazione viene disattivata, le notifiche relative ai dispositivi USB collegati non verranno mostrate all'utente.
 
-      Se questo criterio non viene configurato, gli utenti riceveranno le notifiche relative ai dispositivi USB collegati.</translation>
+      Se questa policy non viene configurata, gli utenti riceveranno le notifiche relative ai dispositivi USB collegati.</translation>
 <translation id="6536600139108165863">Riavvia automaticamente allo spegnimento del dispositivo</translation>
 <translation id="6538355612742474835">Consenti Aiutami a leggere e migliora i modelli di AI.</translation>
 <translation id="6538653424603921690">Disattiva sempre la Schermata privata nella schermata di accesso</translation>
@@ -7785,31 +7785,31 @@
 <translation id="6541383786427998658">Attiva il log di sistema per le estensioni aziendali</translation>
 <translation id="654303922206238013">Strategia di migrazione per ecryptfs</translation>
 <translation id="6544601600794014309">Attiva traduzioni di Risposte rapide</translation>
-<translation id="654546276700640113">Se il criterio viene impostato, viene applicata la lunghezza massima del PIN configurata. Se viene impostato un valore uguale o inferiore a 0, l'utente può impostare un PIN della lunghezza che preferisce. Se viene impostato un valore inferiore a quello del criterio <ph name="PIN_UNLOCK_MINIMUM_LENGTH_POLICY_NAME" />, ma superiore a 0, la lunghezza massima viene impostata sullo stesso valore della lunghezza minima.
+<translation id="654546276700640113">Se la policy viene impostata, viene applicata la lunghezza massima del PIN configurata. Se viene impostato un valore uguale o inferiore a 0, l'utente può impostare un PIN della lunghezza che preferisce. Se viene impostato un valore inferiore a quello della policy <ph name="PIN_UNLOCK_MINIMUM_LENGTH_POLICY_NAME" />, ma superiore a 0, la lunghezza massima viene impostata sullo stesso valore della lunghezza minima.
 
-      Se il criterio non viene configurato non viene applicata una lunghezza massima.</translation>
+      Se la policy non viene configurata non viene applicata una lunghezza massima.</translation>
 <translation id="6546185795045702747">Consenti ai siti web di controllare se l'utente ha salvato dei metodi di pagamento</translation>
 <translation id="6553143066970470539">Percentuale di luminosità dello schermo</translation>
 <translation id="6554236101741861403">Frequenza di raccolta dei dati di telemetria dei siti web sui dispositivi registrati per gli utenti affiliati. Il valore minimo consentito è 5 minuti.
 
-Se il criterio non viene configurato, viene applicata la frequenza predefinita di 15 minuti.</translation>
-<translation id="6555378905432946848">La configurazione del criterio consente di disattivare l'applicazione dei requisiti relativi alle informative di Certificate Transparency per un elenco di autorità di certificazione precedenti per la creazione di catene di certificati con un hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> specificato. Gli host aziendali possono continuare a utilizzare i certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato. Per disattivare l'applicazione, l'hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> deve essere presente in un certificato CA riconosciuto come autorità di certificazione precedente. Un'autorità di certificazione precedente viene considerata attendibile pubblicamente da uno o più sistemi operativi supportati da <ph name="PRODUCT_NAME" />, ma non da Android Open Source Project o <ph name="PRODUCT_OS_NAME" />.
+Se la policy non viene configurata, viene applicata la frequenza predefinita di 15 minuti.</translation>
+<translation id="6555378905432946848">La configurazione della policy consente di disattivare l'applicazione dei requisiti relativi alle informative di Certificate Transparency per un elenco di autorità di certificazione precedenti per la creazione di catene di certificati con un hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> specificato. Gli host aziendali possono continuare a utilizzare i certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato. Per disattivare l'applicazione, l'hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> deve essere presente in un certificato CA riconosciuto come autorità di certificazione precedente. Un'autorità di certificazione precedente viene considerata attendibile pubblicamente da uno o più sistemi operativi supportati da <ph name="PRODUCT_NAME" />, ma non da Android Open Source Project o <ph name="PRODUCT_OS_NAME" />.
 
       Specifica un hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> collegandolo al nome dell'algoritmo di hash, una barra e la codifica Base64 dell'algoritmo di hash applicato al <ph name="SUBJECT_PUBLIC_KEY_INFO" /> con codifica DER del certificato specificato. Il formato della codifica Base64 è nello stesso formato di un'impronta SPKI. L'unico algoritmo di hash riconosciuto è sha256; gli altri vengono ignorati.
 
-      Se il criterio non è configurato e se i certificati che richiedono la divulgazione tramite Certificate Transparency non vengono divulgati, <ph name="PRODUCT_NAME" /> non ritiene attendibili gli altri certificati.
+      Se la policy non è configurata e se i certificati che richiedono la divulgazione tramite Certificate Transparency non vengono divulgati, <ph name="PRODUCT_NAME" /> non ritiene attendibili gli altri certificati.
 
-      Questo criterio è stato rimosso nella versione 128 di <ph name="PRODUCT_NAME" />.</translation>
+      Questa policy è stato rimossa nella versione 128 di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6556586932263358975">Consenti il blocco dello schermo</translation>
 <translation id="6558013557780651644">Ritardo prima dell'esecuzione di azioni in caso di inattività</translation>
 <translation id="6558812160831988140">Generazione di report sull'utilizzo delle app</translation>
 <translation id="6559057113164934677">Non consentire ad alcun sito di accedere alla fotocamera e al microfono</translation>
-<translation id="6559221564468029245">Se il criterio viene impostato su Attivato o se non viene configurato, l'utente non viene considerato inattivo durante la riproduzione di audio. In questo modo non viene raggiunto il timeout di inattività e non viene compiuta l'azione per l'inattività. Tuttavia, lo schermo viene ancora oscurato, spento e bloccato dopo i timeout configurati, nonostante l'attività audio.
+<translation id="6559221564468029245">Se la policy viene impostata su Attivata o se non viene configurata, l'utente non viene considerato inattivo durante la riproduzione di audio. In questo modo non viene raggiunto il timeout di inattività e non viene compiuta l'azione per l'inattività. Tuttavia, lo schermo viene ancora oscurato, spento e bloccato dopo i timeout configurati, nonostante l'attività audio.
 
-      Se il criterio viene impostato su Disattivato, il sistema può considerare gli utenti inattivi nonostante l'attività audio.</translation>
-<translation id="6559475864956112261">Questo criterio è deprecato. Utilizza il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
+      Se la policy viene impostata su Disattivata, il sistema può considerare gli utenti inattivi nonostante l'attività audio.</translation>
+<translation id="6559475864956112261">Questa policy è deprecata. Utilizza la policy <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       Se il criterio viene impostato su Attivato, puoi specificare il server proxy utilizzato da Chrome e impedire agli utenti di modificare le impostazioni del proxy. Chrome e le app ARC ignorano tutte le opzioni relative al proxy specificate dalla riga di comando. Il criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non viene specificato.
+       Se la policy viene impostata su Attivata, puoi specificare il server proxy utilizzato da Chrome e impedire agli utenti di modificare le impostazioni del proxy. Chrome e le app ARC ignorano tutte le opzioni relative al proxy specificate dalla riga di comando. La policy viene applicata solo se la policy <ph name="PROXY_SETTINGS_POLICY_NAME" /> non viene specificata.
 
        Vengono ignorate altre opzioni se scegli il valore:
          * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Non utilizzare mai un server proxy e connettiti sempre direttamente
@@ -7817,10 +7817,10 @@
          * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = Rileva automaticamente il server proxy
 
        Se scegli di utilizzare:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Server proxy fissi. Puoi specificare ulteriori opzioni con i criteri <ph name="PROXY_SERVER_POLICY_NAME" /> e <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Per le app ARC è disponibile solo il server proxy HTTP con la priorità più alta.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = Uno script proxy .pac. Utilizza il criterio <ph name="PROXY_PAC_URL_POLICY_NAME" /> per specificare l'URL a un file proxy .pac.
+         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Server proxy fissi. Puoi specificare ulteriori opzioni con le policy <ph name="PROXY_SERVER_POLICY_NAME" /> e <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Per le app ARC è disponibile solo il server proxy HTTP con la priorità più alta.
+         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = Uno script proxy .pac. Utilizza la policy <ph name="PROXY_PAC_URL_POLICY_NAME" /> per specificare l'URL a un file proxy .pac.
 
-      Se il criterio non viene configurato, gli utenti possono scegliere le impostazioni del proxy.
+      Se la policy non viene configurata, gli utenti possono scegliere le impostazioni del proxy.
 
       Nota: per esempi approfonditi, consulta la pagina The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="6559643481486165125">Non richiedere una nuova autorizzazione</translation>
@@ -7828,16 +7828,16 @@
 <translation id="6561396069801924653">Mostra le opzioni di accessibilità nel menu della barra delle applicazioni di sistema</translation>
 <translation id="6562889469672829421">Il periodo di tempo, in millisecondi, senza input dell'utente trascorso il quale lo schermo viene oscurato.</translation>
 <translation id="6563458316362153786">Attiva 802.11r Fast Transition</translation>
-<translation id="6563462845077594854">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che possono usare la funzionalità di acquisizione di schermate desktop, finestre e schede.
+<translation id="6563462845077594854">Se la policy viene configurata, puoi impostare un elenco di pattern URL che possono usare la funzionalità di acquisizione di schermate desktop, finestre e schede.
 
-      Se non viene configurato, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
+      Se non viene configurata, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
 
-      Il criterio non viene preso in considerazione se un sito corrisponde a un pattern URL in uno qualsiasi dei seguenti criteri: <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SAME_ORIGIN_TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />.
+      La policy non viene presa in considerazione se un sito corrisponde a un pattern URL in una qualsiasi delle seguenti policy: <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SAME_ORIGIN_TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />.
 
-      Se un sito corrisponde a un pattern URL in questo criterio, il criterio<ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" /> non sarà preso in considerazione.
+      Se un sito corrisponde a un pattern URL in questa policy, la policy<ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" /> non sarà presa in considerazione.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
-<translation id="6568977718979857253">Questo criterio è obsoleto. Usa <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per controllare se si deve utilizzare il visualizzatore PDF integrato per aprire i file PDF.
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
+<translation id="6568977718979857253">Questa policy è obsoleta. Usa <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per controllare se si deve utilizzare il visualizzatore PDF integrato per aprire i file PDF.
 
       Specifica un elenco di plug-in disattivati in <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare questa impostazione.
 
@@ -7845,69 +7845,69 @@
 
       Se attivi questa impostazione, l'elenco di plug-in specificato non verrà mai usato in <ph name="PRODUCT_NAME" />. I plug-in sono contrassegnati come disattivati in "about:plugins" e gli utenti non possono attivarli.
 
-      Tieni presente che questo criterio può essere sostituito da EnabledPlugins e da DisabledPluginsExceptions.
+      Tieni presente che questa policy può essere sostituita da EnabledPlugins e da DisabledPluginsExceptions.
 
-      Se il criterio non viene impostato, l'utente potrà usare qualsiasi plug-in installato sul sistema ad eccezione di quelli hardcoded incompatibili, obsoleti o pericolosi.</translation>
+      Se la policy non viene impostata, l'utente potrà usare qualsiasi plug-in installato sul sistema ad eccezione di quelli hardcoded incompatibili, obsoleti o pericolosi.</translation>
 <translation id="6571055160227165318">Consenti l'attivazione di WebSQL da parte del flag di Chrome.</translation>
 <translation id="6574216414580419109">Impostazioni per la funzionalità Sfondo AI generativa</translation>
 <translation id="6574903167639386816">Cancella i dati del profilo su disco al termine della sessione utente</translation>
-<translation id="6575403002861093126">La configurazione del criterio consente di specificare la durata in ore della cache dell'oggetto Criteri di gruppo (Group Policy Object, GPO): tempo massimo in cui i GPO possono essere riutilizzati prima di essere scaricati nuovamente. Invece di scaricarli di nuovo a ogni recupero del criterio, il sistema riutilizza i GPO memorizzati nella cache finché la loro versione non viene modificata.
+<translation id="6575403002861093126">La configurazione della policy consente di specificare la durata in ore della cache dell'oggetto Policy di gruppo (Group Policy Object, GPO): tempo massimo in cui i GPO possono essere riutilizzati prima di essere scaricati nuovamente. Invece di scaricarli di nuovo a ogni recupero della policy, il sistema riutilizza i GPO memorizzati nella cache finché la loro versione non viene modificata.
 
-Se il criterio viene impostato su 0, la memorizzazione nella cache dei GPO viene disattivata. Ciò aumenta il carico del server, perché i GPO vengono scaricati nuovamente a ogni recupero del criterio, anche se non sono stati modificati.
+Se la policy viene impostata su 0, la memorizzazione nella cache dei GPO viene disattivata. Ciò aumenta il carico del server, perché i GPO vengono scaricati nuovamente a ogni recupero della policy, anche se non sono stati modificati.
 
-Se non viene configurato, i GPO memorizzati nella cache possono essere riutilizzati per un tempo massimo di 25 ore.
+Se non viene configurata, i GPO memorizzati nella cache possono essere riutilizzati per un tempo massimo di 25 ore.
 
 Nota: se il dispositivo viene riavviato o se l'utente esce, la cache viene svuotata.</translation>
-<translation id="6575944031719151455">La configurazione del criterio consente di specificare l'elenco di account locali del dispositivo da visualizzare nella schermata di accesso. Gli identificatori fanno distinzione tra i diversi account locali del dispositivo.
+<translation id="6575944031719151455">La configurazione della policy consente di specificare l'elenco di account locali del dispositivo da visualizzare nella schermata di accesso. Gli identificatori fanno distinzione tra i diversi account locali del dispositivo.
 
-      Se il criterio non viene configurato o se l'elenco è vuoto, non vengono visualizzati account locali del dispositivo.</translation>
+      Se la policy non viene configurata o se l'elenco è vuoto, non vengono visualizzati account locali del dispositivo.</translation>
 <translation id="6577760914164385949">Consenti l'accesso automatico ai provider di identità cloud Microsoft®</translation>
 <translation id="6580851705156412587">Blocca il dispositivo quando viene sospeso o il coperchio viene chiuso</translation>
-<translation id="6581048059229620221">Se questo criterio viene disattivato, non è possibile avviare o configurare l'host di assistenza da remoto per accettare le connessioni in arrivo.
+<translation id="6581048059229620221">Se questa policy viene disattivata, non è possibile avviare o configurare l'host di assistenza da remoto per accettare le connessioni in arrivo.
 
-          Questo criterio non influisce sugli scenari di accesso remoto.
+          Questa policy non influisce sugli scenari di accesso remoto.
 
-          Questo criterio non impedisce agli amministratori aziendali di connettersi a dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti.
+          Questa policy non impedisce agli amministratori aziendali di connettersi a dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti.
 
-          Questo criterio non ha effetto se viene attivato, lasciato vuoto o se non viene configurato.</translation>
+          Questa policy non ha effetto se viene attivata, lasciata vuota o se non viene configurata.</translation>
 <translation id="6583249367505445969">Disattiva barra dei Preferiti</translation>
-<translation id="6583473893541367102">Se il criterio viene configurato, verrà specificato l'elenco di URL i cui pattern vengono confrontati con l'origine di sicurezza dell'URL richiedente. Una corrispondenza assicura l'accesso ai dispositivi per l'acquisizione video senza richieste
+<translation id="6583473893541367102">Se la policy viene configurata, verrà specificato l'elenco di URL i cui pattern vengono confrontati con l'origine di sicurezza dell'URL richiedente. Una corrispondenza assicura l'accesso ai dispositivi per l'acquisizione video senza richieste
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tieni presente, tuttavia, che il pattern "*", che corrisponde a qualsiasi URL, non è supportato da questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tieni presente, tuttavia, che il pattern "*", che corrisponde a qualsiasi URL, non è supportato da questa policy.</translation>
 <translation id="6584122839583172231">Le impostazioni di F12 usano la scorciatoia che contiene i tasti di modifica Ctrl e Maiusc</translation>
 <translation id="6584541828182430328">Disattiva avviso schermo intero</translation>
 <translation id="6588634282328239769">Visualizza l'URL completo</translation>
 <translation id="6589049539706330510">Attiva il supporto</translation>
-<translation id="6593025196187527239">Se il criterio viene impostato su True o se non viene configurato, gli utenti possono utilizzare ARC, a meno che ARC sia stato disattivato in altri modi. Se il criterio è impostato su False, gli utenti non affiliati non possono utilizzare ARC.
+<translation id="6593025196187527239">Se la policy viene impostata su True o se non viene configurata, gli utenti possono utilizzare ARC, a meno che ARC sia stato disattivato in altri modi. Se la policy è impostata su False, gli utenti non affiliati non possono utilizzare ARC.
 
-Le modifiche al criterio vengono applicate solo mentre ARC non è in esecuzione, ad esempio durante l'avvio di ChromeOS.</translation>
+Le modifiche alla policy vengono applicate solo mentre ARC non è in esecuzione, ad esempio durante l'avvio di ChromeOS.</translation>
 <translation id="6593350713192882944">Attiva Risposte rapide</translation>
 <translation id="6594372503585248865">Attiva l'UI relativa alla connessione sul computer desktop host remoto quando è attiva una connessione</translation>
 <translation id="65947892191748867">Disattiva il consenso degli indicatori dei dispositivi per gli utenti gestiti su dispositivi non gestiti</translation>
-<translation id="6596675965208703569">Questo criterio specifica per quanto tempo (in secondi) un dispositivo di trasmissione precedentemente selezionato tramite un codice di accesso o un codice QR può essere visualizzato nel menu di <ph name="PRODUCT_NAME" /> dei dispositivi di trasmissione.
+<translation id="6596675965208703569">Questa policy specifica per quanto tempo (in secondi) un dispositivo di trasmissione precedentemente selezionato tramite un codice di accesso o un codice QR può essere visualizzato nel menu di <ph name="PRODUCT_NAME" /> dei dispositivi di trasmissione.
       Il ciclo di vita di una voce inizia quando è stato inserito per la prima volta il codice di accesso o quando è stato scansionato per la prima volta il codice QR.
       Durante questo periodo, il dispositivo di trasmissione verrà visualizzato nell'elenco del menu di <ph name="PRODUCT_NAME" /> dei dispositivi di trasmissione.
       Dopo questo periodo, per poter usare di nuovo il dispositivo di trasmissione, il codice di accesso deve essere reinserito oppure il codice QR deve essere riscansionato.
       Per impostazione predefinita, il periodo è 0 secondi, quindi i dispositivi di trasmissione non rimarranno nel menu di <ph name="PRODUCT_NAME" />, pertanto il codice di accesso deve essere reinserito oppure il codice QR deve essere riscansionato, per iniziare una nuova sessione di trasmissione.
-      Tieni presente che questo criterio ha effetto solo finché i dispositivi di trasmissione sono visibili nel menu di <ph name="PRODUCT_NAME" /> e non influisce su eventuali sessioni di trasmissione in corso, che continueranno anche allo scadere del periodo di tempo.
-      Questo criterio non ha effetto a meno che il criterio <ph name="ACCESS_CODE_CAST_ENABLED_POLICY_NAME" /> non venga attivato.</translation>
+      Tieni presente che questa policy ha effetto solo finché i dispositivi di trasmissione sono visibili nel menu di <ph name="PRODUCT_NAME" /> e non influisce su eventuali sessioni di trasmissione in corso, che continueranno anche allo scadere del periodo di tempo.
+      Questa policy non ha effetto a meno che la policy <ph name="ACCESS_CODE_CAST_ENABLED_POLICY_NAME" /> non venga attivata.</translation>
 <translation id="6598235178374410284">Immagine avatar utente</translation>
 <translation id="6600377630856879433">Consenti acquisizione schede e finestre in base a queste origini</translation>
 <translation id="6603004149426829878">Consente di inviare sempre al server i segnali relativi alla posizione disponibili durante le operazioni per stabilire il fuso orario</translation>
-<translation id="6604049565198492174">La configurazione del criterio consente di forzare l'applicazione della configurazione di rete per utente su ogni dispositivo <ph name="PRODUCT_NAME" />. La configurazione di rete è una stringa in formato JSON come definita nel formato Open Network Configuration.</translation>
-<translation id="660567106648774919">Questo criterio è deprecato. Utilizza il criterio <ph name="TOS_DIALOG_BEHAVIOR_POLICY_NAME" />.
+<translation id="6604049565198492174">La configurazione della policy consente di forzare l'applicazione della configurazione di rete per utente su ogni dispositivo <ph name="PRODUCT_NAME" />. La configurazione di rete è una stringa in formato JSON come definita nel formato Open Network Configuration.</translation>
+<translation id="660567106648774919">Questa policy è deprecata. Utilizza la policy <ph name="TOS_DIALOG_BEHAVIOR_POLICY_NAME" />.
 
-      Per impostazione predefinita, i Termini di servizio vengono mostrati alla prima esecuzione di CCT. Se questo criterio viene impostato su Disattivato, la finestra di dialogo dei Termini di servizio non viene visualizzata né alla prima esecuzione né a quelle successive. Se questo criterio viene impostato su Attivato o se non viene configurato, la finestra di dialogo dei Termini di servizio viene visualizzata alla prima esecuzione. Altre condizioni:
+      Per impostazione predefinita, i Termini di servizio vengono mostrati alla prima esecuzione di CCT. Se questa policy viene impostata su Disattivata, la finestra di dialogo dei Termini di servizio non viene visualizzata né alla prima esecuzione né a quelle successive. Se questa policy viene impostata su Attivata o se non viene configurata, la finestra di dialogo dei Termini di servizio viene visualizzata alla prima esecuzione. Altre condizioni:
 
-      - Questo criterio funziona solo su dispositivi Android completamente gestiti che possono essere configurati da fornitori dell'Unified Endpoint Management.
+      - Questa policy funziona solo su dispositivi Android completamente gestiti che possono essere configurati da fornitori dell'Unified Endpoint Management.
 
-      - Se questo criterio viene impostato su Disattivato, il criterio BrowserSignin non ha effetto.
+      - Se questa policy viene impostata su Disattivata, la policy BrowserSignin non ha effetto.
 
-      - Se questo criterio viene impostato su Disattivato, le metriche​ non vengono inviate al server.
+      - Se questa policy viene impostata su Disattivata, le metriche​ non vengono inviate al server.
 
-      - Se questo criterio viene impostato su Disattivato, il browser ha una funzionalità limitata.
+      - Se questa policy viene impostata su Disattivata, il browser ha una funzionalità limitata.
 
-      - Se questo criterio viene impostato su Disattivato, gli amministratori devono comunicarlo agli utenti finali del dispositivo.</translation>
+      - Se questa policy viene impostata su Disattivata, gli amministratori devono comunicarlo agli utenti finali del dispositivo.</translation>
 <translation id="6605778633186421420">Attiva il supporto del trasporto dei dizionari di compressione</translation>
 <translation id="6607983779935460461">Supporto dell'URL dei dati per SVGUseElement.</translation>
 <translation id="6609867253856597039">Imposta l'esperienza utente delle funzionalità disattivate</translation>
@@ -7915,9 +7915,9 @@
 <translation id="6614648642325603511">L'algoritmo per la generazione di coppie di chiavi. L'opzione EC è supportata a partire dalla versione 132.</translation>
 <translation id="661610294649586421">Non consentire le richieste API WebAuthn su siti con certificati TLS inaccessibili.</translation>
 <translation id="6617589895942747919">Ora di inizio dell'intervallo (valore inserito incluso).</translation>
-<translation id="6621830999036927230">Se questo criterio viene configurato, l'host di accesso remoto usa l'URL indicato per convalidare i token di autenticazione dei client di accesso remoto allo scopo di accettare connessioni. Questa funzionalità viene disattivata se il criterio viene lasciato vuoto o se non viene configurato.
+<translation id="6621830999036927230">Se questa policy viene configurata, l'host di accesso remoto usa l'URL indicato per convalidare i token di autenticazione dei client di accesso remoto allo scopo di accettare connessioni. Questa funzionalità viene disattivata se la policy viene lasciata vuota o se non viene configurata.
 
-      Nota: usa questo criterio insieme al criterio <ph name="REMOTE_ACCESS_HOST_TOKEN_URL_POLICY_NAME" />.</translation>
+      Nota: usa questa policy insieme alla policy <ph name="REMOTE_ACCESS_HOST_TOKEN_URL_POLICY_NAME" />.</translation>
 <translation id="6625136649067113817">Un flag booleano che indica se la tastiera sullo schermo può offrire il controllo ortografico.</translation>
 <translation id="6626319579493977784">Impostazioni codice dinamico</translation>
 <translation id="66265932317331474">Segnala informazioni sulla CPU</translation>
@@ -7946,39 +7946,39 @@
 
       Se questa impostazione viene disattivata, gli utenti non potranno avviare l'applicazione Eche.
 
-      Se questo criterio non viene configurato, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
+      Se questa policy non viene configurata, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
 <translation id="6640748114867542396">Non consentire alle estensioni gestite di utilizzare l'API Enterprise Hardware Platform</translation>
 <translation id="6641109870010271671">Certificati TLS che <ph name="PRODUCT_NAME" /> deve considerare attendibili per l'autenticazione del server</translation>
 <translation id="6641981670621198190">Disattiva supporto per le API grafiche 3D</translation>
-<translation id="6646912445796087001">Consente di attivare o disattivare diverse funzionalità per la tastiera sullo schermo. Questo criterio viene applicato soltanto se è attivato il criterio "VirtualKeyboardEnabled".
+<translation id="6646912445796087001">Consente di attivare o disattivare diverse funzionalità per la tastiera sullo schermo. Questa policy viene applicata soltanto se è attivata la policy "VirtualKeyboardEnabled".
 
-      Se una funzionalità in questo criterio viene impostata su True, questa viene attivata per la tastiera sullo schermo.
+      Se una funzionalità in questa policy viene impostata su True, questa viene attivata per la tastiera sullo schermo.
 
-      Se una funzionalità in questo criterio viene impostata su False o non viene impostata, questa viene disattivata per la tastiera sullo schermo.
+      Se una funzionalità in questa policy viene impostata su False o non viene impostata, questa viene disattivata per la tastiera sullo schermo.
 
-      NOTA: questo criterio è supportato solo in modalità kiosk PWA.</translation>
+      NOTA: questa policy è supportata solo in modalità kiosk PWA.</translation>
 <translation id="6647965994887675196">Se questa norma è impostata su true, è possibile creare e utilizzare utenti supervisionati.
 
           Se questa norma è impostata su false o non è configurata, la creazione di utenti supervisionati e il relativo accesso saranno disattivati. Tutti gli utenti supervisionati esistenti saranno nascosti.
 
           NOTA. Il comportamento predefinito per dispositivi consumer ed enterprise è diverso: sui dispositivi consumer, gli utenti supervisionati sono abilitati per impostazione predefinita, mentre sui dispositivi enterprise sono disabilitati per impostazione predefinita.</translation>
-<translation id="6648746349186337075">Questo criterio consente di autorizzare Registra schermo a creare e trascrivere la registrazione dello schermo e a caricarla su Drive per gli utenti aziendali.
-      Questo criterio non influisce sugli utenti di Family Link.
-      Questo criterio non influisce sul criterio <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> per gli utenti di Family Link.
+<translation id="6648746349186337075">Questa policy consente di autorizzare Registra schermo a creare e trascrivere la registrazione dello schermo e a caricarla su Drive per gli utenti aziendali.
+      Questa policy non influisce sugli utenti di Family Link.
+      Questa policy non influisce sulla policy <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> per gli utenti di Family Link.
 
-      Se il criterio viene attivato o se non viene configurato, la funzionalità Registra schermo verrà attivata.
-      Se il criterio viene disattivato, la funzionalità Registra schermo verrà disattivata.</translation>
+      Se la policy viene attivata o se non viene configurata, la funzionalità Registra schermo verrà attivata.
+      Se la policy viene disattivata, la funzionalità Registra schermo verrà disattivata.</translation>
 <translation id="665023848306499203">Consenti ai dispositivi di selezionare una versione specifica per l'aggiornamento</translation>
 <translation id="6652197835259177259">Impostazioni degli utenti gestiti localmente</translation>
-<translation id="6653897159826215341">Se il criterio viene impostato su Attivato, in <ph name="PRODUCT_NAME" /> viene aperta la finestra di dialogo di stampa di sistema anziché l'anteprima di stampa integrata quando un utente richiede una stampa.
+<translation id="6653897159826215341">Se la policy viene impostata su Attivata, in <ph name="PRODUCT_NAME" /> viene aperta la finestra di dialogo di stampa di sistema anziché l'anteprima di stampa integrata quando un utente richiede una stampa.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i comandi di stampa attivano la schermata dell'anteprima di stampa.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, i comandi di stampa attivano la schermata dell'anteprima di stampa.</translation>
 <translation id="6655274714135630366">Hash SHA-256 esadecimale codificato dell'immagine disco.</translation>
-<translation id="6655844456903132379">Se il criterio viene impostato su Attivato, l'autenticazione HTTP rispetta l'approvazione da parte del criterio KDC. In altre parole, <ph name="PRODUCT_NAME" /> delega le credenziali utente al servizio a cui si accede se il KDC imposta <ph name="OK_AS_DELEGATE" /> sul ticket di servizio. Vedi RFC 5896 ( https://tools.ietf.org/html/rfc5896.html ). Il servizio dovrebbe essere consentito anche dal criterio <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />.
+<translation id="6655844456903132379">Se la policy viene impostata su Attivata, l'autenticazione HTTP rispetta l'approvazione da parte della policy KDC. In altre parole, <ph name="PRODUCT_NAME" /> delega le credenziali utente al servizio a cui si accede se il KDC imposta <ph name="OK_AS_DELEGATE" /> sul ticket di servizio. Vedi RFC 5896 ( https://tools.ietf.org/html/rfc5896.html ). Il servizio dovrebbe essere consentito anche dalla policy <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, il criterio KDC viene ignorato sulle piattaforme supportate e viene rispettato solo il criterio <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />.
+Se la policy viene impostata su Disattivata o se non viene configurata, la policy KDC viene ignorata sulle piattaforme supportate e viene rispettata solo la policy <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />.
 
-Su <ph name="MS_WIN_NAME" />, il criterio KDC viene sempre rispettato.</translation>
+Su <ph name="MS_WIN_NAME" />, la policy KDC viene sempre rispettata.</translation>
 <translation id="6658245400435704251">Consente di specificare il numero di secondi massimo per cui un dispositivo può ritardare in modo casuale il download di un suo aggiornamento dal momento della pubblicazione dell'aggiornamento sul server. Il dispositivo può attendere una parte di questo tempo in termini di tempo reale e la parte rimanente in termini di numero di controlli della disponibilità di aggiornamenti. In ogni caso, la dispersione ha un limite massimo pari a un periodo di tempo costante in modo che un dispositivo non si blocchi mai in attesa di scaricare un aggiornamento.</translation>
 <translation id="6659537776197644458">Non vengono attivati i flussi di autenticazione per la sincronizzazione delle password</translation>
 <translation id="6659877981632400997">Il menu contestuale non includerà una voce di menu per condividere le immagini con <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" />.</translation>
@@ -7987,30 +7987,30 @@
 <translation id="6667586534922258705">Mostra il pulsante di visualizzazione della password nella schermata di accesso e di blocco</translation>
 <translation id="6669691206059842248">Configurare URL di reindirizzamento OAuth aggiuntivi per estensione</translation>
 <translation id="6669700740683748046">Questa funzionalità consente la visualizzazione dell'URL completo nella barra degli indirizzi.
-      Se questo criterio viene impostato su True, l'URL completo viene visualizzato nella barra degli indirizzi, inclusi gli schemi e i sottodomini.
-      Se questo criterio viene impostato su False, viene applicata la visualizzazione dell'URL predefinita.
-      Se questo criterio non viene configurato, viene applicata la visualizzazione dell'URL predefinita e l'utente può passare dalla visualizzazione predefinita all'URL completo e viceversa tramite un menu contestuale.
+      Se questa policy viene impostata su True, l'URL completo viene visualizzato nella barra degli indirizzi, inclusi gli schemi e i sottodomini.
+      Se questa policy viene impostata su False, viene applicata la visualizzazione dell'URL predefinita.
+      Se questa policy non viene configurata, viene applicata la visualizzazione dell'URL predefinita e l'utente può passare dalla visualizzazione predefinita all'URL completo e viceversa tramite un menu contestuale.
       </translation>
 <translation id="6670716303606644752">Come descritto alla pagina https://www.chromestatus.com/feature/5148698084376576, le finestre di dialogo modali JavaScript, attivate da <ph name="JS_ALERT" />, <ph name="JS_CONFIRM" /> e <ph name="JS_PROMPT" />, saranno bloccate in <ph name="PRODUCT_NAME" /> se attivate da un frame secondario la cui origine è diversa da quella del frame principale.
 
-Il criterio consente di eseguire l'override di questa modifica.
-Se il criterio viene attivato o se non viene configurato, le finestre di dialogo JavaScript attivate da un frame secondario di origine diversa verranno bloccate.
-Se il criterio viene disattivato, le finestre di dialogo JavaScript attivate da un frame secondario di origine diversa non verranno bloccate.
+La policy consente di eseguire l'override di questa modifica.
+Se la policy viene attivata o se non viene configurata, le finestre di dialogo JavaScript attivate da un frame secondario di origine diversa verranno bloccate.
+Se la policy viene disattivata, le finestre di dialogo JavaScript attivate da un frame secondario di origine diversa non verranno bloccate.
 
-Il criterio verrà rimosso da <ph name="PRODUCT_NAME" /> in futuro.</translation>
+La policy verrà rimossa da <ph name="PRODUCT_NAME" /> in futuro.</translation>
 <translation id="6670794785040100077">Disattiva l'invio di documenti a <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="6672070613706645316">Consenti agli utenti di personalizzare lo sfondo della pagina Nuova scheda</translation>
 <translation id="6672630473862787247">Attiva l'autenticazione ambientale nelle sessioni standard, Ospite e in modalità in incognito.</translation>
 <translation id="6676012253361586167">Consente di specificare se il port forwarding nei container Crostini è consentito.
 
-Se il criterio viene impostato su True o se non viene configurato, gli utenti potranno configurare il port forwarding nei loro container Crostini.
+Se la policy viene impostata su True o se non viene configurata, gli utenti potranno configurare il port forwarding nei loro container Crostini.
 
-Se il criterio viene impostato su False, il port forwarding nei container Crostini verrà disattivato.</translation>
+Se la policy viene impostata su False, il port forwarding nei container Crostini verrà disattivato.</translation>
 <translation id="6677291257287862684">Attiva i tasti permanenti nella schermata di accesso</translation>
-<translation id="668153983584136017">Questo criterio è deprecato perché l'algoritmo GREASE aggiornato è attivo per impostazione predefinita a partire dalla versione M103.
-Se il criterio viene attivato, la funzionalità di aggiornamento del client hint dello user agent GREASE allinea l'algoritmo User-Agent GREASE alla specifica più recente.
+<translation id="668153983584136017">Questa policy è deprecata perché l'algoritmo GREASE aggiornato è attivo per impostazione predefinita a partire dalla versione M103.
+Se la policy viene attivata, la funzionalità di aggiornamento del client hint dello user agent GREASE allinea l'algoritmo User-Agent GREASE alla specifica più recente.
       La specifica aggiornata potrebbe interrompere il funzionamento di alcuni siti web che limitano i caratteri consentiti per le richieste. Per ulteriori informazioni, consulta le specifiche: https://wicg.github.io/ua-client-hints/#grease
-     Questo criterio verrà rimosso in una release futura.</translation>
+     Questa policy verrà rimossa in una release futura.</translation>
 <translation id="6682305153467826752">Attiva la generazione di report sulle informazioni di identificazione delle macchine</translation>
 <translation id="6685903773201985073">Attiva l'autenticazione ambientale nelle sessioni standard e Ospite.</translation>
 <translation id="6687291630099400188">Non visualizzare le informazioni di sistema nella schermata di accesso</translation>
@@ -8019,12 +8019,12 @@
 <translation id="6690425645391461516">Disattiva controlli dell'intercettazione DNS; consenti barre di informazioni "http://intranetsite/" alternative</translation>
 <translation id="669066148640728553">Consente di specificare un intervallo di tempo target per il termine del periodo di notifica per il riavvio.
 
-      Agli utenti viene inviata una notifica che informa che è necessario riavviare il browser o il dispositivo in base alle impostazioni dei criteri <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> e <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Se il criterio <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> viene impostato su "Required", al termine del periodo di notifica viene forzato il riavvio dei browser e dei dispositivi. Questo criterio <ph name="RELAUNCH_WINDOW_POLICY_NAME" /> può essere usato per rimandare il termine del periodo di notifica affinché rientri in un intervallo di tempo specifico.
+      Agli utenti viene inviata una notifica che informa che è necessario riavviare il browser o il dispositivo in base alle impostazioni delle policy <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> e <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. Se la policy <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> viene impostata su "Required", al termine del periodo di notifica viene forzato il riavvio dei browser e dei dispositivi. Questa policy <ph name="RELAUNCH_WINDOW_POLICY_NAME" /> può essere usata per rimandare il termine del periodo di notifica affinché rientri in un intervallo di tempo specifico.
 
-      Se questo criterio non viene impostato, l'intervallo di tempo target predefinito per <ph name="PRODUCT_OS_NAME" /> è 02:00-04:00. L'intervallo di tempo target predefinito per <ph name="PRODUCT_NAME" /> è l'intera giornata (vale a dire che il termine del periodo di notifica non viene mai rimandato).
+      Se questa policy non viene impostata, l'intervallo di tempo target predefinito per <ph name="PRODUCT_OS_NAME" /> è 02:00-04:00. L'intervallo di tempo target predefinito per <ph name="PRODUCT_NAME" /> è l'intera giornata (vale a dire che il termine del periodo di notifica non viene mai rimandato).
 
-      Nota: anche se per il campo <ph name="ENTRIES_FIELD_NAME" /> del criterio sono accettati più valori, vengono ignorati tutti tranne il primo.
-      Avviso: la configurazione di questo criterio potrebbe ritardare l'applicazione degli aggiornamenti software.</translation>
+      Nota: anche se per il campo <ph name="ENTRIES_FIELD_NAME" /> della policy sono accettati più valori, vengono ignorati tutti tranne il primo.
+      Avviso: la configurazione di questa policy potrebbe ritardare l'applicazione degli aggiornamenti software.</translation>
 <translation id="6695441448686167614">Impostazioni di WebPrinting</translation>
 <translation id="6695983959768914375">L'API Direct Sockets consente la comunicazione con endpoint arbitrari che utilizzano TCP e UDP.
 Visita la pagina https://github.com/WICG/direct-sockets per informazioni dettagliate.
@@ -8043,7 +8043,7 @@
 <translation id="6698632841807204978">Attiva la stampa monocromatica</translation>
 <translation id="6699740789657890714">Consente di specificare se consentire ai siti web di effettuare richieste agli endpoint di rete con un livello di protezione più alto in modo non sicuro</translation>
 <translation id="6699880231565102694">Abilita autenticazione a due fattori per gli host di accesso remoto</translation>
-<translation id="6703251016607733593">La configurazione del criterio consente di disattivare l'applicazione dei requisiti di divulgazione di Certificate Transparency per un elenco di hash <ph name="SUBJECT_PUBLIC_KEY_INFO" />. Gli host aziendali possono continuare a utilizzare i certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato. Per disattivare l'applicazione, l'hash deve rispettare una delle seguenti condizioni:
+<translation id="6703251016607733593">La configurazione della policy consente di disattivare l'applicazione dei requisiti di divulgazione di Certificate Transparency per un elenco di hash <ph name="SUBJECT_PUBLIC_KEY_INFO" />. Gli host aziendali possono continuare a utilizzare i certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato. Per disattivare l'applicazione, l'hash deve rispettare una delle seguenti condizioni:
 
       * Fa parte del <ph name="SUBJECT_PUBLIC_KEY_INFO" /> del certificato del server.
 
@@ -8053,34 +8053,34 @@
 
       Specifica un hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> collegandolo al nome dell'algoritmo di hash, una barra e la codifica Base64 di tale algoritmo di hash applicato al <ph name="SUBJECT_PUBLIC_KEY_INFO" /> con codifica DER del certificato specificato. Il formato della codifica Base64 è nello stesso formato di un'impronta SPKI. L'unico algoritmo di hash riconosciuto è sha256; gli altri vengono ignorati.
 
-      Se il criterio non è configurato e se i certificati che richiedono la divulgazione tramite Certificate Transparency non vengono divulgati, <ph name="PRODUCT_NAME" /> non ritiene attendibili gli altri certificati.</translation>
+      Se la policy non è configurata e se i certificati che richiedono la divulgazione tramite Certificate Transparency non vengono divulgati, <ph name="PRODUCT_NAME" /> non ritiene attendibili gli altri certificati.</translation>
 <translation id="6703381779632216549">Abilita l'importazione del motore di ricerca predefinito alla prima esecuzione</translation>
-<translation id="6704515759227307131">Questo criterio è obsoleto ed è stato sostituito dal criterio AdvancedProtectionAllowed.
+<translation id="6704515759227307131">Questa policy è obsoleta ed è stata sostituita dalla policy AdvancedProtectionAllowed.
 
-      Questo criterio consente di stabilire se gli utenti iscritti al programma di protezione avanzata possono inviare o meno i propri download a Google per verificare l'eventuale presenza di malware. Se il criterio viene impostato su True o non viene impostato, agli utenti iscritti al programma verrà chiesto di inviare i propri file a Google per una scansione approfondita. Se l'utente seleziona "Scansiona", il download verrà inviato a Google. Se il criterio viene impostato su False, agli utenti non verrà chiesto di inviare i propri download a Google.</translation>
+      Questa policy consente di stabilire se gli utenti iscritti al programma di protezione avanzata possono inviare o meno i propri download a Google per verificare l'eventuale presenza di malware. Se la policy viene impostata su True o non viene impostata, agli utenti iscritti al programma verrà chiesto di inviare i propri file a Google per una scansione approfondita. Se l'utente seleziona "Scansiona", il download verrà inviato a Google. Se la policy viene impostata su False, agli utenti non verrà chiesto di inviare i propri download a Google.</translation>
 <translation id="670597451099978576">Concede automaticamente a questi siti l'autorizzazione a connettersi a dispositivi USB usando gli ID fornitore e prodotto indicati nella schermata di accesso.</translation>
 <translation id="6706330611356546885">Consenti a qualsiasi sito di eseguire JIT di JavaScript</translation>
-<translation id="6706728459859947543">Questo criterio consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server.
+<translation id="6706728459859947543">Questa policy consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server.
 
-      Se il criterio è attivato, Risposte rapide è abilitata.
-      Se il criterio è disattivato, Risposte rapide è disabilitata.
-      Se il criterio non viene impostato, gli utenti possono decidere se attivare o disattivare Risposte rapide.</translation>
+      Se la policy è attivata, Risposte rapide è abilitata.
+      Se la policy è disattivata, Risposte rapide è disabilitata.
+      Se la policy non viene impostata, gli utenti possono decidere se attivare o disattivare Risposte rapide.</translation>
 <translation id="670675748066383347">Impostazioni per Organizza schede</translation>
 <translation id="6710714905661200515">Documenti Google (supportato a partire dalla versione 135)</translation>
-<translation id="6712624291905573620">Questo criterio consente di controllare il reporting su cloud di <ph name="PRODUCT_NAME" />, che consente di caricare informazioni sul funzionamento del browser nella <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
+<translation id="6712624291905573620">Questa policy consente di controllare il reporting su cloud di <ph name="PRODUCT_NAME" />, che consente di caricare informazioni sul funzionamento del browser nella <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
-Se il criterio non viene configurato o viene impostato su Disabled, i dati non vengono raccolti o caricati.
-Se il criterio viene impostato su Enabled, i dati vengono raccolti e caricati sulla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
+Se la policy non viene configurata o viene impostata su Disabled, i dati non vengono raccolti o caricati.
+Se la policy viene impostata su Enabled, i dati vengono raccolti e caricati sulla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
-Per <ph name="PRODUCT_NAME" />, questo criterio viene applicato soltanto se la macchina viene registrata con il token <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" />.
-Per <ph name="PRODUCT_OS_NAME" />, questo criterio viene sempre applicato.</translation>
+Per <ph name="PRODUCT_NAME" />, questa policy viene applicata soltanto se la macchina viene registrata con il token <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" />.
+Per <ph name="PRODUCT_OS_NAME" />, questa policy viene sempre applicata.</translation>
 <translation id="6720330829631914048">Le ore trascorse dall'inizio della giornata nel formato di 24 ore.</translation>
 <translation id="6721252203593581486">WebSQL in contesti di terze parti (ad es. iframe tra siti) è disattivato per impostazione predefinita a partire da M97 e verrà completamente rimosso in M101.
-          Se il criterio viene impostato su Falso o se non viene configurato, WebSQL in contesti di terze parti rimarrà disattivato.
-          Se viene impostato su Vero, WebSQL in contesti di terze parti verrà riattivato.</translation>
-<translation id="6723472666969849951">L'impostazione del criterio permette di controllare quali app ed estensioni possono essere installate in <ph name="PRODUCT_NAME" />, gli host con i quali possono interagire e i limiti di accesso in fase di esecuzione.
+          Se la policy viene impostata su False o se non viene configurata, WebSQL in contesti di terze parti rimarrà disattivato.
+          Se viene impostata su True, WebSQL in contesti di terze parti verrà riattivato.</translation>
+<translation id="6723472666969849951">L'impostazione della policy permette di controllare quali app ed estensioni possono essere installate in <ph name="PRODUCT_NAME" />, gli host con i quali possono interagire e i limiti di accesso in fase di esecuzione.
 
-      Se il criterio non viene impostato, non vengono applicate limitazioni sui tipi di estensioni e app accettabili.
+      Se la policy non viene impostata, non vengono applicate limitazioni sui tipi di estensioni e app accettabili.
 
       Non verranno installate le estensioni e le app di un tipo non presente nell'elenco. Ciascun valore deve corrispondere a una delle seguenti stringhe:
 
@@ -8098,15 +8098,15 @@
 
       Consulta la documentazioni sulle estensioni di <ph name="PRODUCT_NAME" /> per ulteriori informazioni su questi tipi.
 
-      Nelle versioni precedenti alla 75, l'utilizzo di diversi ID estensione separati da virgole non è supportato e verrà ignorato. Si applica il resto del criterio.
+      Nelle versioni precedenti alla 75, l'utilizzo di diversi ID estensione separati da virgole non è supportato e verrà ignorato. Si applica il resto della policy.
 
-      Nota: questo criterio riguarda anche le estensioni e le app con installazione forzata tramite <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.</translation>
+      Nota: questa policy riguarda anche le estensioni e le app con installazione forzata tramite <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.</translation>
 <translation id="6733851879899284032">
       Consente di specificare se è possibile usare SharedArrayBuffers in un contesto senza isolamento multiorigine. <ph name="PRODUCT_NAME" /> richiede l'isolamento multiorigine se viene usato SharedArrayBuffers a partire dalla versione 91 di <ph name="PRODUCT_NAME" /> (dal 25/05/2021) per motivi di compatibilità web. Ulteriori dettagli sono disponibili all'indirizzo: https://developer.chrome.com/blog/enabling-shared-array-buffer/.
 
-      Se questo criterio viene impostato su Attivato, i siti possono usare SharedArrayBuffer senza limitazioni.
+      Se questa policy viene impostata su Attivata, i siti possono usare SharedArrayBuffer senza limitazioni.
 
-      Se viene impostato su Disattivato o se non viene configurato, i siti possono usare SharedArrayBuffers soltanto con isolamento multiorigine.</translation>
+      Se viene impostata su Disattivata o se non viene configurata, i siti possono usare SharedArrayBuffers soltanto con isolamento multiorigine.</translation>
 <translation id="6734397897213913438">Consenti sempre Leggi schermo</translation>
 <translation id="6735701345096330595">Forza attivazione lingue per controllo ortografico</translation>
 <translation id="6736283207617136584">Attiva i report sullo stato di aggiornamento del sistema operativo del dispositivo</translation>
@@ -8114,33 +8114,33 @@
 <translation id="6739847036322230891">Non consentire agli utenti di aggiungere, configurare e stampare da stampanti non aziendali</translation>
 <translation id="6740611636377710500">Consenti all'utente di eseguire PluginVm.
 
-      Se il criterio è impostato su False o non viene impostato, <ph name="PLUGIN_VM_NAME" /> non viene attivato per l'utente.
-      Se è impostato su True, <ph name="PLUGIN_VM_NAME" /> viene attivato per l'utente, a condizione che anche le altre impostazioni lo permettano. Il valore dei criteri <ph name="PLUGIN_VM_ALLOWED_POLICY_NAME" /> e <ph name="USER_PLUGIN_VM_ALLOWED_POLICY_NAME" /> deve essere True ed è necessario impostare i criteri <ph name="PLUGIN_VM_LICENSE_KEY_POLICY_NAME" /> o <ph name="PLUGIN_VM_USER_ID_POLICY_NAME" /> per consentire l'esecuzione di <ph name="PLUGIN_VM_NAME" />.</translation>
-<translation id="6741318452269220158">Se il criterio viene impostato su True, Native Client può continuare a essere eseguito anche se il comportamento predefinito prevede che sia disattivato.
-Se il criterio viene impostato su False o se non viene configurato, verrà utilizzato il comportamento predefinito.</translation>
+      Se la policy è impostata su False o non viene impostata, <ph name="PLUGIN_VM_NAME" /> non viene attivato per l'utente.
+      Se è impostata su True, <ph name="PLUGIN_VM_NAME" /> viene attivato per l'utente, a condizione che anche le altre impostazioni lo permettano. Il valore delle policy <ph name="PLUGIN_VM_ALLOWED_POLICY_NAME" /> e <ph name="USER_PLUGIN_VM_ALLOWED_POLICY_NAME" /> deve essere True ed è necessario impostare le policy <ph name="PLUGIN_VM_LICENSE_KEY_POLICY_NAME" /> o <ph name="PLUGIN_VM_USER_ID_POLICY_NAME" /> per consentire l'esecuzione di <ph name="PLUGIN_VM_NAME" />.</translation>
+<translation id="6741318452269220158">Se la policy viene impostata su True, Native Client può continuare a essere eseguito anche se il comportamento predefinito prevede che sia disattivato.
+Se la policy viene impostata su False o se non viene configurata, verrà utilizzato il comportamento predefinito.</translation>
 <translation id="6743006196954236593">Non consentire Overlay di Lens.</translation>
 <translation id="6749641778238480311">Consenti di chiamare le API subApps senza un gesto precedente dell'utente o senza richiedere la conferma.</translation>
 <translation id="6750902920405577210">L'elenco di dati di telemetria da segnalare per gli eventi di variazione dell'intensità del segnale.
 
-      Ogni dato di telemetria specificato verrà segnalato soltanto se non è stato disattivato tramite il relativo criterio di controllo.
-      Il criterio di controllo di https_latency e network_telemetry è ReportDeviceNetworkStatus.
+      Ogni dato di telemetria specificato verrà segnalato soltanto se non è stato disattivato tramite la relativa policy di controllo.
+      La policy di controllo di https_latency e network_telemetry è ReportDeviceNetworkStatus.
 
-      Se non viene impostato, non verranno segnalati dati di telemetria aggiuntivi per gli eventi di variazione dell'intensità del segnale.</translation>
+      Se non viene impostata, non verranno segnalati dati di telemetria aggiuntivi per gli eventi di variazione dell'intensità del segnale.</translation>
 <translation id="6751612743847158732">Ripristina sempre l'ultima sessione.</translation>
-<translation id="6752711782954612641">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> consente di specificare i parametri durante la ricerca di un URL con POST. Si tratta di coppie di tipo nome-valore separate da virgole. Se un valore è il parametro di un modello, ad esempio <ph name="SEARCH_TERM_MARKER" />, viene sostituito con i dati dei termini di ricerca reali.
+<translation id="6752711782954612641">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> consente di specificare i parametri durante la ricerca di un URL con POST. Si tratta di coppie di tipo nome-valore separate da virgole. Se un valore è il parametro di un modello, ad esempio <ph name="SEARCH_TERM_MARKER" />, viene sostituito con i dati dei termini di ricerca reali.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> non viene configurato, le richieste di ricerca vengono inviate utilizzando il metodo Get.</translation>
-<translation id="6757413365906304125">Questo criterio determina il comportamento della rimappatura dei tasti Pagina su/Pagina giù
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> non viene configurata, le richieste di ricerca vengono inviate utilizzando il metodo Get.</translation>
+<translation id="6757413365906304125">Questa policy determina il comportamento della rimappatura dei tasti Pagina su/Pagina giù
 nella pagina secondaria "Rimappa i tasti". La pagina secondaria "Rimappa i tasti"
-consente di personalizzare i tasti. Se abilitato, questo criterio impedisce agli utenti di
-personalizzare queste rimappature specifiche. Se il criterio non viene configurato,
+consente di personalizzare i tasti. Se abilitata, questa policy impedisce agli utenti di
+personalizzare queste rimappature specifiche. Se la policy non viene configurata,
 le scorciatoie basate sul tasto Ricerca saranno quelle predefinite e agli utenti sarà consentita
 la configurazione.</translation>
 <translation id="6757613329154374267">Backup e ripristino attivato</translation>
-<translation id="6758659208493449452">Questo criterio consente di stabilire se gli utenti registrati al programma di protezione avanzata ricevono o meno ulteriori livelli di protezione. Alcune di queste funzionalità potrebbero prevedere la condivisione di dati con Google (ad esempio, gli utenti che usano la protezione avanzata potranno inviare i propri download a Google per verificare l'eventuale presenza di malware). Se questo criterio viene impostato su True o non viene impostato, gli utenti registrati al programma riceveranno ulteriori livelli di protezione. Se viene impostato su False, gli utenti che usano la protezione avanzata riceveranno soltanto le funzionalità standard per i consumatori.</translation>
-<translation id="6759078816721385015">Consente di configurare le impostazioni del periodo di validità dei dati di navigazione per <ph name="PRODUCT_NAME" />. Questo criterio consente agli amministratori di configurare (per tipo di dati) quando il browser dovrà eliminare i dati. Questa funzionalità è utile per i clienti che gestiscono dati cliente sensibili.
+<translation id="6758659208493449452">Questa policy consente di stabilire se gli utenti registrati al programma di protezione avanzata ricevono o meno ulteriori livelli di protezione. Alcune di queste funzionalità potrebbero prevedere la condivisione di dati con Google (ad esempio, gli utenti che usano la protezione avanzata potranno inviare i propri download a Google per verificare l'eventuale presenza di malware). Se questa policy viene impostata su True o non viene impostata, gli utenti registrati al programma riceveranno ulteriori livelli di protezione. Se viene impostata su False, gli utenti che usano la protezione avanzata riceveranno soltanto le funzionalità standard per i consumatori.</translation>
+<translation id="6759078816721385015">Consente di configurare le impostazioni del periodo di validità dei dati di navigazione per <ph name="PRODUCT_NAME" />. Questa policy consente agli amministratori di configurare (per tipo di dati) quando il browser dovrà eliminare i dati. Questa funzionalità è utile per i clienti che gestiscono dati cliente sensibili.
 
-Avviso: l'impostazione di questo criterio può influire sulla rimozione definitiva dei dati personali locali. Ti consigliamo di testare le impostazioni prima del deployment per evitare l'eliminazione accidentale di dati personali.
+Avviso: l'impostazione di questa policy può influire sulla rimozione definitiva dei dati personali locali. Ti consigliamo di testare le impostazioni prima del deployment per evitare l'eliminazione accidentale di dati personali.
 
 I tipi di dati disponibili sono i seguenti: <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> e <ph name="DATA_TYPE_HOSTED_APP_DATA" />. <ph name="DATA_TYPE_DOWNLOAD_HISTORY" /> e <ph name="DATA_TYPE_HOSTED_APP_DATA" /> non sono supportati su Android.
 
@@ -8148,7 +8148,7 @@
 
 I dati scaduti vengono eliminati 15 secondi dopo l'avvio del browser, dopodiché ogni 30 minuti mentre il browser è in esecuzione.
 
-Fino a Chrome 114, questo criterio richiedeva l'impostazione del criterio <ph name="SYNC_DISABLED_POLICY_NAME" /> su true. A partire da Chrome 115, la configurazione di questo criterio disattiva la sincronizzazione per i rispettivi tipi di dati se "<ph name="CHROME_SYNC_NAME" />" non viene disattivato impostando il criterio <ph name="SYNC_DISABLED_POLICY_NAME" /> e non viene disattivato <ph name="BROWSER_SIGNIN_POLICY_NAME" />.</translation>
+Fino a Chrome 114, questa policy richiedeva l'impostazione della policy <ph name="SYNC_DISABLED_POLICY_NAME" /> su true. A partire da Chrome 115, la configurazione di questa policy disattiva la sincronizzazione per i rispettivi tipi di dati se "<ph name="CHROME_SYNC_NAME" />" non viene disattivato impostando la policy <ph name="SYNC_DISABLED_POLICY_NAME" /> e non viene disattivata <ph name="BROWSER_SIGNIN_POLICY_NAME" />.</translation>
 <translation id="6763023079133439068">Consenti i certificati privi di un'estensione subjectAlternativeName se sono stati emessi da trust anchor locali</translation>
 <translation id="6766216162565713893">Consenti ai siti di chiedere all'utente di concedere l'accesso a un dispositivo Bluetooth nelle vicinanze.</translation>
 <translation id="6770454900105963262">Segnala informazioni sulle sessioni kiosk attive</translation>
@@ -8173,19 +8173,19 @@
 
       Nella versione 97 di <ph name="PRODUCT_NAME" /> è stato introdotto il supporto delle intestazioni delle richieste CORS senza caratteri jolly. Quando gli script effettuano una richiesta di rete tra origini tramite fetch() e XMLHttpRequest con un'intestazione Authorization aggiunta tramite script, l'intestazione deve essere consentita esplicitamente dall'intestazione Access-Control-Allow-Headers nella risposta preflight CORS. Con "esplicitamente" qui si intende che il simbolo di carattere jolly "*" non include l'intestazione Authorization. Per maggiori informazioni, visita la pagina <ph name="CORS_NON_WILDCARD_REQUEST_HEADERS_FEATURE_URL" />.
 
-      Se questo criterio non viene configurato o se viene impostato su True, <ph name="PRODUCT_NAME" /> supporterà le intestazioni delle richieste CORS senza caratteri jolly e si comporterà come descritto in precedenza.
+      Se questa policy non viene configurata o se viene impostata su True, <ph name="PRODUCT_NAME" /> supporterà le intestazioni delle richieste CORS senza caratteri jolly e si comporterà come descritto in precedenza.
 
-      Se questo criterio viene impostato su False, Chrome consentirà il simbolo di carattere jolly ("*") nell'intestazione Access-Control-Allow-Headers della risposta preflight CORS per includere l'intestazione Authorization.
+      Se questa policy viene impostata su False, Chrome consentirà il simbolo di carattere jolly ("*") nell'intestazione Access-Control-Allow-Headers della risposta preflight CORS per includere l'intestazione Authorization.
 
-      Questo criterio aziendale è temporaneo ed è destinato a essere rimosso in futuro.</translation>
-<translation id="6789422336869764846">Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano lo stato della modalità sviluppatore del dispositivo all'avvio.
+      Questa policy aziendale è temporanea ed è destinata a essere rimossa in futuro.</translation>
+<translation id="6789422336869764846">Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano lo stato della modalità sviluppatore del dispositivo all'avvio.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano lo stato della modalità sviluppatore.</translation>
-<translation id="6789441722870183939">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono accedere alle funzionalità sperimentali del browser tramite un'icona nella barra degli strumenti
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano lo stato della modalità sviluppatore.</translation>
+<translation id="6789441722870183939">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono accedere alle funzionalità sperimentali del browser tramite un'icona nella barra degli strumenti
 
-      Se viene impostato su Disattivato, l'icona delle funzionalità sperimentali del browser viene rimossa dalla barra degli strumenti.
+      Se viene impostata su Disattivata, l'icona delle funzionalità sperimentali del browser viene rimossa dalla barra degli strumenti.
 
-      chrome://flags e qualsiasi altro metodo per attivare e disattivare le funzionalità del browser continueranno a comportarsi come previsto a prescindere dall'attivazione o meno di questo criterio.</translation>
+      chrome://flags e qualsiasi altro metodo per attivare e disattivare le funzionalità del browser continueranno a comportarsi come previsto a prescindere dall'attivazione o meno di questa policy.</translation>
 <translation id="6795485990775913659">Consenti la stampa solo senza PIN</translation>
 <translation id="6796215185873669533">Usa per impostazione predefinita le impostazioni del browser per la versione della stringa user agent.</translation>
 <translation id="6800181452282128474">Non inviare query a Quirks Server</translation>
@@ -8196,58 +8196,58 @@
 <translation id="6813263547126514821">Alimentazione e spegnimento</translation>
 <translation id="681446116407619279">Schemi di autenticazione supportati</translation>
 <translation id="6815628711329903153">Consenti l'allocazione del buffer moderno per il plug-in PPAPI delle API Graphics3D.</translation>
-<translation id="6819838337315703072">Se le app <ph name="LINUX_OS_NAME" /> sono supportate, l'impostazione del criterio su Attivato consente di inviare al server le informazioni relative all'utilizzo delle app <ph name="LINUX_OS_NAME" />.
+<translation id="6819838337315703072">Se le app <ph name="LINUX_OS_NAME" /> sono supportate, l'impostazione della policy su Attivata consente di inviare al server le informazioni relative all'utilizzo delle app <ph name="LINUX_OS_NAME" />.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, non viene inviata alcuna informazione relativa all'utilizzo.</translation>
-<translation id="6820251681466503297">Questo criterio consente di stabilire se all'utente è consentito salvare immagini su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /> direttamente dal menu contestuale.
-Se il criterio viene attivato o se non viene configurato, all'utente è consentito salvare immagini su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /> dal menu contestuale. Se il criterio viene disattivato, gli utenti non vedono l'opzione nel menu contestuale.
-Questo criterio non impedisce agli utenti di salvare immagini su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /> utilizzando altri metodi diversi dal menu contestuale.</translation>
-<translation id="6823711520976094072">La mancata configurazione o l'impostazione del criterio su valori inferiori a 1 MB implica l'utilizzo da parte di <ph name="PRODUCT_OS_NAME" /> della dimensione predefinita, corrispondente a 256 MiB, per le estensioni e le app di memorizzazione nella cache per l'installazione da parte di più utenti di un singolo dispositivo. In questo modo, non è necessario scaricare nuovamente tutte le app o estensioni per ogni utente.</translation>
-<translation id="6829632070341067746">Questo criterio consente di controllare il recente refactoring delle API Graphics3D nel plug-in PPAPI.
+      Se la policy viene impostata su Disattivata o se non viene configurata, non viene inviata alcuna informazione relativa all'utilizzo.</translation>
+<translation id="6820251681466503297">Questa policy consente di stabilire se all'utente è consentito salvare immagini su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /> direttamente dal menu contestuale.
+Se la policy viene attivata o se non viene configurata, all'utente è consentito salvare immagini su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /> dal menu contestuale. Se la policy viene disattivata, gli utenti non vedono l'opzione nel menu contestuale.
+Questa policy non impedisce agli utenti di salvare immagini su <ph name="GOOGLE_PHOTOS_PRODUCT_NAME" /> utilizzando altri metodi diversi dal menu contestuale.</translation>
+<translation id="6823711520976094072">La mancata configurazione o l'impostazione della policy su valori inferiori a 1 MB implica l'utilizzo da parte di <ph name="PRODUCT_OS_NAME" /> della dimensione predefinita, corrispondente a 256 MiB, per le estensioni e le app di memorizzazione nella cache per l'installazione da parte di più utenti di un singolo dispositivo. In questo modo, non è necessario scaricare nuovamente tutte le app o estensioni per ogni utente.</translation>
+<translation id="6829632070341067746">Questa policy consente di controllare il recente refactoring delle API Graphics3D nel plug-in PPAPI.
 
-La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questo criterio può essere utilizzato nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto.
+La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questa policy può essere utilizzata nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto.
 
-Se il criterio non viene configurato o se viene impostato su Enabled, il browser deciderà quale implementazione usare.
-Se il criterio viene impostato su Disabled, il browser utilizzerà la vecchia implementazione fino alla scadenza del criterio.
+Se la policy non viene configurata o se viene impostata su Enabled, il browser deciderà quale implementazione usare.
+Se la policy viene impostata su Disabled, il browser utilizzerà la vecchia implementazione fino alla scadenza della policy.
 
-Se devi usare il criterio, invia una segnalazione di bug su crbug.com spiegando il tuo caso d'uso e aggiungendo in copia per conoscenza {blundell, vasilyt}@chromium.org. Il criterio sarà valido fino alla versione 114 di <ph name="PRODUCT_NAME" />, dopodiché la vecchia implementazione verrà rimossa.
+Se devi usare la policy, invia una segnalazione di bug su crbug.com spiegando il tuo caso d'uso e aggiungendo in copia per conoscenza {blundell, vasilyt}@chromium.org. La policy sarà valida fino alla versione 114 di <ph name="PRODUCT_NAME" />, dopodiché la vecchia implementazione verrà rimossa.
 
-NOTA: le modifiche apportate a questo criterio verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
-<translation id="6833023569065717572">Se il criterio viene impostato su Vero, nella schermata di accesso del dispositivo viene usato il formato dell'orologio di 24 ore.
+NOTA: le modifiche apportate a questa policy verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation>
+<translation id="6833023569065717572">Se la policy viene impostata su True, nella schermata di accesso del dispositivo viene usato il formato dell'orologio di 24 ore.
 
-      Se il criterio viene impostato su Falso, nella schermata di accesso del dispositivo viene usato il formato dell'orologio di 12 ore.
+      Se la policy viene impostata su False, nella schermata di accesso del dispositivo viene usato il formato dell'orologio di 12 ore.
 
-      Se il criterio non viene configurato, il dispositivo usa il formato delle impostazioni locali.
+      Se la policy non viene configurata, il dispositivo usa il formato delle impostazioni locali.
 
       Il formato del dispositivo viene usato per impostazione predefinita anche per le sessioni utente, ma gli utenti possono cambiare il formato dell'orologio dell'account.</translation>
-<translation id="6833064854262015312">Se il criterio è impostato su True, la modalità ad alto contrasto viene attivata nella schermata di accesso. Se il criterio è impostato su False, la modalità ad alto contrasto viene disattivata nella schermata di accesso.
+<translation id="6833064854262015312">Se la policy è impostata su True, la modalità ad alto contrasto viene attivata nella schermata di accesso. Se la policy è impostata su False, la modalità ad alto contrasto viene disattivata nella schermata di accesso.
 
-      Se imposti il criterio, gli utenti possono modificare temporaneamente la modalità ad alto contrasto attivandola o disattivandola. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, viene ripristinato lo stato originale della modalità.
+      Se imposti la policy, gli utenti possono modificare temporaneamente la modalità ad alto contrasto attivandola o disattivandola. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, viene ripristinato lo stato originale della modalità.
 
-      Se il criterio non è impostato, la modalità ad alto contrasto risulta disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
+      Se la policy non è impostata, la modalità ad alto contrasto risulta disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
 
-          Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_HIGH_CONTRAST_ENABLED_POLICY_NAME" /> sostituisce questo criterio.</translation>
+          Nota: se specificata, <ph name="DEVICE_LOGIN_SCREEN_HIGH_CONTRAST_ENABLED_POLICY_NAME" /> sostituisce questa policy.</translation>
 <translation id="6833465247597603843">L'impostazione della scorciatoia Elimina usa la scorciatoia che contiene il tasto di modifica Ricerca</translation>
 <translation id="6833988859168635883">Avvio, pagina iniziale e pagina Nuova scheda</translation>
 <translation id="6835254082476223414">Attiva backup e ripristino della macchina virtuale Linux</translation>
 <translation id="6835883744948188639">Mostra all'utente un messaggio ricorrente che indica che è consigliato eseguire un riavvio</translation>
 <translation id="683688607121170501">Questa impostazione consente agli utenti di passare da un Account Google a un altro all'interno dell'area dei contenuti della finestra del browser e nelle applicazioni Android, dopo avere eseguito l'accesso al dispositivo <ph name="PRODUCT_OS_NAME" />.
 
-      Se questo criterio viene impostato su false, non sarà consentito l'accesso a un altro Account Google dall'area dei contenuti del browser in modalità non in incognito e dalle applicazioni Android.
+      Se questa policy viene impostata su false, non sarà consentito l'accesso a un altro Account Google dall'area dei contenuti del browser in modalità non in incognito e dalle applicazioni Android.
 
-      Se questo criterio non viene impostato o viene impostato su true, verrà usato il comportamento predefinito: sarà possibile accedere a un altro Account Google dall'area dei contenuti del browser e dalle applicazioni Android, ad eccezione degli account di minori, per i quali l'accesso non sarà consentito dall'area dei contenuti in modalità non in incognito.
+      Se questa policy non viene impostata o viene impostata su true, verrà usato il comportamento predefinito: sarà possibile accedere a un altro Account Google dall'area dei contenuti del browser e dalle applicazioni Android, ad eccezione degli account di minori, per i quali l'accesso non sarà consentito dall'area dei contenuti in modalità non in incognito.
 
-      Qualora l'accesso a un altro account non debba essere consentito tramite la modalità di navigazione in incognito, potresti bloccare tale modalità usando il criterio IncognitoModeAvailability.
+      Qualora l'accesso a un altro account non debba essere consentito tramite la modalità di navigazione in incognito, potresti bloccare tale modalità usando la policy IncognitoModeAvailability.
 
       Tieni presente che gli utenti potranno accedere ai servizi Google in uno stato non autenticato bloccando i loro cookie.</translation>
-<translation id="6841254611279513739">La configurazione del criterio consente di impostare solo la stampa a colori, solo la stampa monocromatica oppure nessuna limitazione per la modalità a colori. Se il criterio non viene configurato non vengono applicate limitazioni.</translation>
+<translation id="6841254611279513739">La configurazione della policy consente di impostare solo la stampa a colori, solo la stampa monocromatica oppure nessuna limitazione per la modalità a colori. Se la policy non viene configurata non vengono applicate limitazioni.</translation>
 <translation id="6843008643303282259">La velocità di caricamento desiderata, in kbit/s.</translation>
 <translation id="6843296367238757293">Questa norma è obsoleta. Ne sconsigliamo l'utilizzo. Leggi ulteriori informazioni all'indirizzo https://support.google.com/chrome/a/answer/7643500</translation>
-<translation id="6846126863870444592">Questo criterio specifica le estensioni autorizzate a ignorare la finestra di dialogo di conferma del processo di stampa quando utilizzano la funzione <ph name="SUBMIT_JOB_FUNCTION" /> di <ph name="PRINTING_API" /> per l'invio di un processo di stampa.
+<translation id="6846126863870444592">Questa policy specifica le estensioni autorizzate a ignorare la finestra di dialogo di conferma del processo di stampa quando utilizzano la funzione <ph name="SUBMIT_JOB_FUNCTION" /> di <ph name="PRINTING_API" /> per l'invio di un processo di stampa.
 
       Se un'estensione non è presente nell'elenco o non è configurato alcun elenco, la finestra di dialogo di conferma del processo di stampa verrà mostrata all'utente per ogni chiamata alla funzione <ph name="SUBMIT_JOB_FUNCTION" />.
 
-      Questo criterio è deprecato, al suo posto utilizza <ph name="PRINTING_API_EXTENSIONS_ALLOWLIST_POLICY_NAME" />.</translation>
+      Questa policy è deprecata, al suo posto utilizza <ph name="PRINTING_API_EXTENSIONS_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="6847379587945465889">Attiva il trasferimento dei cookie SSO SAML nella sessione utente durante l'accesso</translation>
 <translation id="6847810176590195243">Gli utenti potranno collegare e distribuire contenuti agli studenti. Questo include l'invio di contenuti web e la disponibilità di traduzioni/sottotitoli in tempo reale della voce dell'insegnante per gli studenti.</translation>
 <translation id="684856667300805181">Questa norma è stata rimossa in <ph name="PRODUCT_NAME" /> 68 e sostituita da <ph name="ARC_GLS_POLICY_NAME" />.</translation>
@@ -8255,17 +8255,17 @@
 <translation id="6850300477973481112">Impostazioni del connettore di scrivania</translation>
 <translation id="6851199885688265233">Attiva la funzione di accessibilità di evidenziazione del cursore</translation>
 <translation id="6851315055469993882">Attiva cache di autenticazione HTTP con ambito globale</translation>
-<translation id="6854767649023671426">Se il criterio viene attivato o se non viene configurato, agli utenti viene richiesto l'accesso al dispositivo di acquisizione video, fatta eccezione per gli URL configurati nell'elenco VideoCaptureAllowedUrls.
+<translation id="6854767649023671426">Se la policy viene attivata o se non viene configurata, agli utenti viene richiesto l'accesso al dispositivo di acquisizione video, fatta eccezione per gli URL configurati nell'elenco VideoCaptureAllowedUrls.
 
-      Se il criterio viene disattivato, le richieste vengono disabilitate e l'acquisizione video è disponibile solo per gli URL configurati nell'elenco VideoCaptureAllowedUrls.
+      Se la policy viene disattivata, le richieste vengono disabilitate e l'acquisizione video è disponibile solo per gli URL configurati nell'elenco VideoCaptureAllowedUrls.
 
-      Nota: il criterio si applica a tutti gli input video (non solo alla videocamera integrata).</translation>
+      Nota: la policy si applica a tutti gli input video (non solo alla videocamera integrata).</translation>
 <translation id="6856743875250214792">Questa norma è obsoleta ed è stata rimossa su M66, poiché era utilizzata solo per test interni e rappresenta un rischio per la sicurezza.
 
       Consente di specificare i flag da applicare all'avvio di <ph name="PRODUCT_NAME" />. I flag specificati vengono applicati soltanto alla schermata di accesso. I flag impostati tramite questa norma non vengono applicati anche alle sessioni utente.</translation>
 <translation id="6857240169209507953">È vietata l'esecuzione di <ph name="BOREALIS_NAME" /> su un dispositivo</translation>
-<translation id="6857372417233723544">Se il criterio viene impostato, viene attivato il layout Hindi Inscript su <ph name="PRODUCT_OS_NAME" />.
-Se viene impostato su False o se non viene configurato, il layout non è disponibile. È necessario riavviare per applicare il criterio.</translation>
+<translation id="6857372417233723544">Se la policy viene impostata, viene attivato il layout Hindi Inscript su <ph name="PRODUCT_OS_NAME" />.
+Se viene impostata su False o se non viene configurata, il layout non è disponibile. È necessario riavviare per applicare la policy.</translation>
 <translation id="685769593149966548">Applica la modalità Restrizione massima per YouTube</translation>
 <translation id="686079137349561371">Microsoft Windows 7 o versioni successive</translation>
 <translation id="6866755486434471318">Consenti a <ph name="PEPPER_NAME" /> di usare immagini condivise per la decodifica video.</translation>
@@ -8281,44 +8281,44 @@
 
 Se il criterio <ph name="NTPCARDSVISIBLE" /> è disattivato, la scheda di Outlook non verrà mostrata. Se il criterio <ph name="NTPCARDSVISIBLE" /> è attivato, la scheda di Outlook verrà mostrata se anche il relativo criterio è attivato e sono disponibili dati da mostrare. Se il criterio <ph name="NTPCARDSVISIBLE" /> non viene configurato, la scheda di Outlook verrà mostrata se anche il relativo criterio è attivato, l'utente ha attivato la scheda in Personalizza Chrome e sono disponibili dati da mostrare.</translation>
 <translation id="6878757724611298427">Consenti agli utenti di utilizzare app per Android su dispositivi non affiliati</translation>
-<translation id="6881397131210596522">Se il criterio viene impostato su 2, ai siti verrà automaticamente impedito di utilizzare l'API WebPrinting.
+<translation id="6881397131210596522">Se la policy viene impostata su 2, ai siti verrà automaticamente impedito di utilizzare l'API WebPrinting.
 
-Se il criterio viene impostato su 3, l'utente riceverà un avviso quando un sito vuole utilizzare l'API WebPrinting.
+Se la policy viene impostata su 3, l'utente riceverà un avviso quando un sito vuole utilizzare l'API WebPrinting.
 
-Se non viene configurato, i siti web possono richiedere l'accesso alle stampanti locali, ma gli utenti possono modificare l'impostazione.</translation>
+Se non viene configurata, i siti web possono richiedere l'accesso alle stampanti locali, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="6881447940489194100">Hash SHA-256 esadecimale codificato dei dati.</translation>
-<translation id="68818134518270542">La configurazione del criterio consente di specificare le app che gli utenti possono attivare come app per scrivere note nella schermata di blocco di <ph name="PRODUCT_OS_NAME" />.
+<translation id="68818134518270542">La configurazione della policy consente di specificare le app che gli utenti possono attivare come app per scrivere note nella schermata di blocco di <ph name="PRODUCT_OS_NAME" />.
 
       Se l'app preferita si trova nella schermata di blocco, sullo schermo viene visualizzato un elemento UI per l'avvio di tale app. Quando viene avviata, l'app può creare una finestra sopra la schermata di blocco e creare note in questo contesto. L'app può importare le note create nella sessione dell'utente principale quando la sessione è sbloccata. Nella schermata di blocco sono supportate solo le app per scrivere note di <ph name="PRODUCT_NAME" />.
 
-      La configurazione del criterio consente agli utenti di attivare un'app nella schermata di blocco se l'ID estensione dell'app è presente come valore nell'elenco del criterio. Pertanto, se il criterio viene impostato su un elenco vuoto, l'opzione per scrivere note nella schermata di blocco viene disattivata. L'esistenza dell'ID di un'app nel criterio non implica necessariamente che gli utenti possano attivare l'app come app per scrivere note nella schermata di blocco. Ad esempio, in <ph name="PRODUCT_NAME" /> 61, il gruppo di app disponibili viene limitato anche dalla piattaforma.
+      La configurazione della policy consente agli utenti di attivare un'app nella schermata di blocco se l'ID estensione dell'app è presente come valore nell'elenco della policy. Pertanto, se la policy viene impostata su un elenco vuoto, l'opzione per scrivere note nella schermata di blocco viene disattivata. L'esistenza dell'ID di un'app nella policy non implica necessariamente che gli utenti possano attivare l'app come app per scrivere note nella schermata di blocco. Ad esempio, in <ph name="PRODUCT_NAME" /> 61, il gruppo di app disponibili viene limitato anche dalla piattaforma.
 
-      Se il criterio non viene configurato, non vengono applicate limitazioni imposte da tale criterio al gruppo di app che gli utenti possono attivare nella schermata di blocco.</translation>
+      Se la policy non viene configurata, non vengono applicate limitazioni imposte da tale policy al gruppo di app che gli utenti possono attivare nella schermata di blocco.</translation>
 <translation id="6882028194958060206">Applica l'impostazione dei contenuti Flash a tutti i contenuti (deprecato)</translation>
 <translation id="6883050310557769428">Consente di verificare che il servizio SSO mobile sia attivo e di controllare la lista bloccata di domini dei cookie e le relative eccezioni.</translation>
 <translation id="6889123056995503704">Gli utenti decidono il comportamento del downgrade del canale</translation>
 <translation id="6889617338886728275">Consente di impostare un elenco di pattern URL per i siti che specifica i siti a cui l'autorizzazione per la gestione delle finestre viene automaticamente concessa. Ciò estenderà la capacità dei siti di vedere le informazioni sulle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
 
-Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
+Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
 
-Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_WINDOW_MANAGEMENT_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.
+Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_WINDOW_MANAGEMENT_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.
 
-Questo sostituisce il criterio <ph name="WINDOW_PLACEMENT_ALLOWED_FOR_URLS_POLICY_NAME" /> obsoleto.</translation>
+Sostituisce la policy <ph name="WINDOW_PLACEMENT_ALLOWED_FOR_URLS_POLICY_NAME" /> obsoleta.</translation>
 <translation id="6894178810167845842">URL della pagina Nuova scheda</translation>
 <translation id="6897730193187922386">Elimina messaggi relativi al ritiro di <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="6899705656741990703">Rileva automaticamente impostazioni proxy</translation>
 <translation id="6901462246839613666">Abilita la visualizzazione dei contenuti promozionali</translation>
 <translation id="6902561336084511004">Consente di specificare le configurazioni dei server di stampa disponibili.
 
-      Questo criterio consente di specificare la configurazione dei server di stampa esterni sui dispositivi <ph name="PRODUCT_OS_NAME" /> come file JSON.
+      Questa policy consente di specificare la configurazione dei server di stampa esterni sui dispositivi <ph name="PRODUCT_OS_NAME" /> come file JSON.
 
       Le dimensioni del file non devono superare 1MB e devono contenere un array di record (oggetti JSON). Ogni record deve contenere i campi "id", "url" e "display_name" con stringhe come valori. I valori dei campi "id" devono essere univoci.
 
       Il file viene scaricato e memorizzato nella cache. L'hash di crittografia viene utilizzato per verificare l'integrità del download. Il file viene scaricato nuovamente ogni volta che l'URL o l'hash cambiano.
 
-      Se il criterio viene impostato su un valore corretto, i dispositivi provano a inviare query ai server di stampa specificati per le stampanti disponibili utilizzando il protocollo IPP.
+      Se la policy viene impostata su un valore corretto, i dispositivi provano a inviare query ai server di stampa specificati per le stampanti disponibili utilizzando il protocollo IPP.
 
-      Se il criterio non viene configurato o se viene impostato un valore non corretto, agli utenti non sarà visibile nessuna stampante.
+      Se la policy non viene configurata o se viene impostato un valore non corretto, agli utenti non sarà visibile nessuna stampante.
 
       Attualmente, il numero di server di stampa è limitato a 16. Solo ai primi 16 server di stampa dell'elenco vengono inviate query.
       </translation>
@@ -8331,9 +8331,9 @@
 <translation id="6908335885425855120">Utilizza Visualizzatore PDF iframe out-of-process</translation>
 <translation id="6908640907898649429">Configura il provider di ricerca predefinito. Puoi specificare il provider di ricerca predefinito che l'utente utilizzerà oppure scegliere di disattivare la ricerca predefinita.</translation>
 <translation id="6913068954484253496">Consenti a <ph name="PRODUCT_NAME" /> di connettersi ai dispositivi Cast su tutti gli indirizzi IP.</translation>
-<translation id="6915493311660114995">Se il criterio viene impostato su Enabled, <ph name="PRODUCT_NAME" /> consentirà le richieste di autenticazione web sui siti web che hanno certificati TLS con errori (ad esempio, siti web considerati non sicuri).
+<translation id="6915493311660114995">Se la policy viene impostata su Enabled, <ph name="PRODUCT_NAME" /> consentirà le richieste di autenticazione web sui siti web che hanno certificati TLS con errori (ad esempio, siti web considerati non sicuri).
 
-Se il criterio viene impostato su Disabled o se non viene configurato, verrà applicato il comportamento predefinito di blocco di queste richieste.</translation>
+Se la policy viene impostata su Disabled o se non viene configurata, verrà applicato il comportamento predefinito di blocco di queste richieste.</translation>
 <translation id="6915524162137327111">Visualizzazione delle etichette di gestione per 30 secondi</translation>
 <translation id="6919205861950516688">Non consentire Organizza schede.</translation>
 <translation id="692096803256767290">Esegui il rollback del sistema operativo alla versione target</translation>
@@ -8354,13 +8354,13 @@
 <translation id="6922884955650325312">Blocca il plug-in <ph name="FLASH_PLUGIN_NAME" /></translation>
 <translation id="6924223708804692571">Forza la disattivazione delle lingue per correttore ortografico. Le lingue non riconosciute di quell'elenco verranno ignorate.
 
-      Se il criterio viene attivato, il correttore ortografico verrà disattivato per le lingue specificate. L'utente può comunque attivare o disattivare il correttore ortografico per le lingue che non sono nell'elenco.
+      Se la policy viene attivata, il correttore ortografico verrà disattivato per le lingue specificate. L'utente può comunque attivare o disattivare il correttore ortografico per le lingue che non sono nell'elenco.
 
-      Se il criterio non è impostato o se viene disattivato, le preferenze sul correttore ortografico dell'utente rimarranno invariate.
+      Se la policy non è impostata o se viene disattivata, le preferenze sul correttore ortografico dell'utente rimarranno invariate.
 
-      Se il criterio <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> è impostato su false, questo criterio non avrà effetto.
+      Se la policy <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> è impostata su false, questa policy non avrà effetto.
 
-      Se una lingua è inclusa sia in questo criterio che nel criterio <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, quest'ultimo avrà priorità e verrà attivata la lingua per il correttore ortografico.
+      Se una lingua è inclusa sia in questa policy che nella policy <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, quest'ultima avrà priorità e verrà attivata la lingua per il correttore ortografico.
 
       Le lingue attualmente supportate sono: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="6926703471186170050">Attiva la stampa fronte/retro su lato lungo</translation>
@@ -8374,49 +8374,49 @@
 
 Se la policy viene impostata su 2, le origini delle app web isolate non possono usare Controlled Frame.</translation>
 <translation id="6932282102911647185">Colore della retroilluminazione della tastiera viola</translation>
-<translation id="6938424179790370595">Se il criterio è impostato su None, la lente d'ingrandimento è disattivata.
+<translation id="6938424179790370595">Se la policy è impostata su None, la lente d'ingrandimento è disattivata.
 
-Se configuri il criterio, gli utenti non possono modificarlo. Se il criterio non è configurato, la lente d'ingrandimento risulta disattivata all'inizio, ma gli utenti possono attivarla in qualsiasi momento.</translation>
+Se configuri la policy, gli utenti non possono modificarla. Se la policy non è configurata, la lente d'ingrandimento risulta disattivata all'inizio, ma gli utenti possono attivarla in qualsiasi momento.</translation>
 <translation id="6938524853892166974">Disattiva Traduzione dal Vivo</translation>
 <translation id="6940243892299228102">Gli utenti non possono usare i modelli di scrivanie</translation>
 <translation id="6943577887654905793">Nome di preferenza per Mac/Linux:</translation>
 <translation id="694602410134474029">Consente di stabilire se <ph name="PRODUCT_NAME" /> interagisce con i driver di stampa da un processo di servizio separato. Le chiamate della stampa della piattaforma per eseguire query sulle stampanti disponibili, ottenere le impostazioni dei driver di stampa e inviare documenti per la stampa alle stampanti locali vengono effettuate tramite un processo di servizio. Lo spostamento di queste chiamate all'esterno del processo del browser contribuisce a migliorare la stabilità e a ridurre il comportamento dell'UI bloccata nell'anteprima di stampa.
 
-Se questo criterio viene attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> userà un processo di servizio separato per le attività di stampa della piattaforma.
+Se questa policy viene attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> userà un processo di servizio separato per le attività di stampa della piattaforma.
 
-Se questo criterio viene disattivato, <ph name="PRODUCT_NAME" /> userà il processo del browser per le attività di stampa della piattaforma.
+Se questa policy viene disattivata, <ph name="PRODUCT_NAME" /> userà il processo del browser per le attività di stampa della piattaforma.
 
-Questo criterio verrà rimosso in futuro, una volta completata l'implementazione della funzionalità dei driver di stampa out-of-process.</translation>
+Questa policy verrà rimossa in futuro, una volta completata l'implementazione della funzionalità dei driver di stampa out-of-process.</translation>
 <translation id="6946652757373377924">
-      Questo criterio è stato rimosso da M77.
-      Questo criterio si applica alla schermata di accesso. Vedi anche il criterio <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> che viene applicato alla sessione utente.
-      Se il criterio è attivato, ciascuna delle origini denominate all'interno di un elenco separato da virgole viene eseguita nel proprio processo. In questo modo, si isolano anche le origini indicate dai sottodomini; ad esempio specificando https://example.com/ si isola anche https://foo.example.com/, perché fa parte del sito https://example.com/.
-      Se il criterio non è configurato o è disattivato, per la schermata di accesso vengono utilizzate le impostazioni di isolamento dei siti predefinite della piattaforma.
+      Questa policy è stata rimossa da M77.
+      Questa policy si applica alla schermata di accesso. Vedi anche la policy <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> che viene applicata alla sessione utente.
+      Se la policy è attivata, ciascuna delle origini denominate all'interno di un elenco separato da virgole viene eseguita nel proprio processo. In questo modo, si isolano anche le origini indicate dai sottodomini; ad esempio specificando https://example.com/ si isola anche https://foo.example.com/, perché fa parte del sito https://example.com/.
+      Se la policy non è configurata o è disattivata, per la schermata di accesso vengono utilizzate le impostazioni di isolamento dei siti predefinite della piattaforma.
       </translation>
 <translation id="6947587367703216074">Non è consentita la creazione di sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> di <ph name="WEBXR_API_NAME_SHORT" /></translation>
-<translation id="6949867264289339206">La configurazione del criterio consente di specificare le configurazioni delle stampanti aziendali associate ai dispositivi. Il formato corrisponde a quello del dizionario <ph name="PRINTERS_POLICY_NAME" />, con un campo "id" o "guid" aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base ai criteri <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
+<translation id="6949867264289339206">La configurazione della policy consente di specificare le configurazioni delle stampanti aziendali associate ai dispositivi. Il formato corrisponde a quello del dizionario <ph name="PRINTERS_POLICY_NAME" />, con un campo "id" o "guid" aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base alle policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
-      Questo criterio:
+      Questa policy:
 
       * Non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.
 
-      * È integrativo al criterio <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> e alle configurazioni delle stampanti da parte dei singoli utenti.
+      * È integrativa alla policy <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> e alle configurazioni delle stampanti da parte dei singoli utenti.
 
-      Se il criterio non viene configurato, non ci saranno stampanti per i dispositivi e gli altri criteri <ph name="DEVICE_PRINTERS_POLICY_PATTERN" /> verranno ignorati.</translation>
+      Se la policy non viene configurata, non ci saranno stampanti per i dispositivi e le altre policy <ph name="DEVICE_PRINTERS_POLICY_PATTERN" /> verranno ignorate.</translation>
 <translation id="69525503251220566">Parametro che fornisce la funzione di ricerca tramite immagine per il provider di ricerca predefinito</translation>
 <translation id="6953102253399571439">Attiva la stampa PIN per impostazione predefinita</translation>
 <translation id="6956272732789158625">Non consentire a nessun sito di utilizzare la generazione di chiavi</translation>
 <translation id="6960996423652450945">Disattiva l'evidenziazione del cursore del testo nella schermata di accesso</translation>
-<translation id="6961602002757991199">Se per il criterio viene impostato un URL valido, <ph name="PRODUCT_NAME" /> scarica l'elenco dei siti da tale URL e applica le regole come se fossero state configurate con il criterio <ph name="BROWSER_SWITCHER_URL_GREYLIST_POLICY_NAME" />. Questi criteri impediscono a <ph name="PRODUCT_NAME" /> e al browser alternativo di aprirsi a vicenda.
+<translation id="6961602002757991199">Se per la policy viene impostata un URL valido, <ph name="PRODUCT_NAME" /> scarica l'elenco dei siti da tale URL e applica le regole come se fossero state configurate con la policy <ph name="BROWSER_SWITCHER_URL_GREYLIST_POLICY_NAME" />. Queste policy impediscono a <ph name="PRODUCT_NAME" /> e al browser alternativo di aprirsi a vicenda.
 
-      Se il criterio non viene impostato (o se viene impostato un URL non valido), <ph name="PRODUCT_NAME" /> non usa il criterio come fonte di regole per non cambiare browser.
+      Se la policy non viene impostata (o se viene impostato un URL non valido), <ph name="PRODUCT_NAME" /> non usa la policy come fonte di regole per non cambiare browser.
 
-      Nota: questo criterio rimanda a un file XML nello stesso formato del criterio <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" />. Se viene impostato, le regole vengono caricate da un file XML senza essere condivise con <ph name="IE_PRODUCT_NAME" />. Leggi ulteriori informazioni sul criterio <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> (https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode)</translation>
-<translation id="6967623535060479585">La configurazione del criterio consente di controllare l'attivazione dell'avviso di protezione delle password. La funzionalità di protezione delle password avvisa gli utenti quando riutilizzano le proprie password protette su siti potenzialmente sospetti.
+      Nota: questa policy rimanda a un file XML nello stesso formato della policy <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" />. Se viene impostata, le regole vengono caricate da un file XML senza essere condivise con <ph name="IE_PRODUCT_NAME" />. Leggi ulteriori informazioni sulla policy <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> (https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode)</translation>
+<translation id="6967623535060479585">La configurazione della policy consente di controllare l'attivazione dell'avviso di protezione delle password. La funzionalità di protezione delle password avvisa gli utenti quando riutilizzano le proprie password protette su siti potenzialmente sospetti.
 
-      Utilizza i criteri <ph name="PASSWORD_PROTECTION_LOGIN_URLS_POLICY_NAME" /> e <ph name="PASSWORD_PROTECTION_CHANGE_PASSWORD_URL_POLICY_NAME" /> per impostare la password da proteggere.
+      Utilizza le policy <ph name="PASSWORD_PROTECTION_LOGIN_URLS_POLICY_NAME" /> e <ph name="PASSWORD_PROTECTION_CHANGE_PASSWORD_URL_POLICY_NAME" /> per impostare la password da proteggere.
 
-      Se il criterio viene impostato su:
+      Se la policy viene impostata su:
 
       * PasswordProtectionWarningOff, non viene mostrato alcun avviso di protezione delle password.
 
@@ -8424,16 +8424,16 @@
 
       * PasswordProtectionWarningOnPhishingReuse, l'avviso di protezione delle password viene mostrato quando l'utente riutilizza la propria password protetta su un sito di phishing.
 
-      Se il criterio non viene configurato, il servizio di protezione delle password protegge soltanto le password Google, ma gli utenti possono modificare questa impostazione.</translation>
-<translation id="6969108216182455619">Questo criterio è obsoleto ed è prevista la rimozione in Chrome 78. Non verrà sostituito da altri criteri.
+      Se la policy non viene configurata, il servizio di protezione delle password protegge soltanto le password Google, ma gli utenti possono modificare questa impostazione.</translation>
+<translation id="6969108216182455619">Questa policy è obsoleta ed è prevista la rimozione in Chrome 78. Non verrà sostituita da altre policy.
 
-      Questo criterio consente HTTP/0.9 su porte diverse dalla porta 80 per HTTP e 443 per HTTPS.
+      Questa policy consente HTTP/0.9 su porte diverse dalla porta 80 per HTTP e 443 per HTTPS.
 
-      Questo criterio è disattivato per impostazione predefinita e, se attivato, rende gli utenti vulnerabili al problema di sicurezza https://crbug.com/600352.
+      Questa policy è disattivata per impostazione predefinita e, se attivata, rende gli utenti vulnerabili al problema di sicurezza https://crbug.com/600352.
 
-      Questo criterio è pensato per offrire alle aziende la possibilità di eseguire la migrazione di server esistenti da HTTP/0.9 e verrà rimosso in futuro.
+      Questa policy è pensata per offrire alle aziende la possibilità di eseguire la migrazione di server esistenti da HTTP/0.9 e verrà rimossa in futuro.
 
-      Se questo criterio non viene configurato, HTTP/0.9 verrà disattivato per le porte non predefinite.</translation>
+      Se questa policy non viene configurata, HTTP/0.9 verrà disattivato per le porte non predefinite.</translation>
 <translation id="6969332115615661188">Disattiva l'input video</translation>
 <translation id="6969949359984470271">L'app web kiosk non è in grado di funzionare offline</translation>
 <translation id="6971579036359007697">Controlla la migrazione dei file locali sul cloud.
@@ -8456,26 +8456,26 @@
       Se selezioni l'opzione "U2F", il funzionamento dell'autenticazione a due fattori integrata dipenderà dalla specifica FIDO U2F.
 
       Se selezioni l'opzione "U2F_EXTENDED", l'autenticazione a due fattori integrata fornirà le funzioni U2F più alcune estensioni per la singola attestazione.</translation>
-<translation id="69942621143543910">Questo criterio consente agli amministratori di configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> su <ph name="PRODUCT_OS_NAME" />.
+<translation id="69942621143543910">Questa policy consente agli amministratori di configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> su <ph name="PRODUCT_OS_NAME" />.
 
-Se il criterio viene impostato su "<ph name="ALLOWED_NAME" />", l'utente può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> se vuole.
+Se la policy viene impostata su "<ph name="ALLOWED_NAME" />", l'utente può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> se vuole.
 Dopo aver completato la procedura di configurazione, i file con formati file corrispondenti verranno spostati per impostazione predefinita su <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e gestiti dall'app <ph name="MICROSOFT_365_NAME" /> quando l'utente tenterà di aprirli.
 
-Se il criterio viene impostato su "<ph name="DISALLOWED_NAME" />", l'utente non può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> come descritto in precedenza e <ph name="MICROSOFT_365_NAME" /> viene rimosso dall'elenco dei potenziali gestori di file.
+Se la policy viene impostata su "<ph name="DISALLOWED_NAME" />", l'utente non può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> come descritto in precedenza e <ph name="MICROSOFT_365_NAME" /> viene rimosso dall'elenco dei potenziali gestori di file.
 
-Se il criterio viene impostato su "<ph name="AUTOMATED_NAME" />", il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> viene configurato automaticamente, quindi i file con formati file corrispondenti verranno spostati per impostazione predefinita su <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e gestiti dall'app <ph name="MICROSOFT_365_NAME" /> quando l'utente tenterà di aprirli.
+Se la policy viene impostata su "<ph name="AUTOMATED_NAME" />", il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e <ph name="MICROSOFT_365_NAME" /> viene configurato automaticamente, quindi i file con formati file corrispondenti verranno spostati per impostazione predefinita su <ph name="MICROSOFT_ONE_DRIVE_NAME" /> e gestiti dall'app <ph name="MICROSOFT_365_NAME" /> quando l'utente tenterà di aprirli.
 
-Se il criterio non viene configurato, in pratica equivale a impostarlo su "<ph name="ALLOWED_NAME" />" per gli utenti normali e su "<ph name="DISALLOWED_NAME" />" per gli utenti aziendali.</translation>
-<translation id="6999948519306285655">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
+Se la policy non viene configurata, in pratica equivale a impostarla su "<ph name="ALLOWED_NAME" />" per gli utenti normali e su "<ph name="DISALLOWED_NAME" />" per gli utenti aziendali.</translation>
+<translation id="6999948519306285655">Questa policy è deprecata. Usa la policy <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       La configurazione del criterio consente di specificare un URL a un file proxy .pac. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e hai selezionato <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       La configurazione della policy consente di specificare un URL a un file proxy .pac. Questa policy viene applicata solo se la policy <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificata e hai selezionato <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criteri di impostazione del proxy.
+       Non configurare questa policy se hai selezionato una qualsiasi altra modalità per le policy di impostazione del proxy.
 
        Nota: per esempi approfonditi, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
-<translation id="7001915679435065291">Se il criterio viene impostato su 1, tutti i siti web possono mostrare immagini. Se il criterio viene impostato su 2, la visualizzazione delle immagini viene negata.
+<translation id="7001915679435065291">Se la policy viene impostata su 1, tutti i siti web possono mostrare immagini. Se la policy viene impostata su 2, la visualizzazione delle immagini viene negata.
 
-Se non viene configurato, le immagini sono consentite, ma gli utenti possono cambiare l'impostazione.</translation>
+Se non viene configurata, le immagini sono consentite, ma gli utenti possono cambiare l'impostazione.</translation>
 <translation id="7002040773317582266">Il controllo in tempo reale degli URL del frame principale è attivo.</translation>
 <translation id="7003746348783715221">Preferenze di <ph name="PRODUCT_NAME" /></translation>
 <translation id="7007283257527015835">Un flag booleano che indica se il gestore di protocollo deve essere impostato o meno come predefinito.</translation>
@@ -8484,9 +8484,9 @@
 <translation id="7008308728445338159">Controlli intercettazione DNS attivi</translation>
 <translation id="7009043124653876961">Disattiva i suggerimenti di emoji durante la digitazione</translation>
 <translation id="7010006999849135962">Attiva l'autenticazione senza PIN per l'host di accesso remoto</translation>
-<translation id="7013333561002112085">Se questo criterio viene impostato su <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_USER_ENABLED" /> (valore 1), il browser richiederà al server di gestione dispositivi un certificato client per un profilo o un utente gestito. Questo certificato verrà reso disponibile, ad es., per le connessioni mTLS.
+<translation id="7013333561002112085">Se questa policy viene impostata su <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_USER_ENABLED" /> (valore 1), il browser richiederà al server di gestione dispositivi un certificato client per un profilo o un utente gestito. Questo certificato verrà reso disponibile, ad es., per le connessioni mTLS.
 
-Se questo criterio viene impostato su <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_USER_DISABLED" /> (valore 0), il browser non potrà richiedere il certificato client. Se è già stato eseguito il provisioning del certificato client gestito di un profilo, poiché questo criterio è stato attivato in precedenza non verrà eliminato, ma non sarà disponibile per le connessioni mTLS e non verrà rinnovato alla scadenza.</translation>
+Se questa policy viene impostata su <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_USER_DISABLED" /> (valore 0), il browser non potrà richiedere il certificato client. Se è già stato eseguito il provisioning del certificato client gestito di un profilo, poiché questa policy è stata attivata in precedenza non verrà eliminato, ma non sarà disponibile per le connessioni mTLS e non verrà rinnovato alla scadenza.</translation>
 <translation id="7013484314513229844">Attiva l'avvio tramite CA</translation>
 <translation id="7014427417852575165">Gli utenti registrati al programma di protezione avanzata riceveranno protezioni aggiuntive</translation>
 <translation id="7016587686120059767">Disattiva la modalità ospite</translation>
@@ -8498,13 +8498,13 @@
 <translation id="7027785306666625591">Configura la gestione dell'alimentazione in <ph name="PRODUCT_OS_NAME" />.
 
       Queste norme consentono di configurare il comportamento di <ph name="PRODUCT_OS_NAME" /> quando l'utente rimane inattivo per un determinato periodo di tempo.</translation>
-<translation id="7027923238554618852">La configurazione del criterio indica a <ph name="PRODUCT_OS_NAME" /> di utilizzare la configurazione del programma di pianificazione delle attività identificato dal nome specificato. Questo criterio può essere impostato su <ph name="CONSERVATIVE_VALUE" /> o su <ph name="PERFORMANCE_VALUE" />, opzioni che correggono il programma di pianificazione delle attività, rispettivamente, per la stabilità o il massimo rendimento.
+<translation id="7027923238554618852">La configurazione della policy indica a <ph name="PRODUCT_OS_NAME" /> di utilizzare la configurazione del programma di pianificazione delle attività identificato dal nome specificato. Questa policy può essere impostata su <ph name="CONSERVATIVE_VALUE" /> o su <ph name="PERFORMANCE_VALUE" />, opzioni che correggono il programma di pianificazione delle attività, rispettivamente, per la stabilità o il massimo rendimento.
 
-      Se non viene configurato, gli utenti sono liberi di fare la propria scelta.</translation>
+      Se non viene configurata, gli utenti sono liberi di fare la propria scelta.</translation>
 <translation id="7028640460148648082">Non viene segnalato lo stato di rete</translation>
-<translation id="7030205756530739128">Se il criterio <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> viene impostato su <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME" /> consente di personalizzare quando viene avviata la ricarica della batteria, in base alla percentuale di carica. Il valore deve essere di almeno 5 punti percentuali inferiore a <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" />.
+<translation id="7030205756530739128">Se la policy <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> viene impostata su <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME" /> consente di personalizzare quando viene avviata la ricarica della batteria, in base alla percentuale di carica. Il valore deve essere di almeno 5 punti percentuali inferiore a <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME" />.
 
-      Se il criterio non viene configurato, viene applicata la modalità di ricarica standard della batteria.</translation>
+      Se la policy non viene configurata, viene applicata la modalità di ricarica standard della batteria.</translation>
 <translation id="7030407698292813622">Consenti query DNS per tipi di record DNS aggiuntivi</translation>
 <translation id="7030632236140191991">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" />, che si attiva quando vengono inseriti dati in Chrome dagli appunti o tramite trascinamento di contenuti web.
 
@@ -8522,25 +8522,25 @@
 
       I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo learn_more_url contiene un URL fornito dall'amministratore su cui l'utente può fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo della lingua è facoltativo e contiene la lingua in cui è scritto il messaggio. Il campo della lingua vuoto o con il valore "predefinito" indica un messaggio da utilizzare se la lingua dell'utente non ne ha uno. Il campo dei tag consente di specificare il tipo di scansioni per cui viene visualizzato il messaggio. L'elenco custom_messages può avere alcune voci o nessuna, dove per ognuna di queste i campi del messaggio e dei tag non devono essere vuoti.
 
-      Questo criterio richiede una configurazione aggiuntiva per essere applicato. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
+      Questa policy richiede una configurazione aggiuntiva per essere applicata. Visita https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting per maggiori informazioni.</translation>
 <translation id="7032323070729112362">Non consente l'utilizzo dell'API Translator</translation>
 <translation id="7032813174556919004">Disattiva DNS over HTTPS</translation>
-<translation id="703672323011778742">Questo criterio è deprecato in M88 e Flash non è più supportato da Chrome. Se il criterio viene impostato su 1, puoi decidere se tutti i siti web possono eseguire automaticamente il plug-in <ph name="FLASH_PLUGIN_NAME" />. Se il criterio viene impostato su 2, il plug-in viene negato per tutti i siti web. Click-to-play consente di eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />, ma gli utenti fanno clic sul segnaposto per avviarne l'esecuzione.
+<translation id="703672323011778742">Questa policy è deprecata in M88 e Flash non è più supportato da Chrome. Se la policy viene impostata su 1, puoi decidere se tutti i siti web possono eseguire automaticamente il plug-in <ph name="FLASH_PLUGIN_NAME" />. Se la policy viene impostata su 2, il plug-in viene negato per tutti i siti web. Click-to-play consente di eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />, ma gli utenti fanno clic sul segnaposto per avviarne l'esecuzione.
 
-      Se il criterio non viene configurato, viene utilizzato <ph name="BLOCK_PLUGINS_POLICY_NAME" /> e gli utenti possono cambiare l'impostazione.
+      Se la policy non viene configurata, viene utilizzata <ph name="BLOCK_PLUGINS_POLICY_NAME" /> e gli utenti possono cambiare l'impostazione.
 
-      Nota: la riproduzione automatica è consentita soltanto per i domini espressamente elencati nel criterio <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" />. Per attivare la riproduzione automatica per tutti i siti, aggiungi http://* e https://* a questo elenco.</translation>
+      Nota: la riproduzione automatica è consentita soltanto per i domini espressamente elencati nella policy <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" />. Per attivare la riproduzione automatica per tutti i siti, aggiungi http://* e https://* a questo elenco.</translation>
 <translation id="7037812781389976160">Consente di controllare la posizione della barra delle app di <ph name="PRODUCT_OS_NAME" />.
 
-      Se per questo criterio viene impostato il valore "In basso", la barra delle app viene posizionata nella parte inferiore dello schermo.
+      Se per questa policy viene impostato il valore "In basso", la barra delle app viene posizionata nella parte inferiore dello schermo.
 
-      Se per questo criterio viene impostato il valore "A sinistra", la barra delle app viene posizionata sul lato sinistro dello schermo.
+      Se per questa policy viene impostato il valore "A sinistra", la barra delle app viene posizionata sul lato sinistro dello schermo.
 
-      Se per questo criterio viene impostato il valore "A destra", la barra delle app viene posizionata sul lato destro dello schermo.
+      Se per questa policy viene impostato il valore "A destra", la barra delle app viene posizionata sul lato destro dello schermo.
 
-      Se imposti questo criterio come obbligatorio, gli utenti non potranno modificarlo o ignorarlo.
+      Se imposti questa policy come obbligatoria, gli utenti non potranno modificarla o ignorarla.
 
-      Se il criterio non viene impostato, la barra delle app verrà posizionata per impostazione predefinita nella parte inferiore dello schermo, ma l'utente potrà cambiare la posizione.</translation>
+      Se la policy non viene impostata, la barra delle app verrà posizionata per impostazione predefinita nella parte inferiore dello schermo, ma l'utente potrà cambiare la posizione.</translation>
 <translation id="7039815268521168329">Mostrare il flusso Voice Match dell'Assistente Google durante la configurazione iniziale</translation>
 <translation id="7040229947030068419">Valore di esempio:</translation>
 <translation id="7044626519138840387">Un elenco di origini di app client Remote Desktop che potrebbero eseguire le richieste
@@ -8552,13 +8552,13 @@
 Sono consentite solo origini HTTPS valide. I caratteri jolly non sono supportati.
 Le voci non valide vengono ignorate.</translation>
 <translation id="7044883996351280650">Controlla il servizio backup e ripristino di Android</translation>
-<translation id="7045221780834308118">Se il criterio viene impostato su Enabled, le applicazioni web di terze parti possono usare l'API Desk per controllare le scrivanie di <ph name="PRODUCT_OS_NAME" />. Se il criterio non viene configurato o se viene disattivato, <ph name="DESK_API_NAME" /> non sarà disponibile. Il criterio verrà applicato soltanto sui dispositivi registrati.</translation>
+<translation id="7045221780834308118">Se la policy viene impostata su Enabled, le applicazioni web di terze parti possono usare l'API Desk per controllare le scrivanie di <ph name="PRODUCT_OS_NAME" />. Se la policy non viene configurata o se viene disattivata, <ph name="DESK_API_NAME" /> non sarà disponibile. La policy verrà applicata soltanto sui dispositivi registrati.</translation>
 <translation id="7046113122884041950">Non consentire Smart Lock</translation>
 <translation id="7046997898355294677">Mostra le notifiche sulla privacy finché non vengono ignorate dagli utenti</translation>
 <translation id="7047495632846973438">Specifica se i criteri relativi alle autorizzazioni dell'acquisizione del display vengono controllati o saltati.</translation>
 <translation id="7055022222176591388">Non consentire il plug-in <ph name="FLASH_PLUGIN_NAME" /> obsoleto</translation>
-<translation id="7056040036973126753">I dati relativi all'attendibilità dei domini potrebbero essere inviati a Google in base al criterio Metriche utente di Chrome (UMA)</translation>
-<translation id="7056873645513072903">Impostazioni per il criterio AutofillPredictionSettings</translation>
+<translation id="7056040036973126753">I dati relativi all'attendibilità dei domini potrebbero essere inviati a Google in base alla policy Metriche utente di Chrome (UMA)</translation>
+<translation id="7056873645513072903">Impostazioni per la policy AutofillPredictionSettings</translation>
 <translation id="7062803946218028349">Consenti l'attivazione di Phone Hub</translation>
 <translation id="7066292150801784098">Disattiva l'interazione degli utenti remoti con finestre con privilegi più elevati nelle sessioni di assistenza remota</translation>
 <translation id="706669471845501145">Consenti la visualizzazione di notifiche desktop da parte dei siti</translation>
@@ -8571,56 +8571,56 @@
 <translation id="7077471517869658421">Gli utenti possono modificare liberamente il valore dell'impostazione "Usa l'Avvio app/il tasto Ricerca per modificare il comportamento dei tasti funzione".</translation>
 <translation id="707988220162760379">Apri sempre i file PDF utilizzando un visualizzatore PDF esterno</translation>
 <translation id="7081699207881888532">Attiva i suggerimenti di emoji durante la digitazione</translation>
-<translation id="7081784525008938771">Se il criterio viene impostato su Attivato o se non viene configurato, l'utente non viene considerato inattivo durante la riproduzione di video. In questo modo non viene raggiunto il ritardo di inattività, oscuramento dello schermo, spegnimento dello schermo e blocco dello schermo e non vengono compiute le azioni corrispondenti.
+<translation id="7081784525008938771">Se la policy viene impostata su Attivata o se non viene configurata, l'utente non viene considerato inattivo durante la riproduzione di video. In questo modo non viene raggiunto il ritardo di inattività, oscuramento dello schermo, spegnimento dello schermo e blocco dello schermo e non vengono compiute le azioni corrispondenti.
 
-      Se il criterio viene impostato su Disattivato, il sistema può considerare gli utenti inattivi nonostante l'attività video.</translation>
+      Se la policy viene impostata su Disattivata, il sistema può considerare gli utenti inattivi nonostante l'attività video.</translation>
 <translation id="7084631508902923941">Le estensioni che si connettono a una di queste origini rimarranno in esecuzione purché la porta sia collegata.
 
-Se il criterio non viene configurato, verranno usati i valori predefiniti. Di seguito sono riportate le origini delle app che offrono SDK che è noto non offrono la possibilità di ristabilire una connessione chiusa con uno stato precedente:
+Se la policy non viene configurata, verranno usati i valori predefiniti. Di seguito sono riportate le origini delle app che offrono SDK che è noto non offrono la possibilità di ristabilire una connessione chiusa con uno stato precedente:
 - Smart Card Connector
 - Citrix Receiver (stabile, beta, backup)
 - VMware Horizon (stabile, beta)
 
-Se il criterio viene impostato, l'elenco dei valori predefiniti viene esteso con i nuovi valori configurati. Sia le voci predefinite sia quelle indicate dal criterio concederanno l'eccezione alle estensioni che si connettono, purché la porta sia collegata.</translation>
+Se la policy viene impostata, l'elenco dei valori predefiniti viene esteso con i nuovi valori configurati. Sia le voci predefinite sia quelle indicate dalla policy concederanno l'eccezione alle estensioni che si connettono, purché la porta sia collegata.</translation>
 <translation id="7086720321892395256">Consente di controllare i criteri relativi agli utenti e ai dispositivi per la funzionalità Schermata sulla privacy.</translation>
 <translation id="7090500018761495290">Riattiva l'API Event.path fino alla versione M115.</translation>
-<translation id="7090668780328470271">Se il criterio viene configurato, puoi elencare i pattern URL che specificano i siti che non possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo USB.
+<translation id="7090668780328470271">Se la policy viene configurata, puoi elencare i pattern URL che specificano i siti che non possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo USB.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      I pattern URL non possono essere in conflitto con <ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non possono essere in conflitto con <ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambe.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
-<translation id="7091220433954923921">La configurazione del criterio consente di limitare l'intervallo di porte UDP utilizzate dall'host di accesso remoto in questo computer.
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
+<translation id="7091220433954923921">La configurazione della policy consente di limitare l'intervallo di porte UDP utilizzate dall'host di accesso remoto in questo computer.
 
-      Se il criterio non viene configurato o se viene impostata una stringa vuota, l'host di accesso remoto può usare qualsiasi porta disponibile.
+      Se la policy non viene configurata o se viene impostata una stringa vuota, l'host di accesso remoto può usare qualsiasi porta disponibile.
 
-      Nota: se il criterio <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> è impostato su Disattivato, l'host di accesso remoto userà le porte UDP che rientrano nell'intervallo 12400-12409.</translation>
+      Nota: se la policy <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> è impostata su Disattivata, l'host di accesso remoto userà le porte UDP che rientrano nell'intervallo 12400-12409.</translation>
 <translation id="7091842872805965910">Attivare la funzionalità di invio automatico del PIN nelle schermate di accesso e di blocco.</translation>
 <translation id="7093294902558672021">Segnala informazioni sulla ventola di un dispositivo.
 
-      Se il criterio è impostato su False o non è configurato, le informazioni non vengono segnalate.
-      Se è impostato su True, le informazioni sulla ventola del dispositivo vengono segnalate.</translation>
+      Se la policy è impostata su False o non è configurata, le informazioni non vengono segnalate.
+      Se è impostata su True, le informazioni sulla ventola del dispositivo vengono segnalate.</translation>
 <translation id="7094859984356280614">Abilita l'integrazione di Gemini.</translation>
 <translation id="710003290625031750">Descrizione estesa dello schema:</translation>
 <translation id="7101550508196914704">Non mostrare la scorciatoia applicazioni nella barra dei Preferiti</translation>
-<translation id="7105084505972468353">Se questo criterio viene impostato, consente di controllare il tipo di lente d'ingrandimento che viene attivato.
+<translation id="7105084505972468353">Se questa policy viene impostata, consente di controllare il tipo di lente d'ingrandimento che viene attivato.
 
-Se questo criterio viene impostato su "Schermo intero", la lente d'ingrandimento sarà sempre attiva in modalità lente d'ingrandimento a schermo intero sulla schermata di accesso.
+Se questa policy viene impostata su "Schermo intero", la lente d'ingrandimento sarà sempre attiva in modalità lente d'ingrandimento a schermo intero sulla schermata di accesso.
 
-Se questo criterio viene impostato su "Ancorata", la lente d'ingrandimento verrà sempre attivata in modalità lente d'ingrandimento ancorata sulla schermata di accesso.
+Se questa policy viene impostata su "Ancorata", la lente d'ingrandimento verrà sempre attivata in modalità lente d'ingrandimento ancorata sulla schermata di accesso.
 
-Se questo criterio è impostato su "Nessuno", la lente d'ingrandimento sarà sempre disattivata sulla schermata di accesso.
+Se questa policy è impostata su "Nessuno", la lente d'ingrandimento sarà sempre disattivata sulla schermata di accesso.
 
-Se configuri questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+Se configuri questa policy, gli utenti non potranno modificarla o ignorarla.
 
-Se questo criterio non viene impostato, inizialmente la lente d'ingrandimento è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
+Se questa policy non viene impostata, inizialmente la lente d'ingrandimento è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="7109384070286741861">CECPQ2 viene disattivato</translation>
 <translation id="7113439794629928551">Mostra i controlli multimediali per le sessioni <ph name="PRODUCT_NAME" /> avviate da altri dispositivi</translation>
-<translation id="7113803652772945829">Se il criterio viene impostato su true, gli utenti possono utilizzare un gestore delle password di terze parti.
+<translation id="7113803652772945829">Se la policy viene impostata su true, gli utenti possono utilizzare un gestore delle password di terze parti.
 Questo gestore delle password si occuperà di salvare e inserire tutte le password, i dati di pagamento e
 di compilazione automatica.
-Se il criterio viene impostato su true o se non viene impostato, un'impostazione consentirà di passare dal
+Se la policy viene impostata su true o se non viene impostata, un'impostazione consentirà di passare dal
 gestore delle password
 integrato di <ph name="PRODUCT_NAME" /> a quello configurato nelle impostazioni del dispositivo Android.
 Poiché <ph name="PRODUCT_NAME" /> utilizza gli stessi dati
@@ -8628,77 +8628,77 @@
 di terze parti solo se un gestore diverso da Compilazione automatica Google è configurato
 nelle impostazioni di sistema del dispositivo Android.
 
-Se il criterio viene impostato su false,
+Se la policy viene impostata su false,
 <ph name="PRODUCT_NAME" /> utilizzerà sempre
 il gestore delle password integrato.
 
-Questo criterio non influisce sui gestori delle password di terze parti che utilizzano
+Questa policy non influisce sui gestori delle password di terze parti che utilizzano
 API di accessibilità.</translation>
 <translation id="7114169791477667553">Disattiva il provider di ricerca predefinito</translation>
 <translation id="7115684775550072082">Mantieni solo gli spazi vuoti per i tipi MIME di testo e XML</translation>
 <translation id="7119538491527883595">Spazio di archiviazione dei dati utente locale</translation>
-<translation id="7121046543122812054">Questo criterio è deprecato. Potresti usare il criterio <ph name="BROWSER_SIGNIN_POLICY_NAME" />.
+<translation id="7121046543122812054">Questa policy è deprecata. Potresti usare la policy <ph name="BROWSER_SIGNIN_POLICY_NAME" />.
 
       Consente all'utente di accedere a <ph name="PRODUCT_NAME" />.
 
-      Se questo criterio viene impostato su Enabled, l'utente potrà accedere a <ph name="PRODUCT_NAME" />.
-      Se viene impostato su Disabled, non sarà possibile accedere. Impedisce anche il funzionamento di app ed estensioni che usano l'API chrome.identity. Per evitare che ciò accada, usa il criterio <ph name="SYNC_DISABLED_POLICY_NAME" />.
+      Se questa policy viene impostata su Enabled, l'utente potrà accedere a <ph name="PRODUCT_NAME" />.
+      Se viene impostata su Disabled, non sarà possibile accedere. Impedisce anche il funzionamento di app ed estensioni che usano l'API chrome.identity. Per evitare che ciò accada, usa la policy <ph name="SYNC_DISABLED_POLICY_NAME" />.
       </translation>
-<translation id="7122626777103192518">Se il criterio viene impostato su Vero, viene attivata la condivisione di testo/file dalle app Android alle app web supportate, utilizzando il sistema di condivisione di Android integrato.
+<translation id="7122626777103192518">Se la policy viene impostata su True, viene attivata la condivisione di testo/file dalle app Android alle app web supportate, utilizzando il sistema di condivisione di Android integrato.
       Se attivato, questo invierà a Google i metadati per le app web installate per generare e installare un'app Android compatibile.
-      Se il criterio viene impostato su Falso, la funzionalità viene disattivata.</translation>
+      Se la policy viene impostata su False, la funzionalità viene disattivata.</translation>
 <translation id="7123271473727774529">Attiva la funzione di accessibilità di correzione del colore</translation>
 <translation id="7123365950656684184">Forza l'avvio diretto degli host di messaggistica nativi eseguibili di Windows</translation>
 <translation id="7126716959063786004">Consenti di terminare i processi in Task Manager</translation>
 <translation id="7126787606641224668">Consente di controllare se la funzionalità "Ricorda password" è attiva nella finestra di dialogo dell'autenticazione Kerberos. Le password vengono memorizzate criptate su disco e sono accessibili soltanto al daemon del sistema Kerberos durante una sessione utente.
 
-Se questo criterio viene attivato o se non viene configurato, gli utenti possono decidere se memorizzare o meno le password Kerberos in modo da non doverle inserire nuovamente. I ticket Kerberos vengono recuperati automaticamente, a meno che non sia necessaria un'ulteriore autenticazione (autenticazione a due fattori).
+Se questa policy viene attivata o se non viene configurata, gli utenti possono decidere se memorizzare o meno le password Kerberos in modo da non doverle inserire nuovamente. I ticket Kerberos vengono recuperati automaticamente, a meno che non sia necessaria un'ulteriore autenticazione (autenticazione a due fattori).
 
-Se il criterio viene disattivato, le password non vengono mai memorizzate e tutte le password salvate in precedenza vengono rimosse. Gli utenti devono inserire la propria password ogni volta che devono eseguire l'autenticazione con il sistema Kerberos. In base alle impostazioni del server, generalmente questa operazione deve essere svolta con una frequenza che varia da 8 ore e diversi mesi.</translation>
+Se la policy viene disattivata, le password non vengono mai memorizzate e tutte le password salvate in precedenza vengono rimosse. Gli utenti devono inserire la propria password ogni volta che devono eseguire l'autenticazione con il sistema Kerberos. In base alle impostazioni del server, generalmente questa operazione deve essere svolta con una frequenza che varia da 8 ore e diversi mesi.</translation>
 <translation id="7126928806195745404">Impostazioni JavaScript</translation>
-<translation id="7127732963662601239">Questo criterio consente di stabilire se mostrare o meno all'utente la schermata del sensore della presenza di persone durante il primo accesso.
-    Se viene impostato su false, la schermata del sensore della presenza di persone non verrà visualizzata.
-    Se viene impostato su true, la schermata del sensore della presenza di persone verrà visualizzata.
-    Se il criterio non viene configurato, per gli utenti gestiti a livello aziendale viene applicato il valore predefinito false, mentre per gli utenti non gestiti viene utilizzato il valore true.</translation>
+<translation id="7127732963662601239">Questa policy consente di stabilire se mostrare o meno all'utente la schermata del sensore della presenza di persone durante il primo accesso.
+    Se viene impostata su false, la schermata del sensore della presenza di persone non verrà visualizzata.
+    Se viene impostata su true, la schermata del sensore della presenza di persone verrà visualizzata.
+    Se la policy non viene configurata, per gli utenti gestiti a livello aziendale viene applicato il valore predefinito false, mentre per gli utenti non gestiti viene utilizzato il valore true.</translation>
 <translation id="7127980134843952133">Cronologia download</translation>
 <translation id="7128513247945602297">Attiva l'upgrade automatico del contenuto misto sui siti HTTPS</translation>
 <translation id="712963038874313213">Fornisce un playbook Ansible che deve essere eseguito nel contenitore Crostini predefinito.
 
-      Questo criterio consente di specificare un playbook Ansible da applicare al contenitore Crostini predefinito, se disponibile sul dispositivo e se consentito dai criteri.
+      Questa policy consente di specificare un playbook Ansible da applicare al contenitore Crostini predefinito, se disponibile sul dispositivo e se consentito dalle policy.
 
       La dimensione dei dati non può superare 1 MB (1000000 byte) e deve essere codificata in YAML. L'hash di crittografia viene utilizzato per verificare l'integrità del download.
 
       La configurazione viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash cambiano.
 
-      Se imposti il criterio, gli utenti non possono modificarlo. Se non è impostato, gli utenti possono continuare a usare il contenitore Crostini predefinito nella sua configurazione corrente, se l'uso di Crostini è consentito dai criteri.</translation>
+      Se imposti la policy, gli utenti non possono modificarla. Se non è impostata, gli utenti possono continuare a usare il contenitore Crostini predefinito nella sua configurazione corrente, se l'uso di Crostini è consentito dalle policy.</translation>
 <translation id="7132877481099023201">URL a cui verrà concesso l'accesso ai dispositivi di acquisizione video senza richieste</translation>
 <translation id="7134420220355750019">Consente di impostare il tasto destro come tasto principale del mouse.
 
-          Se questo criterio viene attivato, il tasto destro del mouse sarà sempre il tasto principale.
+          Se questa policy viene attivata, il tasto destro del mouse sarà sempre il tasto principale.
 
-          Se questo criterio viene disattivato, il tasto sinistro del mouse sarà sempre il tasto principale.
+          Se questa policy viene disattivata, il tasto sinistro del mouse sarà sempre il tasto principale.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente il tasto principale sarà il tasto sinistro del mouse, ma l'utente può cambiarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente il tasto principale sarà il tasto sinistro del mouse, ma l'utente può cambiarlo in qualsiasi momento.</translation>
 <translation id="7136237405361383549">Utilizza il renderer predefinito in base alla configurazione della prova sul campo.</translation>
 <translation id="7138762292550697459">Controlla il timeout minimo della funzione JavaScript setTimeout().</translation>
 <translation id="7138792262152376158">Segue le normali tempistiche di ritiro dell'API PrefixedVideoFullscreen</translation>
 <translation id="714219487865269980">Attiva l'evidenziazione dell'elemento attivo tramite tastiera</translation>
 <translation id="7144022711746703451">
-      Questo criterio non è più necessario poiché WebDriver è ora compatibile con tutti i criteri esistenti ed è stato pertanto rimosso da M80.
+      Questa policy non è più necessaria poiché WebDriver è ora compatibile con tutti le policy esistenti ed è stata pertanto rimossa da M80.
 
-      Questo criterio consente agli utenti della funzionalità WebDriver di sostituire i criteri che possono interferire con il relativo funzionamento.
+      Questa policy consente agli utenti della funzionalità WebDriver di sostituire le policy che possono interferire con il relativo funzionamento.
 
-      Al momento questo criterio disattiva i criteri SitePerProcess e IsolateOrigins.
+      Al momento questa policy disattiva le policy SitePerProcess e IsolateOrigins.
 
-      Se il criterio viene attivato, WebDriver potrà sostituire i criteri non compatibili.
+      Se la policy viene attivata, WebDriver potrà sostituire le policy non compatibili.
 
-      Se il criterio viene disattivato o se non viene configurato, WebDriver non potrà sostituire i criteri non compatibili.</translation>
+      Se la policy viene disattivata o se non viene configurata, WebDriver non potrà sostituire le policy non compatibili.</translation>
 <translation id="7145335384492396213">Modalità di stampa PIN predefinita</translation>
-<translation id="7146198347561863646">Se il criterio viene impostato su Attivato o se non viene configurato, sono consentiti wakelock per la gestione dell'alimentazione. Le estensioni possono richiedere wakelock tramite l'API dell'estensione di gestione dell'alimentazione e le app ARC.
+<translation id="7146198347561863646">Se la policy viene impostata su Attivata o se non viene configurata, sono consentiti wakelock per la gestione dell'alimentazione. Le estensioni possono richiedere wakelock tramite l'API dell'estensione di gestione dell'alimentazione e le app ARC.
 
-      Se il criterio viene impostato su Disattivato, le richieste di wakelock vengono ignorate.</translation>
+      Se la policy viene impostata su Disattivata, le richieste di wakelock vengono ignorate.</translation>
 <translation id="7146363485174988200">Usa firme di codice ad hoc.</translation>
 <translation id="7148958378210448356">Un elenco predeterminato di scorciatoie con il tasto Avvio app non eseguirà mai un'azione.</translation>
 <translation id="7149042336307555519"> I tipi di connessioni che è consentito utilizzare per gli aggiornamenti del sistema operativo. Gli aggiornamenti del sistema operativo potrebbero gravare sulla connessione a causa delle loro dimensioni e potrebbero comportare costi aggiuntivi. Di conseguenza, per impostazione predefinita non sono attivi per i tipi di connessione considerati costosi (attualmente solo "cellulare").
@@ -8707,22 +8707,22 @@
 <translation id="7150722575502017208">Non richiede la corrispondenza tra utente locale e proprietario dell'host di accesso remoto</translation>
 <translation id="7151366515472588710">Il client non dovrebbe interpretare questi dati e dovrebbe inoltrarli esattamente come sono. DMServer usa policy_version per verificare che la visualizzazione dei criteri di DMServer corrisponda a quella del dispositivo ChromeOS.</translation>
 <translation id="7152640356717355643">Attiva i report sull'interfaccia di rete del dispositivo</translation>
-<translation id="7153786895642570081">Questo criterio consente di controllare l'attivazione della funzionalità EphemeralNetworkPolicies.
-Se questo criterio viene impostato su true, le voci di DeviceOpenNetworkConfiguration RecommendedValuesAreEphemeral e UserCreatedNetworkConfigurationsAreEphemeral verranno rispettate.
-Se questo criterio non viene configurato o se viene impostato su false, i criteri di rete menzionati verranno rispettati soltanto se è attiva la funzionalità EphemeralNetworkPolicies.
-Questo criterio viene rimosso se la funzionalità EphemeralNetworkPolicies è attiva per impostazione predefinita.</translation>
+<translation id="7153786895642570081">Questa policy consente di controllare l'attivazione della funzionalità EphemeralNetworkPolicies.
+Se questa policy viene impostata su true, le voci di DeviceOpenNetworkConfiguration RecommendedValuesAreEphemeral e UserCreatedNetworkConfigurationsAreEphemeral verranno rispettate.
+Se questa policy non viene configurata o se viene impostata su false, le policy di rete menzionate verranno rispettate soltanto se è attiva la funzionalità EphemeralNetworkPolicies.
+Questa policy viene rimossa se la funzionalità EphemeralNetworkPolicies è attiva per impostazione predefinita.</translation>
 <translation id="7157329428182136164">Attiva il supporto per le API grafiche 3D</translation>
 <translation id="7158358621906236999">Impostazione dei sensori predefinita</translation>
 <translation id="7158731543031879810">Consenti agli utenti aziendali di utilizzare ARC su dispositivi non affiliati.</translation>
 <translation id="7161568070244869726">Viene forzata l'attivazione di AppCache</translation>
-<translation id="7165879643294314958">Se il criterio viene impostato su Attivato o se non viene configurato, l'account locale del dispositivo viene configurato per l'accesso automatico senza ritardo. <ph name="PRODUCT_OS_NAME" /> rispetta la scorciatoie da tastiera Ctrl + Alt + S per eludere l'accesso automatico e mostrare la schermata di accesso.
+<translation id="7165879643294314958">Se la policy viene impostata su Attivata o se non viene configurata, l'account locale del dispositivo viene configurato per l'accesso automatico senza ritardo. <ph name="PRODUCT_OS_NAME" /> rispetta la scorciatoie da tastiera Ctrl + Alt + S per eludere l'accesso automatico e mostrare la schermata di accesso.
 
-Se il criterio viene impostato su Disattivato, gli utenti non possono eludere l'accesso automatico senza ritardo (se configurato).</translation>
-<translation id="7165882688932913315">Questo criterio consente di gestire l'accesso alle funzionalità controllabili nell'UI di rilevamento dei dispositivi locali (<ph name="CHROME_DEVICES_LINK" />), in cui vengono mostrati i dispositivi rilevabili accanto all'utente, nonché i dispositivi cloud a cui è registrato. Su tutti i sistemi operativi tranne <ph name="PRODUCT_OS_NAME" />, l'UI di rilevamento dei dispositivi locali consente inoltre agli utenti di aggiungere a <ph name="CLOUD_PRINT_NAME" /> stampanti classiche collegate ai propri computer.
+Se la policy viene impostata su Disattivata, gli utenti non possono eludere l'accesso automatico senza ritardo (se configurato).</translation>
+<translation id="7165882688932913315">Questa policy consente di gestire l'accesso alle funzionalità controllabili nell'UI di rilevamento dei dispositivi locali (<ph name="CHROME_DEVICES_LINK" />), in cui vengono mostrati i dispositivi rilevabili accanto all'utente, nonché i dispositivi cloud a cui è registrato. Su tutti i sistemi operativi tranne <ph name="PRODUCT_OS_NAME" />, l'UI di rilevamento dei dispositivi locali consente inoltre agli utenti di aggiungere a <ph name="CLOUD_PRINT_NAME" /> stampanti classiche collegate ai propri computer.
 
-      Se il criterio viene impostato su Attivato o se non viene configurato, il rilevamento dei dispositivi locali è consentito.
+      Se la policy viene impostata su Attivata o se non viene configurata, il rilevamento dei dispositivi locali è consentito.
 
-      Se il criterio viene impostato su Disattivato, il rilevamento dei dispositivi locali non è consentito.
+      Se la policy viene impostata su Disattivata, il rilevamento dei dispositivi locali non è consentito.
       </translation>
 <translation id="7167436895080860385">Consenti agli utenti di mostrare le password in Gestione password (ritirata)</translation>
 <translation id="7172046613126456732">Consenti l'avvio di Chrome se non hai eseguito la registrazione a Chrome Browser Cloud Management</translation>
@@ -8730,30 +8730,30 @@
 <translation id="7174158612490351828">Un elenco di chiavi pubbliche dei certificati che <ph name="PRODUCT_NAME" /> dovrebbe considerare non attendibile per l'autenticazione
 del server.
 
-Il valore del criterio è un elenco di certificati X.509 codificati in base64. Nessun
+Il valore della policy è un elenco di certificati X.509 codificati in base64. Nessun
 certificato con un SPKI (SubjectPublicKeyInfo) corrispondente sarà ritenuto attendibile.</translation>
 <translation id="7174997120839381414">Attiva il provisioning dei certificati client per i browser</translation>
 <translation id="717630378807352957">Consenti tutte le stampanti del file di configurazione.</translation>
-<translation id="7177293255621000064">L'impostazione del criterio su True rende tutti i tipi di supporti di archiviazione esterni (unità flash USB, dischi rigidi esterni, schede di memoria SD e di altro tipo, memorie ottiche) non disponibili nel browser di file. L'impostazione del criterio su False o la mancata impostazione implica che gli utenti possano utilizzare spazi di archiviazione esterni sul loro dispositivo.
+<translation id="7177293255621000064">L'impostazione della policy su True rende tutti i tipi di supporti di archiviazione esterni (unità flash USB, dischi rigidi esterni, schede di memoria SD e di altro tipo, memorie ottiche) non disponibili nel browser di file. L'impostazione della policy su False o la mancata impostazione implica che gli utenti possano utilizzare spazi di archiviazione esterni sul loro dispositivo.
 
-      Nota: il criterio non interessa Google Drive e la memoria interna. Gli utenti possono comunque accedere ai file salvati nella cartella Download.</translation>
+      Nota: la policy non interessa Google Drive e la memoria interna. Gli utenti possono comunque accedere ai file salvati nella cartella Download.</translation>
 <translation id="7177645313697913767">Consenti agli utenti di attivare o disattivare l'impostazione Protezione IP di <ph name="PRIVACY_SANDBOX_NAME" /> sul proprio dispositivo se il browser e il dispositivo non sono gestiti.</translation>
 <translation id="7177857088692019405">Sblocco rapido</translation>
-<translation id="7179157174254421614">Se il criterio <ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> non disattiva il rilevamento automatico del fuso orario, questo criterio consente di definire il metodo di rilevamento automatico del fuso orario, che non può essere cambiato dagli utenti.
+<translation id="7179157174254421614">Se la policy <ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> non disattiva il rilevamento automatico del fuso orario, questa policy consente di definire il metodo di rilevamento automatico del fuso orario, che non può essere cambiato dagli utenti.
 
-Se il criterio viene impostato su:
+Se la policy viene impostata su:
  * <ph name="TIMEZONE_AUTOMATIC_DETECTION_DISABLED" />, il rilevamento automatico del fuso orario è sempre disattivato.
  * <ph name="TTIMEZON_AUTOMATIC_DETECTION_IP_ONLY" />, il rilevamento automatico del fuso orario è sempre attivato usando il metodo Solo IP.
  *<ph name="TIMEZONE_AUTOMATIC_DETECTION_SEND_WIFI_ACCESS_POINTS" />, il rilevamento automatico del fuso orario è sempre attivato tramite l'invio continuo dell'elenco dei punti di accesso Wi-Fi visibili al server dell'API Geolocation per rilevare il fuso orario con precisione.
  *<ph name="TIMEZONE_AUTOMATIC_DETECTION_SEND_ALL_LOCATION_INFO" />, il rilevamento automatico del fuso orario è sempre attivato tramite l'invio continuo di dati sulla posizione (ad esempio, punti di accesso Wi-Fi, torri cellulari raggiungibili) a un server per rilevare il fuso orario con precisione.
 
-Se il criterio non viene configurato, viene impostato su Consenti agli utenti di decidere o su Nessuno, gli utenti possono gestire il rilevamento automatico del fuso orario usando i normali controlli in <ph name="OS_SETTINGS_URL" />.
+Se la policy non viene configurata, viene impostata su Consenti agli utenti di decidere o su Nessuno, gli utenti possono gestire il rilevamento automatico del fuso orario usando i normali controlli in <ph name="OS_SETTINGS_URL" />.
 
-Nota: se utilizzi questo criterio per risolvere automaticamente il fuso orario, non dimenticare di impostare il criterio <ph name="CROS_GLS_POLICY_NAME" /> su <ph name="GLS_ALLOWED" /> o <ph name="GLS_ONLY_ALLOWED_FOR_SYSTEM" />.</translation>
-<translation id="7179187054027029272">Se il criterio è impostato su True o se non viene configurato, con le autorizzazioni adeguate, gli utenti, le app e le estensioni possono utilizzare la modalità a schermo intero (in cui vengono visualizzati solo i contenuti web).
+Nota: se utilizzi questa policy per risolvere automaticamente il fuso orario, non dimenticare di impostare la policy <ph name="CROS_GLS_POLICY_NAME" /> su <ph name="GLS_ALLOWED" /> o <ph name="GLS_ONLY_ALLOWED_FOR_SYSTEM" />.</translation>
+<translation id="7179187054027029272">Se la policy è impostata su True o se non viene configurata, con le autorizzazioni adeguate, gli utenti, le app e le estensioni possono utilizzare la modalità a schermo intero (in cui vengono visualizzati solo i contenuti web).
 
-      Se il criterio è impostato su False, gli utenti, le app e le estensioni non possono utilizzare la modalità a schermo intero.</translation>
-<translation id="718126088895133062">Questo criterio consente di specificare l'ID utente della licenza <ph name="PLUGIN_VM_NAME" /> di questo dispositivo.</translation>
+      Se la policy è impostata su False, gli utenti, le app e le estensioni non possono utilizzare la modalità a schermo intero.</translation>
+<translation id="718126088895133062">Questa policy consente di specificare l'ID utente della licenza <ph name="PLUGIN_VM_NAME" /> di questo dispositivo.</translation>
 <translation id="7184152751828902217">L'integrità della batteria può essere influenzata da fattori quali ricariche complete frequenti e ricariche prolungate. Questa policy offre tre opzioni per ottimizzare il comportamento di ricarica e attenuare questi fattori, prolungando così la durata della batteria.
 
 Se la policy viene impostata su 1 - Standard o se non viene configurata, la batteria viene caricata normalmente fino al 100%. Questa operazione disattiva le ricariche adattiva e limitata.
@@ -8768,9 +8768,9 @@
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185630966939835143">Usa un servizio web di Google per correggere gli errori ortografici</translation>
 <translation id="7187248416163189586">Disattiva i report sulle informazioni relative alla retroilluminazione del dispositivo</translation>
-<translation id="718850220532931090">Questo criterio è deprecato. Utilizza il criterio <ph name="ATTESTATION_EXTENSION_ALLOWLIST_POLICY_NAME" />.
+<translation id="718850220532931090">Questa policy è deprecata. Utilizza la policy <ph name="ATTESTATION_EXTENSION_ALLOWLIST_POLICY_NAME" />.
 
-      La configurazione del criterio consente di specificare le estensioni consentite per utilizzare la funzione <ph name="CHALLENGE_USER_KEY_FUNCTION" /> di <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> per l'attestazione da remoto. Per utilizzare l'API, le estensioni devono essere presenti in questo elenco.
+      La configurazione della policy consente di specificare le estensioni consentite per utilizzare la funzione <ph name="CHALLENGE_USER_KEY_FUNCTION" /> di <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> per l'attestazione da remoto. Per utilizzare l'API, le estensioni devono essere presenti in questo elenco.
 
       Se un'estensione non è presente nell'elenco o se l'elenco non viene configurato, la chiamata all'API non va a buon fine e viene generato un codice di errore.</translation>
 <translation id="718956142899066210">Tipi di connessioni consentiti per gli aggiornamenti</translation>
@@ -8782,13 +8782,13 @@
 Se la policy viene impostata su Disattivata, gli utenti non possono salvare le passkey nel Gestore delle password integrato, ma quelle salvate in precedenza restano attive.</translation>
 <translation id="719398790886719721">Disattiva l'accesso root alle macchine virtuali Linux</translation>
 <translation id="7194407337890404814">Nome del provider di ricerca predefinito</translation>
-<translation id="7196336906814426783">Questo criterio stabilisce una serie di intervalli settimanali per la pianificazione della sospensione automatica. Quando inizia un intervallo, il dispositivo <ph name="PRODUCT_OS_NAME" /> entra in modalità di sospensione e si riattiva al termine dell'intervallo.
+<translation id="7196336906814426783">Questa policy stabilisce una serie di intervalli settimanali per la pianificazione della sospensione automatica. Quando inizia un intervallo, il dispositivo <ph name="PRODUCT_OS_NAME" /> entra in modalità di sospensione e si riattiva al termine dell'intervallo.
 
-Le pianificazioni con intervalli che si sovrappongono non sono supportate. Questo criterio non avrà alcun effetto se contiene due intervalli che si sovrappongono.
+Le pianificazioni con intervalli che si sovrappongono non sono supportate. Questa policy non avrà alcun effetto se contiene due intervalli che si sovrappongono.
 
 I dispositivi <ph name="PRODUCT_OS_NAME" /> utilizzeranno il fuso orario del sistema per applicare questi intervalli.
 
-Nota importante: le pianificazioni impostate da questo criterio potrebbero non essere eseguite come previsto se entrano in conflitto con altre impostazioni di gestione dell'accensione, ad esempio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Assicurati che queste impostazioni siano configurate in modo da consentire l'applicazione degli intervalli di sospensione pianificati.</translation>
+Nota importante: le pianificazioni impostate da questa policy potrebbero non essere eseguite come previsto se entrano in conflitto con altre impostazioni di gestione dell'accensione, ad esempio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Assicurati che queste impostazioni siano configurate in modo da consentire l'applicazione degli intervalli di sospensione pianificati.</translation>
 <translation id="7198134478421755850">Estensione</translation>
 <translation id="7199304109870655950">Configura le opzioni di accesso remoto nell'host Chrome Remote Desktop.
 
@@ -8814,18 +8814,18 @@
       Se questa norma non viene impostata o viene lasciata vuota, l'utente potrà impostare qualsiasi Account Google come account principale del browser in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="723103540848640830">Imposta la lunghezza minima del PIN per la schermata di blocco</translation>
 <translation id="7234280155140786597">Nomi degli host di messaggi nativi vietati (o * per indicarli tutti)</translation>
-<translation id="723621412149834592">Se il criterio viene impostato su <ph name="BLOCK_WINDOW_PLACEMENT_POLICY_NAME" /> (valore 2), per impostazione predefinita viene automaticamente negata ai siti l'autorizzazione per il posizionamento delle finestre. Ciò limiterà la capacità dei siti di vedere le informazioni relative alle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
+<translation id="723621412149834592">Se la policy viene impostata su <ph name="BLOCK_WINDOW_PLACEMENT_POLICY_NAME" /> (valore 2), per impostazione predefinita viene automaticamente negata ai siti l'autorizzazione per il posizionamento delle finestre. Ciò limiterà la capacità dei siti di vedere le informazioni relative alle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
 
-      Se il criterio viene impostato su <ph name="ASK_WINDOW_PLACEMENT_POLICY_NAME" /> (valore 3), per impostazione predefinita viene mostrata all'utente la richiesta di autorizzazione per il posizionamento delle finestre. Se l'utente concede l'autorizzazione, i siti potranno vedere le informazioni relative alle schermate del dispositivo e utilizzare quelle informazioni per aprire e posizionare le finestre oppure per richiedere lo schermo interno su schermate specifiche.
+      Se la policy viene impostata su <ph name="ASK_WINDOW_PLACEMENT_POLICY_NAME" /> (valore 3), per impostazione predefinita viene mostrata all'utente la richiesta di autorizzazione per il posizionamento delle finestre. Se l'utente concede l'autorizzazione, i siti potranno vedere le informazioni relative alle schermate del dispositivo e utilizzare quelle informazioni per aprire e posizionare le finestre oppure per richiedere lo schermo interno su schermate specifiche.
 
-      Se il criterio non viene configurato, si applica il criterio <ph name="ASK_WINDOW_PLACEMENT_POLICY_NAME" />, ma gli utenti possono cambiare l'impostazione.</translation>
+      Se la policy non viene configurata, si applica la policy <ph name="ASK_WINDOW_PLACEMENT_POLICY_NAME" />, ma gli utenti possono cambiare l'impostazione.</translation>
 <translation id="7238335422094660594">Attiva il provider di <ph name="UIA_NAME" />.</translation>
 <translation id="7242191282517459095">YouTube (supportato dalla versione 135)</translation>
 <translation id="7244600351241637530">Se questa impostazione viene attivata, gli utenti che hanno già attivato Phone Hub possono visualizzare e scaricare su ChromeOS foto e video recenti acquisiti sul proprio telefono.
 
-      Se viene disattivata, gli utenti non possono usare questa funzionalità. Gli utenti non possono usare questa funzionalità anche se viene disattivato il criterio <ph name="PHONE_HUB_ALLOWED_POLICY_NAME" />.
+      Se viene disattivata, gli utenti non possono usare questa funzionalità. Gli utenti non possono usare questa funzionalità anche se viene disattivata la policy <ph name="PHONE_HUB_ALLOWED_POLICY_NAME" />.
 
-      Se questo criterio non viene configurato, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
+      Se questa policy non viene configurata, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation>
 <translation id="7246767840750730334">Consenti l'attivazione delle notifiche Phone Hub</translation>
 <translation id="7249828445670652637">Attiva i certificati CA <ph name="PRODUCT_OS_NAME" /> per le app ARC</translation>
 <translation id="7251825257294351251">Consente le notifiche di sistema</translation>
@@ -8833,13 +8833,13 @@
 
       Se imposti questa norma su true disattivi le stampanti che usano protocolli diversi da IPPS, USB o IPP-over-USB poiché il nome utente e il nome file non devono essere inviati nella rete in modo esplicito.</translation>
 <translation id="7253446510183499868">Non consentire il riavvio automatico dopo gli aggiornamenti</translation>
-<translation id="7253705688881857796">La configurazione del criterio consente di specificare se e come i criteri relativi agli utenti vengono elaborati dall'oggetto Criteri di gruppo (GPO) del computer.
+<translation id="7253705688881857796">La configurazione della policy consente di specificare se e come le policy relative agli utenti vengono elaborate dall'oggetto Policy di gruppo (GPO) del computer.
 
-* Se vengono impostati su Impostazione predefinita o se non vengono configurati, i criteri relativi agli utenti vengono letti soltanto dai GPO dell'utente. I GPO del computer vengono ignorati.
+* Se vengono impostate su Impostazione predefinita o se non vengono configurate, le policy relative agli utenti vengono lette soltanto dai GPO dell'utente. I GPO del computer vengono ignorati.
 
-* Se vengono impostati su Unisci, i criteri relativi agli utenti nei GPO degli utenti vengono uniti a quelli dei GPO del computer. I GPO del computer hanno la precedenza.
+* Se vengono impostate su Unisci, le policy relative agli utenti nei GPO degli utenti vengono unite a quelli dei GPO del computer. I GPO del computer hanno la precedenza.
 
-* Se vengono impostati su Sostituisci, i criteri relativi agli utenti nei GPO degli utenti vengono sostituiti da quelli dei GPO del computer. I GPO degli utenti vengono ignorati.</translation>
+* Se vengono impostate su Sostituisci, le policy relative agli utenti nei GPO degli utenti vengono sostituite da quelli dei GPO del computer. I GPO degli utenti vengono ignorati.</translation>
 <translation id="7258823566580374486">Attiva separazione degli host di accesso remoto</translation>
 <translation id="7260204423892780600">Consente di gestire le impostazioni dell'Assistente Google.</translation>
 <translation id="7261140115553020049">Abilita il servizio Area di lavoro mobile</translation>
@@ -8865,18 +8865,18 @@
 <translation id="7272043145652398361">Disabilita le API video a schermo intero con prefisso</translation>
 <translation id="7272892848025145170">Consente di stabilire se attivare o meno la funzionalità Kerberos. Kerberos è un protocollo di autenticazione che può essere utilizzato per eseguire l'autenticazione per app web e condivisioni di file.
 
-Se questo criterio viene attivato, la funzionalità Kerberos viene attivata. Gli account Kerberos possono essere aggiunti tramite il criterio "Configura account Kerberos" o tramite le impostazioni relative agli account Kerberos nella pagina di impostazioni Kerberos.
+Se questa policy viene attivata, la funzionalità Kerberos viene attivata. Gli account Kerberos possono essere aggiunti tramite la policy "Configura account Kerberos" o tramite le impostazioni relative agli account Kerberos nella pagina di impostazioni Kerberos.
 
-Se questo criterio viene disattivato o se non viene configurato, le impostazioni relative agli account Kerberos vengono disattivate. Nessun account Kerberos può essere aggiunto e l'autenticazione Kerberos non può essere utilizzata. Vengono eliminati tutti gli account Kerberos esistenti e tutte le password memorizzate.</translation>
+Se questa policy viene disattivata o se non viene configurata, le impostazioni relative agli account Kerberos vengono disattivate. Nessun account Kerberos può essere aggiunto e l'autenticazione Kerberos non può essere utilizzata. Vengono eliminati tutti gli account Kerberos esistenti e tutte le password memorizzate.</translation>
 <translation id="7273785848231509306">Non mostrare mai nomi e foto degli utenti</translation>
 <translation id="7274077256421167535">Attiva la condivisione dell'alimentazione USB</translation>
 <translation id="7275334191706090484">Preferiti gestiti</translation>
 <translation id="7275689301063927473">Nega l'autorizzazione per i caratteri locali su tutti i siti per impostazione predefinita</translation>
-<translation id="7275878175078795558">Se il criterio è impostato su true, <ph name="PRODUCT_NAME" /> esegue sempre il controllo delle revoche per i certificati dei server che vengono convalidati correttamente e firmati tramite certificati CA installati localmente. Se <ph name="PRODUCT_NAME" /> non riesce a recuperare informazioni sullo stato della revoca, questi certificati vengono considerati revocati da <ph name="PRODUCT_NAME" /> (hard-fail).
+<translation id="7275878175078795558">Se la policy è impostata su true, <ph name="PRODUCT_NAME" /> esegue sempre il controllo delle revoche per i certificati dei server che vengono convalidati correttamente e firmati tramite certificati CA installati localmente. Se <ph name="PRODUCT_NAME" /> non riesce a recuperare informazioni sullo stato della revoca, questi certificati vengono considerati revocati da <ph name="PRODUCT_NAME" /> (hard-fail).
 
-      Se il criterio è impostato su false o se non viene impostato, <ph name="PRODUCT_NAME" /> utilizza le impostazioni di controllo delle revoche online esistenti.
+      Se la policy è impostata su false o se non viene impostata, <ph name="PRODUCT_NAME" /> utilizza le impostazioni di controllo delle revoche online esistenti.
 
-      Questo criterio non ha effetto su <ph name="MAC_OS_NAME" /> se il criterio <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> viene impostato su false.</translation>
+      Questa policy non ha effetto su <ph name="MAC_OS_NAME" /> se la policy <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> viene impostata su false.</translation>
 <translation id="7278854311116092134">Nomi degli host di messaggi nativi da escludere dalla lista bloccata</translation>
 <translation id="7291084543582732020">Se attivi questa impostazione, gli utenti potranno utilizzare la funzione Smart Lock se ne vengono soddisfatti i requisiti.
 
@@ -8891,15 +8891,15 @@
 <translation id="7302500623317853506">Consenti aggiornamenti automatici estesi</translation>
 <translation id="7303655680460311843">Attiva la tastiera virtuale touch nella schermata di accesso</translation>
 <translation id="7303902834678570827">Gli utenti di sessioni Ospite gestite non possono memorizzare le impostazioni di visualizzazione a livello di dispositivo.</translation>
-<translation id="7306926210354955892">La configurazione del criterio consente di specificare l'azione da eseguire quando la directory dei dati ARC dell'utente è stata creata con virtio-fs. A meno che non venga eseguita la migrazione dei dati virtio-fs su virtio-blk, le app per Android potrebbero essere eseguite più lentamente su ARC VM.
+<translation id="7306926210354955892">La configurazione della policy consente di specificare l'azione da eseguire quando la directory dei dati ARC dell'utente è stata creata con virtio-fs. A meno che non venga eseguita la migrazione dei dati virtio-fs su virtio-blk, le app per Android potrebbero essere eseguite più lentamente su ARC VM.
 
-      Se il criterio viene impostato su:
+      Se la policy viene impostata su:
 
-      * <ph name="DO_NOT_PROMPT" />, all'utente non verrà chiesto di seguire il flusso di migrazione. Questo è il valore predefinito se il criterio non viene configurato.
+      * <ph name="DO_NOT_PROMPT" />, all'utente non verrà chiesto di seguire il flusso di migrazione. Questo è il valore predefinito se la policy non viene configurata.
 
       * <ph name="PROMPT" /> (o un valore non supportato) indica che, al momento dell'accesso, all'utente viene chiesto di eseguire il flusso di migrazione dei dati. L'operazione potrebbe richiedere fino a 10 minuti.
 
-      Questo criterio si applica solo ai dispositivi ARM che eseguono la migrazione ad ARC VM.</translation>
+      Questa policy si applica solo ai dispositivi ARM che eseguono la migrazione ad ARC VM.</translation>
 <translation id="731208205557053914">Segnala informazioni sui VPD</translation>
 <translation id="7313672174502374994">L'hash SHA-256 dell'immagine di sfondo.</translation>
 <translation id="7317472245305274219">Specifica se la creazione della passkey verrà utilizzata per impostazione predefinita sul portachiavi iCloud.</translation>
@@ -8909,21 +8909,21 @@
 
           Questa funzione consente agli utenti di regolare le impostazioni di correzione del colore sui loro dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti, il che potrebbe semplificare la percezione dei colori sullo schermo da parte degli utenti affetti da discromatopsia.
 
-          Se questo criterio viene attivato, la correzione del colore sarà sempre attiva. Gli utenti dovranno accedere alle Impostazioni per scegliere le opzioni specifiche di correzione del colore (ad esempio il filtro Deuteranomalia/Protanomalia/Tritanomalia/Scala di grigi e la relativa intensità). Le impostazioni di correzione del colore vengono mostrate all'utente al primo utilizzo.
+          Se questa policy viene attivata, la correzione del colore sarà sempre attiva. Gli utenti dovranno accedere alle Impostazioni per scegliere le opzioni specifiche di correzione del colore (ad esempio il filtro Deuteranomalia/Protanomalia/Tritanomalia/Scala di grigi e la relativa intensità). Le impostazioni di correzione del colore vengono mostrate all'utente al primo utilizzo.
 
-          Se questo criterio viene disattivato, la correzione del colore sarà sempre disattivata.
+          Se questa policy viene disattivata, la correzione del colore sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o eseguirne l'override.
+          Se imposti questa policy, gli utenti non potranno modificarla o eseguirne l'override.
 
-          Se questo criterio non viene configurato, la funzione di correzione del colore è inizialmente disattivata, ma può essere attivata dall'utente in qualsiasi momento.</translation>
+          Se questa policy non viene configurata, la funzione di correzione del colore è inizialmente disattivata, ma può essere attivata dall'utente in qualsiasi momento.</translation>
 <translation id="7323780795955997799">Mostra la scheda File di SharePoint e OneDrive nella pagina Nuova scheda (beta)</translation>
 <translation id="7323855063560306712">Consente di impostare un elenco di pattern URL per i siti che specifica i siti a cui l'autorizzazione per la gestione delle finestre viene automaticamente negata. Ciò limiterà la capacità dei siti di vedere le informazioni sulle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
 
-Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
+Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
 
-Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_WINDOW_MANAGEMENT_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.
+Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_WINDOW_MANAGEMENT_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.
 
-Questo sostituisce il criterio <ph name="WINDOW_PLACEMENT_BLOCKED_FOR_URLS_POLICY_NAME" /> obsoleto.</translation>
+Sostituisce la policy <ph name="WINDOW_PLACEMENT_BLOCKED_FOR_URLS_POLICY_NAME" /> obsoleta.</translation>
 <translation id="7323896582714668701">Parametri aggiuntivi della riga di comando per <ph name="PRODUCT_NAME" /></translation>
 <translation id="7325801934761922681">Chrome non può bloccare le navigazioni ai protocolli esterni all'interno di iframe con sandbox</translation>
 <translation id="7326394567531622570">Simile a Wipe (valore 2), ma prova a mantenere i token di accesso per evitare all'utente di dover accedere di nuovo.</translation>
@@ -8943,7 +8943,7 @@
 <translation id="7334639219471717734">Non consentire agli utenti di accedere al proprio dispositivo con Smart Lock</translation>
 <translation id="7336785017449297672">Consente di gestire le impostazioni relative all'orologio e al fuso orario.</translation>
 <translation id="7336878834592315572">Conserva cookie per tutta la durata della sessione</translation>
-<translation id="7338217396351647423">Se il criterio è configurato, viene specificato un insieme di criteri da trasferire al runtime ARC. Gli amministratori possono utilizzarlo per selezionare le app Android che vengono installate automaticamente. Inserisci il valore in formato JSON valido.
+<translation id="7338217396351647423">Se la policy è configurata, viene specificato un insieme di policy da trasferire al runtime ARC. Gli amministratori possono utilizzarlo per selezionare le app Android che vengono installate automaticamente. Inserisci il valore in formato JSON valido.
 
       Per bloccare le app in Avvio app, vedi PinnedLauncherApps.</translation>
 <translation id="7339315111520512972">Forza l'esecuzione del codice di networking nel processo di browser</translation>
@@ -8955,53 +8955,53 @@
 <translation id="7357148531287978404">Disattiva l'input audio</translation>
 <translation id="7358012133037776875">Consente di impostare un elenco di pattern URL che specifica i siti a cui l'autorizzazione per il posizionamento delle finestre viene automaticamente concessa. Ciò estenderà la capacità dei siti di vedere le informazioni relative alle schermate del dispositivo e di utilizzare quelle informazioni per aprire e posizionare finestre oppure per richiedere lo schermo intero su schermate specifiche.
 
-      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
+      Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.
 
-      Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_WINDOW_PLACEMENT_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
+      Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_WINDOW_PLACEMENT_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
 <translation id="7358359585412734876">Attiva <ph name="LACROS_NAME" /></translation>
 <translation id="7362566456990049303">Solo utente</translation>
 <translation id="736486789939370545">Consenti l'installazione di estensioni esterne</translation>
-<translation id="7364975417585163622">Questo criterio consente di disattivare temporaneamente le modifiche al modo in cui Chrome gestisce gli spazi vuoti negli URL <ph name="DATA_URL_SCHEME" />.
+<translation id="7364975417585163622">Questa policy consente di disattivare temporaneamente le modifiche al modo in cui Chrome gestisce gli spazi vuoti negli URL <ph name="DATA_URL_SCHEME" />.
 In precedenza, gli spazi vuoti venivano mantenuti solo se il tipo di media di livello superiore era <ph name="TEXT_MEDIA_TYPE" /> o conteneva la stringa del tipo di media <ph name="XML" />.
 Ora gli spazi vuoti verranno mantenuti in tutti gli URL dei dati, indipendentemente dal tipo di media.
 
-Se questo criterio non viene configurato o se viene impostato su True, viene attivato il nuovo comportamento.
+Se questa policy non viene configurata o se viene impostata su True, viene attivato il nuovo comportamento.
 
-Se questo criterio viene impostato su False, viene attivato il comportamento precedente.</translation>
+Se questa policy viene impostata su False, viene attivato il comportamento precedente.</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="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>
-<translation id="7375785904116479354">Se il criterio viene impostato su Attivato, il motore di ricerca predefinito del precedente browser predefinito verrà importato alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, il motore di ricerca predefinito non verrà importato alla prima esecuzione.
+<translation id="7375785904116479354">Se la policy viene impostata su Attivata, il motore di ricerca predefinito del precedente browser predefinito verrà importato alla prima esecuzione. Se la policy viene impostata su Disattivata o se non viene configurata, il motore di ricerca predefinito non verrà importato alla prima esecuzione.
 
-      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo del motore di ricerca predefinito verrà selezionata o deselezionata in modo che corrisponda al valore del criterio.</translation>
-<translation id="7383581189726479261">Questo criterio è stato ritirato nella versione M96. Usa i criteri <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> e <ph name="REPORT_DEVICE_NETWORK_STATUS" />.
+      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo del motore di ricerca predefinito verrà selezionata o deselezionata in modo che corrisponda al valore della policy.</translation>
+<translation id="7383581189726479261">Questa policy è stata ritirata nella versione M96. Usa le policy <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> e <ph name="REPORT_DEVICE_NETWORK_STATUS" />.
 
-      Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano l'elenco di interfacce di rete con i relativi tipi e indirizzi hardware.
+      Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano l'elenco di interfacce di rete con i relativi tipi e indirizzi hardware.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano l'interfaccia di rete.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano l'interfaccia di rete.</translation>
 <translation id="7389872682701720082">Se attivi questa impostazione, i plug-in non obsoleti verranno sempre eseguiti.
 
       Se questa impostazione è disattivata o non è configurata, agli utenti verrà chiesta l'autorizzazione di eseguire i plug-in per i quali è necessaria. Questi sono plug-in che possono compromettere la sicurezza.</translation>
-<translation id="7390361032458549775">Consente di impostare un elenco di pattern URL che specificano i siti non autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenAllowedForUrls", il criterio ha la precedenza su queste eccezioni.
+<translation id="7390361032458549775">Consente di impostare un elenco di pattern URL che specificano i siti non autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenAllowedForUrls", la policy ha la precedenza su queste eccezioni.
 
-          Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultKeygenSetting" (se impostato) o della configurazione personale dell'utente (se non impostato).
+          Se questa policy non viene impostata, per tutti i siti viene usato il valore predefinito globale della policy "DefaultKeygenSetting" (se impostata) o della configurazione personale dell'utente (se non impostata).
 
-          Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
-<translation id="7394023172636522064">Se il criterio viene impostato su Attivato, viene segnalato lo stato di sicurezza TPM dei dispositivi.
+          Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
+<translation id="7394023172636522064">Se la policy viene impostata su Attivata, viene segnalato lo stato di sicurezza TPM dei dispositivi.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i dispositivi registrati non registrano o non segnalano lo stato di sicurezza TPM.
-      Eccezione: le informazioni relative a TPM vengono controllate tramite il criterio <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, i dispositivi registrati non registrano o non segnalano lo stato di sicurezza TPM.
+      Eccezione: le informazioni relative a TPM vengono controllate tramite la policy <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
 <translation id="739556497251174388">Consenti il riutilizzo delle credenziali di accesso di <ph name="PRODUCT_OS_NAME" /> per l'autenticazione della rete</translation>
 <translation id="7395790871181951311">Blocca la connessione della smart card da parte delle app isolate</translation>
 <translation id="7400208209734208176">Apri i link nel browser Chrome per impostazione predefinita</translation>
 <translation id="7402257017733669351">Impedisci al processo del browser di creare codice dinamico</translation>
 <translation id="7406039009275722824">Se disattivi <ph name="CHROME_SYNC_NAME" />, il servizio di backup e ripristino di Android non funzionerà correttamente.</translation>
 <translation id="7406276857470642718">Consente di gestire le impostazioni degli utenti autenticati tramite SAML con un IdP esterno</translation>
-<translation id="7407441173422042771">Questo criterio consente di controllare la previsione di rete in <ph name="PRODUCT_NAME" />, il precaricamento DNS, le preconnessioni TCP e SSL e il prerendering delle pagine web.
+<translation id="7407441173422042771">Questa policy consente di controllare la previsione di rete in <ph name="PRODUCT_NAME" />, il precaricamento DNS, le preconnessioni TCP e SSL e il prerendering delle pagine web.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo. Se non viene configurato, la previsione di rete viene attivata, ma gli utenti possono modificarlo.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla. Se non viene configurata, la previsione di rete viene attivata, ma gli utenti possono modificarla.</translation>
 <translation id="7408815947231046196">Consenti il backup dei dati di <ph name="PRODUCT_NAME" /></translation>
 <translation id="740885188496462583">Attiva la modalità Risparmio energetico</translation>
 <translation id="7410074797376205571">Consenti a <ph name="CHROME_REMOTE_DESKTOP_PRODUCT_NAME" /> di eseguire richieste API WebAuthn trasferite al proxy da un host remoto.</translation>
@@ -9021,33 +9021,33 @@
 <translation id="7433714841194914373">Abilita Instant</translation>
 <translation id="7434202861148928348">Configura i nomi di dominio richiesti per i client di accesso remoto</translation>
 <translation id="7436939516497076240">Disattiva la visualizzazione delle pagine di risultati del motore di ricerca predefinito in un riquadro laterale del browser.</translation>
-<translation id="7438379915013106443">Questo criterio consente agli amministratori di configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /> su <ph name="PRODUCT_OS_NAME" />.
+<translation id="7438379915013106443">Questa policy consente agli amministratori di configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /> su <ph name="PRODUCT_OS_NAME" />.
 
-Se il criterio viene impostato su "<ph name="ALLOWED_NAME" />", se vuole l'utente può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" />.
+Se la policy viene impostata su "<ph name="ALLOWED_NAME" />", se vuole l'utente può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" />.
 Dopo aver completato la procedura di configurazione, i file con formati file corrispondenti verranno spostati per impostazione predefinita su <ph name="GOOGLE_DRIVE_NAME" /> e gestiti da una delle app <ph name="GOOGLE_WORKSPACE_NAME" /> quando l'utente tenterà di aprirli.
 
-Se il criterio viene impostato su "<ph name="DISALLOWED_NAME" />", l'utente non può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> come descritto in precedenza e le app <ph name="GOOGLE_WORKSPACE_NAME" /> vengono rimosse dall'elenco dei potenziali gestori di file.
+Se la policy viene impostata su "<ph name="DISALLOWED_NAME" />", l'utente non può configurare il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> come descritto in precedenza e le app <ph name="GOOGLE_WORKSPACE_NAME" /> vengono rimosse dall'elenco dei potenziali gestori di file.
 
-Se il criterio viene impostato su "<ph name="AUTOMATED_NAME" />", il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /> viene configurato automaticamente, quindi i file con formati file corrispondenti verranno spostati per impostazione predefinita su <ph name="GOOGLE_DRIVE_NAME" /> e gestiti da una delle app <ph name="GOOGLE_WORKSPACE_NAME" /> quando l'utente tenterà di aprirli.
+Se la policy viene impostata su "<ph name="AUTOMATED_NAME" />", il flusso <ph name="CLOUD_UPLOAD_NAME" /> per <ph name="GOOGLE_DRIVE_NAME" /> e <ph name="GOOGLE_WORKSPACE_NAME" /> viene configurato automaticamente, quindi i file con formati file corrispondenti verranno spostati per impostazione predefinita su <ph name="GOOGLE_DRIVE_NAME" /> e gestiti da una delle app <ph name="GOOGLE_WORKSPACE_NAME" /> quando l'utente tenterà di aprirli.
 
-Se il criterio non viene configurato, in pratica equivale a impostarlo su "<ph name="ALLOWED_NAME" />" per gli utenti normali e su "<ph name="DISALLOWED_NAME" />" per gli utenti aziendali.</translation>
+Se la policy non viene configurata, in pratica equivale a impostarla su "<ph name="ALLOWED_NAME" />" per gli utenti normali e su "<ph name="DISALLOWED_NAME" />" per gli utenti aziendali.</translation>
 <translation id="7438982301540282785">Automatizza la configurazione di <ph name="MICROSOFT_ONE_DRIVE_NAME" /></translation>
-<translation id="7443356543619955157">La configurazione del criterio consente di forzare l'applicazione della configurazione di rete per tutti gli utenti di un dispositivo <ph name="PRODUCT_OS_NAME" />. La configurazione di rete è una stringa in formato JSON come definita nel formato Open Network Configuration.</translation>
+<translation id="7443356543619955157">La configurazione della policy consente di forzare l'applicazione della configurazione di rete per tutti gli utenti di un dispositivo <ph name="PRODUCT_OS_NAME" />. La configurazione di rete è una stringa in formato JSON come definita nel formato Open Network Configuration.</translation>
 <translation id="7446978687387327623">Consenti i controlli in tempo reale inviati tramite proxy di Navigazione sicura</translation>
 <translation id="7448430478749155471">Attiva Seleziona per ascoltare nella schermata di accesso</translation>
-<translation id="7453470801190369311">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono mostrare immagini.
+<translation id="7453470801190369311">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che non possono mostrare immagini.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_IMAGE_SETTING_ENABLED_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_IMAGE_SETTING_ENABLED_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
        Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-       Tieni presente che in precedenza questo criterio è stato erroneamente abilitato su Android, ma questa funzionalità non è mai stata completamente supportata su Android.</translation>
-<translation id="7455912144588577399">Se il criterio viene impostato su true, gli utenti possono fare in modo che le pagine web idonee vengano lette utilizzando la sintesi vocale. Ciò si ottiene mediante la distillazione dei contenuti lato server e la sintesi audio. Se viene impostato su false, la funzionalità viene disattivata. Se questo criterio viene impostato sul valore predefinito o se non viene configurato, Leggi ad alta voce è attiva.</translation>
-<translation id="7456922722153109956">Questo criterio consente di stabilire la visibilità della comunicazione dell'area centrale nella pagina Nuova scheda.
+       Tieni presente che in precedenza questa policy è stata erroneamente abilitata su Android, ma questa funzionalità non è mai stata completamente supportata su Android.</translation>
+<translation id="7455912144588577399">Se la policy viene impostata su true, gli utenti possono fare in modo che le pagine web idonee vengano lette utilizzando la sintesi vocale. Ciò si ottiene mediante la distillazione dei contenuti lato server e la sintesi audio. Se viene impostata su false, la funzionalità viene disattivata. Se questa policy viene impostata sul valore predefinito o se non viene configurata, Leggi ad alta voce è attiva.</translation>
+<translation id="7456922722153109956">Questa policy consente di stabilire la visibilità della comunicazione dell'area centrale nella pagina Nuova scheda.
 
-      Se viene impostato su Attivato, nella pagina Nuova scheda verrà mostrata la comunicazione dell'area centrale, se è disponibile.
+      Se viene impostata su Attivata, nella pagina Nuova scheda verrà mostrata la comunicazione dell'area centrale, se è disponibile.
 
-      Se viene impostato su Disattivato, nella pagina Nuova scheda non verrà mostrata la comunicazione dell'area centrale, anche se è disponibile.
+      Se viene impostata su Disattivata, nella pagina Nuova scheda non verrà mostrata la comunicazione dell'area centrale, anche se è disponibile.
       </translation>
 <translation id="7459601923199346224">Consente di controllare i criteri relativi agli utenti e ai dispositivi per la gestione dei certificati.</translation>
 <translation id="7459633275230216698">Consenti finestre di dialogo per la selezione di file</translation>
@@ -9063,9 +9063,9 @@
 Visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns per informazioni dettagliate sui pattern validi. Tieni presente che i pattern elencati qui vengono considerati come origini, non URL, quindi non dovresti specificare un percorso.
 
 Visita la pagina https://developers.google.com/privacy-sandbox/cookies/storage-partitioning per informazioni dettagliate sul partizionamento dello spazio di archiviazione di terze parti.</translation>
-<translation id="7468182772656807573">Questo criterio consente di stabilire la frequenza di invio, in millisecondi, dei pacchetti di rete di monitoraggio. Gli intervalli sono compresi tra 30 secondi e 24 ore. I valori che non rientrano in questo intervallo verranno fatti rientrare nei limiti.
+<translation id="7468182772656807573">Questa policy consente di stabilire la frequenza di invio, in millisecondi, dei pacchetti di rete di monitoraggio. Gli intervalli sono compresi tra 30 secondi e 24 ore. I valori che non rientrano in questo intervallo verranno fatti rientrare nei limiti.
 
-      Se il criterio non viene configurato, viene applicato l'intervallo predefinito di 3 minuti.</translation>
+      Se la policy non viene configurata, viene applicato l'intervallo predefinito di 3 minuti.</translation>
 <translation id="7469554574977894907">Attiva suggerimenti di ricerca</translation>
 <translation id="7471938371309017725">Configura la videocamera, le impostazioni del browser, le impostazioni del sistema operativo, nonché le funzionalità di scansione, Web Store, canvas, Esplora, Crosh, Galleria, Terminal e Registratore da disattivare</translation>
 <translation id="7472547030234093862">Specifica i domini da risolvere tramite DNS over HTTPS</translation>
@@ -9073,11 +9073,11 @@
 <translation id="7476030153540156377">Scegli se attivare o meno la funzionalità di protezione IP di <ph name="PRIVACY_SANDBOX_NAME" />.</translation>
 <translation id="7476158778585368567">Consente di segnalare i processi di stampa di un dispositivo.
 
-      Se il criterio viene impostato su falso o se non viene configurato, le informazioni non vengono segnalate.
-      Se il criterio viene impostato su vero, i processi di stampa del dispositivo vengono segnalati.</translation>
-<translation id="7476447711788742702">La configurazione del criterio consente di specificare l'azione compiuta in <ph name="PRODUCT_OS_NAME" /> quando l'utente chiude lo schermo del dispositivo.
+      Se la policy viene impostata su false o se non viene configurata, le informazioni non vengono segnalate.
+      Se la policy viene impostata su true, i processi di stampa del dispositivo vengono segnalati.</translation>
+<translation id="7476447711788742702">La configurazione della policy consente di specificare l'azione compiuta in <ph name="PRODUCT_OS_NAME" /> quando l'utente chiude lo schermo del dispositivo.
 
-      Se il criterio non viene configurato, viene compiuta l'azione di sospensione.
+      Se la policy non viene configurata, viene compiuta l'azione di sospensione.
 
       Nota: se l'azione è la sospensione, è possibile configurare separatamente <ph name="PRODUCT_OS_NAME" /> in modo che blocchi o meno lo schermo prima della sospensione.</translation>
 <translation id="7477149584454865826">Un flag booleano che indica se deve essere usato o meno IPP Everywhere per configurare la stampante.</translation>
@@ -9092,43 +9092,43 @@
 <translation id="7489169777107143496">Disattiva le analisi approfondite dei download di Navigazione sicura</translation>
 <translation id="7489661071474025727">Specifica se il servizio di recupero dell'account è attivato per i tuoi utenti su dispositivi <ph name="PRODUCT_OS_NAME" />.
 
-      Se il criterio viene attivato, il recupero dei dati utente è attivato. Se il criterio è disattivato o se non viene configurato, il recupero dei dati utente non viene attivato.
-      Se il livello di criterio viene impostato su consigliato, gli utenti possono modificare l'attivazione del recupero dell'account tramite la pagina Impostazioni. Se il livello di criterio viene impostato su obbligatorio, gli utenti non possono modificare l'attivazione del recupero dell'account.
+      Se la policy viene attivata, il recupero dei dati utente è attivato. Se la policy è disattivata o se non viene configurata, il recupero dei dati utente non viene attivato.
+      Se il livello di policy viene impostato su consigliato, gli utenti possono modificare l'attivazione del recupero dell'account tramite la pagina Impostazioni. Se il livello di policy viene impostato su obbligatorio, gli utenti non possono modificare l'attivazione del recupero dell'account.
 
-      Per la modifica del valore del criterio, il processo di aggiornamento viene completato all'accesso successivo al dispositivo <ph name="PRODUCT_OS_NAME" />, dopo il recupero del nuovo valore del criterio.
+      Per la modifica del valore della policy, il processo di aggiornamento viene completato all'accesso successivo al dispositivo <ph name="PRODUCT_OS_NAME" />, dopo il recupero del nuovo valore della policy.
 
       Nota: questa impostazione si applica solo ai nuovi account che vengono aggiunti sui dispositivi <ph name="PRODUCT_OS_NAME" />.
       </translation>
 <translation id="7491720878670299691">La velocità di interrogazione e controllo della rete per eventi. Il valore minimo consentito è 1 minuto.
 
-      Se il criterio non viene impostato, viene applicata la velocità predefinita di 1 minuto.</translation>
+      Se la policy non viene impostata, viene applicata la velocità predefinita di 1 minuto.</translation>
 <translation id="7498595166686106721">
-      Il criterio relativo alle autorizzazioni display-capture consente di dare o meno l'accesso a getDisplayMedia(), in base a questa specifica: https://www.w3.org/TR/screen-capture/#feature-policy-integration. Se questo criterio viene impostato su Disattivato, questo requisito non viene applicato e l'accesso a getDisplayMedia() è consentito da contesti che altrimenti sarebbero vietati. Questo criterio aziendale è temporaneo ed è destinato a essere rimosso dopo la versione 100 di <ph name="PRODUCT_NAME" />. Ha lo scopo di sbloccare gli utenti aziendali la cui applicazione non è conforme alla specifica, ma che richiede tempo per essere sistemata.
+      La policy relativa alle autorizzazioni display-capture consente di dare o meno l'accesso a getDisplayMedia(), in base a questa specifica: https://www.w3.org/TR/screen-capture/#feature-policy-integration. Se questa policy viene impostata su Disattivata, questo requisito non viene applicato e l'accesso a getDisplayMedia() è consentito da contesti che altrimenti sarebbero vietati. Questa policy aziendale è temporanea ed è destinata a essere rimossa dopo la versione 100 di <ph name="PRODUCT_NAME" />. Ha lo scopo di sbloccare gli utenti aziendali la cui applicazione non è conforme alla specifica, ma che richiede tempo per essere sistemata.
 
-      Se il criterio viene attivato o se non viene configurato, i siti possono chiamare getDisplayMedia() solo da contesti che sono stati aggiunti alla lista consentita in base al criterio relativo alle autorizzazioni display-capture.
+      Se la policy viene attivata o se non viene configurata, i siti possono chiamare getDisplayMedia() solo da contesti che sono stati aggiunti alla lista consentita in base alla policy relativa alle autorizzazioni display-capture.
 
-      Se il criterio viene disattivato, i siti possono chiamare getDisplayMedia() anche da contesti che non sono stati aggiunti alla lista consentita in base al criterio relativo alle autorizzazioni display-capture. Tieni presente che potrebbero essere applicate altre limitazioni.</translation>
-<translation id="7506745375479451616">Questo criterio consente di stabilire il comando da usare per aprire gli URL in <ph name="PRODUCT_NAME" /> anziché in <ph name="IE_PRODUCT_NAME" />. Per questo criterio è possibile impostare un percorso file eseguibile o un valore <ph name="PRODUCT_NAME_PLACEHOLDER" /> per rilevare automaticamente la posizione di <ph name="PRODUCT_NAME" />.
+      Se la policy viene disattivata, i siti possono chiamare getDisplayMedia() anche da contesti che non sono stati aggiunti alla lista consentita in base alla policy relativa alle autorizzazioni display-capture. Tieni presente che potrebbero essere applicate altre limitazioni.</translation>
+<translation id="7506745375479451616">Questa policy consente di stabilire il comando da usare per aprire gli URL in <ph name="PRODUCT_NAME" /> anziché in <ph name="IE_PRODUCT_NAME" />. Per questa policy è possibile impostare un percorso file eseguibile o un valore <ph name="PRODUCT_NAME_PLACEHOLDER" /> per rilevare automaticamente la posizione di <ph name="PRODUCT_NAME" />.
 
-      Se il criterio non viene impostato, <ph name="IE_PRODUCT_NAME" /> rileva automaticamente il percorso eseguibile di <ph name="PRODUCT_NAME" /> all'avvio di <ph name="PRODUCT_NAME" /> da Internet Explorer.
+      Se la policy non viene impostata, <ph name="IE_PRODUCT_NAME" /> rileva automaticamente il percorso eseguibile di <ph name="PRODUCT_NAME" /> all'avvio di <ph name="PRODUCT_NAME" /> da Internet Explorer.
 
-      Nota: se il componente aggiuntivo Supporto dei browser precedenti per <ph name="IE_PRODUCT_NAME" /> non è installato, questo criterio non ha effetto.</translation>
+      Nota: se il componente aggiuntivo Supporto dei browser precedenti per <ph name="IE_PRODUCT_NAME" /> non è installato, questa policy non ha effetto.</translation>
 <translation id="7507553960917214561">Disattiva la separazione degli host di accesso remoto</translation>
 <translation id="7508067364927180229">Questa impostazione offre diverse opzioni relative alla disponibilità del browser <ph name="LACROS_NAME" />.
 
-      Se il criterio viene impostato su <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />, l'utente può attivare <ph name="LACROS_NAME" /> e impostarlo come browser principale.
+      Se la policy viene impostata su <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />, l'utente può attivare <ph name="LACROS_NAME" /> e impostarlo come browser principale.
 
-      Se il criterio viene impostato su <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />, l'utente non potrà usare <ph name="LACROS_NAME" />.
+      Se la policy viene impostata su <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />, l'utente non potrà usare <ph name="LACROS_NAME" />.
 
-      Se il criterio viene impostato su <ph name="LACROS_AVAILABILITY_SIDE_BY_SIDE_VALUE" />, <ph name="LACROS_NAME" /> viene attivato, ma non è il browser principale.
+      Se la policy viene impostata su <ph name="LACROS_AVAILABILITY_SIDE_BY_SIDE_VALUE" />, <ph name="LACROS_NAME" /> viene attivato, ma non è il browser principale.
 
-      Se il criterio viene impostato su <ph name="LACROS_AVAILABILITY_LACROS_PRIMARY_VALUE" />, <ph name="LACROS_NAME" /> viene attivato ed è il browser principale.
+      Se la policy viene impostata su <ph name="LACROS_AVAILABILITY_LACROS_PRIMARY_VALUE" />, <ph name="LACROS_NAME" /> viene attivato ed è il browser principale.
 
-      Se il criterio non viene configurato, il valore predefinito è <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> per gli utenti gestiti a livello aziendale e <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> per gli utenti non gestiti.
+      Se la policy non viene configurata, il valore predefinito è <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> per gli utenti gestiti a livello aziendale e <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> per gli utenti non gestiti.
 
       In futuro sarà possibile impostare <ph name="LACROS_NAME" /> come unico browser disponibile in <ph name="PRODUCT_OS_NAME" /> impostando il valore <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation>
 <translation id="751071954873065775">Seleziona i contenuti scaricabili (DLC) che devono essere prescaricati</translation>
-<translation id="7512065400265675158">L'intestazione della richiesta <ph name="USER_AGENT_HEADER_NAME" /> è stata programmata per essere ridotta. Per semplificare il test e la compatibilità, questo criterio può attivare la funzionalità di riduzione per tutti i siti web o disattivare la possibilità per le prove dell'origine o le prove sul campo di abilitare la funzionalità.
+<translation id="7512065400265675158">L'intestazione della richiesta <ph name="USER_AGENT_HEADER_NAME" /> è stata programmata per essere ridotta. Per semplificare il test e la compatibilità, questa policy può attivare la funzionalità di riduzione per tutti i siti web o disattivare la possibilità per le prove dell'origine o le prove sul campo di abilitare la funzionalità.
 
       Per scoprire di più sulla funzionalità <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> e la relativa cronologia, leggi qui:
 
@@ -9136,10 +9136,10 @@
       </translation>
 <translation id="7512514325152952954">I payload di aggiornamento automatico su <ph name="PRODUCT_OS_NAME" /> posso essere scaricati tramite HTTP anziché tramite HTTPS. Questo permette memorizzazione nella cache HTTP trasparente dei download HTTP.
 
-Se questo criterio viene impostato su true, <ph name="PRODUCT_OS_NAME" /> tenterà di scaricare payload di aggiornamento automatico tramite HTTP. Se viene impostato su false o se non viene configurato, verrà utilizzato HTTPS per il download di payload di aggiornamento automatico.</translation>
-<translation id="7515953732107149296">Questo criterio è stato rimosso da M53 dopo la rimozione di RC4 da <ph name="PRODUCT_NAME" />.
+Se questa policy viene impostata su true, <ph name="PRODUCT_OS_NAME" /> tenterà di scaricare payload di aggiornamento automatico tramite HTTP. Se viene impostata su false o se non viene configurata, verrà utilizzato HTTPS per il download di payload di aggiornamento automatico.</translation>
+<translation id="7515953732107149296">Questa policy è stata rimossa da M53 dopo la rimozione di RC4 da <ph name="PRODUCT_NAME" />.
 
-      Se il criterio non viene configurato o se viene impostato su False, le suite di crittografia RC4 in TLS non verranno attivate. In caso contrario, potrebbe essere impostato su True per mantenere la compatibilità con un server obsoleto. Si tratta di una misura temporanea ed è necessario riconfigurare il server.</translation>
+      Se la policy non viene configurata o se viene impostata su False, le suite di crittografia RC4 in TLS non verranno attivate. In caso contrario, potrebbe essere impostata su True per mantenere la compatibilità con un server obsoleto. Si tratta di una misura temporanea ed è necessario riconfigurare il server.</translation>
 <translation id="751615601677744094">Disattivato: comportamento normale per gli eventi Mutazione, il che significa che non verranno attivati dopo la data di rimozione.</translation>
 <translation id="7519218194072744342">L'URL del gestore di protocollo.</translation>
 <translation id="7519251620064708155">Consenti la generazione di chiavi su questi siti</translation>
@@ -9148,22 +9148,22 @@
 <translation id="7529144158022474049">Fattore di dispersione aggiornamento automatico</translation>
 <translation id="7529332889403151669">Specifica se mostrare l'avviso di schermo intero quando il dispositivo disattiva la sospensione o lo schermo scuro.
 
-      Se il criterio non viene impostato o viene impostato su True, viene mostrato un avviso per ricordare agli utenti di uscire dalla modalità a schermo intero prima di digitare la password. Se il criterio viene impostato su False, l'avviso non viene mostrato.</translation>
+      Se la policy non viene impostata o viene impostata su True, viene mostrato un avviso per ricordare agli utenti di uscire dalla modalità a schermo intero prima di digitare la password. Se la policy viene impostata su False, l'avviso non viene mostrato.</translation>
 <translation id="7531630046107845550">Consenti connessioni SSH client in uscita in Terminal System App</translation>
 <translation id="753332207298659209">Configura i criteri per controllare se i dati utente sono consentiti sul dispositivo e se i dati esistenti devono essere caricati sul cloud.</translation>
-<translation id="7533385610709354870">A meno che <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> non sia disattivato, l'attivazione di <ph name="MEDIA_ROUTER_CAST_ALLOW_ALL_IPS_POLICY_NAME" /> connette <ph name="PRODUCT_NAME" /> ai dispositivi di trasmissione su tutti gli indirizzi IP e non solo su indirizzi privati RFC1918/RFC4193.
+<translation id="7533385610709354870">A meno che <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> non sia disattivata, l'attivazione di <ph name="MEDIA_ROUTER_CAST_ALLOW_ALL_IPS_POLICY_NAME" /> connette <ph name="PRODUCT_NAME" /> ai dispositivi di trasmissione su tutti gli indirizzi IP e non solo su indirizzi privati RFC1918/RFC4193.
 
-Se il criterio viene disattivato, <ph name="PRODUCT_NAME" /> si connette ai dispositivi di trasmissione solo su indirizzi RFC1918/RFC4193.
+Se la policy viene disattivata, <ph name="PRODUCT_NAME" /> si connette ai dispositivi di trasmissione solo su indirizzi RFC1918/RFC4193.
 
-Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> si connette ai dispositivi di trasmissione solo su indirizzi RFC1918/RFC4193, a meno che la funzionalità CastAllowAllIPs non sia attivata.</translation>
+Se la policy non viene configurata, <ph name="PRODUCT_NAME" /> si connette ai dispositivi di trasmissione solo su indirizzi RFC1918/RFC4193, a meno che la funzionalità CastAllowAllIPs non sia attivata.</translation>
 <translation id="7534199150025803530">Questa norma non influisce sull'app Google Drive per Android. Se vuoi impedire l'utilizzo di Google Drive tramite rete cellulare, non devi consentire l'installazione dell'app Google Drive per Android.</translation>
-<translation id="7538583957913002726">Questo criterio è impostato su Attivato per impostazione predefinita. Consente di stabilire se i dispositivi registrati devono segnalare o meno informazioni quali nome del modello, architettura e velocità di clock massima della CPU (oltre a utilizzo e temperatura della CPU per M96 e versioni successive).
+<translation id="7538583957913002726">Questa policy è impostata su Attivata per impostazione predefinita. Consente di stabilire se i dispositivi registrati devono segnalare o meno informazioni quali nome del modello, architettura e velocità di clock massima della CPU (oltre a utilizzo e temperatura della CPU per M96 e versioni successive).
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano informazioni sulla CPU.
-      Eccezione: la segnalazione dell'utilizzo e della temperatura della CPU viene controllata tramite il criterio <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano informazioni sulla CPU.
+      Eccezione: la segnalazione dell'utilizzo e della temperatura della CPU viene controllata tramite la policy <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
 <translation id="7540622499178214923">Permette di consentire l'uso del controller DTC (Diagnostics and Telemetry Controller) wilco</translation>
-<translation id="7540826630642174841">Impostare il criterio significa che i criteri relativi ai dispositivi specificati vengono ignorati (si usano le impostazioni predefinite di questi criteri) durante gli intervalli indicati. I criteri relativi ai dispositivi vengono applicati di nuovo da <ph name="PRODUCT_NAME" /> all'inizio o alla fine del periodo del criterio. L'utente viene avvisato e deve disconnettersi quando questo periodo e le impostazioni dei criteri relativi ai dispositivi cambiano (ad esempio, quando un utente accede con un account non autorizzato).</translation>
-<translation id="7540945123920084379">La configurazione del criterio consente di stabilire le modalità di sblocco rapido che è possibile usare per sbloccare la schermata di blocco.
+<translation id="7540826630642174841">Impostare la policy significa che le policy relative ai dispositivi specificati vengono ignorate (si usano le impostazioni predefinite di queste policy) durante gli intervalli indicati. Le policy relative ai dispositivi vengono applicate di nuovo da <ph name="PRODUCT_NAME" /> all'inizio o alla fine del periodo della policy. L'utente viene avvisato e deve disconnettersi quando questo periodo e le impostazioni delle policy relative ai dispositivi cambiano (ad esempio, quando un utente accede con un account non autorizzato).</translation>
+<translation id="7540945123920084379">La configurazione della policy consente di stabilire le modalità di sblocco rapido che è possibile usare per sbloccare la schermata di blocco.
 
       Per consentire:
 
@@ -9173,27 +9173,27 @@
 
       * PIN e impronta, usa ["PIN", "FINGERPRINT"].
 
-      Se il criterio non viene configurato o se viene impostato su un elenco vuoto, non saranno disponibili modalità di sblocco rapido per i dispositivi gestiti.</translation>
+      Se la policy non viene configurata o se viene impostata su un elenco vuoto, non saranno disponibili modalità di sblocco rapido per i dispositivi gestiti.</translation>
 <translation id="754176366378585605">Controlla l'utilizzo dell'API File Handling</translation>
 <translation id="754421082295668587">Metadati del programma di installazione</translation>
-<translation id="7544392541165889987">Se il criterio viene impostato su Attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> può agire da proxy tra <ph name="CLOUD_PRINT_NAME" /> e le precedenti stampanti collegate al computer. Gli utenti possono attivare il proxy Cloud Print tramite l'autenticazione usando il proprio Account Google.
+<translation id="7544392541165889987">Se la policy viene impostata su Attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> può agire da proxy tra <ph name="CLOUD_PRINT_NAME" /> e le precedenti stampanti collegate al computer. Gli utenti possono attivare il proxy Cloud Print tramite l'autenticazione usando il proprio Account Google.
 
-      Se il criterio viene impostato su Disattivato, gli utenti non possono attivare il proxy e il computer non può condividere le stampanti con <ph name="CLOUD_PRINT_NAME" />.</translation>
+      Se la policy viene impostata su Disattivata, gli utenti non possono attivare il proxy e il computer non può condividere le stampanti con <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="7546699946724795644">Chrome può bloccare le navigazioni ai protocolli esterni all'interno di iframe con sandbox</translation>
 <translation id="7547549430720182663">Unisci</translation>
-<translation id="7554382342294940216">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> può aggirare qualsiasi proxy per l'autenticazione captive portal. Queste pagine web di autenticazione, a partire dalla pagina di accesso al captive portal fino al rilevamento di una connessione a Internet attiva da parte di Chrome, si aprono in una finestra separata, ignorando tutte le impostazioni del criterio e le limitazioni relative all'utente corrente. Questo criterio viene applicato soltanto se viene configurato un proxy (tramite criterio, estensione o da parte dell'utente in chrome://settings).
+<translation id="7554382342294940216">Se la policy viene impostata su Attivata, <ph name="PRODUCT_OS_NAME" /> può aggirare qualsiasi proxy per l'autenticazione captive portal. Queste pagine web di autenticazione, a partire dalla pagina di accesso al captive portal fino al rilevamento di una connessione a internet attiva da parte di Chrome, si aprono in una finestra separata, ignorando tutte le impostazioni della policy e le limitazioni relative all'utente corrente. Questa policy viene applicata soltanto se viene configurato un proxy (tramite policy, estensione o da parte dell'utente in chrome://settings).
 
-      Se viene impostato su Disattivato o se non viene configurato, qualsiasi pagina di autenticazione captive portal viene visualizzata in una nuova scheda del browser standard, in base alle impostazioni del proxy dell'utente corrente.</translation>
+      Se viene impostata su Disattivata o se non viene configurata, qualsiasi pagina di autenticazione captive portal viene visualizzata in una nuova scheda del browser standard, in base alle impostazioni del proxy dell'utente corrente.</translation>
 <translation id="756693807309043286">Consente di configurare l'elenco di domini dei cookie esclusi dalla lista bloccata da trasferire quando un utente passa da un dispositivo <ph name="PRODUCT_OS_NAME" /> a un altro, quando il servizio SSO mobile è attivato.
 
 Se un cookie è impostato per un dominio che corrisponde a uno dei filtri forniti, viene incluso nel trasferimento. I domini dei cookie vengono associati in base alle regole dei campi "host" descritte nella pagina https://support.google.com/chrome/a?p=url_blocklist_filter_format, tutti gli altri campi vengono ignorati. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-Se il criterio viene lasciato vuoto, non sono consentite eccezioni a <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_POLICY_NAME" />. Per consentire il trasferimento solo di un numero limitato di domini, blocca tutti i domini impostando il criterio <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_POLICY_NAME" /> su <ph name="WILDCARD_VALUE" /> e configura qui le eccezioni della lista bloccata.</translation>
-<translation id="7567373982693549834">Questo criterio consente di controllare l'utilizzo delle app Android di fonti non attendibili (diverse dal Google Play Store) per ogni utente.
+Se la policy viene lasciata vuota, non sono consentite eccezioni a <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_POLICY_NAME" />. Per consentire il trasferimento solo di un numero limitato di domini, blocca tutti i domini impostando la policy <ph name="FLOATING_SSO_DOMAIN_BLOCKLIST_POLICY_NAME" /> su <ph name="WILDCARD_VALUE" /> e configura qui le eccezioni della lista bloccata.</translation>
+<translation id="7567373982693549834">Questa policy consente di controllare l'utilizzo delle app Android di fonti non attendibili (diverse dal Google Play Store) per ogni utente.
 
-      Se il valore di questo criterio non viene impostato, la funzionalità viene considerata vietata.
+      Se il valore di questa policy non viene impostato, la funzionalità viene considerata vietata.
 
-      Se il dispositivo dell'utente è gestito, la disponibilità di questa funzionalità dipende anche dai criteri relativi ai dispositivi corrispondenti.
+      Se il dispositivo dell'utente è gestito, la disponibilità di questa funzionalità dipende anche dalle policy relative ai dispositivi corrispondenti.
 
       Se il dispositivo dell'utente non è gestito, la disponibilità di questa funzionalità dipende anche dal fatto che l'utente sia o meno il proprietario del dispositivo.</translation>
 <translation id="7570291542739287032">Solo Google Cloud</translation>
@@ -9203,32 +9203,32 @@
 
       Se questa norma non viene impostata o se viene impostata su false, <ph name="PRODUCT_NAME" /> seguirà il programma di ritiro della crittografia SHA-1 pubblicamente annunciato.</translation>
 <translation id="7577082478271919056">Consenti a un'app web kiosk di aprire un'altra finestra del browser</translation>
-<translation id="7578142001795552218">Questo criterio consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server per ricevere i risultati della conversione delle unità.
+<translation id="7578142001795552218">Questa policy consente di autorizzare Risposte rapide ad accedere ai contenuti selezionati e a inviare le informazioni al server per ricevere i risultati della conversione delle unità.
 
-      Se il criterio è attivato o non impostato, la funzionalità di conversione delle unità di Risposte rapide sarà attiva.
-      Se il criterio è disattivato, la funzionalità di conversione delle unità di Risposte rapide sarà disattivata.</translation>
+      Se la policy è attivata o non impostata, la funzionalità di conversione delle unità di Risposte rapide sarà attiva.
+      Se la policy è disattivata, la funzionalità di conversione delle unità di Risposte rapide sarà disattivata.</translation>
 <translation id="7584363090329234690">Consenti Sfondo AI generativa per videoconferenze senza migliorare i modelli di AI</translation>
 <translation id="7585312329612243723">Attiva flusso di attestazione <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL su browser gestiti</translation>
 <translation id="7586199729147257934">Consente il provisioning dei certificati client per i browser gestiti</translation>
-<translation id="7587345076013230465">Richiedi all'utente di selezionare il certificato client quando il criterio di selezione automatica corrisponde a più certificati nella schermata di accesso</translation>
+<translation id="7587345076013230465">Richiedi all'utente di selezionare il certificato client quando la policy di selezione automatica corrisponde a più certificati nella schermata di accesso</translation>
 <translation id="7587921466180902617">Attiva la versione sperimentale di Registra schermo per gli utenti di Family Link</translation>
-<translation id="7595074040612182185">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che possono mostrare immagini.
+<translation id="7595074040612182185">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che possono mostrare immagini.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_IMAGES_SETTING_ENABLED_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_IMAGES_SETTING_ENABLED_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-      Tieni presente che in precedenza questo criterio è stato erroneamente abilitato su Android, ma questa funzionalità non è mai stata completamente supportata su Android.</translation>
+      Tieni presente che in precedenza questa policy è stata erroneamente abilitata su Android, ma questa funzionalità non è mai stata completamente supportata su Android.</translation>
 <translation id="759957074386651883">Impostazioni di Navigazione sicura</translation>
 <translation id="7602621823177962064">Disattiva i report sulle informazioni relative alla memoria del dispositivo</translation>
 <translation id="7604169113182304895">Le app Android potrebbero decidere volontariamente se rispettare o meno questo elenco. Non è possibile imporre il rispetto dell'elenco.</translation>
 <translation id="7608186022704392724">La funzionalità di invio automatico del PIN modifica il modo in cui i PIN vengono inseriti in <ph name="PRODUCT_OS_NAME" />.
           Anziché mostrare lo stesso campo di testo utilizzato per l'inserimento della password, questa funzionalità mostra un'UI speciale che indica chiaramente all'utente da quante cifre deve essere formato il PIN. Di conseguenza, la lunghezza del PIN dell'utente viene memorizzata al di fuori dei dati criptati dell'utente. Sono supportati soltanto i PIN formati da 6-12 cifre.
 
-          Se il criterio viene impostato su True, gli utenti avranno a disposizione la funzionalità di invio automatico del PIN nella schermata di blocco e di accesso.
-          Se il criterio viene impostato su False o se non viene configurato, gli utenti non avranno a disposizione la funzionalità di invio automatico del PIN nella schermata di blocco e di accesso.
+          Se la policy viene impostata su True, gli utenti avranno a disposizione la funzionalità di invio automatico del PIN nella schermata di blocco e di accesso.
+          Se la policy viene impostata su False o se non viene configurata, gli utenti non avranno a disposizione la funzionalità di invio automatico del PIN nella schermata di blocco e di accesso.
 
-          Se il criterio viene configurato, gli utenti non avranno la possibilità di attivare la funzionalità.</translation>
+          Se la policy viene configurata, gli utenti non avranno la possibilità di attivare la funzionalità.</translation>
 <translation id="7612059745454194563">Non consentire la visualizzazione della promozione dell'estensione fornitore di credenziali</translation>
 <translation id="7612157962821894603">Contrassegni a livello di sistema da applicare all'avvio di <ph name="PRODUCT_NAME" /></translation>
 <translation id="7613115815080726221">Il periodo di tempo, in millisecondi, senza input dell'utente trascorso il quale viene compiuta l'azione stabilita per l'inattività.</translation>
@@ -9250,65 +9250,65 @@
       Quando questa norma non è impostata, non è possibile verificare il codice di accesso genitori sul dispositivo dell'utente bambino o ragazzo.</translation>
 <translation id="7623431489198474050">Disattiva l'attestazione da remoto per la protezione dei contenuti</translation>
 <translation id="7628747690141606652">Disattiva traduzioni di Risposte rapide</translation>
-<translation id="7629840767216985001">Se il criterio è impostato su True, viene attivato il cursore grande nella schermata di accesso. Se il criterio è impostato su False, viene disattivato il cursore grande nella schermata di accesso.
+<translation id="7629840767216985001">Se la policy è impostata su True, viene attivato il cursore grande nella schermata di accesso. Se la policy è impostata su False, viene disattivato il cursore grande nella schermata di accesso.
 
-      Se imposti il criterio, gli utenti possono attivare o disattivare temporaneamente il cursore grande. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, il cursore torna allo stato originale.
+      Se imposti la policy, gli utenti possono attivare o disattivare temporaneamente il cursore grande. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, il cursore torna allo stato originale.
 
-      Se il criterio non è impostato, il cursore grande risulta disattivato nella schermata di accesso. Gli utenti possono attivarlo in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
+      Se la policy non è impostata, il cursore grande risulta disattivato nella schermata di accesso. Gli utenti possono attivarlo in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
 
-          Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> sostituisce questo criterio.</translation>
+          Nota: se specificata, <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> sostituisce questa policy.</translation>
 <translation id="7630403270894231662">Utilizza WeeklyTimeChecked nel nuovo codice.</translation>
 <translation id="7632147323011514740">Intervalli in cui è possibile avviare la procedura di aggiornamento delle istantanee dei dati ARC per le sessioni Ospite gestite</translation>
 <translation id="7632724434767231364">Nome della libreria GSSAPI</translation>
-<translation id="7635106595080609261">La mancata configurazione o l'impostazione del criterio su Attivato consente a Chrome di mostrare finestre di dialogo di selezione dei file che gli utenti possono aprire.
+<translation id="7635106595080609261">La mancata configurazione o l'impostazione della policy su Attivata consente a Chrome di mostrare finestre di dialogo di selezione dei file che gli utenti possono aprire.
 
-      Se il criterio viene impostato su Disattivato, quando gli utenti eseguono delle azioni che comportano l'apertura di una finestra di dialogo di selezione dei file, come importare preferiti, caricare file e salvare link, viene visualizzato un messaggio. Il browser presuppone che l'utente abbia fatto clic su Annulla nella finestra di dialogo di selezione dei file.</translation>
+      Se la policy viene impostata su Disattivata, quando gli utenti eseguono delle azioni che comportano l'apertura di una finestra di dialogo di selezione dei file, come importare preferiti, caricare file e salvare link, viene visualizzato un messaggio. Il browser presuppone che l'utente abbia fatto clic su Annulla nella finestra di dialogo di selezione dei file.</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">Consenti l'uso delle notifiche di sistema</translation>
-<translation id="7642740497103044368">Se il criterio viene impostato su Attivato, è possibile unire i criteri associati a un account gestito ai criteri a livello di macchina.
+<translation id="7642740497103044368">Se la policy viene impostata su Attivata, è possibile unire le policy associate a un account gestito alle policy a livello di macchina.
 
-Se il criterio viene impostato su Disattivato o se non viene impostato, non è possibile unire i criteri relativi al cloud a livello di utente ai criteri di altre fonti.
+Se la policy viene impostata su Disattivata o se non viene impostata, non è possibile unire le policy relative al cloud a livello di utente alle policy di altre fonti.
 
-Soltanto i criteri derivanti da utenti sicuri possono ottenere la precedenza. Un utente sicuro è affiliato all'organizzazione che gestisce il suo browser usando <ph name="CHROME_ENTERPRISE_CORE_NAME" />. Tutti gli altri criteri a livello di utente avranno la precedenza per impostazione predefinita.
+Soltanto le policy derivanti da utenti sicuri possono ottenere la precedenza. Un utente sicuro è affiliato all'organizzazione che gestisce il suo browser usando <ph name="CHROME_ENTERPRISE_CORE_NAME" />. Tutte le altre policy a livello di utente avranno la precedenza per impostazione predefinita.
 
-I criteri da unire devono essere impostati anche nel criterio <ph name="POLICY_LIST_MULTIPLE_SOURCE_MERGE_LIST_POLICY_NAME" /> o <ph name="POLICY_DICTIONARY_MULTIPLE_SOURCE_MERGE_LIST_POLICY_NAME" />. Questo criterio viene ignorato se non viene configurato nessuno dei due criteri sopra indicati.</translation>
-<translation id="7643151458117317518">Un criterio per stabilire se i tuoi utenti possono o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla misurazione degli annunci.
+Le policy da unire devono essere impostate anche nella policy <ph name="POLICY_LIST_MULTIPLE_SOURCE_MERGE_LIST_POLICY_NAME" /> o <ph name="POLICY_DICTIONARY_MULTIPLE_SOURCE_MERGE_LIST_POLICY_NAME" />. Questa policy viene ignorata se non viene configurata nessuna delle due policy sopra indicate.</translation>
+<translation id="7643151458117317518">Una policy per stabilire se i tuoi utenti possono o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla misurazione degli annunci.
 
-Se imposti questo criterio su Disabled, l'impostazione relativa alla misurazione degli annunci verrà disattivata per i tuoi utenti.
-Se lo imposti su Enabled o se non lo configuri, i tuoi utenti potranno attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla misurazione degli annunci.
+Se imposti questa policy su Disabled, l'impostazione relativa alla misurazione degli annunci verrà disattivata per i tuoi utenti.
+Se la imposti su Enabled o se non la configuri, i tuoi utenti potranno attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa alla misurazione degli annunci.
 
-Se configuri questo criterio, il criterio <ph name="PRIVACY_SANDBOX_PROMPT_ENABLED_POLICY_NAME" /> deve essere impostato su Disabled.</translation>
+Se configuri questa policy, la policy <ph name="PRIVACY_SANDBOX_PROMPT_ENABLED_POLICY_NAME" /> deve essere impostata su Disabled.</translation>
 <translation id="7643883929273267746">Limita gli account visibili in <ph name="PRODUCT_NAME" /></translation>
-<translation id="7648664871086956188">Questo criterio è un'opzione generica per tutte le regole definite nel criterio DataLeakPreventionRulesList.
-      Se questo criterio viene impostato su Vero, viene attivata la generazione di rapporti in tempo reale degli eventi di prevenzione di fughe di dati.
-      Se viene impostato su Falso o se non viene configurato, la generazione di rapporti viene disattivata.
-      Le regole definite con limitazioni a livello ALLOW nel criterio DataLeakPreventionRulesList non genereranno rapporti sugli eventi in nessun caso.</translation>
+<translation id="7648664871086956188">Questa policy è un'opzione generica per tutte le regole definite nella policy DataLeakPreventionRulesList.
+      Se questa policy viene impostata su True, viene attivata la generazione di rapporti in tempo reale degli eventi di prevenzione di fughe di dati.
+      Se viene impostata su False o se non viene configurata, la generazione di rapporti viene disattivata.
+      Le regole definite con limitazioni a livello ALLOW nella policy DataLeakPreventionRulesList non genereranno rapporti sugli eventi in nessun caso.</translation>
 <translation id="7648907905084499629">Usa il comportamento <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> per i cookie su tutti i siti</translation>
 <translation id="7657261947024629645">Ottimizza per ottenere il massimo rendimento.</translation>
 <translation id="76580522298425324">Consenti acquisizione schermo senza gesto dell'utente precedente</translation>
 <translation id="7666228839913571182">Consenti cookie di terze parti</translation>
-<translation id="7669630878711068277">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono stampare in <ph name="PRODUCT_NAME" /> e non possono modificare questa impostazione.
+<translation id="7669630878711068277">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono stampare in <ph name="PRODUCT_NAME" /> e non possono modificare questa impostazione.
 
-      Se il criterio viene impostato su Disattivato, gli utenti non possono stampare da <ph name="PRODUCT_NAME" />. L'opzione di stampa è disattivata nel menu con tre puntini, nelle estensioni e nelle applicazioni JavaScript.</translation>
+      Se la policy viene impostata su Disattivata, gli utenti non possono stampare da <ph name="PRODUCT_NAME" />. L'opzione di stampa è disattivata nel menu con tre puntini, nelle estensioni e nelle applicazioni JavaScript.</translation>
 <translation id="7673194325208122247">Periodo di tempo (millisecondi)</translation>
 <translation id="7677220829878081413">
-      Se è impostato su ArcSession, questo criterio forza il riavvio del dispositivo all'uscita dell'utente se Android è stato avviato.
-      Quando è impostato su ArcSessionOrVMStart, questo criterio forza il riavvio del dispositivo all'uscita dell'utente se Android o una VM sono stati avviati.
-      Se è impostato su Sempre, forza il riavvio del dispositivo a ogni uscita dell'utente.
-      Se non è impostato, non sortisce alcun effetto e non viene forzato alcun riavvio all'uscita dell'utente. Lo stesso accade se è impostato su Mai.
-      Questo criterio ha effetto solo per gli utenti non affiliati.
+      Se è impostata su ArcSession, questa policy forza il riavvio del dispositivo all'uscita dell'utente se Android è stato avviato.
+      Quando è impostata su ArcSessionOrVMStart, questa policy forza il riavvio del dispositivo all'uscita dell'utente se Android o una VM sono stati avviati.
+      Se è impostata su Sempre, forza il riavvio del dispositivo a ogni uscita dell'utente.
+      Se non è impostata, non sortisce alcun effetto e non viene forzato alcun riavvio all'uscita dell'utente. Lo stesso accade se è impostata su Mai.
+      Questa policy ha effetto solo per gli utenti non affiliati.
       </translation>
-<translation id="7679483888150212009">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="7679483888150212009">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale lo schermo viene oscurato quando viene usata la corrente alternata.
 
-          Se questo criterio viene impostato su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> oscuri lo schermo.
+          Se questa policy viene impostata su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> oscuri lo schermo.
 
-          Se questo criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non oscura lo schermo quando l'utente diventa inattivo.
+          Se questa policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non oscura lo schermo quando l'utente diventa inattivo.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di disattivazione dello schermo (se impostato) e al ritardo di inattività.</translation>
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di disattivazione dello schermo (se impostato) e al ritardo di inattività.</translation>
 <translation id="7680437377926096177">Impedisci la visualizzazione della finestra di dialogo di disconnessione nell'ultima finestra chiusa.</translation>
 <translation id="7683777542468165012">Aggiornamento dinamico delle norme</translation>
 <translation id="7687943045976362719">Se questa norma viene impostata, i tipi di contenuto specificati vengono gestiti da <ph name="PRODUCT_FRAME_NAME" />.
@@ -9319,29 +9319,29 @@
 <translation id="7696534428021833264">Attiva la scheda File di SharePoint e OneDrive nella pagina Nuova scheda</translation>
 <translation id="7701341006446125684">Imposta le dimensioni della cache di app ed estensioni (in byte)</translation>
 <translation id="7703041979684393741">Non consentire la raccolta di log eventi WebRTC dai servizi Google</translation>
-<translation id="770339941914297201">Nuovo comportamento: le app di Chrome Kiosk verranno aggiornate solo utilizzando l'URL di aggiornamento dal criterio</translation>
+<translation id="770339941914297201">Nuovo comportamento: le app di Chrome Kiosk verranno aggiornate solo utilizzando l'URL di aggiornamento dalla policy</translation>
 <translation id="7703737669292992839">Blocca finestre di dialogo per la selezione di file</translation>
 <translation id="7703819160640109959">Consente di stabilire se il visualizzatore di PDF in <ph name="PRODUCT_NAME" /> utilizza il renderer Skia.
 
-Quando questo criterio è attivato, il visualizzatore di PDF utilizza il renderer Skia.
+Quando questa policy è attivata, il visualizzatore di PDF utilizza il renderer Skia.
 
-Se questo criterio viene disattivato, il visualizzatore di PDF utilizza il renderer AGG corrente.
+Se questa policy viene disattivata, il visualizzatore di PDF utilizza il renderer AGG corrente.
 
-Se questo criterio non viene impostato, il renderer del PDF viene scelto dal browser.</translation>
+Se questa policy non viene impostata, il renderer del PDF viene scelto dal browser.</translation>
 <translation id="7707869387893611318">Consente di attivare la funzionalità Suoni di ricarica.
 
           Questa funzionalità consente di riprodurre i suoni di ricarica.
 
-          Se questo criterio viene attivato, i suoni di ricarica verranno riprodotti quando il dispositivo sarà collegato a un caricabatterie CA.
+          Se questa policy viene attivata, i suoni di ricarica verranno riprodotti quando il dispositivo sarà collegato a un caricabatterie CA.
 
-          Se questo criterio viene disattivato, non verrà riprodotto alcun suono di ricarica.
+          Se questa policy viene disattivata, non verrà riprodotto alcun suono di ricarica.
 
-          Se configuri questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se configuri questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se il criterio non viene configurato, inizialmente questa funzionalità è disattivata sui dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti, ma gli utenti possono attivarla o disattivarla in qualsiasi momento.</translation>
-<translation id="7708934468069982537">Questo criterio è stato rimosso da M58 dopo la rimozione di DHE da <ph name="PRODUCT_NAME" />.
+          Se la policy non viene configurata, inizialmente questa funzionalità è disattivata sui dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti, ma gli utenti possono attivarla o disattivarla in qualsiasi momento.</translation>
+<translation id="7708934468069982537">Questa policy è stata rimossa da M58 dopo la rimozione di DHE da <ph name="PRODUCT_NAME" />.
 
-      Se il criterio non viene configurato o se viene impostato su False, le suite di crittografia DHE in TLS non verranno attivate. In caso contrario, potrebbe essere impostato su True per attivare le suite di crittografia DHE e mantenere la compatibilità con un server obsoleto. Si tratta di una misura temporanea ed è necessario riconfigurare il server.
+      Se la policy non viene configurata o se viene impostata su False, le suite di crittografia DHE in TLS non verranno attivate. In caso contrario, potrebbe essere impostato su True per attivare le suite di crittografia DHE e mantenere la compatibilità con un server obsoleto. Si tratta di una misura temporanea ed è necessario riconfigurare il server.
 
       È consigliabile eseguire la migrazione dei server alle suite di crittografia ECDHE. Se non sono disponibili, assicurati che sia attiva una suite di crittografia che utilizza lo scambio di chiavi RSA.</translation>
 <translation id="7709470712369261710">Non usare i servizi Google per fornire le descrizioni immagini automatiche</translation>
@@ -9350,28 +9350,28 @@
 <translation id="7713608076604149344">Limitazioni dei download</translation>
 <translation id="7713845740295404764">Segnala eventi di accesso/uscita</translation>
 <translation id="7715711044277116530">Percentuale di regolazione del ritardo di oscuramento dello schermo in modalità di presentazione</translation>
-<translation id="7716020145539921591">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
+<translation id="7716020145539921591">Questa policy è deprecata. Usa la policy <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       La configurazione del criterio consente di specificare l'URL del server proxy. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e hai selezionato <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       La configurazione della policy consente di specificare l'URL del server proxy. Questa policy viene applicata solo se la policy <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificata e hai selezionato <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criteri di impostazione del proxy.
+       Non configurare questa policy se hai selezionato una qualsiasi altra modalità per le policy di impostazione del proxy.
 
       Nota: per esempi approfonditi, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
-<translation id="7716587310609820801">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono mostrare notifiche.
+<translation id="7716587310609820801">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che non possono mostrare notifiche.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="7717938661004793600">Configura le funzioni di accessibilità di <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7718127720248642697">Questo criterio è impostato su Attivato per impostazione predefinita. Consente di stabilire se i dispositivi registrati devono segnalare o meno statistiche hardware e identificatori per i dispositivi di archiviazione.
+<translation id="7718127720248642697">Questa policy è impostata su Attivata per impostazione predefinita. Consente di stabilire se i dispositivi registrati devono segnalare o meno statistiche hardware e identificatori per i dispositivi di archiviazione.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano statistiche relative all'archiviazione.
-      Eccezione: le dimensioni del disco e lo spazio libero su disco vengono controllati tramite il criterio <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
-<translation id="7719175048012980445">La configurazione del criterio modifica la directory predefinita in cui Chrome scarica i file, che però gli utenti possono modificare.
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano statistiche relative all'archiviazione.
+      Eccezione: le dimensioni del disco e lo spazio libero su disco vengono controllati tramite la policy <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
+<translation id="7719175048012980445">La configurazione della policy modifica la directory predefinita in cui Chrome scarica i file, che però gli utenti possono modificare.
 
-      Se il criterio non viene configurato, Chrome utilizza la directory predefinita specifica della piattaforma.
+      Se la policy non viene configurata, Chrome utilizza la directory predefinita specifica della piattaforma.
 
-      Questo criterio non ha effetto se viene configurato il criterio <ph name="DOWNLOAD_DIRECTORY_POLICY_NAME" />.
+      Questa policy non ha effetto se viene configurata la policy <ph name="DOWNLOAD_DIRECTORY_POLICY_NAME" />.
 
       Nota. Vedi l'elenco di variabili che puoi utilizzare: https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables.</translation>
 <translation id="7719808201797990069">Eccezioni di pattern URL per ignorare le schede</translation>
@@ -9383,11 +9383,11 @@
 <translation id="7734212505800048991">
           Le chiamate a getDisplayMedia che provengono da contesti non aggiunti alla lista consentita vengono rifiutate.</translation>
 <translation id="7734846328530412287">Gestisci la disponibilità dell'API video a schermo intero deprecata</translation>
-<translation id="7736218466096907954">Se il criterio viene impostato su Attivato o se non viene impostato, in <ph name="PRODUCT_NAME" /> viene mostrata l'UI del nuovo fumetto dei download.
+<translation id="7736218466096907954">Se la policy viene impostata su Attivata o se non viene impostata, in <ph name="PRODUCT_NAME" /> viene mostrata l'UI del nuovo fumetto dei download.
 
-      Se il criterio viene impostato su Disattivato, <ph name="PRODUCT_NAME" /> continua a mostrare l'UI della barra dei download precedente.
+      Se la policy viene impostata su Disattivata, <ph name="PRODUCT_NAME" /> continua a mostrare l'UI della barra dei download precedente.
 
-      Questo criterio era stato pensato per essere temporaneo ed è stato rimosso dopo l'avvio completo della nuova interfaccia utente del fumetto dei download.</translation>
+      Questa policy era stata pensata per essere temporanea ed è stata rimossa dopo l'avvio completo della nuova interfaccia utente del fumetto dei download.</translation>
 <translation id="7736521021425189418">Terminale (supportata dalla versione 117)</translation>
 <translation id="7736846524371077454">Imponi l'abilitazione di tutti i metodi di immissione consentiti</translation>
 <translation id="7740644123648617252">Abilita l'importazione dei dati di compilazione automatica dei moduli alla prima esecuzione</translation>
@@ -9399,17 +9399,17 @@
           Se questa impostazione è abilitata, gli utenti devono fornire un codice valido a due fattori quando accedono a un host.
 
           Se questa impostazione è disabilitata o non è impostata, l'autenticazione a due fattori non sarà attiva e verrà utilizzato il comportamento predefinito che prevede l'uso di un PIN definito dall'utente.</translation>
-<translation id="7749402921503577264">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti possono fare clic nelle pagine di avviso mostrate da <ph name="PRODUCT_NAME" /> quando navigano su siti con errori SSL.
+<translation id="7749402921503577264">Se la policy viene impostata su Attivata o se non viene configurata, gli utenti possono fare clic nelle pagine di avviso mostrate da <ph name="PRODUCT_NAME" /> quando navigano su siti con errori SSL.
 
-      Se il criterio viene impostato su Disattivato, gli utenti non possono fare clic nelle pagine di avviso.</translation>
+      Se la policy viene impostata su Disattivata, gli utenti non possono fare clic nelle pagine di avviso.</translation>
 <translation id="7750991880413385988">Apri pagina Nuova scheda</translation>
 <translation id="7753678409577376761">Attiva il punto di ingresso nella barra degli strumenti delle funzionalità sperimentali del browser</translation>
 <translation id="7754704193130578113">Chiedi dove salvare il file prima di scaricarlo</translation>
-<translation id="7754893969683595513">L'impostazione del criterio specifica il periodo in millisecondi durante il quale il servizio di gestione dei dispositivi viene interrogato per informazioni sui criteri relativi agli utenti. I valori validi vanno da 1.800.000 (30 minuti) a 86.400.000 (1 giorno). I valori che non rientrano in questo intervallo verranno bloccati al relativo limite.
+<translation id="7754893969683595513">L'impostazione della policy specifica il periodo in millisecondi durante il quale il servizio di gestione dei dispositivi viene interrogato per informazioni sulle policy relative agli utenti. I valori validi vanno da 1.800.000 (30 minuti) a 86.400.000 (1 giorno). I valori che non rientrano in questo intervallo verranno bloccati al relativo limite.
 
-      Se il criterio non viene impostato, si usa il valore predefinito di 3 ore.
+      Se la policy non viene impostata, si usa il valore predefinito di 3 ore.
 
-      Nota: le notifiche relative ai criteri forzano un aggiornamento quando cambiano i criteri, rendendo quindi superflui aggiornamenti più frequenti. Quindi, se la piattaforma supporta queste notifiche, il ritardo dell'aggiornamento verrà impostato su 24 ore (vengono ignorati tutti i valori predefiniti e il valore di questo criterio).</translation>
+      Nota: le notifiche relative alle policy forzano un aggiornamento quando cambiano le policy, rendendo quindi superflui aggiornamenti più frequenti. Quindi, se la piattaforma supporta queste notifiche, il ritardo dell'aggiornamento verrà impostato su 24 ore (vengono ignorati tutti i valori predefiniti e il valore di questa policy).</translation>
 <translation id="775822241671489040">Consente di controllare l'impostazione "Usa l'Avvio app/il tasto Ricerca per modificare il comportamento dei tasti funzione"</translation>
 <translation id="7758378441185523981">Attiva l'autenticazione ambientale in base ai tipi di profilo.</translation>
 <translation id="776110834126722255">Deprecata</translation>
@@ -9418,47 +9418,47 @@
 <translation id="7763655314629932385">Specifica la versione che vuoi dell'IWA. Se viene fornita, il sistema tenterà di installare questa versione specifica e successivamente bloccherà eventuali ulteriori aggiornamenti. Per sbloccare l'app e abilitare nuovamente gli aggiornamenti, rimuovi questo campo. **Importante:** se la versione fornita non esiste, l'IWA rimane bloccata sulla versione installata al momento. Questo perché dopo aver tentato (e in questo caso senza successo) di eseguire l'aggiornamento alla versione bloccata, la limitazione degli aggiornamenti disabilita ulteriori aggiornamenti automatici.</translation>
 <translation id="776465643636059256">Disattiva insiemi di siti web correlati</translation>
 <translation id="7765879851993224640">Consenti l'uso dell'accesso tramite Smart Lock.</translation>
-<translation id="7767066506143083523">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che possono usare la funzionalità di acquisizione schede.
+<translation id="7767066506143083523">Se la policy viene configurata, puoi impostare un elenco di pattern URL che possono usare la funzionalità di acquisizione schede.
 
-      Se non viene configurato, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
+      Se non viene configurata, i siti non verranno presi in considerazione per l'override in questo livello dell'acquisizione.
 
       Tieni presente che le app di Chrome con finestre potranno ancora essere acquisite.
 
-      Il criterio non viene preso in considerazione se un sito corrisponde a un pattern URL nel criterio <ph name="SAME_ORIGIN_TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />.
+      La policy non viene presa in considerazione se un sito corrisponde a un pattern URL nella policy <ph name="SAME_ORIGIN_TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />.
 
-      Se un sito corrisponde a un pattern URL in questo criterio, i seguenti criteri non saranno presi in considerazione: <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />.
+      Se un sito corrisponde a un pattern URL in questa policy, le seguenti policy non saranno prese in considerazione: <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
 <translation id="77675082813227181">La pagina di test dei criteri è bloccata</translation>
 <translation id="7769289607378631288">Attivato: riattiva temporaneamente gli eventi Mutazione.</translation>
 <translation id="7771298620150437359">Configura i contenuti e l'ordine delle lingue preferite</translation>
 <translation id="7773790010815041731">Le app di Chrome sono state ritirate su <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />.
-      Se questo criterio viene attivato, <ph name="PRODUCT_NAME" /> continuerà a consentire l'esecuzione delle app di Chrome su queste piattaforme fino alla data ultima del ritiro del supporto di queste app su tutte le piattaforme, vale a dire giugno 2022.
-      Se questo criterio viene disattivato o se non viene configurato, potrebbe non essere consentita l'esecuzione delle app di Chrome, in base allo stato del ritiro graduale.
-      In ogni caso, continueranno a essere consentite le app di Chrome con installazione forzata in base al criterio.</translation>
+      Se questa policy viene attivata, <ph name="PRODUCT_NAME" /> continuerà a consentire l'esecuzione delle app di Chrome su queste piattaforme fino alla data ultima del ritiro del supporto di queste app su tutte le piattaforme, vale a dire giugno 2022.
+      Se questa policy viene disattivata o se non viene configurata, potrebbe non essere consentita l'esecuzione delle app di Chrome, in base allo stato del ritiro graduale.
+      In ogni caso, continueranno a essere consentite le app di Chrome con installazione forzata in base alla policy.</translation>
 <translation id="7774768074957326919">Utilizza le impostazioni proxy di sistema</translation>
 <translation id="7775077662962729812">Selezione di sfondi da Google Foto</translation>
 <translation id="7776848995687565978">Configura un elenco di origini che concedono una durata estesa in background alle estensioni che si connettono.</translation>
 <translation id="777734450201217641">Consente di attivare le scorciatoie delle funzioni di accessibilità nella schermata di accesso.
 
-          Se questo criterio viene impostato su true, le scorciatoie delle funzioni di accessibilità saranno sempre attive nella schermata di accesso.
+          Se questa policy viene impostata su true, le scorciatoie delle funzioni di accessibilità saranno sempre attive nella schermata di accesso.
 
-          Se questo criterio viene impostato su false, le scorciatoie delle funzioni di accessibilità saranno sempre disattivate nella schermata di accesso.
+          Se questa policy viene impostata su false, le scorciatoie delle funzioni di accessibilità saranno sempre disattivate nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o eseguirne l'override.
+          Se imposti questa policy, gli utenti non potranno modificarla o eseguirne l'override.
 
-          Se questo criterio non viene impostato, le scorciatoie delle funzioni di accessibilità saranno attive per impostazione predefinita nella schermata di accesso.</translation>
+          Se questa policy non viene impostata, le scorciatoie delle funzioni di accessibilità saranno attive per impostazione predefinita nella schermata di accesso.</translation>
 <translation id="7777535871204167559">Considera i dispositivi di archiviazione esterni come di sola lettura</translation>
 <translation id="7781452670568828399">Modifica la configurazione di <ph name="PRODUCT_OS_NAME" /> consigliata.</translation>
-<translation id="7784062550705119230">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_ALLOWLIST" />, la configurazione del criterio <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
+<translation id="7784062550705119230">Se per la policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_ALLOWLIST" />, la configurazione della policy <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questa policy saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="7788511847830146438">Per profilo</translation>
-<translation id="7790221177424764797">Questo criterio consente di stabilire se caricare o meno le regole del criterio SiteList di <ph name="IE_PRODUCT_NAME" />.
+<translation id="7790221177424764797">Questa policy consente di stabilire se caricare o meno le regole della policy SiteList di <ph name="IE_PRODUCT_NAME" />.
 
-Se questo criterio viene impostato su true, <ph name="PRODUCT_NAME" /> legge il criterio <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> per recuperare l'URL dell'elenco dei siti. Dopodiché, <ph name="PRODUCT_NAME" /> scarica l'elenco dei siti da questo URL e applica le regole come se fossero state configurate con il criterio <ph name="BROWSER_SWITCHER_URL_LIST_POLICY_NAME" />.
+Se questa policy viene impostata su true, <ph name="PRODUCT_NAME" /> legge la policy <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> per recuperare l'URL dell'elenco dei siti. Dopodiché, <ph name="PRODUCT_NAME" /> scarica l'elenco dei siti da questo URL e applica le regole come se fossero state configurate con la policy <ph name="BROWSER_SWITCHER_URL_LIST_POLICY_NAME" />.
 
-Se questo criterio viene impostato su false o se non viene configurato, <ph name="PRODUCT_NAME" /> non usa il criterio <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> come fonte di regole per il cambio di browser.
+Se questa policy viene impostata su false o se non viene configurata, <ph name="PRODUCT_NAME" /> non usa la policy <ph name="IEEM_SITELIST_POLICY" /> di <ph name="IE_PRODUCT_NAME" /> come fonte di regole per il cambio di browser.
 
-Per maggiori informazioni sul criterio <ph name="IEEM_SITELIST_POLICY" /> di Internet Explorer: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
+Per maggiori informazioni sulla policy <ph name="IEEM_SITELIST_POLICY" /> di Internet Explorer: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
 <translation id="7791215522423893512">Non consentire agli utenti di acquisire screenshot o registrazioni video</translation>
 <translation id="7792796937016596423">L'utente non potrà eseguire acquisizioni di pacchetti di rete</translation>
 <translation id="7795648856511126914">Il parser HTML sta per essere modificato per consentire l'inserimento di tag HTML aggiuntivi all'interno dell'elemento &lt;select&gt;. Questa policy consente di utilizzare il comportamento del parser HTML precedente fino alla versione M136.
@@ -9466,27 +9466,27 @@
 Se la policy viene attivata o se non viene configurata, il parser HTML consente l'uso di tag aggiuntivi all'interno dell'elemento &lt;select&gt;.
 
 Se viene disattivata, il parser HTML limita i tag che possono essere inseriti all'interno dell'elemento &lt;select&gt;.</translation>
-<translation id="7798441698807517880">Questo criterio è stato rimosso dalla versione 89 di <ph name="PRODUCT_NAME" /> perché<ph name="FLASH_PLUGIN_NAME" /> è stato ritirato.
+<translation id="7798441698807517880">Questa policy è stata rimossa dalla versione 89 di <ph name="PRODUCT_NAME" /> perché<ph name="FLASH_PLUGIN_NAME" /> è stata ritirata.
 
-      Se il criterio viene impostato su Vero, vengono eseguiti tutti i contenuti <ph name="FLASH_PLUGIN_NAME" /> incorporati nei siti web che consentono <ph name="FLASH_PLUGIN_NAME" />, inclusi i contenuti di altre origini o contenuti ridotti.
+      Se la policy viene impostata su True, vengono eseguiti tutti i contenuti <ph name="FLASH_PLUGIN_NAME" /> incorporati nei siti web che consentono <ph name="FLASH_PLUGIN_NAME" />, inclusi i contenuti di altre origini o contenuti ridotti.
 
-      Se il criterio viene impostato su Falso o se non viene configurato, i contenuti <ph name="FLASH_PLUGIN_NAME" /> di altre origini o i contenuti ridotti potrebbero essere bloccati.
+      Se la policy viene impostata su False o se non viene configurata, i contenuti <ph name="FLASH_PLUGIN_NAME" /> di altre origini o i contenuti ridotti potrebbero essere bloccati.
 
-      Nota: per stabilire quali siti web possono eseguire <ph name="FLASH_PLUGIN_NAME" />, controlla questi criteri: <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />, <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="PLUGINS_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
+      Nota: per stabilire quali siti web possono eseguire <ph name="FLASH_PLUGIN_NAME" />, controlla queste policy: <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />, <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="PLUGINS_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="7801163363326128751">Modifica il risparmio della modalità Risparmio memoria</translation>
 <translation id="7804859754080118507">Segnala gli eventi di intensità del segnale e di connessione di rete sui dispositivi registrati.
 
-      Se il criterio viene impostato su Falso o se non viene configurato, le informazioni non vengono segnalate.
-      Se è impostato su Vero, gli eventi di rete del dispositivo verranno segnalati.</translation>
+      Se la policy viene impostata su False o se non viene configurata, le informazioni non vengono segnalate.
+      Se è impostata su True, gli eventi di rete del dispositivo verranno segnalati.</translation>
 <translation id="780629758750905699">Consenti l'aggiunta di account Family Link al dispositivo</translation>
 <translation id="7807139251387225825">Elenco di tipi di dati che dovrebbero essere esclusi dalla sincronizzazione</translation>
 <translation id="781268256210530471">Impostazioni plug-in</translation>
 <translation id="7816326058023670173">Stesso secret per dispositivi di figli e genitori.</translation>
 <translation id="7818131573217430250">Impostazione stato predefinito modalità ad alto contrasto nella schermata di accesso</translation>
 <translation id="7821864705813933283">Consenti la visualizzazione della voce di menu per la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nel menu contestuale se supportata.</translation>
-<translation id="7823902813460802031">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> impedisce al dispositivo di avviare la modalità sviluppatore.
+<translation id="7823902813460802031">Se la policy viene impostata su Attivata, <ph name="PRODUCT_OS_NAME" /> impedisce al dispositivo di avviare la modalità sviluppatore.
 
-       Se il criterio viene impostato su Disattivato o se non viene configurato, la modalità sviluppatore continua a essere disponibile per il dispositivo.</translation>
+       Se la policy viene impostata su Disattivata o se non viene configurata, la modalità sviluppatore continua a essere disponibile per il dispositivo.</translation>
 <translation id="7824000841504721945">Disattiva gruppi atomici di criteri</translation>
 <translation id="782661371433719637">Non consentire a nessun sito di richiedere l'accesso di lettura di file e directory tramite l'API file system</translation>
 <translation id="7827127381981620448">App della piattaforma</translation>
@@ -9500,76 +9500,76 @@
 <translation id="7836591982756027878">Consenti l'accesso alla rete privata nell'API Direct Sockets su questi siti</translation>
 <translation id="7839124608155212387">La frequenza di raccolta della telemetria di utilizzo delle app sui dispositivi registrati per gli utenti affiliati. Il valore minimo consentito è 5 minuti.
 
-      Se il criterio non viene configurato, viene applicata la frequenza predefinita di 15 minuti.</translation>
-<translation id="7839180815400079700">Se il criterio <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_POLICY_NAME" /> viene impostato su Attivato, la configurazione di <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> consente di impostare la variazione giornaliera dei picchi energetici.
+      Se la policy non viene configurata, viene applicata la frequenza predefinita di 15 minuti.</translation>
+<translation id="7839180815400079700">Se la policy <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_POLICY_NAME" /> viene impostata su Attivata, la configurazione di <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> consente di impostare la variazione giornaliera dei picchi energetici.
 
-      Se il criterio non viene configurato, la variazione dei picchi energetici rimane disabilitata.
+      Se la policy non viene configurata, la variazione dei picchi energetici rimane disabilitata.
 
       I valori validi per il campo <ph name="MINUTE_FIELD_NAME" /> in <ph name="START_TIME_FIELD_NAME" />, <ph name="END_TIME_FIELD_NAME" /> e <ph name="CHARGE_START_TIME_FIELD_NAME" /> sono 0, 15, 30 e 45.</translation>
 <translation id="7840258755683573560">Attiva i clic automatici</translation>
-<translation id="784165160128690202">Se il criterio è impostato su None, la lente d'ingrandimento è disattivata nella schermata di accesso.
+<translation id="784165160128690202">Se la policy è impostata su None, la lente d'ingrandimento è disattivata nella schermata di accesso.
 
-Se imposti il criterio, gli utenti possono attivare o disattivare temporaneamente la lente d'ingrandimento. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, la lente d'ingrandimento torna allo stato originale.
+Se imposti la policy, gli utenti possono attivare o disattivare temporaneamente la lente d'ingrandimento. Quando la schermata di accesso viene ricaricata o rimane inattiva per un minuto, la lente d'ingrandimento torna allo stato originale.
 
-Se il criterio non è impostato, la lente d'ingrandimento è disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
+Se la policy non è impostata, la lente d'ingrandimento è disattivata nella schermata di accesso. Gli utenti possono attivarla in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti.
 
 Valori validi: • 0 = disattivata• 1 = attivata• 2 = riquadro d'ingrandimento ancorato attivato
 
-Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_SCREEN_MAGNIFIER_TYPE_POLICY_NAME" /> sostituisce questo criterio.</translation>
+Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_SCREEN_MAGNIFIER_TYPE_POLICY_NAME" /> sostituisce questa policy.</translation>
 <translation id="7841880500990419427">Versione TLS minima a cui retrocedere</translation>
 <translation id="7841883965249733328">Disattiva l'upgrade automatico del contenuto misto</translation>
 <translation id="7845130996290850593">Attiva Kerberos</translation>
 <translation id="7846952520291088817">URL per cui vengono esposti IP locali nei candidati ICE WebRTC</translation>
 <translation id="7848641140449742406">Impostazioni del sistema operativo</translation>
-<translation id="7850846808758624237">Se il criterio viene impostato su Attivato, la home page del precedente browser predefinito verrà importata alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, la home page non verrà importata alla prima esecuzione.
+<translation id="7850846808758624237">Se la policy viene impostata su Attivata, la home page del precedente browser predefinito verrà importata alla prima esecuzione. Se la policy viene impostata su Disattivata o se non viene configurata, la home page non verrà importata alla prima esecuzione.
 
-      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo della home page verrà selezionata o deselezionata in modo che corrisponda al valore del criterio.</translation>
-<translation id="7851455107499999468">Questo criterio controlla un'etichetta utilizzata per identificare un profilo a cui è stato eseguito l'accesso. Questa etichetta verrà visualizzata in varie posizioni per aiutare gli utenti a identificare il profilo, ad esempio accanto all'icona del profilo nella barra degli strumenti.
+      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo della home page verrà selezionata o deselezionata in modo che corrisponda al valore della policy.</translation>
+<translation id="7851455107499999468">Questa policy controlla un'etichetta utilizzata per identificare un profilo a cui è stato eseguito l'accesso. Questa etichetta verrà visualizzata in varie posizioni per aiutare gli utenti a identificare il profilo, ad esempio accanto all'icona del profilo nella barra degli strumenti.
 Questa etichetta verrà utilizzata anche come nome predefinito per i nuovi profili che possono essere modificati dagli utenti.
 
-Se questo criterio non viene configurato, verrà usata l'etichetta predefinita "Lavoro" o "Scuola".
+Se questa policy non viene configurata, verrà usata l'etichetta predefinita "Lavoro" o "Scuola".
 
-Se questo criterio viene impostato su "Etichetta il profilo come Lavoro (0)", verrà utilizzata l'etichetta "Lavoro".
+Se questa policy viene impostata su "Etichetta il profilo come Lavoro (0)", verrà utilizzata l'etichetta "Lavoro".
 
-Se questo criterio viene impostato su "Etichetta il profilo come Scuola (1)", verrà usata l'etichetta "Scuola".
+Se questa policy viene impostata su "Etichetta il profilo come Scuola (1)", verrà usata l'etichetta "Scuola".
 
-Se configurato, il criterio <ph name="CUSTOM_PROFILE_LABEL_POLICY_NAME" /> sostituirà questo criterio.</translation>
+Se configurata, la policy <ph name="CUSTOM_PROFILE_LABEL_POLICY_NAME" /> sostituirà questa policy.</translation>
 <translation id="7853140303943875314">Attiva l'esclusione dell'accesso automatico</translation>
 <translation id="7854187834842629068">Disattiva la dettatura nella schermata di accesso</translation>
 <translation id="7858352166858826505">Impostazioni per il modello di base locale di GenAI</translation>
 <translation id="7863947545897944083">Consente di attivare la funzione di accessibilità ad alto contrasto nella schermata di accesso.
 
-          Se questo criterio è impostato su true, l'alto contrasto sarà sempre attivato nella schermata di accesso.
+          Se questa policy è impostata su true, l'alto contrasto sarà sempre attivato nella schermata di accesso.
 
-          Se questo criterio è impostato su false, l'alto contrasto sarà sempre disattivato nella schermata di accesso.
+          Se questa policy è impostata su false, l'alto contrasto sarà sempre disattivato nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'alto contrasto è disattivato nella schermata di accesso, ma l'utente può attivarlo in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'alto contrasto è disattivato nella schermata di accesso, ma l'utente può attivarlo in qualsiasi momento.</translation>
 <translation id="7864539943188674973">Disattiva Bluetooth</translation>
 <translation id="7869986671709030417">Modalità di stampa predefinita delle immagini di sfondo</translation>
-<translation id="7872692545596413465">Se il criterio viene impostato su Attivato e se viene inserita una porta non standard (in altre parole una porta diversa da 80 o 443), questa viene inclusa nel Kerberos SPN generato.
+<translation id="7872692545596413465">Se la policy viene impostata su Attivata e se viene inserita una porta non standard (in altre parole una porta diversa da 80 o 443), questa viene inclusa nel Kerberos SPN generato.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, il Kerberos SPN generato non include una porta.</translation>
+Se la policy viene impostata su Disattivata o se non viene configurata, il Kerberos SPN generato non include una porta.</translation>
 <translation id="7877924399554599110">Attiva l'unione dei criteri relativi al cloud a livello di utente ai criteri a livello di macchina</translation>
-<translation id="7881421274383404138">L'impostazione di questo criterio consente di configurare le stampanti aziendali. Il formato corrisponde a quello del dizionario <ph name="PRINTERS_POLICY_NAME" />, con un campo <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base ai criteri <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> e <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />.
+<translation id="7881421274383404138">L'impostazione di questa policy consente di configurare le stampanti aziendali. Il formato corrisponde a quello del dizionario <ph name="PRINTERS_POLICY_NAME" />, con un campo <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base alle policy <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> e <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />.
 
-      Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi. È inteso come integrativo alla configurazione delle stampanti da parte dei singoli utenti.
+      Questa policy non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi. È intesa come integrativa alla configurazione delle stampanti da parte dei singoli utenti.
 
-      Se il criterio viene configurato, gli utenti non possono modificarlo.</translation>
+      Se la policy viene configurata, gli utenti non possono modificarla.</translation>
 <translation id="7882585827992171421">Questa norma è attiva soltanto in modalità retail.
 
       Consente di stabilire l'ID dell'estensione da utilizzare come salvaschermo nella schermata di accesso. L'estensione deve far parte dell'AppPack configurato per il dominio tramite la norma DeviceAppPack.</translation>
 <translation id="7882890448959833986">Elimina l'avviso di sistema operativo non supportato</translation>
 <translation id="788480874436328004">Disattiva il salvataggio delle password utilizzando Gestore delle password</translation>
-<translation id="7891884447851425349">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POLICY_NAME" /> consente di specificare l'URL del motore di ricerca utilizzato durante una ricerca predefinita. L'URL dovrebbe includere la stringa <ph name="SEARCH_TERM_MARKER" />, sostituita nella query dai termini di ricerca degli utenti.
+<translation id="7891884447851425349">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POLICY_NAME" /> consente di specificare l'URL del motore di ricerca utilizzato durante una ricerca predefinita. L'URL dovrebbe includere la stringa <ph name="SEARCH_TERM_MARKER" />, sostituita nella query dai termini di ricerca degli utenti.
 
       Puoi specificare l'URL di ricerca di Google come: <ph name="GOOGLE_SEARCH_URL" />.</translation>
-<translation id="7894185046683379696">La configurazione del criterio consente di specificare il periodo di tempo senza input utente in millisecondi, trascorso il quale lo schermo viene bloccato quando viene usata l'alimentazione CA o la batteria. I valori devono essere inferiori al ritardo di inattività impostato nel criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="7894185046683379696">La configurazione della policy consente di specificare il periodo di tempo senza input utente in millisecondi, trascorso il quale lo schermo viene bloccato quando viene usata l'alimentazione CA o la batteria. I valori devono essere inferiori al ritardo di inattività impostato nella policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
-      Se il criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non blocca lo schermo quando l'utente diventa inattivo. Se non viene configurato, viene usato un periodo di tempo predefinito.
+      Se la policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non blocca lo schermo quando l'utente diventa inattivo. Se non viene configurata, viene usato un periodo di tempo predefinito.
 
-      Consiglio: blocca lo schermo in caso di inattività attivando il blocco schermo in caso di sospensione e fai in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Usa questo criterio soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non vuoi che venga attivata la sospensione in caso di inattività.</translation>
+      Consiglio: blocca lo schermo in caso di inattività attivando il blocco schermo in caso di sospensione e fai in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Usa questa policy soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non vuoi che venga attivata la sospensione in caso di inattività.</translation>
 <translation id="7894964526545174973">Attiva comportamento standardizzato dello zoom del browser</translation>
 <translation id="7895553628261067384">Accesso remoto</translation>
 <translation id="7898807590879163195">Disattiva l'heartbeat dell'attività del dispositivo</translation>
@@ -9579,65 +9579,65 @@
 <translation id="7902040092815978832">Mostra la tastiera numerica per la password</translation>
 <translation id="7904434413881624417">Elenco di pattern URL. Le richieste avviate da siti web pubblicati da origini corrispondenti non sono soggette ai controlli di <ph name="PRIVATE_NETWORK_ACCESS" />.
 
-          Se non viene configurato, questo criterio considera l'elenco come vuoto.
+          Se non viene configurata, questa policy considera l'elenco come vuoto.
 
-          Per le origini non coperte dai pattern specificati qui, il valore predefinito globale viene utilizzato dal criterio <ph name="INSECURE_PRIVATE_NETWORK_REQUESTS_ALLOWED_POLICY_NAME" />, se configurato, o altrimenti dalla configurazione personale dell'utente.
+          Per le origini non coperte dai pattern specificati qui, il valore predefinito globale viene utilizzato dalla policy <ph name="INSECURE_PRIVATE_NETWORK_REQUESTS_ALLOWED_POLICY_NAME" />, se configurata, o altrimenti dalla configurazione personale dell'utente.
 
           Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation>
-<translation id="7904584382309857420">Questo criterio è stato rimosso da M121. Consente di attivare e disattivare l'attestazione remota per il dispositivo, ma questa è attivata per impostazione predefinita.
+<translation id="7904584382309857420">Questa policy è stata rimossa da M121. Consente di attivare e disattivare l'attestazione remota per il dispositivo, ma questa è attivata per impostazione predefinita.
 
-Se il criterio viene impostato su Attivato, l'attestazione remota è consentita per il dispositivo. Un certificato viene generato e caricato automaticamente sul server di gestione del dispositivo.
+Se la policy viene impostata su Attivata, l'attestazione remota è consentita per il dispositivo. Un certificato viene generato e caricato automaticamente sul server di gestione del dispositivo.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, non viene generato alcun certificato e le chiamate a <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> non vengono eseguite correttamente.</translation>
+Se la policy viene impostata su Disattivata o se non viene configurata, non viene generato alcun certificato e le chiamate a <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> non vengono eseguite correttamente.</translation>
 <translation id="7906983682927840536">Recupera la durata del keepalive alla chiusura</translation>
-<translation id="7908384265697653397">Il periodo di tempo, in giorni, trascorso il quale l'utente viene disconnesso dall'account se la versione di <ph name="PRODUCT_OS_NAME" /> è precedente a quella specificata nel criterio <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />.</translation>
+<translation id="7908384265697653397">Il periodo di tempo, in giorni, trascorso il quale l'utente viene disconnesso dall'account se la versione di <ph name="PRODUCT_OS_NAME" /> è precedente a quella specificata nella policy <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />.</translation>
 <translation id="7909751052609510518">Processi di stampa (supportati dalla versione 129)</translation>
 <translation id="7911685775490889216">Consente di configurare il tempo di visualizzazione in secondi di un'immagine quando il salvaschermo per la schermata di blocco ha diverse immagini da visualizzare.
 
-I valori validi sono compresi tra 1 secondo e 9999 secondi. Se il criterio non viene configurato, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 60 secondi.
+I valori validi sono compresi tra 1 secondo e 9999 secondi. Se la policy non viene configurata, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 60 secondi.
 
-Questo criterio non avrà alcun effetto se il criterio <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" /> viene impostato su false.</translation>
+Questa policy non avrà alcun effetto se la policy <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" /> viene impostata su false.</translation>
 <translation id="7912255076272890813">Configura tipi di app/estensioni consentiti</translation>
 <translation id="791267408364877739">Mostra avvisi di sicurezza quando vengono usati flag della riga di comando potenzialmente pericolosi</translation>
 <translation id="7919665519909231619">Consenti l'attivazione della funzionalità della lista della spesa</translation>
 <translation id="7922358664346625612">Mantieni l'ultima scheda aperta in Chrome.</translation>
 <translation id="7923734850959347297">Impostazioni del salvaschermo</translation>
 <translation id="7924321157669251966">La percentuale di luminosità dello schermo quando viene usata la batteria.</translation>
-<translation id="7925224837072026018">La configurazione del criterio consente alle estensioni o alle app per Android di accedere alle chiavi aziendali. Le chiavi sono destinate unicamente all'utilizzo aziendale se vengono generate tramite l'API chrome.enterprise.platformKeys su un account gestito. Gli utenti non possono consentire o revocare l'accesso delle estensioni o delle app per Android alle chiavi aziendali.
+<translation id="7925224837072026018">La configurazione della policy consente alle estensioni o alle app per Android di accedere alle chiavi aziendali. Le chiavi sono destinate unicamente all'utilizzo aziendale se vengono generate tramite l'API chrome.enterprise.platformKeys su un account gestito. Gli utenti non possono consentire o revocare l'accesso delle estensioni o delle app per Android alle chiavi aziendali.
 
-      Per impostazione predefinita, un'estensione o un'app per Android non può utilizzare una chiave destinata all'uso aziendale, il che equivale a impostare il criterio allowCorporateKeyUsage su Falso per tale estensione. Solo se il criterio allowCorporateKeyUsage viene impostato su Vero per un'estensione o un'app per Android può utilizzare qualsiasi chiave della piattaforma contrassegnata per uso aziendale per firmare dati arbitrari. L'autorizzazione viene concessa solo se l'estensione o l'app per Android viene considerata protetta dall'accesso alla chiave di potenziali utenti malintenzionati.</translation>
+      Per impostazione predefinita, un'estensione o un'app per Android non può utilizzare una chiave destinata all'uso aziendale, il che equivale a impostare la policy allowCorporateKeyUsage su False per tale estensione. Solo se la policy allowCorporateKeyUsage viene impostata su True per un'estensione o un'app per Android può utilizzare qualsiasi chiave della piattaforma contrassegnata per uso aziendale per firmare dati arbitrari. L'autorizzazione viene concessa solo se l'estensione o l'app per Android viene considerata protetta dall'accesso alla chiave di potenziali utenti malintenzionati.</translation>
 <translation id="7930383470029339167">ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes è una funzionalità di Chrome progettata per rendere uniforme il comportamento di rendering degli iframe multiorigine tra più processi e nello stesso processo. Per ulteriori informazioni sulla limitazione relativa a più processi e allo stesso processo, visita la pagina https://chromestatus.com/feature/5175574929080320.
 
-Questo criterio aziendale consente agli amministratori di stabilire se gli utenti possono attivare o meno la limitazione aggiuntiva. Se il criterio viene impostato su disabled, non è possibile attivare la limitazione. Se il criterio viene impostato su enabled o se non viene configurato, l'utente può attivare la limitazione oppure quest'ultima potrebbe essere attivata tramite varianti di Chrome.</translation>
+Questa policy aziendale consente agli amministratori di stabilire se gli utenti possono attivare o meno la limitazione aggiuntiva. Se la policy viene impostata su disabled, non è possibile attivare la limitazione. Se la policy viene impostata su enabled o se non viene configurata, l'utente può attivare la limitazione oppure quest'ultima potrebbe essere attivata tramite varianti di Chrome.</translation>
 <translation id="793188693675675950">Disabilita l'importazione della home page alla prima esecuzione</translation>
-<translation id="7932017046032784156">Se il criterio viene impostato su Attivato, verrà mostrata l'icona Trasmetti nella barra degli strumenti o nel menu extra e gli utenti non potranno rimuoverla.
+<translation id="7932017046032784156">Se la policy viene impostata su Attivata, verrà mostrata l'icona Trasmetti nella barra degli strumenti o nel menu extra e gli utenti non potranno rimuoverla.
 
-Se il criterio viene impostato su Disattivato o se non viene configurato, gli utenti potranno bloccare o rimuovere l'icona tramite il relativo menu contestuale.
+Se la policy viene impostata su Disattivata o se non viene configurata, gli utenti potranno bloccare o rimuovere l'icona tramite il relativo menu contestuale.
 
-Se il criterio <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> viene impostato su Disattivato, il valore di tale criterio non avrà effetto e l'icona della barra degli strumenti non verrà mostrata.</translation>
+Se la policy <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> viene impostata su Disattivata, il valore di tale policy non avrà effetto e l'icona della barra degli strumenti non verrà mostrata.</translation>
 <translation id="7933141401888114454">Attivazione della creazione di utenti controllati</translation>
 <translation id="793473937901685727">Imposta la disponibilità dei certificati per le app ARC</translation>
 <translation id="7936302526928951356">La stringa user agent non bloccherà la versione principale.</translation>
 <translation id="7937766917976512374">Consenti o nega acquisizione video</translation>
-<translation id="7937825205289116563">Se il criterio viene attivato o se non viene configurato, è possibile utilizzare firme ad hoc per l'applicazione nativa creata durante l'installazione di un'applicazione web progressiva (PWA). In questo modo, ogni applicazione installata ha un'identità univoca per i componenti di sistema di <ph name="MAC_OS_NAME" />.
+<translation id="7937825205289116563">Se la policy viene attivata o se non viene configurata, è possibile utilizzare firme ad hoc per l'applicazione nativa creata durante l'installazione di un'applicazione web progressiva (PWA). In questo modo, ogni applicazione installata ha un'identità univoca per i componenti di sistema di <ph name="MAC_OS_NAME" />.
 
-Se il criterio viene disattivato, tutte le applicazioni native create durante l'installazione di applicazioni web progressive (PWA) avranno la stessa identità. Questo può interferire con la funzionalità di <ph name="MAC_OS_NAME" />.
+Se la policy viene disattivata, tutte le applicazioni native create durante l'installazione di applicazioni web progressive (PWA) avranno la stessa identità. Questo può interferire con la funzionalità di <ph name="MAC_OS_NAME" />.
 
-Disattiva il criterio solo se utilizzi una soluzione di sicurezza degli endpoint che blocca le applicazioni con una firma ad hoc.</translation>
+Disattiva la policy solo se utilizzi una soluzione di sicurezza degli endpoint che blocca le applicazioni con una firma ad hoc.</translation>
 <translation id="7941528208359969119">Consenti l'esecuzione dei controlli <ph name="OCSP_CRL_LABEL" /> online</translation>
 <translation id="7941975817681987555">Non prevedere le azioni di rete su qualsiasi connessione di rete</translation>
 <translation id="794447754389837404">Blocca l'accesso alla rete privata nell'API Direct Sockets su questi siti</translation>
 <translation id="7945445169067895719">Attiva il blocco quando il dispositivo viene sospeso o il coperchio viene chiuso</translation>
-<translation id="7946350455013548764">Se il criterio viene impostato su 3, i siti web possono richiedere l'accesso ai dispositivi HID. Se il criterio viene impostato su 2, viene negato l'accesso ai dispositivi HID.
+<translation id="7946350455013548764">Se la policy viene impostata su 3, i siti web possono richiedere l'accesso ai dispositivi HID. Se la policy viene impostata su 2, viene negato l'accesso ai dispositivi HID.
 
-      Se non viene configurato, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.
+      Se non viene configurata, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.
 
-      È possibile eseguire l'override del criterio per pattern <ph name="URL_LABEL" /> specifici utilizzando i criteri <ph name="WEB_HID_ASK_FOR_URLS_POLICY_NAME" /> e <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
+      È possibile eseguire l'override della policy per pattern <ph name="URL_LABEL" /> specifici utilizzando le policy <ph name="WEB_HID_ASK_FOR_URLS_POLICY_NAME" /> e <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="7952007677054834789">Consente di configurare le pagine da caricare all'avvio, la pagina iniziale predefinita e la pagina Nuova scheda predefinita in <ph name="PRODUCT_NAME" />; inoltre, impedisce agli utenti di modificare queste impostazioni.
 
       Le impostazioni della pagina iniziale dell'utente sono completamente bloccate se hai selezionato la pagina iniziale come pagina Nuova scheda oppure se hai specificato un URL che funga da pagina iniziale. Se non specifichi l'URL della pagina iniziale, l'utente può ancora impostare la pagina iniziale come pagina Nuova scheda se specifica "chrome://newtab".
 
-      Il criterio "URL da aprire all'avvio" viene ignorato a meno che non selezioni "Apri un elenco di URL" in "Azione all'avvio".</translation>
+      La policy "URL da aprire all'avvio" viene ignorata a meno che non selezioni "Apri un elenco di URL" in "Azione all'avvio".</translation>
 <translation id="7952958573604504839">La norma è obsoleta in M48 in favore di <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" /> ed è rimossa in M54.
 
       Attiva la previsione di rete in <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare questa impostazione.
@@ -9651,107 +9651,107 @@
 <translation id="7958537754689366707">Richiedi inserimento della password ogni dodici ore</translation>
 <translation id="7959035883875301444">Controlla l'utilizzo di JIT di JavaScript</translation>
 <translation id="7961779417826583251">Disattiva l'applicazione di Certificate Transparency per un elenco di autorità di certificazione precedenti</translation>
-<translation id="7962093600142350905">Questo criterio controlla se vengono mostrate agli utenti eventuali stampanti Privet disponibili nella finestra di dialogo dell'anteprima di stampa.
-      Se viene impostato su Attivato, le stampanti Privet disponibili vengono mostrate.
-      Se viene impostato su Disattivato o se non viene configurato, le stampanti Privet non vengono mostrate nell'anteprima di stampa, poiché questo metodo di stampa è deprecato.</translation>
+<translation id="7962093600142350905">Questa policy controlla se vengono mostrate agli utenti eventuali stampanti Privet disponibili nella finestra di dialogo dell'anteprima di stampa.
+      Se viene impostata su Attivata, le stampanti Privet disponibili vengono mostrate.
+      Se viene impostata su Disattivata o se non viene configurata, le stampanti Privet non vengono mostrate nell'anteprima di stampa, poiché questo metodo di stampa è deprecato.</translation>
 <translation id="7962516520649791537">In base a https://w3c.github.io/ServiceWorker/#control-and-use-worker-client,
 i worker dovrebbero ereditare i controller per l'URL blob.  Tuttavia, il codice esistente
 consente solo a DedicatedWorker di ereditare il controller, mentre SharedWorker
 non lo eredita.
 
-Se il criterio viene attivato o se non viene configurato,
+Se la policy viene attivata o se non viene configurata,
 <ph name="PRODUCT_NAME" /> eredita il controller
 se viene utilizzato un URL blob come URL di SharedWorker.
 
-Se il criterio viene disattivato, il comportamento non viene allineato alla
+Se la policy viene disattivata, il comportamento non viene allineato alla
 specifica attuale.
 
-Questo criterio è stato pensato per essere temporaneo e verrà rimosso in futuro.</translation>
+Questa policy è stata pensata per essere temporanea e verrà rimossa in futuro.</translation>
 <translation id="7969865441622729072">Attiva tutti i suoni in modalità Niente distrazioni.</translation>
 <translation id="7970660709107174905">Impostazioni di partizionamento dello spazio di archiviazione di terze parti</translation>
 <translation id="7972223739742725350">Non abilitare l'API Save and Share per il controllo di <ph name="PRODUCT_OS_NAME" /> di terze parti.</translation>
 <translation id="7972642710812569707">Forza la riattivazione di WebSQL in contesti di terze parti.</translation>
-<translation id="7973609468423251675">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="7973609468423251675">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale lo schermo viene oscurato quando viene usata la batteria.
 
-          Se questo criterio viene impostato su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> oscuri lo schermo.
+          Se questa policy viene impostata su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> oscuri lo schermo.
 
-          Se questo criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non oscura lo schermo quando l'utente diventa inattivo.
+          Se questa policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non oscura lo schermo quando l'utente diventa inattivo.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di disattivazione dello schermo (se impostato) e al ritardo di inattività.</translation>
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di disattivazione dello schermo (se impostato) e al ritardo di inattività.</translation>
 <translation id="7974114691960514888">Questa norma non è più supportata. Consente di attivare l'utilizzo di server relay e STUN durante la connessione a un client remoto. Se questa impostazione viene attivata, questo computer potrà rilevare i computer host remoti e collegarsi a essi anche se sono separati da un firewall. Se questa impostazione viene disattivata e le connessioni UDP in uscita vengono filtrate dal firewall, questo computer potrà collegarsi ai computer host soltanto all'interno della rete locale.</translation>
-<translation id="7976103461034266553">Se il criterio viene impostato su Enabled, la funzione JavaScript setTimeout() con un timeout di 0 ms non verrà clampata su 1 ms.
-          Se il criterio viene impostato su Disabled, la funzione JavaScript setTimeout() con un timeout di 0 ms verrà clampata su 1 ms.
-          Se il criterio non viene configurato, viene usato il comportamento predefinito del browser per clampare la funzione setTimeout().
+<translation id="7976103461034266553">Se la policy viene impostata su Enabled, la funzione JavaScript setTimeout() con un timeout di 0 ms non verrà clampata su 1 ms.
+          Se la policy viene impostata su Disabled, la funzione JavaScript setTimeout() con un timeout di 0 ms verrà clampata su 1 ms.
+          Se la policy non viene configurata, viene usato il comportamento predefinito del browser per clampare la funzione setTimeout().
 
           Si tratta di una funzionalità conforme agli standard web, ma potrebbe modificare l'ordine delle attività su una pagina web, causando comportamenti imprevisti sui siti che dipendono in qualche misura da un ordine specifico. Potrebbe anche incidere sui siti che utilizzano spesso la funzione setTimeout() con timeout di 0 ms, ad esempio causando un aumento del carico della CPU.
 
-          Per gli utenti per i quali il criterio non viene configurato, Chrome implementerà gradualmente la modifica sul canale stabile.
+          Per gli utenti per i quali la policy non viene configurata, Chrome implementerà gradualmente la modifica sul canale stabile.
 
-          Questo criterio è stato rimosso in Chrome 110.
+          Questa policy è stata rimossa in Chrome 110.
                                         </translation>
 <translation id="7976157349247117979">Nome della destinazione di <ph name="PRODUCT_NAME" /></translation>
 <translation id="7985242821674907985"><ph name="PRODUCT_NAME" /></translation>
 <translation id="7985781946183471651">Glanceables su <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7986473886676689183">Attiva la generazione di report Android</translation>
 <translation id="7990280274626154329">Attiva <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /></translation>
-<translation id="7991022023019679916">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="7991022023019679916">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale lo schermo viene disattivato quando viene usata la corrente alternata.
 
-          Se questo criterio viene impostato su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> disattivi lo schermo.
+          Se questa policy viene impostata su un valore maggiore di zero, specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> disattivi lo schermo.
 
-          Se questo criterio viene impostato su zero, <ph name="PRODUCT_OS_NAME" /> non disattiva lo schermo quando l'utente diventa inattivo.
+          Se questa policy viene impostata su zero, <ph name="PRODUCT_OS_NAME" /> non disattiva lo schermo quando l'utente diventa inattivo.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il valore del criterio deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.</translation>
+          Il valore della policy deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di inattività.</translation>
 <translation id="7992613144342460685">Concedere l'autorizzazione per il posizionamento delle finestre su questi siti</translation>
 <translation id="7995610550667275367">Scansione (supportata dalla versione 87)</translation>
-<translation id="7999023147219236247">Criterio per le richieste di concessione delle autorizzazioni delle app. PERMISSION_POLICY_UNSPECIFIED: criterio non specificato. Se per un'autorizzazione non viene specificato alcun criterio ad alcun livello, viene usato per impostazione predefinita il comportamento "PROMPT". PROMPT: viene chiesto all'utente di concedere un'autorizzazione. GRANT: viene concessa automaticamente un'autorizzazione. DENY: viene negata automaticamente un'autorizzazione.</translation>
+<translation id="7999023147219236247">Criterio per le richieste di concessione delle autorizzazioni delle app. PERMISSION_POLICY_UNSPECIFIED: policy non specificata. Se per un'autorizzazione non viene specificata alcuna policy ad alcun livello, viene usato per impostazione predefinita il comportamento "PROMPT". PROMPT: viene chiesto all'utente di concedere un'autorizzazione. GRANT: viene concessa automaticamente un'autorizzazione. DENY: viene negata automaticamente un'autorizzazione.</translation>
 <translation id="7999336306414770162">Disattiva i report sulle informazioni VPD del dispositivo</translation>
 <translation id="7999818120028621358">Attiva la generazione di rapporti sugli eventi di prevenzione di fughe di dati</translation>
 <translation id="8001701200415781021">Limita gli Account Google che è possibile impostare come account principali del browser in <ph name="PRODUCT_NAME" /></translation>
 <translation id="8004582292198964060">Browser</translation>
-<translation id="8005143535239983809">Questo criterio consente di stabilire se il browser può o meno memorizzare automaticamente le password sui siti web e salvarle nel gestore delle password integrato. Non consente di limitare l'accesso o di modificare i contenuti delle password salvate nel gestore delle password e potenzialmente sincronizzate nel profilo dell'Account Google e su <ph name="ANDROID_NAME" />.
+<translation id="8005143535239983809">Questa policy consente di stabilire se il browser può o meno memorizzare automaticamente le password sui siti web e salvarle nel gestore delle password integrato. Non consente di limitare l'accesso o di modificare i contenuti delle password salvate nel gestore delle password e potenzialmente sincronizzate nel profilo dell'Account Google e su <ph name="ANDROID_NAME" />.
 
-Se il criterio viene attivato, gli utenti possono impostare <ph name="PRODUCT_NAME" /> in modo che memorizzi le password e le fornisca all'accesso successivo a un sito.
+Se la policy viene attivata, gli utenti possono impostare <ph name="PRODUCT_NAME" /> in modo che memorizzi le password e le fornisca all'accesso successivo a un sito.
 
-Se il criterio viene disattivato, gli utenti non possono salvare nuove password, ma quelle salvate in precedenza restano attive.
+Se la policy viene disattivata, gli utenti non possono salvare nuove password, ma quelle salvate in precedenza restano attive.
 
-Se il criterio viene configurato, gli utenti non possono modificarlo in <ph name="PRODUCT_NAME" />. Se non viene configurato, gli utenti possono disattivare il salvataggio delle password.</translation>
+Se la policy viene configurata, gli utenti non possono modificarla in <ph name="PRODUCT_NAME" />. Se non viene configurata, gli utenti possono disattivare il salvataggio delle password.</translation>
 <translation id="800595420827930383">Utilizza lo strumento di verifica dei certificati della piattaforma precedente</translation>
-<translation id="8006219716745491366">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_ALTERNATE_URLS_POLICY_NAME" /> consente di specificare un elenco di URL alternativi per l'estrazione dei termini di ricerca dal motore di ricerca. Gli URL devono includere la stringa <ph name="SEARCH_TERM_MARKER" />.
+<translation id="8006219716745491366">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_ALTERNATE_URLS_POLICY_NAME" /> consente di specificare un elenco di URL alternativi per l'estrazione dei termini di ricerca dal motore di ricerca. Gli URL devono includere la stringa <ph name="SEARCH_TERM_MARKER" />.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ALTERNATE_URLS_POLICY_NAME" /> non viene configurato, per l'estrazione dei termini di ricerca non vengono utilizzati URL alternativi.</translation>
-<translation id="8006921530139404577">Se il criterio viene disattivato, l'interfaccia utente relativa alla connessione (ad esempio, la finestra per disconnettersi) non verrà mostrata per le connessioni di accesso remoto non in modalità Curtain. Il criterio non riguarda le sessioni di accesso remoto in modalità Curtain e le sessioni di assistenza in remoto.
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ALTERNATE_URLS_POLICY_NAME" /> non viene configurata, per l'estrazione dei termini di ricerca non vengono utilizzati URL alternativi.</translation>
+<translation id="8006921530139404577">Se la policy viene disattivata, l'interfaccia utente relativa alla connessione (ad esempio, la finestra per disconnettersi) non verrà mostrata per le connessioni di accesso remoto non in modalità Curtain. La policy non riguarda le sessioni di accesso remoto in modalità Curtain e le sessioni di assistenza in remoto.
 
-          Il criterio non ha effetto se impostato su True, se non viene impostato o se viene lasciato vuoto.</translation>
+          La policy non ha effetto se impostata su True, se non viene impostata o se viene lasciata vuota.</translation>
 <translation id="8008421342605619236">Consente di configurare i criteri per i messaggi nativi. Gli host di messaggi nativi bloccati non saranno consentiti se non vengono autorizzati.</translation>
 <translation id="8011935490612940798">Controlla la funzionalità di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8013646845541206453">Utilizza uno strumento di verifica dei certificati</translation>
-<translation id="8013739405949922317">Questa impostazione è deprecata. Usa invece il criterio <ph name="LACROS_AVAILABILITY_POLICY_NAME" />.
+<translation id="8013739405949922317">Questa impostazione è deprecata. Usa invece la policy <ph name="LACROS_AVAILABILITY_POLICY_NAME" />.
 
-      Se questo criterio viene impostato su Disattivato o se non viene configurato, l'utente non può usare <ph name="LACROS_NAME" />.
+      Se questa policy viene impostata su Disattivata o se non viene configurata, l'utente non può usare <ph name="LACROS_NAME" />.
 
-      Se questo criterio viene impostato su Attivato, l'utente può usare il browser <ph name="LACROS_NAME" />.</translation>
+      Se questa policy viene impostata su Attivata, l'utente può usare il browser <ph name="LACROS_NAME" />.</translation>
 <translation id="8016036090567963459">Non consentire a Chrome di riprodurre automaticamente i contenuti multimediali</translation>
 <translation id="802147957407376460">Ruota lo schermo di 0°</translation>
 <translation id="8021777486638359878">Considera l'utente inattivo durante la riproduzione di audio</translation>
 <translation id="8022597231371051452">Lista consentita dei report sulla telemetria dei siti web</translation>
 <translation id="8022909529579794519">Questa impostazione consente di configurare il browser <ph name="LACROS_NAME" /> da utilizzare.
 
-Se il criterio viene impostato su <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" />, l'utente può decidere quale browser <ph name="LACROS_NAME" /> caricare: il programma binario della partizione <ph name="LACROS_ROOTFS_NAME" /> o <ph name="LACROS_STATEFUL_NAME" />.
+Se la policy viene impostata su <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" />, l'utente può decidere quale browser <ph name="LACROS_NAME" /> caricare: il programma binario della partizione <ph name="LACROS_ROOTFS_NAME" /> o <ph name="LACROS_STATEFUL_NAME" />.
 Se l'utente non ha impostato alcuna preferenza, verrà scelto il programma binario con la versione più recente.
 
-Se il criterio viene impostato su <ph name="LACROS_SELECTION_ROOTFS_VALUE" />, verrà caricato sempre il programma binario <ph name="LACROS_ROOTFS_NAME" /> del browser <ph name="LACROS_NAME" />.
+Se la policy viene impostata su <ph name="LACROS_SELECTION_ROOTFS_VALUE" />, verrà caricato sempre il programma binario <ph name="LACROS_ROOTFS_NAME" /> del browser <ph name="LACROS_NAME" />.
 
-Se il criterio non viene configurato, il valore predefinito è <ph name="LACROS_SELECTION_ROOTFS_VALUE" /> per gli utenti gestiti a livello aziendale e <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" /> per gli utenti non gestiti.
+Se la policy non viene configurata, il valore predefinito è <ph name="LACROS_SELECTION_ROOTFS_VALUE" /> per gli utenti gestiti a livello aziendale e <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" /> per gli utenti non gestiti.
 
-Tieni presente che la modifica del valore del criterio può causare la perdita di dati del browser <ph name="LACROS_NAME" /> se la versione impostata è precedente alla versione attuale. Ad esempio, se il criterio cambia da <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" /> a <ph name="LACROS_SELECTION_ROOTFS_VALUE" /> e la prima versione è stata aggiornata. Oppure se <ph name="PRODUCT_OS_NAME" /> è stato aggiornato insieme al browser <ph name="LACROS_ROOTFS_NAME" /> <ph name="LACROS_NAME" /> e la versione <ph name="LACROS_STATEFUL_NAME" /> non è stata ancora aggiornata.
+Tieni presente che la modifica del valore della policy può causare la perdita di dati del browser <ph name="LACROS_NAME" /> se la versione impostata è precedente alla versione attuale. Ad esempio, se la policy cambia da <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" /> a <ph name="LACROS_SELECTION_ROOTFS_VALUE" /> e la prima versione è stata aggiornata. Oppure se <ph name="PRODUCT_OS_NAME" /> è stato aggiornato insieme al browser <ph name="LACROS_ROOTFS_NAME" /> <ph name="LACROS_NAME" /> e la versione <ph name="LACROS_STATEFUL_NAME" /> non è stata ancora aggiornata.
 In questo tipo di scenari non è garantita la corretta migrazione dei dati.
 
 È sicuro usare l'opzione <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" /> o <ph name="LACROS_SELECTION_ROOTFS_VALUE" />. Va bene anche passare da <ph name="LACROS_SELECTION_ROOTFS_VALUE" /> a <ph name="LACROS_SELECTION_USER_CHOICE_VALUE" />.</translation>
@@ -9783,34 +9783,34 @@
 questa API senza una precedente attivazione dall'utente, come descritto nella sezione
 <ph name="AUTOMATIC_FULLSCREEN_HELP_URL" />.
 
-Questo criterio sostituisce le impostazioni personali degli utenti e impedisce alle origini corrispondenti
+Questa policy sostituisce le impostazioni personali degli utenti e impedisce alle origini corrispondenti
 di chiamare l'API senza una precedente attivazione dall'utente.
 
 Per informazioni dettagliate sui pattern URL validi, visita la pagina
 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
 I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-Le origini che corrispondono a pattern di criteri sia bloccati sia consentiti verranno bloccate.
-Le origini non specificate dal criterio o dalle impostazioni utente richiederanno la precedente
+Le origini che corrispondono a pattern di policy sia bloccati sia consentiti verranno bloccate.
+Le origini non specificate dalla policy o dalle impostazioni utente richiederanno la precedente
 attivazione dall'utente per chiamare questa API.</translation>
-<translation id="8071371098891664137">Se per il criterio <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLOCKLIST" />, la configurazione del criterio <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. L'utente avrà a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questo criterio. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
-<translation id="8078297389450285582">Se il criterio viene impostato su Attivato o se non viene configurato, viene attivato il modello di oscuramento smart e potrebbe essere ritardato l'oscuramento dello schermo. Quando viene ritardato il tempo, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo impostato in origine.
+<translation id="8071371098891664137">Se per la policy <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLOCKLIST" />, la configurazione della policy <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. L'utente avrà a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questa policy. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
+<translation id="8078297389450285582">Se la policy viene impostata su Attivata o se non viene configurata, viene attivato il modello di oscuramento smart e potrebbe essere ritardato l'oscuramento dello schermo. Quando viene ritardato il tempo, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo impostato in origine.
 
-      Se il criterio viene impostato su Disattivato, il modello di oscuramento smart non inciderà sull'oscuramento dello schermo.</translation>
+      Se la policy viene impostata su Disattivata, il modello di oscuramento smart non inciderà sull'oscuramento dello schermo.</translation>
 <translation id="8078540622602481084">Questa funzionalità consente di utilizzare codifiche dei contenuti specifiche dei dizionari nell'intestazione della richiesta Accept-Encoding ("sbr" e "zst-d") quando sono disponibili i dizionari.
 
-Se il criterio viene attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> accetterà i contenuti web che usano la funzionalità di trasporto dei dizionari di compressione.
-Se il criterio viene disattivato, la funzionalità di trasporto dei dizionari di compressione viene disattivata.</translation>
-<translation id="8079544387901313374">Tieni presente che questo criterio è stato deprecato e rimosso nella versione 88 di <ph name="PRODUCT_OS_NAME" />. Le sessioni pubbliche non sono più supportate. Utilizza invece <ph name="DEVICE_LOCAL_ACCOUNTS_POLICY_NAME" /> per configurare le sessioni Ospite gestite.
-      Se il criterio è impostato su False, le sessioni Ospite gestite si comporteranno come documentato all'indirizzo https://support.google.com/chrome/a/answer/3017014, la "Sessione pubblica" standard.
+Se la policy viene attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> accetterà i contenuti web che usano la funzionalità di trasporto dei dizionari di compressione.
+Se la policy viene disattivata, la funzionalità di trasporto dei dizionari di compressione viene disattivata.</translation>
+<translation id="8079544387901313374">Tieni presente che questa policy è stata deprecata e rimossa nella versione 88 di <ph name="PRODUCT_OS_NAME" />. Le sessioni pubbliche non sono più supportate. Utilizza invece <ph name="DEVICE_LOCAL_ACCOUNTS_POLICY_NAME" /> per configurare le sessioni Ospite gestite.
+      Se la policy è impostata su False, le sessioni Ospite gestite si comporteranno come documentato all'indirizzo https://support.google.com/chrome/a/answer/3017014, la "Sessione pubblica" standard.
 
-      Se il criterio è impostato su True o non viene impostato, le sessioni Ospite gestite assumeranno il comportamento "Sessione gestita" che revoca molte delle restrizioni poste nelle "Sessioni pubbliche" normali.
+      Se la policy è impostata su True o non viene impostata, le sessioni Ospite gestite assumeranno il comportamento "Sessione gestita" che revoca molte delle restrizioni poste nelle "Sessioni pubbliche" normali.
 
-      Se questo criterio viene impostato, l'utente non può modificarlo o ignorarlo.</translation>
+      Se questa policy viene impostata, l'utente non può modificarla o ignorarla.</translation>
 <translation id="8080200590486938727">Disattiva la ricerca dei plug-in</translation>
-<translation id="8086746212954621799">Se questo criterio viene impostato su True, gli aggiornamenti automatici vengono disattivati.
+<translation id="8086746212954621799">Se questa policy viene impostata su True, gli aggiornamenti automatici vengono disattivati.
 
-Se questo criterio non viene configurato o viene impostato su False, i <ph name="PRODUCT_OS_NAME" /> controllano automaticamente la disponibilità di aggiornamenti.
+Se questa policy non viene configurata o viene impostata su False, i <ph name="PRODUCT_OS_NAME" /> controllano automaticamente la disponibilità di aggiornamenti.
 
 Avviso: è consigliabile mantenere attivati gli aggiornamenti automatici per consentire agli utenti di ricevere gli aggiornamenti software e le correzioni di sicurezza fondamentali. Disattivare gli aggiornamenti automatici potrebbe mettere a rischio gli utenti.</translation>
 <translation id="8089200718228084417">Attiva stampa Privet deprecata</translation>
@@ -9832,15 +9832,15 @@
 <translation id="8109762054721090517">Modello per l'<ph name="IPP_ATTRIBUTE" /> <ph name="INTERNET_PRINTING_PROTOCOL" /> <ph name="CLIENT_NAME_IPP_ATTRIBUTE" /></translation>
 <translation id="8111331908123507719">Consente di configurare il tempo di inattività del dispositivo in secondi che deve trascorrere prima di mostrare il salvaschermo per la schermata di blocco.
 
-I valori validi sono compresi tra 1 secondo e 9999 secondi. Se il criterio non viene configurato, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 7 secondi.
+I valori validi sono compresi tra 1 secondo e 9999 secondi. Se la policy non viene configurata, <ph name="PRODUCT_OS_NAME" /> usa il valore predefinito di 7 secondi.
 
-Questo criterio non avrà alcun effetto se il criterio <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" /> viene impostato su false.</translation>
+Questa policy non avrà alcun effetto se la policy <ph name="SCREENSAVER_LOCK_SCREEN_ENABLED_POLICY_NAME" /> viene impostata su false.</translation>
 <translation id="8113731369695819720">Disattiva l'audio in formato mono sulla schermata di accesso</translation>
 <translation id="8114382167597081590">Non imporre la Modalità con restrizioni su YouTube</translation>
 <translation id="8117662664312039036">Non consentire ai dispositivi di utilizzare PluginVm</translation>
 <translation id="8117921351531866504">Consente di stabilire se consentire o meno ai siti web di controllare se l'utente ha salvato dei metodi di pagamento.
 
-      Se questo criterio viene disattivato, ai siti web che usano l'API PaymentRequest.canMakePayment o PaymentRequest.hasEnrolledInstrument viene comunicato che non ci sono metodi di pagamento disponibili.
+      Se questa policy viene disattivata, ai siti web che usano l'API PaymentRequest.canMakePayment o PaymentRequest.hasEnrolledInstrument viene comunicato che non ci sono metodi di pagamento disponibili.
 
       Se l'impostazione viene attivata o non viene configurata, i siti web possono controllare se l'utente ha salvato dei metodi di pagamento.</translation>
 <translation id="8118665053362250806">Imposta le dimensioni della cache su disco di supporto</translation>
@@ -9849,49 +9849,49 @@
 <translation id="8128192446158421884">URL su cui è applicabile AutoOpenFileTypes</translation>
 <translation id="8131046602440880289">Consenti le voci di sintesi vocale di rete migliorate durante l'utilizzo di Seleziona per ascoltare</translation>
 <translation id="8132419228205300235">Non visualizzare la schermata introduttiva dell'AI durante l'accesso</translation>
-<translation id="8133152694354699657">Se il criterio viene impostato su True o non viene impostato, la funzionalità Tocca per cercare sarà a disposizione degli utenti, che potranno scegliere se attivarla o disattivarla.
+<translation id="8133152694354699657">Se la policy viene impostata su True o non viene impostata, la funzionalità Tocca per cercare sarà a disposizione degli utenti, che potranno scegliere se attivarla o disattivarla.
 
-      Se il criterio viene impostato su False, la funzionalità Tocca per cercare verrà disattivata completamente.</translation>
+      Se la policy viene impostata su False, la funzionalità Tocca per cercare verrà disattivata completamente.</translation>
 <translation id="81354521512895891">Attiva l'alto contrasto nella schermata di accesso</translation>
 <translation id="8136081272045145135">I risultati di una pulizia eseguita da Chrome Software Cleaner non vengono mai condivisi con Google</translation>
 <translation id="8136345780578030573">Attiva First-Party Sets.</translation>
-<translation id="8136906469922284163">Se il criterio viene impostato su Vero, le pagine possono mostrare popup durante l'unload.
+<translation id="8136906469922284163">Se la policy viene impostata su True, le pagine possono mostrare popup durante l'unload.
 
-      Se il criterio viene impostato su Falso o se non viene configurato, le pagine non possono mostrare popup durante l'unload.
+      Se la policy viene impostata su False o se non viene configurata, le pagine non possono mostrare popup durante l'unload.
 
-      Questo criterio è stato rimosso nella versione 88 di Chrome e viene ignorato se viene impostato.
+      Questa policy è stata rimossa nella versione 88 di Chrome e viene ignorata se viene impostata.
 
       Visita la pagina https://www.chromestatus.com/feature/5989473649164288.</translation>
-<translation id="8137301668000005268">Questo criterio consente di configurare se <ph name="PRODUCT_NAME" /> offrirà un algoritmo di accordo chiave post-quantistico in TLS utilizzando lo standard NIST ML-KEM. Prima di <ph name="PRODUCT_NAME" /> versione 131, l'algoritmo era Kyber, un'iterazione bozza precedente dello standard. In questo modo, i server di supporto possono proteggere il traffico degli utenti dalla decrittografia successiva dei computer quantistici.
+<translation id="8137301668000005268">Questa policy consente di configurare se <ph name="PRODUCT_NAME" /> offrirà un algoritmo di accordo chiave post-quantistico in TLS utilizzando lo standard NIST ML-KEM. Prima di <ph name="PRODUCT_NAME" /> versione 131, l'algoritmo era Kyber, un'iterazione bozza precedente dello standard. In questo modo, i server di supporto possono proteggere il traffico degli utenti dalla decrittografia successiva dei computer quantistici.
 
-Se questo criterio viene attivato, <ph name="PRODUCT_NAME" /> offrirà un accordo chiave post-quantistico nelle connessioni TLS. Il traffico degli utenti sarà poi protetto dai computer quantistici durante la comunicazione con i server compatibili.
+Se questa policy viene attivata, <ph name="PRODUCT_NAME" /> offrirà un accordo chiave post-quantistico nelle connessioni TLS. Il traffico degli utenti sarà poi protetto dai computer quantistici durante la comunicazione con i server compatibili.
 
-Se questo criterio viene disattivato, <ph name="PRODUCT_NAME" /> non offrirà un accordo chiave post-quantistico nelle connessioni TLS. In questo modo, il traffico degli utenti non verrà protetto dai computer quantistici.
+Se questa policy viene disattivata, <ph name="PRODUCT_NAME" /> non offrirà un accordo chiave post-quantistico nelle connessioni TLS. In questo modo, il traffico degli utenti non verrà protetto dai computer quantistici.
 
-Se questo criterio non viene configurato, <ph name="PRODUCT_NAME" /> seguirà la procedura di implementazione predefinita per l'offerta di un accordo chiave post-quantistico.
+Se questa policy non viene configurata, <ph name="PRODUCT_NAME" /> seguirà la procedura di implementazione predefinita per l'offerta di un accordo chiave post-quantistico.
 
 L'offerta di un accordo chiave post-quantistico è compatibile con le versioni precedenti. I server TLS e il middleware di rete esistenti dovrebbero ignorare la nuova opzione e continuare a selezionare le opzioni precedenti.
 
 Tuttavia, i dispositivi che non implementano correttamente TLS potrebbero non funzionare correttamente se viene offerta la nuova opzione. Ad esempio, potrebbero disconnettersi in risposta a opzioni non riconosciute o ai messaggi di dimensioni maggiori che ne derivano. Questi dispositivi non sono adatti alla tecnologia post-quantistica e interferiranno con la relativa transizione di un'azienda. In questo caso, gli amministratori dovrebbero contattare il fornitore per risolvere il problema.
 
-Questo criterio è una misura temporanea e verrà rimosso in un momento successivo alla versione 141 di <ph name="PRODUCT_NAME" />. Potrebbe essere attivato per consentirti di testare i problemi e potrebbe essere disattivato durante la risoluzione di questi ultimi.</translation>
+Questa policy è una misura temporanea e verrà rimossa in un momento successivo alla versione 141 di <ph name="PRODUCT_NAME" />. Potrebbe essere attivata per consentirti di testare i problemi e potrebbe essere disattivata durante la risoluzione di questi ultimi.</translation>
 <translation id="8137443729340035928">Chiedi all'utente all'accesso se ripristinare l'ultima sessione.</translation>
 <translation id="8141795997560411818">Questa norma non impedisce all'utente di utilizzare l'app Google Drive per Android. Se vuoi impedire l'accesso a Google Drive, non devi consentire l'installazione dell'app Google Drive per Android.</translation>
 <translation id="8142894094385450823">Questa norma consente di impostare le impostazioni internazionali consigliate per una sessione gestita</translation>
 <translation id="8147132931626030921">Consente di impostare lo stato della funzionalità Schermata sulla privacy nella schermata di accesso.
 
-Se questo criterio è impostato su True, la Schermata sulla privacy verrà attivata quando la schermata di accesso viene visualizzata.
+Se questa policy è impostata su True, la Schermata sulla privacy verrà attivata quando la schermata di accesso viene visualizzata.
 
-Se questo criterio è impostato su False, la Schermata sulla privacy verrà disattivata quando la schermata di accesso viene visualizzata.
+Se questa policy è impostata su False, la Schermata sulla privacy verrà disattivata quando la schermata di accesso viene visualizzata.
 
-Se questo criterio viene impostato, l'utente non potrà sostituire il valore quando la schermata di accesso viene visualizzata.
+Se questa policy viene impostata, l'utente non potrà sostituire il valore quando la schermata di accesso viene visualizzata.
 
-Se questo criterio non viene impostato, la Schermata sulla privacy viene inizialmente disattivata, ma potrà essere controllata dall'utente quando la schermata di accesso viene visualizzata.</translation>
-<translation id="814753199998535240">Questo criterio è stato ritirato a partire dalla versione M96. Usa i criteri <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> e <ph name="REPORT_DEVICE_AUDIO_STATUS" />.
+Se questa policy non viene impostata, la Schermata sulla privacy viene inizialmente disattivata, ma potrà essere controllata dall'utente quando la schermata di accesso viene visualizzata.</translation>
+<translation id="814753199998535240">Questa policy è stata ritirata a partire dalla versione M96. Usa le policy <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> e <ph name="REPORT_DEVICE_AUDIO_STATUS" />.
 
-      Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano statistiche hardware quali l'utilizzo di CPU/RAM.
+      Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano statistiche hardware quali l'utilizzo di CPU/RAM.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano le statistiche hardware.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano le statistiche hardware.</translation>
 <translation id="8147730407149297036">Disattiva il rilevamento di fuga delle password</translation>
 <translation id="815061180603915310">Se viene attivata, questa norma forza l'attivazione della modalità temporanea per il profilo. Se viene specificata come norma del sistema operativo (ad esempio GPO su Windows), la norma viene applicata a ogni profilo nel sistema; se la norma viene impostata come norma Cloud, viene applicata soltanto a un profilo a cui viene eseguito l'accesso con un account gestito.
 
@@ -9903,25 +9903,25 @@
 <translation id="8151299379693359769">Consente di attivare un controllo sicurezza aggiuntivo in base all'attestazione da remoto (facoltativo, valore predefinito: Vero).</translation>
 <translation id="8151490482515839285">Attiva la generazione di rapporti sulla prevenzione di fughe di dati</translation>
 <translation id="8158758865057576716">Consente la creazione di copie di roaming per i dati dei profili <ph name="PRODUCT_NAME" />.</translation>
-<translation id="8158897487095710470">Se il criterio è impostato su True, una barra dei Preferiti viene visualizzata in <ph name="PRODUCT_NAME" />. Se il criterio è impostato su False, gli utenti non vedono mai la barra dei Preferiti.
+<translation id="8158897487095710470">Se la policy è impostata su True, una barra dei Preferiti viene visualizzata in <ph name="PRODUCT_NAME" />. Se la policy è impostata su False, gli utenti non vedono mai la barra dei Preferiti.
 
-      Se il criterio è configurato, gli utenti non possono apportare modifiche. Se non è configurato, gli utenti possono decidere se utilizzare questa funzione.</translation>
+      Se la policy è configurata, gli utenti non possono apportare modifiche. Se non è configurata, gli utenti possono decidere se utilizzare questa funzione.</translation>
 <translation id="8159760979508295709">Consente di attivare la funzione di accessibilità di evidenziazione del cursore.
 
           Questa funzione consente di evidenziare l'area che circonda il cursore del mouse durante il suo spostamento.
 
-          Se questo criterio viene attivato, l'evidenziazione del cursore sarà sempre attiva.
+          Se questa policy viene attivata, l'evidenziazione del cursore sarà sempre attiva.
 
-          Se questo criterio viene disattivato, l'evidenziazione del cursore sarà sempre disattivata.
+          Se questa policy viene disattivata, l'evidenziazione del cursore sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'evidenziazione del cursore è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'evidenziazione del cursore è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="8160572976152509481">Consenti agli utenti di spegnere il dispositivo soltanto con il tasto di accensione fisico</translation>
 <translation id="8164144100557223371">Disattiva il punto di ingresso nella barra degli strumenti delle funzionalità sperimentali del browser</translation>
-<translation id="8164687848393015214">Se il criterio viene impostato su Attivato, i pacchetti di rete di monitoraggio (<ph name="HEARTBEATS_TERM" />) vengono inviati al server di gestione per monitorare lo stato online e consentire al server di rilevare se il dispositivo è offline.
+<translation id="8164687848393015214">Se la policy viene impostata su Attivata, i pacchetti di rete di monitoraggio (<ph name="HEARTBEATS_TERM" />) vengono inviati al server di gestione per monitorare lo stato online e consentire al server di rilevare se il dispositivo è offline.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, i pacchetti non vengono inviati.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, i pacchetti non vengono inviati.</translation>
 <translation id="8168359201203671567">Colore della retroilluminazione della tastiera arcobaleno</translation>
 <translation id="8169452762291746260">Disattiva il monitoraggio dello stato di integrità del dispositivo</translation>
 <translation id="8170359860920320269">Filtra i siti di contenuti per adulti</translation>
@@ -9932,29 +9932,29 @@
 <translation id="8175922758834816585">Attiva la funzione di lettura vocale nella schermata di accesso e consenti all'utente di disattivarla temporaneamente</translation>
 <translation id="8176035528522326671">Consenti all'utente aziendale di essere solo l'utente multiprofilo principale (comportamento predefinito per gli utenti gestiti dall'azienda)</translation>
 <translation id="817717947404114735">Attiva il buffering adattivo di Web Audio.</translation>
-<translation id="8179082421668183060">Se per questo criterio viene impostato un elenco di stringhe, queste ultime vengono unite usando degli spazi e passate da <ph name="IE_PRODUCT_NAME" /> a <ph name="PRODUCT_NAME" /> sotto forma di parametri della riga di comando. Se un parametro contiene <ph name="URL_PLACEHOLDER" />, il valore <ph name="URL_PLACEHOLDER" /> viene sostituito con l'URL della pagina da aprire. Se nessun parametro contiene <ph name="URL_PLACEHOLDER" />, l'URL viene aggiunto alla fine della riga di comando.
+<translation id="8179082421668183060">Se per questa policy viene impostato un elenco di stringhe, queste ultime vengono unite usando degli spazi e passate da <ph name="IE_PRODUCT_NAME" /> a <ph name="PRODUCT_NAME" /> sotto forma di parametri della riga di comando. Se un parametro contiene <ph name="URL_PLACEHOLDER" />, il valore <ph name="URL_PLACEHOLDER" /> viene sostituito con l'URL della pagina da aprire. Se nessun parametro contiene <ph name="URL_PLACEHOLDER" />, l'URL viene aggiunto alla fine della riga di comando.
 
       Le variabili di ambiente vengono espanse. Su <ph name="MS_WIN_NAME" />, il valore <ph name="ENV_VARIABLE_WIN_EXAMPLE" /> viene sostituito con il valore della variabile di ambiente <ph name="ENV_VARIABLE_VALUE" />.
 
-      Se il criterio non viene configurato, <ph name="IE_PRODUCT_NAME" /> passa a <ph name="PRODUCT_NAME" /> soltanto l'URL sotto forma di parametro della riga di comando.
+      Se la policy non viene configurata, <ph name="IE_PRODUCT_NAME" /> passa a <ph name="PRODUCT_NAME" /> soltanto l'URL sotto forma di parametro della riga di comando.
 
-      Nota: se il componente aggiuntivo Supporto dei browser precedenti per <ph name="IE_PRODUCT_NAME" /> non è installato, questo criterio non ha effetto.</translation>
+      Nota: se il componente aggiuntivo Supporto dei browser precedenti per <ph name="IE_PRODUCT_NAME" /> non è installato, questa policy non ha effetto.</translation>
 <translation id="8179161412673077784">Impedisci ai siti con esperienze intrusive di aprirsi in nuove schede o finestre</translation>
 <translation id="8183108371184777472">Impedisci l'avvio della finestra del browser</translation>
 <translation id="8185312100223853315">Etichetta del profilo</translation>
 <translation id="8186911565834244165">Consenti il feedback degli utenti</translation>
 <translation id="8195133650230097559">Ignora richieste di wakelock per la gestione dell'alimentazione</translation>
-<translation id="8196558469954193908">Questo criterio consente la coalescenza di connessioni HTTP/2 quando sono in uso i certificati client. Per ottenere la coalescenza delle connessioni, il nome host della nuova potenziale connessione e il nome host della connessione esistente devono corrispondere a uno o più schemi descritti da questo criterio. Il criterio è un elenco di host che utilizzano il formato del filtro <ph name="URL_BLOCKLIST_POLICY_NAME" />: "example.com" corrisponde a "example.com" e a tutti i sottodomini (ad esempio "sub.example.com"), mentre ".example.net" corrisponde esattamente a "example.net".
+<translation id="8196558469954193908">Questa policy consente la coalescenza di connessioni HTTP/2 quando sono in uso i certificati client. Per ottenere la coalescenza delle connessioni, il nome host della nuova potenziale connessione e il nome host della connessione esistente devono corrispondere a uno o più schemi descritti da questa policy. La policy è un elenco di host che utilizzano il formato del filtro <ph name="URL_BLOCKLIST_POLICY_NAME" />: "example.com" corrisponde a "example.com" e a tutti i sottodomini (ad esempio "sub.example.com"), mentre ".example.net" corrisponde esattamente a "example.net".
 
-Le richieste di coalescenza indirizzate a diversi host tra connessioni che utilizzano certificati client possono creare problemi di privacy o di sicurezza, perché l'ambient authority viene comunicata a tutte le richieste anche in assenza di autorizzazione esplicita dell'utente. Questo criterio è provvisorio e verrà rimosso in una release futura. Consulta il sito https://crbug.com/855690.
+Le richieste di coalescenza indirizzate a diversi host tra connessioni che utilizzano certificati client possono creare problemi di privacy o di sicurezza, perché l'ambient authority viene comunicata a tutte le richieste anche in assenza di autorizzazione esplicita dell'utente. Questa policy è provvisoria e verrà rimossa in una release futura. Consulta il sito https://crbug.com/855690.
 
-Se questo criterio non viene impostato, verrà applicato il comportamento predefinito che non consente la coalescenza di connessioni HTTP/2 per le connessioni che utilizzano certificati client.</translation>
-<translation id="8197373549462388216">Se il criterio viene impostato su Attivato, gli utenti non possono proseguire oltre la pagina di avviso mostrata dal servizio Navigazione sicura per i siti dannosi. Questo criterio impedisce agli utenti di proseguire solo in presenza degli avvisi di Navigazione sicura, come malware e phishing, e non nell'eventualità di problematiche relative al certificato SSL, come nei casi di certificati scaduti o non validi.
+Se questa policy non viene impostata, verrà applicato il comportamento predefinito che non consente la coalescenza di connessioni HTTP/2 per le connessioni che utilizzano certificati client.</translation>
+<translation id="8197373549462388216">Se la policy viene impostata su Attivata, gli utenti non possono proseguire oltre la pagina di avviso mostrata dal servizio Navigazione sicura per i siti dannosi. Questa policy impedisce agli utenti di proseguire solo in presenza degli avvisi di Navigazione sicura, come malware e phishing, e non nell'eventualità di problematiche relative al certificato SSL, come nei casi di certificati scaduti o non validi.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, gli utenti possono scegliere di procedere sul sito segnalato dopo la comparsa dell'avviso.
+      Se la policy viene impostata su Disattivata o se non viene configurata, gli utenti possono scegliere di procedere sul sito segnalato dopo la comparsa dell'avviso.
 
       Ulteriori informazioni su Navigazione sicura (https://developers.google.com/safe-browsing).</translation>
-<translation id="8199823751103472868">Se il criterio viene impostato, viene attivato il layout Hindi Inscript su <ph name="PRODUCT_OS_NAME" />. Se viene impostato su False o se non viene configurato, il layout non è disponibile.</translation>
+<translation id="8199823751103472868">Se la policy viene impostata, viene attivato il layout Hindi Inscript su <ph name="PRODUCT_OS_NAME" />. Se viene impostata su False o se non viene configurata, il layout non è disponibile.</translation>
 <translation id="8202566089100454374">Google Maps (supportato dalla versione 135)</translation>
 <translation id="8202834945144737726">Attiva il flusso di attestazione <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL nella schermata di accesso</translation>
 <translation id="8210117014924235250">Questa policy fornisce un modo per eseguire l'override dell'elenco di insiemi che il browser utilizza per le funzionalità degli insiemi di siti web correlati.
@@ -9996,27 +9996,27 @@
 Su <ph name="MAC_OS_NAME" />, questa policy è disponibile soltanto per le istanze che sono gestite tramite MDM, aggiunte a un dominio tramite MCX o registrate in <ph name="CHROME_ENTERPRISE_CORE_NAME" />.</translation>
 <translation id="8213475033260328041">Scegli di archiviare i dati coperti da <ph name="PRODUCT_NAME" /> in una posizione geografica specifica.
 
-Se questo criterio non viene configurato o se viene impostato su <ph name="DATA_REGION_SETTING_NO_PREFERENCE_OPTION_NAME" /> (valore 0), i dati coperti potrebbero essere archiviati in qualsiasi posizione geografica.
+Se questa policy non viene configurata o se viene impostata su <ph name="DATA_REGION_SETTING_NO_PREFERENCE_OPTION_NAME" /> (valore 0), i dati coperti potrebbero essere archiviati in qualsiasi posizione geografica.
 
-Se questo criterio viene impostato su <ph name="DATA_REGION_SETTING_UNITED_STATES_OPTION_NAME" /> (valore 1), i dati coperti verranno archiviati negli Stati Uniti.
+Se questa policy viene impostata su <ph name="DATA_REGION_SETTING_UNITED_STATES_OPTION_NAME" /> (valore 1), i dati coperti verranno archiviati negli Stati Uniti.
 
-Se questo criterio viene impostato su <ph name="DATA_REGION_SETTING_EUROPE_OPTION_NAME" /> (valore 2), i dati coperti verranno archiviati in Europa.</translation>
-<translation id="8213770777756919897">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+Se questa policy viene impostata su <ph name="DATA_REGION_SETTING_EUROPE_OPTION_NAME" /> (valore 2), i dati coperti verranno archiviati in Europa.</translation>
+<translation id="8213770777756919897">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
-          Se viene impostato, questo criterio specifica l'azione compiuta da <ph name="PRODUCT_OS_NAME" /> quando l'utente rimane inattivo per il periodo di tempo indicato dal ritardo di inattività, che può essere configurato separatamente.
+          Se viene impostata, questa policy specifica l'azione compiuta da <ph name="PRODUCT_OS_NAME" /> quando l'utente rimane inattivo per il periodo di tempo indicato dal ritardo di inattività, che può essere configurato separatamente.
 
-          Se il criterio non viene impostato, viene compiuta l'azione predefinita, ossia la sospensione.
+          Se la policy non viene impostata, viene compiuta l'azione predefinita, ossia la sospensione.
 
           Se l'azione è la sospensione, è possibile configurare separatamente <ph name="PRODUCT_OS_NAME" /> in modo che blocchi o meno lo schermo prima della sospensione.</translation>
 <translation id="8214600119442850823">Consente di configurare Gestione password.</translation>
-<translation id="8217664958939773083">Se questo criterio viene impostato su <ph name="ENABLED" /> o se non viene configurato, è possibile usare la modalità headless. Se questo criterio viene impostato su <ph name="DISABLED" />, non è possibile usare la modalità headless.</translation>
-<translation id="8217837574199617401">Questo criterio consente agli amministratori di configurare un elenco di ID estensione richiesti per la modalità di navigazione in incognito.
+<translation id="8217664958939773083">Se questa policy viene impostata su <ph name="ENABLED" /> o se non viene configurata, è possibile usare la modalità headless. Se questa policy viene impostata su <ph name="DISABLED" />, non è possibile usare la modalità headless.</translation>
+<translation id="8217837574199617401">Questa policy consente agli amministratori di configurare un elenco di ID estensione richiesti per la modalità di navigazione in incognito.
 
 L'utente deve consentire esplicitamente l'esecuzione in modalità di navigazione in incognito di tutte le estensioni presenti in questo elenco, altrimenti la navigazione in questa modalità non è consentita.
 
-Se un'estensione specificata in questo criterio non viene installata, la navigazione in incognito viene bloccata.
+Se un'estensione specificata in questa policy non viene installata, la navigazione in incognito viene bloccata.
 
-Questo criterio viene applicato alla modalità di navigazione in incognito. Ciò significa che la modalità deve essere attivata nel browser. Se la modalità di navigazione in incognito viene disattivata tramite il criterio <ph name="INCOGNITO_MODE_AVAILABILITY" />, questo criterio non ha effetto.</translation>
+Questa policy viene applicata alla modalità di navigazione in incognito. Ciò significa che la modalità deve essere attivata nel browser. Se la modalità di navigazione in incognito viene disattivata tramite la policy <ph name="INCOGNITO_MODE_AVAILABILITY" />, questa policy non ha effetto.</translation>
 <translation id="8219813789911069300">Blocca download dannosi (opzione consigliata).</translation>
 <translation id="8220023426952118761">La velocità di download desiderata, in kbit/s.</translation>
 <translation id="8220156281401380422">Configura lista consentita di messaggi nativi</translation>
@@ -10043,20 +10043,20 @@
 Per una descrizione dettagliata di tutti i valori di gestione, consulta la sezione 5.2 del documento RFC 8828 (https://tools.ietf.org/html/rfc8828.html#section-5.2).</translation>
 <translation id="8244171102276095471">Attiva i pacchetti di crittografia RC4 in TLS</translation>
 <translation id="8244525275280476362">Ritardo di recupero massimo dopo l'invalidazione di una norma</translation>
-<translation id="8245574649143980200">Se il criterio non viene configurato o se viene impostato su Attivato, gli utenti possono visualizzare la voce di menu per la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nel menu contestuale. Se viene impostato su Disattivato, gli utenti non vedranno la voce di menu per la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> se la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> è supportata.</translation>
+<translation id="8245574649143980200">Se la policy non viene configurata o se viene impostata su Attivata, gli utenti possono visualizzare la voce di menu per la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nel menu contestuale. Se viene impostata su Disattivata, gli utenti non vedranno la voce di menu per la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> se la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" /> è supportata.</translation>
 <translation id="8247143534027746614">Blocca l'accesso a un elenco di pattern URL durante l'autenticazione</translation>
 <translation id="824818544897669723">Viene disattivata l'eliminazione della cronologia del browser e dei download</translation>
-<translation id="8250048892729838843">Questo criterio è stato ritirato. Se il criterio viene attivato o se non viene configurato, il dispositivo potrà ricevere i controlli di reporting granulare.
-      Se viene disattivato, i dispositivi registrati non riceveranno i controlli di reporting granulare.</translation>
+<translation id="8250048892729838843">Questa policy è stata ritirata. Se la policy viene attivata o se non viene configurata, il dispositivo potrà ricevere i controlli di reporting granulare.
+      Se viene disattivata, i dispositivi registrati non riceveranno i controlli di reporting granulare.</translation>
 <translation id="82530263956734297">ID delle estensioni da escludere dalla lista bloccata</translation>
-<translation id="8256006033157034334">Questo criterio è deprecato e non è supportato. Utilizza il criterio <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME_POLICY_NAME" />.</translation>
+<translation id="8256006033157034334">Questa policy è deprecata e non è supportata. Utilizza la policy <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME_POLICY_NAME" />.</translation>
 <translation id="8256688113167012935">Controlla il nome account visualizzato da <ph name="PRODUCT_OS_NAME" /> nella schermata di accesso per il corrispondente account del dispositivo.
 
-      Se il criterio è impostato, la schermata di accesso utilizzerà la stringa specificata nel selettore di accesso basato su immagine per il corrispondente account del dispositivo.
+      Se la policy è impostata, la schermata di accesso utilizzerà la stringa specificata nel selettore di accesso basato su immagine per il corrispondente account del dispositivo.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_OS_NAME" /> utilizzerà l'ID account email dell'account dispositivo come nome visualizzato nella schermata di accesso.
+      Se la policy non viene impostata, <ph name="PRODUCT_OS_NAME" /> utilizzerà l'ID account email dell'account dispositivo come nome visualizzato nella schermata di accesso.
 
-      Questo criterio viene ignorato per gli account utente standard.</translation>
+      Questa policy viene ignorata per gli account utente standard.</translation>
 <translation id="8257863622304579015">Attiva la sandbox del servizio di rete</translation>
 <translation id="8259375588339409826">Chromium e Google Chrome supportano lo stesso insieme di norme. Questo documento potrebbe includere norme riferite a versioni non ancora introdotte (la relativa voce "Supported on" si riferisce a una versione non rilasciata di <ph name="PRODUCT_NAME" />). Tali norme sono soggette a modifica o rimozione senza preavviso e non viene fornita alcuna garanzia in merito, neanche in relazione alle proprietà di privacy e sicurezza.
 
@@ -10065,25 +10065,25 @@
 Non è necessario configurare manualmente queste impostazioni. È possibile scaricare modelli di facile utilizzo per Windows, Mac e Linux da <ph name="POLICY_TEMPLATE_DOWNLOAD_URL" />.
 
 Su Windows è consigliabile configurare le norme tramite Criteri di gruppo, anche se la specifica di norme tramite il registro di sistema è ancora supportata per le istanze di Windows che fanno parte di un dominio <ph name="MS_AD_NAME" />.</translation>
-<translation id="8261008508574620157">Un criterio per stabilire se i tuoi utenti vedono o meno la richiesta di <ph name="PRIVACY_SANDBOX_NAME" />.
+<translation id="8261008508574620157">Una policy per stabilire se i tuoi utenti vedono o meno la richiesta di <ph name="PRIVACY_SANDBOX_NAME" />.
 La richiesta è un flusso di blocco degli utenti, che informa i tuoi utenti delle impostazioni di <ph name="PRIVACY_SANDBOX_NAME" />. Visita la pagina <ph name="PRIVACY_SANDBOX_URL" /> per avere informazioni dettagliate sull'impegno di Chrome per ritirare i cookie di terze parti.
 
-Se imposti questo criterio su Disabled, <ph name="PRODUCT_NAME" /> non mostrerà la richiesta di <ph name="PRIVACY_SANDBOX_NAME" />.
-Se lo imposti su Enabled o se non lo configuri, <ph name="PRODUCT_NAME" /> stabilisce se è possibile o meno mostrare la richiesta di <ph name="PRIVACY_SANDBOX_NAME" /> e poi la mostra, se possibile.
+Se imposti questa policy su Disabled, <ph name="PRODUCT_NAME" /> non mostrerà la richiesta di <ph name="PRIVACY_SANDBOX_NAME" />.
+Se la imposti su Enabled o se non la configuri, <ph name="PRODUCT_NAME" /> stabilisce se è possibile o meno mostrare la richiesta di <ph name="PRIVACY_SANDBOX_NAME" /> e poi la mostra, se possibile.
 
-Se è configurato uno dei seguenti criteri, è necessario impostare questo criterio su Disabled:
+Se è configurata una delle seguenti policy, è necessario impostare questa policy su Disabled:
 <ph name="PRIVACY_SANDBOX_AD_TOPICS_ENABLED_POLICY_NAME" />
 <ph name="PRIVACY_SANDBOX_SITE_ENABLED_ADS_ENABLED_POLICY_NAME" />
 <ph name="PRIVACY_SANDBOX_AD_MEASUREMENT_ENABLED_POLICY_NAME" /></translation>
-<translation id="826163650738550159">Questo criterio consentirà di accedere alla pagina di test dei criteri.
-Mentre i criteri vengono testati in questa pagina, tutti gli altri criteri verranno ignorati.
+<translation id="826163650738550159">Questa policy consentirà di accedere alla pagina di test delle policy.
+Mentre le policy vengono testate in questa pagina, tutte le altre policy verranno ignorate.
 La funzionalità sarà disponibile soltanto sul canale Canary.
 
-Se il criterio viene attivato o se non viene configurato, la pagina sarà accessibile.
-Se il criterio viene disattivato, la pagina verrà bloccata.</translation>
-<translation id="8266778278542911985">Se il criterio viene impostato su 3, i siti web possono chiedere l'accesso alle porte seriali. Se il criterio viene impostato su 2, l'accesso alle porte seriali viene negato.
+Se la policy viene attivata o se non viene configurata, la pagina sarà accessibile.
+Se la policy viene disattivata, la pagina verrà bloccata.</translation>
+<translation id="8266778278542911985">Se la policy viene impostata su 3, i siti web possono chiedere l'accesso alle porte seriali. Se la policy viene impostata su 2, l'accesso alle porte seriali viene negato.
 
-      Se non viene configurato, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
+      Se non viene configurata, i siti web possono richiedere l'accesso, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="8267520984570984190">Il comportamento di ridimensionamento predefinito della tastiera virtuale non viene modificato</translation>
 <translation id="8269238942896230153">Un account gestito deve essere un account principale. L'importazione dei dati di navigazione esistenti è consentita al momento della creazione del profilo</translation>
 <translation id="827020625039819798">Questa policy consente di specificare un elenco di app ed estensioni installate automaticamente, senza interazione dell'utente, e che non possono essere disinstallate o disattivate dagli utenti tramite l'interfaccia <ph name="PRODUCT_NAME" />. Le autorizzazioni vengono concesse implicitamente, anche quelle relative alle API delle estensioni enterprise.deviceAttributes ed enterprise.platformKeys. Queste due API non sono disponibili per le app e le estensioni senza installazione forzata.
@@ -10107,15 +10107,15 @@
 <translation id="827054846390793641">Attiva l'interfaccia utente relativa alla connessione sul computer desktop host quando è attiva una connessione</translation>
 <translation id="8272422063636310696">Consente di controllare se una pagina che utilizza tecnologie precedenti verrà inclusa nel report in base al relativo URL.
 
-Se il criterio viene configurato, gli URL il cui prefisso corrisponde a una voce della lista consentita verranno utilizzati per generare il report e caricarlo. Gli URL senza corrispondenza verranno ignorati.
-Se il criterio non viene configurato o se viene impostato su un elenco vuoto, non verrà generato alcun report.
+Se la policy viene configurata, gli URL il cui prefisso corrisponde a una voce della lista consentita verranno utilizzati per generare il report e caricarlo. Gli URL senza corrispondenza verranno ignorati.
+Se la policy non viene configurata o se viene impostata su un elenco vuoto, non verrà generato alcun report.
 
-Per i pattern corrispondenti viene usato un formato simile a quello utilizzato per i pattern del criterio "<ph name="URL_BLOCKLIST_POLICY_NAME" />", documentati all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Con alcune eccezioni riportate di seguito:
+Per i pattern corrispondenti viene usato un formato simile a quello utilizzato per i pattern della policy "<ph name="URL_BLOCKLIST_POLICY_NAME" />", documentati all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. Con alcune eccezioni riportate di seguito:
  * Nessun supporto del carattere jolly "*".
  * Schema, porta e query vengono ignorati.
  * Puoi aggiungere al massimo 100 URL nella lista consentita.
 
-Per <ph name="PRODUCT_NAME" />, questo criterio viene applicato soltanto se la macchina viene registrata con il token <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" />.
+Per <ph name="PRODUCT_NAME" />, questa policy viene applicata soltanto se la macchina viene registrata con il token <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" />.
 
 Per maggiori informazioni sulle tecnologie precedenti, visita la pagina all'indirizzo https://chromestatus.com/features.</translation>
 <translation id="8273183018575414926">App web progressive</translation>
@@ -10125,41 +10125,41 @@
 <translation id="8278133379873210419">Elimina le finestre di dialogo JavaScript attivate da frame secondari di origine diversa</translation>
 <translation id="8284028944941138279">Risparmio di memoria bilanciato.</translation>
 <translation id="8284296539558710573">Prompt di autenticazione HTTP multiorigine</translation>
-<translation id="8284527236880877730">Se il criterio <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME" /> è impostato su Disattivato, la configurazione del criterio <ph name="PRESENTATION_SCREEN_DIM_DELAY_SCALE_POLICY_NAME" /> consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando il dispositivo è in modalità di presentazione. Quando il ritardo di oscuramento dello schermo viene regolato, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo impostato in origine.
+<translation id="8284527236880877730">Se la policy <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME" /> è impostata su Disattivata, la configurazione della policy <ph name="PRESENTATION_SCREEN_DIM_DELAY_SCALE_POLICY_NAME" /> consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando il dispositivo è in modalità di presentazione. Quando il ritardo di oscuramento dello schermo viene regolato, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo impostato in origine.
 
-      Se il criterio non viene configurato, viene usato un fattore di regolazione predefinito.
+      Se la policy non viene configurata, viene usato un fattore di regolazione predefinito.
 
       Nota: il fattore di regolazione minimo deve essere 100%.</translation>
 <translation id="8284621384813278750">Scegli se è possibile o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli argomenti degli annunci</translation>
 <translation id="8285435910062771358">Ingrandimento a schermo intero attivo</translation>
 <translation id="828566872219880247">Consente di impostare un elenco di pattern URL che specificano i siti autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenBlockedForUrls", ha la precedenza su queste eccezioni.
 
-          Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultKeygenSetting" (se impostato) o della configurazione personale dell'utente (se non impostato).
+          Se questa policy non viene impostata, per tutti i siti viene usato il valore predefinito globale della policy "DefaultKeygenSetting" (se impostata) o della configurazione personale dell'utente (se non impostata).
 
-          Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+          Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="8288199156259560552">Attiva il servizio di geolocalizzazione di Google per Android</translation>
 <translation id="8289824033213234651">La modalità Risparmio energetico viene attivata quando il dispositivo è alimentato a batteria e il livello batteria è basso.</translation>
 <translation id="8290875622178450531">Consente di attivare la funzione di accessibilità di dettatura.
 
-          Se questo criterio viene attivato, la dettatura sarà sempre attiva.
+          Se questa policy viene attivata, la dettatura sarà sempre attiva.
 
-          Se questo criterio viene disattivato, la dettatura sarà sempre disattivata.
+          Se questa policy viene disattivata, la dettatura sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la dettatura è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente la dettatura è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="8293414596801971604">Espressione regolare per trovare corrispondenze con il nome visualizzato della stampante.</translation>
-<translation id="8293509904023267821">Se questo criterio viene impostato, i dati degli appunti trasmessi da e verso l'host saranno troncati secondo il limite stabilito da questo criterio.
+<translation id="8293509904023267821">Se questa policy viene impostata, i dati degli appunti trasmessi da e verso l'host saranno troncati secondo il limite stabilito da questa policy.
 
           Se viene impostato un valore pari a 0, la sincronizzazione degli appunti è disattivata.
 
-          Il criterio riguarda entrambi gli scenari di accesso remoto e di assistenza remota
+          La policy riguarda entrambi gli scenari di accesso remoto e di assistenza remota
 
-          e non ha alcun effetto se non viene impostato.
+          e non ha alcun effetto se non viene impostata.
 
-          Se il criterio viene impostato su un valore che non rientra nell'intervallo minimo/massimo, l'host potrebbe non essere avviato.
+          Se la policy viene impostata su un valore che non rientra nell'intervallo minimo/massimo, l'host potrebbe non essere avviato.
 
-          Tieni presente che l'effettivo limite superiore per le dimensioni degli appunti è basato sulle dimensioni massime del messaggio di canale dei dati WebRTC, che non sono controllate da questo criterio.</translation>
+          Tieni presente che l'effettivo limite superiore per le dimensioni degli appunti è basato sulle dimensioni massime del messaggio di canale dei dati WebRTC, che non sono controllate da questa policy.</translation>
 <translation id="8294750666104911727">In genere le pagine con X-UA-Compatible impostato su chrome=1 saranno visualizzate in <ph name="PRODUCT_FRAME_NAME" /> nonostante la norma "£ChromeFrameRendererSettings".
 
 Se attivi questa impostazione, le pagine non saranno sottoposte a scansione per i metatag.
@@ -10167,7 +10167,7 @@
 Se disattivi questa impostazione, le pagine saranno sottoposte a scansione per i metatag.
 
 Se questa norma non viene impostata, le pagine saranno sottoposte a scansione per i metatag.</translation>
-<translation id="8295496526151576383">Questo criterio specifica le estensioni consentite per ignorare la finestra di dialogo di conferma del processo di stampa utilizzando la funzione <ph name="PRINTING_API" /> <ph name="SUBMIT_JOB_FUNCTION" /> per l'invio di un processo di stampa.
+<translation id="8295496526151576383">Questa policy specifica le estensioni consentite per ignorare la finestra di dialogo di conferma del processo di stampa utilizzando la funzione <ph name="PRINTING_API" /> <ph name="SUBMIT_JOB_FUNCTION" /> per l'invio di un processo di stampa.
 
       Se un'estensione non è presente nell'elenco o non è configurato alcun elenco, la finestra di dialogo di conferma del processo di stampa verrà visualizzata dall'utente per ogni chiamata funzione <ph name="SUBMIT_JOB_FUNCTION" />.</translation>
 <translation id="8300992833374611099">Stabilisci dove è possibile utilizzare gli Strumenti per sviluppatori</translation>
@@ -10175,15 +10175,15 @@
 <translation id="8303780229975459754">Consenti a Chrome di mostrare avvisi quando viene eseguito su un sistema non supportato</translation>
 <translation id="8303923135132440974">Consente di controllare la finestra di dialogo "Avvisa prima di uscire (⌘Q)" quando l'utente sta tentando di uscire dal browser.
 
-      Se il criterio viene impostato su Attivato o se non viene configurato, viene mostrata una finestra di dialogo di avviso quando l'utente sta tentando di uscire.
+      Se la policy viene impostata su Attivata o se non viene configurata, viene mostrata una finestra di dialogo di avviso quando l'utente sta tentando di uscire.
 
-      Se viene impostato su Disattivato, non viene mostrata una finestra di dialogo di avviso quando l'utente sta tentando di uscire.</translation>
+      Se viene impostata su Disattivata, non viene mostrata una finestra di dialogo di avviso quando l'utente sta tentando di uscire.</translation>
 <translation id="830440838848984847">Consenti agli utenti di accedere a <ph name="PRODUCT_NAME" /></translation>
 <translation id="8306117673860983372">Impostazioni di accesso</translation>
 <translation id="8307340233340602723">Consenti o nega l'accesso alla geolocalizzazione del dispositivo</translation>
-<translation id="830819203330820450">Se il criterio è attivato o non configurato (impostazione predefinita), una pagina web può usare le API di condivisione schermo (ad esempio, getDisplayMedia() o l'API dell'estensione di acquisizione schermata desktop) per richiedere all'utente di selezionare una scheda, una finestra o una schermata desktop da acquisire.
+<translation id="830819203330820450">Se la policy è attivata o non configurata (impostazione predefinita), una pagina web può usare le API di condivisione schermo (ad esempio, getDisplayMedia() o l'API dell'estensione di acquisizione schermata desktop) per richiedere all'utente di selezionare una scheda, una finestra o una schermata desktop da acquisire.
 
-      Se il criterio è disattivato, le chiamate alle API di condivisione schermo avranno esito negativo con un errore; tuttavia, questo criterio non viene preso in considerazione (e un sito sarà autorizzato a utilizzare le API di condivisione schermo) se il sito corrisponde a un modello di origine in uno dei seguenti criteri:
+      Se la policy è disattivata, le chiamate alle API di condivisione schermo avranno esito negativo con un errore; tuttavia, questa policy non viene presa in considerazione (e un sito sarà autorizzato a utilizzare le API di condivisione schermo) se il sito corrisponde a un modello di origine in una delle seguenti policy:
       <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />,
       <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />,
       <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />,
@@ -10206,43 +10206,43 @@
       Se viene specificata la norma DeviceIdleLogoutTimeout, questa norma consente di definire la durata della casella di avviso con un timer per il conto alla rovescia che viene mostrato all'utente prima dell'esecuzione dell'uscita.
 
       Il valore della norma deve essere specificato in millisecondi.</translation>
-<translation id="8330437518362176921">Utilizza solo l'URL di aggiornamento fornito dal criterio durante il download e l'aggiornamento delle app di Chrome Kiosk</translation>
+<translation id="8330437518362176921">Utilizza solo l'URL di aggiornamento fornito dalla policy durante il download e l'aggiornamento delle app di Chrome Kiosk</translation>
 <translation id="8331479227794770304">Attiva tasti permanenti</translation>
 <translation id="8332822245414537447">Disattiva il controllo dell'utilizzo delle chiavi RSA</translation>
 <translation id="8334685561819743286">Disattiva la correzione automatica sulla tastiera fisica durante la digitazione da parte degli utenti</translation>
-<translation id="8337114537412769126">Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attivo, l'assegnazione di un valore al criterio <ph name="DEFAULT_SEARCH_PROVIDER_SUGGEST_URL_POST_PARAMS_POLICY_NAME" /> consente di specificare i parametri durante la ricerca di suggerimenti con POST. Si tratta di coppie di tipo nome-valore separate da virgole. Se un valore è il parametro di un modello, ad esempio <ph name="SEARCH_TERM_MARKER" />, viene sostituito con i dati dei termini di ricerca reali.
+<translation id="8337114537412769126">Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> è attiva, l'assegnazione di un valore alla policy <ph name="DEFAULT_SEARCH_PROVIDER_SUGGEST_URL_POST_PARAMS_POLICY_NAME" /> consente di specificare i parametri durante la ricerca di suggerimenti con POST. Si tratta di coppie di tipo nome-valore separate da virgole. Se un valore è il parametro di un modello, ad esempio <ph name="SEARCH_TERM_MARKER" />, viene sostituito con i dati dei termini di ricerca reali.
 
-      Se il criterio <ph name="DEFAULT_SEARCH_PROVIDER_SUGGEST_URL_POST_PARAMS_POLICY_NAME" /> non viene configurato, le richieste di ricerca di suggerimenti vengono inviate utilizzando il metodo Get.</translation>
+      Se la policy <ph name="DEFAULT_SEARCH_PROVIDER_SUGGEST_URL_POST_PARAMS_POLICY_NAME" /> non viene configurata, le richieste di ricerca di suggerimenti vengono inviate utilizzando il metodo Get.</translation>
 <translation id="8337961007759352651">Gli script worker (web worker, service worker ecc.) richiedono un tipo MIME JavaScript, ad esempio <ph name="MIMETYPE_TEXT_JAVASCRIPT" />. Gli script worker con tipi MIME precedenti, come <ph name="MIMETYPE_TEXT_ASCII" />, verranno rifiutati.</translation>
 <translation id="8339089771335211509">WebRTC utilizzerà l'interfaccia solo se si connette a una rete pubblica, ma non potrà connettersi utilizzando indirizzi IP privati.</translation>
 <translation id="8339420913453596618">Autenticazione a due fattori disattivata</translation>
 <translation id="8341175887542205077">Disattiva backup e ripristino della macchina virtuale Linux</translation>
 <translation id="8344454543174932833">Importa Preferiti dal browser predefinito alla prima esecuzione</translation>
-<translation id="8347993687936322631">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+<translation id="8347993687936322631">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
-          Questo criterio consente di fornire un valore di riserva per i criteri più specifici <ph name="IDLE_ACTION_AC_POLICY_NAME" /> e <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />. Se questo criterio viene impostato, il suo valore viene utilizzato se non viene impostato il rispettivo criterio più specifico.
+          Questa policy consente di fornire un valore di riserva per le policy più specifiche <ph name="IDLE_ACTION_AC_POLICY_NAME" /> e <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />. Se questa policy viene impostata, il suo valore viene utilizzato se non viene impostata la rispettiva policy più specifica.
 
-          Se questo criterio non viene impostato, il comportamento dei criteri più specifici rimane invariato.</translation>
+          Se questa policy non viene impostata, il comportamento delle policy più specifiche rimane invariato.</translation>
 <translation id="8350643689940867542">Disattiva la generazione di report sui dati dei criteri</translation>
 <translation id="835283681355955417">Segnala dettagli periferica</translation>
-<translation id="8354001669131263433">A partire dalla versione M132, questo criterio e le API a schermo intero per video con prefisso verranno rimossi.
+<translation id="8354001669131263433">A partire dalla versione M132, questa policy e le API a schermo intero per video con prefisso verranno rimosse.
 
-Se il criterio viene impostato su <ph name="ENABLED_VALUE_NAME" />, sarà possibile utilizzare le API a schermo intero per video con prefisso (ad esempio Video.webkitEnterFullscreen()) da JavaScript.
+Se la policy viene impostata su <ph name="ENABLED_VALUE_NAME" />, sarà possibile utilizzare le API a schermo intero per video con prefisso (ad esempio Video.webkitEnterFullscreen()) da JavaScript.
 
-Se il criterio viene impostato su <ph name="DISABLED_VALUE_NAME" />, le API a schermo intero per video con prefisso non verranno utilizzate in JavaScript, lasciando solo le API standard a schermo intero (ad esempio Element.requestFullscreen()).
+Se la policy viene impostata su <ph name="DISABLED_VALUE_NAME" />, le API a schermo intero per video con prefisso non verranno utilizzate in JavaScript, lasciando solo le API standard a schermo intero (ad esempio Element.requestFullscreen()).
 
-Se il criterio viene impostato su <ph name="RUNTIME_ENABLED_VALUE_NAME" />, consentirà al flag funzionalità abilitato per il tempo di esecuzione PrefixedFullscreenVideo di determinare se le API a schermo intero per video con prefisso sono disponibili per i siti web.
+Se la policy viene impostata su <ph name="RUNTIME_ENABLED_VALUE_NAME" />, consentirà al flag funzionalità abilitato per il tempo di esecuzione PrefixedFullscreenVideo di determinare se le API a schermo intero per video con prefisso sono disponibili per i siti web.
 
-Se il criterio non viene configurato, il comportamento predefinito è <ph name="RUNTIME_ENABLED_VALUE_NAME" />.
+Se la policy non viene configurata, il comportamento predefinito è <ph name="RUNTIME_ENABLED_VALUE_NAME" />.
 
-Nota: questo criterio costituisce una soluzione temporanea per aiutare la transizione dalle API a schermo intero con prefisso -webkit. M131 è l'ultima versione che include questo criterio.</translation>
-<translation id="8356953698979920095">Se il criterio viene impostato su uno dei valori indicati, per impostazione predefinita il colore di retroilluminazione della tastiera del dispositivo viene applicato durante l'accesso dell'utente.</translation>
+Nota: questa policy costituisce una soluzione temporanea per aiutare la transizione dalle API a schermo intero con prefisso -webkit. M131 è l'ultima versione che include questa policy.</translation>
+<translation id="8356953698979920095">Se la policy viene impostata su uno dei valori indicati, per impostazione predefinita il colore di retroilluminazione della tastiera del dispositivo viene applicato durante l'accesso dell'utente.</translation>
 <translation id="8357681633047935212">Limita la durata di una sessione utente</translation>
 <translation id="8357989008292691856">Elenco di utenti autorizzati ad accedere</translation>
 <translation id="8359734107661430198">Attiva l'API ExampleDeprecatedFeature valida fino al 02/09/2008</translation>
-<translation id="8367069206652407172">Se il criterio viene impostato su Disattivato, gli utenti non possono terminare i processi nella funzionalità Task Manager.
+<translation id="8367069206652407172">Se la policy viene impostata su Disattivata, gli utenti non possono terminare i processi nella funzionalità Task Manager.
 
-      Se viene impostato su Attivato o se non viene configurato, gli utenti possono terminare i processi nella funzionalità Task Manager.</translation>
+      Se viene impostata su Attivata o se non viene configurata, gli utenti possono terminare i processi nella funzionalità Task Manager.</translation>
 <translation id="8367209241899435947">Attiva Chrome Software Cleaner su Windows</translation>
 <translation id="8367446818896241968">Attiva la visualizzazione della schermata della direzione di scorrimento sul touchpad durante l'accesso</translation>
 <translation id="8367473200119029349">Reporting su cloud</translation>
@@ -10260,59 +10260,59 @@
 <translation id="8381774264911275515">Disattiva il trasferimento dei cookie SSO SAML nella sessione utente durante l'accesso</translation>
 <translation id="8382184662529825177">Attiva l'utilizzo dell'attestazione remota per la protezione dei contenuti per il dispositivo</translation>
 <translation id="838870586332499308">Attiva roaming dati</translation>
-<translation id="8392478748777481636">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME" />.</translation>
+<translation id="8392478748777481636">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME" />.</translation>
 <translation id="8393850527597048037">Solo criteri piattaforma</translation>
 <translation id="8395350646076131800">Timeout di inattività della schermata di blocco utente del salvaschermo.</translation>
 <translation id="8395749934754392549">Consente di gestire le impostazioni relative al container Android (ARC) e alle app Android.</translation>
 <translation id="8398952282584132331">Attiva Schermata sulla privacy</translation>
-<translation id="8399825694820904218">Se per il criterio viene impostato un numero, <ph name="PRODUCT_NAME" /> mostra un messaggio relativo al numero di millisecondi impostato, quindi apre un browser alternativo.
+<translation id="8399825694820904218">Se per la policy viene impostato un numero, <ph name="PRODUCT_NAME" /> mostra un messaggio relativo al numero di millisecondi impostato, quindi apre un browser alternativo.
 
-Se il criterio non viene impostato o viene impostato su 0 e si passa a un URL definito, l'URL viene aperto subito in un browser alternativo.</translation>
+Se la policy non viene impostata o viene impostata su 0 e si passa a un URL definito, l'URL viene aperto subito in un browser alternativo.</translation>
 <translation id="8400225642589806131">Se questa policy viene impostata su <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_BROWSER_ENABLED" /> (valore 1), <ph name="PRODUCT_NAME" /> richiederà al server di gestione dispositivi un certificato client per una sessione del browser gestita. Questo certificato verrà reso disponibile, ad esempio, per le connessioni mTLS.
 
 Se questa policy viene impostata su <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_BROWSER_DISABLED" /> (valore 0) o se non viene configurata, <ph name="PRODUCT_NAME" /> non potrà richiedere il certificato client. Se è già stato eseguito il provisioning del certificato client gestito di un browser, poiché questa policy è stata attivata in precedenza non verrà eliminato, ma non sarà disponibile per le connessioni mTLS e non verrà rinnovato alla scadenza.</translation>
 <translation id="8402079500086185021">Apri sempre file PDF esternamente</translation>
 <translation id="8402357110539568621">Consente di attivare la funzione di accessibilità della tastiera virtuale.
 
-          Se questo criterio viene impostato su True, la tastiera virtuale di accessibilità sarà sempre attiva.
+          Se questa policy viene impostata su True, la tastiera virtuale di accessibilità sarà sempre attiva.
 
-          Se questo criterio viene impostato su False, la tastiera virtuale di accessibilità sarà sempre disattivata.
+          Se questa policy viene impostata su False, la tastiera virtuale di accessibilità sarà sempre disattivata.
 
-          Se configuri questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se configuri questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la tastiera virtuale di accessibilità è disattivata, ma l'utente può attivarla in qualsiasi momento usando le impostazioni di accessibilità.
+          Se questa policy non viene impostata, inizialmente la tastiera virtuale di accessibilità è disattivata, ma l'utente può attivarla in qualsiasi momento usando le impostazioni di accessibilità.
 
-          Questo criterio non influisce sull'attivazione o meno della tastiera virtuale touch. Ad esempio, la tastiera virtuale touch viene comunque visualizzata sui tablet anche se il criterio viene impostato su False. Utilizza il criterio <ph name="TOUCH_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" /> per controllare il comportamento della tastiera virtuale touch.</translation>
-<translation id="8410477879938914253">Il criterio viene applicato soltanto alle sessioni Ospite gestite.
-      Se il criterio viene impostato su Vero o se non viene configurato, viene visualizzata una finestra di dialogo che chiede all'utente di confermare o annullare la disconnessione quando l'ultima finestra viene chiusa.
-      Se viene impostato su Falso, la finestra di dialogo non viene visualizzata e la disconnessione automatica viene disattivata dopo la chiusura dell'ultima finestra.</translation>
-<translation id="8411050083243181286"> A partire dalla versione M109, l'API non standard Event.path verrà rimossa per migliorare la compatibilità web. Questo criterio consente di riattivare l'API fino alla versione M115.
+          Questa policy non influisce sull'attivazione o meno della tastiera virtuale touch. Ad esempio, la tastiera virtuale touch viene comunque visualizzata sui tablet anche se la policy viene impostata su False. Utilizza la policy <ph name="TOUCH_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" /> per controllare il comportamento della tastiera virtuale touch.</translation>
+<translation id="8410477879938914253">La policy viene applicata soltanto alle sessioni Ospite gestite.
+      Se la policy viene impostata su True o se non viene configurata, viene visualizzata una finestra di dialogo che chiede all'utente di confermare o annullare la disconnessione quando l'ultima finestra viene chiusa.
+      Se viene impostata su False, la finestra di dialogo non viene visualizzata e la disconnessione automatica viene disattivata dopo la chiusura dell'ultima finestra.</translation>
+<translation id="8411050083243181286"> A partire dalla versione M109, l'API non standard Event.path verrà rimossa per migliorare la compatibilità web. Questa policy consente di riattivare l'API fino alla versione M115.
 
-      Se questo criterio viene impostato su Enabled, l'API Event.path sarà disponibile.
+      Se questa policy viene impostata su Enabled, l'API Event.path sarà disponibile.
 
-      Se questo criterio viene impostato su Disabled, l'API Event.path non sarà disponibile.
+      Se questa policy viene impostata su Disabled, l'API Event.path non sarà disponibile.
 
-      Se il criterio non viene configurato, l'API Event.path sarà nello stato predefinito: disponibile prima della versione M109 e non disponibile nelle versioni M109-114.
+      Se la policy non viene configurata, l'API Event.path sarà nello stato predefinito: disponibile prima della versione M109 e non disponibile nelle versioni M109-114.
 
-      Questo criterio verrà rimosso nelle versioni successive alla versione 115 di Chrome.</translation>
+      Questa policy verrà rimossa nelle versioni successive alla versione 115 di Chrome.</translation>
 <translation id="841395160262233331">L'Avvio app/il tasto Ricerca non sarà in grado di modificare il comportamento dei tasti funzione e questa impostazione non sarà modificabile dagli utenti.</translation>
-<translation id="8415953438346821074">Se attivi questa impostazione, le impostazioni memorizzate nei profili <ph name="PRODUCT_NAME" />, come i preferiti, i dati della compilazione automatica, le password e così via, saranno scritte anche in un file memorizzato nella cartella del profilo utente Roaming o in una posizione specificata dall'amministratore tramite il criterio <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" />. Se attivi il criterio, viene disattivata la sincronizzazione nel cloud.
+<translation id="8415953438346821074">Se attivi questa impostazione, le impostazioni memorizzate nei profili <ph name="PRODUCT_NAME" />, come i preferiti, i dati della compilazione automatica, le password e così via, saranno scritte anche in un file memorizzato nella cartella del profilo utente Roaming o in una posizione specificata dall'amministratore tramite la policy <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" />. Se attivi la policy, viene disattivata la sincronizzazione nel cloud.
 
-      Se il criterio viene disattivato o non viene impostato, saranno utilizzati solo i normali profili locali.</translation>
+      Se la policy viene disattivata o non viene impostata, saranno utilizzati solo i normali profili locali.</translation>
 <translation id="8417305981081876834">Imposta la lunghezza massima del PIN per la schermata di blocco</translation>
 <translation id="841977920223099909">Attivazione dell'avviso di protezione tramite password</translation>
 <translation id="8419965165591256432">La frequenza del rilevamento dello stato dell'attività del dispositivo su dispositivi registrati di utenti affiliati. Il valore minimo consentito è 1 minuto.
 
-      Se il criterio non viene configurato, viene applicata la frequenza predefinita di 15 minuti.</translation>
+      Se la policy non viene configurata, viene applicata la frequenza predefinita di 15 minuti.</translation>
 <translation id="8420426128163801949">Consenti agli utenti di attivare o disattivare il Bluetooth</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="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">Questo criterio determina il comportamento della rimappatura dei tasti Inizio/Fine
+<translation id="8426326725481825773">Questa policy determina il comportamento della rimappatura dei tasti Inizio/Fine
 nella pagina secondaria "Rimappa i tasti". La pagina secondaria "Rimappa i tasti" consente agli utenti di
-personalizzare i tasti della tastiera. Se abilitato, questo criterio impedisce agli utenti di
-personalizzare queste rimappature specifiche. Se il criterio non viene configurato,
+personalizzare i tasti della tastiera. Se abilitata, questa policy impedisce agli utenti di
+personalizzare queste rimappature specifiche. Se la policy non viene configurata,
 le scorciatoie basate sul tasto Ricerca saranno quelle predefinite e agli utenti sarà consentita
 la configurazione.</translation>
 <translation id="8427466947904008809">Consenti a CRD di eseguire richieste API WebAuthn trasferite al proxy da un host remoto.</translation>
@@ -10322,9 +10322,9 @@
 <translation id="8433186206711564395">Impostazioni di rete</translation>
 <translation id="8433769814000220721">Attiva contenuti suggeriti</translation>
 <translation id="8435304381855818385">Impostazioni predefinite codice dinamico</translation>
-<translation id="843609873781525167">Se il criterio è impostato su True, all'avvio <ph name="PRODUCT_NAME" /> verifica sempre di essere il browser predefinito e, se possibile, si registra automaticamente. Se il criterio è impostato su False, <ph name="PRODUCT_NAME" /> non verifica mai di essere il browser predefinito e disattiva i controlli degli utenti per questa opzione.
+<translation id="843609873781525167">Se la policy è impostata su True, all'avvio <ph name="PRODUCT_NAME" /> verifica sempre di essere il browser predefinito e, se possibile, si registra automaticamente. Se la policy è impostata su False, <ph name="PRODUCT_NAME" /> non verifica mai di essere il browser predefinito e disattiva i controlli degli utenti per questa opzione.
 
-      Se il criterio non è configurato, <ph name="PRODUCT_NAME" /> consente agli utenti di controllare se è impostato come browser predefinito e, in caso contrario, se devono essere visualizzate le notifiche per gli utenti.
+      Se la policy non è configurata, <ph name="PRODUCT_NAME" /> consente agli utenti di controllare se è impostato come browser predefinito e, in caso contrario, se devono essere visualizzate le notifiche per gli utenti.
 
       Nota per gli amministratori di <ph name="MS_WIN_NAME" />: la configurazione di questa impostazione funziona solo con le macchine che eseguono Windows 7. Per le versioni successive, è necessario eseguire il deployment di un file con associazioni di applicazioni predefinite che imposti <ph name="PRODUCT_NAME" /> come gestore dei protocolli <ph name="HTTPS_PROTOCOL" /> e <ph name="HTTP_PROTOCOL" /> (e facoltativamente del protocollo <ph name="FTP_PROTOCOL" /> e di altri formati di file). Consulta la guida di Chrome (https://support.google.com/chrome?p=make_chrome_default_win).</translation>
 <translation id="8441105784056442638">Attiva la funzionalità di ripristino completo</translation>
@@ -10332,9 +10332,9 @@
 <translation id="8444157920689124099">Abilita la crittografia per applicazioni</translation>
 <translation id="8445576299806775661">Dopo ogni importante aggiornamento della versione, Chrome crea un'istantanea di alcune parti dei dati di navigazione dell'utente da usare in caso di un successivo rollback di versione di emergenza. Se viene eseguito un rollback di emergenza a una versione di cui l'utente ha un'istantanea corrispondente, vengono ripristinati i dati nell'istantanea. In questo modo gli utenti possono mantenere impostazioni quali preferiti e dati di compilazione automatica.
 
-      Se questo criterio non viene impostato, viene usato il valore predefinito 3.
+      Se questa policy non viene impostata, viene usato il valore predefinito 3.
 
-      Se questo criterio viene impostato, le istantanee meno recenti vengono eliminate in base a quanto necessario per rispettare il limite. Se il criterio viene impostato su 0, non vengono acquisite istantanee.</translation>
+      Se questa policy viene impostata, le istantanee meno recenti vengono eliminate in base a quanto necessario per rispettare il limite. Se la policy viene impostata su 0, non vengono acquisite istantanee.</translation>
 <translation id="8446679541472571487">Visualizza la schermata introduttiva dell'AI durante l'accesso</translation>
 <translation id="8451988835943702790">Usa la pagina Nuova scheda come Pagina iniziale</translation>
 <translation id="8452787853105404870">Invia dati hardware a Google per supportare miglioramenti a ChromeOS Flex</translation>
@@ -10352,17 +10352,17 @@
 <translation id="8466326735698755782">Consenti Confronta schede senza migliorare i modelli di AI.</translation>
 <translation id="8467267413626499807">Attiva il servizio SSO mobile</translation>
 <translation id="8467463980805035993">Consenti Aiutami a leggere senza migliorare i modelli di AI.</translation>
-<translation id="846994437739309080">Se questo criterio è attivato (o non impostato), i certificati TLS aggiunti dagli utenti dagli archivi di attendibilità della piattaforma verranno utilizzati nella creazione di percorsi per l'autenticazione del server TLS.
+<translation id="846994437739309080">Se questa policy è attivata (o non impostata), i certificati TLS aggiunti dagli utenti dagli archivi di attendibilità della piattaforma verranno utilizzati nella creazione di percorsi per l'autenticazione del server TLS.
 
-Se questo criterio è disattivato, i certificati TLS aggiunti dagli utenti dagli archivi di attendibilità della piattaforma non verranno utilizzati nella creazione di percorsi per l'autenticazione del server TLS.</translation>
+Se questa policy è disattivata, i certificati TLS aggiunti dagli utenti dagli archivi di attendibilità della piattaforma non verranno utilizzati nella creazione di percorsi per l'autenticazione del server TLS.</translation>
 <translation id="8470317291588703478">Non viene forzata la Modalità con restrizioni di YouTube</translation>
-<translation id="8471117881949952479">Questo criterio è stato ritirato e verrà sostituito da DataControlsRules.
+<translation id="8471117881949952479">Questa policy è stata ritirata e verrà sostituita da DataControlsRules.
 
-Questo criterio impedisce la copia dei dati negli appunti per URL specifici.
+Questa policy impedisce la copia dei dati negli appunti per URL specifici.
 
       Gli elenchi di URL<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> consentono di controllare a quali siti è consentito scrivere negli appunti. La scrittura negli appunti viene bloccata se l'URL corrisponde a un pattern in "enable" e non corrisponde a un pattern in "disable". La copia non viene bloccata se l'URL non corrisponde ad alcun pattern.
 
-Per i pattern corrispondenti alle origini viene usato un formato simile a quello usato per i pattern del criterio "<ph name="URL_BLOCKLIST_POLICY_NAME" />", documentati all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
+Per i pattern corrispondenti alle origini viene usato un formato simile a quello usato per i pattern della policy "<ph name="URL_BLOCKLIST_POLICY_NAME" />", documentati all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format.
 
 La dimensione <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> indica la quantità minima di dati in byte che attiva il controllo dei pattern. Ciò significa che la scrittura negli appunti da un URL bloccato sarebbe consentita se la dimensione dei dati copiati fosse inferiore al valore specificato in questo campo. Se il campo non viene impostato, il valore predefinito è 100 byte.</translation>
 <translation id="8471860377920321311">Consenti le funzionalità di GenAI e migliora i modelli di AI</translation>
@@ -10393,19 +10393,19 @@
 <translation id="8489964335640955763">PluginVm</translation>
 <translation id="8493645415242333585">Disabilita salvataggio della cronologia del browser</translation>
 <translation id="8499172469244085141">Impostazioni predefinite (gli utenti possono ignorarle)</translation>
-<translation id="8499359456965625209">Questo criterio è stato ritirato.
+<translation id="8499359456965625209">Questa policy è stata ritirata.
 
-Se il criterio viene impostato su Attivato o se non viene configurato, i software di terze parti non possono inserire codice eseguibile nei processi di <ph name="PRODUCT_NAME" />.
+Se la policy viene impostata su Attivata o se non viene configurata, i software di terze parti non possono inserire codice eseguibile nei processi di <ph name="PRODUCT_NAME" />.
 
-      Se il criterio viene impostato su Disattivato, questi software possono inserire tale codice nei processi di <ph name="PRODUCT_NAME" />.</translation>
+      Se la policy viene impostata su Disattivata, questi software possono inserire tale codice nei processi di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8503018573167958506">Consente di determinare se un utente può configurare il nome host del dispositivo.
 
-      Se il criterio <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME" /> è impostato, l'amministratore imposta il nome host e l'utente non può sceglierne uno, a prescindere dall'impostazione di questo criterio.
-      Se questo criterio è impostato su Vero e <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME" /> non è impostato, l'amministratore non configura il nome host e l'utente può sceglierne uno.
-      Se questo criterio è impostato su Falso e <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME" /> non è impostato, l'amministratore non configura il nome host e l'utente non può sceglierne uno, per cui viene usato il nome predefinito.</translation>
-<translation id="8504243661032323176">La configurazione del criterio consente di applicare la lunghezza minima del PIN scelta. I valori inferiori a 1 vengono arrotondati per eccesso a 1 (valore minimo).
+      Se la policy <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME" /> è impostata, l'amministratore imposta il nome host e l'utente non può sceglierne uno, a prescindere dall'impostazione di questa policy.
+      Se questa policy è impostata su True e <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME" /> non è impostata, l'amministratore non configura il nome host e l'utente può sceglierne uno.
+      Se questa policy è impostata su False e <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME" /> non è impostata, l'amministratore non configura il nome host e l'utente non può sceglierne uno, per cui viene usato il nome predefinito.</translation>
+<translation id="8504243661032323176">La configurazione della policy consente di applicare la lunghezza minima del PIN scelta. I valori inferiori a 1 vengono arrotondati per eccesso a 1 (valore minimo).
 
-      Se il criterio non viene configurato, viene applicata una lunghezza minima del PIN di 6 cifre, ossia il valore minimo consigliato.</translation>
+      Se la policy non viene configurata, viene applicata una lunghezza minima del PIN di 6 cifre, ossia il valore minimo consigliato.</translation>
 <translation id="8507835864888987300">Consente di impostare una versione target per gli Aggiornamenti automatici.
 
       Consente di specificare il prefisso della versione target a cui <ph name="PRODUCT_OS_NAME" /> deve aggiornarsi. Se sul dispositivo viene eseguita una versione precedente a quella del prefisso specificato, il dispositivo si aggiornerà all'ultima versione con il prefisso dato. Se il dispositivo ha già l'ultima versione, gli effetti dipendono dal valore di <ph name="DEVICE_ROLLBACK_TO_TARGET_VERSION_POLICY_NAME" />. Il formato del prefisso funziona in relazione al componente, come mostrato nell'esempio seguente:
@@ -10424,25 +10424,25 @@
 <translation id="8519264904050090490">URL delle eccezioni manuali per gli utenti gestiti</translation>
 <translation id="8519516251436131647">Consente di attivare le scorciatoie delle funzioni di accessibilità.
 
-          Se questo criterio viene impostato su true, le scorciatoie delle funzioni di accessibilità saranno sempre attive.
+          Se questa policy viene impostata su true, le scorciatoie delle funzioni di accessibilità saranno sempre attive.
 
-          Se questo criterio viene impostato su false, le scorciatoie delle funzioni di accessibilità saranno sempre disattivate.
+          Se questa policy viene impostata su false, le scorciatoie delle funzioni di accessibilità saranno sempre disattivate.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o eseguirne l'override.
+          Se imposti questa policy, gli utenti non potranno modificarla o eseguirne l'override.
 
-          Se questo criterio non viene impostato, le scorciatoie delle funzioni di accessibilità saranno attive per impostazione predefinita.</translation>
+          Se questa policy non viene impostata, le scorciatoie delle funzioni di accessibilità saranno attive per impostazione predefinita.</translation>
 <translation id="8519563483516917705">Questa impostazione consente ai dispositivi di selezionare una versione di destinazione specifica di <ph name="PRODUCT_OS_NAME" /> per l'aggiornamento.
 
       Se non viene configurata, i dispositivi eseguiranno l'aggiornamento in base ad altre impostazioni o all'ultima versione disponibile.
 
       Se viene configurata, l'aggiornamento verrà eseguito a una versione selezionata.
 
-      Il formato esatto di questo valore del criterio corrisponde ai dettagli di implementazione del servizio di aggiornamento e potrebbe variare. Il valore del criterio non viene elaborato sul dispositivo.
+      Il formato esatto di questo valore della policy corrisponde ai dettagli di implementazione del servizio di aggiornamento e potrebbe variare. Il valore della policy non viene elaborato sul dispositivo.
 
-      Se utilizzato insieme a <ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" />, questo criterio verrà prima esaminato da un servizio di aggiornamento.
-      A differenza di<ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" /> (che potrebbe consentire aggiornamenti minori), i dispositivi manterranno la versione selezionata finché il valore di questo criterio non verrà modificato.
+      Se utilizzata insieme a <ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" />, questa policy verrà prima esaminata da un servizio di aggiornamento.
+      A differenza di <ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" /> (che potrebbe consentire aggiornamenti minori), i dispositivi manterranno la versione selezionata finché il valore di questa policy non verrà modificato.
 
-      Se utilizzato insieme a <ph name="DEVICE_ROLLBACK_TO_TARGET_VERSION_POLICY_NAME" />, la versione del dispositivo può essere ripristinata a una versione precedente specifica.
+      Se utilizzata insieme a <ph name="DEVICE_ROLLBACK_TO_TARGET_VERSION_POLICY_NAME" />, la versione del dispositivo può essere ripristinata a una versione precedente specifica.
 
       Avviso: è sconsigliato configurare delle limitazioni della versione, poiché potrebbero impedire agli utenti di ricevere aggiornamenti software e correzioni critiche per la sicurezza. Gli aggiornamenti con limitazioni a una versione specifica potrebbero esporre gli utenti a dei rischi.</translation>
 <translation id="8519617069657262768">Attiva la sincronizzazione Google Drive</translation>
@@ -10450,13 +10450,13 @@
 <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="8525526490824335042">Container Linux</translation>
-<translation id="8526745614158856826">La configurazione del criterio consente di elencare i siti a cui viene concessa automaticamente l'autorizzazione di accesso a tutti i dispositivi disponibili.
+<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.
 
-      Se gli URL non sono validi, il criterio viene ignorato. Viene considerata soltanto l'origine (schema, host e porta) dell'URL.
+      Se gli URL non sono validi, la policy viene ignorata. Viene considerata soltanto l'origine (schema, host e porta) dell'URL.
 
-      Su ChromeOS, questo criterio viene applicato solo agli utenti affiliati.
+      Su ChromeOS, questa policy viene applicata solo agli utenti affiliati.
 
-      Questo criterio esegue l'override di <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" /> e delle preferenze dell'utente.</translation>
+      Questa policy esegue l'override di <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" /> e delle preferenze dell'utente.</translation>
 <translation id="8528951285051082869">Non consentire ad alcuna app web di accedere a determinati tipi di file tramite l'API File Handling</translation>
 <translation id="8529958869261780079">Questa policy consente di controllare le impostazioni della funzionalità Aiutami a leggere per <ph name="PRODUCT_OS_NAME" />.
 
@@ -10478,11 +10478,11 @@
 <translation id="8549906780629620346">Attiva recupero dell'account</translation>
 <translation id="855291439519960768">Disattiva la funzionalità di protezione dal fingerprinting di <ph name="PRIVACY_SANDBOX_NAME" />.</translation>
 <translation id="8553491595730354263">Consente all'host di accesso remoto di usare le autenticazioni con PIN e accoppiamento quando le connessioni client vengono accettate</translation>
-<translation id="8553955290407912156">Se il criterio viene configurato, puoi elencare i pattern URL che specificano i siti che non possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo HID.
+<translation id="8553955290407912156">Se la policy viene configurata, puoi elencare i pattern URL che specificano i siti che non possono chiedere agli utenti l'autorizzazione di accesso a un dispositivo HID.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      Per i pattern URL che non presentano corrispondenze con il criterio, hanno la precedenza i seguenti elementi, in questo ordine:
+      Per i pattern URL che non presentano corrispondenze con la policy, hanno la precedenza i seguenti elementi, in questo ordine:
 
         * <ph name="WEB_HID_ASK_FOR_URLS_POLICY_NAME" /> (se c'è una corrispondenza),
 
@@ -10490,15 +10490,15 @@
 
         * impostazioni personali degli utenti.
 
-      I pattern URL non possono essere in conflitto con <ph name="WEB_HID_ASK_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non possono essere in conflitto con <ph name="WEB_HID_ASK_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambi.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
-<translation id="8554750769356971993">Un criterio per stabilire se i tuoi utenti possono o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli annunci suggeriti dai siti.
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
+<translation id="8554750769356971993">Una policy per stabilire se i tuoi utenti possono o meno disattivare l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli annunci suggeriti dai siti.
 
-Se imposti questo criterio su Disabled, l'impostazione relativa agli annunci suggeriti dai siti verrà disattivata per i tuoi utenti.
-Se lo imposti su Enabled o se non lo configuri, i tuoi utenti potranno attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli annunci suggeriti dai siti.
+Se imposti questa policy su Disabled, l'impostazione relativa agli annunci suggeriti dai siti verrà disattivata per i tuoi utenti.
+Se la imposti su Enabled o se non la configuri, i tuoi utenti potranno attivare o disattivare sul loro dispositivo l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli annunci suggeriti dai siti.
 
-Se configuri questo criterio, il criterio <ph name="PRIVACY_SANDBOX_PROMPT_ENABLED_POLICY_NAME" /> deve essere impostato su Disabled.</translation>
+Se configuri questa policy, la policy <ph name="PRIVACY_SANDBOX_PROMPT_ENABLED_POLICY_NAME" /> deve essere impostata su Disabled.</translation>
 <translation id="8559221882677768248">Disattiva Seleziona per ascoltare nella schermata di accesso</translation>
 <translation id="8561512522781085002">Le impostazioni di Pagina su/Pagina giù usano la scorciatoia che contiene il tasto di modifica Ricerca</translation>
 <translation id="8562398722263115493">Aiutami a scrivere è un assistente di scrittura basato sull'AI per creare contenuti brevi sul web. I contenuti suggeriti si basano sui prompt inseriti dall'utente e sui contenuti della pagina web.
@@ -10517,96 +10517,96 @@
 <translation id="8571314270766672278">Esegui il rollback e il reset del dispositivo con un downgrade del canale, prova a mantenere la registrazione</translation>
 <translation id="8571871284943706125">Segnala eventi di sessioni CRD su dispositivi registrati per utenti affiliati.
 
-      Se il criterio viene disattivato o se non viene configurato, le informazioni non vengono segnalate.
-      Se viene attivato, gli eventi CRD vengono segnalati, se l'utente è affiliato.</translation>
+      Se la policy viene disattivata o se non viene configurata, le informazioni non vengono segnalate.
+      Se viene attivata, gli eventi CRD vengono segnalati, se l'utente è affiliato.</translation>
 <translation id="85723976805793612">I log eventi di installazione di app per Android sono condivisi con Google</translation>
 <translation id="857369585509260201">Questa norma è stata ritirata; usa la norma BrowserSignin.
 
       Se questa norma viene impostata su true, l'utente deve accedere a <ph name="PRODUCT_NAME" /> con il proprio profilo per poter usare il browser e il valore predefinito di BrowserGuestModeEnabled viene impostato su false. Tieni presente che i profili esistenti a cui non è stato eseguito l'accesso saranno bloccati e inaccessibili dopo l'attivazione di questa norma. Per ulteriori informazioni, leggi l'articolo del Centro assistenza.
 
       Se la norma viene impostata su false o non viene configurata, l'utente può utilizzare il browser senza accedere a <ph name="PRODUCT_NAME" />.</translation>
-<translation id="8575422604428646609">Se questo criterio viene disattivato, impedisce agli amministratori aziendali di connettersi a dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti quando non è presente alcun utente sul dispositivo.
+<translation id="8575422604428646609">Se questa policy viene disattivata, impedisce agli amministratori aziendali di connettersi a dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti quando non è presente alcun utente sul dispositivo.
 
-Questo criterio non influisce sugli altri scenari di accesso remoto.
+Questa policy non influisce sugli altri scenari di accesso remoto.
 
-Questo criterio non è efficace se viene attivato, lasciato vuoto o se non viene configurato.</translation>
+Questa policy non è efficace se viene attivata, lasciata vuota o se non viene configurata.</translation>
 <translation id="8575739761246140675">Attiva attendibilità nei certificati emessi dall'Infrastruttura a chiave pubblica precedente di Symantec Corporation</translation>
-<translation id="8575746110808109915">Se il criterio viene impostato su Attivato, la funzionalità di ripristino completo viene attivata.
-      Se viene impostato su Vero, le app e le finestre delle app verranno ripristinate o meno dopo un arresto anomalo o un riavvio in base all'impostazione di ripristino dell'app.
-      Se viene impostato su Falso, vengono avviate automaticamente solo le finestre del browser.</translation>
+<translation id="8575746110808109915">Se la policy viene impostata su Attivata, la funzionalità di ripristino completo viene attivata.
+      Se viene impostata su True, le app e le finestre delle app verranno ripristinate o meno dopo un arresto anomalo o un riavvio in base all'impostazione di ripristino dell'app.
+      Se viene impostata su False, vengono avviate automaticamente solo le finestre del browser.</translation>
 <translation id="8583509234908413302">Consenti downgrade a protocolli TLS/DTLS precedenti in WebRTC</translation>
-<translation id="8584279193368801689">Consente di limitare la modalità di stampa PIN. Se il criterio non viene impostato non vengono applicate limitazioni. Se la modalità non è disponibile, questo criterio viene ignorato. Tieni presente che la funzionalità di stampa PIN viene attivata solo per le stampanti che usano uno dei protocolli IPPS, HTTPS, USB o IPP-over-USB.</translation>
+<translation id="8584279193368801689">Consente di limitare la modalità di stampa PIN. Se la policy non viene impostata non vengono applicate limitazioni. Se la modalità non è disponibile, questa policy viene ignorata. Tieni presente che la funzionalità di stampa PIN viene attivata solo per le stampanti che usano uno dei protocolli IPPS, HTTPS, USB o IPP-over-USB.</translation>
 <translation id="858510846828945657">Elenco delle eccezioni alla lista bloccata dei domini del servizio SSO mobile</translation>
 <translation id="8587229956764455752">Consenti la creazione di nuovi account utente</translation>
 <translation id="8589285015138337712">Non consentire all'utente di personalizzare le scorciatoie di sistema</translation>
-<translation id="8589346048177748110">Se il criterio è impostato su true, gli utenti possono giocare al gioco del dinosauro. Se il criterio è impostato su false, gli utenti non possono giocare al gioco del dinosauro quando il dispositivo è offline.
+<translation id="8589346048177748110">Se la policy è impostata su true, gli utenti possono giocare al gioco del dinosauro. Se la policy è impostata su false, gli utenti non possono giocare al gioco del dinosauro quando il dispositivo è offline.
 
-Se il criterio non è configurato, gli utenti non possono giocare sul dispositivo <ph name="PRODUCT_OS_NAME" /> registrato, ma possono farlo in altre circostanze.</translation>
-<translation id="8591713876665299827">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
+Se la policy non è configurata, gli utenti non possono giocare sul dispositivo <ph name="PRODUCT_OS_NAME" /> registrato, ma possono farlo in altre circostanze.</translation>
+<translation id="8591713876665299827">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Consente di specificare il periodo di tempo senza input utente trascorso il quale viene compiuta l'azione stabilita per l'inattività quando viene usata la corrente alternata.
 
-          Se viene impostato, questo criterio specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> compia l'azione stabilita in caso di inattività, che può essere configurata separatamente.
+          Se viene impostata, questa policy specifica per quanto tempo l'utente deve rimanere inattivo prima che <ph name="PRODUCT_OS_NAME" /> compia l'azione stabilita in caso di inattività, che può essere configurata separatamente.
 
-          Se questo criterio non viene impostato, viene usato un periodo di tempo predefinito.
+          Se questa policy non viene impostata, viene usato un periodo di tempo predefinito.
 
-          Il valore del criterio deve essere specificato in millisecondi.</translation>
+          Il valore della policy deve essere specificato in millisecondi.</translation>
 <translation id="8592363656632862875">Non scaricare il modello</translation>
 <translation id="859579553230883285">Disattiva l'impostazione di <ph name="PRIVACY_SANDBOX_NAME" /> relativa agli annunci suggeriti dai siti per i tuoi utenti.</translation>
 <translation id="8597758693275075382">Le stringhe OEM SMBIOS da passare alla VM durante l'installazione. Il valore predefinito è l'elenco vuoto.</translation>
 <translation id="8598786284856179541">Attiva la generazione di report sulle informazioni di versione</translation>
 <translation id="859937827887158048">Non consentire i download di aggiornamento automatico peer-to-peer</translation>
 <translation id="8600280933078435582">Applicazioni per Linux</translation>
-<translation id="8603454805657060638">La configurazione del criterio consente all'amministratore di modificare l'indirizzo MAC (Media Access Control) quando un dispositivo viene inserito nel dock. Quando alcuni modelli di dispositivi vengono inseriti nel dock, per impostazione predefinita l'indirizzo MAC del dock designato per il dispositivo viene utilizzato per identificare il dispositivo su Ethernet.
+<translation id="8603454805657060638">La configurazione della policy consente all'amministratore di modificare l'indirizzo MAC (Media Access Control) quando un dispositivo viene inserito nel dock. Quando alcuni modelli di dispositivi vengono inseriti nel dock, per impostazione predefinita l'indirizzo MAC del dock designato per il dispositivo viene utilizzato per identificare il dispositivo su Ethernet.
 
-      Se "DeviceDockMacAddress" viene selezionato o se il criterio non viene configurato, viene utilizzato l'indirizzo MAC del dock designato per il dispositivo.
+      Se "DeviceDockMacAddress" viene selezionato o se la policy non viene configurata, viene utilizzato l'indirizzo MAC del dock designato per il dispositivo.
 
       Se "DeviceNicMacAddress" viene selezionato, viene utilizzato l'indirizzo MAC NIC (Network Interface Controller) del dispositivo.
 
       Se "DockNicMacAddress" viene selezionato, viene utilizzato l'indirizzo MAC NIC del dock.
 
       Gli utenti non possono modificare questa impostazione.</translation>
-<translation id="8604178325750278068">Se il criterio viene impostato su Attivato, l'Assistente Google potrà ascoltare la frase di attivazione vocale. Se il criterio viene impostato su Disattivato, l'Assistente Google non potrà ascoltare la frase.
+<translation id="8604178325750278068">Se la policy viene impostata su Attivata, l'Assistente Google potrà ascoltare la frase di attivazione vocale. Se la policy viene impostata su Disattivata, l'Assistente Google non potrà ascoltare la frase.
 
-      Se il criterio non viene configurato, gli utenti potranno decidere se attivare o disattivare la funzionalità.</translation>
+      Se la policy non viene configurata, gli utenti potranno decidere se attivare o disattivare la funzionalità.</translation>
 <translation id="8604906464981340229">Concedi automaticamente a questi siti l'autorizzazione di connessione a dispositivi HID che contengono raccolte di livello superiore con l'utilizzo dell'HID specificato.</translation>
-<translation id="8605216171953003144">Se il criterio viene impostato su Attivato o se non viene configurato, il protocollo NTLMv2 viene attivato.
+<translation id="8605216171953003144">Se la policy viene impostata su Attivata o se non viene configurata, il protocollo NTLMv2 viene attivato.
 
-      Se il criterio viene impostato su Disattivato, il protocollo NTLMv2 viene disattivato.
+      Se la policy viene impostata su Disattivata, il protocollo NTLMv2 viene disattivato.
 
       Tutte le versioni recenti dei server Samba e <ph name="MS_WIN_NAME" /> supportano il protocollo NTLMv2. Questo protocollo dovrebbe essere disattivato solo per compatibilità con le versioni precedenti, poiché riduce la sicurezza dell'autenticazione.</translation>
 <translation id="8605627672203601098">Configura i fattori WebAuthn consentiti</translation>
 <translation id="8606263947930257189">Consente di stabilire se <ph name="PRODUCT_NAME" /> può bloccare le schede che sono in secondo piano da almeno cinque minuti.
 
-      Se il criterio viene impostato su true, le schede che sono in secondo piano da almeno cinque minuti potrebbero essere bloccate. Il blocco delle schede riduce l'utilizzo di CPU, batteria e memoria. <ph name="PRODUCT_NAME" /> usa l'euristica per evitare di bloccare le schede in secondo piano che hanno una funzione utile (ad esempio visualizzare notifiche, riprodurre audio, riprodurre video in streaming). Gli sviluppatori web possono anche disattivare il blocco nei loro siti (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md).
+      Se la policy viene impostata su true, le schede che sono in secondo piano da almeno cinque minuti potrebbero essere bloccate. Il blocco delle schede riduce l'utilizzo di CPU, batteria e memoria. <ph name="PRODUCT_NAME" /> usa l'euristica per evitare di bloccare le schede in secondo piano che hanno una funzione utile (ad esempio visualizzare notifiche, riprodurre audio, riprodurre video in streaming). Gli sviluppatori web possono anche disattivare il blocco nei loro siti (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md).
 
-      Se il criterio viene impostato su false, le schede non verranno bloccate.</translation>
-<translation id="8607613052618540095">Se il criterio viene impostato su Enabled, i report sulla telemetria di Kiosk Vision sono attivati.
+      Se la policy viene impostata su false, le schede non verranno bloccate.</translation>
+<translation id="8607613052618540095">Se la policy viene impostata su Enabled, i report sulla telemetria di Kiosk Vision sono attivati.
 Verrà avviato il framework Kiosk Vision e saranno attivati i report sulla telemetria del pubblico.
-Se questo criterio non viene configurato o se viene impostato su Disabled, i report sulla telemetria di Kiosk Vision sono disattivati.</translation>
-<translation id="8610216287193516769">Rimosso in M122: si tratta di un criterio solo lato server che non ha mai utilizzato l'infrastruttura dei criteri di ChromeOS per la sua propagazione.
-Se questo criterio viene impostato su <ph name="POLICY_VALUE_ALL" /> o se non viene configurato, sono consentiti tutti gli utilizzi degli account gestiti. Di conseguenza, un account gestito potrebbe essere un account secondario, che riceverebbe i criteri soltanto se venisse eseguito l'accesso all'account come account principale in un profilo del browser.
-      I criteri impostati per l'account non verranno applicati nei seguenti casi:
+Se questa policy non viene configurata o se viene impostata su Disabled, i report sulla telemetria di Kiosk Vision sono disattivati.</translation>
+<translation id="8610216287193516769">Rimossa in M122: si tratta di una policy solo lato server che non ha mai utilizzato l'infrastruttura delle policy di ChromeOS per la sua propagazione.
+Se questa policy viene impostata su <ph name="POLICY_VALUE_ALL" /> o se non viene configurata, sono consentiti tutti gli utilizzi degli account gestiti. Di conseguenza, un account gestito potrebbe essere un account secondario, che riceverebbe le policy soltanto se venisse eseguito l'accesso all'account come account principale in un profilo del browser.
+      Le policy impostate per l'account non verranno applicate nei seguenti casi:
         -  Se l'account è un account secondario a livello di sistema operativo (Impostazioni account)
         -  Se l'account è un account secondario in un profilo del browser
 
-      Se questo criterio viene impostato su <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_SIGNIN" /> per un account, sarà possibile accedere a questo account soltanto come account principale. Non sarà possibile accedervi come account secondario.</translation>
+      Se questa policy viene impostata su <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_SIGNIN" /> per un account, sarà possibile accedere a questo account soltanto come account principale. Non sarà possibile accedervi come account secondario.</translation>
 <translation id="8612188068319977428">Controlla la frequenza dei caricamenti di report sullo stato di Chrome.
 
 Sono inclusi i report attivati da <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" />.
 
-Quando il criterio non è configurato, i report vengono caricati ogni 24 ore.
-Quando il criterio è configurato, il numero di ore tra due caricamenti di report consecutivi viene definito da questo criterio.</translation>
+Quando la policy non è configurata, i report vengono caricati ogni 24 ore.
+Quando la policy è configurata, il numero di ore tra due caricamenti di report consecutivi viene definito da questa policy.</translation>
 <translation id="8613622696148230463">La sintassi deprecata precedente verrà disattivata.</translation>
-<translation id="8618037841203431360">Questo criterio consente di stabilire se segnalare o meno i dati del criterio e data e ora del relativo recupero.
+<translation id="8618037841203431360">Questa policy consente di stabilire se segnalare o meno i dati della policy e data e ora del relativo recupero.
 
-Se il criterio <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurato o viene disattivato, verrà ignorato.
+Se la policy <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> non viene configurata o viene disattivata, verrà ignorata.
 
-Se il criterio non viene configurato o viene impostato su True, i dati del criterio e data e ora del relativo recupero vengono raccolti.
-Se il criterio viene impostato su False, i dati del criterio e data e ora del relativo recupero non vengono raccolti.
+Se la policy non viene configurata o viene impostata su True, i dati della policy e data e ora del relativo recupero vengono raccolti.
+Se la policy viene impostata su False, i dati della policy e data e ora del relativo recupero non vengono raccolti.
 
-Questo criterio viene applicato soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
-Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
+Questa policy viene applicata soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
+Questa policy viene sempre applicata per <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="8619748440665904084">Disabilita l'importazione dei dati di compilazione automatica dei moduli alla prima esecuzione</translation>
 <translation id="862621549134406761">Attiva il controllo dell'utilizzo delle chiavi RSA</translation>
 <translation id="8626826495474944836">Richiedi isolamento dei siti per ogni sito</translation>
@@ -10619,24 +10619,24 @@
 <translation id="8637566476051166626">Porte di rete esplicitamente consentite</translation>
 <translation id="8643838501942693770">Consente i cookie di terze parti, ma l'utente può modificare questa impostazione</translation>
 <translation id="864611373241249369">Dopo la disattivazione di <ph name="LACROS_NAME" /> tentiamo di eseguire la migrazione di tutti i dati.</translation>
-<translation id="8648844602494595665">Questo criterio consente di stabilire il trattamento dell'icona lucchetto nella omnibox.
+<translation id="8648844602494595665">Questa policy consente di stabilire il trattamento dell'icona lucchetto nella omnibox.
        A partire da Chrome M93, è presente una nuova icona nella omnibox per le connessioni sicure.
-       Se il criterio viene impostato su Attivato, in Chrome verrà usata l'icona lucchetto esistente per le connessioni sicure.
-       Se il criterio viene impostato su Disattivato o se non viene configurato, in Chrome verrà usata l'icona predefinita per le connessioni sicure.</translation>
+       Se la policy viene impostata su Attivata, in Chrome verrà usata l'icona lucchetto esistente per le connessioni sicure.
+       Se la policy viene impostata su Disattivata o se non viene configurata, in Chrome verrà usata l'icona predefinita per le connessioni sicure.</translation>
 <translation id="8650974590712548439">Posizione del Registro di sistema di Windows per client Windows:</translation>
 <translation id="8653085952260859632">Segnala informazioni sulla memoria</translation>
 <translation id="8653212052128283886">Mostra una visualizzazione della cronologia di Chrome con gruppi di pagine</translation>
-<translation id="8653561013005884087">Se il criterio è impostato su True, la funzione di lettura vocale rimane attivata. Se il criterio è impostato su False, la funzione di lettura vocale rimane disattivata.
+<translation id="8653561013005884087">Se la policy è impostata su True, la funzione di lettura vocale rimane attivata. Se la policy è impostata su False, la funzione di lettura vocale rimane disattivata.
 
-       Se imposti il criterio, gli utenti non possono modificarlo. Se il criterio non è impostato, la funzione di lettura vocale è disattivata all'inizio, ma gli utenti possono attivarla in qualsiasi momento.</translation>
+       Se imposti la policy, gli utenti non possono modificarla. Se la policy non è impostata, la funzione di lettura vocale è disattivata all'inizio, ma gli utenti possono attivarla in qualsiasi momento.</translation>
 <translation id="8656110680728938054">Attiva Seleziona per ascoltare</translation>
-<translation id="8657026983981036230">Se il criterio viene impostato, viene impostata anche la directory utilizzata da Chrome per il download dei file. Viene utilizzata la directory fornita, indipendentemente dal fatto che gli utenti ne specifichino una o abbiano attivato il flag da richiedere ogni volta per il percorso di download.
+<translation id="8657026983981036230">Se la policy viene impostata, viene impostata anche la directory utilizzata da Chrome per il download dei file. Viene utilizzata la directory fornita, indipendentemente dal fatto che gli utenti ne specifichino una o abbiano attivato il flag da richiedere ogni volta per il percorso di download.
 
-      Questo criterio sostituisce il criterio <ph name="DEFAULT_DOWNLOAD_DIRECTORY_POLICY_NAME" />.
+      Questa policy sostituisce la policy <ph name="DEFAULT_DOWNLOAD_DIRECTORY_POLICY_NAME" />.
 
-      Se il criterio non viene configurato, Chrome utilizzerà la directory predefinita per il download, che gli utenti potranno modificare.
+      Se la policy non viene configurata, Chrome utilizzerà la directory predefinita per il download, che gli utenti potranno modificare.
 
-      Su <ph name="PRODUCT_OS_NAME" /> è possibile impostarlo solo sulle directory di Google Drive.
+      Su <ph name="PRODUCT_OS_NAME" /> è possibile impostarla solo sulle directory di Google Drive.
 
       Nota: vedi l'elenco di variabili che puoi utilizzare (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation>
 <translation id="8657543427358173663">Consenti la raccolta di log eventi WebRTC dai servizi Google</translation>
@@ -10646,95 +10646,95 @@
 <translation id="8661538142776716004">Cancella le impostazioni del sito</translation>
 <translation id="8661980316738569557">Attiva alto contrasto</translation>
 <translation id="8665314828727504286">Livello di protezione Navigazione sicura</translation>
-<translation id="8666123502812856425">La configurazione del criterio consente di elencare gli URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso a un dispositivo HID che contiene una raccolta di livello superiore con l'utilizzo dell'HID specificato. Perché il criterio sia valido, ogni elemento nell'elenco richiede entrambi i campi <ph name="USAGES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="USAGES_FIELD_NAME" /> deve avere un campo <ph name="USAGE_PAGE_FIELD_NAME" /> e potrebbe avere un campo <ph name="USAGE_FIELD_NAME" />. Se il campo <ph name="USAGE_FIELD_NAME" /> viene omesso, viene creato un criterio che corrisponde a qualsiasi dispositivo che contiene una raccolta di livello superiore con un utilizzo dalla relativa pagina specificata. Un elemento con un campo <ph name="USAGE_FIELD_NAME" /> senza un campo <ph name="USAGE_PAGE_FIELD_NAME" /> non è valido e viene ignorato.
+<translation id="8666123502812856425">La configurazione della policy consente di elencare gli URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso a un dispositivo HID che contiene una raccolta di livello superiore con l'utilizzo dell'HID specificato. Perché la policy sia valida, ogni elemento nell'elenco richiede entrambi i campi <ph name="USAGES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="USAGES_FIELD_NAME" /> deve avere un campo <ph name="USAGE_PAGE_FIELD_NAME" /> e potrebbe avere un campo <ph name="USAGE_FIELD_NAME" />. Se il campo <ph name="USAGE_FIELD_NAME" /> viene omesso, viene creata una policy che corrisponde a qualsiasi dispositivo che contiene una raccolta di livello superiore con un utilizzo dalla relativa pagina specificata. Un elemento con un campo <ph name="USAGE_FIELD_NAME" /> senza un campo <ph name="USAGE_PAGE_FIELD_NAME" /> non è valido e viene ignorato.
 
-      Se il criterio non viene configurato, viene applicato il criterio <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" />, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, viene applicata la policy <ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" />, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Gli URL in questo criterio non devono essere in conflitto con quelli configurati tramite <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />. In caso di conflitto, questo criterio ha la precedenza su <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
-<translation id="8667754887193084187">Questo criterio consente di controllare in modo rigoroso il tipo MIME per gli script worker.
+      Gli URL in questa policy non devono essere in conflitto con quelli configurati tramite <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />. In caso di conflitto, questa policy ha la precedenza su <ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="8667754887193084187">Questa policy consente di controllare in modo rigoroso il tipo MIME per gli script worker.
 
-      Se il criterio è attivato o non configurato, gli script worker utilizzeranno un controllo rigoroso del tipo MIME per JavaScript, ovvero il nuovo comportamento predefinito. Gli script worker con tipi MIME precedenti verranno rifiutati.
+      Se la policy è attivata o non configurata, gli script worker utilizzeranno un controllo rigoroso del tipo MIME per JavaScript, ovvero il nuovo comportamento predefinito. Gli script worker con tipi MIME precedenti verranno rifiutati.
 
-      Se il criterio è disattivato, gli script worker utilizzeranno un controllo non rigoroso del tipo MIME, pertanto quelli con tipi MIME precedenti, ad esempio <ph name="MIMETYPE_TEXT_ASCII" />, continueranno a essere caricati ed eseguiti.
+      Se la policy è disattivata, gli script worker utilizzeranno un controllo non rigoroso del tipo MIME, pertanto quelli con tipi MIME precedenti, ad esempio <ph name="MIMETYPE_TEXT_ASCII" />, continueranno a essere caricati ed eseguiti.
 
-      Tradizionalmente, i browser usavano il controllo non rigoroso del tipo MIME, per cui erano supportate risorse con vari tipi MIME precedenti. Ad esempio, per le risorse JavaScript <ph name="MIMETYPE_TEXT_ASCII" /> è un tipo MIME supportato precedente. In questo scenario, le risorse vengono caricate come script, un comportamento non previsto che può causare rischi per la sicurezza. A breve Chrome introdurrà il controllo rigoroso del tipo MIME. Il criterio attivato monitorerà il comportamento predefinito. La disattivazione di questo criterio consente agli amministratori di mantenere il comportamento precedente, se necessario.
+      Tradizionalmente, i browser usavano il controllo non rigoroso del tipo MIME, per cui erano supportate risorse con vari tipi MIME precedenti. Ad esempio, per le risorse JavaScript <ph name="MIMETYPE_TEXT_ASCII" /> è un tipo MIME supportato precedente. In questo scenario, le risorse vengono caricate come script, un comportamento non previsto che può causare rischi per la sicurezza. A breve Chrome introdurrà il controllo rigoroso del tipo MIME. La policy attivata monitorerà il comportamento predefinito. La disattivazione di questa policy consente agli amministratori di mantenere il comportamento precedente, se necessario.
 
       Per informazioni dettagliate sui tipi di multimediali JavaScript/ECMAScript, consulta la pagina https://html.spec.whatwg.org/multipage/scripting.html#scriptingLanguage.
       </translation>
 <translation id="8668202868357089313">Overlay di Lens consente agli utenti di eseguire ricerche su Google interagendo con uno screenshot della pagina corrente sovrapposto ai contenuti web effettivi.
 
-Non esiste un'impostazione utente per controllare questa funzionalità, che viene generalmente resa disponibile a tutti gli utenti che usano Google come motore di ricerca predefinito, a meno che non venga disattivata da questo criterio.
+Non esiste un'impostazione utente per controllare questa funzionalità, che viene generalmente resa disponibile a tutti gli utenti che usano Google come motore di ricerca predefinito, a meno che non venga disattivata da questa policy.
 
-Se il criterio viene impostato su 0 - Attivato o se non viene configurato, la funzionalità sarà disponibile per gli utenti.
-Se il criterio viene impostato su 1 - Disattivato, la funzionalità non sarà disponibile.</translation>
+Se la policy viene impostata su 0 - Attivata o se non viene configurata, la funzionalità sarà disponibile per gli utenti.
+Se la policy viene impostata su 1 - Disattivata, la funzionalità non sarà disponibile.</translation>
 <translation id="8668928485126473293">Consente di specificare se <ph name="PRODUCT_NAME" /> eseguirà o meno il motore V8 di JavaScript con le ottimizzazioni di JavaScript più avanzate attivate.
 
-Se le ottimizzazioni di JavaScript vengono disattivate (impostando il valore di questo criterio su 2), <ph name="PRODUCT_NAME" /> potrebbe eseguire il rendering dei contenuti web più lentamente.
+Se le ottimizzazioni di JavaScript vengono disattivate (impostando il valore di questa policy su 2), <ph name="PRODUCT_NAME" /> potrebbe eseguire il rendering dei contenuti web più lentamente.
 
-È possibile eseguire l'override del criterio per pattern URL specifici utilizzando i criteri <ph name="JAVA_SCRIPT_OPTIMIZER_ALLOWED_FOR_SITES_POLICY_NAME" /> e <ph name="JAVA_SCRIPT_OPTIMIZER_BLOCKED_FOR_SITES_POLICY_NAME" />.
+È possibile eseguire l'override della policy per pattern URL specifici utilizzando le policy <ph name="JAVA_SCRIPT_OPTIMIZER_ALLOWED_FOR_SITES_POLICY_NAME" /> e <ph name="JAVA_SCRIPT_OPTIMIZER_BLOCKED_FOR_SITES_POLICY_NAME" />.
 
-Se questo criterio non viene configurato, le ottimizzazioni di JavaScript vengono attivate.</translation>
+Se questa policy non viene configurata, le ottimizzazioni di JavaScript vengono attivate.</translation>
 <translation id="8671119576957984818">Attiva hub di condivisione desktop</translation>
 <translation id="8671193325113134911">Attiva il controllo rigoroso del tipo MIME per gli script worker</translation>
-<translation id="8671303329680827168">Questo criterio è deprecato. Utilizza il criterio "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />".</translation>
-<translation id="8671314659400112135">Se il criterio viene impostato su Attivato o se non viene configurato, <ph name="PRODUCT_NAME" /> potrà applicare la riduzione dei rischi di sicurezza dei punti di estensioni aggiuntivi per bloccare i punti di estensioni precedenti nel processo del browser.
+<translation id="8671303329680827168">Questa policy è deprecata. Utilizza la policy "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />".</translation>
+<translation id="8671314659400112135">Se la policy viene impostata su Attivata o se non viene configurata, <ph name="PRODUCT_NAME" /> potrà applicare la riduzione dei rischi di sicurezza dei punti di estensioni aggiuntivi per bloccare i punti di estensioni precedenti nel processo del browser.
 
-      Se il criterio viene impostato su Disattivato, la sicurezza e la stabilità di <ph name="PRODUCT_NAME" /> diminuiranno, perché sarà possibile caricare codice sconosciuto e potenzialmente dannoso all'interno del processo del browser di <ph name="PRODUCT_NAME" />. Disattiva il criterio soltanto se si verificano problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno del processo del browser di <ph name="PRODUCT_NAME" />.
+      Se la policy viene impostata su Disattivata, la sicurezza e la stabilità di <ph name="PRODUCT_NAME" /> diminuiranno, perché sarà possibile caricare codice sconosciuto e potenzialmente dannoso all'interno del processo del browser di <ph name="PRODUCT_NAME" />. Disattiva la policy soltanto se si verificano problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno del processo del browser di <ph name="PRODUCT_NAME" />.
 
-      Nota: scopri di più sui criteri relativi alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
+      Nota: scopri di più sulle policy relative alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
 <translation id="8672321184841719703">Scegli versione target dell'aggiornamento automatico</translation>
 <translation id="867410340948518937">U2F (Universal Second Factor)</translation>
-<translation id="8676959842615154675">Se il criterio viene impostato su Attivato, l'host di accesso remoto confronta il nome dell'utente locale a cui è associato l'host con il nome dell'Account Google registrato come proprietario dell'host ("mariorossi" se l'host è di proprietà dell'Account Google "mariorossi@example.com"). Questo host non viene avviato se il nome del proprietario dell'host non coincide con quello dell'utente locale a cui è associato l'host. Per forzare l'associazione dell'Account Google del proprietario con un dominio specifico, usa il criterio insieme a <ph name="REMOTE_ACCESS_HOST_DOMAIN_POLICY_NAME" />.
+<translation id="8676959842615154675">Se la policy viene impostata su Attivata, l'host di accesso remoto confronta il nome dell'utente locale a cui è associato l'host con il nome dell'Account Google registrato come proprietario dell'host ("mariorossi" se l'host è di proprietà dell'Account Google "mariorossi@example.com"). Questo host non viene avviato se il nome del proprietario dell'host non coincide con quello dell'utente locale a cui è associato l'host. Per forzare l'associazione dell'Account Google del proprietario con un dominio specifico, usa la policy insieme a <ph name="REMOTE_ACCESS_HOST_DOMAIN_POLICY_NAME" />.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, l'host di accesso remoto può essere associato a qualsiasi utente locale.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, l'host di accesso remoto può essere associato a qualsiasi utente locale.</translation>
 <translation id="867708016260789630">Viene forzato l'uso almeno del livello medio della Modalità con restrizioni di YouTube</translation>
 <translation id="8677853537025397834">Consenti l'API WebHID su questi siti</translation>
-<translation id="8684000025871334499">Configura i criteri di installazione e runtime per le VM Bruschetta su <ph name="PRODUCT_OS_NAME" />. In questo modo gli utenti possono installare VM di terze parti. Questa funzionalità è disattivata per impostazione predefinita.
+<translation id="8684000025871334499">Configura le policy di installazione e runtime per le VM Bruschetta su <ph name="PRODUCT_OS_NAME" />. In questo modo gli utenti possono installare VM di terze parti. Questa funzionalità è disattivata per impostazione predefinita.
 
-Questo criterio è una mappatura degli ID di configurazione alle configurazioni delle VM. Quando una VM viene installata da una configurazione, viene associata in modo permanente all'ID della configurazione e gli eventuali criteri di runtime nella configurazione si applicano alla VM. È possibile installare più VM dalla stessa configurazione su uno stesso dispositivo.</translation>
+Questa policy è una mappatura degli ID di configurazione alle configurazioni delle VM. Quando una VM viene installata da una configurazione, viene associata in modo permanente all'ID della configurazione e le eventuali policy di runtime nella configurazione si applicano alla VM. È possibile installare più VM dalla stessa configurazione su uno stesso dispositivo.</translation>
 <translation id="8685018726115727387">Disabilita l'importazione della cronologia di navigazione alla prima esecuzione</translation>
 <translation id="8685024486845674965">L'avviso di protezione tramite password viene attivato se vengono riutilizzate password</translation>
-<translation id="8685680544554917389">Se il criterio viene configurato su true, <ph name="PRODUCT_NAME" /> può utilizzare la riproduzione automatica per i contenuti multimediali. Se il criterio viene configurato su false, <ph name="PRODUCT_NAME" /> non può più utilizzare la riproduzione automatica per i contenuti multimediali.
+<translation id="8685680544554917389">Se la policy viene configurata su true, <ph name="PRODUCT_NAME" /> può utilizzare la riproduzione automatica per i contenuti multimediali. Se la policy viene configurata su false, <ph name="PRODUCT_NAME" /> non può più utilizzare la riproduzione automatica per i contenuti multimediali.
 
-       Per impostazione predefinita, <ph name="PRODUCT_NAME" /> non utilizza la riproduzione automatica per i contenuti multimediali. Tuttavia, per alcuni pattern URL, è possibile utilizzare il criterio <ph name="AUTOPLAY_ALLOWLIST_POLICY_NAME" /> per modificare questa impostazione.
+       Per impostazione predefinita, <ph name="PRODUCT_NAME" /> non utilizza la riproduzione automatica per i contenuti multimediali. Tuttavia, per alcuni pattern URL, è possibile utilizzare la policy <ph name="AUTOPLAY_ALLOWLIST_POLICY_NAME" /> per modificare questa impostazione.
 
-      Se il criterio viene modificato mentre <ph name="PRODUCT_NAME" /> è in esecuzione, viene applicato solo alle nuove schede aperte.</translation>
+      Se la policy viene modificata mentre <ph name="PRODUCT_NAME" /> è in esecuzione, viene applicata solo alle nuove schede aperte.</translation>
 <translation id="8685748277907759932">Impedisci agli utenti di usare la funzionalità Tocca per cercare</translation>
 <translation id="8686700500128191717">Attiva i report sugli utenti del dispositivo</translation>
 <translation id="8687958770985542440">Riattiva l'API Web Components v0 fino alla versione M84</translation>
 <translation id="8693243869659262736">Utilizza client DNS integrato</translation>
 <translation id="8695006038397632296">Crea o carica richieste di installazione di estensioni nella Console di amministrazione</translation>
-<translation id="8695108198606654558">Questo criterio consente di controllare soltanto il comportamento di importazione alla prima esecuzione dopo l'installazione. Consente una transizione più semplice a <ph name="PRODUCT_NAME" /> negli ambienti in cui è stato ampiamente utilizzato un browser diverso prima dell'installazione del browser. Questo criterio non influisce sulle funzionalità del gestore delle password per gli Account Google.
+<translation id="8695108198606654558">Questa policy consente di controllare soltanto il comportamento di importazione alla prima esecuzione dopo l'installazione. Consente una transizione più semplice a <ph name="PRODUCT_NAME" /> negli ambienti in cui è stato ampiamente utilizzato un browser diverso prima dell'installazione del browser. Questa policy non influisce sulle funzionalità del gestore delle password per gli Account Google.
 
-Se il criterio viene attivato, alla prima esecuzione vengono importate le password salvate dal browser predefinito precedente ed è possibile anche l'importazione manuale dalla pagina Impostazioni.
-Se il criterio viene disattivato, alla prima esecuzione non vengono importate le password salvate e l'importazione manuale dalla pagina Impostazioni viene bloccata.
-Se il criterio non viene configurato, alla prima esecuzione non vengono importate le password salvate, ma l'utente può scegliere di farlo dalla pagina Impostazioni.</translation>
-<translation id="8697738827698599333">La configurazione del criterio consente di specificare gli ID RP WebAuthn per i quali non viene visualizzata alcuna richiesta quando vengono richiesti certificati di attestazione dei token di sicurezza. Viene inoltre inviato un segnale al token di sicurezza per indicare che potrebbe essere utilizzata l'attestazione aziendale. Senza questo segnale, gli utenti di <ph name="PRODUCT_NAME" /> 65 e versioni successive ricevono un messaggio quando i siti richiedono l'attestazione dei token di sicurezza.</translation>
+Se la policy viene attivata, alla prima esecuzione vengono importate le password salvate dal browser predefinito precedente ed è possibile anche l'importazione manuale dalla pagina Impostazioni.
+Se la policy viene disattivata, alla prima esecuzione non vengono importate le password salvate e l'importazione manuale dalla pagina Impostazioni viene bloccata.
+Se la policy non viene configurata, alla prima esecuzione non vengono importate le password salvate, ma l'utente può scegliere di farlo dalla pagina Impostazioni.</translation>
+<translation id="8697738827698599333">La configurazione della policy consente di specificare gli ID RP WebAuthn per i quali non viene visualizzata alcuna richiesta quando vengono richiesti certificati di attestazione dei token di sicurezza. Viene inoltre inviato un segnale al token di sicurezza per indicare che potrebbe essere utilizzata l'attestazione aziendale. Senza questo segnale, gli utenti di <ph name="PRODUCT_NAME" /> 65 e versioni successive ricevono un messaggio quando i siti richiedono l'attestazione dei token di sicurezza.</translation>
 <translation id="8698286761337647563">Numero di giorni di anticipo con cui avvisare gli utenti SAML quando la loro password sta per scadere</translation>
 <translation id="8699392919012430269">Segnala informazioni sul Bluetooth di un dispositivo.
 
-      Se il criterio è impostato su False o non è configurato, le informazioni non vengono segnalate.
-      Se è impostato su True, le informazioni sul Bluetooth del dispositivo vengono segnalate.</translation>
+      Se la policy è impostata su False o non è configurata, le informazioni non vengono segnalate.
+      Se è impostata su True, le informazioni sul Bluetooth del dispositivo vengono segnalate.</translation>
 <translation id="8700633400000170881">Il pulsante sinistro è il principale</translation>
-<translation id="8703378568562190813">La configurazione del criterio consente di elencare i pattern URL che specificano quali app web hanno l'autorizzazione ad accedere a determinati tipi di file.
+<translation id="8703378568562190813">La configurazione della policy consente di elencare i pattern URL che specificano quali app web hanno l'autorizzazione ad accedere a determinati tipi di file.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> si applica per tutte le app web, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+      Se la policy non viene configurata, <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> si applica per tutte le app web, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-      Per i pattern URL che non presentano corrispondenze né con il criterio <ph name="FILE_HANDLING_ALLOWED_FOR_URLS_POLICY_NAME" /> né con <ph name="FILE_HANDLING_BLOCKED_FOR_URLS_POLICY_NAME" />, verranno utilizzati <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> o le impostazioni personali degli utenti in quest'ordine.
+      Per i pattern URL che non presentano corrispondenze né con la policy <ph name="FILE_HANDLING_ALLOWED_FOR_URLS_POLICY_NAME" /> né con <ph name="FILE_HANDLING_BLOCKED_FOR_URLS_POLICY_NAME" />, verranno utilizzati <ph name="DEFAULT_FILE_HANDLING_GUARD_SETTING_POLICY_NAME" /> o le impostazioni personali degli utenti in quest'ordine.
 
-      I pattern URL non devono essere in conflitto con <ph name="FILE_HANDLING_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+      I pattern URL non devono essere in conflitto con <ph name="FILE_HANDLING_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambi.
 
-      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
 <translation id="8703488928438047864">Segnala lo stato della scheda</translation>
 <translation id="8704831857353097849">Elenco dei plug-in disattivati</translation>
-<translation id="8705317513271779649">Questo criterio consente di stabilire l'opzione della scorciatoia selezionata per la rimappatura degli eventi a
+<translation id="8705317513271779649">Questa policy consente di stabilire l'opzione della scorciatoia selezionata per la rimappatura degli eventi a
 F12 nella pagina secondaria per rimappare i tasti. Queste impostazioni si applicano solo alle
 tastiere di <ph name="PRODUCT_OS_NAME" />
-e sono disattivate per impostazione predefinita se il criterio non viene configurato. Se configuri questo criterio,
-gli utenti non potranno modificarlo o eseguirne l'override.</translation>
-<translation id="8705895771006864851">Se il criterio viene impostato su True, agli utenti viene fornita una funzionalità di traduzione, quando opportuno, tramite una barra degli strumenti di traduzione integrata in <ph name="PRODUCT_NAME" /> e un'opzione di traduzione nel menu contestuale visualizzabile facendo clic con il pulsante destro del mouse. Se il criterio viene impostato su False, tutte le funzionalità di traduzione integrate vengono disattivate.
+e sono disattivate per impostazione predefinita se la policy non viene configurata. Se configuri questa policy,
+gli utenti non potranno modificarla o eseguirne l'override.</translation>
+<translation id="8705895771006864851">Se la policy viene impostata su True, agli utenti viene fornita una funzionalità di traduzione, quando opportuno, tramite una barra degli strumenti di traduzione integrata in <ph name="PRODUCT_NAME" /> e un'opzione di traduzione nel menu contestuale visualizzabile facendo clic con il pulsante destro del mouse. Se la policy viene impostata su False, tutte le funzionalità di traduzione integrate vengono disattivate.
 
-      Se imposti il criterio, gli utenti non possono modificare questa funzione. Se non viene impostato, gli utenti possono cambiare l'impostazione.</translation>
+      Se imposti la policy, gli utenti non possono modificare questa funzione. Se non viene impostata, gli utenti possono cambiare l'impostazione.</translation>
 <translation id="8707790573162457301">Esegui la pulizia automatica del disco durante l'accesso</translation>
 <translation id="8712609946151927008">Pianifica intervalli di sospensione settimanali</translation>
 <translation id="8713535263782304771">Disattiva Navigazione sicura</translation>
@@ -10744,11 +10744,11 @@
 <translation id="8715885991031124968">Consenti le finestre di dialogo JavaScript attivate da un diverso frame secondario di origine.</translation>
 <translation id="8720547069538712402">Consenti all'utente di attivare o disattivare il controllo ortografico</translation>
 <translation id="8721685661759544418">Attiva Leggi schermo (distillazione del testo e sintesi vocale) per le pagine web</translation>
-<translation id="8726080977639508431">Questo criterio consente di stabilire in che modo <ph name="PRODUCT_NAME" /> deve interpretare i criteri relativi a elenchi dei siti/greylist della funzionalità Supporto dei browser precedenti. Incide sui seguenti criteri: <ph name="URL_LIST_POLICY_NAME" />, <ph name="URL_GREYLIST_POLICY_NAME" />, <ph name="USE_IE_SITELIST_POLICY_NAME" />, <ph name="EXTERNAL_SITELIST_POLICY_NAME" /> e <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />.
+<translation id="8726080977639508431">Questa policy consente di stabilire in che modo <ph name="PRODUCT_NAME" /> deve interpretare le policy relative a elenchi dei siti/greylist della funzionalità Supporto dei browser precedenti. Incide sulle seguenti policy: <ph name="URL_LIST_POLICY_NAME" />, <ph name="URL_GREYLIST_POLICY_NAME" />, <ph name="USE_IE_SITELIST_POLICY_NAME" />, <ph name="EXTERNAL_SITELIST_POLICY_NAME" /> e <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />.
 
-      Se il criterio viene impostato su "Default" (0) o se non viene configurato, la corrispondenza degli URL è meno rigorosa. Per le regole che non contengono "/" viene cercata una sottostringa in un punto qualsiasi del nome host dell'URL. La corrispondenza del componente del percorso di un URL è sensibile alle maiuscole.
+      Se la policy viene impostata su "Default" (0) o se non viene configurata, la corrispondenza degli URL è meno rigorosa. Per le regole che non contengono "/" viene cercata una sottostringa in un punto qualsiasi del nome host dell'URL. La corrispondenza del componente del percorso di un URL è sensibile alle maiuscole.
 
-      Se il criterio viene impostato su "IESiteListMode" (1), la corrispondenza degli URL è più rigorosa. Per le regole che non contengono "/" viene cercata una corrispondenza soltanto alla fine del nome host. Le regole devono inoltre coincidere con il limite di un nome di dominio. La corrispondenza del componente del percorso di un URL è senza distinzione tra maiuscole e minuscole. Questo criterio è maggiormente compatibile con <ph name="MS_IE_PRODUCT_NAME" /> e <ph name="MS_EDGE_PRODUCT_NAME" />.
+      Se la policy viene impostata su "IESiteListMode" (1), la corrispondenza degli URL è più rigorosa. Per le regole che non contengono "/" viene cercata una corrispondenza soltanto alla fine del nome host. Le regole devono inoltre coincidere con il limite di un nome di dominio. La corrispondenza del componente del percorso di un URL è senza distinzione tra maiuscole e minuscole. Questa policy è maggiormente compatibile con <ph name="MS_IE_PRODUCT_NAME" /> e <ph name="MS_EDGE_PRODUCT_NAME" />.
 
       Ad esempio, con le regole "example.com" e "acme.com/abc":
 
@@ -10765,11 +10765,11 @@
 <translation id="8743902569031401303">Consenti sondaggi di Navigazione sicura</translation>
 <translation id="8744844164152340112">Consente di stabilire il tema (scuro/chiaro/automatico) usato per eseguire il rendering dell'UI durante l'OOBE e nella sessione.
       Con la modalità automatica viene effettuato il passaggio automatico tra tema scuro e tema chiaro all'alba e al tramonto.
-      Questo criterio dovrebbe essere consigliato per dare agli utenti la possibilità di cambiare il tema nelle impostazioni di sistema.</translation>
+      Questa policy dovrebbe essere consigliata per dare agli utenti la possibilità di cambiare il tema nelle impostazioni di sistema.</translation>
 <translation id="8744997936011793680">Chiedi agli utenti di eseguire nuovamente l'autenticazione nel profilo</translation>
-<translation id="8749536858950505376">Se il criterio è impostato su True, il cursore grande rimane attivato. Se il criterio è impostato su False, il cursore grande rimane disattivato.
+<translation id="8749536858950505376">Se la policy è impostata su True, il cursore grande rimane attivato. Se la policy è impostata su False, il cursore grande rimane disattivato.
 
-      Se imposti il criterio, gli utenti non possono modificare la funzionalità. Se il criterio non è impostato, il cursore grande risulta disattivato all'inizio, ma gli utenti possono attivarlo in qualsiasi momento.</translation>
+      Se imposti la policy, gli utenti non possono modificare la funzionalità. Se la policy non è impostata, il cursore grande risulta disattivato all'inizio, ma gli utenti possono attivarlo in qualsiasi momento.</translation>
 <translation id="8750941317035081777">Il valore JavaScript setTimeout() verrà bloccato dopo una normale soglia di nidificazione.</translation>
 <translation id="8753264624162178499">L'opzione Stampa come immagine è a disposizione degli utenti per consentire la rasterizzazione del file PDF prima di inviare il processo di stampa alla destinazione.</translation>
 <translation id="8756304146356317273">Disattiva la generazione di report sulle informazioni relative a estensioni e plug-in</translation>
@@ -10777,50 +10777,50 @@
 <translation id="8758831693895931466">Attiva la registrazione alla gestione del cloud obbligatoria</translation>
 <translation id="8759829385824155666">Tipi di crittografia Kerberos consentiti</translation>
 <translation id="8765401957266318536">Attiva l'integrazione di Lens nell'app Galleria su <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="8766308369516978190">Se il criterio viene impostato su Attivato, gli utenti possono usare <ph name="ASSISTANT_PRODUCT_NAME" /> sul Web, ad esempio per velocizzare i pagamenti e modificare le password. L'utilizzo di <ph name="ASSISTANT_PRODUCT_NAME" /> richiede il consenso aggiuntivo dell'utente e <ph name="ASSISTANT_PRODUCT_NAME" /> verrà eseguito solo se gli utenti scelgono di fornire questo consenso, anche se il criterio è impostato su Attivato.
+<translation id="8766308369516978190">Se la policy viene impostata su Attivata, gli utenti possono usare <ph name="ASSISTANT_PRODUCT_NAME" /> sul web, ad esempio per velocizzare i pagamenti e modificare le password. L'utilizzo di <ph name="ASSISTANT_PRODUCT_NAME" /> richiede il consenso aggiuntivo dell'utente e <ph name="ASSISTANT_PRODUCT_NAME" /> verrà eseguito solo se gli utenti scelgono di fornire questo consenso, anche se la policy è impostata su Attivata.
 
-      Se il criterio viene impostato su Disattivato, gli utenti non possono usare <ph name="ASSISTANT_PRODUCT_NAME" /> sul Web.
+      Se la policy viene impostata su Disattivata, gli utenti non possono usare <ph name="ASSISTANT_PRODUCT_NAME" /> sul web.
 
-      Se il criterio non viene configurato, l'utente può disattivare <ph name="ASSISTANT_PRODUCT_NAME" />.</translation>
+      Se la policy non viene configurata, l'utente può disattivare <ph name="ASSISTANT_PRODUCT_NAME" />.</translation>
 <translation id="8766910236040529804">Abilita container dell'app del renderer</translation>
-<translation id="8767743923206070405">Se il criterio viene impostato su Attivato, nella barra degli strumenti di <ph name="PRODUCT_NAME" /> viene mostrato il pulsante Pagina iniziale. Se viene impostato su Disattivato, il pulsante Pagina iniziale non viene mostrato.
+<translation id="8767743923206070405">Se la policy viene impostata su Attivata, nella barra degli strumenti di <ph name="PRODUCT_NAME" /> viene mostrato il pulsante Pagina iniziale. Se viene impostata su Disattivata, il pulsante Pagina iniziale non viene mostrato.
 
-      Se il criterio viene impostato, gli utenti non possono modificarlo in <ph name="PRODUCT_NAME" />. Se non viene impostato, gli utenti possono decidere se mostrare o meno il pulsante Pagina iniziale.</translation>
-<translation id="8767749141825412133">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="AUTH_SERVER_ALLOWLIST_POLICY_NAME" />.</translation>
-<translation id="8768528324886802059">La configurazione del criterio consente di specificare quale host di messaggistica nativo non è soggetto all'elenco di host non consentiti. Il valore <ph name="WILDCARD_VALUE" /> nell'elenco di host non consentiti comporta il rifiuto di tutti gli host di messaggistica nativi, a meno che non siano consentiti in modo esplicito.
+      Se la policy viene impostata, gli utenti non possono modificarla in <ph name="PRODUCT_NAME" />. Se non viene impostata, gli utenti possono decidere se mostrare o meno il pulsante Pagina iniziale.</translation>
+<translation id="8767749141825412133">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="AUTH_SERVER_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="8768528324886802059">La configurazione della policy consente di specificare quale host di messaggistica nativo non è soggetto all'elenco di host non consentiti. Il valore <ph name="WILDCARD_VALUE" /> nell'elenco di host non consentiti comporta il rifiuto di tutti gli host di messaggistica nativi, a meno che non siano consentiti in modo esplicito.
 
-      Tutti gli host di messaggistica nativi sono consentiti per impostazione predefinita. Tuttavia, se gli host di messaggistica nativi vengono rifiutati dal criterio, l'amministratore può utilizzare la lista consentita per modificare tale criterio.</translation>
+      Tutti gli host di messaggistica nativi sono consentiti per impostazione predefinita. Tuttavia, se gli host di messaggistica nativi vengono rifiutati dalla policy, l'amministratore può utilizzare la lista consentita per modificare tale policy.</translation>
 <translation id="877101880914876353">Intervallo di visualizzazione immagine schermata di accesso dispositivo salvaschermo.</translation>
 <translation id="877557628527387598">Accesso con password</translation>
 <translation id="8777369558049831576">Mostra una casella di controllo "Apri sempre" nella finestra di dialogo relativa ai protocolli esterni</translation>
 <translation id="8778320022586618010">Attiva i report sullo stato della scheda grafica del dispositivo</translation>
 <translation id="8780039702448388726">Disattiva i report sulle informazioni relative alla versione del dispositivo</translation>
-<translation id="8782203407766130175">Questo criterio consente di attivare il supporto di URL di dati per SVGUseElement, che verrà disattivato per impostazione predefinita a partire dalla versione M119.
-      Se questo criterio viene impostato su Attivato, gli URL dei dati continueranno a funzionare in SVGUseElement.
-      Se il criterio viene impostato su Disattivato o se non viene impostato, gli URL dei dati non funzionano in SVGUseElement.</translation>
-<translation id="8786409859071107656">Se il criterio viene impostato su Attivato, viene attivato il criterio di gestione per la condivisione dell'alimentazione USB.
+<translation id="8782203407766130175">Questa policy consente di attivare il supporto di URL di dati per SVGUseElement, che verrà disattivato per impostazione predefinita a partire dalla versione M119.
+      Se questa policy viene impostata su Attivata, gli URL dei dati continueranno a funzionare in SVGUseElement.
+      Se la policy viene impostata su Disattivata o se non viene impostata, gli URL dei dati non funzionano in SVGUseElement.</translation>
+<translation id="8786409859071107656">Se la policy viene impostata su Attivata, viene attivata la policy di gestione per la condivisione dell'alimentazione USB.
 
-      Alcuni dispositivi presentano una specifica porta USB con l'icona di un fulmine o di una batteria che può essere usata per ricaricare i dispositivi usando la batteria di sistema. Questo criterio influisce sul comportamento di ricarica della porta mentre il sistema è in modalità di sospensione o arresto. Non influisce su altre porte USB e sul comportamento di ricarica mentre il sistema è attivo, se la porta USB fornisce costantemente alimentazione.
+      Alcuni dispositivi presentano una specifica porta USB con l'icona di un fulmine o di una batteria che può essere usata per ricaricare i dispositivi usando la batteria di sistema. Questa policy influisce sul comportamento di ricarica della porta mentre il sistema è in modalità di sospensione o arresto. Non influisce su altre porte USB e sul comportamento di ricarica mentre il sistema è attivo, se la porta USB fornisce costantemente alimentazione.
 
       Quando il sistema è in modalità di sospensione, viene fornita alimentazione alla porta USB quando il dispositivo è collegato alla corrente o se il livello della batteria è superiore al 50%. Quando il sistema è spento, viene fornita alimentazione alla porta USB quando il dispositivo è collegato alla corrente.
 
-      Se il criterio viene impostato su Disattivato, non viene fornita alimentazione.
+      Se la policy viene impostata su Disattivata, non viene fornita alimentazione.
 
-      Se il criterio non viene configurato viene considerato attivo e gli utenti non possono disattivarlo.</translation>
+      Se la policy non viene configurata viene considerata attiva e gli utenti non possono disattivarla.</translation>
 <translation id="8789053142986648624">Un account gestito deve essere un account principale e l'utente può importare i dati esistenti al momento della sua creazione</translation>
-<translation id="8789338675663014675">Consente di configurare i criteri relativi alle estensioni. L'utente non può installare estensioni bloccate, a meno che non vengano autorizzate. Puoi anche forzare <ph name="PRODUCT_NAME" /> a installare automaticamente le estensioni, specificandole nel criterio <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />. Le estensioni con installazione forzata vengono installate indipendentemente dalla loro presenza nella lista bloccata.</translation>
+<translation id="8789338675663014675">Consente di configurare le policy relative alle estensioni. L'utente non può installare estensioni bloccate, a meno che non vengano autorizzate. Puoi anche forzare <ph name="PRODUCT_NAME" /> a installare automaticamente le estensioni, specificandole nella policy <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />. Le estensioni con installazione forzata vengono installate indipendentemente dalla loro presenza nella lista bloccata.</translation>
 <translation id="879697755145469671">La finestra coperta non viene rilevata</translation>
 <translation id="8798099450830957504">Predefinito</translation>
-<translation id="879863472982972634">Questo criterio consente di elencare i pattern URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso alle stampanti locali tramite l'API WebPrinting.
+<translation id="879863472982972634">Questa policy consente di elencare i pattern URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso alle stampanti locali tramite l'API WebPrinting.
 
-Se il criterio non viene configurato, <ph name="DEFAULT_WEB_PRINTING_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, vengono applicate le impostazioni personali degli utenti.
+Se la policy non viene configurata, <ph name="DEFAULT_WEB_PRINTING_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, vengono applicate le impostazioni personali degli utenti.
 
-I pattern URL non devono essere in conflitto con <ph name="WEB_PRINTING_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessun criterio ha la precedenza se un URL presenta corrispondenze con entrambi.
+I pattern URL non devono essere in conflitto con <ph name="WEB_PRINTING_BLOCKED_FOR_URLS_POLICY_NAME" />. Nessuna policy ha la precedenza se un URL presenta corrispondenze con entrambi.
 
-Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
-<translation id="8799492680917278474">Se questo criterio viene configurato, le connessioni di accesso remoto si disconnettono automaticamente una volta trascorsi i minuti specificati nel criterio stesso. Questo non impedisce al client di riconnettersi una volta raggiunta la durata massima della sessione. Se il criterio viene impostato su un valore che non rientra nell'intervallo minimo/massimo, l'host potrebbe non essere avviato. Questo criterio non influisce sugli scenari di assistenza remota
+Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy.</translation>
+<translation id="8799492680917278474">Se questa policy viene configurata, le connessioni di accesso remoto si disconnettono automaticamente una volta trascorsi i minuti specificati nella policy stessa. Questo non impedisce al client di riconnettersi una volta raggiunta la durata massima della sessione. Se la policy viene impostata su un valore che non rientra nell'intervallo minimo/massimo, l'host potrebbe non essere avviato. Questa policy non influisce sugli scenari di assistenza remota
 
-          e non ha alcun effetto se non viene configurato. In questo caso, le connessioni di accesso remoto non hanno alcuna durata massima su questa macchina.</translation>
+          e non ha alcun effetto se non viene configurata. In questo caso, le connessioni di accesso remoto non hanno alcuna durata massima su questa macchina.</translation>
 <translation id="8800453707696044281">Imposta il valore percentuale personalizzato raggiunto il quale viene interrotta la ricarica della batteria</translation>
 <translation id="8801680448782904838">Invia a un utente una notifica che comunica che è consigliato o necessario eseguire un riavvio del browser o del dispositivo
 </translation>
@@ -10843,17 +10843,17 @@
 <translation id="8818768076343557335">Prevedi sempre le azioni di rete su ogni rete non cellulare.
           (obsoleto nella versione 50, rimosso nella 52. Dopo la versione 52, se viene impostato il valore 1, viene gestito come 0; prevedi le azioni di rete su qualsiasi connessione di rete).</translation>
 <translation id="8820434908768990758">Attiva l'isolamento dei siti per tutti i siti web, ma consenti agli utenti di disattivarlo</translation>
-<translation id="8821678641132607468">Se il criterio viene impostato su Attivato, la cronologia di navigazione del precedente browser predefinito verrà importata alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, la cronologia di navigazione non verrà importata alla prima esecuzione.
+<translation id="8821678641132607468">Se la policy viene impostata su Attivata, la cronologia di navigazione del precedente browser predefinito verrà importata alla prima esecuzione. Se la policy viene impostata su Disattivata o se non viene configurata, la cronologia di navigazione non verrà importata alla prima esecuzione.
 
-      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo della cronologia di navigazione verrà selezionata o deselezionata in modo che corrisponda al valore del criterio.</translation>
+      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo della cronologia di navigazione verrà selezionata o deselezionata in modo che corrisponda al valore della policy.</translation>
 <translation id="8825154502356129120">Disattiva l'autenticazione Gnubby per l'host di accesso remoto</translation>
-<translation id="8825261718850860999">Se il criterio viene impostato su True o se non viene configurato, la tastiera sullo schermo può essere visualizzata quando prevede che l'utente stia per usarla.
+<translation id="8825261718850860999">Se la policy viene impostata su True o se non viene configurata, la tastiera sullo schermo può essere visualizzata quando prevede che l'utente stia per usarla.
 
-Se il criterio viene impostato su False, la tastiera sullo schermo viene visualizzata soltanto se l'utente tocca esplicitamente un campo di immissione o se un'applicazione lo richiede.
+Se la policy viene impostata su False, la tastiera sullo schermo viene visualizzata soltanto se l'utente tocca esplicitamente un campo di immissione o se un'applicazione lo richiede.
 
-Ad esempio, supponiamo che l'utente usi la tastiera virtuale per digitare il proprio nome utente in una schermata di accesso in due fasi. Quando la schermata di accesso passa alla fase della password, se il criterio è impostato su True, la tastiera virtuale potrebbe rimanere visibile anche se l'utente non ha toccato il campo di immissione della password. Se il criterio è impostato su False, la tastiera virtuale scompare.
+Ad esempio, supponiamo che l'utente usi la tastiera virtuale per digitare il proprio nome utente in una schermata di accesso in due fasi. Quando la schermata di accesso passa alla fase della password, se la policy è impostata su True, la tastiera virtuale potrebbe rimanere visibile anche se l'utente non ha toccato il campo di immissione della password. Se la policy è impostata su False, la tastiera virtuale scompare.
 
-Questo criterio non si applica se la tastiera virtuale viene disattivata (ad esempio se viene usato il criterio <ph name="TOUCH_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" /> o se il dispositivo è connesso a una tastiera fisica).</translation>
+Questa policy non si applica se la tastiera virtuale viene disattivata (ad esempio se viene usata la policy <ph name="TOUCH_VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" /> o se il dispositivo è connesso a una tastiera fisica).</translation>
 <translation id="8825782996899863372">L'avviso di protezione tramite password viene attivato se vengono riutilizzate password in pagine di phishing</translation>
 <translation id="8827275450034266143">La stringa user agent bloccherà la versione principale a 99 e includerà la versione principale del browser nella posizione secondaria.</translation>
 <translation id="8827366480126575426">Il protocollo del gestore di protocollo.</translation>
@@ -10870,41 +10870,41 @@
 <translation id="8830717323204407209">Consente agli utenti di visualizzare la promozione dell'estensione fornitore di credenziali</translation>
 <translation id="8832829916385857156">La pagina Nuova scheda mostra le schede se sono disponibili contenuti</translation>
 <translation id="8833109046074170275">Autenticazione tramite il flusso GAIA predefinito</translation>
-<translation id="8834641112681661892">L'impostazione del criterio specifica il ritardo massimo in millisecondi tra la ricezione dell'invalidamento di un criterio e il recupero del nuovo criterio da parte del servizio di gestione dei dispositivi. I valori validi di questo criterio sono compresi tra 1000 (1 secondo) e 300.000 (5 minuti). I valori che non rientrano in questo intervallo verranno bloccati al relativo limite.
+<translation id="8834641112681661892">L'impostazione della policy specifica il ritardo massimo in millisecondi tra la ricezione dell'invalidamento di una policy e il recupero della nuova policy da parte del servizio di gestione dei dispositivi. I valori validi di questa policy sono compresi tra 1000 (1 secondo) e 300.000 (5 minuti). I valori che non rientrano in questo intervallo verranno bloccati al relativo limite.
 
-      Se il criterio non viene impostato, <ph name="PRODUCT_NAME" /> usa il valore predefinito di 10 secondi.</translation>
-<translation id="8835322836315560274">La configurazione del criterio consente di stabilire il comando da usare per aprire gli URL in un browser alternativo. Per il criterio è possibile impostare i valori <ph name="INTERNET_EXPLORER_VALUE_PLACEHOLDER" />, <ph name="FIREFOX_VALUE_PLACEHOLDER" />, <ph name="SAFARI_VALUE_PLACEHOLDER" />, <ph name="OPERA_VALUE_PLACEHOLDER" />, <ph name="EDGE_VALUE_PLACEHOLDER" /> oppure un percorso file. Se per questo criterio viene impostato un percorso file, tale file viene usato come eseguibile. Il valore <ph name="INTERNET_EXPLORER_VALUE_PLACEHOLDER" /> è disponibile soltanto su <ph name="MS_WIN_NAME" />. I valori <ph name="SAFARI_VALUE_PLACEHOLDER" /> e <ph name="EDGE_VALUE_PLACEHOLDER" /> sono disponibili soltanto su <ph name="MS_WIN_NAME" /> e <ph name="MAC_OS_NAME" />.
+      Se la policy non viene impostata, <ph name="PRODUCT_NAME" /> usa il valore predefinito di 10 secondi.</translation>
+<translation id="8835322836315560274">La configurazione della policy consente di stabilire il comando da usare per aprire gli URL in un browser alternativo. Per la policy è possibile impostare i valori <ph name="INTERNET_EXPLORER_VALUE_PLACEHOLDER" />, <ph name="FIREFOX_VALUE_PLACEHOLDER" />, <ph name="SAFARI_VALUE_PLACEHOLDER" />, <ph name="OPERA_VALUE_PLACEHOLDER" />, <ph name="EDGE_VALUE_PLACEHOLDER" /> oppure un percorso file. Se per questa policy viene impostata un percorso file, tale file viene usato come eseguibile. Il valore <ph name="INTERNET_EXPLORER_VALUE_PLACEHOLDER" /> è disponibile soltanto su <ph name="MS_WIN_NAME" />. I valori <ph name="SAFARI_VALUE_PLACEHOLDER" /> e <ph name="EDGE_VALUE_PLACEHOLDER" /> sono disponibili soltanto su <ph name="MS_WIN_NAME" /> e <ph name="MAC_OS_NAME" />.
 
-      Se il criterio non viene configurato, viene usato un valore predefinito specifico della piattaforma: <ph name="IE_PRODUCT_NAME" /> per <ph name="MS_WIN_NAME" /> oppure <ph name="SAFARI_PRODUCT_NAME" /> per <ph name="MAC_OS_NAME" />. Su <ph name="LINUX_OS_NAME" /> non è possibile aprire un browser alternativo.</translation>
+      Se la policy non viene configurata, viene usato un valore predefinito specifico della piattaforma: <ph name="IE_PRODUCT_NAME" /> per <ph name="MS_WIN_NAME" /> oppure <ph name="SAFARI_PRODUCT_NAME" /> per <ph name="MAC_OS_NAME" />. Su <ph name="LINUX_OS_NAME" /> non è possibile aprire un browser alternativo.</translation>
 <translation id="8836975838488342340">La durata della validità del codice di accesso (in secondi).</translation>
 <translation id="883744045558067826">È possibile utilizzare Chrome Root Store, a seconda del processo di implementazione della funzionalità.</translation>
 <translation id="8837957135252624017">Mantieni aperta almeno una scheda di Chrome</translation>
-<translation id="8839799083601163225">Questo criterio consente di stabilire se eseguire o meno il processo del servizio di rete con limitazione tramite sandbox.
-      Se questo criterio viene attivato, il processo del servizio di rete verrà eseguito con limitazione tramite sandbox.
-      Se questo criterio viene disattivato, il processo del servizio di rete verrà eseguito senza limitazione tramite sandbox. Gli utenti saranno esposti a rischi di sicurezza aggiuntivi correlati all'esecuzione del servizio di rete senza limitazione tramite sandbox.
-      Se questo criterio non viene configurato, verrà usata la configurazione predefinita della sandbox della rete. Questa configurazione potrebbe variare in base alla release di <ph name="PRODUCT_NAME" />, alle prove sul campo attualmente in esecuzione e alla piattaforma.
-      Questo criterio è pensato per offrire alle aziende la possibilità di disattivare la sandbox della rete se usano software di terze parti che interferisce con la sandbox del servizio di rete.</translation>
+<translation id="8839799083601163225">Questa policy consente di stabilire se eseguire o meno il processo del servizio di rete con limitazione tramite sandbox.
+      Se questa policy viene attivata, il processo del servizio di rete verrà eseguito con limitazione tramite sandbox.
+      Se questa policy viene disattivata, il processo del servizio di rete verrà eseguito senza limitazione tramite sandbox. Gli utenti saranno esposti a rischi di sicurezza aggiuntivi correlati all'esecuzione del servizio di rete senza limitazione tramite sandbox.
+      Se questa policy non viene configurata, verrà usata la configurazione predefinita della sandbox della rete. Questa configurazione potrebbe variare in base alla release di <ph name="PRODUCT_NAME" />, alle prove sul campo attualmente in esecuzione e alla piattaforma.
+      Questa policy è pensata per offrire alle aziende la possibilità di disattivare la sandbox della rete se usano software di terze parti che interferisce con la sandbox del servizio di rete.</translation>
 <translation id="8840243776706727185">Funzionalità NewBaseUrlInheritanceBehavior disattivata</translation>
 <translation id="8842208363354615697">Consenti l'attivazione della Modalità solo HTTPS</translation>
 <translation id="8843331294082716286">Non mostrare la richiesta di <ph name="PRIVACY_SANDBOX_NAME" /> agli utenti.</translation>
 <translation id="885147810817138322">Mostra all'utente consigli di contenuti multimediali</translation>
 <translation id="8852579753940989645">Attiva l'integrità del codice del renderer</translation>
-<translation id="8854571659927427063">Se il criterio viene impostato su Attivato, i preferiti del precedente browser predefinito verranno importati alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, i preferiti non verranno importati alla prima esecuzione.
+<translation id="8854571659927427063">Se la policy viene impostata su Attivata, i preferiti del precedente browser predefinito verranno importati alla prima esecuzione. Se la policy viene impostata su Disattivata o se non viene configurata, i preferiti non verranno importati alla prima esecuzione.
 
-      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo dei preferiti verrà selezionata o deselezionata in modo che corrisponda al valore del criterio.</translation>
-<translation id="8857793979935465678">Questo criterio consente di stabilire se la modalità Protezione standard di Navigazione sicura può inviare a Google hash parziali degli URL tramite un proxy con Oblivious HTTP per stabilire se è sicuro visitare gli URL.
+      Gli utenti possono attivare una finestra di dialogo per l'importazione e la casella di controllo dei preferiti verrà selezionata o deselezionata in modo che corrisponda al valore della policy.</translation>
+<translation id="8857793979935465678">Questa policy consente di stabilire se la modalità Protezione standard di Navigazione sicura può inviare a Google hash parziali degli URL tramite un proxy con Oblivious HTTP per stabilire se è sicuro visitare gli URL.
 
-Il proxy consente ai browser di caricare hash parziali di URL su Google senza che vengano collegati all'indirizzo IP dell'utente. Il criterio consente inoltre ai browser di caricare gli hash parziali degli URL con maggiore frequenza per una protezione di Navigazione sicura di migliore qualità.
+Il proxy consente ai browser di caricare hash parziali di URL su Google senza che vengano collegati all'indirizzo IP dell'utente. La policy consente inoltre ai browser di caricare gli hash parziali degli URL con maggiore frequenza per una protezione di Navigazione sicura di migliore qualità.
 
-Questo criterio verrà ignorato se la funzionalità Navigazione sicura viene disattivata o se viene impostata la modalità Protezione avanzata.
+Questa policy verrà ignorata se la funzionalità Navigazione sicura viene disattivata o se viene impostata la modalità Protezione avanzata.
 
-Se il criterio viene attivato o se non viene configurato, le ricerche trasferite al proxy con una protezione maggiore saranno consentite.
+Se la policy viene attivata o se non viene configurata, le ricerche trasferite al proxy con una protezione maggiore saranno consentite.
 
-Se il criterio viene disattivato, le ricerche trasferite al proxy con una protezione maggiore non saranno consentite. Gli hash parziali degli URL verranno caricati direttamente su Google con una frequenza molto inferiore, il che diminuirà la protezione.</translation>
+Se la policy viene disattivata, le ricerche trasferite al proxy con una protezione maggiore non saranno consentite. Gli hash parziali degli URL verranno caricati direttamente su Google con una frequenza molto inferiore, il che diminuirà la protezione.</translation>
 <translation id="8858642179038618439">Forza la Modalità di protezione di YouTube</translation>
 <translation id="8860342862142842017">Disattiva l'applicazione di Certificate Transparency per un elenco di hash subjectPublicKeyInfo</translation>
 <translation id="8860894781631833477">Gli utenti possono configurare il canale di rilascio di <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="8862086508140571198">Questo criterio consente di impostare un elenco di contenuti scaricabili (DLC) da scaricare il prima possibile. I contenuti scaricati saranno poi disponibili per tutti gli utenti sul dispositivo.
+<translation id="8862086508140571198">Questa policy consente di impostare un elenco di contenuti scaricabili (DLC) da scaricare il prima possibile. I contenuti scaricati saranno poi disponibili per tutti gli utenti sul dispositivo.
 
 Questo è utile quando l'amministratore sa che probabilmente gli utenti del dispositivo useranno una funzionalità che richiede la presenza dei contenuti scaricabili.</translation>
 <translation id="8864727482158496280">Non consentire aggiornamenti automatici estesi</translation>
@@ -10914,9 +10914,9 @@
 <translation id="886645881209114007">Consenti agli utenti di usare un <ph name="PLUGIN_VM_NAME" /> su <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="8867894831390233044">Consente di stabilire se gli utenti possono o meno usare il debug remoto.
 
-      Se questo criterio è impostato su Attivato o non viene configurato, gli utenti possono usare il debug remoto specificando le opzioni di riga di comando --remote-debugging-port e --remote-debugging-pipe.
+      Se questa policy è impostata su Attivata o non viene configurata, gli utenti possono usare il debug remoto specificando le opzioni di riga di comando --remote-debugging-port e --remote-debugging-pipe.
 
-      Se è impostato su Disattivato, gli utenti non possono usare il debug remoto.</translation>
+      Se è impostata su Disattivata, gli utenti non possono usare il debug remoto.</translation>
 <translation id="8870995142109792885">Attiva la ricerca dei plug-in</translation>
 <translation id="8871974300055371298">Impostazioni contenuti</translation>
 <translation id="8872029059067980702">Non visualizzare la schermata introduttiva di Gemini durante l'accesso</translation>
@@ -10924,19 +10924,19 @@
 
           Questa funzione consente di fare clic automaticamente all'arresto del puntatore del mouse, senza dover premere fisicamente i pulsanti del mouse o del touchpad.
 
-          Se questo criterio viene impostato su true, la funzione di clic automatico sarà sempre attiva nella schermata di accesso.
+          Se questa policy viene impostata su true, la funzione di clic automatico sarà sempre attiva nella schermata di accesso.
 
-          Se questo criterio viene impostato su false, la funzione di clic automatico sarà sempre disattivata nella schermata di accesso.
+          Se questa policy viene impostata su false, la funzione di clic automatico sarà sempre disattivata nella schermata di accesso.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente la funzione di clic automatico è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
-<translation id="8873089107816226072">Questo criterio consente di specificare il fuso orario di un dispositivo e di disattivare la regolazione automatica del fuso orario in base alla località, sostituendo il criterio <ph name="SYSTEM_TIMEZONE_AUTOMATIC_DETECTION_POLICY_NAME" />. Gli utenti non possono cambiare il fuso orario.
+          Se questa policy non viene impostata, inizialmente la funzione di clic automatico è disattivata nella schermata di accesso, ma l'utente può attivarla in qualsiasi momento.</translation>
+<translation id="8873089107816226072">Questa policy consente di specificare il fuso orario di un dispositivo e di disattivare la regolazione automatica del fuso orario in base alla località, sostituendo la policy <ph name="SYSTEM_TIMEZONE_AUTOMATIC_DETECTION_POLICY_NAME" />. Gli utenti non possono cambiare il fuso orario.
 
-      Sui nuovi dispositivi è impostato il fuso orario della costa del Pacifico degli Stati Uniti. Il formato del valore segue quello dei nomi nello IANA Time Zone Database (https://en.wikipedia.org/wiki/Tz_database). Se viene inserito un valore non valido, per il criterio viene usato il fuso orario GMT.
+      Sui nuovi dispositivi è impostato il fuso orario della costa del Pacifico degli Stati Uniti. Il formato del valore segue quello dei nomi nello IANA Time Zone Database (https://en.wikipedia.org/wiki/Tz_database). Se viene inserito un valore non valido, per la policy viene usato il fuso orario GMT.
 
-      Se il criterio non viene impostato o se inserisci una stringa vuota, sul dispositivo viene usato il fuso orario attualmente attivo, che però potrà essere cambiato dagli utenti.</translation>
-<translation id="8875202330803089599">Se il criterio viene configurato, gli utenti non potranno bypassare le decisioni relative alla sicurezza dei download.
+      Se la policy non viene impostata o se inserisci una stringa vuota, sul dispositivo viene usato il fuso orario attualmente attivo, che però potrà essere cambiato dagli utenti.</translation>
+<translation id="8875202330803089599">Se la policy viene configurata, gli utenti non potranno bypassare le decisioni relative alla sicurezza dei download.
 
       In Chrome ci sono tanti tipi di avvisi relativi ai download, suddivisi approssimativamente nelle seguenti categorie (scopri di più sui risultati di Navigazione sicura all'indirizzo https://support.google.com/chrome/?p=ib_download_blocked):
 
@@ -10944,7 +10944,7 @@
       * Insoliti o indesiderati, come segnalato dal server di Navigazione sicura
       * Un tipo di file pericoloso (ad es. tutti i download SWF e diversi download EXE)
 
-      Se il criterio viene configurato, vengono bloccati diversi sottoinsiemi di questi download, in base al valore del criterio:
+      Se la policy viene configurata, vengono bloccati diversi sottoinsiemi di questi download, in base al valore della policy:
 
       0: Nessuna limitazione speciale. Valore predefinito.
 
@@ -10962,8 +10962,8 @@
 Questi dati hardware vengono utilizzati per migliorare il rendimento generale di <ph name="PRODUCT_OS_FLEX_NAME" />.
 Ad esempio, potremmo analizzare l'impatto di un arresto anomalo in base alla CPU o dare la priorità a una correzione di bug in base al numero di dispositivi che condividono un componente.
 
-Se il criterio viene attivato o se non viene configurato, verranno inviati ulteriori dettagli sull'hardware dai dispositivi <ph name="PRODUCT_OS_FLEX_NAME" />.
-Se viene disattivato, vengono inviati solo i dati hardware standard.</translation>
+Se la policy viene attivata o se non viene configurata, verranno inviati ulteriori dettagli sull'hardware dai dispositivi <ph name="PRODUCT_OS_FLEX_NAME" />.
+Se viene disattivata, vengono inviati solo i dati hardware standard.</translation>
 <translation id="8880294585549584028">Consenti l'accesso di scrittura di file e directory su questi siti</translation>
 <translation id="8882006618241293596">Blocca il plug-in <ph name="FLASH_PLUGIN_NAME" /> su questi siti</translation>
 <translation id="8882255181490012651">Non consente agli utenti che hanno attivato Phone Hub di accedere a foto e video recenti acquisiti sul loro telefono</translation>
@@ -10988,10 +10988,10 @@
 Se un'immagine è già stata scaricata e la policy viene successivamente aggiornata, l'immagine verrà rimossa soltanto dopo che l'utente si è disconnesso o ha riavviato il dispositivo.
 
 Questa policy consente di controllare <ph name="ARC_VM" /> soltanto su <ph name="PRODUCT_OS_FLEX_NAME" />. Per <ph name="PRODUCT_NAME" />, consulta la policy <ph name="ARC_ENABLED_POLICY_NAME" /> per ulteriori dettagli.</translation>
-<translation id="8903283771634816230">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> usa la stampante predefinita del sistema operativo come destinazione predefinita per l'anteprima di stampa.
+<translation id="8903283771634816230">Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> usa la stampante predefinita del sistema operativo come destinazione predefinita per l'anteprima di stampa.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, <ph name="PRODUCT_NAME" /> usa la stampante utilizzata più di recente come destinazione predefinita per l'anteprima di stampa.</translation>
-<translation id="8904721489610046109">La configurazione del criterio consente di attivare o disattivare la limitazione della banda. Ciò significa che il sistema viene limitato per raggiungere le velocità di caricamento e di download indicate (in kbit/s). Viene applicato a tutti gli utenti e a tutte le interfacce del dispositivo.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, <ph name="PRODUCT_NAME" /> usa la stampante utilizzata più di recente come destinazione predefinita per l'anteprima di stampa.</translation>
+<translation id="8904721489610046109">La configurazione della policy consente di attivare o disattivare la limitazione della banda. Ciò significa che il sistema viene limitato per raggiungere le velocità di caricamento e di download indicate (in kbit/s). Viene applicato a tutti gli utenti e a tutte le interfacce del dispositivo.</translation>
 <translation id="8906768759089290519">Attiva modalità ospite</translation>
 <translation id="8908294717014659003">Consente di stabilire se i siti web possono accedere ai dispositivi di acquisizione dei contenuti multimediali. L'accesso ai dispositivi di acquisizione dei contenuti multimediali può essere consentito per impostazione predefinita oppure l'utente può visualizzare una richiesta ogni volta che un sito web vuole accedere ai dispositivi di acquisizione dei contenuti multimediali.
 
@@ -11000,10 +11000,10 @@
 <translation id="8911348623012274122">Imposta un limite di memoria per le istanze di Chrome</translation>
 <translation id="8911736066340032670">Consente di segnalare informazioni relative al display, come la frequenza di aggiornamento, e alla grafica, ad esempio la versione del driver.
 
-      Se il criterio viene impostato su false o non viene impostato, gli stati relativi a display e grafica non vengono segnalati. Se viene impostato su true, gli stati relativi a display e grafica vengono segnalati.</translation>
+      Se la policy viene impostata su false o non viene impostata, gli stati relativi a display e grafica non vengono segnalati. Se viene impostata su true, gli stati relativi a display e grafica vengono segnalati.</translation>
 <translation id="891435090623616439">codificato sotto forma di stringa JSON; per informazioni dettagliate, visita la pagina <ph name="COMPLEX_POLICIES_URL" /></translation>
 <translation id="8917070657147922192">Consenti agli utenti di gestire i certificati CA installati.</translation>
-<translation id="8919100556245407184">Il periodo di tempo, in giorni, dopo il post di scadenza dell'aggiornamento automatico trascorso il quale l'utente viene disconnesso dall'account se la versione di <ph name="PRODUCT_OS_NAME" /> è precedente a quella specificata nel criterio <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />.</translation>
+<translation id="8919100556245407184">Il periodo di tempo, in giorni, dopo il post di scadenza dell'aggiornamento automatico trascorso il quale l'utente viene disconnesso dall'account se la versione di <ph name="PRODUCT_OS_NAME" /> è precedente a quella specificata nella policy <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />.</translation>
 <translation id="8919369436496201075">Consenti al dispositivo di ricevere aggiornamenti LTS</translation>
 <translation id="8921669704201370845">Attiva reporting su cloud di <ph name="PRODUCT_NAME" /> per profilo gestito</translation>
 <translation id="8922231993239705844">Disattiva l'evidenziazione del puntatore</translation>
@@ -11011,50 +11011,50 @@
 <translation id="8923028772162236077">Visualizza l'URL predefinito</translation>
 <translation id="8930064580550462145">Durante l'accesso tramite la schermata di blocco, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline).
 
-      Se per questo criterio viene impostato il valore -2, verrà usato lo stesso valore del limite relativo al tempo di accesso offline nella schermata di accesso del criterio <ph name="POLICY" />.
+      Se per questa policy viene impostato il valore -2, verrà usato lo stesso valore del limite relativo al tempo di accesso offline nella schermata di accesso della policy <ph name="POLICY" />.
 
-      Se questo criterio non viene configurato o se viene impostato il valore -1, non viene applicata l'autenticazione online nella schermata di blocco e l'utente potrà usare l'autenticazione offline finché un motivo diverso da quello di questo criterio non applicherà un'autenticazione online.
+      Se questa policy non viene configurata o se viene impostato il valore -1, non viene applicata l'autenticazione online nella schermata di blocco e l'utente potrà usare l'autenticazione offline finché un motivo diverso da quello di questa policy non applicherà un'autenticazione online.
 
-      Se per il criterio viene impostato il valore 0, sarà sempre richiesta l'autenticazione online.
+      Se per la policy viene impostato il valore 0, sarà sempre richiesta l'autenticazione online.
 
-      Se per questo criterio viene impostato qualsiasi altro valore, il criterio consente di specificare il numero di giorni dall'ultima autenticazione online trascorsi i quali l'utente deve usare di nuovo l'autenticazione online per l'accesso successivo tramite la schermata di blocco.
+      Se per questa policy viene impostato qualsiasi altro valore, la policy consente di specificare il numero di giorni dall'ultima autenticazione online trascorsi i quali l'utente deve usare di nuovo l'autenticazione online per l'accesso successivo tramite la schermata di blocco.
 
-      Questo criterio viene applicato per gli utenti che si sono autenticati tramite GAIA senza SAML.
+      Questa policy viene applicata per gli utenti che si sono autenticati tramite GAIA senza SAML.
 
-      Il valore del criterio deve essere specificato in giorni.</translation>
-<translation id="8931076230631115330">Se il criterio viene impostato, <ph name="PRODUCT_NAME" /> cerca di registrarsi con la gestione del browser <ph name="CHROME_ENTERPRISE_CORE_NAME" />. Il valore del criterio è un token di registrazione che puoi recuperare da <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
+      Il valore della policy deve essere specificato in giorni.</translation>
+<translation id="8931076230631115330">Se la policy viene impostata, <ph name="PRODUCT_NAME" /> cerca di registrarsi con la gestione del browser <ph name="CHROME_ENTERPRISE_CORE_NAME" />. Il valore della policy è un token di registrazione che puoi recuperare da <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.
 
 Per maggiori dettagli, vai su https://support.google.com/chrome/a/answer/9301891.</translation>
-<translation id="8931555638815157255">Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano periodicamente la versione dei relativi sistemi operativi e firmware.
+<translation id="8931555638815157255">Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano periodicamente la versione dei relativi sistemi operativi e firmware.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano le informazioni sulla versione.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non segnalano le informazioni sulla versione.</translation>
 <translation id="8934296213794658971">Impostazioni per l'integrazione di Gemini</translation>
 <translation id="8934485887744460569">Configura il modo in cui <ph name="PRODUCT_NAME" /> scarica il modello di base GenAI e lo utilizza localmente per l'inferenza. 
 
-Se il criterio viene impostato su Consentito (0) o se non viene configurato, il modello viene scaricato automaticamente e utilizzato per l'inferenza.
+Se la policy viene impostata su Consentito (0) o se non viene configurata, il modello viene scaricato automaticamente e utilizzato per l'inferenza.
 
-Se il criterio viene impostato su Disattivato (1), il modello non viene scaricato.
+Se la policy viene impostata su Disattivato (1), il modello non viene scaricato.
 
 Il download del modello può essere disattivato anche da <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" />.</translation>
-<translation id="8937282917198525844"> A partire dalla versione M81, abbiamo rinnovato aspetto e design degli elementi di controllo modulo standard (ad esempio, &lt;select&gt;, &lt;button&gt;, &lt;input type=date&gt;), con una superiore accessibilità e una migliore uniformità della piattaforma. Questo criterio ripristina i precedenti controlli modulo "legacy" fino alla versione M84.
+<translation id="8937282917198525844"> A partire dalla versione M81, abbiamo rinnovato aspetto e design degli elementi di controllo modulo standard (ad esempio, &lt;select&gt;, &lt;button&gt;, &lt;input type=date&gt;), con una superiore accessibilità e una migliore uniformità della piattaforma. Questa policy ripristina i precedenti controlli modulo "legacy" fino alla versione M84.
 
-      Se questo criterio viene impostato su True, gli elementi di controllo modulo "legacy" verranno utilizzati per tutti i siti.
+      Se questa policy viene impostata su True, gli elementi di controllo modulo "legacy" verranno utilizzati per tutti i siti.
 
-      Se questo criterio viene impostato su False o non viene impostato, gli elementi di controllo modulo verranno attivati come nel lancio delle versioni M81, M82 e M83.
+      Se questa policy viene impostata su False o non viene impostata, gli elementi di controllo modulo verranno attivati come nel lancio delle versioni M81, M82 e M83.
 
-      Questo criterio verrà rimosso nelle versioni successive alla versione 84 di Chrome.</translation>
+      Questa policy verrà rimossa nelle versioni successive alla versione 84 di Chrome.</translation>
 <translation id="8940173892071872775">Consente di stabilire le azioni da eseguire quando il browser è inattivo.</translation>
 <translation id="8941673774841510404">Consente di stabilire le impostazioni del salvaschermo per la schermata di accesso del dispositivo e la schermata di blocco dell'utente.</translation>
 <translation id="8942616385591203339">Questa norma consente di controllare se il consenso alla sincronizzazione può essere mostrato all'utente durante il primo accesso. Dovrebbe essere impostata su false se tale consenso non è mai necessario per l'utente.
       Se impostata su false, il consenso alla sincronizzazione non verrà visualizzato.
       Se impostata su true o non viene impostata, il consenso alla sincronizzazione può essere visualizzato.</translation>
-<translation id="8943744188513019866">Questo criterio indica la versione corrente valida dei Termini di servizio dell'account della scuola,
+<translation id="8943744188513019866">Questa policy indica la versione corrente valida dei Termini di servizio dell'account della scuola,
       che viene confrontata con l'ultima versione accettata dal genitore e utilizzata per suggerire al genitore stesso il rinnovo dell'autorizzazione quando necessario.
 
-      Se questo criterio viene configurato, la versione dei Termini di servizio può essere convalidata.
-      Se non viene configurato, non è possibile verificare la validità dei Termini di servizio dell'account della scuola.
+      Se questa policy viene configurata, la versione dei Termini di servizio può essere convalidata.
+      Se non viene configurata, non è possibile verificare la validità dei Termini di servizio dell'account della scuola.
 
-      Questo criterio viene utilizzato unicamente per gli utenti di Family Link.</translation>
+      Questa policy viene utilizzata unicamente per gli utenti di Family Link.</translation>
 <translation id="8947415621777543415">Segnala posizione del dispositivo</translation>
 <translation id="8948062138228904066">Lista consentita di server di autenticazione</translation>
 <translation id="8951350807133946005">Impostazione directory della cache su disco</translation>
@@ -11066,11 +11066,11 @@
 
 Il nuovo comportamento potrebbe rendere inaccessibili alcuni siti web.
 
-Se questo criterio viene attivato, verrà utilizzato il nuovo comportamento.
+Se questa policy viene attivata, verrà utilizzato il nuovo comportamento.
 
-Se viene disattivato, verrà utilizzato il comportamento precedente.
+Se viene disattivata, verrà utilizzato il comportamento precedente.
 
-Se non viene configurato, verrà utilizzato il nuovo comportamento, esattamente come avviene per gli altri utenti di Chromium.</translation>
+Se non viene configurata, verrà utilizzato il nuovo comportamento, esattamente come avviene per gli altri utenti di Chromium.</translation>
 <translation id="8955719471735800169">Torna all'inizio</translation>
 <translation id="8956312248048980644">Consente per impostazione predefinita il clustering di agenti in base all'origine.</translation>
 <translation id="8963464192296208229">Le impostazioni di F11 usano la scorciatoia che contiene il tasto di modifica Alt</translation>
@@ -11083,7 +11083,7 @@
 <translation id="8970205333161758602">Eliminazione del messaggio di richiesta di turndown di <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8973579598359969188">Scegli se è possibile o meno mostrare la richiesta di <ph name="PRIVACY_SANDBOX_NAME" /> ai tuoi utenti</translation>
 <translation id="8974457039656761249">Controlla la funzionalità di scrittura predittiva sulla tastiera fisica</translation>
-<translation id="8974588819713914715">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="URL_ALLOWLIST_POLICY_NAME" />.</translation>
+<translation id="8974588819713914715">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="URL_ALLOWLIST_POLICY_NAME" />.</translation>
 <translation id="8976248126101463034">Consenti l'autenticazione Gnubby per gli host di accesso remoto</translation>
 <translation id="8976531594979650914">Usa stampante di sistema come predefinita</translation>
 <translation id="8977192934280677167">Consenti l'accesso al provider di ricerca predefinito dal menu contestuale di ricerca</translation>
@@ -11103,71 +11103,71 @@
 Per ulteriori informazioni sulla gestione dei dati per le funzionalità di AI generativa, visita la pagina https://support.google.com/chrome/a?p=generative_ai_settings.</translation>
 <translation id="8986738188516411168">Migliora la produttività consentendo la visualizzazione di informazioni delle app e dei servizi Google sulle piattaforme di sistema di <ph name="PRODUCT_OS_NAME" />.
 
-Se questo criterio viene attivato o se non viene configurato, le integrazioni selezionate in <ph name="CONTEXTUAL_GOOGLE_INTEGRATIONS_CONFIGURATION" /> verranno attivate.
+Se questa policy viene attivata o se non viene configurata, le integrazioni selezionate in <ph name="CONTEXTUAL_GOOGLE_INTEGRATIONS_CONFIGURATION" /> verranno attivate.
 
-Se questo criterio viene disattivato, tutte le integrazioni verranno disattivate.</translation>
+Se questa policy viene disattivata, tutte le integrazioni verranno disattivate.</translation>
 <translation id="8992176907758534924">Non consentire la visualizzazione di immagini nei siti</translation>
 <translation id="8994850249590725417">Non mostrare notifiche sulla privacy</translation>
-<translation id="8994954504552592260">Consente di attivare la migrazione dei dispositivi gestiti <ph name="MS_AD_NAME" /> nella gestione del cloud. Questo criterio consente di avviare da remoto una migrazione touchless di più dispositivi di una società. Inoltre, la migrazione sarà il più trasparente possibile per gli utenti finali.
+<translation id="8994954504552592260">Consente di attivare la migrazione dei dispositivi gestiti <ph name="MS_AD_NAME" /> nella gestione del cloud. Questa policy consente di avviare da remoto una migrazione touchless di più dispositivi di una società. Inoltre, la migrazione sarà il più trasparente possibile per gli utenti finali.
 
-      Se questo criterio viene attivato e l'ID di registrazione è già stato caricato su DMServer, verrà attivato il Powerwash da remoto del dispositivo.
+      Se questa policy viene attivata e l'ID di registrazione è già stato caricato su DMServer, verrà attivato il Powerwash da remoto del dispositivo.
 
-      Se questo criterio viene disattivato o se non viene configurato, il Powerwash da remoto del dispositivo non verrà attivato, a prescindere dallo stato di caricamento dell'ID di registrazione.
+      Se questa policy viene disattivata o se non viene configurata, il Powerwash da remoto del dispositivo non verrà attivato, a prescindere dallo stato di caricamento dell'ID di registrazione.
 
       Il Powerwash viene attivato ogni volta che viene caricata la schermata di accesso e viene ripetuto ogni ora se sul dispositivo rimane visualizzata la schermata di accesso. Ciò consente di evitare che la migrazione inizi nel corso di una sessione utente causando potenziali problemi agli utenti finali.</translation>
-<translation id="8995019632040507706">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che possono accedere ai sensori, come i sensori di movimento e di luce.
+<translation id="8995019632040507706">Se la policy viene configurata, puoi impostare un elenco di pattern URL che specificano i siti che possono accedere ai sensori, come i sensori di movimento e di luce.
 
-      Se il criterio non viene configurato, <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+      Se la policy non viene configurata, <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
-      Se lo stesso pattern URL esiste sia in questo criterio sia nel criterio <ph name="SENSORS_BLOCKED_FOR_URLS_POLICY_NAME" />, quest'ultimo ha la priorità e l'accesso ai sensori di movimento o di luce verrà bloccato.
+      Se lo stesso pattern URL esiste sia in questa policy sia nella policy <ph name="SENSORS_BLOCKED_FOR_URLS_POLICY_NAME" />, quest'ultima ha la priorità e l'accesso ai sensori di movimento o di luce verrà bloccato.
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.</translation>
 <translation id="900032518062285306">Consenti la previsione di compilazione automatica senza migliorare i modelli di AI.</translation>
 <translation id="9003823644527627017">Configura VM Bruschetta su <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="9004469022085379212">Se il criterio viene attivato, al dispositivo viene consentito di eseguire macchine virtuali su <ph name="PRODUCT_OS_NAME" />. I criteri <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> e <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> devono essere attivati per utilizzare <ph name="PRODUCT_CROSTINI_NAME" />. Se il criterio viene disattivato, significa che il dispositivo non può eseguire macchine virtuali. Tramite la disattivazione del criterio, questo viene applicato all'avvio di nuove macchine virtuali, non a quelle già in esecuzione.
+<translation id="9004469022085379212">Se la policy viene attivata, al dispositivo viene consentito di eseguire macchine virtuali su <ph name="PRODUCT_OS_NAME" />. Le policy <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> e <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> devono essere attivate per utilizzare <ph name="PRODUCT_CROSTINI_NAME" />. Se la policy viene disattivata, significa che il dispositivo non può eseguire macchine virtuali. Tramite la disattivazione della policy, questa viene applicata all'avvio di nuove macchine virtuali, non a quelle già in esecuzione.
 
-Se il criterio non è impostato su un dispositivo gestito, quest'ultimo non può eseguire macchine virtuali. I dispositivi non gestiti non possono eseguire macchine virtuali.</translation>
-<translation id="9005558710192691218">Questo criterio consente agli amministratori di limitare gli account autorizzati ad accedere a <ph name="MICROSOFT_ONE_DRIVE_NAME" /> quando il criterio <ph name="MICROSOFT_ONE_DRIVE_MOUNT_POLICY_NAME" /> è attivato.
+Se la policy non è impostata su un dispositivo gestito, quest'ultimo non può eseguire macchine virtuali. I dispositivi non gestiti non possono eseguire macchine virtuali.</translation>
+<translation id="9005558710192691218">Questa policy consente agli amministratori di limitare gli account autorizzati ad accedere a <ph name="MICROSOFT_ONE_DRIVE_NAME" /> quando la policy <ph name="MICROSOFT_ONE_DRIVE_MOUNT_POLICY_NAME" /> è attivata.
 
-Se questo criterio contiene il valore "<ph name="COMMON_NAME" />", per accedere è possibile utilizzare qualsiasi account.
+Se questa policy contiene il valore "<ph name="COMMON_NAME" />", per accedere è possibile utilizzare qualsiasi account.
 
-Se questo criterio contiene il valore "<ph name="ORGANIZATIONS_NAME" />", per accedere è possibile utilizzare account di lavoro o della scuola.
+Se questa policy contiene il valore "<ph name="ORGANIZATIONS_NAME" />", per accedere è possibile utilizzare account di lavoro o della scuola.
 
-Se questo criterio contiene il valore "<ph name="CONSUMERS_NAME" />", per accedere è possibile utilizzare account <ph name="MICROSOFT_NAME" /> personali.
+Se questa policy contiene il valore "<ph name="CONSUMERS_NAME" />", per accedere è possibile utilizzare account <ph name="MICROSOFT_NAME" /> personali.
 
-Se questo criterio contiene nomi di dominio o ID tenant, per accedere è possibile utilizzare gli account di questi nomi di dominio o ID tenant (vedi la pagina https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-protocols#endpoints).
+Se questa policy contiene nomi di dominio o ID tenant, per accedere è possibile utilizzare gli account di questi nomi di dominio o ID tenant (vedi la pagina https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-protocols#endpoints).
 
-Se questo criterio non viene configurato o se contiene soltanto un valore vuoto, si comporta come se "<ph name="COMMON_NAME" />" fosse stato specificato per gli utenti normali e "<ph name="ORGANIZATIONS_NAME" />" per gli utenti aziendali.
+Se questa policy non viene configurata o se contiene soltanto un valore vuoto, si comporta come se "<ph name="COMMON_NAME" />" fosse stato specificato per gli utenti normali e "<ph name="ORGANIZATIONS_NAME" />" per gli utenti aziendali.
 
 La modifica delle limitazioni potrebbe comportare la disconnessione degli utenti dal proprio account <ph name="MICROSOFT_ONE_DRIVE_NAME" /> se non ottempera alle nuove limitazioni.
 
 Nota: al momento verrà presa in considerazione solo la prima voce. Le estensioni successive supporteranno più voci.</translation>
-<translation id="9007632512838819703">Questo criterio è deprecato. Usa il criterio <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" />.
+<translation id="9007632512838819703">Questa policy è deprecata. Usa la policy <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" />.
 
       Consente di forzare la disattivazione delle lingue per il controllo ortografico. Le lingue dell'elenco non riconosciute verranno ignorate.
 
-      Se attivi questo criterio, il controllo ortografico verrà disattivato per le lingue specificate. L'utente può comunque attivare o disattivare il controllo ortografico per le lingue che non sono nell'elenco.
+      Se attivi questa policy, il controllo ortografico verrà disattivato per le lingue specificate. L'utente può comunque attivare o disattivare il controllo ortografico per le lingue che non sono nell'elenco.
 
-      Se il criterio non viene impostato o viene disattivato, le preferenze di controllo ortografico dell'utente rimarranno invariate.
+      Se la policy non viene impostata o viene disattivata, le preferenze di controllo ortografico dell'utente rimarranno invariate.
 
-      Se il criterio <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> è impostato su False, questo criterio non avrà effetto.
+      Se la policy <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> è impostata su False, questa policy non avrà effetto.
 
-      Se una lingua è inclusa sia in questo criterio sia nel criterio <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, quest'ultimo ha la priorità e verrà attivata la lingua per il controllo ortografico.
+      Se una lingua è inclusa sia in questa policy sia nella policy <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, quest'ultima ha la priorità e verrà attivata la lingua per il controllo ortografico.
 
       Le lingue attualmente supportate sono: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
-<translation id="9009119876570708617">Questo criterio è stato rimosso a partire dalla versione M85. Usa il criterio <ph name="POLICY_NAME" /> per consentire i contenuti non sicuri per singolo sito.
-       Questo criterio consente di stabilire il trattamento dei contenuti misti (contenuti HTTP in siti HTTPS) nel browser.
-       Se il criterio viene impostato su true o non viene impostato, viene eseguito l'upgrade automatico a HTTPS dei contenuti misti di audio e video (vale a dire che l'URL viene riscritto come HTTPS, senza una riserva se la risorsa non è disponibile tramite HTTPS) e nella barra degli URL viene mostrato un avviso "Non sicuro" per i contenuti misti delle immagini.
-       Se il criterio viene impostato su false, vengono disattivati gli upgrade automatici di audio e video e non viene mostrato un avviso per le immagini.
-       Questo criterio non influisce su tipi di contenuti misti diversi da audio, video e immagini.
-       Questo criterio non avrà più effetto dalla versione 84 di <ph name="PRODUCT_NAME" />.</translation>
-<translation id="9009505213521705952">Se il criterio <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> è impostato su Disattivato, la configurazione di questo criterio ti consente di impostare un elenco di pattern di origini che specificano i siti in cui gli utenti possono fare clic nelle pagine di avviso mostrate in <ph name="PRODUCT_NAME" /> quando visitano siti che presentano errori SSL. Gli utenti non potranno fare clic nelle pagine di avviso SSL su origini non presenti in questo elenco.
+<translation id="9009119876570708617">Questa policy è stata rimossa a partire dalla versione M85. Usa la policy <ph name="POLICY_NAME" /> per consentire i contenuti non sicuri per singolo sito.
+       Questa policy consente di stabilire il trattamento dei contenuti misti (contenuti HTTP in siti HTTPS) nel browser.
+       Se la policy viene impostata su true o non viene impostata, viene eseguito l'upgrade automatico a HTTPS dei contenuti misti di audio e video (vale a dire che l'URL viene riscritto come HTTPS, senza una riserva se la risorsa non è disponibile tramite HTTPS) e nella barra degli URL viene mostrato un avviso "Non sicuro" per i contenuti misti delle immagini.
+       Se la policy viene impostata su false, vengono disattivati gli upgrade automatici di audio e video e non viene mostrato un avviso per le immagini.
+       Questa policy non influisce su tipi di contenuti misti diversi da audio, video e immagini.
+       Questa policy non avrà più effetto dalla versione 84 di <ph name="PRODUCT_NAME" />.</translation>
+<translation id="9009505213521705952">Se la policy <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> è impostata su Disattivata, la configurazione di questa policy ti consente di impostare un elenco di pattern di origini che specificano i siti in cui gli utenti possono fare clic nelle pagine di avviso mostrate in <ph name="PRODUCT_NAME" /> quando visitano siti che presentano errori SSL. Gli utenti non potranno fare clic nelle pagine di avviso SSL su origini non presenti in questo elenco.
 
-      Se il criterio <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> è impostato su Attivato o se non è configurato, questo criterio non ha effetto.
+      Se la policy <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> è impostata su Attivata o se non è configurata, questa policy non ha effetto.
 
-      Se il criterio non viene configurato, <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> si applica per tutti i siti.
+      Se la policy non viene configurata, <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> si applica per tutti i siti.
 
-      Per informazioni dettagliate sui pattern di input validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
+      Per informazioni dettagliate sui pattern di input validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questa policy. Questa policy ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
 <translation id="9010080992450148617">Attiva invio download a Google per scansione approfondita per utenti iscritti al programma di protezione avanzata</translation>
 <translation id="9012101302849557459">Estendi il supporto delle app di Chrome su <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" /></translation>
 <translation id="9013875414788074110">Durante l'accesso, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline).
@@ -11191,13 +11191,13 @@
 
           Questa funzione consente di evidenziare l'elemento attivo impostato tramite tastiera.
 
-          Se questo criterio viene attivato, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre attiva.
+          Se questa policy viene attivata, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre attiva.
 
-          Se questo criterio viene disattivato, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre disattivata.
+          Se questa policy viene disattivata, l'evidenziazione dell'elemento attivo tramite tastiera sarà sempre disattivata.
 
-          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
+          Se imposti questa policy, gli utenti non potranno modificarla o ignorarla.
 
-          Se questo criterio non viene impostato, inizialmente l'evidenziazione dell'elemento attivo tramite tastiera è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questa policy non viene impostata, inizialmente l'evidenziazione dell'elemento attivo tramite tastiera è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="9038839118379817310">Consente di attivare la rete Wi-Fi</translation>
 <translation id="9039822628127365650">Quando questa norma viene impostata, consente di specificare il periodo di tempo trascorso il quale un utente viene automaticamente disconnesso, terminando così la sessione. Un timer conto alla rovescia nella barra delle applicazioni informa l'utente del tempo restante.
 
@@ -11207,12 +11207,12 @@
 
       Il valore della norma deve essere specificato in millisecondi. I valori sono limitati a un intervallo compreso tra 30 secondi e 24 ore.</translation>
 <translation id="9040042535845939426">Imposta lo stato di Schermata sulla privacy nella schermata di accesso</translation>
-<translation id="904090524252041302">Un criterio per controllare se il motore di accessibilità è autorizzato a calcolare dinamicamente un filtro per l'albero dell'accessibilità in <ph name="PRODUCT_NAME" /> per migliorare le prestazioni.
-Se il criterio viene attivato o se non viene configurato, il motore di accessibilità può calcolare dinamicamente le modalità di filtro per l'albero dell'accessibilità in <ph name="PRODUCT_NAME" />, il che potrebbe portare a un miglioramento delle prestazioni.
-Se viene disattivato, il motore di accessibilità non può calcolare dinamicamente le modalità di filtro per l'albero dell'accessibilità.</translation>
-<translation id="9046248916118130378">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> può raccogliere log di testo WebRTC dai servizi Google, ad esempio Google Meet, e caricarli su Google. Questi log contengono informazioni diagnostiche utili per il debug dei problemi relativi a riunioni audio e video in <ph name="PRODUCT_NAME" />, ad esempio metadati di testo che descrivono gli stream WebRTC in entrata e in uscita, le voci di log specifiche di WebRTC e informazioni di sistema aggiuntive. Questi log non contengono l'audio o i video delle riunioni.
-Se il criterio viene impostato su Disattivato, il caricamento di questi log su Google non viene eseguito. I log si accumuleranno comunque localmente sul dispositivo dell'utente.
-Se il criterio non viene configurato, per impostazione predefinita <ph name="PRODUCT_NAME" /> può raccogliere e caricare i log.</translation>
+<translation id="904090524252041302">Una policy per controllare se il motore di accessibilità è autorizzato a calcolare dinamicamente un filtro per l'albero dell'accessibilità in <ph name="PRODUCT_NAME" /> per migliorare le prestazioni.
+Se la policy viene attivata o se non viene configurata, il motore di accessibilità può calcolare dinamicamente le modalità di filtro per l'albero dell'accessibilità in <ph name="PRODUCT_NAME" />, il che potrebbe portare a un miglioramento delle prestazioni.
+Se viene disattivata, il motore di accessibilità non può calcolare dinamicamente le modalità di filtro per l'albero dell'accessibilità.</translation>
+<translation id="9046248916118130378">Se la policy viene impostata su Attivata, <ph name="PRODUCT_NAME" /> può raccogliere log di testo WebRTC dai servizi Google, ad esempio Google Meet, e caricarli su Google. Questi log contengono informazioni diagnostiche utili per il debug dei problemi relativi a riunioni audio e video in <ph name="PRODUCT_NAME" />, ad esempio metadati di testo che descrivono gli stream WebRTC in entrata e in uscita, le voci di log specifiche di WebRTC e informazioni di sistema aggiuntive. Questi log non contengono l'audio o i video delle riunioni.
+Se la policy viene impostata su Disattivata, il caricamento di questi log su Google non viene eseguito. I log si accumuleranno comunque localmente sul dispositivo dell'utente.
+Se la policy non viene configurata, per impostazione predefinita <ph name="PRODUCT_NAME" /> può raccogliere e caricare i log.</translation>
 <translation id="9050853837490399534">Questa norma consente di stabilire se il dispositivo debba essere aggiornato a una build di correzione rapida.
 
       Se il valore della norma viene impostato su un token associato a una build di correzione rapida, il dispositivo verrà aggiornato alla build di correzione rapida corrispondente se l'aggiornamento non è bloccato da un'altra norma.
@@ -11239,41 +11239,41 @@
 
 
 
-      Se questo criterio non è impostato, la selezione automatica non avviene per nessun sito.
+      Se questa policy non è impostata, la selezione automatica non avviene per nessun sito.
 
       Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation>
 <translation id="9063485115966829754">Il visualizzatore PDF utilizza l'architettura GuestView.</translation>
 <translation id="9066311316566875681">Il modello URI del resolver DNS over HTTPS desiderato. Per specificare diversi resolver DNS over HTTPS, separa i modelli URI corrispondenti con gli spazi.
 
-      Se il criterio DnsOverHttpsMode viene impostato su <ph name="SECURE_DNS_MODE_SECURE" />, questo criterio deve essere impostato e non può essere vuoto. Soltanto su <ph name="PRODUCT_OS_NAME" /> è necessario impostare questo criterio o il criterio <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" />, altrimenti la risoluzione DNS non andrà a buon fine.
+      Se la policy DnsOverHttpsMode viene impostata su <ph name="SECURE_DNS_MODE_SECURE" />, questa policy deve essere impostata e non può essere vuota. Soltanto su <ph name="PRODUCT_OS_NAME" /> è necessario impostare questa policy o la policy <ph name="DOH_TEMPLATES_WITH_IDENTIFIERS_POLICY_NAME" />, altrimenti la risoluzione DNS non andrà a buon fine.
 
-      Se il criterio DnsOverHttpsMode viene impostato su <ph name="SECURE_DNS_MODE_AUTOMATIC" /> e questo criterio viene configurato, verranno usati i modelli URI specificati; se questo criterio non viene configurato, verranno usate le mappature impostate come hardcoded per cercare di eseguire l'upgrade del resolver DNS attuale dell'utente a un resolver DoH gestito dallo stesso fornitore.
+      Se la policy DnsOverHttpsMode viene impostata su <ph name="SECURE_DNS_MODE_AUTOMATIC" /> e questa policy viene configurata, verranno usati i modelli URI specificati; se questa policy non viene configurata, verranno usate le mappature impostate come hardcoded per cercare di eseguire l'upgrade del resolver DNS attuale dell'utente a un resolver DoH gestito dallo stesso fornitore.
 
       Se il modello URI contiene una variabile <ph name="HTTP_VARIABLE_DNS" />, per le richieste al resolver verrà usato il metodo <ph name="HTTP_METHOD_GET" />; in caso contrario verrà usato il metodo <ph name="HTTP_METHOD_POST" /> per le richieste.
 
       I modelli con formato errato verranno ignorati.</translation>
 <translation id="9068629430243705879">porta 6566 (può essere sbloccata fino al 15/10/2021)</translation>
-<translation id="9069503402414011061">La configurazione del criterio consente di specificare la durata in ore dei dati di autenticazione nella cache. La cache include dati relativi alle aree di autenticazione ritenute attendibili dall'area di autenticazione della macchina (aree di autenticazione affiliate). Pertanto, la memorizzazione nella cache dei dati di autenticazione consente di velocizzare l'accesso. I dati specifici degli utenti e quelli per le aree di autenticazione non affiliate non vengono memorizzati nella cache.
+<translation id="9069503402414011061">La configurazione della policy consente di specificare la durata in ore dei dati di autenticazione nella cache. La cache include dati relativi alle aree di autenticazione ritenute attendibili dall'area di autenticazione della macchina (aree di autenticazione affiliate). Pertanto, la memorizzazione nella cache dei dati di autenticazione consente di velocizzare l'accesso. I dati specifici degli utenti e quelli per le aree di autenticazione non affiliate non vengono memorizzati nella cache.
 
-Se il criterio viene impostato su 0, la memorizzazione nella cache dei dati di autenticazione viene disattivata. I dati specifici dell'area di autenticazione vengono recuperati a ogni accesso, quindi la relativa memorizzazione nella cache può rallentare in modo significativo l'accesso degli utenti.
+Se la policy viene impostata su 0, la memorizzazione nella cache dei dati di autenticazione viene disattivata. I dati specifici dell'area di autenticazione vengono recuperati a ogni accesso, quindi la relativa memorizzazione nella cache può rallentare in modo significativo l'accesso degli utenti.
 
-Se il criterio non viene configurato, i dati di autenticazione memorizzati nella cache possono essere riutilizzati per un periodo massimo di 73 ore.
+Se la policy non viene configurata, i dati di autenticazione memorizzati nella cache possono essere riutilizzati per un periodo massimo di 73 ore.
 
 Nota: se il dispositivo viene riavviato, la cache viene svuotata. Anche i dati relativi all'area di autenticazione degli utenti temporanei vengono memorizzati nella cache. Disattiva la cache per impedire il tracciamento dell'area di autenticazione degli utenti temporanei.</translation>
-<translation id="9069588907259547232">Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano il relativo volume dell'audio.
+<translation id="9069588907259547232">Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano il relativo volume dell'audio.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non registrano o non segnalano lo stato dell'audio.
-      Eccezione: le informazioni relative al livello del volume di sistema vengono controllate tramite il criterio <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
-<translation id="9072475476775217730">Se il criterio viene impostato su Disabled, i popup che indirizzano alla pagina <ph name="BLANK_PAGE_NAME" /> possono accedere (tramite JavaScript) alla pagina che ha richiesto l'apertura del popup.
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non registrano o non segnalano lo stato dell'audio.
+      Eccezione: le informazioni relative al livello del volume di sistema vengono controllate tramite la policy <ph name="REPORT_DEVICE_HARDWARE_STATUS" /> per M95 e versioni precedenti.</translation>
+<translation id="9072475476775217730">Se la policy viene impostata su Disabled, i popup che indirizzano alla pagina <ph name="BLANK_PAGE_NAME" /> possono accedere (tramite JavaScript) alla pagina che ha richiesto l'apertura del popup.
 
-      Se il criterio viene impostato su Enabled o se non viene configurato, la proprietà <ph name="WINDOW_OPENER_PROPERTY" /> viene impostata su <ph name="NULL_VALUE" />, a meno che l'ancoraggio non specifichi <ph name="REL_OPENER_ATTRIBUTE" />.
+      Se la policy viene impostata su Enabled o se non viene configurata, la proprietà <ph name="WINDOW_OPENER_PROPERTY" /> viene impostata su <ph name="NULL_VALUE" />, a meno che l'ancoraggio non specifichi <ph name="REL_OPENER_ATTRIBUTE" />.
 
-      Questo criterio è stato rimosso nella versione 102 di <ph name="PRODUCT_NAME" />.
+      Questa policy è stata rimossa nella versione 102 di <ph name="PRODUCT_NAME" />.
 
       Visita la pagina https://chromestatus.com/feature/6140064063029248.</translation>
-<translation id="9073405975862312795">Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano i periodi di attività di un utente sul dispositivo.
+<translation id="9073405975862312795">Se la policy viene impostata su Attivata o se non viene configurata, i dispositivi registrati segnalano i periodi di attività di un utente sul dispositivo.
 
-      Se il criterio viene impostato su Disattivato, i dispositivi registrati non registrano e non segnalano i tempi di attività.</translation>
+      Se la policy viene impostata su Disattivata, i dispositivi registrati non registrano e non segnalano i tempi di attività.</translation>
 <translation id="9076477053438828079">Mostra sempre nomi e foto degli utenti</translation>
 <translation id="9077227880520270584">Timer accesso automatico all'account locale del dispositivo</translation>
 <translation id="9079531125758468956">Disabilita l'importazione dei preferiti alla prima esecuzione</translation>
@@ -11281,10 +11281,10 @@
 <translation id="9084985621503260744">Specifica se l'attività video incide sulla gestione dell'alimentazione</translation>
 <translation id="9087434639296483430">Consente di segnalare eventi di accesso/uscita degli utenti su dispositivi registrati, inclusi gli accessi non riusciti.
 
-      Se il criterio viene impostato su Falso o se non viene configurato, le informazioni non vengono segnalate.
-      Se viene impostato su Vero, gli eventi di accesso/uscita del dispositivo vengono segnalati.</translation>
-<translation id="9087652369391570821">Criterio di configurazione per il connettore OnFileTransfer di Chrome Enterprise</translation>
-<translation id="9088191250434406767">Se il criterio non viene configurato o se viene impostato su Attivato, gli utenti possono effettuare ricerche con le proprie fotocamere usando <ph name="GOOGLE_LENS_PRODUCT_NAME" />. Se viene impostato su Disattivato, gli utenti non possono vedere il pulsante <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nella casella di ricerca quando la ricerca tramite fotocamera con <ph name="GOOGLE_LENS_PRODUCT_NAME" /> è supportata.</translation>
+      Se la policy viene impostata su False o se non viene configurata, le informazioni non vengono segnalate.
+      Se viene impostata su True, gli eventi di accesso/uscita del dispositivo vengono segnalati.</translation>
+<translation id="9087652369391570821">Policy di configurazione per il connettore OnFileTransfer di Chrome Enterprise</translation>
+<translation id="9088191250434406767">Se la policy non viene configurata o se viene impostata su Attivata, gli utenti possono effettuare ricerche con le proprie fotocamere usando <ph name="GOOGLE_LENS_PRODUCT_NAME" />. Se viene impostata su Disattivata, gli utenti non possono vedere il pulsante <ph name="GOOGLE_LENS_PRODUCT_NAME" /> nella casella di ricerca quando la ricerca tramite fotocamera con <ph name="GOOGLE_LENS_PRODUCT_NAME" /> è supportata.</translation>
 <translation id="9088433379343318874">Abilita il provider di contenuti dell'utente supervisionato</translation>
 <translation id="9088444059179765143">Configura il metodo di rilevamento automatico del fuso orario</translation>
 <translation id="9095599826504830315">Non consentire Confronta schede.</translation>
@@ -11292,9 +11292,9 @@
 <translation id="9098409326885953506">La finestra coperta viene rilevata e viene sospesa la creazione</translation>
 <translation id="9105265795073104888">Solo un sottoinsieme di opzioni di configurazione del proxy viene reso disponibile alle app Android, che decidono volontariamente se rispettarlo o meno. Non puoi forzarle a utilizzare un proxy.</translation>
 <translation id="9106865192244721694">Consenti WebUSB su questi siti</translation>
-<translation id="9107635531763682565">Se il criterio viene impostato su 1, i siti web possono mostrare le notifiche desktop. Se il criterio viene impostato su 2, le notifiche desktop vengono negate.
+<translation id="9107635531763682565">Se la policy viene impostata su 1, i siti web possono mostrare le notifiche desktop. Se la policy viene impostata su 2, le notifiche desktop vengono negate.
 
-Se non viene configurato, si applica il criterio <ph name="ASK_NOTIFICATIONS_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
+Se non viene configurata, si applica la policy <ph name="ASK_NOTIFICATIONS_POLICY_NAME" />, ma gli utenti possono modificare l'impostazione.</translation>
 <translation id="910929592571075861">Non partizionare gli URL dei blob durante il recupero e la navigazione.</translation>
 <translation id="9110194749335632373">Impedisci le connessioni di accesso da remoto da parte degli amministratori aziendali a questo computer</translation>
 <translation id="9110198768621013941">Attiva la policy AutofillPredictionSettings.
@@ -11318,12 +11318,12 @@
 <translation id="9113262510565261950">Timeout di inattività della schermata di accesso del salvaschermo del dispositivo.</translation>
 <translation id="911448529868608648">Attiva Generatore codice QR</translation>
 <translation id="911605919007170833">Segnala stato di sicurezza</translation>
-<translation id="9117826695152538214">Se il criterio è impostato su True, i tasti permanenti rimangono attivati. Se il criterio è impostato su False, i tasti permanenti rimangono disattivati.
+<translation id="9117826695152538214">Se la policy è impostata su True, i tasti permanenti rimangono attivati. Se la policy è impostata su False, i tasti permanenti rimangono disattivati.
 
-      Se imposti il criterio, gli utenti non possono modificarlo. Se il criterio non è impostato, i tasti permanenti risultano disattivati all'inizio, ma gli utenti possono attivarli in qualsiasi momento.</translation>
+      Se imposti la policy, gli utenti non possono modificarla. Se la policy non è impostata, i tasti permanenti risultano disattivati all'inizio, ma gli utenti possono attivarli in qualsiasi momento.</translation>
 <translation id="91206085111961438">Stabilisci la disponibilità delle estensioni Manifest v2</translation>
 <translation id="9122865885571719292">Consente di stabilire se e come <ph name="PRODUCT_OS_NAME" /> ripristina l'ultima sessione all'accesso.
-Questo criterio ha effetto soltanto se il criterio <ph name="FULL_RESTORE_ENABLED_NAME" /> viene impostato su true.</translation>
+Questa policy ha effetto soltanto se la policy <ph name="FULL_RESTORE_ENABLED_NAME" /> viene impostata su true.</translation>
 <translation id="9123464369663964441">Consenti agli utenti di aggiungere eccezioni per consentire contenuti misti</translation>
 <translation id="9124770007620653639">Non inviare mai a Google dati relativi all'attendibilità dei domini</translation>
 <translation id="9126331659955304300">Consenti la selezione di avatar degli utenti da file system locale, fotocamera e profilo Google</translation>
@@ -11333,18 +11333,18 @@
 
           Per informazioni dettagliate sui pattern URL validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti.
 
-          Le eccezioni relative ai criteri di JIT di JavaScript verranno applicate soltanto sito per sito (eTLD+1). Un criterio impostato soltanto per sottodominio.sito.com non verrà applicato correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcun criterio. In questo caso, il criterio deve essere impostato per sito.com per essere applicato correttamente sia a sito.com sia a sottodominio.sito.com.
+          Le eccezioni relative alle policy di JIT di JavaScript verranno applicate soltanto sito per sito (eTLD+1). Una policy impostata soltanto per sottodominio.sito.com non verrà applicata correttamente a sito.com o a sottodominio.sito.com, perché entrambi sono equivalenti allo stesso dominio eTLD+1 (sito.com) per il quale non esiste alcuna policy. In questo caso, la policy deve essere impostata per sito.com per essere applicato correttamente sia a sito.com sia a sottodominio.sito.com.
 
-          Questo criterio viene applicato frame per frame e non si basa esclusivamente sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco del criterio <ph name="JAVA_SCRIPT_JIT_BLOCKED_FOR_SITES_POLICY_NAME" />, ma il sito carica un frame che contiene sito-due.com, sito-uno.com avrà disattivato JIT di JavaScript, ma sito-due.com utilizzerà il criterio di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" />, se configurato, o JIT di JavaScript sarà attivato per impostazione predefinita.
+          Questa policy viene applicata frame per frame e non si basa esclusivamente sull'URL di origine di primo livello, quindi, ad esempio, se sito-uno.com è presente nell'elenco della policy <ph name="JAVA_SCRIPT_JIT_BLOCKED_FOR_SITES_POLICY_NAME" />, ma il sito carica un frame che contiene sito-due.com, sito-uno.com avrà disattivato JIT di JavaScript, ma sito-due.com utilizzerà la policy di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" />, se configurata, o JIT di JavaScript sarà attivato per impostazione predefinita.
 
-          Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti JIT di JavaScript viene attivato per il sito.</translation>
-<translation id="9129169595075460149">Se il criterio viene impostato su Attivato, la funzionalità SafeSearch in Ricerca Google è sempre attiva e gli utenti non possono modificare questa impostazione.
+          Se la policy non viene configurata per un sito, la policy di <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" /> viene applicata al sito, se configurata, altrimenti JIT di JavaScript viene attivato per il sito.</translation>
+<translation id="9129169595075460149">Se la policy viene impostata su Attivata, la funzionalità SafeSearch in Ricerca Google è sempre attiva e gli utenti non possono modificare questa impostazione.
 
-      Se il criterio viene impostato su Disattivato o se non viene configurato, la funzionalità SafeSearch in Ricerca Google non viene applicata.</translation>
+      Se la policy viene impostata su Disattivata o se non viene configurata, la funzionalità SafeSearch in Ricerca Google non viene applicata.</translation>
 <translation id="9130298333414322767">Segnala informazioni sul sistema di un dispositivo.
 
-      Se il criterio è impostato su False o non è configurato, le informazioni non vengono segnalate.
-      Se è impostato su True, le informazioni sul sistema del dispositivo vengono segnalate.</translation>
+      Se la policy è impostata su False o non è configurata, le informazioni non vengono segnalate.
+      Se è impostata su True, le informazioni sul sistema del dispositivo vengono segnalate.</translation>
 <translation id="9131419675479917141">Consenti agli utenti di impostare un PIN inefficace, ma mostra un avviso</translation>
 <translation id="913195841488580904">Blocca l'accesso a un elenco di URL</translation>
 <translation id="9132345265506256744">Disattiva l'uso di <ph name="GLIC" />.</translation>
@@ -11354,15 +11354,15 @@
 <translation id="9136212796239682721">Disattiva l'UI del fumetto dei download</translation>
 <translation id="9136399279941091445">Intervalli di orari di minore attività quando vengono rilasciati i criteri del dispositivo specificati</translation>
 <translation id="9139775903828905867">Controlla la scorciatoia utilizzata per attivare F11</translation>
-<translation id="9140064482233876338">Criterio ritirato nella versione M69. Usa invece il criterio OverrideSecurityRestrictionsOnInsecureOrigin.
+<translation id="9140064482233876338">Policy ritirata nella versione M69. Usa invece la policy OverrideSecurityRestrictionsOnInsecureOrigin.
 
-Questo criterio consente di specificare un elenco di origini (URL) o di pattern di nomi host (ad esempio "*.example.com") a cui non vengono applicate limitazioni di sicurezza previste per le origini non sicure.
+Questa policy consente di specificare un elenco di origini (URL) o di pattern di nomi host (ad esempio "*.example.com") a cui non vengono applicate limitazioni di sicurezza previste per le origini non sicure.
 
-Lo scopo è consentire alle organizzazioni di autorizzare le origini per le applicazioni precedenti che non possono eseguire il deployment di TLS o di configurare un server di gestione temporanea per gli sviluppi web interni, affinché gli sviluppatori possano testare le funzionalità che richiedono contesti sicuri senza dover eseguire il deployment di TLS sul server di gestione temporanea. Questo criterio impedisce inoltre che l'origine venga contrassegnata come "Non sicura" nella omnibox.
+Lo scopo è consentire alle organizzazioni di autorizzare le origini per le applicazioni precedenti che non possono eseguire il deployment di TLS o di configurare un server di gestione temporanea per gli sviluppi web interni, affinché gli sviluppatori possano testare le funzionalità che richiedono contesti sicuri senza dover eseguire il deployment di TLS sul server di gestione temporanea. Questa policy impedisce inoltre che l'origine venga contrassegnata come "Non sicura" nella omnibox.
 
-L'impostazione di un elenco di URL in questo criterio ha lo stesso effetto dell'impostazione del flag della riga di comando "--unsafely-treat-insecure-origin-as-secure" in un elenco separato da virgole degli stessi URL. Se viene impostato, questo criterio sovrascrive il flag della riga di comando.
+L'impostazione di un elenco di URL in questa policy ha lo stesso effetto dell'impostazione del flag della riga di comando "--unsafely-treat-insecure-origin-as-secure" in un elenco separato da virgole degli stessi URL. Se viene impostata, questa policy sovrascrive il flag della riga di comando.
 
-Questo criterio è stato ritirato nella versione M69 ed è stato sostituito dal criterio OverrideSecurityRestrictionsOnInsecureOrigin. Se sono presenti entrambi i criteri, viene usato il criterio OverrideSecurityRestrictionsOnInsecureOrigin.
+Questa policy è stata ritirata nella versione M69 ed è stata sostituita dalla policy OverrideSecurityRestrictionsOnInsecureOrigin. Se sono presenti entrambe le policy, viene usata la policy OverrideSecurityRestrictionsOnInsecureOrigin.
 
 Per ulteriori informazioni sui contesti sicuri, visita il sito https://www.w3.org/TR/secure-contexts/</translation>
 <translation id="9142561920976791097">Verrà utilizzato il nuovo comportamento per l'esecuzione di eventi sui controlli dei moduli disattivati.</translation>
@@ -11374,11 +11374,11 @@
 <translation id="9151267823917882070">Origini consentite per le richieste WebAuthn tramite proxy da applicazioni Remote Desktop.</translation>
 <translation id="9152473318295429890">Attiva i suggerimenti contestuali delle pagine web correlate</translation>
 <translation id="9155218447258425310">Durata della notifica alla rimozione della smart card per <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="9155375380628728544">Se il criterio viene impostato, gli utenti possono aggiungere all'elenco di lingue preferite soltanto una delle lingue elencate in questo criterio.
+<translation id="9155375380628728544">Se la policy viene impostata, gli utenti possono aggiungere all'elenco di lingue preferite soltanto una delle lingue elencate in questa policy.
 
-      Se il criterio non viene impostato o viene impostato un elenco vuoto, gli utenti possono specificare le lingue che preferiscono.
+      Se la policy non viene impostata o viene impostato un elenco vuoto, gli utenti possono specificare le lingue che preferiscono.
 
-      Se viene impostato un elenco di valori non validi, tali valori vengono ignorati. Se gli utenti hanno aggiunto all'elenco di lingue preferite alcune lingue non consentite da questo criterio, tali lingue vengono rimosse. Se la lingua usata dagli utenti per <ph name="PRODUCT_OS_NAME" /> non è consentita da questo criterio, all'accesso successivo la lingua di visualizzazione viene impostata su una lingua dell'interfaccia utente consentita. Se invece questo criterio ha soltanto voci non valide, <ph name="PRODUCT_OS_NAME" /> passa al primo valore valido specificato in questo criterio o a una lingua di riserva come en-US.</translation>
+      Se viene impostato un elenco di valori non validi, tali valori vengono ignorati. Se gli utenti hanno aggiunto all'elenco di lingue preferite alcune lingue non consentite da questa policy, tali lingue vengono rimosse. Se la lingua usata dagli utenti per <ph name="PRODUCT_OS_NAME" /> non è consentita da questa policy, all'accesso successivo la lingua di visualizzazione viene impostata su una lingua dell'interfaccia utente consentita. Se invece questa policy ha soltanto voci non valide, <ph name="PRODUCT_OS_NAME" /> passa al primo valore valido specificato in questa policy o a una lingua di riserva come en-US.</translation>
 <translation id="9159126470527871268">Consente di inviare agli utenti una notifica che comunica che <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> deve essere riavviato per applicare un aggiornamento in sospeso
 
       Questa impostazione della norma attiva le notifiche che informano l'utente che è consigliabile oppure obbligatorio riavviare il browser o il dispositivo. Se non è impostata, <ph name="PRODUCT_NAME" /> indica all'utente che è necessario un riavvio tramite piccole modifiche al menu, mentre <ph name="PRODUCT_OS_NAME" /> indica ciò con una notifica nella barra delle applicazioni. Se l'impostazione è "Recommended", all'utente verrà mostrato un avviso ricorrente con un riavvio consigliato. L'utente può ignorare questo avviso e rimandare il riavvio. Se impostata su "Required", verrà visualizzato un avviso ricorrente all'utente che indica che il riavvio del browser sarà forzato una volta trascorso il periodo di notifica. Per impostazione predefinita, il periodo di notifica è di sette giorni per <ph name="PRODUCT_NAME" /> e di quattro giorni per <ph name="PRODUCT_OS_NAME" /> e può essere configurato tramite l'impostazione della norma <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
@@ -11388,22 +11388,22 @@
 <translation id="9162444960513782569">Non forzare la limitazione dei timer JavaScript in background</translation>
 <translation id="9164656078867027374">Definisci i domini autorizzati ad accedere a <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME" /></translation>
 <translation id="9165128017344777105">Consenti l'autorizzazione per i caratteri locali su questi siti</translation>
-<translation id="9166670902476893480">Questo criterio consente di stabilire se <ph name="PRODUCT_NAME" /> può eseguire query su tipi di record DNS aggiuntivi quando fa richieste DNS non sicure. Questo criterio non viene applicato per query DNS effettuate tramite DNS sicuro, che può sempre eseguire query su tipi DNS aggiuntivi.
+<translation id="9166670902476893480">Questa policy consente di stabilire se <ph name="PRODUCT_NAME" /> può eseguire query su tipi di record DNS aggiuntivi quando fa richieste DNS non sicure. Questa policy non viene applicata per query DNS effettuate tramite DNS sicuro, che può sempre eseguire query su tipi DNS aggiuntivi.
 
-      Se questo criterio non viene configurato o se viene impostato su Attivato, è possibile eseguire query su tipi aggiuntivi quali <ph name="DNS_TYPE_HTTPS" /> (DNS tipo 65) oltre che su <ph name="DNS_TYPE_A" /> (DNS tipo 1) e <ph name="DNS_TYPE_AAAA" /> (DNS tipo 28).
+      Se questa policy non viene configurata o se viene impostata su Attivata, è possibile eseguire query su tipi aggiuntivi quali <ph name="DNS_TYPE_HTTPS" /> (DNS tipo 65) oltre che su <ph name="DNS_TYPE_A" /> (DNS tipo 1) e <ph name="DNS_TYPE_AAAA" /> (DNS tipo 28).
 
-      Se questo criterio viene impostato su Disattivato, al DNS verranno inviate query soltanto per <ph name="DNS_TYPE_A" /> (DNS tipo 1) e/o <ph name="DNS_TYPE_AAAA" /> (DNS tipo 28).
+      Se questa policy viene impostata su Disattivata, al DNS verranno inviate query soltanto per <ph name="DNS_TYPE_A" /> (DNS tipo 1) e/o <ph name="DNS_TYPE_AAAA" /> (DNS tipo 28).
 
-      Questo criterio è una misura temporanea e verrà rimosso nelle future versioni di <ph name="PRODUCT_NAME" />. Dopo la rimozione del criterio, <ph name="PRODUCT_NAME" /> potrà sempre eseguire query su tipi DNS aggiuntivi.</translation>
+      Questa policy è una misura temporanea e verrà rimossa nelle future versioni di <ph name="PRODUCT_NAME" />. Dopo la rimozione della policy, <ph name="PRODUCT_NAME" /> potrà sempre eseguire query su tipi DNS aggiuntivi.</translation>
 <translation id="9167719789236691545">Disattiva Drive nell'app File di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="9171359005568194889">Attiva il salvataggio delle passkey in Gestore delle password</translation>
 <translation id="9172648973829444124">Forza l'attivazione della Modalità solo HTTPS in Modalità bilanciata</translation>
 <translation id="9172911925443428317">Non consentire la visualizzazione della promozione di valutazione dell'App Store</translation>
 <translation id="9173133289347070466">Sondaggi di <ph name="PRODUCT_NAME" /> all'interno del prodotto raccolgono il feedback degli utenti per il browser. Le risposte al sondaggio non sono associate agli account utente.
-Se questo criterio viene attivato o se non viene configurato, i sondaggi all'interno del prodotto potrebbero essere mostrati agli utenti.
-Se questo criterio viene disattivato, i sondaggi all'interno del prodotto non vengono mostrati agli utenti.
+Se questa policy viene attivata o se non viene configurata, i sondaggi all'interno del prodotto potrebbero essere mostrati agli utenti.
+Se questa policy viene disattivata, i sondaggi all'interno del prodotto non vengono mostrati agli utenti.
 
-Questo criterio non ha effetto se il criterio <ph name="METRICS_REPORTING_ENABLED_POLICY_NAME" /> viene impostato su Disattivato e vengono disattivati anche i sondaggi all'interno dei prodotti.</translation>
+Questa policy non ha effetto se la policy <ph name="METRICS_REPORTING_ENABLED_POLICY_NAME" /> viene impostata su Disattivata e vengono disattivati anche i sondaggi all'interno dei prodotti.</translation>
 <translation id="9173633148008709976">Attiva l'accelerazione grafica</translation>
 <translation id="9177661626040846628">Consenti l'utilizzo della modalità sviluppatore nella pagina delle estensioni</translation>
 <translation id="9180108183162961002">Consenti gli accessi come ospite al browser</translation>
@@ -11411,10 +11411,10 @@
 <translation id="9187743794267626640">Disabilita il montaggio di una memoria esterna</translation>
 <translation id="9189737595688383533">Non consentire agli utenti di attivare la Modalità solo HTTPS</translation>
 <translation id="9190022798664427644">Attiva l'audio in formato mono</translation>
-<translation id="9190456586252617675">Questo criterio consente di stabilire la modalità dell'esperienza di onboarding dell'assistente.
+<translation id="9190456586252617675">Questa policy consente di stabilire la modalità dell'esperienza di onboarding dell'assistente.
 
-      Se il criterio non viene impostato o viene impostato su <ph name="ASSISTANT_ONBOARDING_MODE_DEFAULT" />, viene usata la modalità predefinita dell'esperienza di onboarding dell'assistente.
-      Se il criterio viene impostato su <ph name="ASSISTANT_ONBOARDING_MODE_EDUCATION" />, viene usata la modalità EDU dell'esperienza di onboarding dell'assistente.</translation>
+      Se la policy non viene impostata o viene impostata su <ph name="ASSISTANT_ONBOARDING_MODE_DEFAULT" />, viene usata la modalità predefinita dell'esperienza di onboarding dell'assistente.
+      Se la policy viene impostata su <ph name="ASSISTANT_ONBOARDING_MODE_EDUCATION" />, viene usata la modalità EDU dell'esperienza di onboarding dell'assistente.</translation>
 <translation id="9191821120522935133">Consente di attivare la limitazione di iframe multiorigine non visibili</translation>
 <translation id="9192220384862917760">Attiva la separazione degli host di accesso remoto</translation>
 <translation id="9194693367692364911">Consenti le funzionalità di AI generativa di DevTools senza migliorare i modelli di AI.</translation>
@@ -11424,30 +11424,30 @@
 L'impostazione predefinita è RollbackDisabled.</translation>
 <translation id="9197740283131855199">Percentuale di regolazione del ritardo di oscuramento dello schermo se l'utente diventa attivo dopo l'oscuramento</translation>
 <translation id="9200828125069750521">Parametri per l'URL dell'immagine che utilizza POST</translation>
-<translation id="9204863016826119209">Le chiavi aziendali possono essere utilizzate dalle app per Android installate ed elencate in questo criterio.</translation>
+<translation id="9204863016826119209">Le chiavi aziendali possono essere utilizzate dalle app per Android installate ed elencate in questa policy.</translation>
 <translation id="9206472508136116830">Non consentire il rilevamento condivisioni NetBIOS</translation>
 <translation id="9207596996305971030">Gli eventi di accesso/uscita non vengono segnalati</translation>
 <translation id="9210647066889383361">Consenti agli utenti di accedere al proprio dispositivo con Smart Lock</translation>
 <translation id="9213751049772256263">Disattiva tutte le varianti</translation>
 <translation id="9217154963008402249">Frequenza dei pacchetti di rete di monitoraggio</translation>
-<translation id="9220314833408124365">Viene usato un criterio relativo al referrer predefinito no-referrer-when-downgrade</translation>
+<translation id="9220314833408124365">Viene usata una policy relativa al referrer predefinito no-referrer-when-downgrade</translation>
 <translation id="922160134042190462">Non attivare <ph name="DESK_API_NAME" /> per il controllo <ph name="PRODUCT_OS_NAME" /> di terze parti</translation>
 <translation id="9221827710437832530">Consenti l'accesso alla geolocalizzazione nella schermata di accesso.</translation>
 <translation id="922540222991413931">Configura fonti di installazione di estensioni, applicazioni e script utente</translation>
 <translation id="924557436754151212">Importa password salvate dal browser predefinito alla prima esecuzione</translation>
 <translation id="925379810778921867">Un URL blob di SharedWorker eredita un controller.</translation>
-<translation id="927384371566552478">Se il criterio viene impostato su Attivato o se non viene configurato, l'interfaccia utente di esportazione/importazione è disponibile agli utenti. Se il criterio viene impostato su Disattivato, l'interfaccia utente di esportazione/importazione non è disponibile agli utenti.</translation>
-<translation id="929549405492388749">Se questo criterio viene impostato su true, viene forzata l'attivazione della funzionalità AppCache, anche se in Chrome non è disponibile per impostazione predefinita.
+<translation id="927384371566552478">Se la policy viene impostata su Attivata o se non viene configurata, l'interfaccia utente di esportazione/importazione è disponibile agli utenti. Se la policy viene impostata su Disattivata, l'interfaccia utente di esportazione/importazione non è disponibile agli utenti.</translation>
+<translation id="929549405492388749">Se questa policy viene impostata su true, viene forzata l'attivazione della funzionalità AppCache, anche se in Chrome non è disponibile per impostazione predefinita.
 
-      Se non viene impostato o viene impostato su false, la funzionalità AppCache dipenderà dalle impostazioni predefinite di Chrome.</translation>
+      Se non viene impostata o viene impostata su false, la funzionalità AppCache dipenderà dalle impostazioni predefinite di Chrome.</translation>
 <translation id="930930237275114205">Imposta la directory dei dati utente di <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="931156018951676976">Disattiva la visualizzazione dei contenuti promozionali</translation>
 <translation id="935779984563655842">Segnala informazioni sul Bluetooth</translation>
-<translation id="936188865879911137">Se il criterio viene attivato, <ph name="PRODUCT_NAME" /> consente l'installazione e l'aggiornamento delle estensioni ospitate al di fuori del Chrome Web Store, i cui contenuti potrebbero essere solo minimamente protetti.
+<translation id="936188865879911137">Se la policy viene attivata, <ph name="PRODUCT_NAME" /> consente l'installazione e l'aggiornamento delle estensioni ospitate al di fuori del Chrome Web Store, i cui contenuti potrebbero essere solo minimamente protetti.
 
-      Se il criterio viene disattivato, <ph name="PRODUCT_NAME" /> non consente una nuova installazione delle estensioni né il loro aggiornamento. Il criterio non ha effetti su <ph name="PRODUCT_NAME" /> 78 e successivi.
+      Se la policy viene disattivata, <ph name="PRODUCT_NAME" /> non consente una nuova installazione delle estensioni né il loro aggiornamento. La policy non ha effetti su <ph name="PRODUCT_NAME" /> 78 e successivi.
 
-      Se il criterio non viene impostato, è attivato per <ph name="PRODUCT_NAME" /> da 73 a 75 e disattivato per <ph name="PRODUCT_NAME" /> 76 e 77.</translation>
+      Se la policy non viene impostata, è attivata per <ph name="PRODUCT_NAME" /> da 73 a 75 e disattivata per <ph name="PRODUCT_NAME" /> 76 e 77.</translation>
 <translation id="93985900824506396">Le suite di crittografia 3DES saranno disattivate in TLS</translation>
 <translation id="940706688964479124">Elenco dei tipi di file che dovrebbero essere aperti automaticamente al termine del download</translation>
 <translation id="942977875497446094">Apri automaticamente il browser all'avvio</translation>
@@ -11462,55 +11462,55 @@
 <translation id="958285142322823422">Impedisci l'apertura di un'altra finestra del browser da un'app web kiosk</translation>
 <translation id="958577147847681221">Consente di stabilire se <ph name="PRODUCT_OS_NAME" /> permette la creazione di nuovi account utente.
 
-      Se il criterio è impostato su Falso, solo gli utenti presenti nella lista consentita <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" /> potranno eseguire l'accesso.
+      Se la policy è impostata su False, solo gli utenti presenti nella lista consentita <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" /> potranno eseguire l'accesso.
 
-      Se il criterio è impostato su Vero o non viene configurato, tutti gli utenti potranno accedere.</translation>
+      Se la policy è impostata su True o non viene configurata, tutti gli utenti potranno accedere.</translation>
 <translation id="966425658642788645">Applica il comportamento predefinito</translation>
 <translation id="971677226939413180">L'opzione Stampa come immagine non può essere selezionata dagli utenti</translation>
 <translation id="974349541138387272">Specifica il modello URI del resolver DNS over HTTPS desiderato</translation>
 <translation id="978619365985286086">Impostazioni degli strumenti di gestione dei corsi</translation>
 <translation id="978658824596356870">Formato dell'orologio di 24 ore</translation>
 <translation id="979467274961593903">Non consentire l'uso del debug remoto</translation>
-<translation id="980218166381006412">Se il criterio viene impostato su Attivato, la modalità in background viene abilitata. Nella modalità in background, all'accesso al sistema operativo viene avviato un processo <ph name="PRODUCT_NAME" /> che rimane in esecuzione quando viene chiusa l'ultima finestra del browser, consentendo alle app in background e alla sessione di navigazione di rimanere attive. Nella barra delle applicazioni viene visualizzata un'icona per il processo in background che consente di chiuderlo in qualsiasi momento.
+<translation id="980218166381006412">Se la policy viene impostata su Attivata, la modalità in background viene abilitata. Nella modalità in background, all'accesso al sistema operativo viene avviato un processo <ph name="PRODUCT_NAME" /> che rimane in esecuzione quando viene chiusa l'ultima finestra del browser, consentendo alle app in background e alla sessione di navigazione di rimanere attive. Nella barra delle applicazioni viene visualizzata un'icona per il processo in background che consente di chiuderlo in qualsiasi momento.
 
-      Se il criterio viene impostato su Disattivato, la modalità in background viene disabilitata.
+      Se la policy viene impostata su Disattivata, la modalità in background viene disabilitata.
 
-      Se viene configurato, gli utenti non possono modificarlo nelle impostazioni del browser. In caso contrario, la modalità in background è disabilitata, ma gli utenti possono abilitarla.</translation>
+      Se viene configurata, gli utenti non possono modificarla nelle impostazioni del browser. In caso contrario, la modalità in background è disabilitata, ma gli utenti possono abilitarla.</translation>
 <translation id="981245424658084931">Attiva l'heartbeat dell'attività del dispositivo</translation>
 <translation id="981346395360763138">Servizi di geolocalizzazione di Google disabilitati</translation>
-<translation id="982192230088110287">Se il criterio viene impostato su Attivato, è obbligatorio registrare il browser <ph name="CHROME_ENTERPRISE_CORE_NAME" /> e viene bloccato il processo di avvio di <ph name="PRODUCT_NAME" /> in caso di esito negativo.
+<translation id="982192230088110287">Se la policy viene impostata su Attivata, è obbligatorio registrare il browser <ph name="CHROME_ENTERPRISE_CORE_NAME" /> e viene bloccato il processo di avvio di <ph name="PRODUCT_NAME" /> in caso di esito negativo.
 
-Se il criterio viene impostato su Disattivato o non viene impostato, la registrazione del browser <ph name="CHROME_ENTERPRISE_CORE_NAME" /> diventa facoltativa e non viene bloccato il processo di avvio di <ph name="PRODUCT_NAME" /> in caso di esito negativo.
+Se la policy viene impostata su Disattivata o non viene impostata, la registrazione del browser <ph name="CHROME_ENTERPRISE_CORE_NAME" /> diventa facoltativa e non viene bloccato il processo di avvio di <ph name="PRODUCT_NAME" /> in caso di esito negativo.
 
-Questo criterio viene utilizzato su desktop dalla registrazione con criteri cloud in ambito macchina. Per maggiori dettagli, vai su https://support.google.com/chrome/a/answer/9301891.</translation>
+Questa policy viene utilizzata su desktop dalla registrazione con policy cloud in ambito macchina. Per maggiori dettagli, vai su https://support.google.com/chrome/a/answer/9301891.</translation>
 <translation id="982195863867062122">Attiva <ph name="DBSC_FEATURE_NAME" />.</translation>
 <translation id="982497069985795632">Attiva il controllo ortografico</translation>
 <translation id="983256325512298435">Definisci un elenco di protocolli che possono lanciare un'applicazione esterna dalle origini elencate senza chiedere conferma all'utente</translation>
-<translation id="984365509386992443">Se questo criterio viene attivato o se non viene impostato, l'utente potrebbe ricevere sondaggi relativi a Navigazione sicura.
-Se viene disattivato, l'utente non riceverà sondaggi relativi a Navigazione sicura.</translation>
+<translation id="984365509386992443">Se questa policy viene attivata o se non viene impostata, l'utente potrebbe ricevere sondaggi relativi a Navigazione sicura.
+Se viene disattivata, l'utente non riceverà sondaggi relativi a Navigazione sicura.</translation>
 <translation id="985148612300045106">L'Avvio app/il tasto Ricerca sarà in grado di modificare il comportamento dei tasti funzione e questa impostazione non sarà modificabile dagli utenti.</translation>
-<translation id="986223659726677100">Se il criterio viene attivato o se non viene configurato, le chiavi di crittografia utilizzate per l'archiviazione locale vengono associate a <ph name="PRODUCT_NAME" />, quando possibile.
+<translation id="986223659726677100">Se la policy viene attivata o se non viene configurata, le chiavi di crittografia utilizzate per l'archiviazione locale vengono associate a <ph name="PRODUCT_NAME" />, quando possibile.
 
-Se il criterio viene disattivato, ha un effetto negativo sulla sicurezza di <ph name="PRODUCT_NAME" />, in quanto app sconosciute e potenzialmente dannose possono recuperare le chiavi di crittografia utilizzate per proteggere i dati.
+Se la policy viene disattivata, ha un effetto negativo sulla sicurezza di <ph name="PRODUCT_NAME" />, in quanto app sconosciute e potenzialmente dannose possono recuperare le chiavi di crittografia utilizzate per proteggere i dati.
 
-Disattiva il criterio solo in caso di problemi di compatibilità, ad esempio se altre applicazioni richiedono un accesso legittimo ai dati di <ph name="PRODUCT_NAME" />, se è previsto che i dati utente criptati siano completamente portatili tra computer diversi o se l'integrità e la posizione dei file eseguibili di <ph name="PRODUCT_NAME" /> non sono coerenti.</translation>
+Disattiva la policy solo in caso di problemi di compatibilità, ad esempio se altre applicazioni richiedono un accesso legittimo ai dati di <ph name="PRODUCT_NAME" />, se è previsto che i dati utente criptati siano completamente portatili tra computer diversi o se l'integrità e la posizione dei file eseguibili di <ph name="PRODUCT_NAME" /> non sono coerenti.</translation>
 <translation id="987261962216071510">Consenti solo gli accessi come ospite al browser</translation>
-<translation id="987975731398348803">Se il criterio viene attivato o se non viene configurato, i dispositivi registrati segnalano l'elenco di utenti dei dispositivi che hanno eseguito l'accesso di recente.
+<translation id="987975731398348803">Se la policy viene attivata o se non viene configurata, i dispositivi registrati segnalano l'elenco di utenti dei dispositivi che hanno eseguito l'accesso di recente.
 
-Se il criterio viene disattivato, i dispositivi registrati non segnalano l'elenco di utenti.
+Se la policy viene disattivata, i dispositivi registrati non segnalano l'elenco di utenti.
 
-Se <ph name="DEVICE_EPHEMERAL_USERS_ENABLED_POLICY_NAME" /> viene attivato, <ph name="REPORT_DEVICE_USERS_POLICY_NAME" /> viene ignorato e sarà sempre disattivato.</translation>
-<translation id="989197274317162189">Questo criterio è stato deprecato e non è supportato. Utilizza il criterio <ph name="URL_BLOCKLIST_POLICY_NAME" />.</translation>
+Se <ph name="DEVICE_EPHEMERAL_USERS_ENABLED_POLICY_NAME" /> viene attivata, <ph name="REPORT_DEVICE_USERS_POLICY_NAME" /> viene ignorata e sarà sempre disattivata.</translation>
+<translation id="989197274317162189">Questa policy è stata deprecata e non è supportata. Utilizza la policy <ph name="URL_BLOCKLIST_POLICY_NAME" />.</translation>
 <translation id="990830704772547092">Configura il programma di installazione per le VM Bruschetta sui dispositivi <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="991560005425213776">Invia nome utente e nome file alle stampanti native</translation>
-<translation id="99232017131102456">Questo criterio consente di configurare una singola cache globale per profilo con credenziali di autenticazione server HTTP.
+<translation id="99232017131102456">Questa policy consente di configurare una singola cache globale per profilo con credenziali di autenticazione server HTTP.
 
-      Se questo criterio non viene impostato o viene disattivato, il browser userà il comportamento predefinito dell'autenticazione tra siti che, a partire dalla versione 80, prevede credenziali di autenticazione server HTTP con ambito per sito principale. Ciò significa che, se due siti usano risorse dello stesso dominio di autenticazione, le credenziali devono essere fornite separatamente nel contesto di entrambi i siti. Le credenziali proxy memorizzate nella cache verranno riutilizzate tra i siti.
+      Se questa policy non viene impostata o viene disattivata, il browser userà il comportamento predefinito dell'autenticazione tra siti che, a partire dalla versione 80, prevede credenziali di autenticazione server HTTP con ambito per sito principale. Ciò significa che, se due siti usano risorse dello stesso dominio di autenticazione, le credenziali devono essere fornite separatamente nel contesto di entrambi i siti. Le credenziali proxy memorizzate nella cache verranno riutilizzate tra i siti.
 
-      Se il criterio viene attivato, le credenziali di autenticazione HTTP inserite nel contesto di un sito verranno usate automaticamente nel contesto di un altro sito.
+      Se la policy viene attivata, le credenziali di autenticazione HTTP inserite nel contesto di un sito verranno usate automaticamente nel contesto di un altro sito.
 
-      Se questo criterio viene attivato, i siti sono esposti ad alcuni tipi di attacchi cross-site e gli utenti possono essere monitorati tra i siti anche senza i cookie tramite l'aggiunta di voci alla cache di autenticazione HTTP usando credenziali incorporate negli URL.
+      Se questa policy viene attivata, i siti sono esposti ad alcuni tipi di attacchi cross-site e gli utenti possono essere monitorati tra i siti anche senza i cookie tramite l'aggiunta di voci alla cache di autenticazione HTTP usando credenziali incorporate negli URL.
 
-      Questo criterio è stato ideato per dare la possibilità alle aziende che dipendono dal comportamento precedente di aggiornare le proprie procedure di accesso e verrà rimosso in futuro.</translation>
+      Questa policy è stato ideata per dare la possibilità alle aziende che dipendono dal comportamento precedente di aggiornare le proprie procedure di accesso e verrà rimossa in futuro.</translation>
 <translation id="999340611001666174">Disattiva la correzione del colore</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/components/policy/resources/webui/policy_base.ts b/components/policy/resources/webui/policy_base.ts
index 0f6227a3..973695e7 100644
--- a/components/policy/resources/webui/policy_base.ts
+++ b/components/policy/resources/webui/policy_base.ts
@@ -123,7 +123,7 @@
     };
 
     const moreActionsButton = getRequiredElement('more-actions-button');
-    const moreActionsIcon = getRequiredElement('dropdown-icon') as HTMLElement;
+    const moreActionsIcon = getRequiredElement('dropdown-icon');
     const moreActionsList = getRequiredElement('more-actions-list');
     moreActionsButton.onclick = () => {
       moreActionsList.classList.toggle('more-actions-visibility');
@@ -290,7 +290,7 @@
     if (!this.policyTables[id]) {
       this.policyTables[id] = document.createElement('policy-table');
       this.mainSection.appendChild(this.policyTables[id]);
-      this.policyTables[id]!.addEventListeners();
+      this.policyTables[id].addEventListeners();
     }
     this.policyTables[id].updateDataModel(dataModel);
   }
@@ -331,8 +331,8 @@
   reloadPoliciesDone() {
     const reloadButton =
         getRequiredElement<HTMLButtonElement>('reload-policies');
-    if (reloadButton!.disabled) {
-      reloadButton!.disabled = false;
+    if (reloadButton.disabled) {
+      reloadButton.disabled = false;
       this.createToast(loadTimeData.getString('reloadPoliciesDone'));
     }
   }
diff --git a/components/policy/resources/webui/policy_table.ts b/components/policy/resources/webui/policy_table.ts
index 26be3f2..92da99b 100644
--- a/components/policy/resources/webui/policy_table.ts
+++ b/components/policy/resources/webui/policy_table.ts
@@ -148,8 +148,8 @@
     for (let i = 0; i < policies.length; i++) {
       const policyDisplay = policies[i] as PolicyRowElement;
       policyDisplay.hidden =
-          policyDisplay!.policy!.value === undefined && !showUnset ||
-          policyDisplay!.policy!.name.toLowerCase().indexOf(
+          policyDisplay.policy.value === undefined && !showUnset ||
+          policyDisplay.policy.name.toLowerCase().indexOf(
               this.filterPattern) === -1;
     }
     this.getRequiredElement<HTMLElement>('.no-policy').hidden =
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc
index d4f7863e..49156ec 100644
--- a/components/privacy_sandbox/privacy_sandbox_features.cc
+++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -277,7 +277,7 @@
 
 BASE_FEATURE(kPrivacySandboxNoticeActionDebouncingAndroid,
              "PrivacySandboxNoticeActionDebouncingAndroid",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 const base::FeatureParam<int> kPrivacySandboxDebouncingDelayMilliseconds{
     &kPrivacySandboxNoticeActionDebouncingAndroid, "debouncing-delay-ms", 100};
diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h
index 654a58f..95d1f83 100644
--- a/components/search_engines/search_engine_type.h
+++ b/components/search_engines/search_engine_type.h
@@ -91,6 +91,7 @@
   SEARCH_ENGINE_YOU = 72,
   SEARCH_ENGINE_STARTER_PACK_GEMINI = 73,
   SEARCH_ENGINE_LILO = 74,
+  SEARCH_ENGINE_STARTPAGE = 75,
 
   SEARCH_ENGINE_MAX  // Bounding value needed for UMA histogram macro.
 };
diff --git a/components/services/app_service/public/cpp/intent_util.cc b/components/services/app_service/public/cpp/intent_util.cc
index 585fcb6b..0fb23a1e 100644
--- a/components/services/app_service/public/cpp/intent_util.cc
+++ b/components/services/app_service/public/cpp/intent_util.cc
@@ -18,6 +18,7 @@
 #include "base/strings/strcat.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
+#include "base/strings/to_string.h"
 #include "base/values.h"
 #include "third_party/blink/public/common/mime_util/mime_util.h"
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccessTokenData.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccessTokenData.java
index 3a8a76c9..843d74d 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccessTokenData.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccessTokenData.java
@@ -4,10 +4,13 @@
 
 package org.chromium.components.signin;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * AccessTokenData encapsulates result of getToken method call from GoogleAuthUtil. It is a
  * holder that contains the access token and its expiration time.
  */
+@NullMarked
 public class AccessTokenData {
     /** The expiration time value when there's no known expiration time for the token. */
     public static final long NO_KNOWN_EXPIRATION_TIME = 0;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java
index d8d62ab..181a5ae7 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java
@@ -8,6 +8,7 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.signin.base.AccountCapabilities;
 import org.chromium.components.signin.base.CoreAccountInfo;
 
@@ -16,6 +17,7 @@
  * passes them to native. It has a C++ counterpart located in
  * account_capabilities_fetcher_android.{h,cc}.
  */
+@NullMarked
 public class AccountCapabilitiesFetcher {
     private static final long INVALID_NATIVE_CALLBACK = 0;
     private final CoreAccountInfo mCoreAccountInfo;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDisplayHook.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDisplayHook.java
index 5df853df..b148007 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDisplayHook.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDisplayHook.java
@@ -5,8 +5,10 @@
 package org.chromium.components.signin;
 
 import org.chromium.base.ServiceLoaderUtil;
+import org.chromium.build.annotations.NullMarked;
 
 /** Displayability of email addresses in Chrome UI based on the email domain. */
+@NullMarked
 public interface AccountEmailDisplayHook {
     boolean canHaveEmailAddressDisplayedInternal(String email);
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDomainDisplayabilityDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDomainDisplayabilityDelegate.java
index 5161640..f70655a 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDomainDisplayabilityDelegate.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountEmailDomainDisplayabilityDelegate.java
@@ -4,7 +4,10 @@
 
 package org.chromium.components.signin;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Hook for AccountEmailDomainDisplayability */
+@NullMarked
 public interface AccountEmailDomainDisplayabilityDelegate {
     boolean checkIfDisplayableEmailAddress(String email);
 }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java
index 1a74414..d00d8e3 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java
@@ -13,10 +13,11 @@
 import androidx.annotation.AnyThread;
 import androidx.annotation.IntDef;
 import androidx.annotation.MainThread;
-import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.GaiaId;
 
 import java.lang.annotation.Retention;
@@ -26,6 +27,7 @@
  * Abstraction of account management implementation.
  * Provides methods for getting accounts and managing auth tokens.
  */
+@NullMarked
 public interface AccountManagerDelegate {
     /** Response code of the {@link AccountManagerDelegate#hasCapability} result. */
     @IntDef({CapabilityResponse.EXCEPTION, CapabilityResponse.YES, CapabilityResponse.NO})
@@ -80,7 +82,7 @@
      */
     @WorkerThread
     @CapabilityResponse
-    int hasCapability(Account account, String capability);
+    int hasCapability(@Nullable Account account, String capability);
 
     /**
      * Creates an intent that will ask the user to add a new account to the device. See
@@ -112,8 +114,7 @@
      * @param accountEmail The email address of a Google account.
      */
     @WorkerThread
-    @Nullable
-    GaiaId getAccountGaiaId(String accountEmail);
+    @Nullable GaiaId getAccountGaiaId(String accountEmail);
 
     /**
      * Asks the user to confirm their knowledge of the password to the given account.
@@ -124,5 +125,6 @@
      * @param callback The callback to indicate whether the user successfully confirmed their
      *     knowledge of the account's credentials.
      */
-    void confirmCredentials(Account account, Activity activity, Callback<Bundle> callback);
+    void confirmCredentials(
+            Account account, @Nullable Activity activity, Callback<Bundle> callback);
 }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegateException.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegateException.java
index dbbbde27..1711a608 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegateException.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegateException.java
@@ -4,10 +4,13 @@
 
 package org.chromium.components.signin;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * AccountManagerDelegateException encapsulates errors that can happen while getting list of
  * accounts.
  */
+@NullMarked
 public class AccountManagerDelegateException extends Exception {
     public AccountManagerDelegateException(String message) {
         super(message);
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacade.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacade.java
index 1ff7581..34dde15 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacade.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacade.java
@@ -12,10 +12,11 @@
 
 import androidx.annotation.AnyThread;
 import androidx.annotation.MainThread;
-import androidx.annotation.Nullable;
 
 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.components.signin.base.AccountCapabilities;
 import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountInfo;
@@ -23,6 +24,7 @@
 import java.util.List;
 
 /** Interface for {@link AccountManagerFacadeImpl}. */
+@NullMarked
 public interface AccountManagerFacade {
     /** A callback for getAccessToken. */
     interface GetAccessTokenCallback {
@@ -187,7 +189,8 @@
      *     knowledge of the account's credentials.
      */
     @AnyThread
-    void confirmCredentials(Account account, Activity activity, Callback<Bundle> callback);
+    void confirmCredentials(
+            Account account, @Nullable Activity activity, Callback<Bundle> callback);
 
     /** Whether fetching the list of accounts from the device eventually succeeded. */
     // TODO(crbug.com/330304719): Handle this with exceptions rather than a boolean.
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
index 20d3c55..17cf3e0 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.signin;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.components.signin.AccountCapabilitiesConstants.IS_SUBJECT_TO_PARENTAL_CONTROLS_CAPABILITY_NAME;
 
 import android.accounts.Account;
@@ -15,8 +16,6 @@
 import android.text.TextUtils;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Callback;
@@ -29,6 +28,8 @@
 import org.chromium.base.task.AsyncTask;
 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.components.signin.AccountManagerDelegate.CapabilityResponse;
 import org.chromium.components.signin.ConnectionRetry.AuthTask;
 import org.chromium.components.signin.base.AccountCapabilities;
@@ -45,6 +46,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 /** AccountManagerFacade wraps our access of AccountManager in Android. */
+@NullMarked
 public class AccountManagerFacadeImpl implements AccountManagerFacade {
     /**
      * An account feature (corresponding to a Gaia service flag) that specifies whether the account
@@ -78,17 +80,17 @@
             new AtomicReference<>();
 
     // Deprecated in favor of `mAccountsPromise`, to be removed after migrating all affected calls.
-    private @NonNull Promise<List<CoreAccountInfo>> mCoreAccountInfosPromise = new Promise<>();
+    private Promise<List<CoreAccountInfo>> mCoreAccountInfosPromise = new Promise<>();
 
-    private @NonNull Promise<List<AccountInfo>> mAccountsPromise = new Promise<>();
+    private Promise<List<AccountInfo>> mAccountsPromise = new Promise<>();
 
-    private @Nullable AsyncTask<List<GaiaId>> mFetchGaiaIdsTask;
+    private @Nullable AsyncTask<@Nullable List<GaiaId>> mFetchGaiaIdsTask;
 
     private int mNumberOfRetries;
     private boolean mDidAccountFetchSucceed;
 
     private int mPendingTokenRequests;
-    private Runnable mTokenRequestsCompletedCallback;
+    private @Nullable Runnable mTokenRequestsCompletedCallback;
 
     private boolean mDisallowTokenRequestsForTesting;
 
@@ -346,7 +348,8 @@
     }
 
     @Override
-    public void confirmCredentials(Account account, Activity activity, Callback<Bundle> callback) {
+    public void confirmCredentials(
+            Account account, @Nullable Activity activity, Callback<Bundle> callback) {
         mDelegate.confirmCredentials(account, activity, callback);
     }
 
@@ -370,9 +373,10 @@
 
         List<String> emails = getFilteredAccountEmails();
         mFetchGaiaIdsTask =
-                new AsyncTask<List<GaiaId>>() {
+                new AsyncTask<@Nullable List<GaiaId>>() {
+                    @SuppressWarnings("NullAway") // https://github.com/uber/NullAway/issues/1139
                     @Override
-                    public @Nullable List<GaiaId> doInBackground() {
+                    public List<GaiaId> doInBackground() {
                         final long seedingStartTime = SystemClock.elapsedRealtime();
                         List<GaiaId> gaiaIds = new ArrayList<>();
                         for (String email : emails) {
@@ -428,7 +432,8 @@
 
     private void onAccountsUpdated() {
         ThreadUtils.assertOnUiThread();
-        new AsyncTask<List<Account>>() {
+        new AsyncTask<@Nullable List<Account>>() {
+            @SuppressWarnings("NullAway") // https://github.com/uber/NullAway/issues/1139
             @Override
             protected @Nullable List<Account> doInBackground() {
                 try {
@@ -502,7 +507,8 @@
     private List<String> getFilteredAccountEmails() {
         List<String> ret = new ArrayList<>();
         List<PatternMatcher> restrictions = mAccountRestrictionPatterns.get();
-        for (Account account : mAllAccounts.get()) {
+        assumeNonNull(restrictions);
+        for (Account account : assumeNonNull(mAllAccounts.get())) {
             String name = account.name;
             boolean matches = restrictions.isEmpty();
             for (PatternMatcher matcher : restrictions) {
@@ -522,7 +528,7 @@
      * @param capabilityName the name of the capability used to query Identity services.
      * @return the name of the capability used to query GmsCore.
      */
-    static String getAndroidCapabilityName(@NonNull String capabilityName) {
+    static String getAndroidCapabilityName(String capabilityName) {
         if (capabilityName.startsWith(ACCOUNT_CAPABILITY_NAME_PREFIX)) {
             return capabilityName.substring(ACCOUNT_CAPABILITY_NAME_PREFIX.length());
         }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeProvider.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeProvider.java
index 1ad5fe9..23f97e3 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeProvider.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeProvider.java
@@ -10,11 +10,14 @@
 
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.ServiceLoaderUtil;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * AccountManagerFacadeProvider is intended to group all the AccountManagerFacade instance
  * manipulation methods in one place.
  */
+@NullMarked
 public class AccountManagerFacadeProvider {
     // Holder needed to avoid init on instrumentation thread in tests.
     private static class Holder {
@@ -30,7 +33,7 @@
         }
     }
 
-    private static AccountManagerFacade sInstanceForTesting;
+    private static @Nullable AccountManagerFacade sInstanceForTesting;
 
     private AccountManagerFacadeProvider() {}
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountReauthenticationUtils.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountReauthenticationUtils.java
index 8b51e479..7195dd9 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountReauthenticationUtils.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountReauthenticationUtils.java
@@ -13,11 +13,13 @@
 import org.chromium.base.Callback;
 import org.chromium.base.TimeUtils;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 /** ReauthenticationUtils contains static util methods for account reauthentication. */
+@NullMarked
 public class AccountReauthenticationUtils {
     public AccountReauthenticationUtils() {}
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountRestrictionPatternReceiver.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountRestrictionPatternReceiver.java
index 32b87e3..4d9f369 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountRestrictionPatternReceiver.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountRestrictionPatternReceiver.java
@@ -18,11 +18,13 @@
 import org.chromium.base.Log;
 import org.chromium.base.Promise;
 import org.chromium.base.task.AsyncTask;
+import org.chromium.build.annotations.NullMarked;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /** Receiver of the RestrictAccountsToPatterns policy. */
+@NullMarked
 final class AccountRestrictionPatternReceiver {
     private static final String TAG = "AccountRestriction";
     private static final String ACCOUNT_RESTRICTION_PATTERNS_KEY = "RestrictAccountsToPatterns";
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
index 339aec2..18f440f 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
@@ -6,11 +6,11 @@
 
 import android.accounts.Account;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Promise;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccountManagerFacade.ChildAccountStatusListener;
 import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountInfo;
@@ -23,6 +23,7 @@
 import java.util.regex.Pattern;
 
 /** AccountUtils groups some static util methods for account. */
+@NullMarked
 public class AccountUtils {
     private static final Pattern AT_SYMBOL = Pattern.compile("@");
     private static final String GMAIL_COM = "gmail.com";
@@ -135,9 +136,9 @@
      *                 (whether it is a child one) is ready.
      */
     public static void checkChildAccountStatus(
-            @NonNull AccountManagerFacade accountManagerFacade,
-            @NonNull List<CoreAccountInfo> coreAccountInfos,
-            @NonNull ChildAccountStatusListener listener) {
+            AccountManagerFacade accountManagerFacade,
+            List<CoreAccountInfo> coreAccountInfos,
+            ChildAccountStatusListener listener) {
         if (coreAccountInfos.size() >= 1) {
             // If a child account is present then there can be only one, and it must be the first
             // account on the device.
@@ -164,9 +165,9 @@
      *     to parental controls) is ready.
      */
     public static void checkIsSubjectToParentalControls(
-            @NonNull AccountManagerFacade accountManagerFacade,
-            @NonNull List<CoreAccountInfo> coreAccountInfos,
-            @NonNull ChildAccountStatusListener listener) {
+            AccountManagerFacade accountManagerFacade,
+            List<CoreAccountInfo> coreAccountInfos,
+            ChildAccountStatusListener listener) {
         if (coreAccountInfos.size() >= 1) {
             // If an account subject to parental controls is present then there can be only one, and
             // it must be the first
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountsChangeObserver.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountsChangeObserver.java
index 2dfb5d8b..f6c236d 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountsChangeObserver.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountsChangeObserver.java
@@ -6,10 +6,13 @@
 
 import androidx.annotation.MainThread;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Observer that receives account change notifications. Use {@link AccountManagerFacade#addObserver}
  * and {@link AccountManagerFacade#removeObserver} to update registrations.
  */
+@NullMarked
 public interface AccountsChangeObserver {
     /**
      * Called after updating {@link org.chromium.components.signin.base.CoreAccountInfo} on every
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AuthException.java b/components/signin/public/android/java/src/org/chromium/components/signin/AuthException.java
index d522765f..4782d8a 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AuthException.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AuthException.java
@@ -4,10 +4,13 @@
 
 package org.chromium.components.signin;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * AuthException abstracts away authenticator specific exceptions behind a single interface.
  * It is used for passing information that is useful for better handling of errors.
  */
+@NullMarked
 public class AuthException extends Exception {
     public static final boolean TRANSIENT = true;
     public static final boolean NONTRANSIENT = false;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java b/components/signin/public/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java
index 4f6b25a..554676ce 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java
@@ -4,20 +4,22 @@
 
 package org.chromium.components.signin;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.accounts.Account;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.CoreAccountId;
 import org.chromium.components.signin.base.CoreAccountInfo;
 
@@ -25,6 +27,7 @@
  * ChildAccountInfoFetcher for the Android platform.
  * Checks whether an account is a child account from the AccountManager.
  */
+@NullMarked
 final class ChildAccountInfoFetcher {
     private static final String TAG = "signin";
 
@@ -52,6 +55,7 @@
                     public void onReceive(Context context, Intent intent) {
                         ThreadUtils.assertOnUiThread();
                         Account changedAccount = intent.getParcelableExtra(ACCOUNT_KEY);
+                        assumeNonNull(changedAccount);
                         Log.d(
                                 TAG,
                                 "Received account flag change broadcast for %s",
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/ConnectionRetry.java b/components/signin/public/android/java/src/org/chromium/components/signin/ConnectionRetry.java
index 9e22252..bbc7647 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/ConnectionRetry.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/ConnectionRetry.java
@@ -7,6 +7,8 @@
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.task.AsyncTask;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.net.NetworkChangeNotifier;
 
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -20,6 +22,7 @@
  *
  * @param <T> Return type of the AuthTask launched by ConnectionRetry.
  */
+@NullMarked
 public class ConnectionRetry<T> implements NetworkChangeNotifier.ConnectionTypeObserver {
     /**
      * Authentication Task used together with ConnectionRetry class.
@@ -62,9 +65,10 @@
         ThreadUtils.assertOnUiThread();
         // Clear any transient error.
         mIsTransientError.set(false);
-        new AsyncTask<T>() {
+        new AsyncTask<@Nullable T>() {
+            @SuppressWarnings("NullAway") // https://github.com/uber/NullAway/issues/1139
             @Override
-            public T doInBackground() {
+            public @Nullable T doInBackground() {
                 try {
                     return mAuthTask.run();
                 } catch (AuthException ex) {
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/PatternMatcher.java b/components/signin/public/android/java/src/org/chromium/components/signin/PatternMatcher.java
index 931c3cf6..7b5311a 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/PatternMatcher.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/PatternMatcher.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.signin;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -11,6 +13,7 @@
  * Encapsulates simple wildcard pattern-matching.
  * See {@link PatternMatcher#PatternMatcher(String)} for the format description.
  */
+@NullMarked
 class PatternMatcher {
     /** Encapsulates information about illegal pattern. */
     public static class IllegalPatternException extends Exception {
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatureMap.java b/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatureMap.java
index cf5bfa2..ebcec0ea 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatureMap.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatureMap.java
@@ -8,9 +8,11 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.FeatureMap;
+import org.chromium.build.annotations.NullMarked;
 
 /** Java accessor for base/android/feature_map.h state. */
 @JNINamespace("signin")
+@NullMarked
 public final class SigninFeatureMap extends FeatureMap {
     private static final SigninFeatureMap sInstance = new SigninFeatureMap();
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
index 456940b3..bfa8b6c1 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.signin;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.Manifest;
 import android.accounts.Account;
 import android.accounts.AccountManager;
@@ -22,8 +24,6 @@
 import android.os.Process;
 import android.os.SystemClock;
 
-import androidx.annotation.Nullable;
-
 import com.google.android.gms.auth.GoogleAuthException;
 import com.google.android.gms.auth.GoogleAuthUtil;
 
@@ -33,6 +33,9 @@
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.NullUnmarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.externalauth.ExternalAuthUtils;
 import org.chromium.components.signin.base.GaiaId;
 import org.chromium.components.signin.metrics.FetchAccountCapabilitiesFromSystemLibraryResult;
@@ -43,9 +46,10 @@
  * Default implementation of {@link AccountManagerDelegate} which delegates all calls to the
  * Android account manager.
  */
+@NullMarked
 public class SystemAccountManagerDelegate implements AccountManagerDelegate {
     private final AccountManager mAccountManager;
-    private AccountsChangeObserver mObserver;
+    private @Nullable AccountsChangeObserver mObserver;
 
     private static final String TAG = "Auth";
 
@@ -68,7 +72,7 @@
                 new BroadcastReceiver() {
                     @Override
                     public void onReceive(final Context context, final Intent intent) {
-                        mObserver.onCoreAccountInfosChanged();
+                        assumeNonNull(mObserver).onCoreAccountInfosChanged();
                     }
                 };
         IntentFilter accountsChangedIntentFilter = new IntentFilter();
@@ -106,6 +110,7 @@
     }
 
     @Override
+    @NullUnmarked
     public AccessTokenData getAccessToken(Account account, String authTokenScope)
             throws AuthException {
         ThreadUtils.assertOnBackgroundThread();
@@ -154,7 +159,7 @@
     }
 
     @Override
-    public @CapabilityResponse int hasCapability(Account account, String capability) {
+    public @CapabilityResponse int hasCapability(@Nullable Account account, String capability) {
         RecordHistogram.recordEnumeratedHistogram(
                 "Signin.AccountCapabilities.GetFromSystemLibraryResult",
                 FetchAccountCapabilitiesFromSystemLibraryResult.API_NOT_AVAILABLE,
@@ -165,7 +170,7 @@
     // No permission is needed on 23+ and Chrome always has MANAGE_ACCOUNTS permission on lower APIs
     @SuppressLint("MissingPermission")
     @Override
-    public void createAddAccountIntent(Callback<Intent> callback) {
+    public void createAddAccountIntent(Callback<@Nullable Intent> callback) {
         AccountManagerCallback<Bundle> accountManagerCallback =
                 accountManagerFuture -> {
                     try {
@@ -190,7 +195,7 @@
     @SuppressLint("MissingPermission")
     @Override
     public void updateCredentials(
-            Account account, Activity activity, final Callback<Boolean> callback) {
+            Account account, Activity activity, final @Nullable Callback<Boolean> callback) {
         ThreadUtils.assertOnUiThread();
         AccountManagerCallback<Bundle> realCallback =
                 future -> {
@@ -215,9 +220,8 @@
                 account, "android", emptyOptions, activity, realCallback, null);
     }
 
-    @Nullable
     @Override
-    public GaiaId getAccountGaiaId(String accountEmail) {
+    public @Nullable GaiaId getAccountGaiaId(String accountEmail) {
         try {
             return new GaiaId(
                     GoogleAuthUtil.getAccountId(
@@ -229,7 +233,8 @@
     }
 
     @Override
-    public void confirmCredentials(Account account, Activity activity, Callback<Bundle> callback) {
+    public void confirmCredentials(
+            Account account, @Nullable Activity activity, Callback<@Nullable Bundle> callback) {
         AccountManagerCallback<Bundle> accountManagerCallback =
                 (accountManagerFuture) -> {
                     @Nullable Bundle result = null;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java
index 8db9e083..f79531a 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java
@@ -4,11 +4,11 @@
 
 package org.chromium.components.signin.base;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.signin.AccountCapabilitiesConstants;
 import org.chromium.components.signin.AccountManagerDelegate;
 import org.chromium.components.signin.Tribool;
@@ -20,6 +20,7 @@
  * Stores the state associated with supported account capabilities. This class has a native
  * counterpart.
  */
+@NullMarked
 public class AccountCapabilities {
     private final Map<String, Boolean> mAccountCapabilities;
 
@@ -229,7 +230,7 @@
      * @return the capability value associated to the name.
      */
     @CalledByNative
-    private @Tribool int getCapabilityByName(@NonNull String capabilityName) {
+    private @Tribool int getCapabilityByName(String capabilityName) {
         if (!mAccountCapabilities.containsKey(capabilityName)) {
             return Tribool.UNKNOWN;
         }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java
index 24bc142..d71a25e 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java
@@ -7,10 +7,10 @@
 import android.graphics.Bitmap;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccountEmailDisplayHook;
 import org.chromium.components.signin.SigninConstants;
 import org.chromium.components.signin.Tribool;
@@ -22,6 +22,7 @@
  *
  * This class has a native counterpart called AccountInfo.
  */
+@NullMarked
 public class AccountInfo extends CoreAccountInfo {
     /** Used to instantiate `AccountInfo`. */
     public static class Builder {
@@ -161,7 +162,7 @@
     /**
      * Management domain for the account. Can only be called if `isManaged` returns `Tribool.TRUE`.
      */
-    public String getManagementDomain() {
+    public @Nullable String getManagementDomain() {
         if (isManaged() != Tribool.TRUE) {
             throw new IllegalStateException("The account isn't managed (or the status is unknown)");
         }
@@ -189,7 +190,7 @@
     }
 
     @CalledByNative
-    private String getRawHostedDomain() {
+    private @Nullable String getRawHostedDomain() {
         return mHostedDomain;
     }
 }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountId.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountId.java
index 38051f2f..7449180 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountId.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountId.java
@@ -4,21 +4,22 @@
 
 package org.chromium.components.signin.base;
 
-import androidx.annotation.NonNull;
-
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Represents the id of an account, which on Android is always a Gaia ID. This class has a native
  * counterpart called CoreAccountId, which on platforms other than Android (namely ChromeOS) may
  * also be an e-mail.
  */
+@NullMarked
 public class CoreAccountId {
     private final GaiaId mId;
 
     /** Constructs a new CoreAccountId from a Gaia ID. */
     @CalledByNative
-    public CoreAccountId(@NonNull GaiaId id) {
+    public CoreAccountId(GaiaId id) {
         assert id != null;
         mId = id;
     }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountInfo.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountInfo.java
index 24a26c8..75f1931 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountInfo.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/CoreAccountInfo.java
@@ -6,11 +6,10 @@
 
 import android.accounts.Account;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccountUtils;
 
 /**
@@ -19,6 +18,7 @@
  * For example, the email will change if the user changes email.
  * This class has a native counterpart called CoreAccountInfo.
  */
+@NullMarked
 public class CoreAccountInfo {
     private final CoreAccountId mId;
     private final String mEmail;
@@ -32,8 +32,7 @@
      * @param gaiaId An object representing a Gaia ID.
      */
     @CalledByNative
-    protected CoreAccountInfo(
-            @NonNull CoreAccountId id, @NonNull String email, @NonNull GaiaId gaiaId) {
+    protected CoreAccountInfo(CoreAccountId id, String email, GaiaId gaiaId) {
         assert id != null;
         assert email != null;
         assert gaiaId != null;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/GaiaId.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/GaiaId.java
index bb290156..833b99c 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/GaiaId.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/GaiaId.java
@@ -4,18 +4,19 @@
 
 package org.chromium.components.signin.base;
 
-import androidx.annotation.NonNull;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JniType;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Represents an account ID or Gaia ID. This class has a native counterpart also called GaiaId. */
+@NullMarked
 public class GaiaId {
     private final String mValue;
 
     /** Constructs a new GaiaId from a String representation of the gaia ID. */
     @CalledByNative
-    public GaiaId(@NonNull @JniType("std::string") String value) {
+    public GaiaId(@JniType("std::string") String value) {
         assert value != null;
         mValue = value;
     }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/GoogleServiceAuthError.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/GoogleServiceAuthError.java
index 0d3c0e1..88449e1 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/GoogleServiceAuthError.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/GoogleServiceAuthError.java
@@ -9,6 +9,8 @@
 
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -16,6 +18,7 @@
  * This class mirrors the native GoogleServiceAuthError class State enum from:
  * google_apis/gaia/google_service_auth_error.h.
  */
+@NullMarked
 public class GoogleServiceAuthError {
     @IntDef({
         State.NONE,
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoService.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoService.java
index 3469b1c..3494572c 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoService.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoService.java
@@ -5,9 +5,11 @@
 package org.chromium.components.signin.identitymanager;
 
 import org.chromium.base.Promise;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.signin.base.AccountInfo;
 
 /** This interface handles the {@link AccountInfo} fetch on Java side. */
+@NullMarked
 public interface AccountInfoService {
     /** Observes the changes of {@link AccountInfo}. */
     interface Observer {
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceImpl.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceImpl.java
index c00f253..372447d5 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceImpl.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceImpl.java
@@ -6,9 +6,12 @@
 
 import org.chromium.base.ObserverList;
 import org.chromium.base.Promise;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.AccountInfo;
 
 /** This class handles the {@link AccountInfo} fetch on Java side. */
+@NullMarked
 final class AccountInfoServiceImpl implements IdentityManager.Observer, AccountInfoService {
     private final IdentityManager mIdentityManager;
     private final ObserverList<Observer> mObservers = new ObserverList<>();
@@ -20,8 +23,8 @@
 
     /** Gets the {@link AccountInfo} of the given account email. */
     @Override
-    public Promise<AccountInfo> getAccountInfoByEmail(String email) {
-        final Promise<AccountInfo> accountInfoPromise = new Promise<>();
+    public Promise<@Nullable AccountInfo> getAccountInfoByEmail(String email) {
+        final Promise<@Nullable AccountInfo> accountInfoPromise = new Promise<>();
         accountInfoPromise.fulfill(mIdentityManager.findExtendedAccountInfoByEmailAddress(email));
         return accountInfoPromise;
     }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceProvider.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceProvider.java
index e507b32..0722174 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceProvider.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountInfoServiceProvider.java
@@ -5,15 +5,17 @@
 package org.chromium.components.signin.identitymanager;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * This class groups all the {@link AccountInfoService} instance manipulation
  * methods in one place.
  */
+@NullMarked
 public final class AccountInfoServiceProvider {
     private static @Nullable Promise<AccountInfoService> sInstancePromise;
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java
index ac1057e..9955d900 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java
@@ -4,13 +4,12 @@
 
 package org.chromium.components.signin.identitymanager;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.CoreAccountInfo;
 
 import java.time.Duration;
@@ -19,8 +18,9 @@
  * AccountManagedStatusFinder waits for the account managed status to be fetched. This is a Java
  * version of the C++ AccountManagedStatusFinder class.
  */
+@NullMarked
 public class AccountManagedStatusFinder {
-    private final @NonNull Callback<Integer> mAsyncCallback;
+    private final Callback<Integer> mAsyncCallback;
 
     private long mNativeAccountManagedStatusFinder;
 
@@ -48,9 +48,9 @@
      * period.
      */
     public AccountManagedStatusFinder(
-            @NonNull IdentityManager identityManager,
-            @NonNull CoreAccountInfo account,
-            @NonNull Callback<Integer> asyncCallback,
+            IdentityManager identityManager,
+            CoreAccountInfo account,
+            Callback<Integer> asyncCallback,
             @Nullable Duration timeout) {
         assert identityManager != null && account != null && asyncCallback != null;
         mAsyncCallback = asyncCallback;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityManager.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityManager.java
index 2ce26bf..8d4a9845 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityManager.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityManager.java
@@ -5,7 +5,6 @@
 package org.chromium.components.signin.identitymanager;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
@@ -13,6 +12,8 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.ObserverList;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountId;
 import org.chromium.components.signin.base.CoreAccountInfo;
@@ -20,6 +21,7 @@
 import java.util.List;
 
 /** IdentityManager provides access to native IdentityManager's public API to java components. */
+@NullMarked
 public class IdentityManager {
     /**
      * IdentityManager.Observer is notified when the available account information are updated. This
@@ -47,7 +49,7 @@
     private final ProfileOAuth2TokenServiceDelegate mProfileOAuth2TokenServiceDelegate;
 
     private final ObserverList<Observer> mObservers = new ObserverList<>();
-    private Callback<CoreAccountInfo> mRefreshTokenUpdateObserver;
+    private @Nullable Callback<CoreAccountInfo> mRefreshTokenUpdateObserver;
 
     /** Called by native to create an instance of IdentityManager. */
     @CalledByNative
@@ -193,11 +195,12 @@
 
     @NativeMethods
     public interface Natives {
-        @Nullable
-        CoreAccountInfo getPrimaryAccountInfo(long nativeIdentityManager, int consentLevel);
 
-        @Nullable
-        AccountInfo findExtendedAccountInfoByEmailAddress(long nativeIdentityManager, String email);
+        @Nullable CoreAccountInfo getPrimaryAccountInfo(
+                long nativeIdentityManager, int consentLevel);
+
+        @Nullable AccountInfo findExtendedAccountInfoByEmailAddress(
+                long nativeIdentityManager, String email);
 
         CoreAccountInfo[] getAccountsWithRefreshTokens(long nativeIdentityManager);
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityMutator.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityMutator.java
index deeccebd8..6153d8d9 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityMutator.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/IdentityMutator.java
@@ -4,11 +4,11 @@
 
 package org.chromium.components.signin.identitymanager;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountId;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
@@ -20,6 +20,7 @@
  * IdentityMutator is the write interface of IdentityManager, see identity_mutator.h for more
  * information.
  */
+@NullMarked
 public class IdentityMutator {
     // Pointer to native IdentityMutator, not final because of destroy().
     private long mNativeIdentityMutator;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/PrimaryAccountChangeEvent.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/PrimaryAccountChangeEvent.java
index 497a3a5..b642f9d2 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/PrimaryAccountChangeEvent.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/PrimaryAccountChangeEvent.java
@@ -9,6 +9,8 @@
 
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -17,6 +19,7 @@
  * org.chromium.components.signin.identitymanager.IdentityManager} This class has a native
  * counterpart called PrimaryAccountChangeEvent.
  */
+@NullMarked
 public class PrimaryAccountChangeEvent {
     /**
      * This class mirrors the native PrimaryAccountChangeEvent class Type enum from:
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
index 54e5d5f..c84c8d4 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
@@ -12,6 +12,8 @@
 
 import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccessTokenData;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
@@ -28,6 +30,7 @@
  *
  * <p>
  */
+@NullMarked
 final class ProfileOAuth2TokenServiceDelegate {
     private static final String OAUTH2_SCOPE_PREFIX = "oauth2:";
 
@@ -141,7 +144,7 @@
          *     completion.
          */
         void onOAuth2TokenFetched(
-                String authToken,
+                @Nullable String authToken,
                 long expirationTimeSecs,
                 boolean isTransientError,
                 long nativeCallback);
diff --git a/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java b/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java
index c189f96..2acada11 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java
@@ -12,6 +12,7 @@
 import org.jni_zero.JniType;
 
 import org.chromium.base.ServiceLoaderUtil;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.sync.protocol.NigoriKey;
 
@@ -24,6 +25,7 @@
  * <p>This class is only used from the native side, the only APIs exposed to Java are testing ones.
  */
 @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+@NullMarked
 public abstract class ExplicitPassphrasePlatformClient {
     @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
     public abstract void setExplicitDecryptionPassphrase(
diff --git a/components/sync/android/java/src/org/chromium/components/sync/LocalDataDescription.java b/components/sync/android/java/src/org/chromium/components/sync/LocalDataDescription.java
index 1399a77d..3b68fc89 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/LocalDataDescription.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/LocalDataDescription.java
@@ -11,8 +11,11 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Java version of the native LocalDataDescription struct. */
 @JNINamespace("syncer")
+@NullMarked
 public class LocalDataDescription {
     private final int mItemCount;
     private final String[] mDomains;
diff --git a/components/sync/android/java/src/org/chromium/components/sync/Passphrase.java b/components/sync/android/java/src/org/chromium/components/sync/Passphrase.java
index 38b6542..d457dad2 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/Passphrase.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/Passphrase.java
@@ -4,7 +4,10 @@
 
 package org.chromium.components.sync;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** This class provides some utility functions to deal with sync passphrases. */
+@NullMarked
 public class Passphrase {
     /**
      * Returns whether a passphrase type represents an "explicit" passphrase, which usually means
diff --git a/components/sync/android/java/src/org/chromium/components/sync/SyncFeatureMap.java b/components/sync/android/java/src/org/chromium/components/sync/SyncFeatureMap.java
index 835445d..d78d9293 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/SyncFeatureMap.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/SyncFeatureMap.java
@@ -8,9 +8,11 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.FeatureMap;
+import org.chromium.build.annotations.NullMarked;
 
 /** Java accessor for base/android/feature_map.h state. */
 @JNINamespace("syncer")
+@NullMarked
 public final class SyncFeatureMap extends FeatureMap {
     public static final String SYNC_ENABLE_BOOKMARKS_IN_TRANSPORT_MODE =
             "SyncEnableBookmarksInTransportMode";
diff --git a/components/sync/android/java/src/org/chromium/components/sync/SyncService.java b/components/sync/android/java/src/org/chromium/components/sync/SyncService.java
index d163e7cf..1738e0f5 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/SyncService.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/SyncService.java
@@ -4,13 +4,14 @@
 
 package org.chromium.components.sync;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
 import org.json.JSONArray;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.base.GoogleServiceAuthError;
 
@@ -21,6 +22,7 @@
  * Java version of the native SyncService interface. Must only be used on the UI thread.
  * TODO(crbug.com/40161455): Document the remaining methods.
  */
+@NullMarked
 public interface SyncService {
     /** Listener for the underlying sync status. */
     public interface SyncStateChangedListener {
diff --git a/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java b/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java
index 38e9fe11..faade81 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java
@@ -4,7 +4,6 @@
 
 package org.chromium.components.sync;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
@@ -16,6 +15,8 @@
 import org.chromium.base.Callback;
 import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils.ThreadChecker;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountsChangeObserver;
@@ -36,6 +37,7 @@
  * components/sync/service/sync_service_impl.h for more details.
  */
 @JNINamespace("syncer")
+@NullMarked
 public class SyncServiceImpl implements SyncService, AccountsChangeObserver {
     // Pointer to the C++ counterpart object. Set on construction and reset on destroy() to avoid
     // a dangling pointer.
@@ -614,8 +616,7 @@
 
         boolean requiresClientUpgrade(long nativeSyncServiceAndroidBridge);
 
-        @Nullable
-        CoreAccountInfo getAccountInfo(long nativeSyncServiceAndroidBridge);
+        @Nullable CoreAccountInfo getAccountInfo(long nativeSyncServiceAndroidBridge);
 
         boolean hasSyncConsent(long nativeSyncServiceAndroidBridge);
 
diff --git a/components/sync/base/pref_names.h b/components/sync/base/pref_names.h
index a12ff4c..dcae1e92 100644
--- a/components/sync/base/pref_names.h
+++ b/components/sync/base/pref_names.h
@@ -96,6 +96,11 @@
 inline constexpr char kSyncCachedPassphraseType[] =
     "sync.cached_passphrase_type";
 
+// Whether or not a persistent auth error is known to exist, cached in prefs
+// because IdentityManager doesn't persist this information.
+inline constexpr char kSyncCachedPersistentAuthErrorForMetrics[] =
+    "sync.cached_persistent_auth_error";
+
 // The user's TrustedVaultAutoUpgradeExperimentGroup, determined the first time
 // the engine is successfully initialized.
 inline constexpr char kSyncCachedTrustedVaultAutoUpgradeExperimentGroup[] =
diff --git a/components/sync/service/history_sync_session_durations_metrics_recorder.cc b/components/sync/service/history_sync_session_durations_metrics_recorder.cc
index 0d56d8e..98fa0a3 100644
--- a/components/sync/service/history_sync_session_durations_metrics_recorder.cc
+++ b/components/sync/service/history_sync_session_durations_metrics_recorder.cc
@@ -113,7 +113,12 @@
           UserSelectableType::kHistory)) {
     return HistorySyncStatus::kDisabled;
   }
-  return HistorySyncStatus::kEnabled;
+  if (sync_service_->GetTransportState() ==
+          SyncService::TransportState::PAUSED ||
+      sync_service_->HasCachedPersistentAuthErrorForMetrics()) {
+    return HistorySyncStatus::kEnabledWithError;
+  }
+  return HistorySyncStatus::kEnabledWithoutError;
 }
 
 // static
@@ -124,7 +129,16 @@
     case HistorySyncStatus::kDisabled:
       LogDuration("WithoutHistorySync", session_length);
       break;
-    case HistorySyncStatus::kEnabled:
+    case HistorySyncStatus::kEnabledWithoutError:
+      LogDuration("WithHistorySyncWithoutAuthError", session_length);
+      // "WithHistorySync" gets logged regardless of whether there is an auth
+      // error or not.
+      LogDuration("WithHistorySync", session_length);
+      break;
+    case HistorySyncStatus::kEnabledWithError:
+      LogDuration("WithHistorySyncAndAuthError", session_length);
+      // "WithHistorySync" gets logged regardless of whether there is an auth
+      // error or not.
       LogDuration("WithHistorySync", session_length);
       break;
   }
diff --git a/components/sync/service/history_sync_session_durations_metrics_recorder.h b/components/sync/service/history_sync_session_durations_metrics_recorder.h
index 1cf783f..f22042e 100644
--- a/components/sync/service/history_sync_session_durations_metrics_recorder.h
+++ b/components/sync/service/history_sync_session_durations_metrics_recorder.h
@@ -42,7 +42,8 @@
  private:
   enum class HistorySyncStatus {
     kDisabled,
-    kEnabled,
+    kEnabledWithoutError,
+    kEnabledWithError,
   };
 
   HistorySyncStatus DetermineHistorySyncStatus() const;
diff --git a/components/sync/service/history_sync_session_durations_metrics_recorder_unittest.cc b/components/sync/service/history_sync_session_durations_metrics_recorder_unittest.cc
index 45bce82..dee0f72a 100644
--- a/components/sync/service/history_sync_session_durations_metrics_recorder_unittest.cc
+++ b/components/sync/service/history_sync_session_durations_metrics_recorder_unittest.cc
@@ -23,6 +23,10 @@
     "Session.TotalDurationMax1Day.WithoutHistorySync";
 constexpr char kMetricNameWithHistorySync[] =
     "Session.TotalDurationMax1Day.WithHistorySync";
+constexpr char kMetricNameWithHistorySyncWithoutAuthError[] =
+    "Session.TotalDurationMax1Day.WithHistorySyncWithoutAuthError";
+constexpr char kMetricNameWithHistorySyncAndAuthError[] =
+    "Session.TotalDurationMax1Day.WithHistorySyncAndAuthError";
 
 class HistorySyncSessionDurationsMetricsRecorderTest : public testing::Test {
  public:
@@ -50,6 +54,8 @@
 
   ht.ExpectUniqueTimeSample(kMetricNameWithoutHistorySync, kSessionTime, 1);
   ht.ExpectTotalCount(kMetricNameWithHistorySync, 0);
+  ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+  ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
 }
 
 TEST_F(HistorySyncSessionDurationsMetricsRecorderTest,
@@ -63,6 +69,8 @@
 
   ht.ExpectUniqueTimeSample(kMetricNameWithoutHistorySync, kSessionTime, 1);
   ht.ExpectTotalCount(kMetricNameWithHistorySync, 0);
+  ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+  ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
 }
 
 TEST_F(HistorySyncSessionDurationsMetricsRecorderTest,
@@ -75,7 +83,27 @@
   metrics_recorder.OnSessionEnded(kSessionTime);
 
   ht.ExpectUniqueTimeSample(kMetricNameWithHistorySync, kSessionTime, 1);
+  ht.ExpectUniqueTimeSample(kMetricNameWithHistorySyncWithoutAuthError,
+                            kSessionTime, 1);
   ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+  ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
+}
+
+TEST_F(HistorySyncSessionDurationsMetricsRecorderTest,
+       InitiallySignedInWithHistorySyncAndAuthError) {
+  SignIn(/*history_sync_enabled=*/true);
+  sync_service_.SetPersistentAuthError();
+
+  base::HistogramTester ht;
+  HistorySyncSessionDurationsMetricsRecorder metrics_recorder(&sync_service_);
+  metrics_recorder.OnSessionStarted();
+  metrics_recorder.OnSessionEnded(kSessionTime);
+
+  ht.ExpectUniqueTimeSample(kMetricNameWithHistorySync, kSessionTime, 1);
+  ht.ExpectUniqueTimeSample(kMetricNameWithHistorySyncAndAuthError,
+                            kSessionTime, 1);
+  ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+  ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
 }
 
 TEST_F(HistorySyncSessionDurationsMetricsRecorderTest,
@@ -92,6 +120,8 @@
 
     ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 1);
     ht.ExpectTotalCount(kMetricNameWithHistorySync, 0);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
   }
 
   {
@@ -100,7 +130,67 @@
     SCOPED_TRACE("OnSessionEnded");
 
     ht.ExpectUniqueTimeSample(kMetricNameWithHistorySync, kSessionTime, 1);
+    ht.ExpectUniqueTimeSample(kMetricNameWithHistorySyncWithoutAuthError,
+                              kSessionTime, 1);
     ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
+  }
+}
+
+TEST_F(HistorySyncSessionDurationsMetricsRecorderTest, EnterAuthError) {
+  SignIn(/*history_sync_enabled=*/true);
+  HistorySyncSessionDurationsMetricsRecorder metrics_recorder(&sync_service_);
+
+  {
+    base::HistogramTester ht;
+    metrics_recorder.OnSessionStarted();
+    sync_service_.SetPersistentAuthError();
+    sync_service_.FireStateChanged();
+
+    ht.ExpectTotalCount(kMetricNameWithHistorySync, 1);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 1);
+    ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
+  }
+
+  {
+    base::HistogramTester ht;
+    metrics_recorder.OnSessionEnded(kSessionTime);
+
+    ht.ExpectUniqueTimeSample(kMetricNameWithHistorySync, kSessionTime, 1);
+    ht.ExpectUniqueTimeSample(kMetricNameWithHistorySyncAndAuthError,
+                              kSessionTime, 1);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+    ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+  }
+}
+
+TEST_F(HistorySyncSessionDurationsMetricsRecorderTest, FixAuthError) {
+  SignIn(/*history_sync_enabled=*/true);
+  sync_service_.SetPersistentAuthError();
+  HistorySyncSessionDurationsMetricsRecorder metrics_recorder(&sync_service_);
+
+  {
+    base::HistogramTester ht;
+    metrics_recorder.OnSessionStarted();
+    sync_service_.ClearAuthError();
+    sync_service_.FireStateChanged();
+
+    ht.ExpectTotalCount(kMetricNameWithHistorySync, 1);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 1);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncWithoutAuthError, 0);
+    ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+  }
+
+  {
+    base::HistogramTester ht;
+    metrics_recorder.OnSessionEnded(kSessionTime);
+
+    ht.ExpectUniqueTimeSample(kMetricNameWithHistorySync, kSessionTime, 1);
+    ht.ExpectUniqueTimeSample(kMetricNameWithHistorySyncWithoutAuthError,
+                              kSessionTime, 1);
+    ht.ExpectTotalCount(kMetricNameWithoutHistorySync, 0);
+    ht.ExpectTotalCount(kMetricNameWithHistorySyncAndAuthError, 0);
   }
 }
 
diff --git a/components/sync/service/sync_prefs.cc b/components/sync/service/sync_prefs.cc
index ec2ce07..8d01dd1 100644
--- a/components/sync/service/sync_prefs.cc
+++ b/components/sync/service/sync_prefs.cc
@@ -179,6 +179,10 @@
   registry->RegisterStringPref(prefs::internal::kSyncEncryptionBootstrapToken,
                                std::string());
 
+  // Cached notion of whether or not a persistent auth error exists.
+  registry->RegisterBooleanPref(
+      prefs::internal::kSyncCachedPersistentAuthErrorForMetrics, false);
+
   // The encryption bootstrap token represents a user-entered passphrase per
   // account.
   registry->RegisterDictionaryPref(
@@ -575,6 +579,26 @@
   pref_service_->ClearPref(prefs::internal::kSyncCachedPassphraseType);
 }
 
+bool SyncPrefs::HasCachedPersistentAuthErrorForMetrics() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return pref_service_->GetBoolean(
+      prefs::internal::kSyncCachedPersistentAuthErrorForMetrics);
+}
+
+void SyncPrefs::SetHasCachedPersistentAuthErrorForMetrics(
+    bool has_persistent_auth_error) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  pref_service_->SetBoolean(
+      prefs::internal::kSyncCachedPersistentAuthErrorForMetrics,
+      has_persistent_auth_error);
+}
+
+void SyncPrefs::ClearCachedPersistentAuthErrorForMetrics() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  pref_service_->ClearPref(
+      prefs::internal::kSyncCachedPersistentAuthErrorForMetrics);
+}
+
 std::optional<sync_pb::TrustedVaultAutoUpgradeExperimentGroup>
 SyncPrefs::GetCachedTrustedVaultAutoUpgradeExperimentGroup() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/sync/service/sync_prefs.h b/components/sync/service/sync_prefs.h
index 13fd44f..e3157cd 100644
--- a/components/sync/service/sync_prefs.h
+++ b/components/sync/service/sync_prefs.h
@@ -199,6 +199,14 @@
   void SetCachedPassphraseType(PassphraseType passphrase_type);
   void ClearCachedPassphraseType();
 
+  // Cached notion of whether or not a persistent auth error exists, useful
+  // during profile startup before IdentityManager can determine the
+  // authoritative value.
+  bool HasCachedPersistentAuthErrorForMetrics() const;
+  void SetHasCachedPersistentAuthErrorForMetrics(
+      bool has_persistent_auth_error);
+  void ClearCachedPersistentAuthErrorForMetrics();
+
   // The user's TrustedVaultAutoUpgradeExperimentGroup, determined the first
   // time the engine is successfully initialized.
   std::optional<sync_pb::TrustedVaultAutoUpgradeExperimentGroup>
diff --git a/components/sync/service/sync_service.h b/components/sync/service/sync_service.h
index a0ec02a..01507e29 100644
--- a/components/sync/service/sync_service.h
+++ b/components/sync/service/sync_service.h
@@ -328,10 +328,16 @@
   bool HasCompletedSyncCycle() const;
 
   // The last persistent authentication error that was encountered by the
-  // SyncService. It gets cleared when the error is resolved.
+  // SyncService. It gets cleared when the error is resolved. Note that auth
+  // errors are not persisted to disk, so during browser or profile startup the
+  // function returns no error.
   virtual GoogleServiceAuthError GetAuthError() const = 0;
   virtual base::Time GetAuthErrorTime() const = 0;
 
+  // Similar to GetAuthError().IsPersistentError(), but more reliable shortly
+  // after startup / profile load, as it caches the last known value.
+  virtual bool HasCachedPersistentAuthErrorForMetrics() const = 0;
+
   // Returns true if the Chrome client is too old and needs to be updated for
   // Sync to work.
   // TODO(crbug.com/40890809): Remove this API and use GetUserActionableError()
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc
index 38a579d..c21930a 100644
--- a/components/sync/service/sync_service_impl.cc
+++ b/components/sync/service/sync_service_impl.cc
@@ -1283,6 +1283,15 @@
 void SyncServiceImpl::SyncAuthCredentialsChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  // Cache in prefs whether a persistent auth error exists.
+  if (auth_manager_->IsSyncPaused()) {
+    sync_prefs_.SetHasCachedPersistentAuthErrorForMetrics(true);
+  } else if (!auth_manager_->GetCredentials().access_token.empty()) {
+    // In order to conclude with certainty that there is no persistent auth
+    // error, it is necessary to get an access token successfully.
+    sync_prefs_.SetHasCachedPersistentAuthErrorForMetrics(false);
+  }
+
   // If the engine isn't allowed to start anymore due to the credentials change,
   // then shut down. This happens when there is a persistent auth error (e.g.
   // the user signs out on the web), which implies the "Sync paused" state.
@@ -1457,6 +1466,11 @@
   return auth_manager_->GetLastAuthErrorTime();
 }
 
+bool SyncServiceImpl::HasCachedPersistentAuthErrorForMetrics() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return sync_prefs_.HasCachedPersistentAuthErrorForMetrics();
+}
+
 bool SyncServiceImpl::RequiresClientUpgrade() const {
   return last_actionable_error_.action == UPGRADE_CLIENT;
 }
@@ -2117,6 +2131,10 @@
   // done so it doesn't trigger again if the user signs in later.
   sync_prefs_.MarkPartialSyncToSigninMigrationFullyDone();
 
+  if (reset_engine_reason == ResetEngineReason::kNotSignedIn) {
+    sync_prefs_.ClearCachedPersistentAuthErrorForMetrics();
+  }
+
   // Also let observers know that Sync-the-feature is now fully disabled
   // (before it possibly starts up again in transport-only mode).
   DVLOG(2) << "Notify observers on StopAndClear";
diff --git a/components/sync/service/sync_service_impl.h b/components/sync/service/sync_service_impl.h
index bd0e5d6b..fe95c08a 100644
--- a/components/sync/service/sync_service_impl.h
+++ b/components/sync/service/sync_service_impl.h
@@ -122,6 +122,7 @@
   bool HasSyncConsent() const override;
   GoogleServiceAuthError GetAuthError() const override;
   base::Time GetAuthErrorTime() const override;
+  bool HasCachedPersistentAuthErrorForMetrics() const override;
   bool RequiresClientUpgrade() const override;
   std::unique_ptr<SyncSetupInProgressHandle> GetSetupInProgressHandle()
       override;
diff --git a/components/sync/service/sync_service_impl_unittest.cc b/components/sync/service/sync_service_impl_unittest.cc
index 8b4b1a0..7855b646 100644
--- a/components/sync/service/sync_service_impl_unittest.cc
+++ b/components/sync/service/sync_service_impl_unittest.cc
@@ -618,6 +618,69 @@
       engine_factory()->HasTransportDataIncludingFirstSync(gaia_id_hash()));
 }
 
+TEST_F(SyncServiceImplTest, SignInWhilePausedClearsCachedPersistentAuthError) {
+  // Sign-in and enable sync.
+  PopulatePrefsForInitialSyncFeatureSetupComplete();
+  SignInWithSyncConsent();
+  InitializeService();
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_FALSE(service()->HasCachedPersistentAuthErrorForMetrics());
+
+  // Emulate Chrome receiving a new, invalid LST. This happens when the user
+  // signs out of the content area.
+  identity_test_env()->SetAutomaticIssueOfAccessTokens(false);
+  identity_test_env()->SetRefreshTokenForPrimaryAccount();
+  identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
+      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
+  ASSERT_EQ(SyncService::TransportState::PAUSED,
+            service()->GetTransportState());
+  EXPECT_TRUE(service()->HasCachedPersistentAuthErrorForMetrics());
+
+  // Resolve the auth error (emulate receiving a valid LST).
+  identity_test_env()->SetAutomaticIssueOfAccessTokens(true);
+  identity_test_env()->SetRefreshTokenForPrimaryAccount();
+
+  ASSERT_EQ(SyncService::TransportState::INITIALIZING,
+            service()->GetTransportState());
+  ASSERT_TRUE(service()->HasCachedPersistentAuthErrorForMetrics());
+
+  // Loop until sync becomes active.
+  base::RunLoop().RunUntilIdle();
+  ASSERT_EQ(SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
+  EXPECT_FALSE(service()->HasCachedPersistentAuthErrorForMetrics());
+}
+
+TEST_F(SyncServiceImplTest, SignOutWhilePausedClearsCachedPersistentAuthError) {
+  // Sign-in and enable sync.
+  PopulatePrefsForInitialSyncFeatureSetupComplete();
+  SignInWithSyncConsent();
+  InitializeService();
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_FALSE(service()->HasCachedPersistentAuthErrorForMetrics());
+
+  // Emulate Chrome receiving a new, invalid LST. This happens when the user
+  // signs out of the content area.
+  identity_test_env()->SetAutomaticIssueOfAccessTokens(false);
+  identity_test_env()->SetRefreshTokenForPrimaryAccount();
+  identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
+      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
+  ASSERT_EQ(SyncService::TransportState::PAUSED,
+            service()->GetTransportState());
+  EXPECT_TRUE(service()->HasCachedPersistentAuthErrorForMetrics());
+
+  // Sign-out.
+  signin::PrimaryAccountMutator* account_mutator =
+      identity_manager()->GetPrimaryAccountMutator();
+  DCHECK(account_mutator) << "Account mutator should only be null on ChromeOS.";
+  account_mutator->ClearPrimaryAccount(signin_metrics::ProfileSignout::kTest);
+  ASSERT_EQ(SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
+  EXPECT_FALSE(service()->HasCachedPersistentAuthErrorForMetrics());
+}
+
 TEST_F(SyncServiceImplTest,
        SignOutDuringTransportModeClearsTransportDataAndAccountStorageOptIn) {
   // Sign-in.
@@ -1092,8 +1155,6 @@
   // Emulate Chrome receiving a new, invalid LST. This happens when the user
   // signs out of the content area.
   identity_test_env()->SetRefreshTokenForPrimaryAccount();
-  // Again, wait for SyncServiceImpl to be notified.
-  base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
 
@@ -1179,7 +1240,6 @@
   identity_test_env()->SetRefreshTokenForPrimaryAccount();
   // Wait for SyncServiceImpl to be notified of the changed credentials and
   // send a new access token request.
-  base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
 
@@ -1193,7 +1253,6 @@
   // Now emulate Chrome receiving a new, valid LST.
   identity_test_env()->SetRefreshTokenForPrimaryAccount();
   // Again, wait for SyncServiceImpl to be notified.
-  base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
       "this one works", base::Time::Now() + base::Days(10));
 
diff --git a/components/sync/test/mock_sync_service.h b/components/sync/test/mock_sync_service.h
index 4c2897b0..4ea1513 100644
--- a/components/sync/test/mock_sync_service.h
+++ b/components/sync/test/mock_sync_service.h
@@ -59,6 +59,10 @@
   MOCK_METHOD(bool, HasSyncConsent, (), (const override));
   MOCK_METHOD(GoogleServiceAuthError, GetAuthError, (), (const override));
   MOCK_METHOD(base::Time, GetAuthErrorTime, (), (const override));
+  MOCK_METHOD(bool,
+              HasCachedPersistentAuthErrorForMetrics,
+              (),
+              (const override));
   MOCK_METHOD(bool, RequiresClientUpgrade, (), (const override));
   MOCK_METHOD(std::unique_ptr<SyncSetupInProgressHandle>,
               GetSetupInProgressHandle,
diff --git a/components/sync/test/test_sync_service.cc b/components/sync/test/test_sync_service.cc
index d32b754..d39ad6f 100644
--- a/components/sync/test/test_sync_service.cc
+++ b/components/sync/test/test_sync_service.cc
@@ -255,6 +255,10 @@
   return GoogleServiceAuthError();
 }
 
+bool TestSyncService::HasCachedPersistentAuthErrorForMetrics() const {
+  return GetTransportState() == TransportState::PAUSED;
+}
+
 base::Time TestSyncService::GetAuthErrorTime() const {
   return base::Time();
 }
diff --git a/components/sync/test/test_sync_service.h b/components/sync/test/test_sync_service.h
index cedec6f..e0a81bca 100644
--- a/components/sync/test/test_sync_service.h
+++ b/components/sync/test/test_sync_service.h
@@ -131,6 +131,7 @@
   bool HasSyncConsent() const override;
   GoogleServiceAuthError GetAuthError() const override;
   base::Time GetAuthErrorTime() const override;
+  bool HasCachedPersistentAuthErrorForMetrics() const override;
   bool RequiresClientUpgrade() const override;
 
   std::unique_ptr<SyncSetupInProgressHandle> GetSetupInProgressHandle()
diff --git a/components/visited_url_ranking/internal/history_url_visit_data_fetcher_unittest.cc b/components/visited_url_ranking/internal/history_url_visit_data_fetcher_unittest.cc
index 0557e5f..9a81995 100644
--- a/components/visited_url_ranking/internal/history_url_visit_data_fetcher_unittest.cc
+++ b/components/visited_url_ranking/internal/history_url_visit_data_fetcher_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/task/cancelable_task_tracker.h"
 #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"
@@ -26,6 +27,7 @@
 #include "components/sync_device_info/device_info.h"
 #include "components/sync_device_info/device_info_sync_service.h"
 #include "components/sync_device_info/device_info_tracker.h"
+#include "components/visited_url_ranking/public/features.h"
 #include "components/visited_url_ranking/public/fetch_result.h"
 #include "components/visited_url_ranking/public/fetcher_config.h"
 #include "components/visited_url_ranking/public/url_visit.h"
@@ -364,6 +366,12 @@
 
 TEST_F(HistoryURLVisitDataFetcherTest,
        FetchURLVisitData_SomeDefaultVisibilyScores) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeatureWithParameters(
+      features::kVisitedURLRankingService,
+      {{features::kVisitedURLRankingHistoryFetcherDiscardZeroDurationVisits
+            .name,
+        "true"}});
   base::HistogramTester histogram_tester;
 
   const float kSampleVisibilityScore = 0.75f;
@@ -395,6 +403,12 @@
 
 TEST_F(HistoryURLVisitDataFetcherTest,
        FetchURLVisitData_RemoveZeroDurationVisitURLs) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeatureWithParameters(
+      features::kVisitedURLRankingService,
+      {{features::kVisitedURLRankingHistoryFetcherDiscardZeroDurationVisits
+            .name,
+        "true"}});
   base::HistogramTester histogram_tester;
 
   std::vector<history::AnnotatedVisit> annotated_visits;
diff --git a/components/visited_url_ranking/public/features.cc b/components/visited_url_ranking/public/features.cc
index 67bd9c1..d6cb486 100644
--- a/components/visited_url_ranking/public/features.cc
+++ b/components/visited_url_ranking/public/features.cc
@@ -19,7 +19,11 @@
     kVisitedURLRankingHistoryFetcherDiscardZeroDurationVisits{
         &kVisitedURLRankingService,
         /*name=*/"history_fetcher_discard_zero_duration_visits",
+#if BUILDFLAG(IS_ANDROID)
+        /*default_value=*/false};
+#else
         /*default_value=*/true};
+#endif  // BUILDFLAG(IS_ANDROID)
 
 constexpr base::FeatureParam<std::string> kVisitedURLRankingResultTypesParam{
     &kVisitedURLRankingService,
diff --git a/components/viz/service/input/input_manager.cc b/components/viz/service/input/input_manager.cc
index afcf783a..4318e01f 100644
--- a/components/viz/service/input/input_manager.cc
+++ b/components/viz/service/input/input_manager.cc
@@ -435,6 +435,8 @@
         rir_delegate_remote,
     mojo::PendingReceiver<input::mojom::RenderInputRouterDelegate>
         rir_delegate_receiver) {
+  TRACE_EVENT("viz", "InputManager::SetupRenderInputRouterDelegateConnection");
+
   rir_delegate_remote_map_[grouping_id].Bind(std::move(rir_delegate_remote));
   rir_delegate_remote_map_[grouping_id].set_disconnect_handler(
       base::BindOnce(&InputManager::OnRIRDelegateClientDisconnected,
diff --git a/components/webdata_services/web_data_service_wrapper.cc b/components/webdata_services/web_data_service_wrapper.cc
index 0a3172d..5407cf4 100644
--- a/components/webdata_services/web_data_service_wrapper.cc
+++ b/components/webdata_services/web_data_service_wrapper.cc
@@ -18,9 +18,9 @@
 #include "components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autocomplete/autocomplete_table.h"
+#include "components/autofill/core/browser/webdata/autofill_ai/entity_table.h"
 #include "components/autofill/core/browser/webdata/autofill_sync_metadata_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
-#include "components/autofill/core/browser/webdata/entities/entity_table.h"
 #include "components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.h"
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 12535fd..ec64dcec 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -3484,7 +3484,7 @@
     ]
   }
 
-  if (!is_android && !is_ios) {
+  if (!is_android && !is_ios && !is_fuchsia) {
     sources += [
       # Devtools frontend not included in Android and iOS
       "devtools/devtools_frontend_host_impl.cc",
diff --git a/content/browser/DEPS b/content/browser/DEPS
index cb3bddb0..b444e38 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -37,6 +37,7 @@
   "+components/system_media_controls",
   "+components/tracing",
   "+components/ukm",
+  "+components/unexportable_keys/features.h",
   "+components/url_formatter",
   "+components/viz",
   "+components/web_package",
diff --git a/content/browser/ai/echo_ai_language_model.cc b/content/browser/ai/echo_ai_language_model.cc
index 367f315..a4a875c 100644
--- a/content/browser/ai/echo_ai_language_model.cc
+++ b/content/browser/ai/echo_ai_language_model.cc
@@ -59,7 +59,7 @@
 }
 
 void EchoAILanguageModel::Prompt(
-    const std::string& input,
+    on_device_model::mojom::InputPtr input,
     mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
         pending_responder) {
   if (is_destroyed_) {
@@ -70,13 +70,17 @@
     return;
   }
 
+  CHECK_EQ(input->pieces.size(), 1u);
+  CHECK(std::holds_alternative<std::string>(input->pieces[0]));
+  const std::string& response = std::get<std::string>(input->pieces[0]);
+
   mojo::RemoteSetElementId responder_id =
       responder_set_.Add(std::move(pending_responder));
   // Simulate the time taken by model execution.
   content::GetUIThreadTaskRunner()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&EchoAILanguageModel::DoMockExecution,
-                     weak_ptr_factory_.GetWeakPtr(), input, responder_id),
+                     weak_ptr_factory_.GetWeakPtr(), response, responder_id),
       base::Seconds(1));
 }
 
diff --git a/content/browser/ai/echo_ai_language_model.h b/content/browser/ai/echo_ai_language_model.h
index da48b18..5882a2e5 100644
--- a/content/browser/ai/echo_ai_language_model.h
+++ b/content/browser/ai/echo_ai_language_model.h
@@ -8,6 +8,7 @@
 #include "base/memory/weak_ptr.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
+#include "services/on_device_model/public/mojom/on_device_model.mojom.h"
 #include "third_party/blink/public/mojom/ai/ai_language_model.mojom.h"
 
 namespace content {
@@ -23,7 +24,7 @@
   ~EchoAILanguageModel() override;
 
   // `blink::mojom::AILanguageModel` implementation.
-  void Prompt(const std::string& input,
+  void Prompt(on_device_model::mojom::InputPtr input,
               mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
                   pending_responder) override;
   void Fork(
diff --git a/content/browser/android/content_feature_map.cc b/content/browser/android/content_feature_map.cc
index b9e4caa..3331339 100644
--- a/content/browser/android/content_feature_map.cc
+++ b/content/browser/android/content_feature_map.cc
@@ -31,6 +31,7 @@
     &features::kAccessibilityDeprecateTypeAnnounce,
     &features::kAccessibilityIncludeLongClickAction,
     &features::kAccessibilityPageZoomV2,
+    &features::kAccessibilityTextFormatting,
     &features::kAccessibilityUnifiedSnapshots,
     &features::kAccessibilityManageBroadcastReceiverOnBackground,
     &features::kAndroidFallbackToNextSlot,
diff --git a/content/browser/back_forward_cache_no_store_browsertest.cc b/content/browser/back_forward_cache_no_store_browsertest.cc
index ae28be3..0198190 100644
--- a/content/browser/back_forward_cache_no_store_browsertest.cc
+++ b/content/browser/back_forward_cache_no_store_browsertest.cc
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/back_forward_cache_browsertest.h"
-
 #include <memory>
 
+#include "base/test/test_future.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "build/chromecast_buildflags.h"
+#include "components/unexportable_keys/features.h"
+#include "content/browser/back_forward_cache_browsertest.h"
 #include "content/browser/renderer_host/navigation_request.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
@@ -19,9 +20,12 @@
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/shell/browser/shell.h"
+#include "net/device_bound_sessions/test_support.h"
+#include "net/net_buildflags.h"
 #include "net/test/embedded_test_server/controllable_http_response.h"
 #include "net/test/spawned_test_server/spawned_test_server.h"
 #include "net/test/test_data_directory.h"
+#include "services/network/public/mojom/clear_data_filter.mojom.h"
 #include "third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h"
 
 // This file contains back-/forward-cache tests for the
@@ -1930,4 +1934,256 @@
           BlockListedFeatures()));
 }
 
+#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
+
+class DeviceBoundSessionAccessObserver : public content::WebContentsObserver {
+ public:
+  DeviceBoundSessionAccessObserver(
+      content::WebContents* web_contents,
+      base::RepeatingCallback<void(
+          const net::device_bound_sessions::SessionAccess&)> on_access_callback)
+      : WebContentsObserver(web_contents),
+        on_access_callback_(std::move(on_access_callback)) {}
+
+  void OnDeviceBoundSessionAccessed(
+      content::NavigationHandle* navigation,
+      const net::device_bound_sessions::SessionAccess& access) override {
+    on_access_callback_.Run(access);
+  }
+  void OnDeviceBoundSessionAccessed(
+      content::RenderFrameHost* rfh,
+      const net::device_bound_sessions::SessionAccess& access) override {
+    on_access_callback_.Run(access);
+  }
+
+ private:
+  base::RepeatingCallback<void(
+      const net::device_bound_sessions::SessionAccess&)>
+      on_access_callback_;
+};
+
+class BackForwardCacheBrowserTestRestoreUnlessDeviceBoundSessionTerminated
+    : public BackForwardCacheBrowserTest {
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    EnableFeatureAndSetParams(features::kBackForwardCache, "", "");
+    EnableFeatureAndSetParams(
+        features::kDeviceBoundSessionTerminationEvictBackForwardCache, "", "");
+    EnableFeatureAndSetParams(net::features::kDeviceBoundSessions, "", "");
+    EnableFeatureAndSetParams(
+        unexportable_keys::
+            kEnableBoundSessionCredentialsSoftwareKeysForManualTesting,
+        "", "");
+    BackForwardCacheBrowserTest::SetUpCommandLine(command_line);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(
+    BackForwardCacheBrowserTestRestoreUnlessDeviceBoundSessionTerminated,
+    NoCacheControlNoStoreButSessionTerminated) {
+  EXPECT_TRUE(embedded_test_server()->InitializeAndListen());
+  embedded_test_server()->RegisterRequestHandler(
+      net::device_bound_sessions::GetTestRequestHandler(
+          embedded_test_server()->base_url()));
+  embedded_test_server()->StartAcceptingConnections();
+
+  Shell* tab_to_be_bfcached = shell();
+  Shell* tab_to_create_session = CreateBrowser();
+
+  // 1) Load the document without cache-control:no-store
+  EXPECT_TRUE(NavigateToURL(tab_to_be_bfcached,
+                            embedded_test_server()->GetURL("/set-header")));
+  RenderFrameHostImplWrapper cached_rfh(current_frame_host());
+
+  // 2) Navigate away. `cached_rfh` should enter bfcache.
+  EXPECT_TRUE(NavigateToURL(tab_to_be_bfcached, embedded_test_server()->GetURL(
+                                                    "b.com", "/set-header")));
+  EXPECT_TRUE(cached_rfh->IsInBackForwardCache());
+
+  // 3) Create a device bound session in another tab
+  base::test::TestFuture<net::device_bound_sessions::SessionAccess> future;
+  DeviceBoundSessionAccessObserver observer(
+      tab_to_create_session->web_contents(),
+      future.GetRepeatingCallback<
+          const net::device_bound_sessions::SessionAccess&>());
+  EXPECT_TRUE(NavigateToURL(tab_to_create_session,
+                            embedded_test_server()->GetURL("/dbsc_required")));
+  EXPECT_EQ(future.Take().access_type,
+            net::device_bound_sessions::SessionAccess::AccessType::kCreation);
+
+  // 4) Terminate the session. This could happen through natural
+  // navigation, but it's simpler to test it through the
+  // `DeviceBoundSessionManager` interface.
+  network::mojom::DeviceBoundSessionManager* device_bound_session_manager =
+      tab_to_create_session->web_contents()
+          ->GetBrowserContext()
+          ->GetStoragePartitionForUrl(
+              embedded_test_server()->GetURL("/set-header"),
+              /*can_create=*/true)
+          ->GetDeviceBoundSessionManager();
+  ASSERT_TRUE(device_bound_session_manager);
+
+  base::RunLoop run_loop;
+  device_bound_session_manager->DeleteAllSessions(
+      /*created_after_time=*/std::nullopt,
+      /*created_before_time=*/std::nullopt,
+      /*filter=*/nullptr, run_loop.QuitClosure());
+  run_loop.Run();
+
+  // 5) Go back. `cached_rfh` should be restored from bfcache.
+  ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
+  ExpectRestored(FROM_HERE);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    BackForwardCacheBrowserTestRestoreUnlessDeviceBoundSessionTerminated,
+    CacheControlNoStoreSessionTerminated) {
+  EXPECT_TRUE(embedded_test_server()->InitializeAndListen());
+  embedded_test_server()->RegisterRequestHandler(
+      net::device_bound_sessions::GetTestRequestHandler(
+          embedded_test_server()->base_url()));
+  embedded_test_server()->StartAcceptingConnections();
+
+  Shell* tab_to_be_bfcached = shell();
+  Shell* tab_to_create_session = CreateBrowser();
+
+  // 1) Load the document with cache-control:no-store
+  EXPECT_TRUE(NavigateToURL(
+      tab_to_be_bfcached,
+      embedded_test_server()->GetURL("/set-header?Cache-Control: no-store")));
+  RenderFrameHostImplWrapper cached_rfh(current_frame_host());
+  cached_rfh->GetBackForwardCacheMetrics()->SetObserverForTesting(this);
+
+  // 2) Navigate away. `cached_rfh` should enter bfcache.
+  EXPECT_TRUE(NavigateToURL(tab_to_be_bfcached, embedded_test_server()->GetURL(
+                                                    "b.com", "/set-header")));
+  EXPECT_TRUE(cached_rfh->IsInBackForwardCache());
+
+  // 3) Create a device bound session in another tab
+  base::test::TestFuture<net::device_bound_sessions::SessionAccess> future;
+  DeviceBoundSessionAccessObserver observer(
+      tab_to_create_session->web_contents(),
+      future.GetRepeatingCallback<
+          const net::device_bound_sessions::SessionAccess&>());
+  EXPECT_TRUE(NavigateToURL(tab_to_create_session,
+                            embedded_test_server()->GetURL("/dbsc_required")));
+  EXPECT_EQ(future.Take().access_type,
+            net::device_bound_sessions::SessionAccess::AccessType::kCreation);
+
+  // 4) Terminate the session. This could happen through natural
+  // navigation, but it's simpler to test it through the
+  // `DeviceBoundSessionManager` interface.
+  network::mojom::DeviceBoundSessionManager* device_bound_session_manager =
+      tab_to_create_session->web_contents()
+          ->GetBrowserContext()
+          ->GetStoragePartitionForUrl(
+              embedded_test_server()->GetURL("/set-header"),
+              /*can_create=*/true)
+          ->GetDeviceBoundSessionManager();
+  ASSERT_TRUE(device_bound_session_manager);
+
+  base::RunLoop run_loop;
+  device_bound_session_manager->DeleteAllSessions(
+      /*created_after_time=*/std::nullopt,
+      /*created_before_time=*/std::nullopt,
+      /*filter=*/nullptr, run_loop.QuitClosure());
+  run_loop.Run();
+
+  // 5) Go back. `cached_rfh` should not be restored from bfcache.
+  ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreDeviceBoundSessionTerminated}, {},
+      {}, {}, {}, FROM_HERE);
+  EXPECT_THAT(GetTreeResult()->GetDocumentResult(),
+              MatchesDocumentResult(
+                  NotRestoredReasons(
+                      {NotRestoredReason::
+                           kCacheControlNoStoreDeviceBoundSessionTerminated}),
+                  BlockListedFeatures()));
+}
+
+std::unique_ptr<net::test_server::HttpResponse> RedirectToUrl(
+    const GURL& gurl,
+    const net::test_server::HttpRequest& request) {
+  auto http_response = std::make_unique<net::test_server::BasicHttpResponse>();
+  http_response->set_code(net::HTTP_PERMANENT_REDIRECT);
+  http_response->AddCustomHeader("Location", gurl.spec());
+  return http_response;
+}
+
+IN_PROC_BROWSER_TEST_F(
+    BackForwardCacheBrowserTestRestoreUnlessDeviceBoundSessionTerminated,
+    CacheControlNoStoreSessionTerminatedOnRedirectedPage) {
+  EXPECT_TRUE(embedded_test_server()->InitializeAndListen());
+  embedded_test_server()->RegisterRequestHandler(
+      net::device_bound_sessions::GetTestRequestHandler(
+          embedded_test_server()->base_url()));
+  embedded_test_server()->StartAcceptingConnections();
+
+  GURL redirected_url =
+      embedded_test_server()->GetURL("/set-header?Cache-Control: no-store");
+  CreateHttpsServer();
+  https_server()->RegisterRequestHandler(
+      base::BindRepeating(&RedirectToUrl, redirected_url));
+  ASSERT_TRUE(https_server()->Start());
+
+  Shell* tab_to_be_bfcached = shell();
+  Shell* tab_to_create_session = CreateBrowser();
+
+  // 1) Load the document with cache-control:no-store.
+  EXPECT_TRUE(NavigateToURL(tab_to_be_bfcached, https_server()->GetURL("/"),
+                            redirected_url));
+  RenderFrameHostImplWrapper cached_rfh(current_frame_host());
+  cached_rfh->GetBackForwardCacheMetrics()->SetObserverForTesting(this);
+
+  // 2) Navigate away. `cached_rfh` should enter bfcache.
+  EXPECT_TRUE(NavigateToURL(tab_to_be_bfcached, embedded_test_server()->GetURL(
+                                                    "b.com", "/set-header")));
+  EXPECT_TRUE(cached_rfh->IsInBackForwardCache());
+
+  // 3) Create a device bound session in another tab
+  base::test::TestFuture<net::device_bound_sessions::SessionAccess> future;
+  DeviceBoundSessionAccessObserver observer(
+      tab_to_create_session->web_contents(),
+      future.GetRepeatingCallback<
+          const net::device_bound_sessions::SessionAccess&>());
+  EXPECT_TRUE(NavigateToURL(tab_to_create_session,
+                            embedded_test_server()->GetURL("/dbsc_required")));
+  EXPECT_EQ(future.Take().access_type,
+            net::device_bound_sessions::SessionAccess::AccessType::kCreation);
+
+  // 4) Terminate the session. This could happen through natural
+  // navigation, but it's simpler to test it through the
+  // `DeviceBoundSessionManager` interface.
+  network::mojom::DeviceBoundSessionManager* device_bound_session_manager =
+      tab_to_create_session->web_contents()
+          ->GetBrowserContext()
+          ->GetStoragePartitionForUrl(
+              embedded_test_server()->GetURL("/set-header"),
+              /*can_create=*/true)
+          ->GetDeviceBoundSessionManager();
+  ASSERT_TRUE(device_bound_session_manager);
+
+  base::RunLoop run_loop;
+  device_bound_session_manager->DeleteAllSessions(
+      /*created_after_time=*/std::nullopt,
+      /*created_before_time=*/std::nullopt,
+      /*filter=*/nullptr, run_loop.QuitClosure());
+  run_loop.Run();
+
+  // 5) Go back. `cached_rfh` should not be restored from bfcache.
+  ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreDeviceBoundSessionTerminated}, {},
+      {}, {}, {}, FROM_HERE);
+  EXPECT_THAT(GetTreeResult()->GetDocumentResult(),
+              MatchesDocumentResult(
+                  NotRestoredReasons(
+                      {NotRestoredReason::
+                           kCacheControlNoStoreDeviceBoundSessionTerminated}),
+                  BlockListedFeatures()));
+}
+
+#endif  // BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
+
 }  // namespace content
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc
index edb14bd..bf55e29 100644
--- a/content/browser/browser_interface_binders.cc
+++ b/content/browser/browser_interface_binders.cc
@@ -1266,7 +1266,7 @@
                                          ProcessInternalsUI>(map);
   RegisterWebUIControllerInterfaceBinder<storage::mojom::QuotaInternalsHandler,
                                          QuotaInternalsUI>(map);
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
   RegisterWebUIControllerInterfaceBinder<
       trace_report::mojom::TraceReportHandlerFactory, TraceReportInternalsUI>(
       map);
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 595ee57f..d6bc1f1 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -1503,12 +1503,16 @@
 }
 
 void BrowserMainLoop::InitializeMojo() {
+// iOS browser process does sync calls using mojo (mainly for in process
+// unzipper, so do not enable these checks right now).
+#if !BUILDFLAG(IS_IOS)
   if (!parsed_command_line_->HasSwitch(switches::kSingleProcess)) {
     // Disallow mojo sync calls in the browser process. Note that we allow sync
     // calls in single-process mode since renderer IPCs are made from a browser
     // thread.
     mojo::SyncCallRestrictions::DisallowSyncCall();
   }
+#endif
 
   // Start startup tracing through TracingController's interface. TraceLog has
   // been enabled in content_main_runner where threads are not available. Now We
diff --git a/content/browser/devtools/BUILD.gn b/content/browser/devtools/BUILD.gn
index fad8c1c..919acb4 100644
--- a/content/browser/devtools/BUILD.gn
+++ b/content/browser/devtools/BUILD.gn
@@ -11,7 +11,7 @@
 import("//tools/grit/grit_rule.gni")
 
 # Android and iOS don't support DevTools front-end.
-if (!is_android && !is_ios) {
+if (!is_android && !is_ios && !is_fuchsia) {
   source_set("devtools_resources_extern") {
     sources = [ "devtools_resources.cc" ]
 
diff --git a/content/browser/devtools/devtools_http_handler.cc b/content/browser/devtools/devtools_http_handler.cc
index 97c06202..e224ec0 100644
--- a/content/browser/devtools/devtools_http_handler.cc
+++ b/content/browser/devtools/devtools_http_handler.cc
@@ -744,7 +744,7 @@
 
 void DevToolsHttpHandler::OnFrontendResourceRequest(
     int connection_id, const std::string& path) {
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
   Send404(connection_id);
 #else
   Send200(connection_id,
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index 9f04c3b6..50fc4994 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -1813,6 +1813,9 @@
       NOTREACHED();
     case Reason::kUnknown:
       return Page::BackForwardCacheNotRestoredReasonEnum::Unknown;
+    case Reason::kCacheControlNoStoreDeviceBoundSessionTerminated:
+      return Page::BackForwardCacheNotRestoredReasonEnum::
+          CacheControlNoStoreDeviceBoundSessionTerminated;
   }
 }
 
@@ -2109,6 +2112,7 @@
     case Reason::kCacheControlNoStoreHTTPOnlyCookieModified:
     case Reason::kUnloadHandlerExistsInMainFrame:
     case Reason::kUnloadHandlerExistsInSubFrame:
+    case Reason::kCacheControlNoStoreDeviceBoundSessionTerminated:
       return Page::BackForwardCacheNotRestoredReasonTypeEnum::PageSupportNeeded;
     case Reason::kNetworkRequestDatapipeDrainedAsBytesConsumer:
     case Reason::kUnknown:
diff --git a/content/browser/geolocation/geolocation_service_impl.cc b/content/browser/geolocation/geolocation_service_impl.cc
index c3b6c1a..b638975 100644
--- a/content/browser/geolocation/geolocation_service_impl.cc
+++ b/content/browser/geolocation/geolocation_service_impl.cc
@@ -104,8 +104,9 @@
 
   receiver_set_.current_context()->RequestPermission(
       render_frame_host_, user_gesture,
-      // There is an assumption here that the GeolocationServiceImplContext will
-      // outlive the GeolocationServiceImpl.
+      // The owning RenderFrameHost might be destroyed before the permission
+      // request finishes. To avoid calling a callback on a destroyed object,
+      // use a WeakPtr and skip the callback if the object is invalid.
       base::BindOnce(
           &GeolocationServiceImpl::CreateGeolocationWithPermissionStatus,
           weak_factory_.GetWeakPtr(), std::move(receiver),
diff --git a/content/browser/geolocation/geolocation_service_impl_unittest.cc b/content/browser/geolocation/geolocation_service_impl_unittest.cc
index e94ba811..51b68733 100644
--- a/content/browser/geolocation/geolocation_service_impl_unittest.cc
+++ b/content/browser/geolocation/geolocation_service_impl_unittest.cc
@@ -163,20 +163,20 @@
       base::BindOnce([](blink::mojom::PermissionStatus status) {
         EXPECT_EQ(blink::mojom::PermissionStatus::DENIED, status);
       }));
-
-  base::RunLoop loop;
-  geolocation.set_disconnect_handler(loop.QuitClosure());
+  TestFuture<void> disconnect_future;
+  geolocation.set_disconnect_handler(disconnect_future.GetCallback());
 
   geolocation->QueryNextPosition(
       base::BindOnce([](GeopositionResultPtr result) {
         ADD_FAILURE() << "Position updated unexpectedly";
       }));
-  loop.Run();
+  EXPECT_TRUE(disconnect_future.Wait());
 }
 
 TEST_F(GeolocationServiceTest, PermissionGrantedSync) {
   CreateEmbeddedFrameAndGeolocationService(
       /*allow_via_permissions_policy=*/true);
+  TestFuture<PermissionCallback> permission_request_future;
   permission_manager()->SetRequestCallback(
       base::BindRepeating([](PermissionCallback callback) {
         std::move(callback).Run(std::vector{PermissionStatus::GRANTED});
@@ -213,14 +213,14 @@
         EXPECT_EQ(blink::mojom::PermissionStatus::DENIED, status);
       }));
 
-  base::RunLoop loop;
-  geolocation.set_disconnect_handler(loop.QuitClosure());
+  TestFuture<void> disconnect_future;
+  geolocation.set_disconnect_handler(disconnect_future.GetCallback());
 
   geolocation->QueryNextPosition(
       base::BindOnce([](GeopositionResultPtr result) {
         ADD_FAILURE() << "Position updated unexpectedly";
       }));
-  loop.Run();
+  EXPECT_TRUE(disconnect_future.Wait());
 }
 
 TEST_F(GeolocationServiceTest, PermissionGrantedAsync) {
@@ -266,14 +266,14 @@
         EXPECT_EQ(blink::mojom::PermissionStatus::DENIED, status);
       }));
 
-  base::RunLoop loop;
-  geolocation.set_disconnect_handler(loop.QuitClosure());
+  TestFuture<void> disconnect_future;
+  geolocation.set_disconnect_handler(disconnect_future.GetCallback());
 
   geolocation->QueryNextPosition(
       base::BindOnce([](GeopositionResultPtr result) {
         ADD_FAILURE() << "Position updated unexpectedly";
       }));
-  loop.Run();
+  EXPECT_TRUE(disconnect_future.Wait());
 }
 
 TEST_F(GeolocationServiceTest, ServiceClosedBeforePermissionResponse) {
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
index 9af0500..f25e991 100644
--- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc
+++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -91,6 +91,7 @@
 #include "net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "services/network/network_service.h"
+#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
 #include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
@@ -1591,6 +1592,7 @@
 "trustedBiddingSignalsSlotSizeMode": "slot-size",
 "maxTrustedBiddingSignalsURLLength": 8000,
 "trustedBiddingSignalsCoordinator": "https://trusted-bidding-signals.coordinator-b.test",
+"viewAndClickCountsProviders": ["https://view-and-click-counts-provider-b.test"],
 "userBiddingSignals": {"test":10},
 "updateURL": "%s/interest_group/new_daily_update_partial.json",
 "ads": [{"renderURL": "%s/new_ad_render_url",
@@ -1650,6 +1652,8 @@
   interest_group.max_trusted_bidding_signals_url_length = 10000;
   interest_group.trusted_bidding_signals_coordinator = url::Origin::Create(
       GURL("https://trusted-bidding-signals.coordinator-a.test"));
+  interest_group.view_and_click_counts_providers = {{url::Origin::Create(
+      GURL("https://view-and-click-counts-provider-a.test"))}};
   interest_group.ads.emplace();
   std::vector<url::Origin> allowed_reporting_origins = {kOriginF};
   blink::InterestGroup::Ad ad(
@@ -1737,6 +1741,10 @@
   EXPECT_EQ(group.max_trusted_bidding_signals_url_length, 8000);
   EXPECT_EQ(group.trusted_bidding_signals_coordinator->Serialize(),
             "https://trusted-bidding-signals.coordinator-b.test");
+  ASSERT_TRUE(group.view_and_click_counts_providers.has_value());
+  ASSERT_EQ(group.view_and_click_counts_providers->size(), 1u);
+  EXPECT_EQ(group.view_and_click_counts_providers.value()[0].Serialize(),
+            "https://view-and-click-counts-provider-b.test");
   ASSERT_TRUE(group.user_bidding_signals.has_value());
   EXPECT_EQ(group.user_bidding_signals.value(), "{\"test\":10}");
 
@@ -8972,7 +8980,7 @@
  public:
   AdAuctionServiceImplRestrictedPermissionsPolicyTest() {
     feature_list_.InitAndEnableFeature(
-        blink::features::kAdInterestGroupAPIRestrictedPolicyByDefault);
+        network::features::kAdInterestGroupAPIRestrictedPolicyByDefault);
     blink::UpdatePermissionsPolicyFeatureListForTesting();
     old_content_browser_client_ =
         SetBrowserClientForTesting(&content_browser_client_);
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index 181da70..5c32900 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -2304,7 +2304,7 @@
  public:
   InterestGroupRestrictedPermissionsPolicyBrowserTest() {
     feature_list_.InitAndEnableFeature(
-        blink::features::kAdInterestGroupAPIRestrictedPolicyByDefault);
+        network::features::kAdInterestGroupAPIRestrictedPolicyByDefault);
   }
 
  protected:
@@ -5337,6 +5337,46 @@
       EvalJs(shell(), JsReplace(kScriptTemplate, origin_string.c_str())));
 }
 
+class InterestGroupClickinessBrowserTest : public InterestGroupBrowserTest {
+ public:
+  InterestGroupClickinessBrowserTest() {
+    feature_list_.InitWithFeatures({blink::features::kFledgeClickiness},
+                                   /*disabled_features=*/{});
+  }
+
+ protected:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(InterestGroupClickinessBrowserTest,
+                       JoinInterestGroupNonOriginViewAndClickCountsProviders) {
+  const char kScriptTemplate[] = R"(
+(async function() {
+  try {
+    await navigator.joinAdInterestGroup(
+        {
+          name: 'cars',
+          owner: $1,
+          viewAndClickCountsProviders: ['hi'],
+        },
+        /*joinDurationSec=*/10000);
+  } catch (e) {
+    return e.toString();
+  }
+  return 'done';
+})())";
+
+  GURL url = embedded_https_test_server().GetURL("a.test", "/echo");
+  std::string origin_string = url::Origin::Create(url).Serialize();
+  ASSERT_TRUE(NavigateToURL(shell(), url));
+
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': "
+      "viewAndClickCountsProviders 'hi' for AuctionAdInterestGroup with name "
+      "'cars' must be a valid https origin.",
+      EvalJs(shell(), JsReplace(kScriptTemplate, origin_string.c_str())));
+}
+
 IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, RunAdAuctionInvalidSeller) {
   ASSERT_TRUE(NavigateToURL(
       shell(), embedded_https_test_server().GetURL("a.test", "/echo")));
@@ -19840,7 +19880,7 @@
     feature_list_.InitWithFeaturesAndParameters(
         /*enabled_features=*/
         {{features::kFledgeLimitNumAuctions, {{"max_auctions_per_page", "2"}}},
-         {blink::features::kAdInterestGroupAPIRestrictedPolicyByDefault, {}}},
+         {network::features::kAdInterestGroupAPIRestrictedPolicyByDefault, {}}},
         /*disabled_features=*/{});
     // TODO(crbug.com/40172488): When
     // kAdInterestGroupAPIRestrictedPolicyByDefault is the default, we won't
@@ -21920,7 +21960,7 @@
  public:
   InterestGroupBiddingAndAuctionServerRestrictedPermissionsPolicyBrowserTest() {
     feature_list_.InitAndEnableFeature(
-        blink::features::kAdInterestGroupAPIRestrictedPolicyByDefault);
+        network::features::kAdInterestGroupAPIRestrictedPolicyByDefault);
   }
 
  protected:
diff --git a/content/browser/interest_group/interest_group_features.cc b/content/browser/interest_group/interest_group_features.cc
index f23b389e..23dd09e 100644
--- a/content/browser/interest_group/interest_group_features.cc
+++ b/content/browser/interest_group/interest_group_features.cc
@@ -94,7 +94,7 @@
 // feature also requires blink::features::kFledgeTrustedSignalsKVv2Support to
 // also be enabled for KVv2 to be enabled.
 BASE_FEATURE(kFledgeUseKVv2SignalsCache,
-             "kFledgeUseKVv2SignalsCache",
+             "FledgeUseKVv2SignalsCache",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables preconnecting to interest group owner origins and a bidding signals
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc
index 8ffe908..2e133f4 100644
--- a/content/browser/interest_group/interest_group_storage.cc
+++ b/content/browser/interest_group/interest_group_storage.cc
@@ -202,6 +202,7 @@
 // Version 30 - 2024/08 - crrev.com/c/5707491
 // Version 31 - 2025/01 - crrev.com/c/6084483
 // Version 32 - 2025/02 - crrev.com/c/6239846
+// Version 33 - 2025/02 - crrev.com/c/6248184
 //
 // Version 1 adds a table for interest groups.
 // Version 2 adds a column for rate limiting interest group updates.
@@ -243,14 +244,15 @@
 // Version 30 compresses the AdsProto field using Snappy compression and runs a
 // VACUUM command.
 // Version 31 adds creative_scanning_metadata field to ad object.
-// Version 32 adds duration column to the debug report lockout table, and rename
-//  its last_report_sent_time column to starting_time.
+// Version 32 adds duration column to the debug report lockout table, and
+//  renames its last_report_sent_time column to starting_time.
+// Version 33 adds view_and_click_counts_providers interest_groups field.
 
-const int kCurrentVersionNumber = 32;
+const int kCurrentVersionNumber = 33;
 
 // Earliest version of the code which can use a |kCurrentVersionNumber| database
 // without failing.
-const int kCompatibleVersionNumber = 32;
+const int kCompatibleVersionNumber = 33;
 
 // Latest version of the database that cannot be upgraded to
 // |kCurrentVersionNumber| without razing the database.
@@ -718,6 +720,56 @@
   return result;
 }
 
+std::string Serialize(const std::optional<std::vector<url::Origin>>& origins) {
+  std::string serialized;
+  ListOfOrigins list_of_origins;
+
+  if (origins) {
+    for (const url::Origin& o : origins.value()) {
+      list_of_origins.add_origins(o.Serialize());
+    }
+  }
+  if (list_of_origins.SerializeToString(&serialized)) {
+    base::UmaHistogramEnumeration(
+        "Storage.InterestGroup.ProtoSerializationResult.ListOfOrigins",
+        InterestGroupStorageProtoSerializationResult::kSucceeded);
+  } else {
+    base::UmaHistogramEnumeration(
+        "Storage.InterestGroup.ProtoSerializationResult.ListOfOrigins",
+        InterestGroupStorageProtoSerializationResult::kFailed);
+    // TODO(crbug.com/355010821): Consider bubbling out the failure.
+  }
+  return serialized;
+}
+
+std::optional<std::vector<url::Origin>> DeserializeOriginVector(
+    const std::string& serialized_vector) {
+  ListOfOrigins list_of_origins;
+
+  bool success = list_of_origins.ParseFromString(serialized_vector);
+
+  if (success) {
+    UMA_HISTOGRAM_ENUMERATION(
+        "Storage.InterestGroup.ProtoDeserializationResult.ListOfOrigins",
+        InterestGroupStorageProtoDeserializationResult::kSucceeded);
+  } else {
+    UMA_HISTOGRAM_ENUMERATION(
+        "Storage.InterestGroup.ProtoDeserializationResult.ListOfOrigins",
+        InterestGroupStorageProtoDeserializationResult::kFailed);
+    // TODO(crbug.com/355010821): Consider bubbling out the failure.
+  }
+
+  if (!success || list_of_origins.origins().empty()) {
+    return std::nullopt;
+  }
+  std::vector<url::Origin> result;
+  result.reserve(list_of_origins.origins_size());
+  for (const std::string& origin_string : list_of_origins.origins()) {
+    result.emplace_back(DeserializeOrigin(origin_string));
+  }
+  return result;
+}
+
 int64_t Serialize(SellerCapabilitiesType capabilities) {
   uint64_t result = capabilities.ToEnumBitmask();
   // Supporting 64 or more seller capabilities will require a different
@@ -886,7 +938,7 @@
 
 // Adds indices to the `interest_group` table.
 // Call this function after the table has been created,
-// both when creating a new database in CreateVxxSchema
+// both when creating a new database in CreateCurrentSchema
 // and after dropping/recreating the `interest_groups` table
 // in the *latest* UpgradeVxxSchemaToVxx function to do so.
 bool CreateInterestGroupIndices(sql::Database& db) {
@@ -953,7 +1005,7 @@
 
 // Adds indices to the `kanon` table.
 // Call this function after the table has been created,
-// both when creating a new database in CreateVxxSchema
+// both when creating a new database in CreateCurrentSchema
 // and after dropping/recreating the `kanon` table
 // in the *latest* UpgradeVxxSchemaToVxx function to do so.
 bool CreateKAnonIndices(sql::Database& db) {
@@ -1063,6 +1115,7 @@
         "trusted_bidding_signals_slot_size_mode INTEGER NOT NULL,"
         "max_trusted_bidding_signals_url_length INTEGER NOT NULL,"
         "trusted_bidding_signals_coordinator TEXT,"
+        "view_and_click_counts_providers TEXT,"
         "user_bidding_signals TEXT,"
         "ads_pb BLOB NOT NULL,"
         "ad_components_pb BLOB NOT NULL,"
@@ -1204,6 +1257,115 @@
   return db.Execute(kVacuum);
 }
 
+bool UpgradeV32SchemaToV33(sql::Database& db, sql::MetaTable& meta_table) {
+  // Make a table with new column `view_and_click_counts_providers`.
+  static const char kInterestGroupTableSql[] =
+      // clang-format off
+    "CREATE TABLE new_interest_groups("
+    "expiration INTEGER NOT NULL,"
+    "last_updated INTEGER NOT NULL,"
+    "next_update_after INTEGER NOT NULL,"
+    "owner TEXT NOT NULL,"
+    "joining_origin TEXT NOT NULL,"
+    "exact_join_time INTEGER NOT NULL,"
+    "name TEXT NOT NULL,"
+    "priority DOUBLE NOT NULL,"
+    "enable_bidding_signals_prioritization INTEGER NOT NULL,"
+    "priority_vector TEXT NOT NULL,"
+    "priority_signals_overrides TEXT NOT NULL,"
+    "seller_capabilities TEXT NOT NULL,"
+    "all_sellers_capabilities INTEGER NOT NULL,"
+    "execution_mode INTEGER NOT NULL,"
+    "joining_url TEXT NOT NULL,"
+    "bidding_url TEXT NOT NULL,"
+    "bidding_wasm_helper_url TEXT NOT NULL,"
+    "update_url TEXT NOT NULL,"
+    "trusted_bidding_signals_url TEXT NOT NULL,"
+    "trusted_bidding_signals_keys TEXT NOT NULL,"
+    "trusted_bidding_signals_slot_size_mode INTEGER NOT NULL,"
+    "max_trusted_bidding_signals_url_length INTEGER NOT NULL,"
+    "trusted_bidding_signals_coordinator TEXT,"
+    "view_and_click_counts_providers TEXT,"
+    "user_bidding_signals TEXT,"
+    "ads_pb BLOB NOT NULL,"
+    "ad_components_pb BLOB NOT NULL,"
+    "ad_sizes TEXT NOT NULL,"
+    "size_groups TEXT NOT NULL,"
+    "auction_server_request_flags INTEGER NOT NULL,"
+    "additional_bid_key BLOB NOT NULL,"
+    "aggregation_coordinator_origin TEXT,"
+    "storage_size INTEGER NOT NULL,"
+    "last_k_anon_updated_time INTEGER NOT NULL, "
+    "kanon_keys BLOB NOT NULL,"
+    "PRIMARY KEY(owner,name))";
+
+  // clang-format on
+  if (!db.Execute(kInterestGroupTableSql)) {
+    return false;
+  }
+
+  static const char kCopyInterestGroupTableSql[] =
+      // clang-format off
+      "INSERT INTO new_interest_groups "
+      "SELECT expiration,"
+      "last_updated,"
+      "next_update_after,"
+      "owner,"
+      "joining_origin,"
+      "exact_join_time,"
+      "name,"
+      "priority,"
+      "enable_bidding_signals_prioritization,"
+      "priority_vector,"
+      "priority_signals_overrides,"
+      "seller_capabilities,"
+      "all_sellers_capabilities,"
+      "execution_mode,"
+      "joining_url,"
+      "bidding_url,"
+      "bidding_wasm_helper_url,"
+      "update_url,"
+      "trusted_bidding_signals_url,"
+      "trusted_bidding_signals_keys,"
+      "trusted_bidding_signals_slot_size_mode,"
+      "max_trusted_bidding_signals_url_length,"
+      "trusted_bidding_signals_coordinator,"
+      "NULL,"  // view_and_click_counts_providers
+      "user_bidding_signals,"
+      "ads_pb,"
+      "ad_components_pb,"
+      "ad_sizes,"
+      "size_groups,"
+      "auction_server_request_flags,"
+      "additional_bid_key,"
+      "aggregation_coordinator_origin,"
+      "storage_size,"
+      "last_k_anon_updated_time,"
+      "kanon_keys "
+      "FROM interest_groups";
+  // clang-format on
+
+  if (!db.Execute(kCopyInterestGroupTableSql)) {
+    return false;
+  }
+
+  static const char kDropInterestGroupTableSql[] = "DROP TABLE interest_groups";
+  if (!db.Execute(kDropInterestGroupTableSql)) {
+    return false;
+  }
+
+  static const char kRenameInterestGroupTableSql[] =
+      // clang-format off
+    "ALTER TABLE new_interest_groups "
+    "RENAME TO interest_groups";
+  // clang-format on
+  if (!db.Execute(kRenameInterestGroupTableSql)) {
+    return false;
+  }
+
+  return CreateInterestGroupIndices(db);
+}
+
 bool UpgradeV31SchemaToV32(sql::Database& db, sql::MetaTable& meta_table) {
   // Adds duration column to the debug report lockout table, and rename its
   // last_report_sent_time column to starting_time.
@@ -3114,6 +3276,11 @@
         if (!UpgradeV31SchemaToV32(db, meta_table)) {
           return false;
         }
+        [[fallthrough]];
+      case 32:
+        if (!UpgradeV32SchemaToV33(db, meta_table)) {
+          return false;
+        }
         if (!meta_table.SetVersionNumber(kCurrentVersionNumber)) {
           return false;
         }
@@ -3333,6 +3500,7 @@
   "trusted_bidding_signals_slot_size_mode," \
   "max_trusted_bidding_signals_url_length," \
   "trusted_bidding_signals_coordinator,"    \
+  "view_and_click_counts_providers,"        \
   "user_bidding_signals," /* opaque data */ \
   "ads_pb,"                                 \
   "ad_components_pb,"                       \
@@ -3387,28 +3555,32 @@
         DeserializeOrigin(load.ColumnString(19));
   }
   if (load.GetColumnType(20) != sql::ColumnType::kNull) {
-    group.interest_group.user_bidding_signals = load.ColumnString(20);
+    group.interest_group.view_and_click_counts_providers =
+        DeserializeOriginVector(load.ColumnString(20));
+  }
+  if (load.GetColumnType(21) != sql::ColumnType::kNull) {
+    group.interest_group.user_bidding_signals = load.ColumnString(21);
   }
   group.interest_group.ads = DecompressAndDeserializeInterestGroupAdVectorProto(
-      passkey, load.ColumnString(21));
+      passkey, load.ColumnString(22));
   group.interest_group.ad_components =
       DecompressAndDeserializeInterestGroupAdVectorProto(passkey,
-                                                         load.ColumnString(22));
+                                                         load.ColumnString(23));
   group.interest_group.ad_sizes =
-      DeserializeStringSizeMap(load.ColumnString(23));
+      DeserializeStringSizeMap(load.ColumnString(24));
   group.interest_group.size_groups =
-      DeserializeStringStringVectorMap(load.ColumnString(24));
+      DeserializeStringStringVectorMap(load.ColumnString(25));
   group.interest_group.auction_server_request_flags =
-      DeserializeAuctionServerRequestFlags(load.ColumnInt64(25));
+      DeserializeAuctionServerRequestFlags(load.ColumnInt64(26));
   group.interest_group.additional_bid_key =
-      DeserializeAdditionalBidKey(load.ColumnBlob(26));
-  if (load.GetColumnType(27) != sql::ColumnType::kNull) {
+      DeserializeAdditionalBidKey(load.ColumnBlob(27));
+  if (load.GetColumnType(28) != sql::ColumnType::kNull) {
     group.interest_group.aggregation_coordinator_origin =
-        DeserializeOrigin(load.ColumnString(27));
+        DeserializeOrigin(load.ColumnString(28));
   }
-  group.last_k_anon_updated = load.ColumnTime(28);
+  group.last_k_anon_updated = load.ColumnTime(29);
   KAnonKeyProtos keys_proto;
-  if (keys_proto.ParseFromString(load.ColumnString(29))) {
+  if (keys_proto.ParseFromString(load.ColumnString(30))) {
     base::UmaHistogramEnumeration(
         "Storage.InterestGroup.ProtoDeserializationResult.KAnonKeyProtos",
         InterestGroupStorageProtoDeserializationResult::kSucceeded);
@@ -3602,6 +3774,7 @@
           "trusted_bidding_signals_slot_size_mode,"
           "max_trusted_bidding_signals_url_length,"
           "trusted_bidding_signals_coordinator,"
+          "view_and_click_counts_providers,"
           "user_bidding_signals,"  // opaque data
           "ads_pb,"
           "ad_components_pb,"
@@ -3614,7 +3787,7 @@
           "last_k_anon_updated_time,"
           "kanon_keys) "
         "VALUES("
-          "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
+          "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
         ));
 
   // clang-format on
@@ -3651,24 +3824,29 @@
   } else {
     join_group.BindNull(22);
   }
-  if (data.user_bidding_signals) {
-    join_group.BindString(23, data.user_bidding_signals.value());
+  if (data.view_and_click_counts_providers) {
+    join_group.BindString(23, Serialize(*data.view_and_click_counts_providers));
   } else {
     join_group.BindNull(23);
   }
-  join_group.BindBlob(24, Serialize(data.ads));
-  join_group.BindBlob(25, Serialize(data.ad_components));
-  join_group.BindString(26, Serialize(data.ad_sizes));
-  join_group.BindString(27, Serialize(data.size_groups));
-  join_group.BindInt64(28, Serialize(data.auction_server_request_flags));
-  join_group.BindBlob(29, Serialize(data.additional_bid_key));
-  if (data.aggregation_coordinator_origin) {
-    join_group.BindString(30, Serialize(*data.aggregation_coordinator_origin));
+  if (data.user_bidding_signals) {
+    join_group.BindString(24, data.user_bidding_signals.value());
   } else {
-    join_group.BindNull(30);
+    join_group.BindNull(24);
   }
-  join_group.BindInt64(31, data.EstimateSize());
-  join_group.BindTime(32, last_k_anon_updated);
+  join_group.BindBlob(25, Serialize(data.ads));
+  join_group.BindBlob(26, Serialize(data.ad_components));
+  join_group.BindString(27, Serialize(data.ad_sizes));
+  join_group.BindString(28, Serialize(data.size_groups));
+  join_group.BindInt64(29, Serialize(data.auction_server_request_flags));
+  join_group.BindBlob(30, Serialize(data.additional_bid_key));
+  if (data.aggregation_coordinator_origin) {
+    join_group.BindString(31, Serialize(*data.aggregation_coordinator_origin));
+  } else {
+    join_group.BindNull(31);
+  }
+  join_group.BindInt64(32, data.EstimateSize());
+  join_group.BindTime(33, last_k_anon_updated);
   KAnonKeyProtos key_proto;
   *key_proto.mutable_keys() = {positive_kanon_keys.begin(),
                                positive_kanon_keys.end()};
@@ -3683,7 +3861,7 @@
         InterestGroupStorageProtoSerializationResult::kFailed);
     // TODO(crbug.com/355010821): Consider bubbling out the failure.
   }
-  join_group.BindBlob(33, key_proto_str);
+  join_group.BindBlob(34, key_proto_str);
 
   if (!join_group.Run()) {
     return std::nullopt;
@@ -3745,6 +3923,7 @@
             "trusted_bidding_signals_slot_size_mode=?,"
             "max_trusted_bidding_signals_url_length=?,"
             "trusted_bidding_signals_coordinator=?,"
+            "view_and_click_counts_providers=?,"
             "user_bidding_signals=?,"
             "ads_pb=?,"
             "ad_components_pb=?,"
@@ -3787,24 +3966,30 @@
   } else {
     store_group.BindNull(16);
   }
-  if (group.user_bidding_signals) {
-    store_group.BindString(17, group.user_bidding_signals.value());
+  if (group.view_and_click_counts_providers) {
+    store_group.BindString(17,
+                           Serialize(*group.view_and_click_counts_providers));
   } else {
     store_group.BindNull(17);
   }
-  store_group.BindBlob(18, Serialize(group.ads));
-  store_group.BindBlob(19, Serialize(group.ad_components));
-  store_group.BindString(20, Serialize(group.ad_sizes));
-  store_group.BindString(21, Serialize(group.size_groups));
-  store_group.BindInt64(22, Serialize(group.auction_server_request_flags));
-  store_group.BindBlob(23, Serialize(group.additional_bid_key));
+  if (group.user_bidding_signals) {
+    store_group.BindString(18, group.user_bidding_signals.value());
+  } else {
+    store_group.BindNull(18);
+  }
+  store_group.BindBlob(19, Serialize(group.ads));
+  store_group.BindBlob(20, Serialize(group.ad_components));
+  store_group.BindString(21, Serialize(group.ad_sizes));
+  store_group.BindString(22, Serialize(group.size_groups));
+  store_group.BindInt64(23, Serialize(group.auction_server_request_flags));
+  store_group.BindBlob(24, Serialize(group.additional_bid_key));
   if (group.aggregation_coordinator_origin) {
-    store_group.BindString(24,
+    store_group.BindString(25,
                            Serialize(*group.aggregation_coordinator_origin));
   } else {
-    store_group.BindNull(24);
+    store_group.BindNull(25);
   }
-  store_group.BindInt64(25, group.EstimateSize());
+  store_group.BindInt64(26, group.EstimateSize());
 
   KAnonKeyProtos key_proto;
   *key_proto.mutable_keys() = {positive_kanon_keys.begin(),
@@ -3820,10 +4005,10 @@
         InterestGroupStorageProtoSerializationResult::kFailed);
     // TODO(crbug.com/355010821): Consider bubbling out the failure.
   }
-  store_group.BindBlob(26, key_proto_str);
+  store_group.BindBlob(27, key_proto_str);
 
-  store_group.BindString(27, Serialize(group.owner));
-  store_group.BindString(28, group.name);
+  store_group.BindString(28, Serialize(group.owner));
+  store_group.BindString(29, group.name);
 
   return store_group.Run();
 }
@@ -3919,6 +4104,10 @@
     updated_group.trusted_bidding_signals_coordinator =
         std::move(update.trusted_bidding_signals_coordinator.value());
   }
+  if (update.view_and_click_counts_providers.has_value()) {
+    updated_group.view_and_click_counts_providers =
+        std::move(update.view_and_click_counts_providers.value());
+  }
   if (update.user_bidding_signals) {
     updated_group.user_bidding_signals = std::move(update.user_bidding_signals);
   }
@@ -4864,7 +5053,7 @@
     load.BindTime(1, now);
 
     while (load.Step()) {
-      std::string name = load.ColumnString(30);
+      std::string name = load.ColumnString(31);
       StorageInterestGroup& db_interest_group = interest_group_by_name[name];
       db_interest_group.bidding_browser_signals =
           blink::mojom::BiddingBrowserSignals::New();
diff --git a/content/browser/interest_group/interest_group_storage.proto b/content/browser/interest_group/interest_group_storage.proto
index 1b5f845..f49d728 100644
--- a/content/browser/interest_group/interest_group_storage.proto
+++ b/content/browser/interest_group/interest_group_storage.proto
@@ -34,3 +34,7 @@
 message KAnonKeyProtos {
   repeated bytes keys = 1;
 }
+
+message ListOfOrigins {
+  repeated string origins = 1;
+}
diff --git a/content/browser/interest_group/interest_group_storage_unittest.cc b/content/browser/interest_group/interest_group_storage_unittest.cc
index e860495..4be9a9a 100644
--- a/content/browser/interest_group/interest_group_storage_unittest.cc
+++ b/content/browser/interest_group/interest_group_storage_unittest.cc
@@ -212,12 +212,16 @@
     // instance.
 
     switch (version_number) {
+      case 33:
+        result.view_and_click_counts_providers = {{url::Origin::Create(
+            GURL("https://view-and-click-counts-provider.test"))}};
+        [[fallthrough]];
       case 32:
         [[fallthrough]];
       case 31:
         result.ads.value()[0].creative_scanning_metadata = "scan 1";
         result.ad_components.value()[1].creative_scanning_metadata = "scan 2";
-        ABSL_FALLTHROUGH_INTENDED;
+        [[fallthrough]];
       case 30:
         // Compressed AdsProto, but introduced no new fields.
         [[fallthrough]];
@@ -3583,6 +3587,16 @@
       }
     }
 
+    // Make sure the metadata table got upgraded correctly.
+    {
+      sql::Database raw_db(sql::test::kTestTag);
+      EXPECT_TRUE(raw_db.Open(db_path()));
+      sql::MetaTable meta;
+      ASSERT_TRUE(meta.Init(&raw_db, 1, 1));
+      EXPECT_EQ(InterestGroupStorage::GetCurrentVersionNumberForTesting(),
+                meta.GetVersionNumber());
+    }
+
     // Delete the database in case we loop again, creating the database from
     // another .sql file.
     base::DeleteFile(db_path());
@@ -3597,6 +3611,26 @@
       InterestGroupStorage::GetCurrentVersionNumberForTesting()));
   ASSERT_TRUE(base::PathExists(file_path))
       << "Missing " << file_path << " -- " << kMisssingFileError;
+
+  // Also, make sure that the current version matches ProduceAllFields() -- they
+  // might not match if the storage format changed after the initial DB dump for
+  // the current version (that is, it changed before the CL introducing the new
+  // version landed).
+  {
+    ASSERT_TRUE(sql::test::CreateDatabaseFromSQL(db_path(), file_path));
+    blink::InterestGroup expected = ProduceAllFields();
+    std::unique_ptr<InterestGroupStorage> storage = CreateStorage();
+    std::vector<StorageInterestGroup> interest_groups =
+        storage->GetAllInterestGroupsUnfilteredForTesting();
+
+    ASSERT_EQ(1u, interest_groups.size());
+    const blink::InterestGroup& actual = interest_groups[0].interest_group;
+    // Don't compare `expiry` as it changes every test run.
+    expected.expiry = actual.expiry;
+    IgExpectEqualsForTesting(actual, expected);
+    // Delete the database before the next testcase.
+    base::DeleteFile(db_path());
+  }
 }
 
 TEST_F(InterestGroupStorageTest,
diff --git a/content/browser/interest_group/interest_group_update.h b/content/browser/interest_group/interest_group_update.h
index 4e929cf4..4fe5266 100644
--- a/content/browser/interest_group/interest_group_update.h
+++ b/content/browser/interest_group/interest_group_update.h
@@ -57,6 +57,7 @@
   // when the value is `null` in JSON, allowing for a downgrade from KVv2 to
   // KVv1.
   std::optional<std::optional<url::Origin>> trusted_bidding_signals_coordinator;
+  std::optional<std::vector<url::Origin>> view_and_click_counts_providers;
   std::optional<std::string> user_bidding_signals;
   std::optional<std::vector<blink::InterestGroup::Ad>> ads, ad_components;
   std::optional<base::flat_map<std::string, blink::AdSize>> ad_sizes;
diff --git a/content/browser/interest_group/interest_group_update_manager.cc b/content/browser/interest_group/interest_group_update_manager.cc
index adeca089..1622691 100644
--- a/content/browser/interest_group/interest_group_update_manager.cc
+++ b/content/browser/interest_group/interest_group_update_manager.cc
@@ -424,6 +424,48 @@
   return true;
 }
 
+// Copies the viewAndClickCountsProviders JSON field into
+// `view_and_click_counts_providers`.
+[[nodiscard]] bool TryToCopyViewAndClickCountsProviders(
+    const base::Value::Dict& dict,
+    InterestGroupUpdate& interest_group_update) {
+  const base::Value* maybe_view_and_click_counts_providers =
+      dict.Find("viewAndClickCountsProviders");
+
+  // No `viewAndClickCountsProviders` field in the update JSON.
+  if (!maybe_view_and_click_counts_providers) {
+    return true;
+  }
+
+  // `viewAndClickCountsProviders` field is `null` in the update JSON.
+  if (maybe_view_and_click_counts_providers->is_none()) {
+    interest_group_update.view_and_click_counts_providers = std::nullopt;
+    return true;
+  }
+
+  // If `view_and_click_counts_providers` is present and not null, it must
+  // be a valid list of URL origin strings.
+  if (!maybe_view_and_click_counts_providers->is_list()) {
+    return false;
+  }
+
+  const base::Value::List& view_and_click_counts_providers =
+      maybe_view_and_click_counts_providers->GetList();
+
+  interest_group_update.view_and_click_counts_providers.emplace();
+  interest_group_update.view_and_click_counts_providers->reserve(
+      view_and_click_counts_providers.size());
+  for (const base::Value& provider : view_and_click_counts_providers) {
+    if (!provider.is_string()) {
+      return false;
+    }
+    interest_group_update.view_and_click_counts_providers->emplace_back(
+        url::Origin::Create(GURL(provider.GetString())));
+  }
+
+  return true;
+}
+
 // Helper for TryToCopyAds() and TryToCopyAdComponents().
 [[nodiscard]] std::optional<std::vector<blink::InterestGroup::Ad>> ExtractAds(
     const base::Value::List& ads_list,
@@ -782,6 +824,9 @@
                                                  interest_group_update)) {
     return std::nullopt;
   }
+  if (!TryToCopyViewAndClickCountsProviders(*dict, interest_group_update)) {
+    return std::nullopt;
+  }
   if (!TryToCopyUserBiddingSignals(*dict, interest_group_update)) {
     return std::nullopt;
   }
diff --git a/content/browser/media/cdm_registry_impl.cc b/content/browser/media/cdm_registry_impl.cc
index 54b3229..c1bfc60 100644
--- a/content/browser/media/cdm_registry_impl.cc
+++ b/content/browser/media/cdm_registry_impl.cc
@@ -583,9 +583,9 @@
     auto cdm_info =
         GetCdmInfo(key_system, CdmInfo::Robustness::kHardwareSecure);
     DCHECK(cdm_info && !cdm_info->capability);
-    GetMediaFoundationServiceCdmCapability(key_system, cdm_info->path,
-                                           /*is_hw_secure=*/true,
-                                           std::move(cdm_capability_cb));
+    GetMediaFoundationServiceCdmCapability(
+        key_system, cdm_info->type, cdm_info->path,
+        /*is_hw_secure=*/true, std::move(cdm_capability_cb));
   } else {
     // kSoftwareSecure should have been determined from the manifest.
     std::move(cdm_capability_cb)
diff --git a/content/browser/media/key_system_support_win.cc b/content/browser/media/key_system_support_win.cc
index 40dc1173..a8efd58 100644
--- a/content/browser/media/key_system_support_win.cc
+++ b/content/browser/media/key_system_support_win.cc
@@ -61,6 +61,7 @@
 
 void GetMediaFoundationServiceCdmCapability(
     const std::string& key_system,
+    const media::CdmType& cdm_type,
     const base::FilePath& cdm_path,
     bool is_hw_secure,
     media::CdmCapabilityCB cdm_capability_cb) {
@@ -75,7 +76,8 @@
   }
 
   // CDM capability is global, use a generic BrowserContext and Site to query.
-  auto& mf_service = GetMediaFoundationService(nullptr, GURL(), cdm_path);
+  auto& mf_service =
+      GetMediaFoundationService(cdm_type, nullptr, GURL(), cdm_path);
   mf_service.IsKeySystemSupported(
       key_system,
       mojo::WrapCallbackWithDefaultInvokeIfNotRun(
diff --git a/content/browser/media/key_system_support_win.h b/content/browser/media/key_system_support_win.h
index e859bf0..9d82e31 100644
--- a/content/browser/media/key_system_support_win.h
+++ b/content/browser/media/key_system_support_win.h
@@ -10,6 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/functional/callback.h"
 #include "media/base/cdm_capability.h"
+#include "media/cdm/cdm_type.h"
 
 namespace content {
 
@@ -17,6 +18,7 @@
 // MediaFoundationService for `key_system` by the CDM located in `cdm_path`.
 void GetMediaFoundationServiceCdmCapability(
     const std::string& key_system,
+    const media::CdmType& cdm_type,
     const base::FilePath& cdm_path,
     bool is_hw_secure,
     media::CdmCapabilityCB cdm_capability_cb);
diff --git a/content/browser/media/media_interface_proxy.cc b/content/browser/media/media_interface_proxy.cc
index 63e1337..154b524 100644
--- a/content/browser/media/media_interface_proxy.cc
+++ b/content/browser/media/media_interface_proxy.cc
@@ -539,8 +539,9 @@
   DVLOG(1) << __func__ << ": this=" << this << ", cdm_path=" << cdm_path;
   DCHECK(!mf_interface_factory_remote_);
 
+  // Passing an empty CdmType since it is not needed in this scenario.
   auto& mf_service = GetMediaFoundationService(
-      render_frame_host().GetBrowserContext(),
+      media::CdmType(), render_frame_host().GetBrowserContext(),
       render_frame_host().GetSiteInstance()->GetSiteURL(), cdm_path);
 
   // Passing an empty CdmType as MediaFoundation-based CDMs don't use CdmStorage
diff --git a/content/browser/media/service_factory.cc b/content/browser/media/service_factory.cc
index fa723333..fd6740d 100644
--- a/content/browser/media/service_factory.cc
+++ b/content/browser/media/service_factory.cc
@@ -287,12 +287,12 @@
 
 #if BUILDFLAG(IS_WIN)
 media::mojom::MediaFoundationService& GetMediaFoundationService(
+    const media::CdmType& cdm_type,
     BrowserContext* browser_context,
     const GURL& site,
     const base::FilePath& cdm_path) {
   return GetService<media::mojom::MediaFoundationService>(
-      media::CdmType(), browser_context, site, "Media Foundation Service",
-      cdm_path);
+      cdm_type, browser_context, site, "Media Foundation Service", cdm_path);
 }
 #endif  // BUILDFLAG(IS_WIN)
 
diff --git a/content/browser/media/service_factory.h b/content/browser/media/service_factory.h
index 4b8d26ba..cc000c1 100644
--- a/content/browser/media/service_factory.h
+++ b/content/browser/media/service_factory.h
@@ -31,6 +31,7 @@
 // the `site`. Instances are started lazily as needed. The CDM located at
 // `cdm_path` is loaded in the sandboxed process to be used by the service.
 media::mojom::MediaFoundationService& GetMediaFoundationService(
+    const media::CdmType& cdm_type,
     BrowserContext* browser_context,
     const GURL& site,
     const base::FilePath& cdm_path);
diff --git a/content/browser/media/session/media_session_uma_helper.h b/content/browser/media/session/media_session_uma_helper.h
index 7000026..51dd098 100644
--- a/content/browser/media/session/media_session_uma_helper.h
+++ b/content/browser/media/session/media_session_uma_helper.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_UMA_HELPER_H_
 #define CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_UMA_HELPER_H_
 
+#include <optional>
+
 #include "base/memory/raw_ptr.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
diff --git a/content/browser/preloading/preloading_decider_unittest.cc b/content/browser/preloading/preloading_decider_unittest.cc
index c17444f..047c2c3 100644
--- a/content/browser/preloading/preloading_decider_unittest.cc
+++ b/content/browser/preloading/preloading_decider_unittest.cc
@@ -589,27 +589,17 @@
 
   preloading_decider->UpdateSpeculationCandidates(candidates);
 
-  PreloadingPredictor pointer_down_predictor{
-      preloading_predictor::kUrlPointerDownOnAnchor};
-  // PreloadingPredictor on_hover_predictor{
-  //     preloading_predictor::kUrlPointerHoverOnAnchor};
-  // Check recall UKM records.
-  auto uma_predictor_recall = [](const PreloadingPredictor& predictor) {
-    return base::StrCat({"Preloading.Predictor.", predictor.name(), ".Recall"});
-  };
+  NavigationSimulator::NavigateAndCommitFromDocument(
+      GURL("https://www.google.com"), &GetPrimaryMainFrame());
 
-  WebContents* web_contents =
-      WebContents::FromRenderFrameHost(&GetPrimaryMainFrame());
-  web_contents->GetController().LoadURL(
-      GURL("https://www.google.com"), {},
-      ui::PageTransition::PAGE_TRANSITION_LINK, {});
-
+  // Check recall.
+  const std::string kUmaName = base::StrCat(
+      {"Preloading.Predictor.",
+       preloading_predictor::kUrlPointerDownOnAnchor.name(), ".Recall"});
   histogram_tester.ExpectBucketCount(
-      uma_predictor_recall(pointer_down_predictor),
-      PredictorConfusionMatrix::kTruePositive, 0);
+      kUmaName, PredictorConfusionMatrix::kTruePositive, 0);
   histogram_tester.ExpectBucketCount(
-      uma_predictor_recall(pointer_down_predictor),
-      PredictorConfusionMatrix::kFalseNegative, 0);
+      kUmaName, PredictorConfusionMatrix::kFalseNegative, 1);
 }
 
 class PreloadingDeciderWithParameterizedSpeculationActionTest
diff --git a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
index 588d0db3..95362ef9 100644
--- a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
+++ b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
@@ -204,6 +204,8 @@
       return ProtoEnum::BLOCKLISTED_FEATURES;
     case Reason::kUnknown:
       return ProtoEnum::UNKNOWN;
+    case Reason::kCacheControlNoStoreDeviceBoundSessionTerminated:
+      return ProtoEnum::CACHE_CONTROL_NO_STORE_DEVICE_BOUND_SESSION_TERMINATED;
   }
   NOTREACHED();
 }
@@ -463,6 +465,9 @@
       return "Android WebView safe browsing allowlist changed";
     case Reason::kWebViewDocumentStartJavascriptChanged:
       return "Android WebView document start script changed";
+    case Reason::kCacheControlNoStoreDeviceBoundSessionTerminated:
+      return "A device bound session was terminated on a cached page with "
+             "Cache-Control: no-store";
   }
 }
 
@@ -542,6 +547,7 @@
     case Reason::kCacheControlNoStore:
     case Reason::kCacheControlNoStoreCookieModified:
     case Reason::kCacheControlNoStoreHTTPOnlyCookieModified:
+    case Reason::kCacheControlNoStoreDeviceBoundSessionTerminated:
       return "response-cache-control-no-store";
     case Reason::kCookieDisabled:
       return base::FeatureList::IsEnabled(
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc
index c8d22df..ca3c683 100644
--- a/content/browser/renderer_host/back_forward_cache_impl.cc
+++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -700,8 +700,13 @@
   // Note that kCacheControlNoStoreHTTPOnlyCookieModified,
   // kCacheControlNoStoreCookieModified and kCacheControlNoStore are mutually
   // exclusive.
-  if (render_frame_host->GetCookieChangeInfo()
-          .http_only_cookie_modification_count_ > 0) {
+  if (render_frame_host->IsDeviceBoundSessionTerminated() &&
+      base::FeatureList::IsEnabled(
+          features::kDeviceBoundSessionTerminationEvictBackForwardCache)) {
+    result.No(BackForwardCacheMetrics::NotRestoredReason::
+                  kCacheControlNoStoreDeviceBoundSessionTerminated);
+  } else if (render_frame_host->GetCookieChangeInfo()
+                 .http_only_cookie_modification_count_ > 0) {
     result.No(BackForwardCacheMetrics::NotRestoredReason::
                   kCacheControlNoStoreHTTPOnlyCookieModified);
   } else if (render_frame_host->GetCookieChangeInfo()
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc
index 99ba590..19b2621 100644
--- a/content/browser/renderer_host/delegated_frame_host.cc
+++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -149,7 +149,7 @@
 
   ui::Compositor::ScopedKeepSurfaceAliveCallback keep_surface_alive;
 
-  if (compositor_) {
+  if (compositor_ && CanCopyFromCompositingSurface()) {
     keep_surface_alive =
         compositor_->TakeScopedKeepSurfaceAliveCallback(surface_id);
   }
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc
index 78660fb4..4538f632 100644
--- a/content/browser/renderer_host/input/input_router_impl_unittest.cc
+++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "cc/input/touch_action.h"
@@ -108,14 +109,18 @@
 
  protected:
   using DispatchedMessages = MockWidgetInputHandler::MessageVector;
-  // testing::Test
-  void SetUp() override {
+
+  void SetUpWithInputRouterActiveState(bool active) {
     base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
     command_line->AppendSwitch(input::switches::kValidateInputEventStream);
     client_ = std::make_unique<MockInputRouterClient>();
     disposition_handler_ = std::make_unique<MockInputDispositionHandler>();
+
     input_router_ = std::make_unique<input::InputRouterImpl>(
         client_.get(), disposition_handler_.get(), client_.get(), config_);
+    if (active) {
+      input_router_->MakeActive();
+    }
 
     client_->set_input_router(input_router());
     disposition_handler_->set_input_router(input_router());
@@ -132,6 +137,9 @@
     client_->set_render_widget_host_view(mock_view_.get());
   }
 
+  // testing::Test
+  void SetUp() override { SetUpWithInputRouterActiveState(true); }
+
   std::unique_ptr<RenderWidgetHostImpl> MakeNewWidgetHost() {
     int32_t routing_id = process_host_->GetNextRoutingID();
     return MockRenderWidgetHost::Create(
@@ -2137,6 +2145,50 @@
 
 namespace {
 
+class InputRouterImplPaintHoldingStateTest : public InputRouterImplTestBase {
+ public:
+  InputRouterImplPaintHoldingStateTest() = default;
+
+  // testing::Test
+  void SetUp() override {
+    scoped_feature_list_.InitAndEnableFeature(
+        blink::features::kDropInputEventsWhilePaintHolding);
+    SetUpWithInputRouterActiveState(false);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+}  // namespace
+
+TEST_F(InputRouterImplPaintHoldingStateTest, InactiveThenActive) {
+  // Before getting activated by the paint-holding signal, the input router
+  // should not send an input event to the renderer.
+  SimulateKeyboardEvent(WebInputEvent::Type::kRawKeyDown);
+  DispatchedMessages dispatched_messages = GetAndResetDispatchedMessages();
+  ASSERT_EQ(0u, dispatched_messages.size());
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(WebInputEvent::Type::kRawKeyDown,
+            disposition_handler_->acked_keyboard_event().GetType());
+
+  // The input router gets activated by the paint-holding signal after a while.
+  input_router_->MakeActive();
+
+  // Now the input router should send an input event to the renderer.
+  SimulateKeyboardEvent(WebInputEvent::Type::kRawKeyDown);
+  dispatched_messages = GetAndResetDispatchedMessages();
+  ASSERT_EQ(1u, dispatched_messages.size());
+  ASSERT_TRUE(dispatched_messages[0]->ToEvent());
+  dispatched_messages[0]->ToEvent()->CallCallback(
+      blink::mojom::InputEventResultState::kNotConsumed);
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(WebInputEvent::Type::kRawKeyDown,
+            disposition_handler_->acked_keyboard_event().GetType());
+}
+
+namespace {
+
 class InputRouterImplStylusWritingTest : public InputRouterImplTest {
  public:
   InputRouterImplStylusWritingTest() = default;
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index a5fa514..960f184 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -2959,6 +2959,12 @@
          common_params_->url.SchemeIsHTTPOrHTTPS();
 }
 
+bool NavigationRequest::ShouldAddDeviceBoundSessionObserver() {
+  // Device bound session expiry should evict pages from the BFCache in
+  // the exact same circumstances as cookie expiry.
+  return ShouldAddCookieChangeListener();
+}
+
 void NavigationRequest::StartNavigation() {
   TRACE_EVENT_WITH_FLOW0("navigation", "NavigationRequest::StartNavigation",
                          TRACE_ID_WITH_SCOPE(kNavigationRequestScope,
@@ -2999,6 +3005,12 @@
             GetStoragePartitionWithCurrentSiteInfo(), common_params_->url);
   }
 
+  if (ShouldAddDeviceBoundSessionObserver()) {
+    device_bound_session_observer_ =
+        std::make_unique<RenderFrameHostImpl::DeviceBoundSessionObserver>(
+            GetStoragePartitionWithCurrentSiteInfo(), common_params_->url);
+  }
+
   // Compute the redirect chain.
   // TODO(clamy): Try to simplify this and have the redirects be part of
   // CommonNavigationParams.
@@ -3552,6 +3564,14 @@
     cookie_change_listener_.reset();
   }
 
+  if (ShouldAddDeviceBoundSessionObserver()) {
+    device_bound_session_observer_ =
+        std::make_unique<RenderFrameHostImpl::DeviceBoundSessionObserver>(
+            GetStoragePartitionWithCurrentSiteInfo(), common_params_->url);
+  } else {
+    device_bound_session_observer_.reset();
+  }
+
   // Check Content Security Policy before the NavigationThrottles run. This
   // gives CSP a chance to modify requests that NavigationThrottles would
   // otherwise block.
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 99494c8ff..8f1ed3b 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -1292,6 +1292,11 @@
     return std::move(cookie_change_listener_);
   }
 
+  std::unique_ptr<RenderFrameHostImpl::DeviceBoundSessionObserver>
+  TakeDeviceBoundSessionObserver() {
+    return std::move(device_bound_session_observer_);
+  }
+
   // Returns true if there is a speculative RFH that has a pending commit
   // cross-document navigation, and this NavigationRequest is not a pending
   // commit NavigationRequest itself. This means that this navigation should be
@@ -2259,6 +2264,10 @@
   // navigation.
   bool ShouldAddCookieChangeListener();
 
+  // Returns if we should add/reset the `DeviceBoundSessionObserver` for
+  // the current navigation.
+  bool ShouldAddDeviceBoundSessionObserver();
+
   // Returns the `StoragePartition` based on the config from the `site_info_`.
   StoragePartition* GetStoragePartitionWithCurrentSiteInfo();
 
@@ -3104,6 +3113,17 @@
   std::unique_ptr<RenderFrameHostImpl::CookieChangeListener>
       cookie_change_listener_;
 
+  // The observer that receives device bound session events and
+  // maintains device bound session information for the domain of the
+  // URL that this `NavigationRequest` is navigating to. The observer
+  // will observe all device bound session changes starting from the
+  // navigation/redirection, and it will be moved to the
+  // `RenderFrameHostImpl` when the navigation is committed and
+  // continues observing until the destructoin of the document.
+  // See `RenderFrameHostImpl::DeviceBoundSessionObserver`.
+  std::unique_ptr<RenderFrameHostImpl::DeviceBoundSessionObserver>
+      device_bound_session_observer_;
+
   // LCP Critical Path Predictor managed hint data those were already available
   // at the time of navigation. The hint is passed along to the renderer process
   // on commit along with the other navigation params.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index fda152ab..944eb22 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -15275,10 +15275,13 @@
     RecordDocumentCreatedUkmEvent(params->origin, document_ukm_source_id,
                                   ukm_recorder);
 
-    // We only replace the `CookieChangeListener` with the one initialized by
-    // the navigation request when navigating to a new document. Otherwise, the
-    // existing `CookieChangeListener` will be reused.
+    // We only replace the `CookieChangeListener` and
+    // `DeviceBoundSessionObserver` with the one initialized by the
+    // navigation request when navigating to a new document. Otherwise,
+    // the existing observers will be reused.
     cookie_change_listener_ = navigation_request->TakeCookieChangeListener();
+    device_bound_session_observer_ =
+        navigation_request->TakeDeviceBoundSessionObserver();
   }
 
   // Note: The renderer never sets |params->is_overriding_user_agent| to true
@@ -18223,6 +18226,43 @@
                                  : CookieChangeListener::CookieChangeInfo{};
 }
 
+RenderFrameHostImpl::DeviceBoundSessionObserver::DeviceBoundSessionObserver(
+    StoragePartition* storage_partition,
+    GURL& url) {
+  DCHECK(storage_partition);
+  auto* device_bound_session_manager =
+      storage_partition->GetDeviceBoundSessionManager();
+  if (device_bound_session_manager) {
+    device_bound_session_manager->AddObserver(
+        url, receiver_.BindNewPipeAndPassRemote());
+  }
+}
+
+RenderFrameHostImpl::DeviceBoundSessionObserver::~DeviceBoundSessionObserver() =
+    default;
+
+void RenderFrameHostImpl::DeviceBoundSessionObserver::
+    OnDeviceBoundSessionAccessed(
+        const net::device_bound_sessions::SessionAccess& access) {
+  is_terminated_ |=
+      access.access_type ==
+      net::device_bound_sessions::SessionAccess::AccessType::kTermination;
+}
+
+void RenderFrameHostImpl::DeviceBoundSessionObserver::Clone(
+    mojo::PendingReceiver<network::mojom::DeviceBoundSessionAccessObserver>
+        observer) {
+  // The `Clone` method is only called for the observers that are part
+  // of network requests, so it is not expected to be called here.
+  NOTREACHED();
+}
+
+bool RenderFrameHostImpl::IsDeviceBoundSessionTerminated() {
+  return device_bound_session_observer_
+             ? device_bound_session_observer_->IsTerminated()
+             : false;
+}
+
 bool RenderFrameHostImpl::LoadedWithCacheControlNoStoreHeader() {
   return GetBackForwardCacheDisablingFeatures().Has(
       blink::scheduler::WebSchedulerTrackedFeature::
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index 0af491f4..9b2e25e6 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -1568,6 +1568,31 @@
     CookieChangeInfo cookie_change_info_;
   };
 
+  class DeviceBoundSessionObserver
+      : public network::mojom::DeviceBoundSessionAccessObserver {
+   public:
+    DeviceBoundSessionObserver(StoragePartition* storage_partition, GURL& url);
+    ~DeviceBoundSessionObserver() override;
+    DeviceBoundSessionObserver(const DeviceBoundSessionObserver&) = delete;
+    DeviceBoundSessionObserver& operator=(const DeviceBoundSessionObserver&) =
+        delete;
+
+    bool IsTerminated() const { return is_terminated_; }
+
+   private:
+    // network::mojom::DeviceBoundSessionAccessObserver
+    void OnDeviceBoundSessionAccessed(
+        const net::device_bound_sessions::SessionAccess& access) override;
+    void Clone(
+        mojo::PendingReceiver<network::mojom::DeviceBoundSessionAccessObserver>
+            observer) override;
+
+    mojo::Receiver<network::mojom::DeviceBoundSessionAccessObserver> receiver_{
+        this};
+
+    bool is_terminated_ = false;
+  };
+
   // Indicates that a navigation is ready to commit and can be
   // handled by this RenderFrame.
   // |subresource_loader_params| is used in network service land to pass
@@ -3079,6 +3104,10 @@
   // last committed document.
   CookieChangeListener::CookieChangeInfo GetCookieChangeInfo();
 
+  // Retrieves the whether a device bound session on the last committed
+  // document has been terminated.
+  bool IsDeviceBoundSessionTerminated();
+
   // Records metrics on sudden termination handlers found in this frame and
   // subframes.
   void RecordNavigationSuddenTerminationHandlers();
@@ -5398,6 +5427,9 @@
   // `cookie_change_listener_` in `NavigationRequest`.
   std::unique_ptr<CookieChangeListener> cookie_change_listener_;
 
+  // Listens for changes to DeviceBoundSessions on this page.
+  std::unique_ptr<DeviceBoundSessionObserver> device_bound_session_observer_;
+
   // If true, the renderer side widget is created after the navigation is
   // committed.
   bool waiting_for_renderer_widget_creation_after_commit_ = false;
diff --git a/content/browser/renderer_host/render_widget_host_delegate.cc b/content/browser/renderer_host/render_widget_host_delegate.cc
index 5800fc6..1ecc4cfa 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.cc
+++ b/content/browser/renderer_host/render_widget_host_delegate.cc
@@ -13,6 +13,11 @@
 
 namespace content {
 
+bool RenderWidgetHostDelegate::PreHandleMouseEvent(
+    const blink::WebMouseEvent& event) {
+  return false;
+}
+
 KeyboardEventProcessingResult RenderWidgetHostDelegate::PreHandleKeyboardEvent(
     const input::NativeWebKeyboardEvent& event) {
   return KeyboardEventProcessingResult::NOT_HANDLED;
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h
index ecb007b6..8ad5a50 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -102,6 +102,12 @@
   virtual void ResizeDueToAutoResize(RenderWidgetHostImpl* render_widget_host,
                                      const gfx::Size& new_size) {}
 
+  // Callback to give the browser a chance to handle the specified mouse
+  // event before sending it to the renderer. Returns true if the event was
+  // handled, false otherwise. A true value means no more processing should
+  // happen on the event. The default return value is false.
+  virtual bool PreHandleMouseEvent(const blink::WebMouseEvent& event);
+
   // Callback to give the browser a chance to handle the specified keyboard
   // event before sending it to the renderer. See enum for details on return
   // value.
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 3aeaf32..e6d739f6 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -447,6 +447,14 @@
   agent_scheduling_group_->GetProcess()->AddPriorityClient(this);
 
   SetupRenderInputRouter();
+  if (!frame_tree || !frame_tree->is_primary()) {
+    // We are preserving the old behavior for non-primary frames because the
+    // paint-holding signal seems missing in non-primary frames, and more
+    // importantly, releasing input early is fine in this case because the page
+    // either does not receive an input (kPrerender) or is a non-top-frame
+    // (where holding back input is not needed, crbug.com/40074208).
+    input_router()->MakeActive();
+  }
 
   const auto* command_line = base::CommandLine::ForCurrentProcess();
   if (!command_line->HasSwitch(switches::kDisableNewContentRenderingTimeout)) {
@@ -585,6 +593,15 @@
     is_topmost_frame_widget_with_view_ =
         !view->IsRenderWidgetHostViewChildFrame() && !self_owned_;
 
+    if (!is_topmost_frame_widget_with_view_) {
+      // We need to drop input only for the topmost frame shown to the user, see
+      // crbug.com/40074208.
+      //
+      // TODO(https://crbug.com/397701273): What happens to the input events to
+      // a subframe in the navigated page?
+      input_router()->MakeActive();
+    }
+
     // SendScreenRects() and SynchronizeVisualProperties() delay until a view
     // is set, however we come here with a newly created `view` that is not
     // initialized and ready to be used.
@@ -741,15 +758,8 @@
   renderer_widget_created_ = true;
 
   mojo::PendingRemote<blink::mojom::RenderInputRouterClient> browser_remote;
-  mojo::PendingReceiver<blink::mojom::RenderInputRouterClient> viz_receiver =
-      mojo::NullReceiver();
-  if (input::IsTransferInputToVizSupported()) {
-    mojo::PendingRemote<blink::mojom::RenderInputRouterClient> viz_remote;
-    viz_receiver = viz_remote.InitWithNewPipeAndPassReceiver();
-    viz_rir_client_remote_ = std::move(viz_remote);
-  }
-  blink_widget_->SetupRenderInputRouterConnections(
-      browser_remote.InitWithNewPipeAndPassReceiver(), std::move(viz_receiver));
+  blink_widget_->SetupBrowserRenderInputRouterConnections(
+      browser_remote.InitWithNewPipeAndPassReceiver());
 
   GetRenderInputRouter()->BindRenderInputRouterInterfaces(
       std::move(browser_remote));
@@ -1535,6 +1545,10 @@
   CHECK_GE(mouse_event.GetType(), WebInputEvent::Type::kMouseTypeFirst);
   CHECK_LE(mouse_event.GetType(), WebInputEvent::Type::kMouseTypeLast);
 
+  if (delegate_ && delegate_->PreHandleMouseEvent(mouse_event)) {
+    return;
+  }
+
   for (auto& mouse_event_callback : mouse_event_callbacks_) {
     if (mouse_event_callback.Run(mouse_event)) {
       return;
@@ -2452,6 +2466,8 @@
   // we will release input events at this point anyway.  So for our purpose,
   // this is equivalent to receiving the signal.
   first_content_metadata_received_ = true;
+
+  input_router()->MakeActive();
 }
 
 void RenderWidgetHostImpl::OnKeyboardEventAck(
@@ -3552,23 +3568,23 @@
     mojo::PendingReceiver<viz::mojom::CompositorFrameSink>
         compositor_frame_sink_receiver,
     mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>
-        compositor_frame_sink_client) {
+        compositor_frame_sink_client,
+    mojo::PendingRemote<blink::mojom::RenderInputRouterClient>
+        viz_rir_client_remote) {
   // Connects the viz process end of CompositorFrameSink message pipes. The
   // renderer compositor may request a new CompositorFrameSink on context
   // loss, which will destroy the existing CompositorFrameSink.
   create_frame_sink_callback_ = base::BindOnce(
       [](mojo::PendingReceiver<viz::mojom::CompositorFrameSink> receiver,
          mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient> client,
-         std::optional<mojo::PendingRemote<
-             blink::mojom::RenderInputRouterClient>> viz_rir_client_remote,
+         mojo::PendingRemote<blink::mojom::RenderInputRouterClient>
+             viz_rir_client_remote,
          bool force_enable_zoom, base::UnguessableToken grouping_id,
          const viz::FrameSinkId& frame_sink_id) {
         input::mojom::RenderInputRouterConfigPtr config;
         if (input::IsTransferInputToVizSupported()) {
-          DCHECK(viz_rir_client_remote.has_value());
-
           config = input::mojom::RenderInputRouterConfig::New();
-          config->rir_client = std::move(viz_rir_client_remote.value());
+          config->rir_client = std::move(viz_rir_client_remote);
           config->grouping_id = grouping_id;
           config->force_enable_zoom = force_enable_zoom;
         }
@@ -3577,8 +3593,7 @@
             std::move(config));
       },
       std::move(compositor_frame_sink_receiver),
-      std::move(compositor_frame_sink_client),
-      std::move(viz_rir_client_remote_),
+      std::move(compositor_frame_sink_client), std::move(viz_rir_client_remote),
       GetRenderInputRouter()->GetForceEnableZoom());
 
   MaybeDispatchBufferedFrameSinkRequest();
@@ -3761,6 +3776,7 @@
   if (!first_content_metadata_received_) {
     first_content_metadata_received_ = true;
     first_content_metadata_time_ = base::TimeTicks::Now();
+    input_router()->MakeActive();
   }
 
   const auto& metadata =
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 4420f3a..fe1fdd4 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -342,7 +342,10 @@
   void CreateFrameSink(
       mojo::PendingReceiver<viz::mojom::CompositorFrameSink>
           compositor_frame_sink_receiver,
-      mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>) override;
+      mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>
+          compositor_frame_sink_client,
+      mojo::PendingRemote<blink::mojom::RenderInputRouterClient>
+          viz_rir_client_remote) override;
   void RegisterRenderFrameMetadataObserver(
       mojo::PendingReceiver<cc::mojom::RenderFrameMetadataObserverClient>
           render_frame_metadata_observer_client_receiver,
@@ -1554,9 +1557,6 @@
 
   std::unique_ptr<CompositorMetricRecorder> compositor_metric_recorder_;
 
-  std::optional<mojo::PendingRemote<blink::mojom::RenderInputRouterClient>>
-      viz_rir_client_remote_;
-
   base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_{this};
 };
 
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 87998801..f03bb74 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -62,6 +62,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
+#include "third_party/blink/public/common/input/web_mouse_event.h"
 #include "third_party/blink/public/common/page/page_zoom.h"
 #include "third_party/blink/public/common/widget/visual_properties.h"
 #include "third_party/blink/public/mojom/drag/drag.mojom.h"
@@ -380,6 +381,10 @@
     return unhandled_keyboard_event_type_;
   }
 
+  bool prehandle_mouse_event_called() const {
+    return prehandle_mouse_event_called_;
+  }
+
   bool prehandle_keyboard_event_called() const {
     return prehandle_keyboard_event_called_;
   }
@@ -388,6 +393,10 @@
     return prehandle_keyboard_event_type_;
   }
 
+  void set_prehandle_mouse_event(bool handle) {
+    prehandle_mouse_event_ = handle;
+  }
+
   void set_prehandle_keyboard_event(bool handle) {
     prehandle_keyboard_event_ = handle;
   }
@@ -455,6 +464,14 @@
               (override));
 
  protected:
+  bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override {
+    prehandle_mouse_event_called_ = true;
+    if (prehandle_mouse_event_) {
+      return true;
+    }
+    return false;
+  }
+
   KeyboardEventProcessingResult PreHandleKeyboardEvent(
       const input::NativeWebKeyboardEvent& event) override {
     prehandle_keyboard_event_type_ = event.GetType();
@@ -506,6 +523,8 @@
   }
 
  private:
+  bool prehandle_mouse_event_ = false;
+  bool prehandle_mouse_event_called_ = false;
   bool prehandle_keyboard_event_;
   bool prehandle_keyboard_event_is_shortcut_;
   bool prehandle_keyboard_event_called_;
@@ -1536,6 +1555,37 @@
       blink::mojom::InputEventResultState::kConsumed);
 }
 
+TEST_F(RenderWidgetHostTest, PreHandleMouseEvent) {
+  // Simulate the situation that the browser handled the mouse event during
+  // pre-handle phrase.
+  delegate_->set_prehandle_mouse_event(true);
+
+  // Simulate a mouse event.
+  SimulateMouseEvent(WebMouseEvent::Type::kMouseDown);
+
+  EXPECT_TRUE(delegate_->prehandle_mouse_event_called());
+
+  // Make sure the mouse event is not sent to the renderer.
+  MockWidgetInputHandler::MessageVector dispatched_events =
+      host_->mock_render_input_router()->GetAndResetDispatchedMessages();
+  EXPECT_EQ(0u, dispatched_events.size());
+
+  // Simulate the situation that the browser didn't handle the mouse event
+  // during pre-handle phrase.
+  delegate_->set_prehandle_mouse_event(false);
+
+  // Simulate a mouse event.
+  SimulateMouseEvent(WebMouseEvent::Type::kMouseUp);
+
+  // Make sure the mouse event is sent to the renderer.
+  dispatched_events =
+      host_->mock_render_input_router()->GetAndResetDispatchedMessages();
+  ASSERT_EQ(1u, dispatched_events.size());
+  ASSERT_TRUE(dispatched_events[0]->ToEvent());
+  EXPECT_EQ(WebMouseEvent::Type::kMouseUp,
+            dispatched_events[0]->ToEvent()->Event()->Event().GetType());
+}
+
 TEST_F(RenderWidgetHostTest, PreHandleRawKeyDownEvent) {
   // Simulate the situation that the browser handled the key down event during
   // pre-handle phrase.
diff --git a/content/browser/resources/indexed_db/indexeddb_internals.ts b/content/browser/resources/indexed_db/indexeddb_internals.ts
index 9a63be17..99892fa 100644
--- a/content/browser/resources/indexed_db/indexeddb_internals.ts
+++ b/content/browser/resources/indexed_db/indexeddb_internals.ts
@@ -90,7 +90,7 @@
 
     this.getNode(`.control.start-record`).addEventListener('click', () => {
       this.getNode(`.control.stop-record`).hidden = false;
-      this.getNode(`.control.start-record`)!.hidden = true;
+      this.getNode(`.control.start-record`).hidden = true;
 
       IdbInternalsHandler.getRemote()
           .startMetadataRecording(this.idbBucketId)
@@ -105,7 +105,7 @@
       // Show loading
       this.progressNode.style.display = 'inline';
       this.getNode(`.control.start-record`).hidden = false;
-      this.getNode(`.control.stop-record`)!.hidden = true;
+      this.getNode(`.control.stop-record`).hidden = true;
 
       new IdbInternalsRemote()
           .stopMetadataRecording(this.idbBucketId)
@@ -146,7 +146,7 @@
     slider.max = (this.seriesData.length - 1).toString();
     this.getNode('.snapshots .current-snapshot').textContent = slider.value;
     this.getNode('.snapshots .total-snapshots').textContent = slider.max;
-    this.getNode('.snapshots .snapshot-delta')!.textContent =
+    this.getNode('.snapshots .snapshot-delta').textContent =
         `+${snapshot.deltaRecordingStartMs}ms`;
 
     for (const db of snapshot.databases || []) {
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 7615eb60..10e56fb 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -46,6 +46,7 @@
 #include "base/test/run_until.h"
 #include "base/test/test_future.h"
 #include "base/test/test_timeouts.h"
+#include "base/test/test_trace_processor.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
@@ -60,6 +61,7 @@
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/compositor/surface_utils.h"
 #include "content/browser/gpu/compositor_util.h"
+#include "content/browser/gpu/gpu_data_manager_impl.h"
 #include "content/browser/process_lock.h"
 #include "content/browser/process_reuse_policy.h"
 #include "content/browser/renderer_host/agent_scheduling_group_host.h"
@@ -95,6 +97,8 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/context_menu_params.h"
 #include "content/public/browser/global_routing_id.h"
+#include "content/public/browser/gpu_data_manager_observer.h"
+#include "content/public/browser/gpu_utils.h"
 #include "content/public/browser/javascript_dialog_manager.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_process_host_priority_client.h"
@@ -11688,6 +11692,77 @@
   EXPECT_TRUE(enabled);
 }
 
+class GpuInfoUpdateObserver : public GpuDataManagerObserver {
+ public:
+  explicit GpuInfoUpdateObserver(base::OnceClosure callback)
+      : callback_(std::move(callback)) {
+    observation_.Observe(GpuDataManager::GetInstance());
+  }
+  ~GpuInfoUpdateObserver() override = default;
+
+  void OnGpuInfoUpdate() override {
+    if (callback_) {
+      std::move(callback_).Run();
+    }
+  }
+
+ private:
+  base::OnceClosure callback_;
+  base::ScopedObservation<GpuDataManager, GpuDataManagerObserver> observation_{
+      this};
+};
+
+// Checks if RenderInputRouterDelegate mojo connection is reset when GPU process
+// restarts.
+IN_PROC_BROWSER_TEST_P(AndroidInputBrowserTest,
+                       RestartingGPUProcessResetsMojoConnection) {
+  RenderFrameSubmissionObserver render_frame_submission_observer(
+      web_contents());
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("foo.com", "/title1.html")));
+  if (render_frame_submission_observer.render_frame_count() == 0) {
+    render_frame_submission_observer.WaitForAnyFrameSubmission();
+  }
+
+  base::test::TestTraceProcessor ttp;
+  ttp.StartTrace("viz");
+
+  base::RunLoop run_loop;
+  // This observer is begin used here to signal if the GPU process has
+  // restarted.
+  GpuInfoUpdateObserver gpu_observer(run_loop.QuitClosure());
+
+  // Kill GPU process explicitly, this should trigger a restart.
+  KillGpuProcess();
+  run_loop.Run();
+
+  // Navigate to URL and wait for frame submission.
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("bar.com", "/title2.html")));
+  if (render_frame_submission_observer.render_frame_count() == 0) {
+    render_frame_submission_observer.WaitForAnyFrameSubmission();
+  }
+
+  absl::Status status = ttp.StopAndParseTrace();
+  ASSERT_TRUE(status.ok()) << status.message();
+
+  std::string query = R"(
+    SELECT COUNT(*) AS cnt
+    FROM slice
+    WHERE name = 'InputManager::SetupRenderInputRouterDelegateConnection'
+    ORDER BY ts ASC
+  )";
+  auto result = ttp.RunQuery(query);
+  ASSERT_TRUE(result.has_value());
+
+  // `result.value()` would look something like this: {{"cnt"}, {"<num>"}}.
+  EXPECT_THAT(result.value(),
+              testing::ElementsAre(
+                  testing::ElementsAre("cnt"),
+                  testing::ElementsAre(
+                      input::IsTransferInputToVizSupported() ? "1" : "0")));
+}
+
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTouchActionTest,
                        ForceEnableZoomPropagatesToChild) {
   GURL main_url(embedded_test_server()->GetURL(
diff --git a/content/browser/tracing/background_tracing_rule.cc b/content/browser/tracing/background_tracing_rule.cc
index f0c5c9e..309beac 100644
--- a/content/browser/tracing/background_tracing_rule.cc
+++ b/content/browser/tracing/background_tracing_rule.cc
@@ -286,10 +286,9 @@
       new_sample->set_sample(actual_value);
       perfetto::Flow::Global(flow_id)(ctx);
     };
-    TRACE_EVENT_INSTANT(
-        "toplevel,latency", "HistogramSampleTrigger",
-        perfetto::Track::FromPointer(this, perfetto::ProcessTrack::Current()),
-        base::TimeTicks::Now(), trace_details);
+    auto track = perfetto::NamedTrack("HistogramSamples");
+    TRACE_EVENT_INSTANT("toplevel,latency", "HistogramSampleTrigger", track,
+                        trace_details);
     OnRuleTriggered(actual_value, flow_id);
   }
 
diff --git a/content/browser/tracing/tracing_end_to_end_browsertest.cc b/content/browser/tracing/tracing_end_to_end_browsertest.cc
index d6efed1e..c22b1aab 100644
--- a/content/browser/tracing/tracing_end_to_end_browsertest.cc
+++ b/content/browser/tracing/tracing_end_to_end_browsertest.cc
@@ -2,10 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <optional>
 #include <thread>
 
 #include "base/files/scoped_temp_dir.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/metrics/statistics_recorder.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/common/task_annotator.h"
 #include "base/test/test_trace_processor.h"
@@ -19,8 +22,10 @@
 #include "services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer_proto.h"
 #include "services/tracing/public/cpp/perfetto/metadata_data_source.h"
 #include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h"
+#include "services/tracing/public/mojom/perfetto_service.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/perfetto/protos/perfetto/config/chrome/chrome_config.gen.h"
+#include "third_party/perfetto/protos/perfetto/config/chrome/histogram_samples.gen.h"
 
 #if BUILDFLAG(IS_POSIX)
 #include "base/test/bind.h"
@@ -39,28 +44,51 @@
 const char kDetailedDumpMode[] = "detailed";
 const char kBackgroundDumpMode[] = "background";
 
+perfetto::protos::gen::ChromiumHistogramSamplesConfig::HistogramSample
+MakeHistogramSample(const std::string& name,
+                    std::optional<int64_t> min_value = std::nullopt,
+                    std::optional<int64_t> max_value = std::nullopt) {
+  perfetto::protos::gen::ChromiumHistogramSamplesConfig::HistogramSample sample;
+  sample.set_histogram_name(name);
+  if (min_value) {
+    sample.set_min_value(*min_value);
+  }
+  if (max_value) {
+    sample.set_max_value(*max_value);
+  }
+  return sample;
+}
+
 perfetto::protos::gen::TraceConfig TraceConfigWithHistograms(
-    const std::string& category_filter_string,
-    const std::vector<std::string>& histograms) {
-  // Which categories are specified in the legacy config should not affect
-  // anything. Only the list of enabled histograms should be read from the
-  // legacy config.
-  base::trace_event::TraceConfig trace_event_config;
-  for (const auto& histogram : histograms) {
-    trace_event_config.EnableHistogram(histogram);
+    const std::vector<
+        perfetto::protos::gen::ChromiumHistogramSamplesConfig::HistogramSample>&
+        histograms) {
+  auto perfetto_config = base::test::DefaultTraceConfig("-*", false);
+
+  auto* histogram_data_source = perfetto_config.add_data_sources();
+  auto* histogram_source_config = histogram_data_source->mutable_config();
+  histogram_source_config->set_name(tracing::mojom::kHistogramSampleSourceName);
+  histogram_source_config->set_target_buffer(0);
+
+  if (!histograms.empty()) {
+    perfetto::protos::gen::ChromiumHistogramSamplesConfig histogram_config;
+    for (const auto& histogram : histograms) {
+      *histogram_config.add_histograms() = histogram;
+    }
+    histogram_source_config->set_chromium_histogram_samples_raw(
+        histogram_config.SerializeAsString());
   }
 
-  auto perfetto_config =
-      base::test::DefaultTraceConfig(category_filter_string, false);
-  for (auto& ds : *perfetto_config.mutable_data_sources()) {
-    if (ds.config().name() == "track_event") {
-      ds.mutable_config()->mutable_chrome_config()->set_trace_config(
-          trace_event_config.ToString());
-    }
-  }
   return perfetto_config;
 }
 
+constexpr const char* histogram_query =
+    "SELECT "
+    "EXTRACT_ARG(arg_set_id, \"chrome_histogram_sample.name\") AS name, "
+    "EXTRACT_ARG(arg_set_id, \"chrome_histogram_sample.sample\") AS value "
+    "FROM slice "
+    "WHERE cat = \"disabled-by-default-histogram_samples\"";
+
 perfetto::protos::gen::TraceConfig TraceConfigWithMemoryDumps(
     const char* mode) {
   const std::string trace_event_config_str = base::StringPrintf(
@@ -543,64 +571,105 @@
                                      std::vector<std::string>{"cat_event"}));
 }
 
-IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TwoSessionsHistograms) {
+IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
+                       TwoSessionsGlobalHistograms) {
+  ASSERT_FALSE(base::StatisticsRecorder::global_sample_callback());
+
   // Start the first session that records "Test.Foo" histograms
-  auto config = TraceConfigWithHistograms(
-      "disabled-by-default-histogram_samples", {"Test.Foo"});
+  auto config = TraceConfigWithHistograms({});
   base::test::TestTraceProcessor ttp1;
   ttp1.StartTrace(config);
 
-  UMA_HISTOGRAM_BOOLEAN("Test.Foo", true);
-  UMA_HISTOGRAM_BOOLEAN("Test.Bar", true);
+  base::UmaHistogramCounts100("Test.Foo", 1);
+  base::UmaHistogramCounts100("Test.Bar", 2);
 
-  // Start the second session that records "Test.Bar" histograms
-  config = TraceConfigWithHistograms("disabled-by-default-histogram_samples",
-                                     {"Test.Bar"});
+  // Start the second session that records all histograms
+  config = TraceConfigWithHistograms({});
   base::test::TestTraceProcessor ttp2;
   ttp2.StartTrace(config);
 
-  UMA_HISTOGRAM_BOOLEAN("Test.Foo", true);
-  UMA_HISTOGRAM_BOOLEAN("Test.Bar", true);
+  base::UmaHistogramCounts100("Test.Foo", 3);
+  base::UmaHistogramCounts100("Test.Bar", 4);
 
-  // Stop the second session. Its trace should contain only one "Test.Bar"
-  // sample that was recorded while the session was active.
-  // It will also contain a "Test.Foo" sample because right now the list of
-  // monitored histograms is shared between sessions.
-  // TODO(khokhlov): Fix the test expectations when CustomEventRecorder
-  // correctly tracks which samples go to which sessions.
+  // Stop the second session.
   absl::Status status = ttp2.StopAndParseTrace();
   ASSERT_TRUE(status.ok()) << status.message();
 
-  std::string query =
-      "SELECT "
-      "EXTRACT_ARG(arg_set_id, \"chrome_histogram_sample.name\") AS name "
-      "FROM slice "
-      "WHERE cat = \"disabled-by-default-histogram_samples\"";
-  auto result = ttp2.RunQuery(query);
+  auto result = ttp2.RunQuery(histogram_query);
   ASSERT_TRUE(result.has_value()) << result.error();
-  EXPECT_THAT(result.value(),
-              ::testing::ElementsAre(std::vector<std::string>{"name"},
-                                     std::vector<std::string>{"Test.Foo"},
-                                     std::vector<std::string>{"Test.Bar"}));
+  EXPECT_THAT(result.value(), ::testing::IsSupersetOf(
+                                  {std::vector<std::string>{"name", "value"},
+                                   std::vector<std::string>{"Test.Foo", "3"},
+                                   std::vector<std::string>{"Test.Bar", "4"}}));
 
-  UMA_HISTOGRAM_BOOLEAN("Test.Foo", true);
-  UMA_HISTOGRAM_BOOLEAN("Test.Bar", true);
+  base::UmaHistogramCounts100("Test.Foo", 5);
+  base::UmaHistogramCounts100("Test.Bar", 6);
+
+  // Stop the first session. Its trace should contain all samples that were
+  // recorded while the session was active.
+  status = ttp1.StopAndParseTrace();
+  ASSERT_TRUE(status.ok()) << status.message();
+  ASSERT_FALSE(base::StatisticsRecorder::global_sample_callback());
+
+  result = ttp1.RunQuery(histogram_query);
+  ASSERT_TRUE(result.has_value()) << result.error();
+  EXPECT_THAT(result.value(), ::testing::IsSupersetOf(
+                                  {std::vector<std::string>{"name", "value"},
+                                   std::vector<std::string>{"Test.Foo", "1"},
+                                   std::vector<std::string>{"Test.Bar", "2"},
+                                   std::vector<std::string>{"Test.Foo", "3"},
+                                   std::vector<std::string>{"Test.Bar", "4"},
+                                   std::vector<std::string>{"Test.Foo", "5"},
+                                   std::vector<std::string>{"Test.Bar", "6"}}));
+}
+
+IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
+                       TwoSessionsTargetedHistograms) {
+  // Start the first session that records "Test.Foo" histograms
+  auto config =
+      TraceConfigWithHistograms({MakeHistogramSample("Test.Foo", 10, 20)});
+  base::test::TestTraceProcessor ttp1;
+  ttp1.StartTrace(config);
+
+  base::UmaHistogramCounts100("Test.Foo", 1);  // Not recorded
+  base::UmaHistogramCounts100("Test.Foo", 10);
+  base::UmaHistogramCounts100("Test.Foo", 21);  // Not recorded
+
+  // Start the second session that records "Test.Bar" histograms
+  config = TraceConfigWithHistograms({MakeHistogramSample("Test.Bar", 30, 40)});
+  base::test::TestTraceProcessor ttp2;
+  ttp2.StartTrace(config);
+
+  base::UmaHistogramCounts100("Test.Foo", 11);
+  base::UmaHistogramCounts100("Test.Bar", 15);  // Not recorded
+  base::UmaHistogramCounts100("Test.Bar", 30);
+
+  // Stop the second session. Its trace should contain only one "Test.Bar"
+  // sample that was recorded while the session was active.
+  absl::Status status = ttp2.StopAndParseTrace();
+  ASSERT_TRUE(status.ok()) << status.message();
+
+  auto result = ttp2.RunQuery(histogram_query);
+  ASSERT_TRUE(result.has_value()) << result.error();
+  EXPECT_THAT(result.value(), ::testing::ElementsAre(
+                                  std::vector<std::string>{"name", "value"},
+                                  std::vector<std::string>{"Test.Bar", "30"}));
+
+  base::UmaHistogramCounts100("Test.Foo", 12);
+  base::UmaHistogramCounts100("Test.Bar", 31);  // Not recorded
 
   // Stop the first session. Its trace should contain all three "Test.Foo"
   // samples that were recorded while the session was active.
-  // Some "Test.Bar" samples will also be there (see the previous comment).
   status = ttp1.StopAndParseTrace();
   ASSERT_TRUE(status.ok()) << status.message();
 
-  result = ttp1.RunQuery(query);
+  result = ttp1.RunQuery(histogram_query);
   ASSERT_TRUE(result.has_value()) << result.error();
-  EXPECT_THAT(result.value(),
-              ::testing::ElementsAre(std::vector<std::string>{"name"},
-                                     std::vector<std::string>{"Test.Foo"},
-                                     std::vector<std::string>{"Test.Foo"},
-                                     std::vector<std::string>{"Test.Bar"},
-                                     std::vector<std::string>{"Test.Foo"},
-                                     std::vector<std::string>{"Test.Bar"}));
+  EXPECT_THAT(result.value(), ::testing::ElementsAre(
+                                  std::vector<std::string>{"name", "value"},
+                                  std::vector<std::string>{"Test.Foo", "10"},
+                                  std::vector<std::string>{"Test.Foo", "11"},
+                                  std::vector<std::string>{"Test.Foo", "12"}));
 }
 
 IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TwoSessionsProcessNames) {
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 3738ac49..a5e3343 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1316,13 +1316,26 @@
   }
 
   if (input::IsTransferInputToVizSupported()) {
-    GetHostFrameSinkManager()->SetupRenderInputRouterDelegateConnection(
-        compositor_frame_sink_grouping_id_,
-        rir_delegate_client_receiver_.BindNewPipeAndPassRemote(),
-        rir_delegate_remote_.BindNewPipeAndPassReceiver());
+    SetupRenderInputRouterDelegateConnection();
   }
 }
 
+void WebContentsImpl::SetupRenderInputRouterDelegateConnection() {
+  // Handles setting up GPU mojo endpoint connections. In general, the number of
+  // retries for setting up these mojo connections is capped by the maximum
+  // number of attempts to restart the GPU process, see
+  // GpuProcessHost::GetFallbackCrashLimit().
+  rir_delegate_client_receiver_.reset();
+  rir_delegate_remote_.reset();
+  GetHostFrameSinkManager()->SetupRenderInputRouterDelegateConnection(
+      compositor_frame_sink_grouping_id_,
+      rir_delegate_client_receiver_.BindNewPipeAndPassRemote(),
+      rir_delegate_remote_.BindNewPipeAndPassReceiver());
+  rir_delegate_client_receiver_.set_disconnect_handler(
+      base::BindOnce(&WebContentsImpl::SetupRenderInputRouterDelegateConnection,
+                     weak_factory_.GetWeakPtr()));
+}
+
 WebContentsImpl::~WebContentsImpl() {
   TRACE_EVENT0("content", "WebContentsImpl::~WebContentsImpl");
   WebContentsOfBrowserContext::Detach(*this);
@@ -4096,6 +4109,12 @@
                              width_changed);
 }
 
+bool WebContentsImpl::PreHandleMouseEvent(const blink::WebMouseEvent& event) {
+  OPTIONAL_TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("content.verbose"),
+                        "WebContentsImpl::PreHandleMouseEvent");
+  return delegate_ ? delegate_->PreHandleMouseEvent(this, event) : false;
+}
+
 KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent(
     const input::NativeWebKeyboardEvent& event) {
   OPTIONAL_TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("content.verbose"),
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index ea72773..1e3a3a23 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -1101,6 +1101,7 @@
 
   double GetPendingZoomLevel(RenderWidgetHostImpl* rwh) override;
 
+  bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override;
   KeyboardEventProcessingResult PreHandleKeyboardEvent(
       const input::NativeWebKeyboardEvent& event) override;
   bool HandleMouseEvent(const blink::WebMouseEvent& event) override;
@@ -2165,6 +2166,10 @@
   // JavascriptDialogManager.
   void CancelDialogManagerDialogs(bool reset_state);
 
+  // Sets up RenderInputRouterDelegate mojo connections with InputManager on
+  // the VizCompositorThread for input handling with InputVizard.
+  void SetupRenderInputRouterDelegateConnection();
+
   // Data for core operation ---------------------------------------------------
 
   // Delegate for notifying our owner about stuff. Not owned by us.
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc
index 7597e5c..d8b1a7b 100644
--- a/content/browser/webid/federated_auth_request_impl.cc
+++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -153,7 +153,6 @@
 
 std::string ComputeUrlEncodedTokenPostData(
     RenderFrameHost& render_frame_host,
-    const url::Origin& idp_origin,
     const std::string& client_id,
     const std::string& nonce,
     const std::string& account_id,
@@ -212,7 +211,7 @@
     query += "mode=" + rp_mode_str;
   }
 
-  if (webid::IsFedCmAuthzEnabled(render_frame_host, idp_origin)) {
+  if (webid::IsFedCmAuthzEnabled()) {
     std::vector<std::string> fields_to_use;
     if (fields) {
       fields_to_use = *fields;
@@ -941,7 +940,6 @@
               render_frame_host(), idp_ptr->config->config_url,
               permission_delegate_);
 
-      url::Origin idp_origin = url::Origin::Create(idp_ptr->config->config_url);
       if (has_failing_idp_signin_status) {
         if (idp_get_params_ptr->mode == blink::mojom::RpMode::kPassive) {
           if (IsFedCmMultipleIdentityProvidersEnabled()) {
@@ -986,7 +984,7 @@
         return;
       }
 
-      if (webid::IsFedCmAuthzEnabled(render_frame_host(), idp_origin)) {
+      if (webid::IsFedCmAuthzEnabled()) {
         any_idp_has_custom_scopes =
             any_idp_has_custom_scopes || GetDisclosureFields(*idp_ptr).empty();
         any_idp_has_parameters = any_idp_has_parameters || idp_ptr->params_json;
@@ -1102,7 +1100,7 @@
     const std::optional<std::string>& account_id,
     const std::string& token,
     ResolveTokenRequestCallback callback) {
-  if (!webid::IsFedCmAuthzEnabled(render_frame_host(), origin())) {
+  if (!webid::IsFedCmAuthzEnabled()) {
     std::move(callback).Run(false);
     return;
   }
@@ -1450,8 +1448,7 @@
        IdentityRequestDialogDisclosureField::kEmail,
        IdentityRequestDialogDisclosureField::kPicture};
 
-  url::Origin idp_origin = url::Origin::Create(provider.config->config_url);
-  if (!webid::IsFedCmAuthzEnabled(render_frame_host(), idp_origin)) {
+  if (!webid::IsFedCmAuthzEnabled()) {
     return kDefaultPermissions;
   }
 
@@ -1863,8 +1860,6 @@
     std::optional<bool> old_idp_signin_status,
     blink::mojom::FederatedAuthRequestResult result,
     std::optional<TokenStatus> token_status) {
-  url::Origin idp_origin =
-      url::Origin::Create(idp_info->provider->config->config_url);
   if (!old_idp_signin_status.has_value()) {
     if (rp_mode_ == blink::mojom::RpMode::kActive) {
       MaybeShowActiveModeModalDialog(idp_info->provider->config->config_url,
@@ -2074,8 +2069,7 @@
     }
     case IdpNetworkRequestManager::ParseStatus::kSuccess: {
       RecordRawAccountsSize(accounts.size());
-      if (webid::IsFedCmAuthzEnabled(render_frame_host(),
-                                     url::Origin::Create(idp_config_url))) {
+      if (webid::IsFedCmAuthzEnabled()) {
         if (!FilterAccountsWithLabel(idp_info->metadata.requested_label,
                                      accounts)) {
           // No accounts remain, so treat as account fetch failure.
@@ -2363,10 +2357,8 @@
   fedcm_metrics_->RecordContinueOnPopupTime(
       idp_config_url, select_account_time_ - accounts_dialog_display_time_);
 
-  url::Origin idp_origin = url::Origin::Create(idp_config_url);
-
   IdpNetworkRequestManager::ContinueOnCallback continue_on;
-  if (webid::IsFedCmAuthzEnabled(render_frame_host(), idp_origin)) {
+  if (webid::IsFedCmAuthzEnabled()) {
     continue_on = base::BindOnce(
         &FederatedAuthRequestImpl::OnContinueOnResponseReceived,
         weak_ptr_factory_.GetWeakPtr(), idp_info.provider->Clone());
@@ -2406,7 +2398,7 @@
   } else {
     endpoint = idp_info.endpoints.token;
     query = ComputeUrlEncodedTokenPostData(
-        render_frame_host(), idp_origin, idp_info.provider->config->client_id,
+        render_frame_host(), idp_info.provider->config->client_id,
         idp_info.provider->nonce, account_id,
         identity_selection_type_ != kExplicit, rp_mode_,
         idp_info.provider->fields, disclosure_shown_for,
@@ -2594,15 +2586,15 @@
     IdentityProviderRequestOptionsPtr idp,
     IdpNetworkRequestManager::FetchStatus status,
     const GURL& continue_on) {
-  url::Origin idp_origin = url::Origin::Create(idp->config->config_url);
   // This is enforced by OnAccountSelected when we call SendTokenRequest.
-  DCHECK(webid::IsFedCmAuthzEnabled(render_frame_host(), idp_origin));
+  DCHECK(webid::IsFedCmAuthzEnabled());
 
   id_assertion_response_time_ = base::TimeTicks::Now();
 
   GetContentClient()->browser()->LogWebFeatureForCurrentPage(
       &render_frame_host(), blink::mojom::WebFeature::kFedCmContinueOnResponse);
 
+  url::Origin idp_origin = url::Origin::Create(idp->config->config_url);
   // We only allow loading continue_on urls that are same-origin
   // with the IdP.
   // This isn't necessarily final, but seemed like a safer
diff --git a/content/browser/webid/federated_provider_fetcher.cc b/content/browser/webid/federated_provider_fetcher.cc
index e8879626..3c9c70f 100644
--- a/content/browser/webid/federated_provider_fetcher.cc
+++ b/content/browser/webid/federated_provider_fetcher.cc
@@ -239,8 +239,6 @@
       result.identity_provider_config_url, result.endpoints.token);
   bool is_accounts_valid = webid::IsEndpointSameOrigin(
       result.identity_provider_config_url, result.endpoints.accounts);
-  url::Origin idp_origin =
-      url::Origin::Create(result.identity_provider_config_url);
 
   bool is_login_url_valid =
       result.metadata &&
@@ -281,8 +279,7 @@
   }
 
   // (b)
-  if (webid::IsFedCmAuthzEnabled(*render_frame_host_, idp_origin) &&
-      result.wellknown.accounts.is_valid() &&
+  if (webid::IsFedCmAuthzEnabled() && result.wellknown.accounts.is_valid() &&
       result.wellknown.login_url.is_valid() && result.metadata &&
       result.metadata->idp_login_url.is_valid()) {
     // Behind the AuthZ flag, it is valid for IdPs to have valid configURLs
diff --git a/content/browser/webid/webid_utils.cc b/content/browser/webid/webid_utils.cc
index af608ed5..7ec0e588 100644
--- a/content/browser/webid/webid_utils.cc
+++ b/content/browser/webid/webid_utils.cc
@@ -438,28 +438,14 @@
       requester_origin, embedder_origin, url::Origin::Create(provider_url));
 }
 
-bool IsFedCmAuthzEnabled(RenderFrameHost& host, const url::Origin& idp_origin) {
-  RuntimeFeatureStateDocumentData* rfs_document_data =
-      RuntimeFeatureStateDocumentData::GetForCurrentDocument(&host);
+bool IsFedCmAuthzEnabled() {
   // If field trials or an explicit user selection disables authz, we should
   // respect that.
   std::optional<bool> is_overridden = IsFedCmAuthzOverridden();
   if (is_overridden) {
     return *is_overridden;
   }
-
-  // Should not be null as this gets initialized when the host gets created.
-  DCHECK(rfs_document_data);
-  std::vector<url::Origin> third_party_origins = {idp_origin};
-  // This includes origin trials.
-  bool runtime_enabled =
-      rfs_document_data->runtime_feature_state_read_context()
-          .IsFedCmAuthzEnabled() ||
-      rfs_document_data->runtime_feature_state_read_context()
-          .IsFedCmAuthzEnabledForThirdParty(third_party_origins);
-
-  bool flag_enabled = IsFedCmAuthzFlagEnabled();
-  return runtime_enabled || flag_enabled;
+  return true;
 }
 
 FederatedAuthRequestPageData* GetPageData(Page& page) {
diff --git a/content/browser/webid/webid_utils.h b/content/browser/webid/webid_utils.h
index e7db3d6f..1cf4005 100644
--- a/content/browser/webid/webid_utils.h
+++ b/content/browser/webid/webid_utils.h
@@ -103,7 +103,7 @@
     FederatedIdentityPermissionContextDelegate* sharing_permission_delegate,
     FederatedIdentityApiPermissionContextDelegate* api_permission_delegate);
 
-bool IsFedCmAuthzEnabled(RenderFrameHost& host, const url::Origin& idp_origin);
+bool IsFedCmAuthzEnabled();
 
 FederatedAuthRequestPageData* GetPageData(Page& page);
 
diff --git a/content/browser/webui/content_web_ui_configs.cc b/content/browser/webui/content_web_ui_configs.cc
index 554b087..dbd464c 100644
--- a/content/browser/webui/content_web_ui_configs.cc
+++ b/content/browser/webui/content_web_ui_configs.cc
@@ -51,7 +51,7 @@
   map.AddWebUIConfig(std::make_unique<WebXrInternalsUIConfig>());
 #endif
 
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
   map.AddWebUIConfig(std::make_unique<TraceReportInternalsUIConfig>());
   map.AddWebUIConfig(std::make_unique<TracingUIConfig>());
 #endif
diff --git a/content/browser/webui/web_ui_data_source_impl.cc b/content/browser/webui/web_ui_data_source_impl.cc
index 8dd7796..1aac0d99 100644
--- a/content/browser/webui/web_ui_data_source_impl.cc
+++ b/content/browser/webui/web_ui_data_source_impl.cc
@@ -43,6 +43,9 @@
 #include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "content/public/common/content_switches.h"
+#if BUILDFLAG(IS_MAC)
+#include "base/apple/foundation_util.h"
+#endif  // BUILDFLAG(IS_MAC)
 #endif  // BUILDFLAG(LOAD_WEBUI_FROM_DISK)
 
 namespace content {
@@ -95,10 +98,16 @@
           base::BindOnce(
               [](std::string filepath,
                  URLDataSource::GotDataCallback callback) {
-                base::FilePath exe_dir;
-                base::PathService::Get(base::DIR_EXE, &exe_dir);
-                base::FilePath file_path =
-                    exe_dir.Append(base::FilePath::FromUTF8Unsafe(filepath))
+                base::FilePath file_path;
+                base::PathService::Get(base::DIR_EXE, &file_path);
+
+#if BUILDFLAG(IS_MAC)
+                if (base::apple::AmIBundled()) {
+                  file_path = file_path.Append(FILE_PATH_LITERAL("../../.."));
+                }
+#endif
+                file_path =
+                    file_path.Append(base::FilePath::FromUTF8Unsafe(filepath))
                         .NormalizePathSeparators();
 
                 if (file_path.ReferencesParent()) {
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index be9898f..9e4dd8c 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -203,9 +203,9 @@
           {wf::EnableEyeDropperAPI, raw_ref(features::kEyeDropper),
            kSetOnlyIfOverridden},
           {wf::EnableFedCm, raw_ref(features::kFedCm), kSetOnlyIfOverridden},
-          {wf::EnableFedCmButtonMode, raw_ref(features::kFedCmButtonMode),
+          {wf::EnableFedCm, raw_ref(features::kFedCmButtonMode),
            kSetOnlyIfOverridden},
-          {wf::EnableFedCmAuthz, raw_ref(features::kFedCmAuthz),
+          {wf::EnableFedCm, raw_ref(features::kFedCmAuthz),
            kSetOnlyIfOverridden},
           {wf::EnableFedCmDelegation, raw_ref(features::kFedCmDelegation),
            kDefault},
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
index 5dee4154..1e96b3c 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
@@ -23,6 +23,8 @@
 
     public static final String ACCESSIBILITY_PAGE_ZOOM_V2 = "AccessibilityPageZoomV2";
 
+    public static final String ACCESSIBILITY_TEXT_FORMATTING = "AccessibilityTextFormatting";
+
     public static final String ACCESSIBILITY_UNIFIED_SNAPSHOTS = "AccessibilityUnifiedSnapshots";
     public static final String ACCESSIBILITY_MANAGE_BROADCAST_RECEIVER_ON_BACKGROUND =
             "AccessibilityManageBroadcastReceiverOnBackground";
diff --git a/content/public/browser/back_forward_cache.h b/content/public/browser/back_forward_cache.h
index a1449ad..ed04595 100644
--- a/content/public/browser/back_forward_cache.h
+++ b/content/public/browser/back_forward_cache.h
@@ -116,7 +116,8 @@
     kWebViewMessageListenerInjected = 66,
     kWebViewSafeBrowsingAllowlistChanged = 67,
     kWebViewDocumentStartJavascriptChanged = 68,
-    kMaxValue = kWebViewDocumentStartJavascriptChanged,
+    kCacheControlNoStoreDeviceBoundSessionTerminated = 69,
+    kMaxValue = kCacheControlNoStoreDeviceBoundSessionTerminated,
   };
   // LINT.ThenChange(//tools/metrics/histograms/metadata/navigation/enums.xml:BackForwardCacheNotRestoredReason)
 
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index ece9688..ac4deeb 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -109,6 +109,12 @@
   return false;
 }
 
+bool WebContentsDelegate::PreHandleMouseEvent(
+    WebContents* source,
+    const blink::WebMouseEvent& event) {
+  return false;
+}
+
 KeyboardEventProcessingResult WebContentsDelegate::PreHandleKeyboardEvent(
     WebContents* source,
     const input::NativeWebKeyboardEvent& event) {
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 76e728c..ac2e7cd 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -28,6 +28,7 @@
 #include "content/public/browser/serial_chooser.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/window_container_type.mojom-forward.h"
+#include "third_party/blink/public/common/input/web_mouse_event.h"
 #include "third_party/blink/public/common/mediastream/media_stream_request.h"
 #include "third_party/blink/public/common/page/drag_operation.h"
 #include "third_party/blink/public/mojom/choosers/color_chooser.mojom-forward.h"
@@ -85,6 +86,7 @@
 
 namespace blink {
 class WebGestureEvent;
+class WebMouseEvent;
 enum class ProtocolHandlerSecurityLevel;
 }
 
@@ -299,6 +301,13 @@
   virtual bool HandleContextMenu(RenderFrameHost& render_frame_host,
                                  const ContextMenuParams& params);
 
+  // Allows delegates to handle mouse events before sending to the renderer.
+  // Returns true if the event was handled, false otherwise. A true value means
+  // no more processing should happen on the event. The default return value is
+  // false.
+  virtual bool PreHandleMouseEvent(WebContents* source,
+                                   const blink::WebMouseEvent& event);
+
   // Allows delegates to handle keyboard events before sending to the renderer.
   // See enum for description of return values.
   virtual KeyboardEventProcessingResult PreHandleKeyboardEvent(
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 99a45d7..ce8542d5 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -233,11 +233,6 @@
 // Adiitional FeatureParams for CookieDeprecationFacilitatedTesting are defined
 // in chrome/browser/tpcd/experiment/tpcd_experiment_features.cc.
 
-// When enabled, the DevTools Privacy UI is displayed.
-BASE_FEATURE(kDevToolsPrivacyUI,
-             "DevToolsPrivacyUI",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enables deferring the creation of the speculative RFH when the navigation
 // starts. The creation of a speculative RFH consumes about 2ms and is blocking
 // the network request. With this feature the creation will be deferred until
@@ -273,6 +268,20 @@
              "DeleteStaleSessionCookiesOnStartup",
              base::FEATURE_DISABLED_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
+// BFCache. Note that if `kCacheControlNoStoreEnterBackForwardCache` is
+// disabled, no such pages will be in the cache.
+BASE_FEATURE(kDeviceBoundSessionTerminationEvictBackForwardCache,
+             "DeviceBoundSessionTerminationEvictBackForwardCache",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+// When enabled, the DevTools Privacy UI is displayed.
+BASE_FEATURE(kDevToolsPrivacyUI,
+             "DevToolsPrivacyUI",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 // Controls whether the Digital Goods API is enabled.
 // https://github.com/WICG/digital-goods/
 BASE_FEATURE(kDigitalGoodsApi,
@@ -1053,7 +1062,8 @@
 const base::FeatureParam<FontDataServiceTypefaceType>::Option
     font_data_service_typeface[] = {
         {FontDataServiceTypefaceType::kDwrite, "DWrite"},
-        {FontDataServiceTypefaceType::kInternal, "Internal"}};
+        {FontDataServiceTypefaceType::kFreetype, "Freetype"},
+        {FontDataServiceTypefaceType::kFontations, "Fontations"}};
 const base::FeatureParam<FontDataServiceTypefaceType>
     kFontDataServiceTypefaceType{&kFontDataServiceAllWebContents, "typeface",
                                  FontDataServiceTypefaceType::kDwrite,
@@ -1296,6 +1306,12 @@
              "AccessibilityPageZoomV2",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enables the addition of text formatting information to the Android
+// AccessibilityNodeInfo accessibility tree.
+BASE_FEATURE(kAccessibilityTextFormatting,
+             "AccessibilityTextFormatting",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enables the use of a unified code path for AXTree snapshots.
 BASE_FEATURE(kAccessibilityUnifiedSnapshots,
              "AccessibilityUnifiedSnapshots",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 6596115..7119d4c 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -82,6 +82,8 @@
 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);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kDigitalGoodsApi);
 // TODO(crbug.com/364900088): Refactor BTM feature flags and parameters into
@@ -233,7 +235,8 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFontDataServiceAllWebContents);
 enum class FontDataServiceTypefaceType {
   kDwrite,
-  kInternal,
+  kFreetype,
+  kFontations,
 };
 extern const base::FeatureParam<FontDataServiceTypefaceType>
     kFontDataServiceTypefaceType;
@@ -288,6 +291,7 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kAccessibilityDeprecateTypeAnnounce);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kAccessibilityIncludeLongClickAction);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kAccessibilityPageZoomV2);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kAccessibilityTextFormatting);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kAccessibilityUnifiedSnapshots);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
     kAccessibilityManageBroadcastReceiverOnBackground);
diff --git a/content/public/renderer/render_frame_observer.cc b/content/public/renderer/render_frame_observer.cc
index 501ae7b..b77ae412 100644
--- a/content/public/renderer/render_frame_observer.cc
+++ b/content/public/renderer/render_frame_observer.cc
@@ -58,8 +58,9 @@
   render_frame_ = nullptr;
 }
 
-bool RenderFrameObserver::SetUpSmoothnessReporting(
-    base::ReadOnlySharedMemoryRegion& shared_memory) {
+bool RenderFrameObserver::SetUpUkmReporting(
+    base::ReadOnlySharedMemoryRegion& shared_memory_smoothness,
+    base::ReadOnlySharedMemoryRegion& shared_memory_dropped_frames) {
   return false;
 }
 
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h
index bb4d6c5..44da054 100644
--- a/content/public/renderer/render_frame_observer.h
+++ b/content/public/renderer/render_frame_observer.h
@@ -370,11 +370,12 @@
       const std::string& interface_name,
       mojo::ScopedInterfaceEndpointHandle* handle);
 
-  // The smoothness metrics is shared over shared-memory. The interested
-  // observer should invalidate |shared_memory| (by std::move()'ing it), and
-  // return true. All other observers should return false (default).
-  virtual bool SetUpSmoothnessReporting(
-      base::ReadOnlySharedMemoryRegion& shared_memory);
+  // The smoothness and dropped frames metrics is shared over shared-memory. The
+  // interested observer should invalidate |shared_memory| (by std::move()'ing
+  // it), and return true. All other observers should return false (default).
+  virtual bool SetUpUkmReporting(
+      base::ReadOnlySharedMemoryRegion& shared_memory_smoothness,
+      base::ReadOnlySharedMemoryRegion& shared_memory_dropped_frames);
 
 #if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
   // IPC::Listener implementation.
diff --git a/content/public/test/fake_render_widget_host.cc b/content/public/test/fake_render_widget_host.cc
index 5a362db..a8b1eeba 100644
--- a/content/public/test/fake_render_widget_host.cc
+++ b/content/public/test/fake_render_widget_host.cc
@@ -74,7 +74,9 @@
     mojo::PendingReceiver<viz::mojom::CompositorFrameSink>
         compositor_frame_sink_receiver,
     mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>
-        compositor_frame_sink_client) {}
+        compositor_frame_sink_client,
+    mojo::PendingRemote<blink::mojom::RenderInputRouterClient>
+        viz_rir_client_remote) {}
 
 void FakeRenderWidgetHost::RegisterRenderFrameMetadataObserver(
     mojo::PendingReceiver<cc::mojom::RenderFrameMetadataObserverClient>
@@ -132,9 +134,8 @@
 blink::mojom::WidgetInputHandler*
 FakeRenderWidgetHost::GetWidgetInputHandler() {
   if (!widget_input_handler_) {
-    widget_remote_->SetupRenderInputRouterConnections(
-        client_remote_.BindNewPipeAndPassReceiver(),
-        /* viz_request= */ mojo::NullReceiver());
+    widget_remote_->SetupBrowserRenderInputRouterConnections(
+        client_remote_.BindNewPipeAndPassReceiver());
 
     client_remote_->GetWidgetInputHandler(
         widget_input_handler_.BindNewPipeAndPassReceiver(),
diff --git a/content/public/test/fake_render_widget_host.h b/content/public/test/fake_render_widget_host.h
index b0925b43e..25b47552 100644
--- a/content/public/test/fake_render_widget_host.h
+++ b/content/public/test/fake_render_widget_host.h
@@ -71,7 +71,9 @@
       mojo::PendingReceiver<viz::mojom::CompositorFrameSink>
           compositor_frame_sink_receiver,
       mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>
-          compositor_frame_sink_client) override;
+          compositor_frame_sink_client,
+      mojo::PendingRemote<blink::mojom::RenderInputRouterClient>
+          viz_rir_client_remote) override;
   void RegisterRenderFrameMetadataObserver(
       mojo::PendingReceiver<cc::mojom::RenderFrameMetadataObserverClient>
           render_frame_metadata_observer_client_receiver,
diff --git a/content/renderer/font_data/font_data_manager.cc b/content/renderer/font_data/font_data_manager.cc
index b3ea8378..af54f10 100644
--- a/content/renderer/font_data/font_data_manager.cc
+++ b/content/renderer/font_data/font_data_manager.cc
@@ -22,9 +22,8 @@
 #include "third_party/skia/src/ports/SkTypeface_win_dw.h"  // nogncheck
 #if BUILDFLAG(ENABLE_FREETYPE)
 #include "third_party/skia/include/ports/SkFontMgr_empty.h"
-#else
-#include "third_party/skia/include/ports/SkTypeface_fontations.h"
 #endif
+#include "third_party/skia/include/ports/SkTypeface_fontations.h"
 
 namespace font_data_service {
 
@@ -223,15 +222,20 @@
   // Experiment will test the performance of different SkTypefaces.
   // 'custom_fnt_mgr_' is a wrapper to create an SkFreeType typeface.
 
-  return features::kFontDataServiceTypefaceType.Get() ==
-                 features::FontDataServiceTypefaceType::kInternal
-             ?
+  if (features::kFontDataServiceTypefaceType.Get() ==
+      features::FontDataServiceTypefaceType::kDwrite) {
+    return DWriteFontTypeface::MakeFromStream(std::move(stream), args);
+  } else if (features::kFontDataServiceTypefaceType.Get() ==
+             features::FontDataServiceTypefaceType::kFreetype) {
+    // Chromium currently always sets ENABLE_FREETYPE, but nonetheless allow
+    // falling back to fontations if the param is set to freetype but freetype
+    // isn't enabled.
 #if BUILDFLAG(ENABLE_FREETYPE)
-             custom_fnt_mgr_->makeFromStream(std::move(stream), args)
-#else
-             SkTypeface_Make_Fontations(std::move(stream), args)
+    return custom_fnt_mgr_->makeFromStream(std::move(stream), args);
 #endif
-             : DWriteFontTypeface::MakeFromStream(std::move(stream), args);
+  }
+
+  return SkTypeface_Make_Fontations(std::move(stream), args);
 }
 
 sk_sp<SkTypeface> FontDataManager::onMakeFromFile(const char path[],
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 64baded..539a274 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2142,17 +2142,19 @@
   }
 }
 
-void RenderFrameImpl::SetUpSharedMemoryForSmoothness(
-    base::ReadOnlySharedMemoryRegion shared_memory) {
+void RenderFrameImpl::SetUpSharedMemoryForUkms(
+    base::ReadOnlySharedMemoryRegion smoothness_memory,
+    base::ReadOnlySharedMemoryRegion dropped_frames_memory) {
   TRACE_EVENT_WITH_FLOW0("navigation",
-                         "RenderFrameImpl::SetUpSharedMemoryForSmoothness",
+                         "RenderFrameImpl::SetUpSharedMemoryForUkms",
                          TRACE_ID_LOCAL(this),
                          TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  DCHECK(shared_memory.IsValid());
+  DCHECK(smoothness_memory.IsValid() && dropped_frames_memory.IsValid());
   for (auto& observer : observers_) {
-    DCHECK(shared_memory.IsValid());
-    if (observer.SetUpSmoothnessReporting(shared_memory))
+    DCHECK(smoothness_memory.IsValid() && dropped_frames_memory.IsValid());
+    if (observer.SetUpUkmReporting(smoothness_memory, dropped_frames_memory)) {
       break;
+    }
   }
 }
 
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 075e7f46..add44302 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -716,8 +716,10 @@
   void OnFrameVisibilityChanged(
       blink::mojom::FrameVisibility render_status) override;
 
-  void SetUpSharedMemoryForSmoothness(
-      base::ReadOnlySharedMemoryRegion shared_memory) override;
+  void SetUpSharedMemoryForUkms(
+      base::ReadOnlySharedMemoryRegion smoothness_memory,
+      base::ReadOnlySharedMemoryRegion dropped_frames_memory) override;
+
   blink::WebURL LastCommittedUrlForUKM() override;
   void ScriptedPrint() override;
 
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 868d7efd..d094ece 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -882,6 +882,8 @@
           "cors_exempt_header_list");
   if (!exempt_header.empty())
     context_params->cors_exempt_header_list.push_back(exempt_header);
+  context_params->device_bound_sessions_enabled =
+      base::FeatureList::IsEnabled(net::features::kDeviceBoundSessions);
 }
 
 void ShellContentBrowserClient::GetHyphenationDictionary(
diff --git a/content/shell/browser/shell_devtools_bindings.cc b/content/shell/browser/shell_devtools_bindings.cc
index 1f1c4d65..4fdd118 100644
--- a/content/shell/browser/shell_devtools_bindings.cc
+++ b/content/shell/browser/shell_devtools_bindings.cc
@@ -46,7 +46,7 @@
 #include "services/network/public/cpp/simple_url_loader_stream_consumer.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
 #include "base/command_line.h"
 #include "content/public/browser/devtools_frontend_host.h"
 #include "content/shell/common/shell_switches.h"
@@ -191,7 +191,7 @@
 
 void ShellDevToolsBindings::ReadyToCommitNavigation(
     NavigationHandle* navigation_handle) {
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
   content::RenderFrameHost* frame = navigation_handle->GetRenderFrameHost();
   if (navigation_handle->IsInPrimaryMainFrame()) {
     frontend_host_ = DevToolsFrontendHost::Create(
diff --git a/content/shell/browser/shell_devtools_bindings.h b/content/shell/browser/shell_devtools_bindings.h
index 2f9319a..2e6ee52 100644
--- a/content/shell/browser/shell_devtools_bindings.h
+++ b/content/shell/browser/shell_devtools_bindings.h
@@ -77,7 +77,7 @@
   scoped_refptr<DevToolsAgentHost> agent_host_;
   int inspect_element_at_x_;
   int inspect_element_at_y_;
-#if !BUILDFLAG(IS_ANDROID)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
   std::unique_ptr<DevToolsFrontendHost> frontend_host_;
 #endif
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 32740ad..884bd39 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1809,6 +1809,7 @@
     "//base/test:test_support",
     "//build:chromecast_buildflags",
     "//cc/slim",
+    "//components//unexportable_keys:unexportable_keys",
     "//components/attribution_reporting:mojom",
     "//components/cbor",
     "//components/discardable_memory/client",
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index 4780f625..1cafdc8 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -7331,6 +7331,7 @@
 data/interest_group/autogenSchemaV30.sql
 data/interest_group/autogenSchemaV31.sql
 data/interest_group/autogenSchemaV32.sql
+data/interest_group/autogenSchemaV33.sql
 data/interest_group/bidding_argument_validator.js
 data/interest_group/bidding_argument_validator.js.mock-http-headers
 data/interest_group/bidding_logic.js
diff --git a/content/test/data/interest_group/autogenSchemaV33.sql b/content/test/data/interest_group/autogenSchemaV33.sql
new file mode 100644
index 0000000..ed67e9a
--- /dev/null
+++ b/content/test/data/interest_group/autogenSchemaV33.sql
@@ -0,0 +1,24 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
+INSERT INTO meta VALUES('mmap_status','-1');
+INSERT INTO meta VALUES('version','33');
+INSERT INTO meta VALUES('last_compatible_version','33');
+CREATE TABLE interest_groups(expiration INTEGER NOT NULL,last_updated INTEGER NOT NULL,next_update_after INTEGER NOT NULL,owner TEXT NOT NULL,joining_origin TEXT NOT NULL,exact_join_time INTEGER NOT NULL,name TEXT NOT NULL,priority DOUBLE NOT NULL,enable_bidding_signals_prioritization INTEGER NOT NULL,priority_vector TEXT NOT NULL,priority_signals_overrides TEXT NOT NULL,seller_capabilities TEXT NOT NULL,all_sellers_capabilities INTEGER NOT NULL,execution_mode INTEGER NOT NULL,joining_url TEXT NOT NULL,bidding_url TEXT NOT NULL,bidding_wasm_helper_url TEXT NOT NULL,update_url TEXT NOT NULL,trusted_bidding_signals_url TEXT NOT NULL,trusted_bidding_signals_keys TEXT NOT NULL,trusted_bidding_signals_slot_size_mode INTEGER NOT NULL,max_trusted_bidding_signals_url_length INTEGER NOT NULL,trusted_bidding_signals_coordinator TEXT,view_and_click_counts_providers TEXT,user_bidding_signals TEXT,ads_pb BLOB NOT NULL,ad_components_pb BLOB NOT NULL,ad_sizes TEXT NOT NULL,size_groups TEXT NOT NULL,auction_server_request_flags INTEGER NOT NULL,additional_bid_key BLOB NOT NULL,aggregation_coordinator_origin TEXT,storage_size INTEGER NOT NULL,last_k_anon_updated_time INTEGER NOT NULL,kanon_keys BLOB NOT NULL,PRIMARY KEY(owner,name));
+INSERT INTO interest_groups VALUES(11648709739634000,11646117739634000,-9223372036854775808,'https://full.example.com','https://full.example.com',11646117739634000,'full',1.0,1,'{"a":2.0,"b":-2.2}','{"a":-2.0,"c":10.0,"d":1.2}','{"https://full.example.com":"1","https://partial.example.com":"2"}',3,2,'https://full.example.com/','https://full.example.com/bid','https://full.example.com/bid_wasm','https://full.example.com/update','https://full.example.com/signals','["a","b","c","d"]',2,8000,'https://coordinator.test',replace('\n+https://view-and-click-counts-provider.test','\n',char(10)),'foo',X'd401f0580a92010a1c68747470733a2f2f66756c6c2e6578616d706c652e636f6d2f616431120767726f75705f311a096d6574616461746131220862757965725f69642a097368617265645f6964320a616452656e64657249643a15680d53207265706f7274696e6701503c420e73656c65637461626c655f6964313a100034324a067363616e20310a3d0a1c680d410066469400003211940c321a096d0d942c32220962757965725f696432',X'9101f04c0a490a2568747470733a2f2f66756c6c2e6578616d706c652e636f6d2f6164636f6d706f6e656e7431120767726f75705f311a0a6d657461646174613163320b616452656e6465724964320a44964b000032114b04321a154b2432634a067363616e2032','{"size_1":"{\"height\":150.0,\"height_units\":1,\"width\":300.0,\"width_units\":1}","size_2":"{\"height\":480.0,\"height_units\":1,\"width\":640.0,\"width_units\":1}","size_3":"{\"height\":100.0,\"height_units\":2,\"width\":100.0,\"width_units\":2}"}','{"group_1":"[\"size_1\"]","group_2":"[\"size_1\",\"size_2\"]","group_3":"[\"size_3\"]"}',3,X'','https://coordinator.test',822,-9223372036854775808,X'');
+CREATE TABLE joined_k_anon(hashed_key BLOB NOT NULL,last_reported_to_anon_server_time INTEGER NOT NULL,PRIMARY KEY(hashed_key));
+CREATE TABLE join_history(owner TEXT NOT NULL,name TEXT NOT NULL,join_time INTEGER NOT NULL,count INTEGER NOT NULL,PRIMARY KEY(owner, name, join_time) FOREIGN KEY(owner,name) REFERENCES interest_groups);
+INSERT INTO join_history VALUES('https://full.example.com','full',11646115200000000,1);
+CREATE TABLE bid_history(owner TEXT NOT NULL,name TEXT NOT NULL,bid_time INTEGER NOT NULL,count INTEGER NOT NULL,PRIMARY KEY(owner, name, bid_time) FOREIGN KEY(owner,name) REFERENCES interest_groups);
+CREATE TABLE win_history(owner TEXT NOT NULL,name TEXT NOT NULL,win_time INTEGER NOT NULL,ad TEXT NOT NULL,FOREIGN KEY(owner,name) REFERENCES interest_groups);
+CREATE TABLE lockout_debugging_only_report(id INTEGER NOT NULL,starting_time INTEGER NOT NULL,duration INTEGER NOT NULL,PRIMARY KEY(id));
+CREATE TABLE cooldown_debugging_only_report(origin TEXT NOT NULL,starting_time INTEGER NOT NULL,type INTEGER NOT NULL,PRIMARY KEY(origin));
+CREATE TABLE bidding_and_auction_server_keys(coordinator TEXT NOT NULL,keys BLOB NOT NULL,expiration INTEGER NOT NULL,PRIMARY KEY(coordinator));
+CREATE INDEX interest_group_expiration ON interest_groups(expiration DESC, owner, name);
+CREATE INDEX interest_group_owner ON interest_groups(owner,expiration DESC,next_update_after ASC,name);
+CREATE INDEX interest_group_owner_and_type ON interest_groups(LENGTH(additional_bid_key) == 0,owner,expiration DESC,name);
+CREATE INDEX interest_group_owner_size ON interest_groups(owner,expiration DESC,storage_size);
+CREATE INDEX interest_group_joining_origin ON interest_groups(joining_origin, expiration DESC, owner, name);
+CREATE INDEX k_anon_last_server_time_idx ON joined_k_anon(last_reported_to_anon_server_time DESC);
+CREATE INDEX win_history_index ON win_history(owner,name,win_time DESC);
+COMMIT;
diff --git a/content/test/gpu/gpu_tests/trace_integration_test.py b/content/test/gpu/gpu_tests/trace_integration_test.py
index dc4cbe2..90cba6d1 100644
--- a/content/test/gpu/gpu_tests/trace_integration_test.py
+++ b/content/test/gpu/gpu_tests/trace_integration_test.py
@@ -114,7 +114,8 @@
 _GET_STATISTICS_EVENT_NAME = 'GetFrameStatisticsMedia'
 _SWAP_CHAIN_PRESENT_EVENT_NAME = 'SwapChain::Present'
 _BEGIN_OVERLAY_ACCESS_EVENT_NAME = 'SkiaOutputDeviceDComp::BeginOverlayAccess'
-_PRESENT_SWAP_CHAIN_EVENT_NAME = 'IDXGISwapChain1::Present1'
+_PRESENT_SWAP_CHAIN_EVENT_NAME =\
+    'DXGISwapChainImageBacking::Present'
 
 _HTML_CANVAS_NOTIFY_LISTENERS_CANVAS_CHANGED_EVENT_NAME =\
     'HTMLCanvasElement::NotifyListenersCanvasChanged'
diff --git a/content/test/mock_widget.cc b/content/test/mock_widget.cc
index 0febd0d..7ac5fc24 100644
--- a/content/test/mock_widget.cc
+++ b/content/test/mock_widget.cc
@@ -86,10 +86,9 @@
 
 void MockWidget::CancelSuccessfulPresentationTimeRequest() {}
 
-void MockWidget::SetupRenderInputRouterConnections(
+void MockWidget::SetupBrowserRenderInputRouterConnections(
     mojo::PendingReceiver<blink::mojom::RenderInputRouterClient>
-        browser_request,
-    mojo::PendingReceiver<blink::mojom::RenderInputRouterClient> viz_request) {
+        browser_request) {
   input_receiver_.Bind(std::move(browser_request));
 }
 
diff --git a/content/test/mock_widget.h b/content/test/mock_widget.h
index e895ad8..08d0af3a 100644
--- a/content/test/mock_widget.h
+++ b/content/test/mock_widget.h
@@ -71,11 +71,9 @@
       blink::mojom::RecordContentToVisibleTimeRequestPtr visible_time_request)
       override;
   void CancelSuccessfulPresentationTimeRequest() override;
-  void SetupRenderInputRouterConnections(
+  void SetupBrowserRenderInputRouterConnections(
       mojo::PendingReceiver<blink::mojom::RenderInputRouterClient>
-          browser_request,
-      mojo::PendingReceiver<blink::mojom::RenderInputRouterClient> viz_request)
-      override;
+          browser_request) override;
 
  private:
   std::optional<bool> is_hidden_;
diff --git a/content/web_test/browser/devtools_protocol_test_bindings.cc b/content/web_test/browser/devtools_protocol_test_bindings.cc
index 11cc85f..2899fd0 100644
--- a/content/web_test/browser/devtools_protocol_test_bindings.cc
+++ b/content/web_test/browser/devtools_protocol_test_bindings.cc
@@ -27,7 +27,7 @@
 #include "content/web_test/common/web_test_switches.h"
 #include "ipc/ipc_channel.h"
 
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
 #include "content/public/browser/devtools_frontend_host.h"
 #endif
 
@@ -95,7 +95,7 @@
 
 void DevToolsProtocolTestBindings::ReadyToCommitNavigation(
     NavigationHandle* navigation_handle) {
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
   content::RenderFrameHost* frame = navigation_handle->GetRenderFrameHost();
   if (frame->GetParent())
     return;
diff --git a/content/web_test/browser/devtools_protocol_test_bindings.h b/content/web_test/browser/devtools_protocol_test_bindings.h
index e8506000..d0eaba8 100644
--- a/content/web_test/browser/devtools_protocol_test_bindings.h
+++ b/content/web_test/browser/devtools_protocol_test_bindings.h
@@ -45,7 +45,7 @@
   void HandleMessageFromTest(base::Value::Dict message);
 
   scoped_refptr<DevToolsAgentHost> agent_host_;
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA)
   // DevToolsFrontendHost does not exist on Android and iOS, but we also don't
   // run web tests natively on Android.
   std::unique_ptr<DevToolsFrontendHost> frontend_host_;
diff --git a/docs/clang.md b/docs/clang.md
index 3886bc7a..d9cb1fb 100644
--- a/docs/clang.md
+++ b/docs/clang.md
@@ -28,13 +28,11 @@
 
 1.  Run `./tools/clang/scripts/build.py --without-android --without-fuchsia`
     to build the plugin.
-1.  Run `ninja -C third_party/llvm-build/Release+Asserts/` to build incrementally.
-1.  Build with clang like described above, but, if you use reclient, disable it.
-
-To test the FindBadConstructs plugin, run:
-
-    (cd tools/clang/plugins/tests && \
-     ./test.py ../../../../third_party/llvm-build/Release+Asserts/bin/clang)
+1.  Run `ninja -C third_party/llvm-build/Release+Asserts/` to build
+    incrementally after making changes.
+1.  Run `(cd tools/clang/plugins/tests && ./test.py ../../../../third_party/llvm-build/Release+Asserts/bin/clang)`
+    to test the plugin after making changes.
+1.  Build Chromium with clang as usual, but, if you use reclient, disable it.
 
 Since the plugin is rolled with clang changes, behavior changes to the plugin
 should be guarded by flags to make it easy to roll clang. A general outline:
diff --git a/docs/rust-unsafe.md b/docs/rust-unsafe.md
index 055e4d5e..4e1e2daf 100644
--- a/docs/rust-unsafe.md
+++ b/docs/rust-unsafe.md
@@ -2,9 +2,9 @@
 
 ## Code Review Policy {#code-review-policy}
 
-All `unsafe` Rust code in Chromium needs to be reviewed and LGTM-ed by a member
-of the `unsafe-rust-in-chrome@google.com` group and the review must be cc'd to
-the group for visibility.  This policy applies to both third-party code
+All `unsafe` Rust code in Chromium needs to be reviewed and LGTM-ed by a
+reviewer from `//third_party/rust/UNSAFE_RUST_OWNERS`.
+This policy applies to both third-party code
 (e.g. under `//third_party/rust`) and first-party code.
 
 ### How to request a review
@@ -22,7 +22,7 @@
 
 Note that changes _anywhere_ in a crate that uses `unsafe` blocks may violate
 the internal invariants on which those `unsafe` blocks rely. It is unrealistic
-to require a `unsafe-rust-in-chrome@google.com` review to re-audit all the
+to require an `unsafe` review to re-audit all the
 `unsafe` blocks each time a crate is updated, but the crate `OWNERS` and other
 reviewers should be on the lookout for code changes which feel as though they
 could affect invariants on which `unsafe` blocks rely.
diff --git a/docs/website b/docs/website
index 4e4b610..149dc09 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit 4e4b61042e75761a43c8e29387c1f19a35b028f9
+Subproject commit 149dc09722d54254101f23b50b6641ba4c41f3ad
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 17632609..4a9b3ae 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -91,6 +91,24 @@
 
 namespace {
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+//
+// LINT.IfChange(ProxyDecisionDetailsForExtension)
+enum class ProxyDecisionDetailsForExtension {
+  // Proxy will be used only for WebRequest* permissions.
+  kOnlyForWebRequest = 0,
+  // Proxy will be used only for Declarative{Web|Net}Request* permissions.
+  kOnlyForDeclarativeRequest = 1,
+  // Proxy will be used only for WebView permissions.
+  kOnlyForWebView = 2,
+  // Proxy will be used only for multiple kinds of permissions.
+  kForMixedReasons = 3,
+
+  kMaxValue = kForMixedReasons,
+};
+// LINT.ThenChange(/tools/metrics/histograms/metadata/extensions/enums.xml:WebRequestProxyDecisionDetailsForExtension)
+
 // Converts an HttpHeaders dictionary to a |name|, |value| pair. Returns
 // true if successful.
 bool FromHeaderDictionary(const base::Value::Dict& header_value,
@@ -425,6 +443,30 @@
   base::UmaHistogramExactLinear(
       "Extensions.WebRequest.WebViewDependentExtensionCount",
       web_view_extension_count_, kMaxCount);
+
+  if (decision == ProxyDecision::kWillProxyForExtension &&
+      !base::FeatureList::IsEnabled(
+          extensions_features::kForceWebRequestProxyForTest)) {
+    // Check if kWillProxyForExtension is decided only for one type of
+    // permissions, or mixed reasons.
+    ProxyDecisionDetailsForExtension details =
+        ProxyDecisionDetailsForExtension::kForMixedReasons;
+    if (web_request_extension_count_ == 0 &&
+        declarative_request_extension_count_ == 0) {
+      CHECK_NE(web_view_extension_count_, 0);
+      details = ProxyDecisionDetailsForExtension::kOnlyForWebView;
+    } else if (web_view_extension_count_ == 0 &&
+               declarative_request_extension_count_ == 0) {
+      CHECK_NE(web_request_extension_count_, 0);
+      details = ProxyDecisionDetailsForExtension::kOnlyForWebRequest;
+    } else if (web_request_extension_count_ == 0 &&
+               web_view_extension_count_ == 0) {
+      CHECK_NE(declarative_request_extension_count_, 0);
+      details = ProxyDecisionDetailsForExtension::kOnlyForDeclarativeRequest;
+    }
+    base::UmaHistogramEnumeration(
+        "Extensions.WebRequest.ProxyDecisionDetailsForExtension", details);
+  }
   return decision != ProxyDecision::kWillNotProxy;
 }
 
diff --git a/extensions/browser/extension_dialog_auto_confirm.cc b/extensions/browser/extension_dialog_auto_confirm.cc
index 9787cf1..eafb11ce1 100644
--- a/extensions/browser/extension_dialog_auto_confirm.cc
+++ b/extensions/browser/extension_dialog_auto_confirm.cc
@@ -2,28 +2,24 @@
 // 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 "extensions/browser/extension_dialog_auto_confirm.h"
 
-#include <cstring>
+#include <string>
 #include <utility>
 
-#include "base/check.h"
+#include "base/lazy_instance.h"
 
 namespace extensions {
 
 namespace {
+
 ScopedTestDialogAutoConfirm::AutoConfirm g_extension_dialog_auto_confirm_value =
     ScopedTestDialogAutoConfirm::NONE;
-// Since |g_extension_dialog_justification| is global, type char[] is used
-// instead of std::string to ensure trivial destruction. Note that its size is
-// currently hard-coded as it's only used for testing purposes.
-char g_extension_dialog_justification[20];
-}
+
+base::LazyInstance<std::string>::DestructorAtExit
+    g_extension_dialog_justification = LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
 
 ScopedTestDialogAutoConfirm::ScopedTestDialogAutoConfirm(
     ScopedTestDialogAutoConfirm::AutoConfirm override_confirm_value)
@@ -33,7 +29,7 @@
 
 ScopedTestDialogAutoConfirm::~ScopedTestDialogAutoConfirm() {
   g_extension_dialog_auto_confirm_value = old_auto_confirm_value_;
-  std::strcpy(g_extension_dialog_justification, old_justification_.c_str());
+  g_extension_dialog_justification.Get() = old_justification_.c_str();
 }
 
 // static
@@ -44,14 +40,13 @@
 
 // static
 std::string ScopedTestDialogAutoConfirm::GetJustification() {
-  return g_extension_dialog_justification;
+  return g_extension_dialog_justification.Get();
 }
 
 void ScopedTestDialogAutoConfirm::set_justification(
     const std::string& justification) {
-  DCHECK(sizeof(g_extension_dialog_justification) > justification.length());
-  old_justification_.assign(g_extension_dialog_justification);
-  std::strcpy(g_extension_dialog_justification, justification.c_str());
+  old_justification_.assign(g_extension_dialog_justification.Get());
+  g_extension_dialog_justification.Get() = justification;
 }
 
 }  // namespace extensions
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h
index e04f73b..76f9cd78 100644
--- a/extensions/browser/extension_event_histogram_value.h
+++ b/extensions/browser/extension_event_histogram_value.h
@@ -14,6 +14,8 @@
 //  the end of the list, just prior to ENUM_BOUNDARY.
 //
 // Long version: See extension_function_histogram_value.h
+//
+// LINT.IfChange(HistogramValue)
 enum HistogramValue {
   UNKNOWN = 0,
 
@@ -588,6 +590,7 @@
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
 };
+// LINT.ThenChange(//tools/metrics/histograms/metadata/extensions/enums.xml:ExtensionEvents)
 
 }  // namespace events
 }  // namespace extensions
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 2ba987b..f441fdf3 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -56,6 +56,7 @@
 //         above. This will effectively deprecate the old histogram stream and
 //         creates a new one for the new function name.
 //
+// LINT.IfChange(HistogramValue)
 enum HistogramValue {
   UNKNOWN = 0,
   WEBNAVIGATION_GETALLFRAMES = 1,
@@ -1987,6 +1988,7 @@
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
 };
+// LINT.ThenChange(//tools/metrics/histograms/metadata/extensions/enums.xml:ExtensionFunctions)
 
 }  // namespace extensions::functions
 
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index af1bdf3d..f6e753a 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -240,6 +240,7 @@
         "chrome://assistant-optin/*",
         "chrome://extensions/*",
         "chrome://glic/*",
+        "chrome://glic-fre/*",
         "chrome://graduation/*",
         "chrome://home/*",
         "chrome://chrome-signin/*",
@@ -845,6 +846,7 @@
       "chrome://chrome-signin/*",
       "chrome://discards/*",
       "chrome://glic/*",
+      "chrome://glic-fre/*",
       "chrome://graduation/*",
       "chrome://home/*",
       "chrome://mobilesetup/*",
@@ -890,6 +892,7 @@
       "chrome://chrome-signin/*",
       "chrome://discards/*",
       "chrome://glic/*",
+      "chrome://glic-fre/*",
       "chrome://graduation/*",
       "chrome://home/*",
       "chrome://mobilesetup/*",
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc
index 3557688..364496c 100644
--- a/extensions/common/extension_features.cc
+++ b/extensions/common/extension_features.cc
@@ -44,10 +44,6 @@
              "ApiOdfsConfigPrivate",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-BASE_FEATURE(kApiEnterpriseReportingPrivateReportDataMaskingEvent,
-             "ApiEnterpriseReportingPrivateReportDataMaskingEvent",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 ///////////////////////////////////////////////////////////////////////////////
 // Other Features
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h
index 61bf7adf..361e361 100644
--- a/extensions/common/extension_features.h
+++ b/extensions/common/extension_features.h
@@ -64,10 +64,6 @@
 // Controls the availability of the odfsConfigPrivate API.
 BASE_DECLARE_FEATURE(kApiOdfsConfigPrivate);
 
-// If enabled, allows using the
-// `enterprise.reportingPrivate.reportDataMaskingEvent` API.
-BASE_DECLARE_FEATURE(kApiEnterpriseReportingPrivateReportDataMaskingEvent);
-
 ///////////////////////////////////////////////////////////////////////////////
 // Other Features
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/extensions/common/features/feature_flags.cc b/extensions/common/features/feature_flags.cc
index 87ed782..ff1d45d 100644
--- a/extensions/common/features/feature_flags.cc
+++ b/extensions/common/features/feature_flags.cc
@@ -30,7 +30,6 @@
     &extensions_features::kExperimentalOmniboxLabs,
     &extensions_features::kExtensionIconVariants,
     &extensions_features::kTelemetryExtensionPendingApprovalApi,
-    &extensions_features::kApiEnterpriseReportingPrivateReportDataMaskingEvent,
 };
 
 constinit base::span<const base::Feature*> g_feature_flags_test_override;
diff --git a/gin/BUILD.gn b/gin/BUILD.gn
index 3a5e7d1..f01c47b 100644
--- a/gin/BUILD.gn
+++ b/gin/BUILD.gn
@@ -154,7 +154,7 @@
     }
   }
 
-  if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     android_assets("v8_snapshot_secondary_abi_assets") {
       # only import asset when v8_use_external_startup_data == true
       # like "v8_snapshot_assets" above
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index 2c943b1..527dc94 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -154,23 +154,6 @@
   return context->makeRecorder(options);
 }
 
-// Used to represent Skia backend type for UMA.
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class SkiaBackendType {
-  kUnknown = 0,
-  kNone = 1,
-  kGaneshGL = 2,
-  kGaneshVulkan = 3,
-  kGraphiteDawnVulkan = 4,
-  kGraphiteDawnMetal = 5,
-  kGraphiteDawnD3D11 = 6,
-  kGraphiteDawnD3D12 = 7,
-  // It's not clear what granularity of kGraphiteDawnGL* backend dawn will
-  // provided yet so those values are to be added later.
-  kMaxValue = kGraphiteDawnD3D12
-};
-
 SkiaBackendType FindSkiaBackendType(SharedContextState* context) {
   switch (context->gr_context_type()) {
     case gpu::GrContextType::kNone:
@@ -209,28 +192,6 @@
   return SkiaBackendType::kUnknown;
 }
 
-std::string SkiaBackendTypeToString(SkiaBackendType type) {
-  switch (type) {
-    case SkiaBackendType::kUnknown:
-      return "Unknown";
-    case SkiaBackendType::kNone:
-      return "None";
-    case SkiaBackendType::kGaneshGL:
-      return "GaneshGL";
-    case SkiaBackendType::kGaneshVulkan:
-      return "GaneshVulkan";
-    case SkiaBackendType::kGraphiteDawnVulkan:
-      return "GraphiteDawnVulkan";
-    case SkiaBackendType::kGraphiteDawnMetal:
-      return "GraphiteDawnMetal";
-    case SkiaBackendType::kGraphiteDawnD3D11:
-      return "GraphiteDawnD3D11";
-    case SkiaBackendType::kGraphiteDawnD3D12:
-      return "GraphiteDawnD3D12";
-  }
-  NOTREACHED();
-}
-
 GLsizeiptr APIENTRY GLBlobCacheGetCallback(const void* key,
                                            GLsizeiptr key_size,
                                            void* value,
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
index 80215d4..443ef1d1 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
@@ -1208,15 +1208,15 @@
 
 bool D3DImageBacking::PresentSwapChain() {
   AutoLock auto_lock(this);
-  TRACE_EVENT0("gpu", "D3DImageBacking::PresentSwapChain");
   if (!swap_chain_ || !is_back_buffer_) {
     LOG(ERROR) << "Backing does not correspond to back buffer of swap chain";
     return false;
   }
 
+  TRACE_EVENT1("gpu", "D3DImageBacking::PresentSwapChain", "has_alpha",
+               !SkAlphaTypeIsOpaque(alpha_type()));
   constexpr UINT kFlags = DXGI_PRESENT_ALLOW_TEARING;
   constexpr DXGI_PRESENT_PARAMETERS kParams = {};
-
   HRESULT hr = swap_chain_->Present1(/*interval=*/0, kFlags, &kParams);
   if (FAILED(hr)) {
     LOG(ERROR) << "Present1 failed with error " << std::hex << hr;
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
index 5fa7685..4fd6159 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
@@ -173,6 +173,8 @@
     SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE |
     SHARED_IMAGE_USAGE_WEBGPU_SHARED_BUFFER;
 
+const char* kD3DImageBackingLabel = "D3DImageBacking";
+
 }  // anonymous namespace
 
 D3DImageBackingFactory::D3DImageBackingFactory(
@@ -323,6 +325,8 @@
     return {nullptr, nullptr};
   }
 
+  gl::LabelSwapChainAndBuffers(swap_chain.Get(), kD3DImageBackingLabel);
+
   if (gl::DXGIWaitableSwapChainEnabled()) {
     Microsoft::WRL::ComPtr<IDXGISwapChain3> swap_chain3;
     if (SUCCEEDED(swap_chain.As(&swap_chain3))) {
diff --git a/gpu/command_buffer/service/shared_image/dxgi_swap_chain_image_backing.cc b/gpu/command_buffer/service/shared_image/dxgi_swap_chain_image_backing.cc
index 812ce70..9b43a41 100644
--- a/gpu/command_buffer/service/shared_image/dxgi_swap_chain_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/dxgi_swap_chain_image_backing.cc
@@ -42,7 +42,7 @@
 
 namespace {
 const char* kDXGISwapChainImageBackingLabel = "DXGISwapChainImageBacking";
-}  // namespace
+}  // anonymous namespace
 
 // static
 std::unique_ptr<DXGISwapChainImageBacking> DXGISwapChainImageBacking::Create(
@@ -270,7 +270,7 @@
                       : 1;
   UINT flags = use_swap_chain_tearing ? DXGI_PRESENT_ALLOW_TEARING : 0;
 
-  TRACE_EVENT2("gpu", "IDXGISwapChain1::Present1", "has_alpha",
+  TRACE_EVENT2("gpu", "DXGISwapChainImageBacking::Present", "has_alpha",
                !SkAlphaTypeIsOpaque(alpha_type()), "dirty_rect",
                pending_swap_rect_->ToString());
   DXGI_PRESENT_PARAMETERS params = {};
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
index a346984..88e765a 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
@@ -27,21 +27,6 @@
 
 namespace {
 
-// Serves as killswitch for rolling out restriction of SCANOUT support to
-// Fuchsia.
-// TODO(crbug.com/330865436): Eliminate post safe-rollout.
-BASE_FEATURE(kRestrictExternalVkImageBackingScanoutSupportToFuchsia,
-             "RestrictExternalVkImageBackingScanoutSupportToFuchsia",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
-// Determines whether SCANOUT support can be restricted to Fuchsia.
-// TODO(crbug.com/330865436): Eliminate once killswitches checked within this
-// function roll out safely.
-bool RestrictScanoutSupportToFuchsia() {
-  return base::FeatureList::IsEnabled(
-      kRestrictExternalVkImageBackingScanoutSupportToFuchsia);
-}
-
 VkImageUsageFlags GetMaximalImageUsageFlags(
     VkFormatFeatureFlags feature_flags) {
   VkImageUsageFlags usage_flags = 0;
@@ -172,13 +157,9 @@
       SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_CPU_UPLOAD |
       SHARED_IMAGE_USAGE_CPU_WRITE_ONLY;
 
-  if (RestrictScanoutSupportToFuchsia()) {
 #if BUILDFLAG(IS_FUCHSIA)
-    supported_usage |= SHARED_IMAGE_USAGE_SCANOUT;
+  supported_usage |= SHARED_IMAGE_USAGE_SCANOUT;
 #endif
-  } else {
-    supported_usage |= SHARED_IMAGE_USAGE_SCANOUT;
-  }
 
   return supported_usage;
 }
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc
index 87afe031..546b9c0e 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc
@@ -20,19 +20,6 @@
 namespace gpu {
 namespace {
 
-// Serves as reverse-killswitch for rolling out elimination of SCANOUT support.
-// TODO(crbug.com/330865436): Eliminate post safe-rollout.
-BASE_FEATURE(kSupportScanoutInGLTextureImageBacking,
-             "SupportScanoutInGLTextureImageBacking",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
-// Determines whether to support SCANOUT.
-// TODO(crbug.com/330865436): Eliminate once killswitches checked within this
-// function roll out safely.
-bool SupportScanout() {
-  return base::FeatureList::IsEnabled(kSupportScanoutInGLTextureImageBacking);
-}
-
 constexpr SharedImageUsageSet kWebGPUUsages =
     SHARED_IMAGE_USAGE_WEBGPU_READ | SHARED_IMAGE_USAGE_WEBGPU_WRITE |
     SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE |
@@ -44,7 +31,7 @@
     SHARED_IMAGE_USAGE_DISPLAY_WRITE | SHARED_IMAGE_USAGE_DISPLAY_READ |
     SHARED_IMAGE_USAGE_RASTER_READ | SHARED_IMAGE_USAGE_RASTER_WRITE |
     SHARED_IMAGE_USAGE_RASTER_OVER_GLES2_ONLY |
-    SHARED_IMAGE_USAGE_OOP_RASTERIZATION | SHARED_IMAGE_USAGE_SCANOUT |
+    SHARED_IMAGE_USAGE_OOP_RASTERIZATION |
     SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE |
     SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_CPU_UPLOAD |
     kWebGPUUsages;
@@ -127,36 +114,12 @@
   if (gmb_type != gfx::EMPTY_BUFFER) {
     return false;
   }
-  if (usage.Has(SHARED_IMAGE_USAGE_SCANOUT) && !SupportScanout()) {
-    return false;
-  }
 
   if (usage.Has(SHARED_IMAGE_USAGE_CPU_UPLOAD)) {
     if (!supports_cpu_upload_ ||
         !GLTextureImageBacking::SupportsPixelUploadWithFormat(format)) {
       return false;
     }
-
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
-    // GLTextureImageBacking can't actually support scanout on any platform.
-    // Historically GLImageBacking did accept scanout usage for shared memory
-    // GpuMemoryBuffers which is still replied upon for the following:
-    // - Linux and Chrome OS on X11 have no real scanout support but clients add
-    //   the usage.
-    // - Windows can upload pixels directly from shared memory to a D3D swap
-    //   chain for overlays.
-    // TODO(crbug.com/330865436): Eliminate this code once the above
-    // unconditional rejection of SCANOUT usage rolls out definitively.
-    if (usage.Has(SHARED_IMAGE_USAGE_SCANOUT)) {
-      return false;
-    }
-#endif
-  } else {
-    // TODO(crbug.com/330865436): Eliminate this code once the above
-    // unconditional rejection of SCANOUT usage rolls out definitively.
-    if (usage.Has(SHARED_IMAGE_USAGE_SCANOUT)) {
-      return false;
-    }
   }
 
   // This is not beneficial on iOS. The main purpose of this is a multi-gpu
diff --git a/gpu/config/gpu_info.cc b/gpu/config/gpu_info.cc
index c9b0ba15..808abc8b 100644
--- a/gpu/config/gpu_info.cc
+++ b/gpu/config/gpu_info.cc
@@ -294,6 +294,7 @@
     std::string machine_model_name;
     std::string machine_model_version;
     std::string display_type;
+    SkiaBackendType skia_backend_type;
     std::string gl_version;
     std::string gl_vendor;
     std::string gl_renderer;
@@ -362,6 +363,8 @@
   enumerator->AddString("vertexShaderVersion", vertex_shader_version);
   enumerator->AddString("maxMsaaSamples", max_msaa_samples);
   enumerator->AddString("displayType", display_type);
+  enumerator->AddString("skiaBackendType",
+                        SkiaBackendTypeToString(skia_backend_type));
   enumerator->AddString("glVersion", gl_version);
   enumerator->AddString("glVendor", gl_vendor);
   enumerator->AddString("glRenderer", gl_renderer);
diff --git a/gpu/config/gpu_info.h b/gpu/config/gpu_info.h
index f1cb8648..e181407 100644
--- a/gpu/config/gpu_info.h
+++ b/gpu/config/gpu_info.h
@@ -20,6 +20,7 @@
 #include "base/time/time.h"
 #include "base/version.h"
 #include "build/build_config.h"
+#include "gpu/config/gpu_preferences.h"
 #include "gpu/gpu_export.h"
 #include "gpu/vulkan/buildflags.h"
 #include "ui/gfx/geometry/size.h"
@@ -392,6 +393,9 @@
   // The DisplayType requested from ANGLE.
   std::string display_type;
 
+  // Skia Backend used for rendering and compositing.
+  SkiaBackendType skia_backend_type = SkiaBackendType::kNone;
+
   // The GL_VERSION string.
   std::string gl_version;
 
diff --git a/gpu/config/gpu_preferences.cc b/gpu/config/gpu_preferences.cc
index bbf7bc8..663ce2ff 100644
--- a/gpu/config/gpu_preferences.cc
+++ b/gpu/config/gpu_preferences.cc
@@ -72,7 +72,29 @@
     case GrContextType::kGraphiteMetal:
       return "GraphiteMetal";
   }
-  NOTREACHED();
+  NOTREACHED() << "GrContextType=" << static_cast<int>(type);
+}
+
+std::string SkiaBackendTypeToString(SkiaBackendType type) {
+  switch (type) {
+    case SkiaBackendType::kUnknown:
+      return "Unknown";
+    case SkiaBackendType::kNone:
+      return "None";
+    case SkiaBackendType::kGaneshGL:
+      return "GaneshGL";
+    case SkiaBackendType::kGaneshVulkan:
+      return "GaneshVulkan";
+    case SkiaBackendType::kGraphiteDawnVulkan:
+      return "GraphiteDawnVulkan";
+    case SkiaBackendType::kGraphiteDawnMetal:
+      return "GraphiteDawnMetal";
+    case SkiaBackendType::kGraphiteDawnD3D11:
+      return "GraphiteDawnD3D11";
+    case SkiaBackendType::kGraphiteDawnD3D12:
+      return "GraphiteDawnD3D12";
+  }
+  NOTREACHED() << "SkiaBackendType=" << static_cast<int>(type);
 }
 
 GpuPreferences::GpuPreferences() = default;
diff --git a/gpu/config/gpu_preferences.h b/gpu/config/gpu_preferences.h
index 3b2f253..4cfc206e 100644
--- a/gpu/config/gpu_preferences.h
+++ b/gpu/config/gpu_preferences.h
@@ -70,6 +70,25 @@
 
 GPU_EXPORT std::string GrContextTypeToString(GrContextType type);
 
+// Used to represent the Skia backend that the GPU process has initialized.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class SkiaBackendType {
+  kUnknown = 0,
+  kNone = 1,
+  kGaneshGL = 2,
+  kGaneshVulkan = 3,
+  kGraphiteDawnVulkan = 4,
+  kGraphiteDawnMetal = 5,
+  kGraphiteDawnD3D11 = 6,
+  kGraphiteDawnD3D12 = 7,
+  // It's not clear what granularity of kGraphiteDawnGL* backend dawn will
+  // provided yet so those values are to be added later.
+  kMaxValue = kGraphiteDawnD3D12
+};
+
+GPU_EXPORT std::string SkiaBackendTypeToString(SkiaBackendType type);
+
 enum class DawnBackendValidationLevel : uint32_t {
   kDisabled = 0,
   kPartial = 1,
diff --git a/gpu/ipc/common/gpu_info.mojom b/gpu/ipc/common/gpu_info.mojom
index 3555ebb..2b6b4793 100644
--- a/gpu/ipc/common/gpu_info.mojom
+++ b/gpu/ipc/common/gpu_info.mojom
@@ -37,6 +37,18 @@
   gl.mojom.GpuPreference gpu_preference;
 };
 
+// gpu::SkiaBackendType
+enum SkiaBackendType {
+  kUnknown,
+  kNone,
+  kGaneshGL,
+  kGaneshVulkan,
+  kGraphiteDawnVulkan,
+  kGraphiteDawnMetal,
+  kGraphiteDawnD3D11,
+  kGraphiteDawnD3D12,
+};
+
 // gpu::VideoCodecProfile
 enum VideoCodecProfile {
   VIDEO_CODEC_PROFILE_UNKNOWN = -1,
@@ -174,6 +186,7 @@
   string machine_model_name;
   string machine_model_version;
   string display_type;
+  SkiaBackendType skia_backend_type;
   string gl_version;
   string gl_vendor;
   string gl_renderer;
diff --git a/gpu/ipc/common/gpu_info_mojom_traits.cc b/gpu/ipc/common/gpu_info_mojom_traits.cc
index 956ec7d9..d27441a 100644
--- a/gpu/ipc/common/gpu_info_mojom_traits.cc
+++ b/gpu/ipc/common/gpu_info_mojom_traits.cc
@@ -38,6 +38,64 @@
 }
 
 // static
+gpu::mojom::SkiaBackendType
+EnumTraits<gpu::mojom::SkiaBackendType, gpu::SkiaBackendType>::ToMojom(
+    gpu::SkiaBackendType type) {
+  switch (type) {
+    case gpu::SkiaBackendType::kUnknown:
+      return gpu::mojom::SkiaBackendType::kUnknown;
+    case gpu::SkiaBackendType::kNone:
+      return gpu::mojom::SkiaBackendType::kNone;
+    case gpu::SkiaBackendType::kGaneshGL:
+      return gpu::mojom::SkiaBackendType::kGaneshGL;
+    case gpu::SkiaBackendType::kGaneshVulkan:
+      return gpu::mojom::SkiaBackendType::kGaneshVulkan;
+    case gpu::SkiaBackendType::kGraphiteDawnVulkan:
+      return gpu::mojom::SkiaBackendType::kGraphiteDawnVulkan;
+    case gpu::SkiaBackendType::kGraphiteDawnMetal:
+      return gpu::mojom::SkiaBackendType::kGraphiteDawnMetal;
+    case gpu::SkiaBackendType::kGraphiteDawnD3D11:
+      return gpu::mojom::SkiaBackendType::kGraphiteDawnD3D11;
+    case gpu::SkiaBackendType::kGraphiteDawnD3D12:
+      return gpu::mojom::SkiaBackendType::kGraphiteDawnD3D12;
+  }
+  NOTREACHED() << "Invalid SkiaBackendType:" << static_cast<int>(type);
+}
+
+// static
+bool EnumTraits<gpu::mojom::SkiaBackendType, gpu::SkiaBackendType>::FromMojom(
+    gpu::mojom::SkiaBackendType input,
+    gpu::SkiaBackendType* out) {
+  switch (input) {
+    case gpu::mojom::SkiaBackendType::kUnknown:
+      *out = gpu::SkiaBackendType::kUnknown;
+      return true;
+    case gpu::mojom::SkiaBackendType::kNone:
+      *out = gpu::SkiaBackendType::kNone;
+      return true;
+    case gpu::mojom::SkiaBackendType::kGaneshGL:
+      *out = gpu::SkiaBackendType::kGaneshGL;
+      return true;
+    case gpu::mojom::SkiaBackendType::kGaneshVulkan:
+      *out = gpu::SkiaBackendType::kGaneshVulkan;
+      return true;
+    case gpu::mojom::SkiaBackendType::kGraphiteDawnVulkan:
+      *out = gpu::SkiaBackendType::kGraphiteDawnVulkan;
+      return true;
+    case gpu::mojom::SkiaBackendType::kGraphiteDawnMetal:
+      *out = gpu::SkiaBackendType::kGraphiteDawnMetal;
+      return true;
+    case gpu::mojom::SkiaBackendType::kGraphiteDawnD3D11:
+      *out = gpu::SkiaBackendType::kGraphiteDawnD3D11;
+      return true;
+    case gpu::mojom::SkiaBackendType::kGraphiteDawnD3D12:
+      *out = gpu::SkiaBackendType::kGraphiteDawnD3D12;
+      return true;
+  }
+  return false;
+}
+
+// static
 gpu::mojom::VideoCodecProfile
 EnumTraits<gpu::mojom::VideoCodecProfile, gpu::VideoCodecProfile>::ToMojom(
     gpu::VideoCodecProfile video_codec_profile) {
@@ -519,6 +577,7 @@
          data.ReadMachineModelName(&out->machine_model_name) &&
          data.ReadMachineModelVersion(&out->machine_model_version) &&
          data.ReadDisplayType(&out->display_type) &&
+         data.ReadSkiaBackendType(&out->skia_backend_type) &&
          data.ReadGlVersion(&out->gl_version) &&
          data.ReadGlVendor(&out->gl_vendor) &&
          data.ReadGlRenderer(&out->gl_renderer) &&
diff --git a/gpu/ipc/common/gpu_info_mojom_traits.h b/gpu/ipc/common/gpu_info_mojom_traits.h
index b3dc751..75dc95b 100644
--- a/gpu/ipc/common/gpu_info_mojom_traits.h
+++ b/gpu/ipc/common/gpu_info_mojom_traits.h
@@ -10,6 +10,7 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "gpu/config/gpu_info.h"
+#include "gpu/config/gpu_preferences.h"
 #include "gpu/gpu_export.h"
 #include "gpu/ipc/common/gpu_info.mojom.h"
 #include "ui/gfx/buffer_types.h"
@@ -81,6 +82,14 @@
 };
 
 template <>
+struct GPU_EXPORT EnumTraits<gpu::mojom::SkiaBackendType,
+                             gpu::SkiaBackendType> {
+  static gpu::mojom::SkiaBackendType ToMojom(gpu::SkiaBackendType type);
+  static bool FromMojom(gpu::mojom::SkiaBackendType input,
+                        gpu::SkiaBackendType* out);
+};
+
+template <>
 struct GPU_EXPORT
     EnumTraits<gpu::mojom::VideoCodecProfile, gpu::VideoCodecProfile> {
   static gpu::mojom::VideoCodecProfile ToMojom(
@@ -317,6 +326,10 @@
     return input.display_type;
   }
 
+  static gpu::SkiaBackendType skia_backend_type(const gpu::GPUInfo& input) {
+    return input.skia_backend_type;
+  }
+
   static const std::string& gl_version(const gpu::GPUInfo& input) {
     return input.gl_version;
   }
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md
index 6d08b4c..7647d0b 100644
--- a/infra/config/generated/cq-builders.md
+++ b/infra/config/generated/cq-builders.md
@@ -819,7 +819,7 @@
 
 ### chromium
 * [android-desktop-x64-rel](https://ci.chromium.org/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""android-desktop-x64-rel""))
-  * Experiment percentage: 30.0
+  * Experiment percentage: 60.0
 
 * [chromeos-js-coverage-rel](https://ci.chromium.org/p/chromium/builders/try/chromeos-js-coverage-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""chromeos-js-coverage-rel""))
   * Experiment percentage: 50.0
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 31a0140..f307e4c 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -1617,7 +1617,7 @@
       }
       builders {
         name: "chromium/try/android-desktop-x64-rel"
-        experiment_percentage: 30
+        experiment_percentage: 60
         location_filters {
           gerrit_host_regexp: ".*"
           gerrit_project_regexp: ".*"
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star
index 05e07660..1e34cf8 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star
@@ -119,7 +119,7 @@
     # are addressed
     # use_orchestrator_pool = True,
     tryjob = try_.job(
-        experiment_percentage = 30,
+        experiment_percentage = 60,
     ),
 )
 
diff --git a/internal b/internal
index 46b1cf7..3948f23 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 46b1cf7626d79babe4e023e377dd106b27a791c0
+Subproject commit 3948f2308234bf9aa8b8565ce5ed8d889cc5d139
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index 0a31dfc..1ceb9c6 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -755,12 +755,6 @@
       <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_DESCRIPTION" desc="Description for the alert dialog warning the user they are about to hide the parcel tracking module.">
           If you hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>", Chromium will no longer auto-track your future packages and will delete all your past package tracking data.
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen.">
-        Chromium will detect tracking numbers on sites you visit and show you package updates on the New Tab page. The package tracking number and website name will be sent to Chromium to provide this feature and to improve shopping features for everyone. You can update this anytime in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE" desc="Text for the title string of the parcel tracking opt-in half-sheet screen.">
-        Let Chromium help you track your packages
-      </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_TITLE" desc="Title of the password bottom sheet. [iOS only]">
           Google Password Manager
       </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1
deleted file mode 100644
index da3044e8..0000000
--- a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f7e023190ff065ccdc5d52bc79406027ed7dfcfb
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE.png.sha1
deleted file mode 100644
index 645af14..0000000
--- a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-05d2d39408b362e5572f8b50dce08261867dfc30
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index 25aac22..e9784d9 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -755,12 +755,6 @@
       <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_DESCRIPTION" desc="Description for the alert dialog warning the user they are about to hide the parcel tracking module.">
           If you hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>", Chrome will no longer auto-track your future packages and will delete all your past package tracking data.
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen.">
-        Chrome will detect tracking numbers on sites you visit and show you package updates on the New Tab page. The package tracking number and website name will be sent to Google to provide this feature and to improve Google shopping features for everyone. You can update this anytime in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE" desc="Text for the title string of the parcel tracking opt-in half-sheet screen.">
-        Let Chrome help you track your packages
-      </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_TITLE" desc="Title of the password bottom sheet. [iOS only]">
           Google Password Manager
       </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1
deleted file mode 100644
index da3044e8..0000000
--- a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f7e023190ff065ccdc5d52bc79406027ed7dfcfb
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE.png.sha1
deleted file mode 100644
index 7c3d351..0000000
--- a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5e9046486940177a297a52ca3a76b927a940f04b
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index b5ae41d..4f7fa962 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -3829,15 +3829,6 @@
       <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_TITLE" desc="Title for the alert dialog warning the user they are about to hide the parcel tracking module.">
           Hiding this card will turn off Package Tracking and remove all your data
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING" desc="Text for the button that allows the user to enable parcel tracking.">
-        Allow
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION" desc="Text for the primary action string of the parcel tracking opt-in half-sheet screen.">
-        Always track packages
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SECONDARY_ACTION" desc="Text for the secondary action string of the parcel tracking opt-in half-sheet screen.">
-        No thanks
-      </message>
       <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TERTIARY_ACTION" desc="Text for the tertiary action string of the parcel tracking opt-in half-sheet screen.">
         Ask me every time
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING.png.sha1
deleted file mode 100644
index f94d8bf..0000000
--- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5e9046486940177a297a52ca3a76b927a940f04b
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION.png.sha1
deleted file mode 100644
index 7c3d351..0000000
--- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5e9046486940177a297a52ca3a76b927a940f04b
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SECONDARY_ACTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SECONDARY_ACTION.png.sha1
deleted file mode 100644
index 629b07c..0000000
--- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SECONDARY_ACTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-45b7c596f7746c1e50ed0d2cb1c893649d3df873
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index 7424d071..a0ece27 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" />এ এতিয়া <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" />ত ছাইন ইন কৰিবলৈ Google Password Manager ব্যৱহাৰ কৰাৰ সময়ত আপোনাৰ ব্যৱহাৰকাৰীৰ নাম আৰু পাছৱৰ্ড ব্যৱহাৰ কৰিব পাৰিব।</translation>
 <translation id="5242899254250321823">ৱেবছাইটত পাছৱৰ্ড সলনি কৰক</translation>
 <translation id="5248640482715684545">এই ছাইটটোৱে বাৰে বাৰে অন্য এটা এপ্লিকেশ্বন খুলিবলৈ চেষ্টা কৰি আছে।</translation>
+<translation id="5250371859659394278">অজ্ঞাত উৎসৰ পৰা</translation>
 <translation id="5271265092610673171">{count,plural, =1{এটা আৱশ্যকীয় ক্ষেত্ৰ খালী হৈ আছে। ছেভ কৰাৰ আগতে এইটো পূৰ কৰক।}one{কিছুমান আৱশ্যকীয় ক্ষেত্ৰ খালী হৈ আছে। ছেভ কৰাৰ আগতে সেইবোৰ পূৰ কৰক।}other{কিছুমান আৱশ্যকীয় ক্ষেত্ৰ খালী হৈ আছে। ছেভ কৰাৰ আগতে সেইবোৰ পূৰ কৰক।}}</translation>
 <translation id="5271549068863921519">পাছৱৰ্ড ছেভ কৰক</translation>
 <translation id="5279214046729249716">হয়, সেয়া পৃথক কৰি ৰাখক</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 5cdc5e0b..84557d78 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> Google Parol Meneceri ilə <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> veb-saytına daxil olduqda istifadəçi adı və parolunuzdan istifadə edə bilər.</translation>
 <translation id="5242899254250321823">Veb-saytda parolu dəyişin</translation>
 <translation id="5248640482715684545">Bu sayt başqa tətbiq açmağa çalışır.</translation>
+<translation id="5250371859659394278">Naməlum mənbədən</translation>
 <translation id="5271265092610673171">{count,plural, =1{Lazımi sahə boşdur. Yadda saxlamazdan əvvəl doldurun.}other{Bəzi lazımi sahələr boşdur. Yadda saxlamazdan əvvəl doldurun.}}</translation>
 <translation id="5271549068863921519">Şifrəni yadda saxlayın</translation>
 <translation id="5279214046729249716">Bəli, ayrı saxlayın</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index d0d4f346..fb0fc821 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134">Google Password Manager ব্যবহার করে <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" />-এ সাইন-ইন করার সময় <ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> এখন আপনার ইউজারনেম ও পাসওয়ার্ড ব্যবহার করতে পারবেন।</translation>
 <translation id="5242899254250321823">ওয়েবসাইটে পাসওয়ার্ড পরিবর্তন করুন</translation>
 <translation id="5248640482715684545">এই সাইটটি অন্য একটি অ্যাপ্লিকেশন খোলার চেষ্টা করছে।</translation>
+<translation id="5250371859659394278">কোনও একটি অজানা সোর্স থেকে</translation>
 <translation id="5271265092610673171">{count,plural, =1{ফাঁকা রাখা যাবে না এমন ফিল্ড খালি আছে। সেভ করার আগে এটি পূরণ করুন।}one{ফাঁকা রাখা যাবে না এমন কিছু ফিল্ড খালি আছে। সেভ করার আগে সেগুলি পূরণ করুন।}other{ফাঁকা রাখা যাবে না এমন কিছু ফিল্ড খালি আছে। সেভ করার আগে সেগুলি পূরণ করুন।}}</translation>
 <translation id="5271549068863921519">পাসওয়ার্ড সেভ করুন</translation>
 <translation id="5279214046729249716">হ্যাঁ, এটি আলাদা রাখুন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
index a6bb179..0bc0246 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -429,6 +429,7 @@
 <translation id="2755485474385016903">Mae'r newidiadau a wneir yn cael eu gweld gan bawb yn y grŵp</translation>
 <translation id="2755595981383829244">Byddwch nawr yn derbyn hysbysiadau cynnwys</translation>
 <translation id="2761788987260570878">Tynnwch lun o'ch chwiliad</translation>
+<translation id="2761898608071930085">Defnyddio Cyfrif Arall</translation>
 <translation id="2762000892062317888">newydd ddigwydd</translation>
 <translation id="2772667768515195373">Gallwch ddefnyddio cyfeiriadau sydd wedi'u cadw ar draws cynhyrchion Google. Mae'r cyfeiriad hwn wedi'i gadw yn eich Cyfrif Google <ph name="USER_EMAIL" />.</translation>
 <translation id="2773344962924806829">Hysbysiadau e-bost</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 105a3d0..66c4784 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> kann jetzt deinen Nutzernamen und dein Passwort verwenden, um sich über den Google Passwortmanager auf <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> anzumelden.</translation>
 <translation id="5242899254250321823">Passwort auf der Website ändern</translation>
 <translation id="5248640482715684545">Diese Website versucht, eine andere App zu öffnen.</translation>
+<translation id="5250371859659394278">Von einer unbekannten Quelle</translation>
 <translation id="5271265092610673171">{count,plural, =1{Ein Pflichtfeld ist leer. Bitte fülle es vor dem Speichern aus.}other{Einige Pflichtfelder sind leer. Bitte fülle sie vor dem Speichern aus.}}</translation>
 <translation id="5271549068863921519">Passwort speichern</translation>
 <translation id="5279214046729249716">Ja, getrennt halten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index f9db0c60..6c1b2600 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> saab nüüd kasutada teie kasutajanime ja parooli, kui ta kasutab saidile <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> sisselogimiseks Google'i paroolihaldurit.</translation>
 <translation id="5242899254250321823">Muutke veebisaidil parool ära</translation>
 <translation id="5248640482715684545">See sait proovib teist rakendust avada.</translation>
+<translation id="5250371859659394278">Tundmatust allikast</translation>
 <translation id="5271265092610673171">{count,plural, =1{Kohustuslik väli on tühi. Täitke see enne salvestamist.}other{Mõned kohustuslikud väljad on tühjad. Täitke need enne salvestamist.}}</translation>
 <translation id="5271549068863921519">Salvesta parool</translation>
 <translation id="5279214046729249716">Jah, hoia need eraldi</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 b471211..f68f957 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> peut désormais utiliser votre nom d'utilisateur et votre mot de passe lorsqu'il utilise le gestionnaire de mots de passe Google pour se connecter à <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5242899254250321823">Modifier le mot de passe sur le site Web</translation>
 <translation id="5248640482715684545">Ce site essaie d'ouvrir une autre application.</translation>
+<translation id="5250371859659394278">À partir d'une source inconnue</translation>
 <translation id="5271265092610673171">{count,plural, =1{Un champ obligatoire est vide. Remplissez-le avant d'enregistrer.}one{Certains champs obligatoires sont vides. Remplissez-les avant d'enregistrer.}other{Certains champs obligatoires sont vides. Remplissez-les avant d'enregistrer.}}</translation>
 <translation id="5271549068863921519">Enregistrer le mot de passe</translation>
 <translation id="5279214046729249716">Oui, les garder séparées</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 23a28f6d..a009124 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> agora pode utilizar o teu nome de usuario e contrasinal para iniciar sesión en <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> se usa o xestor de contrasinais de Google.</translation>
 <translation id="5242899254250321823">Cambiar contrasinal no sitio web</translation>
 <translation id="5248640482715684545">Este sitio está tentando abrir outra aplicación.</translation>
+<translation id="5250371859659394278">Dunha fonte descoñecida</translation>
 <translation id="5271265092610673171">{count,plural, =1{Un campo obrigatorio está en branco. Cúbreo antes de gardar o formulario.}other{Algúns campos obrigatorios están en branco. Cúbreos antes de gardar o formulario.}}</translation>
 <translation id="5271549068863921519">Gardar contrasinal</translation>
 <translation id="5279214046729249716">Si, mantelos separados</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 226bc25a..ad085e5f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> എന്നയാൾക്ക് ഇപ്പോൾ, <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ Google Password Manager ഉപയോഗിക്കുമ്പോൾ നിങ്ങളുടെ ഉപയോക്തൃനാമവും പാസ്‌വേഡും ഉപയോഗിക്കാനാകും.</translation>
 <translation id="5242899254250321823">വെബ്‌സൈറ്റിലെ പാസ്‌വേഡ് മാറ്റുക</translation>
 <translation id="5248640482715684545">മറ്റൊരു ആപ്പ് തുറക്കാൻ ഈ സൈറ്റ് ശ്രമിക്കുന്നു.</translation>
+<translation id="5250371859659394278">അറിയാത്ത ഉറവിടത്തിൽ നിന്ന്</translation>
 <translation id="5271265092610673171">{count,plural, =1{നിർബന്ധമായും നൽകേണ്ട ഭാഗം പൂരിപ്പിച്ചിട്ടില്ല. സംരക്ഷിക്കുന്നതിന് മുമ്പ് അത് പൂരിപ്പിക്കുക.}other{നിർബന്ധമായും നൽകേണ്ട ഭാഗം പൂരിപ്പിച്ചിട്ടില്ല. സംരക്ഷിക്കുന്നതിന് മുമ്പ് അവ പൂരിപ്പിക്കുക.}}</translation>
 <translation id="5271549068863921519">പാസ്‌വേഡ് സംരക്ഷിക്കുക</translation>
 <translation id="5279214046729249716">ഉവ്വ്, വെവ്വേറെ സൂക്ഷിക്കുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index acb333b7..d5972e9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134">இனி <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> தளத்தில் உள்நுழைய <ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> Google Password Managerரைப் பயன்படுத்தும்போது அவர் உங்கள் பயனர்பெயரையும் கடவுச்சொல்லையும் பயன்படுத்தலாம்.</translation>
 <translation id="5242899254250321823">இணையதளத்தில் கடவுச்சொல்லை மாற்று</translation>
 <translation id="5248640482715684545">இந்தத் தளம் மற்றொரு ஆப்ஸைத் திறக்க முயல்கிறது.</translation>
+<translation id="5250371859659394278">அறியப்படாத மூலத்தில் இருந்து</translation>
 <translation id="5271265092610673171">{count,plural, =1{அவசியமான புலம் காலியாக உள்ளது. சேமிப்பதற்கு முன் அதை நிரப்பவும்.}other{சில அவசியமான புலங்கள் காலியாக உள்ளன. சேமிப்பதற்கு முன் அவற்றை நிரப்பவும்.}}</translation>
 <translation id="5271549068863921519">கடவுச்சொல்லைச் சேமி</translation>
 <translation id="5279214046729249716">ஆம், தனியாக வைத்திரு</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index f66d3f4..c62ff22 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134"><ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> artık Google Şifre Yöneticisi'nin yardımıyla <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> sitesinde oturum açarken kullanıcı adınızı ve şifrenizi kullanabilir.</translation>
 <translation id="5242899254250321823">Web sitesindeki şifreyi değiştir</translation>
 <translation id="5248640482715684545">Bu site başka bir uygulamayı açmaya çalışıyor.</translation>
+<translation id="5250371859659394278">Bilinmeyen bir kaynaktan</translation>
 <translation id="5271265092610673171">{count,plural, =1{Zorunlu bir alan boş. Kaydetmeden önce bu alanı doldurun.}other{Bazı zorunlu alanlar boş. Kaydetmeden önce bu alanları doldurun.}}</translation>
 <translation id="5271549068863921519">Şifreyi kaydet</translation>
 <translation id="5279214046729249716">Evet, ayrı tut</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 8bbddc3c..1a0cbb0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134">Тепер <ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> зможе використовувати ваші ім’я користувача й пароль, коли входитиме на сайт <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" /> за допомогою Google Менеджера паролів.</translation>
 <translation id="5242899254250321823">Змінити пароль на вебсайті</translation>
 <translation id="5248640482715684545">Цей сайт намагається відкрити інший додаток.</translation>
+<translation id="5250371859659394278">З невідомого джерела</translation>
 <translation id="5271265092610673171">{count,plural, =1{Обов’язкове поле порожнє. Заповніть його, перш ніж зберегти.}one{Деякі обов’язкові поля порожні. Заповніть їх, перш ніж зберегти.}few{Деякі обов’язкові поля порожні. Заповніть їх, перш ніж зберегти.}many{Деякі обов’язкові поля порожні. Заповніть їх, перш ніж зберегти.}other{Деякі обов’язкові поля порожні. Заповніть їх, перш ніж зберегти.}}</translation>
 <translation id="5271549068863921519">Зберегти пароль</translation>
 <translation id="5279214046729249716">Так, зберігати окремо</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index cdf218f..1a5ab32 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -975,6 +975,7 @@
 <translation id="5238596603078743134">U-<ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" /> manje usengasebenzisa igama lomsebenzisi kanye nephasiwedi yakho lapho esebenzisa Umphathi Wephasiwedi Ye-Google ukuze angene ngemvume kokuthi <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5242899254250321823">Shintsha iphasiwedi kuwebhusayithi</translation>
 <translation id="5248640482715684545">Le webhusayithi izama ukuvula enye i-application.</translation>
+<translation id="5250371859659394278">Kuvela emthonjeni ongaziwa</translation>
 <translation id="5271265092610673171">{count,plural, =1{Inkambu edingekayo ayinalutho. Yigcwalise ngaphambi kokulondoloza.}one{Ezinye izinkambu ezidingekayo azinalutho. Zigcwalise ngaphambi kokulondoloza.}other{Ezinye izinkambu ezidingekayo azinalutho. Zigcwalise ngaphambi kokulondoloza.}}</translation>
 <translation id="5271549068863921519">Londoloza iphasiwedi</translation>
 <translation id="5279214046729249716">Yebo, kugcine kuhlukene</translation>
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/promo/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/signin/promo/BUILD.gn
new file mode 100644
index 0000000..e2b3ed11
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/promo/BUILD.gn
@@ -0,0 +1,22 @@
+# 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("promo") {
+  sources = [
+    "signin_fullscreen_promo_display_handler.h",
+    "signin_fullscreen_promo_display_handler.mm",
+    "signin_fullscreen_promo_scene_agent.h",
+    "signin_fullscreen_promo_scene_agent.mm",
+  ]
+  deps = [
+    "//components/feature_engagement/public",
+    "//ios/chrome/browser/feature_engagement/model",
+    "//ios/chrome/browser/promos_manager/model",
+    "//ios/chrome/browser/promos_manager/model:constants",
+    "//ios/chrome/browser/promos_manager/model:features",
+    "//ios/chrome/browser/promos_manager/model:types",
+    "//ios/chrome/browser/promos_manager/ui_bundled:promos",
+    "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent",
+  ]
+}
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/promo/DEPS b/ios/chrome/browser/authentication/ui_bundled/signin/promo/DEPS
new file mode 100644
index 0000000..c694c70
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/promo/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ios/chrome/browser/promos_manager",
+]
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.h b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.h
new file mode 100644
index 0000000..2f6c4ed4
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.h
@@ -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.
+
+#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_PROMO_SIGNIN_FULLSCREEN_PROMO_DISPLAY_HANDLER_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_PROMO_SIGNIN_FULLSCREEN_PROMO_DISPLAY_HANDLER_H_
+
+#import "ios/chrome/browser/promos_manager/ui_bundled/standard_promo_display_handler.h"
+
+@interface SigninFullscreenPromoDisplayHandler
+    : NSObject <StandardPromoDisplayHandler>
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_PROMO_SIGNIN_FULLSCREEN_PROMO_DISPLAY_HANDLER_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.mm b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.mm
new file mode 100644
index 0000000..9067c1a9
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.mm
@@ -0,0 +1,26 @@
+// 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/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.h"
+
+#import "components/feature_engagement/public/feature_constants.h"
+#import "ios/chrome/browser/promos_manager/model/constants.h"
+#import "ios/chrome/browser/promos_manager/model/promo_config.h"
+
+@implementation SigninFullscreenPromoDisplayHandler
+
+#pragma mark - StandardPromoDisplayHandler
+
+- (void)handleDisplay {
+  // TODO(crbug.com/396111598): Display the sign-in promo.
+}
+
+#pragma mark - PromoProtocol
+
+- (PromoConfig)config {
+  return PromoConfig(promos_manager::Promo::SigninFullscreen,
+                     &feature_engagement::kIPHiOSPromoSigninFullscreenFeature);
+}
+
+@end
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.h b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.h
new file mode 100644
index 0000000..5a0b841
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.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_SIGNIN_PROMO_SIGNIN_FULLSCREEN_PROMO_SCENE_AGENT_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_PROMO_SIGNIN_FULLSCREEN_PROMO_SCENE_AGENT_H_
+
+#import <Foundation/Foundation.h>
+
+#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h"
+
+// A scene agent that registers the Signin fullscreen promo in the promo
+// manager.
+@interface SigninFullscreenPromoSceneAgent : ObservingSceneAgent
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_PROMO_SIGNIN_FULLSCREEN_PROMO_SCENE_AGENT_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.mm b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.mm
new file mode 100644
index 0000000..d36f229c
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.mm
@@ -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.
+
+#import "ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.h"
+
+@implementation SigninFullscreenPromoSceneAgent
+
+#pragma mark - SceneStateObserver
+
+- (void)sceneState:(SceneState*)sceneState
+    transitionedToActivationLevel:(SceneActivationLevel)level {
+  switch (level) {
+    case SceneActivationLevelForegroundActive:
+    // TODO(crbug.com/394874613): Register/deregister the sign-in promo.
+    case SceneActivationLevelUnattached:
+    case SceneActivationLevelDisconnected:
+    case SceneActivationLevelBackground:
+    case SceneActivationLevelForegroundInactive:
+      break;
+  }
+}
+
+@end
diff --git a/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.h b/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.h
index 03bbebd..c60a9fac 100644
--- a/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.h
+++ b/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.h
@@ -124,7 +124,7 @@
   void OpenPromoCodeOfferDetailsURL(const GURL& url) override;
   payments::MandatoryReauthManager* GetOrCreatePaymentsMandatoryReauthManager()
       override;
-  const PaymentsDataManager& GetPaymentsDataManager() const override;
+  PaymentsDataManager& GetPaymentsDataManager() final;
 
   std::unique_ptr<AutofillProgressDialogControllerImpl>
   GetProgressDialogModel() {
diff --git a/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.mm b/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.mm
index 1863963..08bba2d 100644
--- a/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/ios_chrome_payments_autofill_client.mm
@@ -394,8 +394,7 @@
   return payments_reauth_manager_.get();
 }
 
-const PaymentsDataManager&
-IOSChromePaymentsAutofillClient::GetPaymentsDataManager() const {
+PaymentsDataManager& IOSChromePaymentsAutofillClient::GetPaymentsDataManager() {
   return client_->GetPersonalDataManager().payments_data_manager();
 }
 
diff --git a/ios/chrome/browser/banner_promo/model/default_browser_banner_promo_app_agent.mm b/ios/chrome/browser/banner_promo/model/default_browser_banner_promo_app_agent.mm
index b248f2028..3e3261dd 100644
--- a/ios/chrome/browser/banner_promo/model/default_browser_banner_promo_app_agent.mm
+++ b/ios/chrome/browser/banner_promo/model/default_browser_banner_promo_app_agent.mm
@@ -427,6 +427,17 @@
   [self updatePromoState];
 }
 
+- (void)webStateListDestroyed:(WebStateList*)webStateList {
+  webStateList->RemoveObserver(_webStateListObserverBridge.get());
+
+  web::WebState* activeWebState = webStateList->GetActiveWebState();
+  if (activeWebState) {
+    [self stopObservingWebState:activeWebState];
+  }
+
+  [self updatePromoState];
+}
+
 #pragma mark - CRWWebStateObserver
 
 - (void)webState:(web::WebState*)webState
diff --git a/ios/chrome/browser/browser_view/ui_bundled/BUILD.gn b/ios/chrome/browser/browser_view/ui_bundled/BUILD.gn
index d09fab2..a68cc57 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/browser_view/ui_bundled/BUILD.gn
@@ -167,7 +167,6 @@
     "//ios/chrome/browser/parcel_tracking:prefs",
     "//ios/chrome/browser/parcel_tracking:tracking_source",
     "//ios/chrome/browser/parcel_tracking:util",
-    "//ios/chrome/browser/parcel_tracking/ui_bundled:coordinator",
     "//ios/chrome/browser/passwords/model",
     "//ios/chrome/browser/passwords/ui_bundled",
     "//ios/chrome/browser/passwords/ui_bundled/bottom_sheet",
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
index 2e2531e..7c4848b 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
+++ b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
@@ -231,6 +231,7 @@
 #import "ios/chrome/browser/sharing/ui_bundled/sharing_coordinator.h"
 #import "ios/chrome/browser/sharing/ui_bundled/sharing_params.h"
 #import "ios/chrome/browser/sharing/ui_bundled/sharing_positioner.h"
+#import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.h"
 #import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h"
 #import "ios/chrome/browser/signin/model/account_consistency_browser_agent.h"
 #import "ios/chrome/browser/signin/model/account_consistency_service_factory.h"
@@ -593,7 +594,7 @@
   ToolbarCoordinator* _toolbarCoordinator;
   TabStripCoordinator* _tabStripCoordinator;
   TabStripLegacyCoordinator* _legacyTabStripCoordinator;
-  SideSwipeMediator* _sideSwipeMediator;
+  SideSwipeCoordinator* _sideSwipeCoordinator;
   raw_ptr<FullscreenController> _fullscreenController;
   // The coordinator that shows the Send Tab To Self UI.
   SendTabToSelfCoordinator* _sendTabToSelfCoordinator;
@@ -1056,9 +1057,6 @@
   _urlLoadingNotifierBrowserAgent =
       UrlLoadingNotifierBrowserAgent::FromBrowser(self.browser);
 
-  feature_engagement::Tracker* engagementTracker =
-      feature_engagement::TrackerFactory::GetForProfile(profile);
-
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
     if (IsModernTabStripOrRaccoonEnabled()) {
       _tabStripCoordinator =
@@ -1089,22 +1087,20 @@
   _toolbarAccessoryPresenter.bottomToolbarLayoutGuide =
       [_layoutGuideCenter makeLayoutGuideNamed:kSecondaryToolbarGuide];
 
-  _sideSwipeMediator = [[SideSwipeMediator alloc]
-      initWithFullscreenController:_fullscreenController
-                      webStateList:self.browser->GetWebStateList()];
-  _sideSwipeMediator.layoutGuideCenter =
-      LayoutGuideCenterForBrowser(self.browser);
-  _sideSwipeMediator.toolbarInteractionHandler = _toolbarCoordinator;
-  _sideSwipeMediator.toolbarSnapshotProvider = _toolbarCoordinator;
-  _sideSwipeMediator.engagementTracker = engagementTracker;
-  _sideSwipeMediator.helpHandler =
-      HandlerForProtocol(_dispatcher, HelpCommands);
+  _sideSwipeCoordinator = [[SideSwipeCoordinator alloc]
+      initWithBaseViewController:self.baseViewController
+                         browser:self.browser];
+
+  _sideSwipeCoordinator.toolbarInteractionHandler = _toolbarCoordinator;
+  _sideSwipeCoordinator.toolbarSnapshotProvider = _toolbarCoordinator;
 
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET &&
       !IsModernTabStripOrRaccoonEnabled()) {
-    [_sideSwipeMediator setTabStripDelegate:_legacyTabStripCoordinator];
+    [_sideSwipeCoordinator setTabStripDelegate:_legacyTabStripCoordinator];
   }
 
+  [_sideSwipeCoordinator start];
+
   _bookmarksCoordinator =
       [[BookmarksCoordinator alloc] initWithBrowser:self.browser];
 
@@ -1157,7 +1153,7 @@
   _viewControllerDependencies.tabStripCoordinator = _tabStripCoordinator;
   _viewControllerDependencies.legacyTabStripCoordinator =
       _legacyTabStripCoordinator;
-  _viewControllerDependencies.sideSwipeMediator = _sideSwipeMediator;
+  _viewControllerDependencies.sideSwipeCoordinator = _sideSwipeCoordinator;
   _viewControllerDependencies.bookmarksCoordinator = _bookmarksCoordinator;
   _viewControllerDependencies.fullscreenController = _fullscreenController;
   _viewControllerDependencies.textZoomHandler =
@@ -1237,7 +1233,7 @@
   _viewControllerDependencies.toolbarCoordinator = nil;
   _viewControllerDependencies.tabStripCoordinator = nil;
   _viewControllerDependencies.legacyTabStripCoordinator = nil;
-  _viewControllerDependencies.sideSwipeMediator = nil;
+  _viewControllerDependencies.sideSwipeCoordinator = nil;
   _viewControllerDependencies.bookmarksCoordinator = nil;
   _viewControllerDependencies.fullscreenController = nil;
   _viewControllerDependencies.textZoomHandler = nil;
@@ -1265,8 +1261,10 @@
 
   _legacyTabStripCoordinator = nil;
   _tabStripCoordinator = nil;
-  [_sideSwipeMediator disconnect];
-  _sideSwipeMediator = nil;
+
+  [_sideSwipeCoordinator stop];
+  _sideSwipeCoordinator = nil;
+
   _toolbarCoordinator = nil;
   _loadQueryCommandsHandler = nil;
   _omniboxCommandsHandler = nil;
@@ -2268,10 +2266,10 @@
 
   if (lensOverlayTabHelper &&
       lensOverlayTabHelper->IsLensOverlayInvokedOnMostRecentBackItem()) {
-    [_sideSwipeMediator
-        animateSwipe:SwipeType::CHANGE_PAGE
-         inDirection:UseRTLLayout() ? UISwipeGestureRecognizerDirectionLeft
-                                    : UISwipeGestureRecognizerDirectionRight];
+    [_sideSwipeCoordinator animatePageSideSwipeInDirection:
+                               UseRTLLayout()
+                                   ? UISwipeGestureRecognizerDirectionLeft
+                                   : UISwipeGestureRecognizerDirectionRight];
     return YES;
   }
 
@@ -2279,17 +2277,17 @@
 }
 
 - (void)animateLensOverlayNavigationToURL:(GURL)URL {
-  [_sideSwipeMediator
+  [_sideSwipeCoordinator
       prepareForSlideInDirection:UseRTLLayout()
                                      ? UISwipeGestureRecognizerDirectionRight
                                      : UISwipeGestureRecognizerDirectionLeft];
 
-  __weak SideSwipeMediator* weakSideSwipeMediator = _sideSwipeMediator;
+  __weak SideSwipeCoordinator* weakSideSwipeCoordinator = _sideSwipeCoordinator;
 
   [HandlerForProtocol(_dispatcher, LensOverlayCommands)
       hideLensUI:NO
       completion:^{
-        [weakSideSwipeMediator slideToCenterAnimated];
+        [weakSideSwipeCoordinator slideToCenterAnimated];
       }];
 
   [_loadQueryCommandsHandler loadQuery:base::SysUTF8ToNSString(URL.spec())
@@ -3764,8 +3762,7 @@
 - (void)bubblePresenter:(BubblePresenter*)bubblePresenter
     didPerformSwipeToNavigateInDirection:
         (UISwipeGestureRecognizerDirection)direction {
-  [_sideSwipeMediator animateSwipe:SwipeType::CHANGE_PAGE
-                       inDirection:direction];
+  [_sideSwipeCoordinator animatePageSideSwipeInDirection:direction];
 }
 
 #pragma mark - OverscrollActionsControllerDelegate methods.
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.h b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.h
index fb96f43..dafb826 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.h
+++ b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.h
@@ -38,7 +38,7 @@
 @protocol PopupMenuCommands;
 @class PopupMenuCoordinator;
 @class SafeAreaProvider;
-@class SideSwipeMediator;
+@class SideSwipeCoordinator;
 @class TabStripCoordinator;
 @class TabStripLegacyCoordinator;
 class TabUsageRecorderBrowserAgent;
@@ -58,7 +58,7 @@
   ToolbarCoordinator* toolbarCoordinator;
   TabStripCoordinator* tabStripCoordinator;
   TabStripLegacyCoordinator* legacyTabStripCoordinator;
-  SideSwipeMediator* sideSwipeMediator;
+  SideSwipeCoordinator* sideSwipeCoordinator;
   BookmarksCoordinator* bookmarksCoordinator;
   raw_ptr<FullscreenController> fullscreenController;
   id<TextZoomCommands> textZoomHandler;
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
index b84b213..725e2e66 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
+++ b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
@@ -64,6 +64,7 @@
 #import "ios/chrome/browser/shared/ui/util/named_guide.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/shared/ui/util/url_with_title.h"
+#import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.h"
 #import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h"
 #import "ios/chrome/browser/side_swipe/ui_bundled/swipe_view.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
@@ -172,7 +173,7 @@
   NSInteger _NTPAnimationIdentifier;
 
   // Mediator for edge swipe gestures for page and tab navigation.
-  SideSwipeMediator* _sideSwipeMediator;
+  SideSwipeCoordinator* _sideSwipeCoordinator;
 
   // Keyboard commands provider.  It offloads most of the keyboard commands
   // management off of the BVC.
@@ -354,8 +355,8 @@
   if (self) {
     _browserContainerViewController = browserContainerViewController;
     _keyCommandsProvider = keyCommandsProvider;
-    _sideSwipeMediator = dependencies.sideSwipeMediator;
-    [_sideSwipeMediator setSwipeDelegate:self];
+    _sideSwipeCoordinator = dependencies.sideSwipeCoordinator;
+    [_sideSwipeCoordinator setSwipeDelegate:self];
     _bookmarksCoordinator = dependencies.bookmarksCoordinator;
     self.toolbarAccessoryPresenter = dependencies.toolbarAccessoryPresenter;
     self.ntpCoordinator = dependencies.ntpCoordinator;
@@ -804,7 +805,7 @@
 
   [self.toolbarCoordinator stop];
   self.toolbarCoordinator = nil;
-  _sideSwipeMediator = nil;
+  _sideSwipeCoordinator = nil;
   [_voiceSearchController disconnect];
   [[NSNotificationCenter defaultCenter] removeObserver:self];
   _bookmarksCoordinator = nil;
@@ -896,7 +897,7 @@
   [self setUpViewLayout:YES];
   [self addConstraintsToToolbar];
 
-  [_sideSwipeMediator addHorizontalGesturesToView:self.view];
+  [_sideSwipeCoordinator addHorizontalGesturesToView:self.view];
 
   // Add a tap gesture recognizer to save the last tap location for the source
   // location of the new tab animation.
@@ -1028,7 +1029,8 @@
       self.legacyTabStripCoordinator = nil;
     }
     self.tabStripView = nil;
-    _sideSwipeMediator = nil;
+    [_sideSwipeCoordinator stop];
+    _sideSwipeCoordinator = nil;
   }
 }
 
@@ -1192,7 +1194,8 @@
       };
     }
   }
-  [_sideSwipeMediator resetContentView];
+
+  [_sideSwipeCoordinator stopActiveSideSwipeAnimation];
 
   void (^superCall)() = ^{
     [super presentViewController:viewControllerToPresent
@@ -1218,8 +1221,8 @@
       self.presentedViewController.beingDismissed) {
     // Don't rotate while a presentation or dismissal animation is occurring.
     return NO;
-  } else if (_sideSwipeMediator && ![_sideSwipeMediator shouldAutorotate]) {
-    // Don't auto rotate if side swipe controller view says not to.
+  } else if (_sideSwipeCoordinator.swipeInProgress) {
+    // Don't auto rotate if a side swipe is in progress.
     return NO;
   } else {
     return [super shouldAutorotate];
@@ -2118,7 +2121,7 @@
   if (self.ntpCoordinator.isNTPActiveForCurrentWebState) {
     [self.ntpCoordinator locationBarDidBecomeFirstResponder];
   }
-  [_sideSwipeMediator setEnabled:NO];
+  [_sideSwipeCoordinator setEnabled:NO];
 
   if (!IsVisibleURLNewTabPage(self.currentWebState) ||
       ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
@@ -2138,7 +2141,7 @@
 }
 
 - (void)omniboxDidResignFirstResponder {
-  [_sideSwipeMediator setEnabled:YES];
+  [_sideSwipeCoordinator setEnabled:YES];
 
   [self.ntpCoordinator locationBarWillResignFirstResponder];
 
@@ -2554,7 +2557,7 @@
 
   // Reset horizontal stack view.
   [sideSwipeView removeFromSuperview];
-  [_sideSwipeMediator setInSwipe:NO];
+  [_sideSwipeCoordinator setSwipeInProgress:NO];
 }
 
 - (UIView*)sideSwipeContentView {
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller_unittest.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller_unittest.mm
index 8dd6c5b..56a40ae5 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller_unittest.mm
+++ b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller_unittest.mm
@@ -63,7 +63,7 @@
 #import "ios/chrome/browser/shared/public/commands/settings_commands.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/commands/text_zoom_commands.h"
-#import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h"
+#import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.h"
 #import "ios/chrome/browser/signin/model/authentication_service_factory.h"
 #import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h"
 #import "ios/chrome/browser/start_surface/ui_bundled/start_surface_recent_tab_browser_agent.h"
@@ -260,9 +260,9 @@
         [[TabStripLegacyCoordinator alloc] initWithBrowser:browser_.get()];
 
     fullscreen_controller_ = FullscreenController::FromBrowser(browser_.get());
-    side_swipe_mediator_ = [[SideSwipeMediator alloc]
-        initWithFullscreenController:fullscreen_controller_
-                        webStateList:browser_->GetWebStateList()];
+    side_swipe_coordinator_ = [[SideSwipeCoordinator alloc]
+        initWithBaseViewController:nil
+                           browser:browser_.get()];
 
     bookmarks_coordinator_ =
         [[BookmarksCoordinator alloc] initWithBrowser:browser_.get()];
@@ -282,7 +282,7 @@
     dependencies.toolbarCoordinator = toolbar_coordinator_;
     dependencies.tabStripCoordinator = tab_strip_coordinator_;
     dependencies.legacyTabStripCoordinator = legacy_tab_strip_coordinator_;
-    dependencies.sideSwipeMediator = side_swipe_mediator_;
+    dependencies.sideSwipeCoordinator = side_swipe_coordinator_;
     dependencies.bookmarksCoordinator = bookmarks_coordinator_;
     dependencies.fullscreenController = fullscreen_controller_;
     dependencies.tabUsageRecorderBrowserAgent =
@@ -332,7 +332,7 @@
     [toolbar_coordinator_ stop];
     [popup_menu_coordinator_ stop];
     [NTPCoordinator_ stop];
-    [side_swipe_mediator_ disconnect];
+    [side_swipe_coordinator_ stop];
     ClipboardRecentContent::SetInstance(nullptr);
 
     BlockCleanupTest::TearDown();
@@ -421,7 +421,7 @@
   ToolbarCoordinator* toolbar_coordinator_;
   TabStripCoordinator* tab_strip_coordinator_;
   TabStripLegacyCoordinator* legacy_tab_strip_coordinator_;
-  SideSwipeMediator* side_swipe_mediator_;
+  SideSwipeCoordinator* side_swipe_coordinator_;
   BookmarksCoordinator* bookmarks_coordinator_;
   raw_ptr<FullscreenController> fullscreen_controller_;
   TabEventsMediator* tab_events_mediator_;
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 2f51104a..6f70f5e 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -2484,6 +2484,11 @@
      FEATURE_WITH_PARAMS_VALUE_TYPE(first_run::kBestFeaturesScreenInFirstRun,
                                     kBestFeaturesScreenInFirstRunVariations,
                                     "BestFeaturesScreenInFirstRun")},
+    {"autofill-enable-card-expired-text",
+     flag_descriptions::kAutofillEnableCardExpiredTextName,
+     flag_descriptions::kAutofillEnableCardExpiredTextDescription,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardExpiredText)},
 };
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 46235687..4c4a198 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -70,6 +70,12 @@
     "When enabled, card benefits offered by issuers will be synced from "
     "the Payments server.";
 
+const char kAutofillEnableCardExpiredTextName[] =
+    "Enable 'expired' text for expired cards.";
+const char kAutofillEnableCardExpiredTextDescription[] =
+    "When enabled, cards that have expired will display 'expired' instead of "
+    "'expires' text.";
+
 const char kAutofillEnableDynamicallyLoadingFieldsForAddressInputName[] =
     "Enable dynamically loading fields for address input";
 const char kAutofillEnableDynamicallyLoadingFieldsForAddressInputDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index a4299de..eea1b90 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -59,6 +59,11 @@
 extern const char kAutofillEnableCardBenefitsSyncName[];
 extern const char kAutofillEnableCardBenefitsSyncDescription[];
 
+// Title and description for the flag to enable "expired" text on expired cards
+// for autofill Payments UI.
+extern const char kAutofillEnableCardExpiredTextName[];
+extern const char kAutofillEnableCardExpiredTextDescription[];
+
 // Title and description for the flag to enable dynamically loading the fields
 // for address input based on the country value.
 extern const char kAutofillEnableDynamicallyLoadingFieldsForAddressInputName[];
diff --git a/ios/chrome/browser/optimization_guide/model/optimization_guide_service.h b/ios/chrome/browser/optimization_guide/model/optimization_guide_service.h
index 892e8dd..723dc7f 100644
--- a/ios/chrome/browser/optimization_guide/model/optimization_guide_service.h
+++ b/ios/chrome/browser/optimization_guide/model/optimization_guide_service.h
@@ -55,6 +55,7 @@
 class OptimizationGuideLogger;
 class OptimizationGuideNavigationData;
 class PrefService;
+class TabResumptionMediatorProxy;
 
 // A BrowserState keyed service that is used to own the underlying Optimization
 // Guide components. This is a rough copy of the OptimizationGuideKeyedService
@@ -186,6 +187,7 @@
   friend class OptimizationGuideServiceTest;
   friend class OptimizationGuideTabHelper;
   friend class OptimizationGuideTestAppInterfaceWrapper;
+  friend class TabResumptionMediatorProxy;
 
   // Notifies `hints_manager_` that the navigation associated with
   // `navigation_data` has started or redirected.
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.mm b/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.mm
index f46e1f3a..e582737 100644
--- a/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.mm
+++ b/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.mm
@@ -146,6 +146,17 @@
   };
   [_consumer setupModalViewControllerWithPrefs:prefs];
 
+  if (!infobar->accepted()) {
+    // Log metrics for modal being shown to offer card save. We log each time
+    // the modal is shown, even if it is a re-show via the omnibox chip, as
+    // each show will be paired with one outcome (e.g. dismiss, accept, etc).
+    // However once the prompt has been accepted, we stop logging any re-shows
+    // as the user has already committed to the save flow.
+    delegate->LogSaveCreditCardInfoBarResultMetric(
+        autofill::autofill_metrics::SaveCreditCardPromptResultIOS::kShown,
+        autofill::autofill_metrics::SaveCreditCardPromptOverlayType::kModal);
+  }
+
   if (delegate->is_for_upload() && infobar->accepted() &&
       base::FeatureList::IsEnabled(
           autofill::features::kAutofillEnableSaveCardLoadingAndConfirmation)) {
@@ -208,6 +219,10 @@
       self.saveCardDelegate;
   InfoBarIOS* infobar = GetOverlayRequestInfobar(self.request);
 
+  delegate->LogSaveCreditCardInfoBarResultMetric(
+      autofill::autofill_metrics::SaveCreditCardPromptResultIOS::kAccepted,
+      autofill::autofill_metrics::SaveCreditCardPromptOverlayType::kModal);
+
   infobar->set_accepted(delegate->UpdateAndAccept(
       base::SysNSStringToUTF16(cardholderName), base::SysNSStringToUTF16(month),
       base::SysNSStringToUTF16(year)));
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_unittest.mm b/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_unittest.mm
index 2c98de1b..de9cd33 100644
--- a/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_unittest.mm
+++ b/ios/chrome/browser/overlays/ui_bundled/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_unittest.mm
@@ -32,14 +32,34 @@
 #import "third_party/ocmock/OCMock/OCMock.h"
 #import "third_party/ocmock/gtest_support.h"
 
+namespace {
+
 using ::testing::A;
 using ::testing::Return;
+using SaveCreditCardPromptResultIOS =
+    autofill::autofill_metrics::SaveCreditCardPromptResultIOS;
+using SaveCreditCardOptions =
+    autofill::payments::PaymentsAutofillClient::SaveCreditCardOptions;
 
-namespace {
 // Time duration to wait before auto-closing modal in save card success
 // confirmation state.
 static constexpr base::TimeDelta kConfirmationStateDuration =
     base::Seconds(1.5);
+
+// Details of the card to be saved.
+constexpr NSString* kCardHolderName = @"Name";
+NSString* kValidExpirationMonth =
+    base::SysUTF8ToNSString(autofill::test::NextMonth());
+NSString* kValidExpirationYear =
+    base::SysUTF8ToNSString(autofill::test::NextYear());
+
+constexpr char kSaveCreditCardPromptResultHistogramStringForLocalSave[] =
+    "Autofill.SaveCreditCardPromptResult.IOS.Local.Modal.NumStrikes.0."
+    "NoFixFlow";
+constexpr char kSaveCreditCardPromptResultHistogramStringForServerSave[] =
+    "Autofill.SaveCreditCardPromptResult.IOS.Server.Modal.NumStrikes.0."
+    "NoFixFlow";
+
 }  // namespace
 
 @interface FakeSaveCardMediatorDelegate
@@ -111,8 +131,9 @@
         "https://www.example.com/");
     std::unique_ptr<MockAutofillSaveCardInfoBarDelegateMobile> delegate =
         MockAutofillSaveCardInfoBarDelegateMobileFactory::
-            CreateMockAutofillSaveCardInfoBarDelegateMobileFactory(for_upload,
-                                                                   credit_card);
+            CreateMockAutofillSaveCardInfoBarDelegateMobileFactory(
+                for_upload, credit_card,
+                SaveCreditCardOptions().with_num_strikes(0));
     delegate_ = delegate.get();
     infobar_ = std::make_unique<InfoBarIOS>(InfobarType::kInfobarTypeSaveCard,
                                             std::move(delegate));
@@ -137,6 +158,12 @@
     return task_environment_.get();
   }
 
+  void SaveCard() {
+    [mediator_ saveCardWithCardholderName:kCardHolderName
+                          expirationMonth:kValidExpirationMonth
+                           expirationYear:kValidExpirationYear];
+  }
+
  protected:
   std::unique_ptr<web::WebTaskEnvironment> task_environment_;
   std::unique_ptr<InfoBarIOS> infobar_;
@@ -181,20 +208,15 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndDisableFeature(
       autofill::features::kAutofillEnableSaveCardLoadingAndConfirmation);
-  NSString* cardholderName = @"name";
-  NSString* month = @"3";
-  NSString* year = @"23";
 
   EXPECT_CALL(*delegate_,
-              UpdateAndAccept(base::SysNSStringToUTF16(cardholderName),
-                              base::SysNSStringToUTF16(month),
-                              base::SysNSStringToUTF16(year)));
+              UpdateAndAccept(base::SysNSStringToUTF16(kCardHolderName),
+                              base::SysNSStringToUTF16(kValidExpirationMonth),
+                              base::SysNSStringToUTF16(kValidExpirationYear)));
   EXPECT_CALL(*delegate_, SetCreditCardUploadCompletionCallback);
   EXPECT_CALL(*delegate_, SetInfobarIsPresenting(NO));
   OCMExpect([mediator_delegate_ stopOverlayForMediator:mediator_]);
-  [mediator_ saveCardWithCardholderName:cardholderName
-                        expirationMonth:month
-                         expirationYear:year];
+  SaveCard();
 }
 
 // Tests that calling dismissModalAndOpenURL: sends the passed URL to the
@@ -221,6 +243,43 @@
   [mediator_ dismissInfobarModal:nil];
 }
 
+// Tests histogram entries for server save modal shown and accepted.
+TEST_F(SaveCardInfobarModalOverlayMediatorTest,
+       LogsModalShownAndAcceptedForServerSave) {
+  base::HistogramTester histogramTester;
+  FakeSaveCardModalConsumer* consumer =
+      [[FakeSaveCardModalConsumer alloc] init];
+
+  mediator_.consumer = consumer;
+  histogramTester.ExpectBucketCount(
+      kSaveCreditCardPromptResultHistogramStringForServerSave,
+      SaveCreditCardPromptResultIOS::kShown, 1);
+
+  SaveCard();
+  histogramTester.ExpectBucketCount(
+      kSaveCreditCardPromptResultHistogramStringForServerSave,
+      SaveCreditCardPromptResultIOS::kAccepted, 1);
+
+  histogramTester.ExpectTotalCount(
+      kSaveCreditCardPromptResultHistogramStringForServerSave, 2);
+}
+
+// Tests histogram entry is not recorded for server save offer shown when modal
+// is reshown in loading state.
+TEST_F(SaveCardInfobarModalOverlayMediatorTest,
+       DoNotLogOfferShownWhenModalReshownInLoadingState) {
+  base::HistogramTester histogramTester;
+  FakeSaveCardModalConsumer* consumer =
+      [[FakeSaveCardModalConsumer alloc] init];
+  infobar_->set_accepted(true);
+  mediator_.consumer = consumer;
+
+  EXPECT_TRUE(consumer.inLoadingState);
+  histogramTester.ExpectBucketCount(
+      kSaveCreditCardPromptResultHistogramStringForServerSave,
+      SaveCreditCardPromptResultIOS::kShown, 0);
+}
+
 // Tests metrics for loading view not shown when loading and confirmation is not
 // enabled.
 TEST_F(SaveCardInfobarModalOverlayMediatorTest, LoadingViewNotShown_Metrics) {
@@ -228,15 +287,10 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndDisableFeature(
       autofill::features::kAutofillEnableSaveCardLoadingAndConfirmation);
-  NSString* cardholderName = @"name";
-  NSString* month = @"3";
-  NSString* year = @"23";
 
   EXPECT_CALL(*delegate_, SetCreditCardUploadCompletionCallback);
   OCMExpect([mediator_delegate_ stopOverlayForMediator:mediator_]);
-  [mediator_ saveCardWithCardholderName:cardholderName
-                        expirationMonth:month
-                         expirationYear:year];
+  SaveCard();
 
   histogramTester.ExpectUniqueSample("Autofill.CreditCardUpload.LoadingShown",
                                      false, 1);
@@ -249,6 +303,27 @@
       : SaveCardInfobarModalOverlayMediatorTest(/*for_upload=*/false) {}
 };
 
+// Tests histogram entries for local save modal shown and accepted.
+TEST_F(SaveCardInfobarModalOverlayMediatorWithLocalSave,
+       LogsModalShownAndAcceptedForLocalSave) {
+  base::HistogramTester histogramTester;
+  FakeSaveCardModalConsumer* consumer =
+      [[FakeSaveCardModalConsumer alloc] init];
+
+  mediator_.consumer = consumer;
+  histogramTester.ExpectBucketCount(
+      kSaveCreditCardPromptResultHistogramStringForLocalSave,
+      SaveCreditCardPromptResultIOS::kShown, 1);
+
+  SaveCard();
+  histogramTester.ExpectBucketCount(
+      kSaveCreditCardPromptResultHistogramStringForLocalSave,
+      SaveCreditCardPromptResultIOS::kAccepted, 1);
+
+  histogramTester.ExpectTotalCount(
+      kSaveCreditCardPromptResultHistogramStringForLocalSave, 2);
+}
+
 // Tests that a SaveCardInfobarModalOverlayMediator does not show Modal in
 // loading state when accepted Modal is for local save.
 TEST_F(SaveCardInfobarModalOverlayMediatorWithLocalSave,
@@ -272,17 +347,12 @@
   FakeSaveCardModalConsumer* consumer =
       [[FakeSaveCardModalConsumer alloc] init];
   mediator_.consumer = consumer;
-  NSString* cardholderName = @"name";
-  NSString* month = @"3";
-  NSString* year = @"23";
 
   EXPECT_CALL(*delegate_,
-              UpdateAndAccept(base::SysNSStringToUTF16(cardholderName),
-                              base::SysNSStringToUTF16(month),
-                              base::SysNSStringToUTF16(year)));
-  [mediator_ saveCardWithCardholderName:cardholderName
-                        expirationMonth:month
-                         expirationYear:year];
+              UpdateAndAccept(base::SysNSStringToUTF16(kCardHolderName),
+                              base::SysNSStringToUTF16(kValidExpirationMonth),
+                              base::SysNSStringToUTF16(kValidExpirationYear)));
+  SaveCard();
 
   EXPECT_FALSE(consumer.inLoadingState);
 
@@ -315,17 +385,12 @@
   FakeSaveCardModalConsumer* consumer =
       [[FakeSaveCardModalConsumer alloc] init];
   mediator_.consumer = consumer;
-  NSString* cardholderName = @"name";
-  NSString* month = @"3";
-  NSString* year = @"23";
 
   EXPECT_CALL(*delegate_,
-              UpdateAndAccept(base::SysNSStringToUTF16(cardholderName),
-                              base::SysNSStringToUTF16(month),
-                              base::SysNSStringToUTF16(year)));
-  [mediator_ saveCardWithCardholderName:cardholderName
-                        expirationMonth:month
-                         expirationYear:year];
+              UpdateAndAccept(base::SysNSStringToUTF16(kCardHolderName),
+                              base::SysNSStringToUTF16(kValidExpirationMonth),
+                              base::SysNSStringToUTF16(kValidExpirationYear)));
+  SaveCard();
 
   EXPECT_TRUE(consumer.inLoadingState);
 }
@@ -436,13 +501,8 @@
 TEST_F(SaveCardInfobarModalOverlayMediatorWithLoadingAndConfirmationTest,
        LoadingViewShownAndDismissedByUser_Metrics) {
   base::HistogramTester histogramTester;
-  NSString* cardholderName = @"name";
-  NSString* month = @"3";
-  NSString* year = @"23";
 
-  [mediator_ saveCardWithCardholderName:cardholderName
-                        expirationMonth:month
-                         expirationYear:year];
+  SaveCard();
 
   histogramTester.ExpectUniqueSample("Autofill.CreditCardUpload.LoadingShown",
                                      true, 1);
@@ -465,14 +525,8 @@
 TEST_F(SaveCardInfobarModalOverlayMediatorWithLoadingAndConfirmationTest,
        LoadingViewShownAndNotDismissedByUser_Metrics) {
   base::HistogramTester histogramTester;
-  NSString* cardholderName = @"name";
-  NSString* month = @"3";
-  NSString* year = @"23";
 
-  [mediator_ saveCardWithCardholderName:cardholderName
-                        expirationMonth:month
-                         expirationYear:year];
-
+  SaveCard();
   histogramTester.ExpectUniqueSample("Autofill.CreditCardUpload.LoadingShown",
                                      true, 1);
 
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/BUILD.gn b/ios/chrome/browser/parcel_tracking/ui_bundled/BUILD.gn
deleted file mode 100644
index c490928..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/BUILD.gn
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2023 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("coordinator") {
-  sources = [
-    "parcel_tracking_opt_in_coordinator.h",
-    "parcel_tracking_opt_in_coordinator.mm",
-    "parcel_tracking_opt_in_mediator.h",
-    "parcel_tracking_opt_in_mediator.mm",
-  ]
-  deps = [
-    ":ui",
-    "//base",
-    "//components/commerce/core:shopping_service",
-    "//components/prefs",
-    "//ios/chrome/browser/commerce/model:shopping_service",
-    "//ios/chrome/browser/parcel_tracking:metrics",
-    "//ios/chrome/browser/parcel_tracking:opt_in_status",
-    "//ios/chrome/browser/parcel_tracking:parcel_tracking_step",
-    "//ios/chrome/browser/parcel_tracking:tracking_source",
-    "//ios/chrome/browser/parcel_tracking:util",
-    "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
-    "//ios/chrome/browser/shared/model/browser",
-    "//ios/chrome/browser/shared/model/prefs:pref_names",
-    "//ios/chrome/browser/shared/model/profile",
-    "//ios/chrome/browser/shared/public/commands",
-    "//ios/chrome/common/ui/confirmation_alert",
-    "//ios/web/public",
-    "//ios/web/public/annotations:custom_text_check_result",
-  ]
-}
-
-source_set("ui") {
-  sources = [
-    "parcel_tracking_opt_in_view_controller.h",
-    "parcel_tracking_opt_in_view_controller.mm",
-    "parcel_tracking_opt_in_view_controller_delegate.h",
-  ]
-  deps = [
-    "//base",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/browser/parcel_tracking:opt_in_status",
-    "//ios/chrome/browser/parcel_tracking/ui_bundled/resources",
-    "//ios/chrome/browser/shared/ui/symbols",
-    "//ios/chrome/browser/shared/ui/table_view/cells",
-    "//ios/chrome/common:string_util",
-    "//ios/chrome/common/ui/colors",
-    "//ios/chrome/common/ui/confirmation_alert",
-    "//ios/chrome/common/ui/util",
-    "//net",
-    "//ui/base",
-    "//url",
-  ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-  sources = [ "parcel_tracking_opt_in_coordinator_unittest.mm" ]
-  deps = [
-    ":coordinator",
-    "//base/test:test_support",
-    "//components/prefs",
-    "//ios/chrome/browser/parcel_tracking:metrics",
-    "//ios/chrome/browser/parcel_tracking:opt_in_status",
-    "//ios/chrome/browser/parcel_tracking:util",
-    "//ios/chrome/browser/shared/model/browser/test:test_support",
-    "//ios/chrome/browser/shared/model/prefs:pref_names",
-    "//ios/chrome/browser/shared/model/profile/test",
-    "//ios/web/public/test",
-    "//testing/gtest",
-  ]
-}
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/OWNERS b/ios/chrome/browser/parcel_tracking/ui_bundled/OWNERS
deleted file mode 100644
index bd784c8a..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-thegreenfrog@chromium.org
-hiramahmood@google.com
\ No newline at end of file
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.h b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.h
deleted file mode 100644
index da4efe9f..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_COORDINATOR_H_
-
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller_delegate.h"
-#import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h"
-#import "ios/web/public/annotations/custom_text_checking_result.h"
-
-// Coordinator that manages the parcel tracking opt-in half sheet presentation.
-@interface ParcelTrackingOptInCoordinator
-    : ChromeCoordinator <ParcelTrackingOptInViewControllerDelegate>
-
-// Creates a coordinator that uses `viewController`, `browser`, `webState`, and
-// list of parcels `parcels`.
-- (instancetype)initWithBaseViewController:(UIViewController*)viewController
-                                   browser:(Browser*)browser
-                                   parcels:(NSArray<CustomTextCheckingResult*>*)
-                                               parcels
-    NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithBaseViewController:(UIViewController*)viewController
-                                   browser:(Browser*)browser NS_UNAVAILABLE;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_COORDINATOR_H_
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.mm b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.mm
deleted file mode 100644
index e25de0ce..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.mm
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.h"
-
-#import "base/memory/raw_ptr.h"
-#import "base/metrics/histogram_functions.h"
-#import "components/commerce/core/shopping_service.h"
-#import "components/prefs/pref_service.h"
-#import "ios/chrome/browser/commerce/model/shopping_service_factory.h"
-#import "ios/chrome/browser/parcel_tracking/metrics.h"
-#import "ios/chrome/browser/parcel_tracking/parcel_tracking_opt_in_status.h"
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.h"
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.h"
-#import "ios/chrome/browser/shared/model/browser/browser.h"
-#import "ios/chrome/browser/shared/model/prefs/pref_names.h"
-#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
-#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
-#import "ios/chrome/browser/shared/public/commands/settings_commands.h"
-
-@interface ParcelTrackingOptInCoordinator () <
-    UIAdaptivePresentationControllerDelegate>
-
-@end
-
-@implementation ParcelTrackingOptInCoordinator {
-  raw_ptr<commerce::ShoppingService> _shoppingService;
-  NSArray<CustomTextCheckingResult*>* _parcels;
-  ParcelTrackingOptInMediator* _mediator;
-  ParcelTrackingOptInViewController* _viewController;
-}
-
-- (instancetype)initWithBaseViewController:(UIViewController*)viewController
-                                   browser:(Browser*)browser
-                                   parcels:(NSArray<CustomTextCheckingResult*>*)
-                                               parcels {
-  self = [super initWithBaseViewController:viewController browser:browser];
-  if (self) {
-    _shoppingService =
-        commerce::ShoppingServiceFactory::GetForProfile(browser->GetProfile());
-    _parcels = parcels;
-  }
-  return self;
-}
-
-- (void)start {
-  [super start];
-
-  _mediator = [[ParcelTrackingOptInMediator alloc]
-      initWithShoppingService:_shoppingService];
-  _mediator.parcelTrackingCommandsHandler = HandlerForProtocol(
-      self.browser->GetCommandDispatcher(), ParcelTrackingOptInCommands);
-  _viewController = [[ParcelTrackingOptInViewController alloc] init];
-  _viewController.actionHandler = _viewController;
-  _viewController.delegate = self;
-  _viewController.presentationController.delegate = self;
-  [self.baseViewController presentViewController:_viewController
-                                        animated:YES
-                                      completion:nil];
-  base::UmaHistogramBoolean(parcel_tracking::kOptInPromptDisplayedHistogramName,
-                            true);
-}
-
-- (void)stop {
-  [self dismissPrompt];
-  _mediator = nil;
-  _viewController = nil;
-  [super stop];
-}
-
-#pragma mark - ParcelTrackingOptInViewControllerDelegate
-
-- (void)alwaysTrackTapped {
-  [self dismissPrompt];
-  PrefService* prefs = self.browser->GetProfile()->GetPrefs();
-  prefs->SetBoolean(prefs::kIosParcelTrackingOptInPromptDisplayLimitMet, true);
-  prefs->SetInteger(
-      prefs::kIosParcelTrackingOptInStatus,
-      static_cast<int>(IOSParcelTrackingOptInStatus::kAlwaysTrack));
-  [_mediator didTapAlwaysTrack:_parcels];
-  base::UmaHistogramEnumeration(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kAlwaysTrack);
-}
-
-- (void)askToTrackTapped {
-  [self dismissPrompt];
-  PrefService* prefs = self.browser->GetProfile()->GetPrefs();
-  prefs->SetBoolean(prefs::kIosParcelTrackingOptInPromptDisplayLimitMet, true);
-  prefs->SetInteger(
-      prefs::kIosParcelTrackingOptInStatus,
-      static_cast<int>(IOSParcelTrackingOptInStatus::kAskToTrack));
-  [_mediator didTapAskToTrack:_parcels];
-  base::UmaHistogramEnumeration(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kAskEveryTime);
-}
-
-- (void)noThanksTapped {
-  [self dismissPrompt];
-  PrefService* prefs = self.browser->GetProfile()->GetPrefs();
-  prefs->SetBoolean(prefs::kIosParcelTrackingOptInPromptDisplayLimitMet, true);
-  prefs->SetInteger(
-      prefs::kIosParcelTrackingOptInStatus,
-      static_cast<int>(IOSParcelTrackingOptInStatus::kNeverTrack));
-  base::UmaHistogramEnumeration(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kNoThanks);
-}
-
-- (void)parcelTrackingSettingsPageLinkTapped {
-  [self dismissPrompt];
-  self.browser->GetProfile()->GetPrefs()->SetBoolean(
-      prefs::kIosParcelTrackingOptInPromptDisplayLimitMet, true);
-  id<SettingsCommands> settingsCommandHandler = HandlerForProtocol(
-      self.browser->GetCommandDispatcher(), SettingsCommands);
-  [settingsCommandHandler
-      showGoogleServicesSettingsFromViewController:self.baseViewController];
-}
-
-#pragma mark - UIAdaptivePresentationControllerDelegate
-
-- (void)presentationControllerDidDismiss:
-    (UIPresentationController*)presentationController {
-  // If user has swiped down on the prompt before as well, set
-  // kIosParcelTrackingOptInPromptDisplayLimitMet to true to avoid showing the
-  // prompt again.
-  PrefService* prefs = self.browser->GetProfile()->GetPrefs();
-  if (prefs->GetBoolean(prefs::kIosParcelTrackingOptInPromptSwipedDown)) {
-    prefs->SetBoolean(prefs::kIosParcelTrackingOptInPromptDisplayLimitMet,
-                      true);
-    prefs->SetInteger(
-        prefs::kIosParcelTrackingOptInStatus,
-        static_cast<int>(IOSParcelTrackingOptInStatus::kNeverTrack));
-  } else {
-    prefs->SetBoolean(prefs::kIosParcelTrackingOptInPromptSwipedDown, true);
-  }
-  base::UmaHistogramEnumeration(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kSwipeToDismiss);
-}
-
-#pragma mark - Private
-
-// Dismisses the view controller.
-- (void)dismissPrompt {
-  [_viewController.presentingViewController dismissViewControllerAnimated:YES
-                                                               completion:nil];
-}
-
-@end
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator_unittest.mm b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator_unittest.mm
deleted file mode 100644
index 1810cba0..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator_unittest.mm
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_coordinator.h"
-
-#import <Foundation/Foundation.h>
-
-#import "base/test/metrics/histogram_tester.h"
-#import "components/prefs/pref_service.h"
-#import "ios/chrome/browser/parcel_tracking/metrics.h"
-#import "ios/chrome/browser/parcel_tracking/parcel_tracking_opt_in_status.h"
-#import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
-#import "ios/chrome/browser/shared/model/prefs/pref_names.h"
-#import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
-#import "ios/web/public/test/web_task_environment.h"
-#import "testing/platform_test.h"
-
-// Tests the ParcelTrackingOptInCoordinator.
-class ParcelTrackingOptInCoordinatorTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    profile_ = TestProfileIOS::Builder().Build();
-    browser_ = std::make_unique<TestBrowser>(profile_.get());
-    NSArray<CustomTextCheckingResult*>* array = [[NSArray alloc] init];
-    coordinator_ = [[ParcelTrackingOptInCoordinator alloc]
-        initWithBaseViewController:[[UIViewController alloc] init]
-                           browser:browser_.get()
-                           parcels:array];
-  }
-
- protected:
-  web::WebTaskEnvironment task_environment_;
-  std::unique_ptr<TestProfileIOS> profile_;
-  std::unique_ptr<TestBrowser> browser_;
-  ParcelTrackingOptInCoordinator* coordinator_;
-};
-
-// Test that the kIosParcelTrackingOptInStatus pref is properly set when the
-// "always track" button is tapped.
-TEST_F(ParcelTrackingOptInCoordinatorTest, AlwaysTrack) {
-  base::HistogramTester histogram_tester;
-  [coordinator_ alwaysTrackTapped];
-  EXPECT_EQ(
-      static_cast<int>(IOSParcelTrackingOptInStatus::kAlwaysTrack),
-      profile_->GetPrefs()->GetInteger(prefs::kIosParcelTrackingOptInStatus));
-  histogram_tester.ExpectUniqueSample(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kAlwaysTrack, 1);
-}
-
-// Test that the kIosParcelTrackingOptInStatus pref is properly set when the
-// "no thanks" button is tapped.
-TEST_F(ParcelTrackingOptInCoordinatorTest, NeverTrack) {
-  base::HistogramTester histogram_tester;
-  [coordinator_ noThanksTapped];
-  EXPECT_EQ(
-      static_cast<int>(IOSParcelTrackingOptInStatus::kNeverTrack),
-      profile_->GetPrefs()->GetInteger(prefs::kIosParcelTrackingOptInStatus));
-  histogram_tester.ExpectUniqueSample(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kNoThanks, 1);
-}
-
-// Test that the kIosParcelTrackingOptInStatus pref is properly set when the
-// "ask to track" button is tapped.
-TEST_F(ParcelTrackingOptInCoordinatorTest, AskToTrack) {
-  base::HistogramTester histogram_tester;
-  [coordinator_ askToTrackTapped];
-  EXPECT_EQ(
-      static_cast<int>(IOSParcelTrackingOptInStatus::kAskToTrack),
-      profile_->GetPrefs()->GetInteger(prefs::kIosParcelTrackingOptInStatus));
-  histogram_tester.ExpectUniqueSample(
-      parcel_tracking::kOptInPromptActionHistogramName,
-      parcel_tracking::OptInPromptActionType::kAskEveryTime, 1);
-}
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.h b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.h
deleted file mode 100644
index 02737c8..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_MEDIATOR_H_
-#define IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_MEDIATOR_H_
-
-#import <Foundation/Foundation.h>
-
-#import "components/commerce/core/shopping_service.h"
-#import "ios/chrome/browser/shared/public/commands/parcel_tracking_opt_in_commands.h"
-#import "ios/web/public/annotations/custom_text_checking_result.h"
-
-// Mediator for parcel tracking opt-in prompt that manages model interactions.
-@interface ParcelTrackingOptInMediator : NSObject
-
-// Handler for ParcelTrackingOptInCommands.
-@property(nonatomic, weak) id<ParcelTrackingOptInCommands>
-    parcelTrackingCommandsHandler;
-
-// Designated initializer. `shoppingService` must not be null and must outlive
-// this object.
-- (instancetype)initWithShoppingService:
-    (commerce::ShoppingService*)shoppingService NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-// Handles user tap on "always track".
-- (void)didTapAlwaysTrack:(NSArray<CustomTextCheckingResult*>*)parcelList;
-
-// Handles user tap on "ask to track".
-- (void)didTapAskToTrack:(NSArray<CustomTextCheckingResult*>*)parcelList;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_MEDIATOR_H_
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.mm b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.mm
deleted file mode 100644
index 43218bc..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.mm
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_mediator.h"
-
-#import "base/memory/raw_ptr.h"
-#import "components/commerce/core/shopping_service.h"
-#import "ios/chrome/browser/parcel_tracking/parcel_tracking_step.h"
-#import "ios/chrome/browser/parcel_tracking/parcel_tracking_util.h"
-#import "ios/chrome/browser/parcel_tracking/tracking_source.h"
-#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
-
-@implementation ParcelTrackingOptInMediator {
-  raw_ptr<commerce::ShoppingService> _shoppingService;
-}
-
-- (instancetype)initWithShoppingService:
-    (commerce::ShoppingService*)shoppingService {
-  CHECK(shoppingService);
-
-  self = [super init];
-  if (self) {
-    _shoppingService = shoppingService;
-  }
-  return self;
-}
-
-- (void)didTapAlwaysTrack:(NSArray<CustomTextCheckingResult*>*)parcelList {
-  TrackParcels(_shoppingService, parcelList, std::string(),
-               _parcelTrackingCommandsHandler, true,
-               TrackingSource::kAutoTrack);
-}
-
-- (void)didTapAskToTrack:(NSArray<CustomTextCheckingResult*>*)parcelList {
-  [_parcelTrackingCommandsHandler
-      showParcelTrackingInfobarWithParcels:parcelList
-                                   forStep:ParcelTrackingStep::
-                                               kAskedToTrackPackage];
-}
-
-@end
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.h b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.h
deleted file mode 100644
index b93e549..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h"
-#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h"
-
-@protocol ParcelTrackingOptInViewControllerDelegate;
-
-//  View controller for the parcel tracking opt-in prompt.
-@interface ParcelTrackingOptInViewController
-    : ConfirmationAlertViewController <ConfirmationAlertActionHandler>
-
-// The delegate for interactions in this View Controller.
-@property(nonatomic, weak) id<ParcelTrackingOptInViewControllerDelegate>
-    delegate;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.mm b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.mm
deleted file mode 100644
index 74e8891..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.mm
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller.h"
-
-#import "base/notreached.h"
-#import "ios/chrome/browser/parcel_tracking/parcel_tracking_opt_in_status.h"
-#import "ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller_delegate.h"
-#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
-#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h"
-#import "ios/chrome/common/string_util.h"
-#import "ios/chrome/common/ui/colors/semantic_color_names.h"
-#import "ios/chrome/common/ui/util/constraints_ui_util.h"
-#import "ios/chrome/common/ui/util/ui_util.h"
-#import "ios/chrome/grit/ios_branded_strings.h"
-#import "ios/chrome/grit/ios_strings.h"
-#import "net/base/apple/url_conversions.h"
-#import "ui/base/l10n/l10n_util_mac.h"
-#import "url/gurl.h"
-
-namespace {
-// Name of the parcel tracking icon.
-NSString* const kOptInIcon = @"parcel_tracking_icon_new";
-// Radius size of the table view.
-CGFloat const kTableViewCornerRadius = 10;
-// Spacing before the image.
-CGFloat const kSpacingBeforeImage = 23;
-// Size of the radio buttons.
-CGFloat const kRadioButtonSize = 20;
-}  // namespace
-
-@interface ParcelTrackingOptInViewController () <UITableViewDelegate,
-                                                 UITextViewDelegate,
-                                                 UITableViewDataSource>
-
-@end
-
-@implementation ParcelTrackingOptInViewController {
-  UITableView* _tableView;
-  IOSParcelTrackingOptInStatus _selection;
-  NSLayoutConstraint* _tableViewHeightConstraint;
-}
-
-- (void)viewDidLoad {
-  UIView* tableView = [self createTableView];
-  self.underTitleView = tableView;
-  self.titleString =
-      l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE);
-  self.primaryActionString =
-      l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING);
-  self.secondaryActionString =
-      l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_OPT_IN_SECONDARY_ACTION);
-  self.titleTextStyle = UIFontTextStyleTitle2;
-  self.subtitleString =
-      l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE);
-  self.subtitleTextStyle = UIFontTextStyleCallout;
-  self.showDismissBarButton = NO;
-  self.image = [UIImage imageNamed:kOptInIcon];
-  self.imageHasFixedSize = true;
-  self.topAlignedLayout = YES;
-  self.customSpacingAfterImage = 0;
-  self.customSpacingBeforeImageIfNoNavigationBar = kSpacingBeforeImage;
-  [super viewDidLoad];
-
-  // Assign table view's width anchor now that it is in the same hierarchy as
-  // the top view.
-  [NSLayoutConstraint activateConstraints:@[
-    [tableView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
-    [tableView.widthAnchor
-        constraintEqualToAnchor:tableView.superview.widthAnchor],
-  ]];
-
-  [self setPrimaryButtonConfiguration];
-  self.primaryActionButton.enabled = NO;
-}
-
-- (void)viewWillLayoutSubviews {
-  [super viewWillLayoutSubviews];
-  [self updateTableViewHeightConstraint];
-}
-
-#pragma mark - ConfirmationAlertViewController
-
-- (void)customizeSubtitle:(UITextView*)subtitle {
-  NSMutableParagraphStyle* paragraphStyle =
-      [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
-  paragraphStyle.alignment = NSTextAlignmentCenter;
-  NSDictionary* textAttributes = @{
-    NSForegroundColorAttributeName : [UIColor colorNamed:kTextSecondaryColor],
-    NSFontAttributeName :
-        [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline],
-    NSParagraphStyleAttributeName : paragraphStyle,
-  };
-  NSDictionary* linkAttributes = @{
-    NSLinkAttributeName : net::NSURLWithGURL(GURL("chrome://settings")),
-    NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)
-  };
-  subtitle.attributedText = AttributedStringFromStringWithLink(
-      l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE),
-      textAttributes, linkAttributes);
-  subtitle.delegate = self;
-  subtitle.selectable = YES;
-  subtitle.textContainer.lineFragmentPadding = 0;
-}
-
-#pragma mark - ConfirmationAlertActionHandler
-
-- (void)confirmationAlertPrimaryAction {
-  switch (_selection) {
-    case IOSParcelTrackingOptInStatus::kAlwaysTrack:
-      [self.delegate alwaysTrackTapped];
-      break;
-    case IOSParcelTrackingOptInStatus::kAskToTrack:
-      [self.delegate askToTrackTapped];
-      break;
-    case IOSParcelTrackingOptInStatus::kNeverTrack:
-    case IOSParcelTrackingOptInStatus::kStatusNotSet:
-      NOTREACHED();
-  }
-}
-
-- (void)confirmationAlertSecondaryAction {
-  [self.delegate noThanksTapped];
-}
-
-#pragma mark - UITextViewDelegate
-
-#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0
-- (BOOL)textView:(UITextView*)textView
-    shouldInteractWithURL:(NSURL*)URL
-                  inRange:(NSRange)characterRange
-              interaction:(UITextItemInteraction)interaction {
-  [self.delegate parcelTrackingSettingsPageLinkTapped];
-  return NO;
-}
-#endif
-
-- (UIAction*)textView:(UITextView*)textView
-    primaryActionForTextItem:(UITextItem*)textItem
-               defaultAction:(UIAction*)defaultAction API_AVAILABLE(ios(17.0)) {
-  __weak __typeof(self) weakSelf = self;
-  return [UIAction actionWithHandler:^(UIAction* action) {
-    [weakSelf.delegate parcelTrackingSettingsPageLinkTapped];
-  }];
-}
-
-#pragma mark - UITableViewDataSource
-
-- (NSInteger)tableView:(UITableView*)tableView
-    numberOfRowsInSection:(NSInteger)section {
-  return 2;
-}
-
-- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
-  return 1;
-}
-
-- (UITableViewCell*)tableView:(UITableView*)tableView
-        cellForRowAtIndexPath:(NSIndexPath*)indexPath {
-  TableViewTextCell* cell =
-      [tableView dequeueReusableCellWithIdentifier:@"cell"];
-
-  NSString* title = indexPath.row == 0
-                        ? l10n_util::GetNSString(
-                              IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION)
-                        : l10n_util::GetNSString(
-                              IDS_IOS_PARCEL_TRACKING_OPT_IN_TERTIARY_ACTION);
-  cell.selectionStyle = UITableViewCellSelectionStyleNone;
-  cell.backgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor];
-  cell.userInteractionEnabled = YES;
-  cell.textLabel.text = title;
-  cell.isAccessibilityElement = YES;
-  cell.accessibilityLabel = cell.textLabel.text;
-  cell.accessibilityTraits =
-      [self accessibilityTraitsForButton:/*selected=*/NO];
-
-  cell.accessoryView =
-      [[UIImageView alloc] initWithImage:DefaultSymbolTemplateWithPointSize(
-                                             kCircleSymbol, kRadioButtonSize)];
-  cell.accessoryView.tintColor = [UIColor colorNamed:kGrey500Color];
-
-  // Make separator invisible on second cell.
-  if (indexPath.row > 0) {
-    cell.separatorInset =
-        UIEdgeInsetsMake(0.f, tableView.frame.size.width, 0.f, 0.f);
-  }
-
-  return cell;
-}
-
-#pragma mark - UITableViewDelegate
-
-- (void)tableView:(UITableView*)tableView
-    didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
-  _selection = indexPath.row == 0 ? IOSParcelTrackingOptInStatus::kAlwaysTrack
-                                  : IOSParcelTrackingOptInStatus::kAskToTrack;
-  UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
-  UIImage* icon = DefaultSymbolWithPointSize(kButtonProgrammableSymbol,
-                                             kSymbolAccessoryPointSize);
-  cell.accessoryView = [[UIImageView alloc] initWithImage:icon];
-  cell.accessoryView.tintColor = [UIColor colorNamed:kBlueColor];
-  self.primaryActionButton.enabled = YES;
-  cell.accessibilityTraits =
-      [self accessibilityTraitsForButton:/*selected=*/YES];
-}
-
-- (void)tableView:(UITableView*)tableView
-    didDeselectRowAtIndexPath:(NSIndexPath*)indexPath {
-  UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
-  cell.accessoryView = [[UIImageView alloc]
-      initWithImage:DefaultSymbolTemplateWithPointSize(
-                        kCircleSymbol, kSymbolAccessoryPointSize)];
-  cell.accessoryView.tintColor = [UIColor colorNamed:kGrey500Color];
-  cell.accessibilityTraits =
-      [self accessibilityTraitsForButton:/*selected=*/NO];
-}
-
-#pragma mark - Private
-
-// Creates the view with the "always track" and "ask to track" options.
-- (UITableView*)createTableView {
-  _tableView = [[UITableView alloc] initWithFrame:CGRectZero
-                                            style:UITableViewStylePlain];
-  _tableView.layer.cornerRadius = kTableViewCornerRadius;
-  _tableView.estimatedRowHeight = UITableViewAutomaticDimension;
-  _tableView.scrollEnabled = NO;
-  _tableView.showsVerticalScrollIndicator = NO;
-  _tableView.delegate = self;
-  _tableView.userInteractionEnabled = YES;
-  _tableView.translatesAutoresizingMaskIntoConstraints = NO;
-  _tableView.dataSource = self;
-  _tableView.separatorInset = UIEdgeInsetsZero;
-  [_tableView registerClass:TableViewTextCell.class
-      forCellReuseIdentifier:@"cell"];
-  _tableViewHeightConstraint =
-      [_tableView.heightAnchor constraintEqualToConstant:0];
-  _tableViewHeightConstraint.active = YES;
-
-  return _tableView;
-}
-
-// Updates the tableView's height constraint.
-- (void)updateTableViewHeightConstraint {
-  CGFloat totalCellHeight = 0;
-  for (UITableViewCell* cell in _tableView.visibleCells) {
-    totalCellHeight += cell.frame.size.height;
-  }
-  _tableViewHeightConstraint.constant = totalCellHeight;
-}
-
-// Sets the configurationUpdateHandler for the primaryActionButton to handle the
-// button's state changes. The button should be disabled initially and only
-// enabled after an option, either "always track" or "ask to track", has been
-// selected by the user.
-- (void)setPrimaryButtonConfiguration {
-  UIButton* button = self.primaryActionButton;
-  button.configurationUpdateHandler = ^(UIButton* incomingButton) {
-    UIButtonConfiguration* updatedConfig = incomingButton.configuration;
-    switch (incomingButton.state) {
-      case UIControlStateDisabled: {
-        updatedConfig.background.backgroundColor =
-            [UIColor colorNamed:kGrey200Color];
-        updatedConfig.baseForegroundColor = [UIColor colorNamed:kGrey600Color];
-        break;
-      }
-      case UIControlStateNormal: {
-        updatedConfig.background.backgroundColor =
-            [UIColor colorNamed:kBlueColor];
-        updatedConfig.baseForegroundColor =
-            [UIColor colorNamed:kBackgroundColor];
-        break;
-      }
-      default:
-        break;
-    }
-    incomingButton.configuration = updatedConfig;
-  };
-}
-
-// Returns the accessibility traits for the radio button options. `selected`
-// should be true if the radio button is selected.
-- (UIAccessibilityTraits)accessibilityTraitsForButton:(BOOL)selected {
-  UIAccessibilityTraits accessibilityTraits = UIAccessibilityTraitButton;
-  if (selected) {
-    accessibilityTraits |= UIAccessibilityTraitSelected;
-  }
-  return accessibilityTraits;
-}
-
-@end
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller_delegate.h b/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller_delegate.h
deleted file mode 100644
index 78024b6..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/parcel_tracking_opt_in_view_controller_delegate.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_VIEW_CONTROLLER_DELEGATE_H_
-#define IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_VIEW_CONTROLLER_DELEGATE_H_
-
-#import <Foundation/Foundation.h>
-
-// Delegate protocol for ParcelTrackingOptInViewController.
-@protocol ParcelTrackingOptInViewControllerDelegate <NSObject>
-
-// Called when "always track" is selected.
-- (void)alwaysTrackTapped;
-
-// Called when "ask to track" is selected.
-- (void)askToTrackTapped;
-
-// Called when "no thanks" is selected.
-- (void)noThanksTapped;
-
-// Called when the link to open the settings page is tapped.
-- (void)parcelTrackingSettingsPageLinkTapped;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_PARCEL_TRACKING_UI_BUNDLED_PARCEL_TRACKING_OPT_IN_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/Contents.json b/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/Contents.json
deleted file mode 100644
index 73c0059..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/Contents.json b/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/Contents.json
deleted file mode 100644
index 53854f3..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/Contents.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "images": [
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "parcel_tracking_icon_new@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "parcel_tracking_icon_new@3x.png"
-        }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
-    }
-}
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@2x.png b/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@2x.png
deleted file mode 100644
index d7d853b..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@2x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@3x.png b/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@3x.png
deleted file mode 100644
index b131d185..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@3x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/BUILD.gn b/ios/chrome/browser/parcel_tracking/ui_bundled/resources/BUILD.gn
deleted file mode 100644
index 773678a..0000000
--- a/ios/chrome/browser/parcel_tracking/ui_bundled/resources/BUILD.gn
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2023 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ios/rules.gni")
-
-bundle_data_xcassets("resources") {
-  catalog = "Assets.xcassets"
-  sources = [
-    "Assets.xcassets/Contents.json",
-    "Assets.xcassets/parcel_tracking_icon_new.imageset/Contents.json",
-    "Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@2x.png",
-    "Assets.xcassets/parcel_tracking_icon_new.imageset/parcel_tracking_icon_new@3x.png",
-  ]
-}
diff --git a/ios/chrome/browser/passwords/model/BUILD.gn b/ios/chrome/browser/passwords/model/BUILD.gn
index a610c75..842c1418 100644
--- a/ios/chrome/browser/passwords/model/BUILD.gn
+++ b/ios/chrome/browser/passwords/model/BUILD.gn
@@ -358,6 +358,7 @@
     "//components/password_manager/core/common",
     "//components/prefs",
     "//ios/chrome/browser/shared/model/profile",
+    "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/test/app:test_support",
     "//ios/testing:nserror_support",
     "//ios/web/public",
diff --git a/ios/chrome/browser/passwords/model/password_manager_app_interface.h b/ios/chrome/browser/passwords/model/password_manager_app_interface.h
index 2caa1fa..b4d5703 100644
--- a/ios/chrome/browser/passwords/model/password_manager_app_interface.h
+++ b/ios/chrome/browser/passwords/model/password_manager_app_interface.h
@@ -38,6 +38,9 @@
 // Returns the number of stored credentials.
 + (int)storedCredentialsCount;
 
+// Returns true if the Passkeys M2 feature is enabled.
++ (bool)isPasskeysM2FeatureEnabled;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_PASSWORDS_MODEL_PASSWORD_MANAGER_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/passwords/model/password_manager_app_interface.mm b/ios/chrome/browser/passwords/model/password_manager_app_interface.mm
index e0eb6302..9872f01 100644
--- a/ios/chrome/browser/passwords/model/password_manager_app_interface.mm
+++ b/ios/chrome/browser/passwords/model/password_manager_app_interface.mm
@@ -17,6 +17,7 @@
 #import "components/prefs/pref_service.h"
 #import "ios/chrome/browser/passwords/model/ios_chrome_profile_password_store_factory.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/testing/nserror_util.h"
@@ -174,4 +175,8 @@
       });
 }
 
++ (bool)isPasskeysM2FeatureEnabled {
+  return IOSPasskeysM2Enabled();
+}
+
 @end
diff --git a/ios/chrome/browser/promos_manager/model/constants.cc b/ios/chrome/browser/promos_manager/model/constants.cc
index 34ff37c..776dbc20 100644
--- a/ios/chrome/browser/promos_manager/model/constants.cc
+++ b/ios/chrome/browser/promos_manager/model/constants.cc
@@ -80,6 +80,10 @@
     return promos_manager::Promo::PostDefaultAbandonment;
   }
 
+  if (promo == "promos_manager::Promo::SigninFullscreen") {
+    return promos_manager::Promo::SigninFullscreen;
+  }
+
   return std::nullopt;
 }
 
@@ -119,6 +123,8 @@
       return "StaySafeDefaultBrowser";
     case promos_manager::Promo::PostDefaultAbandonment:
       return "PostDefaultAbandonment";
+    case promos_manager::Promo::SigninFullscreen:
+      return "SigninFullscreen";
   }
 }
 
diff --git a/ios/chrome/browser/promos_manager/model/constants.h b/ios/chrome/browser/promos_manager/model/constants.h
index 1ec19320..51c0046 100644
--- a/ios/chrome/browser/promos_manager/model/constants.h
+++ b/ios/chrome/browser/promos_manager/model/constants.h
@@ -46,7 +46,8 @@
   MadeForIOSDefaultBrowser = 14,   // "Made For iOS" default browser promo.
   StaySafeDefaultBrowser = 15,     // "Stay Safe" default browser promo.
   PostDefaultAbandonment = 16,     // Post-default browser abandonment alert.
-  kMaxValue = PostDefaultAbandonment,
+  SigninFullscreen = 17,           // Sign-in fullscreen promo.
+  kMaxValue = SigninFullscreen,
 };
 // LINT.ThenChange(/ios/chrome/browser/promos_manager/model/constants.cc)
 // Also update IOSPromosManagerPromo in
diff --git a/ios/chrome/browser/promos_manager/model/promos_manager_feature_engagement_unittest.mm b/ios/chrome/browser/promos_manager/model/promos_manager_feature_engagement_unittest.mm
index eae4ff0..89cc1f3 100644
--- a/ios/chrome/browser/promos_manager/model/promos_manager_feature_engagement_unittest.mm
+++ b/ios/chrome/browser/promos_manager/model/promos_manager_feature_engagement_unittest.mm
@@ -26,6 +26,7 @@
         &feature_engagement::kIPHiOSPromoWhatsNewFeature,
         &feature_engagement::kIPHiOSPromoGenericDefaultBrowserFeature,
         &feature_engagement::kIPHiOSDockingPromoFeature,
+        &feature_engagement::kIPHiOSPromoSigninFullscreenFeature,
     };
   }
 };
diff --git a/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn b/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn
index d59439ce..f50f329 100644
--- a/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn
@@ -91,6 +91,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/app_store_rating/ui_bundled",
     "//ios/chrome/browser/app_store_rating/ui_bundled:features",
+    "//ios/chrome/browser/authentication/ui_bundled/signin/promo",
     "//ios/chrome/browser/credential_provider_promo/ui_bundled:coordinator",
     "//ios/chrome/browser/default_browser/model:utils",
     "//ios/chrome/browser/default_promo/ui_bundled/post_default_abandonment",
diff --git a/ios/chrome/browser/promos_manager/ui_bundled/DEPS b/ios/chrome/browser/promos_manager/ui_bundled/DEPS
index ca18a07..498ba89 100644
--- a/ios/chrome/browser/promos_manager/ui_bundled/DEPS
+++ b/ios/chrome/browser/promos_manager/ui_bundled/DEPS
@@ -10,6 +10,7 @@
   "+ios/chrome/browser/sync/model/sync_service_factory.h",
   "+ios/chrome/browser/ui/app_store_rating",
   "+ios/chrome/browser/ui/whats_new",
+  "+ios/chrome/browser/authentication/ui_bundled/signin/promo",
 ]
 
 specific_include_rules = {
diff --git a/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm b/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm
index 0f6674f9..12d05ff 100644
--- a/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm
+++ b/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm
@@ -21,6 +21,7 @@
 #import "ios/chrome/app/tests_hook.h"
 #import "ios/chrome/browser/app_store_rating/ui_bundled/app_store_rating_display_handler.h"
 #import "ios/chrome/browser/app_store_rating/ui_bundled/features.h"
+#import "ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_display_handler.h"
 #import "ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_display_handler.h"
 #import "ios/chrome/browser/default_browser/model/utils.h"
 #import "ios/chrome/browser/default_promo/ui_bundled/all_tabs_default_browser_promo_view_provider.h"
@@ -604,6 +605,10 @@
       [[DefaultBrowserPromoDisplayHandler alloc] init];
   _displayHandlerPromos[promos_manager::Promo::DefaultBrowserRemindMeLater] =
       [[DefaultBrowserRemindMeLaterPromoDisplayHandler alloc] init];
+
+  // Sign-in fullscreen promo handler.
+  _displayHandlerPromos[promos_manager::Promo::SigninFullscreen] =
+      [[SigninFullscreenPromoDisplayHandler alloc] init];
 }
 
 - (void)registerStandardPromoViewProviderPromos {
diff --git a/ios/chrome/browser/settings/ui_bundled/password/BUILD.gn b/ios/chrome/browser/settings/ui_bundled/password/BUILD.gn
index 221274c..e88dd44 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/BUILD.gn
+++ b/ios/chrome/browser/settings/ui_bundled/password/BUILD.gn
@@ -321,6 +321,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/authentication/ui_bundled:eg_test_support+eg2",
     "//ios/chrome/browser/metrics/model:eg_test_support+eg2",
+    "//ios/chrome/browser/passwords/model:eg_test_support+eg2",
     "//ios/chrome/browser/passwords/model/metrics",
     "//ios/chrome/browser/policy/model:eg_test_support+eg2",
     "//ios/chrome/browser/settings/ui_bundled:settings_root_constants",
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm b/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
index fa37f7ef..47919fd 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
@@ -26,6 +26,7 @@
 #import "ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.h"
 #import "ios/chrome/browser/metrics/model/metrics_app_interface.h"
 #import "ios/chrome/browser/passwords/model/metrics/ios_password_manager_metrics.h"
+#import "ios/chrome/browser/passwords/model/password_manager_app_interface.h"
 #import "ios/chrome/browser/policy/model/policy_earl_grey_utils.h"
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_constants.h"
@@ -2723,15 +2724,7 @@
 // Tests that the duplicate credential section alert is shown when the user adds
 // a credential that has the same website as that of an existing credential
 // (does not contain username).
-// TODO(crbug.com/40279461): Fix flaky test & re-enable.
-#if TARGET_OS_SIMULATOR
-#define MAYBE_testDuplicatedCredentialWithNoUsername \
-  DISABLED_testDuplicatedCredentialWithNoUsername
-#else
-#define MAYBE_testDuplicatedCredentialWithNoUsername \
-  testDuplicatedCredentialWithNoUsername
-#endif
-- (void)MAYBE_testDuplicatedCredentialWithNoUsername {
+- (void)testDuplicatedCredentialWithNoUsername {
   OpenPasswordManager();
 
   [[EarlGrey selectElementWithMatcher:AddPasswordToolbarButton()]
@@ -2967,10 +2960,27 @@
   id<GREYMatcher> offMatcher = grey_allOf(
       grey_accessibilityLabel(l10n_util::GetNSString(IDS_IOS_SETTING_OFF)),
       grey_sufficientlyVisible(), nil);
+  if ([PasswordManagerAppInterface isPasskeysM2FeatureEnabled]) {
+    if (@available(iOS 18, *)) {
+      offMatcher = grey_allOf(grey_accessibilityLabel(@"Leading detail text"),
+                              grey_sufficientlyVisible(), nil);
+    }
+  }
 
-  // No detail text should appear until the AutoFill status has been populated.
-  [[EarlGrey selectElementWithMatcher:onMatcher] assertWithMatcher:grey_nil()];
-  [[EarlGrey selectElementWithMatcher:offMatcher] assertWithMatcher:grey_nil()];
+  if ([PasswordManagerAppInterface isPasskeysM2FeatureEnabled]) {
+    // When the Passkeys M2 feature is on, the AutoFill status is defaulted to
+    // "off" until populated.
+    [ChromeEarlGrey waitForUIElementToAppearWithMatcher:offMatcher];
+    [[EarlGrey selectElementWithMatcher:onMatcher]
+        assertWithMatcher:grey_nil()];
+  } else {
+    // No detail text should appear until the AutoFill status has been
+    // populated.
+    [[EarlGrey selectElementWithMatcher:onMatcher]
+        assertWithMatcher:grey_nil()];
+    [[EarlGrey selectElementWithMatcher:offMatcher]
+        assertWithMatcher:grey_nil()];
+  }
 
   [PasswordsInOtherAppsAppInterface startFakeManagerWithAutoFillStatus:NO];
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:offMatcher];
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm
index 5d20739..aefb637 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm
@@ -87,6 +87,20 @@
                                     : IDS_IOS_OFFER_TO_SAVE_PASSWORDS);
 }
 
+// Helper method that returns whether the `passwordsInOtherAppsItem` should be
+// tappable depending on its accessory type.
+BOOL IsPasswordsInOtherAppsItemTappable(
+    UITableViewCellAccessoryType cell_accessory_type) {
+  switch (cell_accessory_type) {
+    case UITableViewCellAccessoryNone:
+      return NO;
+    case UITableViewCellAccessoryDisclosureIndicator:
+      return YES;
+    default:
+      NOTREACHED();
+  }
+}
+
 // Whether automatic passkey upgrades feature is enabled.
 BOOL AutomaticPasskeyUpgradeFeatureEnabled() {
   return base::FeatureList::IsEnabled(
@@ -108,6 +122,8 @@
   // Whether or not Chromium has been enabled as a credential provider at the
   // iOS level. This may not be known at load time; the detail text showing on
   // or off status will be omitted until this is populated.
+  // TODO(crbug.com/396694707): Should become a plain bool once the Passkeys M2
+  // feature is launched.
   std::optional<bool> _passwordsInOtherAppsEnabled;
 
   // Whether the change PIN button should be set up. This will be true when it's
@@ -380,7 +396,10 @@
   NSInteger itemType = [self.tableViewModel itemTypeForIndexPath:indexPath];
   switch (itemType) {
     case ItemTypePasswordsInOtherApps: {
-      [self.presentationDelegate showPasswordsInOtherAppsScreen];
+      if (IsPasswordsInOtherAppsItemTappable(
+              self.passwordsInOtherAppsItem.accessoryType)) {
+        [self.presentationDelegate showPasswordsInOtherAppsScreen];
+      }
       break;
     }
     case ItemTypeBulkMovePasswordsToAccountButton: {
@@ -433,6 +452,9 @@
       return self.canExportPasswords;
     case ItemTypeSavePasswordsSwitch:
       return NO;
+    case ItemTypePasswordsInOtherApps:
+      return IsPasswordsInOtherAppsItemTappable(
+          self.passwordsInOtherAppsItem.accessoryType);
   }
   return YES;
 }
@@ -532,9 +554,11 @@
   _passwordsInOtherAppsItem.text = l10n_util::GetNSString(
       IOSPasskeysM2Enabled() ? IDS_IOS_SETTINGS_PASSWORDS_PASSKEYS_IN_OTHER_APPS
                              : IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS);
-  _passwordsInOtherAppsItem.accessoryType =
-      UITableViewCellAccessoryDisclosureIndicator;
-  _passwordsInOtherAppsItem.accessibilityTraits |= UIAccessibilityTraitButton;
+  if (!IOSPasskeysM2Enabled()) {
+    _passwordsInOtherAppsItem.accessoryType =
+        UITableViewCellAccessoryDisclosureIndicator;
+    _passwordsInOtherAppsItem.accessibilityTraits |= UIAccessibilityTraitButton;
+  }
   _passwordsInOtherAppsItem.accessibilityIdentifier =
       kPasswordSettingsPasswordsInOtherAppsRowId;
   [self updatePasswordsInOtherAppsItem];
@@ -986,17 +1010,57 @@
 // Updates the appearance of the Passwords In Other Apps item to reflect the
 // current state of `_passwordsInOtherAppsEnabled`.
 - (void)updatePasswordsInOtherAppsItem {
-  if (_passwordsInOtherAppsEnabled.has_value()) {
+  if (!_passwordsInOtherAppsEnabled.has_value()) {
+    if (IOSPasskeysM2Enabled()) {
+      // If the `passwordsInOtherAppsEnabled` value hasn't been set yet when the
+      // Passkeys M2 feature is enabled, default to `NO` as it doesn't make
+      // sense, in this case, for the UI to be in an intermediate state.
+      _passwordsInOtherAppsEnabled = NO;
+    } else {
+      return;
+    }
+  }
+
+  // Whether the `passwordsInOtherAppsItem` should be tappable and allow the
+  // user to access the Passwords in Other Apps view. The UI of the cell varies
+  // depending on whether or not it is tappable.
+  BOOL shouldPasswordsInOtherAppsItemBeTappable = YES;
+  if (@available(iOS 18, *)) {
+    shouldPasswordsInOtherAppsItemBeTappable =
+        !IOSPasskeysM2Enabled() || _passwordsInOtherAppsEnabled.value();
+  }
+
+  if (shouldPasswordsInOtherAppsItemBeTappable) {
+    self.passwordsInOtherAppsItem.leadingDetailText = nil;
     self.passwordsInOtherAppsItem.trailingDetailText =
         _passwordsInOtherAppsEnabled.value()
             ? l10n_util::GetNSString(IDS_IOS_SETTING_ON)
             : l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
-
-    if (self.modelLoadStatus != ModelLoadComplete) {
-      return;
-    }
-    [self reconfigureCellsForItems:@[ self.passwordsInOtherAppsItem ]];
+    self.passwordsInOtherAppsItem.accessoryType =
+        UITableViewCellAccessoryDisclosureIndicator;
+    self.passwordsInOtherAppsItem.accessibilityTraits |=
+        UIAccessibilityTraitButton;
+  } else {
+    // TODO(crbug.com/394580626): Replace placeholder string once strings are
+    // ready.
+    self.passwordsInOtherAppsItem.leadingDetailText = @"Leading detail text";
+    self.passwordsInOtherAppsItem.trailingDetailText = nil;
+    self.passwordsInOtherAppsItem.accessoryType = UITableViewCellAccessoryNone;
+    self.passwordsInOtherAppsItem.accessibilityTraits &=
+        ~UIAccessibilityTraitButton;
   }
+
+  // TODO(crbug.com/394580626): Create and manage visibility of the "Turn on
+  // autofill" button.
+
+  if (self.modelLoadStatus != ModelLoadComplete) {
+    return;
+  }
+  [self reconfigureCellsForItems:@[ self.passwordsInOtherAppsItem ]];
+
+  // Refresh the cells' height.
+  [self.tableView beginUpdates];
+  [self.tableView endUpdates];
 }
 
 // Updates the UI to present the correct elements for the user's current
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm
index ccadb8c0..37b1047b 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm
@@ -111,17 +111,59 @@
 
 TEST_F(PasswordSettingsViewControllerTest,
        DisplaysPasswordInOtherAppsDisabled) {
-  id<PasswordSettingsConsumer> consumer =
-      base::apple::ObjCCast<PasswordSettingsViewController>(controller());
-  [consumer setPasswordsInOtherAppsEnabled:NO];
+  {
+    // Enable the Passkeys M2 feature and re-create the controller so that the
+    // enabled flag is picked up.
+    base::test::ScopedFeatureList feature_list(kIOSPasskeysM2);
+    CreateController();
 
-  TableViewMultiDetailTextItem* passwordsInOtherAppsItem =
-      static_cast<TableViewMultiDetailTextItem*>(
-          GetTableViewItem(/*section=*/1, /*item=*/0));
-  EXPECT_NSEQ(passwordsInOtherAppsItem.text,
-              l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS));
-  EXPECT_NSEQ(passwordsInOtherAppsItem.trailingDetailText,
-              l10n_util::GetNSString(IDS_IOS_SETTING_OFF));
+    id<PasswordSettingsConsumer> consumer =
+        base::apple::ObjCCast<PasswordSettingsViewController>(controller());
+    [consumer setPasswordsInOtherAppsEnabled:NO];
+
+    TableViewMultiDetailTextItem* passwords_in_other_apps_item =
+        static_cast<TableViewMultiDetailTextItem*>(
+            GetTableViewItem(/*section=*/1, /*item=*/0));
+    EXPECT_NSEQ(passwords_in_other_apps_item.text,
+                l10n_util::GetNSString(
+                    IDS_IOS_SETTINGS_PASSWORDS_PASSKEYS_IN_OTHER_APPS));
+    if (@available(iOS 18, *)) {
+      EXPECT_NSEQ(passwords_in_other_apps_item.leadingDetailText,
+                  @"Leading detail text");
+      EXPECT_FALSE(passwords_in_other_apps_item.trailingDetailText);
+      EXPECT_EQ(passwords_in_other_apps_item.accessoryType,
+                UITableViewCellAccessoryNone);
+    } else {
+      EXPECT_FALSE(passwords_in_other_apps_item.leadingDetailText);
+      EXPECT_NSEQ(passwords_in_other_apps_item.trailingDetailText,
+                  l10n_util::GetNSString(IDS_IOS_SETTING_OFF));
+      EXPECT_EQ(passwords_in_other_apps_item.accessoryType,
+                UITableViewCellAccessoryDisclosureIndicator);
+    }
+  }
+  {
+    // Disable the Passkeys M2 feature and re-create the controller so that the
+    // disabled flag is picked up.
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndDisableFeature(kIOSPasskeysM2);
+    CreateController();
+
+    id<PasswordSettingsConsumer> consumer =
+        base::apple::ObjCCast<PasswordSettingsViewController>(controller());
+    [consumer setPasswordsInOtherAppsEnabled:NO];
+
+    TableViewMultiDetailTextItem* passwords_in_other_apps_item =
+        static_cast<TableViewMultiDetailTextItem*>(
+            GetTableViewItem(/*section=*/1, /*item=*/0));
+    EXPECT_FALSE(passwords_in_other_apps_item.leadingDetailText);
+    EXPECT_NSEQ(
+        passwords_in_other_apps_item.text,
+        l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS));
+    EXPECT_NSEQ(passwords_in_other_apps_item.trailingDetailText,
+                l10n_util::GetNSString(IDS_IOS_SETTING_OFF));
+    EXPECT_EQ(passwords_in_other_apps_item.accessoryType,
+              UITableViewCellAccessoryDisclosureIndicator);
+  }
 }
 
 TEST_F(PasswordSettingsViewControllerTest, DisplaysPasswordInOtherAppsEnabled) {
@@ -129,13 +171,18 @@
       base::apple::ObjCCast<PasswordSettingsViewController>(controller());
   [consumer setPasswordsInOtherAppsEnabled:YES];
 
-  TableViewMultiDetailTextItem* passwordsInOtherAppsItem =
+  TableViewMultiDetailTextItem* passwords_in_other_apps_item =
       static_cast<TableViewMultiDetailTextItem*>(
           GetTableViewItem(/*section=*/1, /*item=*/0));
-  EXPECT_NSEQ(passwordsInOtherAppsItem.text,
-              l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS));
-  EXPECT_NSEQ(passwordsInOtherAppsItem.trailingDetailText,
+  EXPECT_NSEQ(passwords_in_other_apps_item.text,
+              l10n_util::GetNSString(
+                  IOSPasskeysM2Enabled()
+                      ? IDS_IOS_SETTINGS_PASSWORDS_PASSKEYS_IN_OTHER_APPS
+                      : IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS));
+  EXPECT_NSEQ(passwords_in_other_apps_item.trailingDetailText,
               l10n_util::GetNSString(IDS_IOS_SETTING_ON));
+  EXPECT_EQ(passwords_in_other_apps_item.accessoryType,
+            UITableViewCellAccessoryDisclosureIndicator);
 }
 
 TEST_F(PasswordSettingsViewControllerTest,
diff --git a/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/BUILD.gn b/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/BUILD.gn
index a7c8e34..7c084b0 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/BUILD.gn
+++ b/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/BUILD.gn
@@ -114,6 +114,7 @@
     ":constants",
     ":eg_test_support+eg2",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/passwords/model:eg_test_support+eg2",
     "//ios/chrome/browser/settings/ui_bundled:settings_root_constants",
     "//ios/chrome/browser/settings/ui_bundled/password:eg_test_support",
     "//ios/chrome/browser/settings/ui_bundled/password:eg_test_support+eg2",
diff --git a/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/passwords_in_other_apps_egtest.mm b/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/passwords_in_other_apps_egtest.mm
index 7cc6f9be..3b18383 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/passwords_in_other_apps_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/passwords_in_other_apps/passwords_in_other_apps_egtest.mm
@@ -4,6 +4,7 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/chrome/browser/passwords/model/password_manager_app_interface.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest_utils.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_settings_app_interface.h"
@@ -69,6 +70,15 @@
 
 // Action to open the Passwords in Other Apps modal from Chrome root view.
 void OpensPasswordsInOtherApps() {
+  // The autofill status needs to be set to "on" on iOS 18+ when the Passkeys M2
+  // feature is enabled as the Passwords in Other Apps screen isn't accessible
+  // otherwise.
+  if (@available(iOS 18, *)) {
+    if ([PasswordManagerAppInterface isPasskeysM2FeatureEnabled]) {
+      [PasswordsInOtherAppsAppInterface startFakeManagerWithAutoFillStatus:YES];
+    }
+  }
+
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI
       tapSettingsMenuButton:chrome_test_util::SettingsMenuPasswordsButton()];
@@ -182,6 +192,13 @@
 // Tests Passwords In Other Apps first shows instructions when auto-fill is off,
 // then shows the caption label after auto-fill is turned on.
 - (void)testTurnOnPasswordsInOtherApps {
+  if (@available(iOS 18, *)) {
+    if ([PasswordManagerAppInterface isPasskeysM2FeatureEnabled]) {
+      EARL_GREY_TEST_SKIPPED(@"The Password in Other Apps screen isn't "
+                             @"accessible as of iOS 18 when autofill is off.");
+    }
+  }
+
   // Rewrites passwordInAppsViewController.useShortInstruction property.
   EarlGreyScopedBlockSwizzler longInstruction(
       @"PasswordsInOtherAppsViewController", @"useShortInstruction", ^{
@@ -226,6 +243,13 @@
 // Tests Passwords In Other Apps shows instructions when auto-fill is off with
 // short instruction.
 - (void)testShowPasswordsInOtherAppsWithShortInstruction {
+  if (@available(iOS 18, *)) {
+    if ([PasswordManagerAppInterface isPasskeysM2FeatureEnabled]) {
+      EARL_GREY_TEST_SKIPPED(@"The Password in Other Apps screen isn't "
+                             @"accessible as of iOS 18 when autofill is off.");
+    }
+  }
+
   // Rewrites passwordInAppsViewController.useShortInstruction property.
   EarlGreyScopedBlockSwizzler shortInstruction(
       @"PasswordsInOtherAppsViewController", @"useShortInstruction", ^{
@@ -243,9 +267,13 @@
   // Check backup instructions are visible.
   NSArray<NSString*>* steps = @[
     l10n_util::GetNSString(
-        IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_1_IOS16),
+        [PasswordManagerAppInterface isPasskeysM2FeatureEnabled]
+            ? IDS_IOS_SETTINGS_PASSWORDS_PASSKEYS_IN_OTHER_APPS_SHORTENED_STEP_1
+            : IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_1_IOS16),
     l10n_util::GetNSString(
-        IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_2)
+        [PasswordManagerAppInterface isPasskeysM2FeatureEnabled]
+            ? IDS_IOS_SETTINGS_PASSWORDS_PASSKEYS_IN_OTHER_APPS_SHORTENED_STEP_2
+            : IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_2)
   ];
   for (NSString* step in steps) {
     [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(step)]
@@ -258,6 +286,12 @@
 // Tests Passwords In Other Apps shows instructions when auto-fill state is
 // unknown.
 - (void)testOpenPasswordsInOtherAppsWithAutoFillUnknown {
+  if ([PasswordManagerAppInterface isPasskeysM2FeatureEnabled]) {
+    EARL_GREY_TEST_SKIPPED(
+        @"The autofill state can't be unknown as it's defaulted to `off` when "
+        @"the Passkeys M2 feature is enabled.");
+  }
+
   OpensPasswordsInOtherApps();
 
   [self checkThatCommonElementsAreVisible];
diff --git a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
index 3ffd4fa..3529311 100644
--- a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
+++ b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
@@ -100,6 +100,8 @@
     "//ios/chrome/browser/authentication/ui_bundled/account_menu",
     "//ios/chrome/browser/authentication/ui_bundled/enterprise:enterprise_utils",
     "//ios/chrome/browser/authentication/ui_bundled/signin",
+    "//ios/chrome/browser/authentication/ui_bundled/signin:features",
+    "//ios/chrome/browser/authentication/ui_bundled/signin/promo",
     "//ios/chrome/browser/blocking_overlay/ui_bundled",
     "//ios/chrome/browser/browser_view/ui_bundled",
     "//ios/chrome/browser/browsing_data/model",
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index 918b23dd..d02b44c 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -54,6 +54,8 @@
 #import "ios/chrome/browser/app_store_rating/ui_bundled/features.h"
 #import "ios/chrome/browser/appearance/ui_bundled/appearance_customization.h"
 #import "ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.h"
+#import "ios/chrome/browser/authentication/ui_bundled/signin/features.h"
+#import "ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h"
@@ -1107,6 +1109,10 @@
   // scenarios.
   [sceneState addAgent:[[CredentialProviderPromoSceneAgent alloc]
                            initWithPromosManager:promosManager]];
+
+  if (IsFullscreenSigninPromoManagerMigrationEnabled()) {
+    [sceneState addAgent:[[SigninFullscreenPromoSceneAgent alloc] init]];
+  }
 }
 
 // Determines the mode (normal or incognito) the initial UI should be in.
diff --git a/ios/chrome/browser/shared/model/url/chrome_url_constants.cc b/ios/chrome/browser/shared/model/url/chrome_url_constants.cc
index 02377d6d..19b2937 100644
--- a/ios/chrome/browser/shared/model/url/chrome_url_constants.cc
+++ b/ios/chrome/browser/shared/model/url/chrome_url_constants.cc
@@ -74,10 +74,12 @@
     commerce::kChromeUICommerceInternalsHost,
     kChromeUIChromeURLsHost,
     kChromeUICreditsHost,
+    kChromeUIDownloadInternalsHost,
     kChromeUIFlagsHost,
     kChromeUIHistogramHost,
     kChromeUIInspectHost,
     kChromeUIInterstitialsHost,
+    kChromeUILocalStateHost,
     kChromeUIManagementHost,
     kChromeUINetExportHost,
     kChromeUINewTabHost,
diff --git a/ios/chrome/browser/side_swipe/ui_bundled/BUILD.gn b/ios/chrome/browser/side_swipe/ui_bundled/BUILD.gn
index 1bcfbda..cfa416d1 100644
--- a/ios/chrome/browser/side_swipe/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/side_swipe/ui_bundled/BUILD.gn
@@ -7,6 +7,8 @@
     "card_side_swipe_view.h",
     "card_side_swipe_view.mm",
     "horizontal_pan_gesture_handler.h",
+    "side_swipe_coordinator.h",
+    "side_swipe_coordinator.mm",
     "side_swipe_mediator+Testing.h",
     "side_swipe_mediator.h",
     "side_swipe_mediator.mm",
@@ -25,11 +27,14 @@
     "//components/feature_engagement/public",
     "//components/reading_list/core",
     "//ios/chrome/app/theme",
+    "//ios/chrome/browser/feature_engagement/model",
     "//ios/chrome/browser/fullscreen/ui_bundled",
     "//ios/chrome/browser/lens_overlay/model",
     "//ios/chrome/browser/ntp/model:util",
     "//ios/chrome/browser/ntp/ui_bundled",
     "//ios/chrome/browser/reading_list/model",
+    "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
+    "//ios/chrome/browser/shared/coordinator/layout_guide",
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/url",
     "//ios/chrome/browser/shared/model/url:constants",
diff --git a/ios/chrome/browser/side_swipe/ui_bundled/DEPS b/ios/chrome/browser/side_swipe/ui_bundled/DEPS
index 501a796..a91c9d6 100644
--- a/ios/chrome/browser/side_swipe/ui_bundled/DEPS
+++ b/ios/chrome/browser/side_swipe/ui_bundled/DEPS
@@ -9,7 +9,8 @@
   "+ios/chrome/browser/web/model/page_placeholder_tab_helper.h",
   "+ios/chrome/browser/web/model/web_navigation_util.h",
   "+ios/chrome/browser/lens_overlay/model/lens_overlay_tab_helper.h",
-  "+ios/chrome/browser/lens_overlay/coordinator/lens_overlay_availability.h"
+  "+ios/chrome/browser/lens_overlay/coordinator/lens_overlay_availability.h",
+  "+ios/chrome/browser/feature_engagement/model/tracker_factory.h"
 ]
 
 specific_include_rules = {
diff --git a/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.h b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.h
new file mode 100644
index 0000000..8f5f517
--- /dev/null
+++ b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.h
@@ -0,0 +1,68 @@
+// 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_SIDE_SWIPE_UI_BUNDLED_SIDE_SWIPE_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_SIDE_SWIPE_UI_BUNDLED_SIDE_SWIPE_COORDINATOR_H_
+
+#import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h"
+#import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h"
+
+@protocol SideSwipeToolbarInteracting;
+
+// The side swipe coordinator.
+@interface SideSwipeCoordinator : ChromeCoordinator
+
+// The side swipe mediator delegate.
+@property(nonatomic, weak) id<SideSwipeMediatorDelegate> swipeDelegate;
+
+// Whether or not a side swipe is currently being performed.
+@property(nonatomic, assign) BOOL swipeInProgress;
+
+// Handler for the toolbar interaction.
+@property(nonatomic, weak) id<SideSwipeToolbarInteracting>
+    toolbarInteractionHandler;
+
+// Snapshot provider for top and bottom toolbars.
+@property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding>
+    toolbarSnapshotProvider;
+
+// Delegate for tab strip highlighting.
+@property(nonatomic, weak) id<TabStripHighlighting> tabStripDelegate;
+
+// Set up swipe gesture recognizers to the given view.
+- (void)addHorizontalGesturesToView:(UIView*)view;
+
+// Enable or disable the side swipe gesture recognizer.
+- (void)setEnabled:(BOOL)enabled;
+
+// Cancels any ongoing side swipe animation.
+- (void)stopActiveSideSwipeAnimation;
+
+// Animates page side swipe in a given direction.
+- (void)animatePageSideSwipeInDirection:
+    (UISwipeGestureRecognizerDirection)direction;
+
+// Prepares the view for a slide-in overlay navigation transition in the
+// specified direction.
+//
+// This method sets up for an overlay navigation transition where the entire
+// screen is initially positioned offscreen. A snapshot of the screen is taken
+// and used to replace the current fullscreen view, creating a seamless slide-in
+// effect when `slideToCenterAnimated` is called.
+//
+// Important: After calling this method, you must call `slideToCenterAnimated`
+// to restore the fullscreen view to its original position and complete the
+// transition.
+- (void)prepareForSlideInDirection:(UISwipeGestureRecognizerDirection)direction;
+
+// Restores the fullscreen view to its original position with an animation.
+//
+// This method animates the fullscreen view back to its original onscreen
+// position after it has been moved offscreen using
+// `prepareForSlideInDirection:`.
+- (void)slideToCenterAnimated;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_SIDE_SWIPE_UI_BUNDLED_SIDE_SWIPE_COORDINATOR_H_
diff --git a/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.mm b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.mm
new file mode 100644
index 0000000..01c23a1
--- /dev/null
+++ b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_coordinator.mm
@@ -0,0 +1,85 @@
+// 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/side_swipe/ui_bundled/side_swipe_coordinator.h"
+
+#import "base/memory/raw_ptr.h"
+#import "components/feature_engagement/public/tracker.h"
+#import "ios/chrome/browser/feature_engagement/model/tracker_factory.h"
+#import "ios/chrome/browser/fullscreen/ui_bundled/fullscreen_controller.h"
+#import "ios/chrome/browser/shared/coordinator/layout_guide/layout_guide_util.h"
+#import "ios/chrome/browser/shared/model/browser/browser.h"
+#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
+#import "ios/chrome/browser/shared/public/commands/help_commands.h"
+#import "ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h"
+
+@implementation SideSwipeCoordinator {
+  SideSwipeMediator* _sideSwipeMediator;
+  raw_ptr<FullscreenController> _fullscreenController;
+}
+
+- (void)start {
+  _fullscreenController = FullscreenController::FromBrowser(self.browser);
+  ProfileIOS* profile = self.browser->GetProfile();
+  feature_engagement::Tracker* engagementTracker =
+      feature_engagement::TrackerFactory::GetForProfile(profile);
+  _sideSwipeMediator = [[SideSwipeMediator alloc]
+      initWithFullscreenController:_fullscreenController
+                      webStateList:self.browser->GetWebStateList()];
+  _sideSwipeMediator.layoutGuideCenter =
+      LayoutGuideCenterForBrowser(self.browser);
+  _sideSwipeMediator.toolbarInteractionHandler = self.toolbarInteractionHandler;
+  _sideSwipeMediator.toolbarSnapshotProvider = self.toolbarSnapshotProvider;
+  _sideSwipeMediator.engagementTracker = engagementTracker;
+  _sideSwipeMediator.helpHandler =
+      HandlerForProtocol(self.browser->GetCommandDispatcher(), HelpCommands);
+}
+
+- (void)stop {
+  _fullscreenController = nullptr;
+  [_sideSwipeMediator disconnect];
+  _sideSwipeMediator = nil;
+}
+
+- (void)stopActiveSideSwipeAnimation {
+  [_sideSwipeMediator resetContentView];
+}
+
+- (void)addHorizontalGesturesToView:(UIView*)view {
+  [_sideSwipeMediator addHorizontalGesturesToView:view];
+}
+
+- (void)setEnabled:(BOOL)enabled {
+  [_sideSwipeMediator setEnabled:enabled];
+}
+
+- (BOOL)swipeInProgress {
+  return [_sideSwipeMediator isSideSwipeInProgress];
+}
+
+- (void)setSwipeInProgress:(BOOL)inSwipe {
+  [_sideSwipeMediator setInSwipe:inSwipe];
+}
+
+- (void)setSwipeDelegate:(id<SideSwipeMediatorDelegate>)swipeDelegate {
+  [_sideSwipeMediator setSwipeDelegate:swipeDelegate];
+  _swipeDelegate = swipeDelegate;
+}
+
+- (void)animatePageSideSwipeInDirection:
+    (UISwipeGestureRecognizerDirection)direction {
+  [_sideSwipeMediator animateSwipe:SwipeType::CHANGE_PAGE
+                       inDirection:direction];
+}
+
+- (void)prepareForSlideInDirection:
+    (UISwipeGestureRecognizerDirection)direction {
+  [_sideSwipeMediator prepareForSlideInDirection:direction];
+}
+
+- (void)slideToCenterAnimated {
+  [_sideSwipeMediator slideToCenterAnimated];
+}
+
+@end
diff --git a/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h
index aef739d..e6cff2e 100644
--- a/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h
+++ b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.h
@@ -102,8 +102,8 @@
 // Enable or disable the side swipe gesture recognizer.
 - (void)setEnabled:(BOOL)enabled;
 
-// Returns `NO` if the device should not rotate.
-- (BOOL)shouldAutorotate;
+// Whether or not a side swipe is in progress.
+- (BOOL)isSideSwipeInProgress;
 
 // Resets the swipeDelegate's contentView frame origin x position to zero if
 // there is an active swipe.
diff --git a/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.mm b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.mm
index d1dd9f1..a5d035f4 100644
--- a/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.mm
+++ b/ios/chrome/browser/side_swipe/ui_bundled/side_swipe_mediator.mm
@@ -251,8 +251,8 @@
   [_swipeGestureRecognizer setEnabled:enabled];
 }
 
-- (BOOL)shouldAutorotate {
-  return !([_tabSideSwipeView window] || _inSwipe);
+- (BOOL)isSideSwipeInProgress {
+  return ([_tabSideSwipeView window] || _inSwipe);
 }
 
 - (void)handlePan:(SideSwipeGestureRecognizer*)gesture {
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 16309d2..8152d7f6 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
@@ -322,6 +322,7 @@
   testonly = true
   sources = [
     "shared_tab_groups_egtest.mm",
+    "shared_tab_groups_panel_egtest.mm",
     "tab_group_sync_egtest.mm",
     "tab_group_sync_signin_egtest.mm",
     "tab_groups_eg_utils.h",
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_panel_egtest.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_panel_egtest.mm
new file mode 100644
index 0000000..4317eaa
--- /dev/null
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_panel_egtest.mm
@@ -0,0 +1,177 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "base/strings/sys_string_conversions.h"
+#import "components/data_sharing/public/features.h"
+#import "components/data_sharing/public/group_data.h"
+#import "components/data_sharing/test_support/test_utils.h"
+#import "ios/chrome/browser/authentication/ui_bundled/signin_earl_grey.h"
+#import "ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/signin/model/fake_system_identity.h"
+#import "ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_app_interface.h"
+#import "ios/chrome/browser/tab_switcher/ui_bundled/test/query_title_server_util.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/chrome/test/earl_grey/test_switches.h"
+#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/earl_grey_test.h"
+#import "net/test/embedded_test_server/embedded_test_server.h"
+#import "ui/base/l10n/l10n_util.h"
+
+using chrome_test_util::DeleteSharedConfirmationButton;
+using chrome_test_util::DeleteSharedGroupButton;
+using chrome_test_util::LeaveSharedGroupButton;
+using chrome_test_util::LeaveSharedGroupConfirmationButton;
+using chrome_test_util::TabGridGroupCellAtIndex;
+using chrome_test_util::TabGridTabGroupsPanelButton;
+using chrome_test_util::TabGroupsPanelCellWithName;
+
+namespace {
+
+NSString* const kGroupTitle = @"shared group";
+
+// Adds a shared tab group. User's role depends on its fake identity.
+void AddSharedGroup() {
+  [TabGroupAppInterface prepareFakeSharedTabGroups:1];
+  [ChromeEarlGreyUI openTabGrid];
+  // Wait for the group cell to appear.
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
+                      chrome_test_util::TabGridGroupCellAtIndex(1)];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::
+                                          TabGridCloseButtonForCellAtIndex(0)]
+      performAction:grey_tap()];
+}
+
+}  // namespace
+
+// Tests for shared groups in the tab groups panel.
+// Sync and sign-in tests are implemented in TabGroupSyncSignInTestCase.
+@interface SharedTabGroupsPanelTestCase : ChromeTestCase
+@end
+
+@implementation SharedTabGroupsPanelTestCase
+
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(kTabGroupsIPad);
+  config.features_enabled.push_back(kModernTabStrip);
+  config.features_enabled.push_back(kTabGroupSync);
+  config.features_enabled.push_back(
+      data_sharing::features::kDataSharingFeature);
+  // Add the flag to use FakeTabGroupSyncService.
+  config.additional_args.push_back(
+      "--" + std::string(test_switches::kEnableFakeTabGroupSyncService));
+  return config;
+}
+
+- (void)setUp {
+  [super setUp];
+  RegisterQueryTitleHandler(self.testServer);
+  GREYAssertTrue(self.testServer->Start(), @"Test server failed to start");
+
+  // `fakeIdentity2` joins shared groups as member.
+  FakeSystemIdentity* identity = [FakeSystemIdentity fakeIdentity1];
+  if ([self
+          isRunningTest:@selector(testSharedTabGroupsPanelDeleteSharedGroup)]) {
+    // `fakeIdentity2` joins shared groups as owner.
+    identity = [FakeSystemIdentity fakeIdentity2];
+  }
+  [SigninEarlGreyUI signinWithFakeIdentity:identity enableHistorySync:YES];
+}
+
+- (void)tearDownHelper {
+  [super tearDownHelper];
+  // Delete all groups.
+  [TabGroupAppInterface cleanup];
+}
+
+// Tests that deleting a shared tab group from groups panel works.
+- (void)testSharedTabGroupsPanelDeleteSharedGroup {
+  if (@available(iOS 17, *)) {
+  } else if ([ChromeEarlGrey isIPadIdiom]) {
+    EARL_GREY_TEST_SKIPPED(@"Only available on iOS 17+ on iPad.");
+  }
+  AddSharedGroup();
+
+  [[EarlGrey selectElementWithMatcher:TabGridTabGroupsPanelButton()]
+      performAction:grey_tap()];
+
+  // Check that the group with `kGroupTitle` exists.
+  [[EarlGrey
+      selectElementWithMatcher:TabGroupsPanelCellWithName(kGroupTitle, 1)]
+      assertWithMatcher:grey_notNil()];
+
+  // Long press the group.
+  [[EarlGrey
+      selectElementWithMatcher:TabGroupsPanelCellWithName(kGroupTitle, 1)]
+      performAction:grey_longPress()];
+
+  // Verify that the leave button is not available.
+  [[EarlGrey selectElementWithMatcher:LeaveSharedGroupButton()]
+      assertWithMatcher:grey_notVisible()];
+
+  // Delete the shared group.
+  [[EarlGrey selectElementWithMatcher:DeleteSharedGroupButton()]
+      performAction:grey_tap()];
+  // Tap on the delete button again to confirm the deletion.
+  [[EarlGrey selectElementWithMatcher:DeleteSharedConfirmationButton()]
+      performAction:grey_tap()];
+
+  // Check that the group has been deleted.
+  GREYCondition* groupsDeletedCheck =
+      [GREYCondition conditionWithName:@"Wait for tab groups to be deleted"
+                                 block:^{
+                                   return [ChromeEarlGrey mainTabCount] == 0;
+                                 }];
+  bool groupsDeleted = [groupsDeletedCheck waitWithTimeout:10];
+  GREYAssertTrue(groupsDeleted, @"Failed to delete the shared group");
+}
+
+// Tests that leaving a shared tab group from groups panel works.
+- (void)testSharedTabGroupsPanelLeaveSharedGroup {
+  if (@available(iOS 17, *)) {
+  } else if ([ChromeEarlGrey isIPadIdiom]) {
+    EARL_GREY_TEST_SKIPPED(@"Only available on iOS 17+ on iPad.");
+  }
+  AddSharedGroup();
+
+  [[EarlGrey selectElementWithMatcher:TabGridTabGroupsPanelButton()]
+      performAction:grey_tap()];
+
+  // Check that the group with `kGroupTitle` exists.
+  [[EarlGrey
+      selectElementWithMatcher:TabGroupsPanelCellWithName(kGroupTitle, 1)]
+      assertWithMatcher:grey_notNil()];
+
+  // Long press the group.
+  [[EarlGrey
+      selectElementWithMatcher:TabGroupsPanelCellWithName(kGroupTitle, 1)]
+      performAction:grey_longPress()];
+
+  // Verify that the delete button is not available.
+  [[EarlGrey selectElementWithMatcher:DeleteSharedGroupButton()]
+      assertWithMatcher:grey_notVisible()];
+
+  // Leave the shared group.
+  [[EarlGrey selectElementWithMatcher:LeaveSharedGroupButton()]
+      performAction:grey_tap()];
+  // Tap on the leave button confirmation.
+  [[EarlGrey selectElementWithMatcher:LeaveSharedGroupConfirmationButton()]
+      performAction:grey_tap()];
+
+  // Check that the group has been leaved.
+  GREYCondition* groupsLeavedCheck =
+      [GREYCondition conditionWithName:@"Wait for tab groups to be leaved"
+                                 block:^{
+                                   return [ChromeEarlGrey mainTabCount] == 0;
+                                 }];
+  bool groupsLeaved = [groupsLeavedCheck waitWithTimeout:10];
+  GREYAssertTrue(groupsLeaved, @"Failed to leave the shared group");
+}
+
+@end
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_coordinator.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_coordinator.mm
index 303e9c8975..1cf2098e 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_coordinator.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_coordinator.mm
@@ -156,8 +156,8 @@
 }
 
 - (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
-    showDeleteConfirmationWithSyncID:(const base::Uuid)syncID
-                          sourceView:(UIView*)sourceView {
+    showDeleteGroupConfirmationWithSyncID:(const base::Uuid)syncID
+                               sourceView:(UIView*)sourceView {
   _tabGroupConfirmationCoordinator = [[TabGroupConfirmationCoordinator alloc]
       initWithBaseViewController:self.baseViewController
                          browser:self.browser
@@ -171,6 +171,42 @@
   [_tabGroupConfirmationCoordinator start];
 }
 
+- (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
+    showDeleteSharedGroupConfirmationWithSyncID:(const base::Uuid)syncID
+                                     groupTitle:(NSString*)groupTitle
+                                     sourceView:(UIView*)sourceView {
+  _tabGroupConfirmationCoordinator = [[TabGroupConfirmationCoordinator alloc]
+      initWithBaseViewController:self.baseViewController
+                         browser:self.browser
+                      actionType:TabGroupActionType::kDeleteSharedTabGroup
+                      sourceView:sourceView];
+  _tabGroupConfirmationCoordinator.tabGroupName = groupTitle;
+  __weak TabGroupsPanelCoordinator* weakSelf = self;
+  _tabGroupConfirmationCoordinator.primaryAction = ^{
+    [weakSelf deleteSharedTabGroup:syncID];
+  };
+
+  [_tabGroupConfirmationCoordinator start];
+}
+
+- (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
+    showLeaveSharedGroupConfirmationWithSyncID:(const base::Uuid)syncID
+                                    groupTitle:(NSString*)groupTitle
+                                    sourceView:(UIView*)sourceView {
+  _tabGroupConfirmationCoordinator = [[TabGroupConfirmationCoordinator alloc]
+      initWithBaseViewController:self.baseViewController
+                         browser:self.browser
+                      actionType:TabGroupActionType::kLeaveSharedTabGroup
+                      sourceView:sourceView];
+  _tabGroupConfirmationCoordinator.tabGroupName = groupTitle;
+  __weak TabGroupsPanelCoordinator* weakSelf = self;
+  _tabGroupConfirmationCoordinator.primaryAction = ^{
+    [weakSelf leaveSharedTabGroup:syncID];
+  };
+
+  [_tabGroupConfirmationCoordinator start];
+}
+
 #pragma mark - Private
 
 // Deletes a synced tab group and dismisses the confirmation coordinator.
@@ -180,4 +216,18 @@
   _tabGroupConfirmationCoordinator = nil;
 }
 
+// Deletes a shared tab group and dismisses the confirmation coordinator.
+- (void)deleteSharedTabGroup:(const base::Uuid&)syncID {
+  [_mediator deleteSharedTabGroup:syncID];
+  [_tabGroupConfirmationCoordinator stop];
+  _tabGroupConfirmationCoordinator = nil;
+}
+
+// Leaves a shared tab group and dismisses the confirmation coordinator.
+- (void)leaveSharedTabGroup:(const base::Uuid&)syncID {
+  [_mediator leaveSharedTabGroup:syncID];
+  [_tabGroupConfirmationCoordinator stop];
+  _tabGroupConfirmationCoordinator = nil;
+}
+
 @end
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.h b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.h
index adcba6c..8d5022f3 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.h
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.h
@@ -81,6 +81,12 @@
 // Deletes a synced group for `syncID`.
 - (void)deleteSyncedTabGroup:(const base::Uuid&)syncID;
 
+// Deletes a shared group for `syncID`.
+- (void)deleteSharedTabGroup:(const base::Uuid&)syncID;
+
+// Leaves a shared group for `syncID`.
+- (void)leaveSharedTabGroup:(const base::Uuid&)syncID;
+
 // Disconnects the mediator.
 - (void)disconnect;
 
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.mm
index b9d7e5c1..b8420e5 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator.mm
@@ -40,12 +40,15 @@
 #import "ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator_delegate.h"
 #import "ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/toolbars/tab_grid_toolbars_configuration.h"
 #import "ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/toolbars/tab_grid_toolbars_grid_delegate.h"
+#import "ios/chrome/browser/tab_switcher/ui_bundled/tab_group_action_type.h"
 #import "ios/chrome/common/ui/favicon/favicon_attributes.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util_mac.h"
 #import "ui/gfx/favicon_size.h"
 #import "ui/gfx/image/image.h"
 
+using PeopleGroupActionOutcome =
+    data_sharing::DataSharingService::PeopleGroupActionOutcome;
 using ScopedDataSharingSyncObservation =
     base::ScopedObservation<data_sharing::DataSharingService,
                             data_sharing::DataSharingService::Observer>;
@@ -216,6 +219,16 @@
   }
 }
 
+- (void)deleteSharedTabGroup:(const base::Uuid&)syncID {
+  [self takeActionForActionType:TabGroupActionType::kDeleteSharedTabGroup
+                 sharedTabGroup:syncID];
+}
+
+- (void)leaveSharedTabGroup:(const base::Uuid&)syncID {
+  [self takeActionForActionType:TabGroupActionType::kLeaveSharedTabGroup
+                 sharedTabGroup:syncID];
+}
+
 - (void)disconnect {
   if (_messagingService) {
     _messagingService->RemovePersistentMessageObserver(
@@ -401,8 +414,36 @@
 - (void)deleteTabGroupsPanelItem:(TabGroupsPanelItem*)item
                       sourceView:(UIView*)sourceView {
   [self.delegate tabGroupsPanelMediator:self
-       showDeleteConfirmationWithSyncID:item.savedTabGroupID
-                             sourceView:sourceView];
+      showDeleteGroupConfirmationWithSyncID:item.savedTabGroupID
+                                 sourceView:sourceView];
+}
+
+- (void)leaveSharedTabGroupsPanelItem:(TabGroupsPanelItem*)item
+                           sourceView:(UIView*)sourceView {
+  std::optional<tab_groups::SavedTabGroup> group =
+      _tabGroupSyncService->GetGroup(item.savedTabGroupID);
+  if (!group) {
+    return;
+  }
+  [self.delegate tabGroupsPanelMediator:self
+      showLeaveSharedGroupConfirmationWithSyncID:item.savedTabGroupID
+                                      groupTitle:base::SysUTF16ToNSString(
+                                                     group->title())
+                                      sourceView:sourceView];
+}
+
+- (void)deleteSharedTabGroupsPanelItem:(TabGroupsPanelItem*)item
+                            sourceView:(UIView*)sourceView {
+  std::optional<tab_groups::SavedTabGroup> group =
+      _tabGroupSyncService->GetGroup(item.savedTabGroupID);
+  if (!group) {
+    return;
+  }
+  [self.delegate tabGroupsPanelMediator:self
+      showDeleteSharedGroupConfirmationWithSyncID:item.savedTabGroupID
+                                       groupTitle:base::SysUTF16ToNSString(
+                                                      group->title())
+                                       sourceView:sourceView];
 }
 
 - (void)deleteNotificationItem:(TabGroupsPanelItem*)item {
@@ -568,4 +609,50 @@
              : SharingState::kShared;
 }
 
+// Takes the corresponded action to `actionType` for the shared `groupSyncID`.
+// TabGroupActionType must be kLeaveSharedTabGroup or kDeleteSharedTabGroup.
+- (void)takeActionForActionType:(TabGroupActionType)actionType
+                 sharedTabGroup:(const base::Uuid&)groupSyncID {
+  std::optional<tab_groups::SavedTabGroup> group =
+      _tabGroupSyncService->GetGroup(groupSyncID);
+  if (!group || !group.has_value() || !group->collaboration_id().has_value()) {
+    return;
+  }
+
+  const tab_groups::CollaborationId collabId =
+      group->collaboration_id().value();
+  const data_sharing::GroupId groupId = data_sharing::GroupId(collabId.value());
+
+  __weak TabGroupsPanelMediator* weakSelf = self;
+  auto callback = base::BindOnce(^(PeopleGroupActionOutcome outcome) {
+    BOOL success = outcome == PeopleGroupActionOutcome::kSuccess;
+    [weakSelf handleTakeActionForActionTypeOutcome:success];
+  });
+
+  // TODO(crbug.com/393073658): Block the screen.
+
+  // Asynchronously call on the server.
+  switch (actionType) {
+    case TabGroupActionType::kLeaveSharedTabGroup:
+      _dataSharingService->LeaveGroup(groupId, std::move(callback));
+      break;
+    case TabGroupActionType::kDeleteSharedTabGroup:
+      _dataSharingService->DeleteGroup(groupId, std::move(callback));
+      break;
+    case TabGroupActionType::kUngroupTabGroup:
+    case TabGroupActionType::kDeleteTabGroup:
+    case TabGroupActionType::kLeaveOrKeepSharedTabGroup:
+    case TabGroupActionType::kDeleteOrKeepSharedTabGroup:
+      NOTREACHED();
+  }
+}
+
+// Called when `takeActionForActionType:forSharedTabGroup:` server's call
+// returned.
+- (void)handleTakeActionForActionTypeOutcome:(BOOL)success {
+  // TODO(crbug.com/393073658):
+  // - Unblock the screen.
+  // - Show an error if needed.
+}
+
 @end
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator_delegate.h b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator_delegate.h
index 380779a..ddb8410 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator_delegate.h
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mediator_delegate.h
@@ -20,8 +20,24 @@
 // bottom on iPhone to confirm that the group with `syncID` is going to be
 // deleted.
 - (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
-    showDeleteConfirmationWithSyncID:(const base::Uuid)syncID
-                          sourceView:(UIView*)sourceView;
+    showDeleteGroupConfirmationWithSyncID:(const base::Uuid)syncID
+                               sourceView:(UIView*)sourceView;
+
+// Displays a confirmation dialog anchoring to `sourceView` on iPad or at the
+// bottom on iPhone to confirm that the shared group with `syncID` is going to
+// be deleted.
+- (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
+    showDeleteSharedGroupConfirmationWithSyncID:(const base::Uuid)syncID
+                                     groupTitle:(NSString*)groupTitle
+                                     sourceView:(UIView*)sourceView;
+
+// Displays a confirmation dialog anchoring to `sourceView` on iPad or at the
+// bottom on iPhone to confirm that the shared group with `syncID` is going to
+// be leaved.
+- (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
+    showLeaveSharedGroupConfirmationWithSyncID:(const base::Uuid)syncID
+                                    groupTitle:(NSString*)groupTitle
+                                    sourceView:(UIView*)sourceView;
 
 @end
 
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mutator.h b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mutator.h
index b35ffa5..6fc0e84f 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mutator.h
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_mutator.h
@@ -19,6 +19,16 @@
 - (void)deleteTabGroupsPanelItem:(TabGroupsPanelItem*)item
                       sourceView:(UIView*)sourceView;
 
+// Tells the receiver to leave the shared group associated with `item`.
+// `sourceView` is the view that the delete action originated from.
+- (void)leaveSharedTabGroupsPanelItem:(TabGroupsPanelItem*)item
+                           sourceView:(UIView*)sourceView;
+
+// Tells the receiver to delete the shared group associated with `item`.
+// `sourceView` is the view that the delete action originated from.
+- (void)deleteSharedTabGroupsPanelItem:(TabGroupsPanelItem*)item
+                            sourceView:(UIView*)sourceView;
+
 // Tells the receiver to remove the notifications associated with `item`.
 - (void)deleteNotificationItem:(TabGroupsPanelItem*)item;
 
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_view_controller.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_view_controller.mm
index 8a96ec5b..010b5de 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_view_controller.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_view_controller.mm
@@ -588,15 +588,17 @@
     case SharingState::kShared: {
       [menuElements
           addObject:[actionFactory actionToLeaveSharedTabGroupWithBlock:^{
-                        // TODO(crbug.com/375586820): Implement this.
-                    }]];
+            [weakSelf.mutator leaveSharedTabGroupsPanelItem:cell.item
+                                                 sourceView:cell];
+          }]];
       break;
     }
     case SharingState::kSharedAndOwned: {
       [menuElements
           addObject:[actionFactory actionToDeleteSharedTabGroupWithBlock:^{
-                        // TODO(crbug.com/375586820): Implement this.
-                    }]];
+            [weakSelf.mutator deleteSharedTabGroupsPanelItem:cell.item
+                                                  sourceView:cell];
+          }]];
       break;
     }
   }
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 529ee8a..11ec60a1 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -63,6 +63,7 @@
     "//ios/chrome/browser/ntp/ui_bundled:constants",
     "//ios/chrome/browser/ntp/ui_bundled:feature_flags",
     "//ios/chrome/browser/ntp_tiles/model",
+    "//ios/chrome/browser/optimization_guide/model:model",
     "//ios/chrome/browser/parcel_tracking:features",
     "//ios/chrome/browser/parcel_tracking:prefs",
     "//ios/chrome/browser/passwords/model:password_checkup_utils",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
index 5fca0c8..52d78b4 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -61,6 +61,7 @@
 #import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h"
 #import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_constants.h"
 #import "ios/chrome/browser/ntp_tiles/model/ios_most_visited_sites_factory.h"
+#import "ios/chrome/browser/optimization_guide/model/optimization_guide_service_factory.h"
 #import "ios/chrome/browser/parcel_tracking/features.h"
 #import "ios/chrome/browser/parcel_tracking/parcel_tracking_prefs.h"
 #import "ios/chrome/browser/passwords/model/password_checkup_utils.h"
@@ -392,11 +393,12 @@
 
   if (IsTabResumptionEnabled()) {
     _tabResumptionMediator = [[TabResumptionMediator alloc]
-        initWithPrefService:prefs
-            identityManager:identityManager
-                    browser:self.browser
-            shoppingService:commerce::ShoppingServiceFactory::GetForProfile(
-                                profile)];
+              initWithLocalState:GetApplicationContext()->GetLocalState()
+                     prefService:prefs
+                 identityManager:identityManager
+                         browser:self.browser
+        optimizationGuideService:OptimizationGuideServiceFactory::GetForProfile(
+                                     profile)];
     _tabResumptionMediator.NTPActionsDelegate = self.NTPActionsDelegate;
     _tabResumptionMediator.contentSuggestionsMetricsRecorder =
         self.contentSuggestionsMetricsRecorder;
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_ranking_model_unittest.mm b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_ranking_model_unittest.mm
index 6560c93..e1824e4 100644
--- a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_ranking_model_unittest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_ranking_model_unittest.mm
@@ -325,10 +325,11 @@
          URLLoadingBrowserAgent:url_loader_
                     prefService:GetLocalState()];
     _tabResumptionMediator = [[FakeTabResumptionMediator alloc]
-        initWithPrefService:GetProfile()->GetPrefs()
-            identityManager:identityManager
-                    browser:browser_.get()
-            shoppingService:nil];
+              initWithLocalState:GetLocalState()
+                     prefService:GetProfile()->GetPrefs()
+                 identityManager:identityManager
+                         browser:browser_.get()
+        optimizationGuideService:nil];
     favicon::LargeIconService* large_icon_service =
         IOSChromeLargeIconServiceFactory::GetForProfile(GetProfile());
     LargeIconCache* cache =
diff --git a/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn
index 60eef837..9b1e90a 100644
--- a/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn
@@ -18,7 +18,9 @@
     "//base",
     "//components/commerce/core:commerce_constants",
     "//components/commerce/core:feature_list",
+    "//components/commerce/core:proto",
     "//components/commerce/core:shopping_service",
+    "//components/optimization_guide/core:core",
     "//components/page_image_service",
     "//components/payments/core:core",
     "//components/segmentation_platform/public",
@@ -36,6 +38,8 @@
     "//ios/chrome/browser/ntp/model",
     "//ios/chrome/browser/ntp/ui_bundled",
     "//ios/chrome/browser/ntp_tiles/model/tab_resumption:tab_resumption_prefs",
+    "//ios/chrome/browser/optimization_guide/model",
+    "//ios/chrome/browser/optimization_guide/model:model",
     "//ios/chrome/browser/page_image/model",
     "//ios/chrome/browser/price_notifications/ui_bundled/cells:cells",
     "//ios/chrome/browser/sessions/model:session_util",
diff --git a/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.h b/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.h
index e056ad0..c4caf695 100644
--- a/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.h
+++ b/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.h
@@ -10,14 +10,11 @@
 class Browser;
 @class ContentSuggestionsMetricsRecorder;
 @protocol NewTabPageActionsDelegate;
+class OptimizationGuideService;
 class PrefService;
 @protocol TabResumptionHelperDelegate;
 @class TabResumptionItem;
 
-namespace commerce {
-class ShoppingService;
-}
-
 namespace signin {
 class IdentityManager;
 }
@@ -39,10 +36,12 @@
     ContentSuggestionsMetricsRecorder* contentSuggestionsMetricsRecorder;
 
 // Default initializer.
-- (instancetype)initWithPrefService:(PrefService*)prefService
-                    identityManager:(signin::IdentityManager*)identityManager
-                            browser:(Browser*)browser
-                    shoppingService:(commerce::ShoppingService*)shoppingService
+- (instancetype)initWithLocalState:(PrefService*)localState
+                       prefService:(PrefService*)prefService
+                   identityManager:(signin::IdentityManager*)identityManager
+                           browser:(Browser*)browser
+          optimizationGuideService:
+              (OptimizationGuideService*)optimizationGuideService
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.mm b/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.mm
index 6b6b2d50..d7f0cd2 100644
--- a/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_mediator.mm
@@ -6,13 +6,17 @@
 
 #import "base/apple/foundation_util.h"
 #import "base/command_line.h"
+#import "base/containers/flat_set.h"
 #import "base/memory/raw_ptr.h"
 #import "base/strings/stringprintf.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/commerce/core/commerce_constants.h"
 #import "components/commerce/core/commerce_feature_list.h"
 #import "components/commerce/core/commerce_types.h"
-#import "components/commerce/core/shopping_service.h"
+#import "components/commerce/core/proto/price_tracking.pb.h"
+#import "components/optimization_guide/core/optimization_guide_decision.h"
+#import "components/optimization_guide/proto/common_types.pb.h"
+#import "components/optimization_guide/proto/hints.pb.h"
 #import "components/page_image_service/features.h"
 #import "components/page_image_service/image_service.h"
 #import "components/page_image_service/mojom/page_image_service.mojom.h"
@@ -33,6 +37,7 @@
 #import "ios/chrome/browser/ntp/model/new_tab_page_tab_helper.h"
 #import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_actions_delegate.h"
 #import "ios/chrome/browser/ntp_tiles/model/tab_resumption/tab_resumption_prefs.h"
+#import "ios/chrome/browser/optimization_guide/model/optimization_guide_service.h"
 #import "ios/chrome/browser/page_image/model/page_image_service_factory.h"
 #import "ios/chrome/browser/sessions/model/session_util.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
@@ -187,28 +192,69 @@
   return price_drop;
 }
 
+bool HasPriceDrop(const std::optional<const commerce::PriceTrackingData>&
+                      price_tracking_data) {
+  return price_tracking_data.has_value() &&
+         price_tracking_data->has_product_update() &&
+         price_tracking_data->product_update().has_old_price() &&
+         price_tracking_data->product_update().has_new_price() &&
+         price_tracking_data->product_update()
+             .old_price()
+             .has_currency_code() &&
+         price_tracking_data->product_update()
+             .new_price()
+             .has_currency_code() &&
+         price_tracking_data->product_update().old_price().currency_code() ==
+             price_tracking_data->product_update().new_price().currency_code();
+}
+
+// A Product Detail Page is price trackable if it has a cluster ID.
+bool IsPriceTrackable(const std::optional<const commerce::PriceTrackingData>&
+                          price_tracking_data) {
+  return price_tracking_data.has_value() &&
+         price_tracking_data->has_buyable_product() &&
+         price_tracking_data->buyable_product().has_product_cluster_id();
+}
+
 void ConfigureTabResumptionItemForShopCard(
-    const std::optional<const commerce::ProductInfo>& product_info,
+    const base::flat_map<
+        optimization_guide::proto::OptimizationType,
+        optimization_guide::OptimizationGuideDecisionWithMetadata>& decisions,
     TabResumptionItem* item) {
+  auto iter = decisions.find(optimization_guide::proto::PRICE_TRACKING);
+  if (iter == decisions.end()) {
+    return;
+  }
+
+  optimization_guide::OptimizationGuideDecisionWithMetadata
+      decisionWithMetadata = iter->second;
+  if (decisionWithMetadata.decision !=
+      optimization_guide::OptimizationGuideDecision::kTrue) {
+    return;
+  }
+  const std::optional<const commerce::PriceTrackingData>& price_tracking_data =
+      decisionWithMetadata.metadata
+          .ParsedMetadata<commerce::PriceTrackingData>();
+
   if (commerce::kShopCardVariation.Get() == commerce::kShopCardArm3 &&
-      product_info.has_value() &&
-      product_info->previous_amount_micros.has_value()) {
+      HasPriceDrop(price_tracking_data)) {
     item.shopCardData = [[ShopCardData alloc] init];
     item.shopCardData.shopCardItemType = ShopCardItemType::kPriceDropOnTab;
 
     std::unique_ptr<payments::CurrencyFormatter> formatter =
         std::make_unique<payments::CurrencyFormatter>(
-            product_info->currency_code, product_info->country_code);
+            price_tracking_data->product_update().new_price().currency_code(),
+            GetApplicationContext()->GetApplicationLocale());
     formatter->SetMaxFractionalDigits(2);
-    item.shopCardData.priceDrop =
-        GetPriceDrop(formatter.get(), product_info->amount_micros,
-                     product_info->previous_amount_micros.value());
+    item.shopCardData.priceDrop = GetPriceDrop(
+        formatter.get(),
+        price_tracking_data->product_update().old_price().amount_micros(),
+        price_tracking_data->product_update().new_price().amount_micros());
   }
 
   // A URL is price trackable if it has a cluster ID.
   if (commerce::kShopCardVariation.Get() == commerce::kShopCardArm4 &&
-      product_info.has_value() &&
-      product_info->product_cluster_id.has_value()) {
+      IsPriceTrackable(price_tracking_data)) {
     item.shopCardData = [[ShopCardData alloc] init];
     item.shopCardData.shopCardItemType =
         ShopCardItemType::kPriceTrackableProductOnTab;
@@ -217,6 +263,25 @@
 
 }  // namespace
 
+// Call through to OptimizationGuide's OnDemand API which is a restricted
+// API. In order to call the private function CanApplyOptimizationOnDemand,
+// a class to friend OptimizationGuideService is needed.
+class TabResumptionMediatorProxy {
+ public:
+  // Call through to optimizationGuideService->CanApplyOptimizationOnDemand
+  static void CanApplyOptimizationOnDemand(
+      OptimizationGuideService* optimizationGuideService,
+      const GURL& url,
+      const optimization_guide::proto::OptimizationType& optimization_type,
+      optimization_guide::proto::RequestContext request_context,
+      optimization_guide::OnDemandOptimizationGuideDecisionRepeatingCallback
+          callback) {
+    optimizationGuideService->CanApplyOptimizationOnDemand(
+        {url}, {optimization_type}, request_context, std::move(callback),
+        std::nullopt);
+  }
+};
+
 @interface TabResumptionMediator () <BooleanObserver,
                                      IdentityManagerObserverBridgeDelegate,
                                      MagicStackModuleDelegate,
@@ -277,14 +342,15 @@
   // Whether the item is currently presented as Top Module by Magic Stack.
   BOOL _currentlyTopModule;
   PrefBackedBoolean* _tabResumptionDisabled;
-  raw_ptr<commerce::ShoppingService> _shoppingService;
+  raw_ptr<OptimizationGuideService> _optimizationGuideService;
 }
 
-- (instancetype)initWithPrefService:(PrefService*)prefService
-                    identityManager:(signin::IdentityManager*)identityManager
-                            browser:(Browser*)browser
-                    shoppingService:
-                        (commerce::ShoppingService*)shoppingService {
+- (instancetype)initWithLocalState:(PrefService*)localState
+                       prefService:(PrefService*)prefService
+                   identityManager:(signin::IdentityManager*)identityManager
+                           browser:(Browser*)browser
+          optimizationGuideService:
+              (OptimizationGuideService*)optimizationGuideService {
   self = [super init];
   if (self) {
     CHECK(IsTabResumptionEnabled());
@@ -344,7 +410,11 @@
       _identityManagerObserverBridge.reset(
           new signin::IdentityManagerObserverBridge(identityManager, self));
     }
-    _shoppingService = shoppingService;
+    if (optimizationGuideService) {
+      _optimizationGuideService = optimizationGuideService;
+      _optimizationGuideService->RegisterOptimizationTypes(
+          {optimization_guide::proto::PRICE_TRACKING});
+    }
   }
   return self;
 }
@@ -938,18 +1008,17 @@
   if (commerce::kShopCardVariation.Get() == commerce::kShopCardArm3 ||
       commerce::kShopCardVariation.Get() == commerce::kShopCardArm4) {
     __weak __typeof(self) weakSelf = self;
-    // TODO(crbug.com/394947595) this currently returns no product info for
-    // any shopping URL on startup, likely because OptimizationGuide hasn't
-    // fetched the URL data yet. Ensure product data is available on first
-    // rendering of the magic stack either by waiting for the OptimziationGudide
-    // fetch or forcing a fetch as part of this call.
-    _shoppingService->GetProductInfoForUrl(
-        visit->url,
-        base::BindOnce(
+    TabResumptionMediatorProxy::CanApplyOptimizationOnDemand(
+        _optimizationGuideService, visit->url,
+        optimization_guide::proto::PRICE_TRACKING,
+        optimization_guide::proto::RequestContext::CONTEXT_SHOP_CARD,
+        base::BindRepeating(
             ^(const GURL& url,
-              const std::optional<const commerce::ProductInfo>& product_info) {
-              ConfigureTabResumptionItemForShopCard(product_info, item);
-
+              const base::flat_map<
+                  optimization_guide::proto::OptimizationType,
+                  optimization_guide::OptimizationGuideDecisionWithMetadata>&
+                  decisions) {
+              ConfigureTabResumptionItemForShopCard(decisions, item);
               // Fetch the favicon.
               [weakSelf fetchImageForItem:item];
             }));
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
index 7d684f6..7a6e76f 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
@@ -9,6 +9,9 @@
 
   var uiConfiguration: OverflowMenuUIConfiguration
 
+  /// Sync'ed with pref OverflowMenuDestinationList.HighlightedDestinationBounds
+  @State private var highlightedDestinatonBounds: Anchor<CGRect>?
+
   weak var metricsHandler: PopupMenuMetricsHandler?
 
   /// The namespace for the animation of this view appearing or disappearing.
@@ -42,9 +45,15 @@
       }
       .background(Color(.systemGroupedBackground).edgesIgnoringSafeArea(.all))
       .onPreferenceChange(OverflowMenuDestinationList.HighlightedDestinationBounds.self) { pref in
-        if let pref = pref {
-          uiConfiguration.highlightedDestinationFrame = geometry[pref]
+        highlightedDestinatonBounds = pref
+      }
+      .onGeometryChange(for: CGRect?.self) { proxy in
+        if let highlightedDestinatonBounds = highlightedDestinatonBounds {
+          return proxy[highlightedDestinatonBounds]
         }
+        return nil
+      } action: { frame in
+        uiConfiguration.highlightedDestinationFrame = frame ?? .zero
       }
     }
   }
diff --git a/ios/chrome/browser/webui/ui_bundled/chrome_urls/chrome_urls_handler.mm b/ios/chrome/browser/webui/ui_bundled/chrome_urls/chrome_urls_handler.mm
index da152ab..26932a5 100644
--- a/ios/chrome/browser/webui/ui_bundled/chrome_urls/chrome_urls_handler.mm
+++ b/ios/chrome/browser/webui/ui_bundled/chrome_urls/chrome_urls_handler.mm
@@ -25,7 +25,8 @@
   return host == commerce::kChromeUICommerceInternalsHost ||
          host == optimization_guide_internals::
                      kChromeUIOptimizationGuideInternalsHost ||
-         host == kChromeUIInterstitialsHost;
+         host == kChromeUIDownloadInternalsHost ||
+         host == kChromeUIInterstitialsHost || host == kChromeUILocalStateHost;
 }
 }  // namespace
 
diff --git a/ios/chrome/browser/webui/ui_bundled/chrome_web_ui_ios_controller_factory.mm b/ios/chrome/browser/webui/ui_bundled/chrome_web_ui_ios_controller_factory.mm
index 4e337d9..c43bf941 100644
--- a/ios/chrome/browser/webui/ui_bundled/chrome_web_ui_ios_controller_factory.mm
+++ b/ios/chrome/browser/webui/ui_bundled/chrome_web_ui_ios_controller_factory.mm
@@ -123,7 +123,9 @@
     return &NewWebUIIOS<CrashesUI>;
   }
   if (url_host == kChromeUIDownloadInternalsHost) {
-    return &NewWebUIIOS<DownloadInternalsUI>;
+    return InternalDebugPagesEnabled()
+               ? &NewWebUIIOS<DownloadInternalsUI>
+               : &NewWebUIIOS<InternalDebugPagesDisabledUI>;
   }
   if (url_host == kChromeUIFlagsHost) {
     return &NewWebUIIOS<FlagsUI>;
@@ -140,7 +142,9 @@
                : &NewWebUIIOS<InternalDebugPagesDisabledUI>;
   }
   if (url_host == kChromeUILocalStateHost) {
-    return &NewWebUIIOS<LocalStateUI>;
+    return InternalDebugPagesEnabled()
+               ? &NewWebUIIOS<LocalStateUI>
+               : &NewWebUIIOS<InternalDebugPagesDisabledUI>;
   }
   if (url_host == kChromeUIManagementHost) {
     return &NewWebUIIOS<ManagementUI>;
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 47651b45..9cfe85c 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -350,7 +350,6 @@
     "//ios/chrome/browser/overscroll_actions/model:unit_tests",
     "//ios/chrome/browser/page_info:unit_tests",
     "//ios/chrome/browser/page_info/ui_bundled:unit_tests",
-    "//ios/chrome/browser/parcel_tracking/ui_bundled:unit_tests",
     "//ios/chrome/browser/passwords/model:unit_tests",
     "//ios/chrome/browser/passwords/model/metrics:unit_tests",
     "//ios/chrome/browser/passwords/ui_bundled/bottom_sheet:unit_tests",
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index ad36ce4..64b5be4 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-82f682f40d98bcaea77ebb8d67fdac4b45c11dcd
\ No newline at end of file
+d2cb916a8b1c774771597857ce1687c74abffda9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
index 131987c..f7a0776 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-88c1c4e70d7b27c91a08c511bc24c398de60d00d
\ No newline at end of file
+e8ebac242e2abb4b407d2bdd2edc430375db352d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index c7ec8f65..dc043b83 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-d932df464bbae7742a908e30f5c7bbaee12e6dfd
\ No newline at end of file
+47191c7d0a602d8a921f7a4624a05a95414e2a64
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
index d994d3e..8f5986e 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-12375a07a9662e8569aaacf89e37039d7a2a34fb
\ No newline at end of file
+c8aa27e52bb8816be66a569ed63e7eeac1a2dcc1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index a9bc96b..04266a7 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-bc0d9a921d6d8a80ca257a20be47732e6a2dc3df
\ No newline at end of file
+07ea02b5bb7c58309f33988fa351df8ef2b858e7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
index 515caea..2755fbf 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-2b228741fe1c7fc13605c9ba2e3914a5f8447e5f
\ No newline at end of file
+f951264f2c02910795b0abbad629baca6e7c396e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index 0b57337..dc591e2 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ced6820d6cea71f833ed94df42cc548bba7b9d23
\ No newline at end of file
+7ce1a02569d13a533db769f92bdc597c1bd80a1f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
index b5b6eb2..347be12 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-024eb25ea8a7c203b98f85a99b404f9311170eeb
\ No newline at end of file
+8d5fe43395c07ac05b04635919c3be669856d76b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index ea570ff6..4f5db35 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4b095d3c499533c56c41c10a13df18e497346afd
\ No newline at end of file
+0004815a23bdcd945ff2dd1d619b308e5f6f6c49
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
index a3d4fe5..198149d 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-bb5adc3a559a49db04db064f62286460c010fb8a
\ No newline at end of file
+963dd2a23304a224f6bc1ce953ea797c18a15e88
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 24fad8a..a4b29f9f 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-0c18faac3bb50e857b4f2bf7a3e08442402d2103
\ No newline at end of file
+6d3056273cbe9a9750985b838d8425e8dabb55ec
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
index d93bdf1c..38551ee 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-4db8b242ef1f73e281f21358adc376df0f3731e9
\ No newline at end of file
+552bea2a0b9691f718f9e03aab21e0b1f4ef007e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index d8bc5a0c8..563bfea 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-3e39961fcf57817234482dc3010454623714c0c8
\ No newline at end of file
+52307b796ac1b88ab83315a6af7d3d5f69482873
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
index d8aaca3..6a9d951 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-11fd8e2ea18799292c485c3d4694be7f07d59e08
\ No newline at end of file
+0a6fc2f34156ddd929d53c760fb2fbf177257aa1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 86038f5..4072bfa 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-b40d705b2d0ec304ae93130179a6572886a82e89
\ No newline at end of file
+94dbaac59a8296c247c171b6dc291710f0cd7e6a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
index 17cea41..da13189 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-d67eabcb0a08e018d0df67c162692fcfbf106c6c
\ No newline at end of file
+283cfaef620e29563d3216f33a7622d7ff2c149f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 0a1cc15..226c92d 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-70d8e1e099b00d26e9b9912167cb9609bcc0e17c
\ No newline at end of file
+0f3c9d18048a502f39c910273031547bc6415bf1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 0058a59..ff05dee 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-330fa53a91ee51b14e5500a958a6827ef3ff89b0
\ No newline at end of file
+e8832ddf82363a253652c408b3fd1faadbb38566
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index c27ead99..c1fe0cc 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-279b527d0955052e66626ac57f3afab26e3c0b61
\ No newline at end of file
+fae3a1013ec7db1235c4061a452ae8726676e324
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 91d9d73..e057e255 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4086075c8f2a152b328047ed486f053fc11ffd9b
\ No newline at end of file
+204c01eca40cc127af0ac8e1d44a801a3e147752
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 7873c4f0..5f250d66 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-d55280fbb2004fccfd1f3e6daf49be5e2f77db1d
\ No newline at end of file
+e44c475cddaaf0c11bda43e0dc7eb45f2b380789
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
index 0d88b60..c0afec4 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-8848f96bf8e08e1f34d8540395680a88f552ce67
\ No newline at end of file
+847bd141bed1580eb9d87da99e0120177c267ddd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index e9a0a96..98a7de3 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-510c61e4908fdea0a3d025afc68d89026b36eb85
\ No newline at end of file
+964371dbaf50f77d448fdd8403659e52e9cc43ff
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
index a449358..35383c1 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-6c51c40fbc9ee194d4ec3a6fe80ac8485c68c7a7
\ No newline at end of file
+a82cf3da09d771fa964f1f24e395af7987fef34e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index f96903fc..8916048 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-882bea2ca4548ab04c96db0d7ab63e86fecad177
\ No newline at end of file
+74326157342e59a25a0f884662757a6530b055a6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
index 60cd7a7..0d056ef 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-3861f3f2da8f6679ba489bc92ace85d3d9a26118
\ No newline at end of file
+d568c6b463e8c57fafbd7cad6e18921a132ab557
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 88b7d444..2c86b08 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-b344ae50531d11fcfd6f3c637bac115c327db748
\ No newline at end of file
+20aea8624a910df361a51a0b07d719d7abf2897e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 310c2e4d..a4aad71 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-bc9127a6e35451983959378fc6385b0f1597a1b1
\ No newline at end of file
+21e091716c033c6c2da55494e19f00fec67d1314
\ No newline at end of file
diff --git a/ios/third_party/edo/src b/ios/third_party/edo/src
index 13fd306..a75d424 160000
--- a/ios/third_party/edo/src
+++ b/ios/third_party/edo/src
@@ -1 +1 @@
-Subproject commit 13fd3068bf462e6d55a405f5ec3c62abcf1dd9bb
+Subproject commit a75d424d4c35afa3ef04cee6b8a51fca57e46a30
diff --git a/ios/web/content/init/DEPS b/ios/web/content/init/DEPS
index a002650..c023e016 100644
--- a/ios/web/content/init/DEPS
+++ b/ios/web/content/init/DEPS
@@ -6,4 +6,5 @@
   "+components/embedder_support",
   "+components/performance_manager/embedder",
   "+components/version_info",
+  "+third_party/blink/public/common/switches.h",
 ]
diff --git a/ios/web/content/init/ios_content_browser_client.cc b/ios/web/content/init/ios_content_browser_client.cc
index 42fab05..defff5f 100644
--- a/ios/web/content/init/ios_content_browser_client.cc
+++ b/ios/web/content/init/ios_content_browser_client.cc
@@ -14,6 +14,7 @@
 #import "content/public/common/user_agent.h"
 #import "ios/web/content/init/ios_browser_main_parts.h"
 #import "ios/web/content/ui/web_contents_view_delegate_impl.h"
+#include "third_party/blink/public/common/switches.h"
 
 namespace web {
 
@@ -127,4 +128,12 @@
   return std::make_unique<content::DevToolsManagerDelegate>();
 }
 
+void IOSContentBrowserClient::AppendExtraCommandLineSwitches(
+    base::CommandLine* command_line,
+    int child_process_id) {
+  // Disable JIT for now.
+  command_line->AppendSwitchASCII(blink::switches::kJavaScriptFlags,
+                                  "--jitless");
+}
+
 }  // namespace web
diff --git a/ios/web/content/init/ios_content_browser_client.h b/ios/web/content/init/ios_content_browser_client.h
index 241ad9eb..c7ed9ed 100644
--- a/ios/web/content/init/ios_content_browser_client.h
+++ b/ios/web/content/init/ios_content_browser_client.h
@@ -45,6 +45,8 @@
       content::BrowserContext* context) override;
   std::unique_ptr<content::DevToolsManagerDelegate>
   CreateDevToolsManagerDelegate() override;
+  void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
+                                      int child_process_id) override;
 };
 
 }  // namespace web
diff --git a/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.h b/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.h
index 445ce19..25d1aec 100644
--- a/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.h
+++ b/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.h
@@ -64,7 +64,7 @@
       payments::PaymentsAutofillClient::PaymentsRpcResult result) override;
   CreditCardCvcAuthenticator& GetCvcAuthenticator() override;
   void OpenPromoCodeOfferDetailsURL(const GURL& url) override;
-  const PaymentsDataManager& GetPaymentsDataManager() const override;
+  PaymentsDataManager& GetPaymentsDataManager() final;
 
  private:
   const raw_ref<autofill::WebViewAutofillClientIOS> client_;
diff --git a/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.mm b/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.mm
index 0d7afa4..8f875e23 100644
--- a/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.mm
+++ b/ios/web_view/internal/autofill/ios_web_view_payments_autofill_client.mm
@@ -97,8 +97,8 @@
       /*is_renderer_initiated=*/false));
 }
 
-const PaymentsDataManager&
-IOSWebViewPaymentsAutofillClient::GetPaymentsDataManager() const {
+PaymentsDataManager&
+IOSWebViewPaymentsAutofillClient::GetPaymentsDataManager() {
   return client_->GetPersonalDataManager().payments_data_manager();
 }
 
diff --git a/media/base/video_transformation.cc b/media/base/video_transformation.cc
index 794d2f9..d7f7852 100644
--- a/media/base/video_transformation.cc
+++ b/media/base/video_transformation.cc
@@ -61,6 +61,21 @@
   return VideoTransformation(matrix2x2);
 }
 
+std::array<int32_t, 4> VideoTransformation::GetMatrix() {
+  int32_t m = mirrored ? -1 : 1;
+  int32_t fp1 = 1 << 16;
+  switch (rotation) {
+    case VIDEO_ROTATION_0:
+      return {fp1 * m, 0, 0, fp1};
+    case VIDEO_ROTATION_90:
+      return {0, fp1, -fp1 * m, 0};
+    case VIDEO_ROTATION_180:
+      return {-fp1 * m, 0, 0, -fp1};
+    case VIDEO_ROTATION_270:
+      return {0, -fp1, m * fp1, 0};
+  }
+}
+
 VideoTransformation::VideoTransformation(const int32_t matrix[4]) {
   // Promote to int64_t to avoid abs(int32_min) being undefined.
   const std::array<int64_t, 4> matrix64 = {
@@ -107,6 +122,13 @@
   if (matrix64[1] == matrix64[3] && matrix64[1] != 0) {
     mirrored = !mirrored;
   }
+  // Same but different signs of cosines implies mirrored.
+  if (matrix64[0] == -1 * matrix64[3] && matrix[1] == 0) {
+    mirrored = true;
+  }
+  if (matrix64[1] == matrix64[2] && matrix[0] == 0) {
+    mirrored = true;
+  }
 
   // Normalize the angle
   while (angle < 0)
diff --git a/media/base/video_transformation.h b/media/base/video_transformation.h
index 15654761..7dc3385 100644
--- a/media/base/video_transformation.h
+++ b/media/base/video_transformation.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include <array>
 #include <string>
 
 #include "media/base/media_export.h"
@@ -50,6 +51,11 @@
   // The result of rotating and then mirroring `this` according to `delta`.
   VideoTransformation add(VideoTransformation delta) const;
 
+  // Create a matrix based on the rotation and mirrored. Only 8 matrices are
+  // valid when limiting to {0,90,180,270} rotations and boolean of hflip (i.e.
+  // mirrored).
+  std::array<int32_t, 4> GetMatrix();
+
   // The video rotation value, in 90 degree steps.
   VideoRotation rotation;
 
diff --git a/media/base/video_transformation_unittest.cc b/media/base/video_transformation_unittest.cc
index b796651..9bac77c 100644
--- a/media/base/video_transformation_unittest.cc
+++ b/media/base/video_transformation_unittest.cc
@@ -13,36 +13,12 @@
 
 #include <limits>
 
+#include "base/logging.h"
+#include "base/numerics/angle_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
 
-namespace {
-
-enum class Flip { kNone, kVertical, kHorizontal, kBoth };
-
-// Rotation by angle Θ is represented in the matrix as:
-// [ cos(Θ), -sin(Θ)]
-// [ sin(Θ),  cos(Θ)]
-// a vertical flip is represented by the cosine's having opposite signs
-// and a horizontal flip is represented by the sine's having the same sign.
-constexpr void FromAngle(double angle_degrees, int32_t* matrix, Flip flip) {
-  double f_matrix[4] = {0, 0, 0, 0};
-  f_matrix[0] = f_matrix[3] = cos(angle_degrees * 3.1415926535 / 180.0);
-  f_matrix[1] = f_matrix[2] = sin(angle_degrees * 3.1415926535 / 180.0);
-  if (flip == Flip::kVertical || flip == Flip::kBoth)
-    f_matrix[3] *= -1;
-  if (flip == Flip::kVertical || flip == Flip::kNone)
-    f_matrix[2] *= -1;
-
-  matrix[0] = static_cast<int32_t>(round(f_matrix[0] * (1 << 16)));
-  matrix[1] = static_cast<int32_t>(round(f_matrix[1] * (1 << 16)));
-  matrix[3] = static_cast<int32_t>(round(f_matrix[2] * (1 << 16)));
-  matrix[4] = static_cast<int32_t>(round(f_matrix[3] * (1 << 16)));
-}
-
-}  // namespace
-
 class VideoTransformationTest : public testing::Test {
  public:
   VideoTransformationTest() = default;
@@ -51,52 +27,95 @@
   ~VideoTransformationTest() override = default;
 };
 
-TEST_F(VideoTransformationTest, ComputeRotationAngles) {
-  int32_t matrix[9];
+// List of matrices possible when limited to {0, 90, 180, 270} & hflip
+// (mirrored). Verified via ffplay.
+//
+// MATRICES = {
+//   "0":    [65536, 0, 0, 65536],
+//   "0m":   [-65536, 0, 0, 65536],
+//   "90":   [0, 65536, -65536, 0],
+//   "90m":  [0, 65536, 65536, 0],
+//   "180":  [-65536, 0, 0, -65536],
+//   "180m": [65536, 0, 0, -65536],
+//   "270":  [0, -65536, 65536, 0],
+//   "270m": [0, -65536, -65536, 0]
+// }
+TEST_F(VideoTransformationTest, MatrixToVideoTransformation) {
+  std::array<int32_t, 4> mat = {65536, 0, 0, 65536};
+  auto t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_0);
+  EXPECT_FALSE(t.mirrored);
 
+  mat = {-65536, 0, 0, 65536};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_0);
+  EXPECT_TRUE(t.mirrored);
+
+  mat = {0, 65536, -65536, 0};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_90);
+  EXPECT_FALSE(t.mirrored);
+
+  mat = {0, 65536, 65536, 0};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_90);
+  EXPECT_TRUE(t.mirrored);
+
+  mat = {-65536, 0, 0, -65536};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_180);
+  EXPECT_FALSE(t.mirrored);
+
+  mat = {65536, 0, 0, -65536};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_180);
+  EXPECT_TRUE(t.mirrored);
+
+  mat = {0, -65536, 65536, 0};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_270);
+  EXPECT_FALSE(t.mirrored);
+
+  mat = {0, -65536, -65536, 0};
+  t = VideoTransformation(mat.data());
+  EXPECT_EQ(t.rotation, VIDEO_ROTATION_270);
+  EXPECT_TRUE(t.mirrored);
+}
+
+TEST_F(VideoTransformationTest, ComputeMatrix) {
   // Standard 90 degree increments with no rotation all end up rotated normally
-  FromAngle(0.0, matrix, Flip::kNone);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
+  VideoTransformation transformation = VideoTransformation(VIDEO_ROTATION_0);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
             VideoTransformation(VIDEO_ROTATION_0, false));
 
-  FromAngle(90.0, matrix, Flip::kNone);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
+  transformation = VideoTransformation(VIDEO_ROTATION_90, false);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
             VideoTransformation(VIDEO_ROTATION_90, false));
 
-  FromAngle(180.0, matrix, Flip::kNone);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
+  transformation = VideoTransformation(VIDEO_ROTATION_180);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
             VideoTransformation(VIDEO_ROTATION_180, false));
 
-  FromAngle(270.0, matrix, Flip::kNone);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
+  transformation = VideoTransformation(VIDEO_ROTATION_270);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
             VideoTransformation(VIDEO_ROTATION_270, false));
 
-  // Non-right-angle rotations all get set to 0, since we can't render those
-  // properly anyway.
-  FromAngle(60.0, matrix, Flip::kNone);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
-            VideoTransformation(VIDEO_ROTATION_0, false));
-
-  FromAngle(45.0, matrix, Flip::kNone);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
-            VideoTransformation(VIDEO_ROTATION_0, false));
-
-  // Flips can cause weird things - ie a vertical flip + 180 rotation
-  // is the same thing as a horizontal flip + no rotation!
-  FromAngle(180.0, matrix, Flip::kVertical);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
+  // Test the mirrored cases
+  transformation = VideoTransformation(VIDEO_ROTATION_0, true);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
             VideoTransformation(VIDEO_ROTATION_0, true));
 
-  // Vertical and horizontal flipping is the same as a 180 degree rotation
-  FromAngle(0.0, matrix, Flip::kBoth);
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
+  transformation = VideoTransformation(VIDEO_ROTATION_90, true);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
+            VideoTransformation(VIDEO_ROTATION_90, true));
+
+  transformation = VideoTransformation(VIDEO_ROTATION_180, true);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
             VideoTransformation(VIDEO_ROTATION_180, true));
 
-  // An invalid matrix is always going to give no rotation or mirroring.
-  for (int i = 0; i < 9; i++)
-    matrix[i] = 78123;
-  ASSERT_EQ(VideoTransformation::FromFFmpegDisplayMatrix(matrix),
-            VideoTransformation(VIDEO_ROTATION_0, false));
+  transformation = VideoTransformation(VIDEO_ROTATION_270, true);
+  ASSERT_EQ(VideoTransformation(transformation.GetMatrix().data()),
+            VideoTransformation(VIDEO_ROTATION_270, true));
 }
 
 TEST_F(VideoTransformationTest, ConstructFromAngle) {
diff --git a/media/formats/BUILD.gn b/media/formats/BUILD.gn
index f9ed75e..3c1828fb7 100644
--- a/media/formats/BUILD.gn
+++ b/media/formats/BUILD.gn
@@ -221,6 +221,7 @@
     "hls/playlist.h",
     "hls/playlist_common.cc",
     "hls/playlist_common.h",
+    "hls/quirks.h",
     "hls/rendition_manager.cc",
     "hls/rendition_manager.h",
     "hls/segment_stream.cc",
diff --git a/media/formats/hls/audio_rendition.cc b/media/formats/hls/audio_rendition.cc
index 439aa95..3df865e6 100644
--- a/media/formats/hls/audio_rendition.cc
+++ b/media/formats/hls/audio_rendition.cc
@@ -8,6 +8,7 @@
 
 #include "base/types/pass_key.h"
 #include "media/formats/hls/parse_status.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/tags.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
 
@@ -61,6 +62,11 @@
   }
 
   auto name = std::string(tag.name.Str());
+  if (!HLSQuirks::DeduplicateRenditionNamesInGroup() &&
+      renditions_map_.contains(name)) {
+    return ParseStatusCode::kRenditionGroupHasDuplicateRenditionNames;
+  }
+
   while (renditions_map_.contains(name)) {
     // TODO(crbug.com/395949828): According to the spec:
     // "All EXT-X-MEDIA tags in the same Group MUST have different NAME
diff --git a/media/formats/hls/multivariant_playlist.cc b/media/formats/hls/multivariant_playlist.cc
index a7e560e..d5127a98 100644
--- a/media/formats/hls/multivariant_playlist.cc
+++ b/media/formats/hls/multivariant_playlist.cc
@@ -18,6 +18,7 @@
 #include "media/formats/hls/parse_status.h"
 #include "media/formats/hls/playlist.h"
 #include "media/formats/hls/playlist_common.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/source_string.h"
 #include "media/formats/hls/tags.h"
 #include "media/formats/hls/types.h"
@@ -131,11 +132,9 @@
           continue;
         }
         case TagKind::kMediaPlaylistTag:
-          // TODO(crbug.com/395950145): It's really common for multivariant
-          // playlists to incorrectly add an "EXT-X-ENDLIST" tag at the end,
-          // which, while disallowed by spec, is accepted by most other HLS
-          // implementations. We can't fail parsing and thus playback as a
-          // result, in order to maintain compatibility.
+          if (!HLSQuirks::AllowMediaTagsInMultivariantPlaylists()) {
+            return ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag;
+          }
           continue;
         case TagKind::kMultivariantPlaylistTag:
           // Handled below
diff --git a/media/formats/hls/multivariant_playlist_unittest.cc b/media/formats/hls/multivariant_playlist_unittest.cc
index 58c8556e..83e0341 100644
--- a/media/formats/hls/multivariant_playlist_unittest.cc
+++ b/media/formats/hls/multivariant_playlist_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "media/formats/hls/multivariant_playlist_test_builder.h"
 #include "media/formats/hls/parse_status.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/types.h"
 #include "media/formats/hls/variant_stream.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -129,7 +130,12 @@
     auto tag_line = "#" + std::string{TagNameToString(name)};
     auto fork = builder;
     fork.AppendLine(tag_line);
-    fork.ExpectOk();
+    if (HLSQuirks::AllowMediaTagsInMultivariantPlaylists()) {
+      fork.ExpectOk();
+    } else {
+      fork.ExpectError(
+          ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag);
+    }
   }
 }
 
@@ -350,9 +356,6 @@
   fork.ExpectAudioRenditionGroup("foo", HasDefaultRendition, std::nullopt);
   fork.ExpectOk();
 
-  // TODO(crbug.com/395949828): Two EXT-X-MEDIA tags in the same group may not
-  // have the same name, but this is super common on the web and safari allows
-  // it.
   fork = builder;
   fork.AppendLine(
       "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"foo\",NAME=\"English\",URI=\"english."
@@ -360,7 +363,12 @@
   fork.AppendLine(
       "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"foo\",NAME=\"English\",URI="
       "\"english2.m3u8\"");
-  fork.ExpectOk();
+  if (HLSQuirks::DeduplicateRenditionNamesInGroup()) {
+    fork.ExpectOk();
+  } else {
+    fork.ExpectError(
+        ParseStatusCode::kRenditionGroupHasDuplicateRenditionNames);
+  }
 
   // .. Unless they are in different groups
   fork = builder;
diff --git a/media/formats/hls/playlist.cc b/media/formats/hls/playlist.cc
index 802d31c..e69a0e04c 100644
--- a/media/formats/hls/playlist.cc
+++ b/media/formats/hls/playlist.cc
@@ -6,6 +6,7 @@
 
 #include "media/formats/hls/items.h"
 #include "media/formats/hls/playlist_common.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/tags.h"
 #include "media/formats/hls/types.h"
 #include "url/gurl.h"
@@ -80,11 +81,9 @@
           break;
         case TagKind::kMediaPlaylistTag:
           if (playlist_kind == Kind::kMultivariantPlaylist) {
-            // TODO(crbug.com/395950145): It's really common for multivariant
-            // playlists to incorrectly add an "EXT-X-ENDLIST" tag at the end,
-            // which, while disallowed by spec, is accepted by most other HLS
-            // implementations. We can't fail parsing and thus playback as a
-            // result, in order to maintain compatibility.
+            if (!HLSQuirks::AllowMediaTagsInMultivariantPlaylists()) {
+              return ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag;
+            }
             break;
           }
           playlist_kind = Kind::kMediaPlaylist;
diff --git a/media/formats/hls/playlist_unittest.cc b/media/formats/hls/playlist_unittest.cc
index 8e8b6b2..1030f6dc 100644
--- a/media/formats/hls/playlist_unittest.cc
+++ b/media/formats/hls/playlist_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/location.h"
 #include "base/strings/string_number_conversions.h"
 #include "media/formats/hls/parse_status.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/tag_name.h"
 #include "media/formats/hls/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -101,13 +102,14 @@
              "#EXT-X-VERSION:11\n");
 
   // Conflicting tag kinds should result in an error.
-  // TODO(crbug.com/395950145): It's really common for multivariant
-  // playlists to incorrectly add an "EXT-X-ENDLIST" tag at the end,
-  // which, while disallowed by spec, is accepted by most other HLS
-  // implementations. We can't fail parsing and thus playback as a
-  // result, in order to maintain compatibility.
-  ok_test(Playlist::kDefaultVersion, Playlist::Kind::kMultivariantPlaylist,
-          "#EXT-X-STREAM-INF\n#EXTINF\n");
+  if (HLSQuirks::AllowMediaTagsInMultivariantPlaylists()) {
+    ok_test(Playlist::kDefaultVersion, Playlist::Kind::kMultivariantPlaylist,
+            "#EXT-X-STREAM-INF\n#EXTINF\n");
+  } else {
+    error_test(ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag,
+               "#EXT-X-STREAM-INF\n#EXTINF\n");
+  }
+
   error_test(ParseStatusCode::kMediaPlaylistHasMultivariantPlaylistTag,
              "#EXTINF\n#EXT-X-STREAM-INF\n");
 
diff --git a/media/formats/hls/quirks.h b/media/formats/hls/quirks.h
new file mode 100644
index 0000000..486195c
--- /dev/null
+++ b/media/formats/hls/quirks.h
@@ -0,0 +1,38 @@
+// 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 MEDIA_FORMATS_HLS_QUIRKS_H_
+#define MEDIA_FORMATS_HLS_QUIRKS_H_
+
+#include "media/base/media_export.h"
+
+namespace media::hls {
+
+struct MEDIA_EXPORT HLSQuirks {
+  // datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-4.4.3
+  // A Media Playlist tag MUST NOT appear in a Multivariant Playlist.
+  // All other major implementations (safari, hls.js, shaka) do not consider
+  // this restriction, and will play content that voilates it. This is
+  // especially common with `EXT-X-ENDLIST` at the end of a multivariant
+  // playlist.
+  static constexpr bool AllowMediaTagsInMultivariantPlaylists() { return true; }
+
+  // datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-4.4.6.1.1
+  // All EXT-X-MEDIA tags in the same Group MUST have different NAME attributes.
+  // All other major implementations (safari, hls.js, shaka) do not consider
+  // this restriction, and play content that voilates it.
+  static constexpr bool DeduplicateRenditionNamesInGroup() { return true; }
+
+  // datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-4.4.4.1
+  // The format of the EXTINF tag is:
+  // #EXTINF:<duration>,[<title>]
+  // The trailing comma is not optional when the optional title is absent. All
+  // other major implementations do not consider this restriction and play
+  // content which is missing the trailing comma.
+  static constexpr bool AllowMissingSegmentInfCommas() { return true; }
+};
+
+}  // namespace media::hls
+
+#endif  // MEDIA_FORMATS_HLS_QUIRKS_H_
diff --git a/media/formats/hls/tags.cc b/media/formats/hls/tags.cc
index 28fd9b6..2b300e6f 100644
--- a/media/formats/hls/tags.cc
+++ b/media/formats/hls/tags.cc
@@ -14,6 +14,7 @@
 #include "media/base/mime_util.h"
 #include "media/formats/hls/items.h"
 #include "media/formats/hls/parse_status.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/variable_dictionary.h"
 
 namespace media::hls {
@@ -1005,6 +1006,9 @@
   SourceString duration_str = content;
   SourceString title_str = content;
   if (comma == std::string_view::npos) {
+    if (!HLSQuirks::AllowMissingSegmentInfCommas()) {
+      return ParseStatusCode::kMalformedTag;
+    }
     // While the HLS spec does require commas at the end of inf tags, it's
     // incredibly common for sites to elide the comma if there is no title
     // attribute present. In this case, we should assert that there is at least
diff --git a/media/formats/hls/tags_unittest.cc b/media/formats/hls/tags_unittest.cc
index 573f0d09..508e02d 100644
--- a/media/formats/hls/tags_unittest.cc
+++ b/media/formats/hls/tags_unittest.cc
@@ -15,6 +15,7 @@
 #include "media/base/media_serializers.h"
 #include "media/formats/hls/items.h"
 #include "media/formats/hls/parse_status.h"
+#include "media/formats/hls/quirks.h"
 #include "media/formats/hls/source_string.h"
 #include "media/formats/hls/test_util.h"
 #include "media/formats/hls/variable_dictionary.h"
@@ -1316,12 +1317,15 @@
   EXPECT_TRUE(RoughlyEqual(result.tag.duration, base::Seconds(12.0)));
   EXPECT_EQ(result.tag.title.Str(), "asdfsdf   ");
 
-  // By Spec, this should be an error, but alas, feral manifests exists and
-  // often lack the trailing comma emblematic of their domesticated brethren.
-  // ErrorTest<InfTag>("123", ParseStatusCode::kMalformedTag);
-  result = OkTest<InfTag>("123");
-  EXPECT_TRUE(RoughlyEqual(result.tag.duration, base::Seconds(123)));
-  EXPECT_EQ(result.tag.title.Str(), "");
+  if (HLSQuirks::AllowMissingSegmentInfCommas()) {
+    result = OkTest<InfTag>("123");
+    EXPECT_TRUE(RoughlyEqual(result.tag.duration, base::Seconds(123)));
+    EXPECT_EQ(result.tag.title.Str(), "");
+  } else {
+    // By Spec, this should be an error, but alas, feral manifests exist and
+    // often lack the trailing comma emblematic of their domesticated brethren.
+    ErrorTest<InfTag>("123", ParseStatusCode::kMalformedTag);
+  }
 
   // Test some invalid tags
   ErrorTest<InfTag>(std::nullopt, ParseStatusCode::kMalformedTag);
diff --git a/media/formats/hls/variant_stream.cc b/media/formats/hls/variant_stream.cc
index bd662368..88380457 100644
--- a/media/formats/hls/variant_stream.cc
+++ b/media/formats/hls/variant_stream.cc
@@ -4,6 +4,7 @@
 
 #include "media/formats/hls/variant_stream.h"
 
+#include <sstream>
 #include <string>
 #include <vector>
 
diff --git a/mojo/public/cpp/base/proto_wrapper_passkeys.h b/mojo/public/cpp/base/proto_wrapper_passkeys.h
index 694db8b..5a006d6 100644
--- a/mojo/public/cpp/base/proto_wrapper_passkeys.h
+++ b/mojo/public/cpp/base/proto_wrapper_passkeys.h
@@ -11,6 +11,7 @@
 namespace component_updater {
 class ReadMaskedDomainListProto;
 class PKIMetadataComponentInstallerService;
+class MaskedDomainListComponentInstallerPolicyTest;
 }  // namespace component_updater
 
 namespace paint_preview {
@@ -37,6 +38,7 @@
   // or to directly set the contained class name and bytes with from_span().
   friend class component_updater::ReadMaskedDomainListProto;
   friend class component_updater::PKIMetadataComponentInstallerService;
+  friend class component_updater::MaskedDomainListComponentInstallerPolicyTest;
 
   // Tests.
   FRIEND_TEST_ALL_PREFIXES(ProtoWrapperTest, ToFromBytes);
diff --git a/net/base/io_buffer.cc b/net/base/io_buffer.cc
index d43bc6a02..005bb64 100644
--- a/net/base/io_buffer.cc
+++ b/net/base/io_buffer.cc
@@ -35,25 +35,32 @@
 
 IOBuffer::~IOBuffer() = default;
 
+void IOBuffer::SetSpan(base::span<uint8_t> span) {
+  AssertValidBufferSize(span.size());
+  data_ = base::as_writable_chars(span).data();
+  size_ = span.size();
+}
+
+void IOBuffer::ClearSpan() {
+  data_ = nullptr;
+  size_ = 0;
+}
+
 IOBufferWithSize::IOBufferWithSize() = default;
 
-IOBufferWithSize::IOBufferWithSize(size_t buffer_size) {
-  AssertValidBufferSize(buffer_size);
-  storage_ = base::HeapArray<char>::Uninit(buffer_size);
-  size_ = storage_.size();
-  data_ = storage_.data();
+IOBufferWithSize::IOBufferWithSize(size_t buffer_size)
+    : storage_(base::HeapArray<uint8_t>::Uninit(buffer_size)) {
+  SetSpan(storage_);
 }
 
 IOBufferWithSize::~IOBufferWithSize() {
   // Clear pointer before this destructor makes it dangle.
-  data_ = nullptr;
+  ClearSpan();
 }
 
 VectorIOBuffer::VectorIOBuffer(std::vector<uint8_t> vector)
     : vector_(std::move(vector)) {
-  AssertValidBufferSize(vector_.size());
-  data_ = reinterpret_cast<char*>(vector_.data());
-  size_ = vector_.size();
+  SetSpan(vector_);
 }
 
 VectorIOBuffer::VectorIOBuffer(base::span<uint8_t> span)
@@ -61,7 +68,7 @@
 
 VectorIOBuffer::~VectorIOBuffer() {
   // Clear pointer before this destructor makes it dangle.
-  data_ = nullptr;
+  ClearSpan();
 }
 
 StringIOBuffer::StringIOBuffer(std::string s) : string_data_(std::move(s)) {
@@ -69,14 +76,12 @@
   // from `s` may invalidate it. This is especially true for libc++ short
   // string optimization where the data may be held in the string variable
   // itself, instead of in a movable backing store.
-  AssertValidBufferSize(string_data_.size());
-  data_ = string_data_.data();
-  size_ = string_data_.size();
+  SetSpan(base::as_writable_bytes(base::span(string_data_)));
 }
 
 StringIOBuffer::~StringIOBuffer() {
   // Clear pointer before this destructor makes it dangle.
-  data_ = nullptr;
+  ClearSpan();
 }
 
 DrainableIOBuffer::DrainableIOBuffer(scoped_refptr<IOBuffer> base, size_t size)
@@ -87,7 +92,7 @@
 }
 
 int DrainableIOBuffer::BytesRemaining() const {
-  return size_;
+  return size();
 }
 
 // Returns the number of consumed bytes.
@@ -102,26 +107,28 @@
   int length = size_ + used_;
   CHECK_LE(bytes, length);
   used_ = bytes;
-  size_ = length - bytes;
-  data_ = UNSAFE_TODO(base_->data() + used_);
+  SetSpan(base_->span().subspan(base::checked_cast<size_t>(used_),
+                                base::checked_cast<size_t>(length - bytes)));
 }
 
 DrainableIOBuffer::~DrainableIOBuffer() {
   // Clear ptr before this destructor destroys the |base_| instance,
   // making it dangle.
-  data_ = nullptr;
+  ClearSpan();
 }
 
 GrowableIOBuffer::GrowableIOBuffer() = default;
 
 void GrowableIOBuffer::SetCapacity(int capacity) {
   CHECK_GE(capacity, 0);
-  // this will get reset in `set_offset`.
-  data_ = nullptr;
-  size_ = 0;
+
+  // The span will be set again in `set_offset()`. Need to clear raw pointers to
+  // the data before reallocating the buffer.
+  ClearSpan();
 
   // realloc will crash if it fails.
-  real_data_.reset(static_cast<char*>(realloc(real_data_.release(), capacity)));
+  real_data_.reset(
+      static_cast<uint8_t*>(realloc(real_data_.release(), capacity)));
 
   capacity_ = capacity;
   if (offset_ > capacity)
@@ -134,8 +141,9 @@
   CHECK_GE(offset, 0);
   CHECK_LE(offset, capacity_);
   offset_ = offset;
-  data_ = UNSAFE_TODO(real_data_.get() + offset);
-  size_ = capacity_ - offset;
+
+  UNSAFE_TODO(SetSpan(base::span<uint8_t>(
+      real_data_.get() + offset, static_cast<size_t>(capacity_ - offset))));
 }
 
 void GrowableIOBuffer::DidConsume(int bytes) {
@@ -145,7 +153,7 @@
 }
 
 int GrowableIOBuffer::RemainingCapacity() {
-  return size_;
+  return size();
 }
 
 base::span<uint8_t> GrowableIOBuffer::everything() {
@@ -171,28 +179,29 @@
 }
 
 GrowableIOBuffer::~GrowableIOBuffer() {
-  data_ = nullptr;
+  ClearSpan();
 }
 
 PickledIOBuffer::PickledIOBuffer() = default;
 
 void PickledIOBuffer::Done() {
-  data_ = const_cast<char*>(pickle_.data_as_char());
-  size_ = pickle_.size();
+  // SAFETY: const cast does not affect size.
+  UNSAFE_BUFFERS(SetSpan(
+      base::span(const_cast<uint8_t*>(pickle_.data()), pickle_.size())));
 }
 
 PickledIOBuffer::~PickledIOBuffer() {
   // Avoid dangling ptr when this destructor destroys the pickle.
-  data_ = nullptr;
+  ClearSpan();
 }
 
 WrappedIOBuffer::WrappedIOBuffer(base::span<const char> data)
-    // SAFETY: const cast does not affect size.
-    : IOBuffer(UNSAFE_BUFFERS(
-          base::span(const_cast<char*>(data.data()), data.size()))) {}
+    : WrappedIOBuffer(base::as_byte_span(data)) {}
 
 WrappedIOBuffer::WrappedIOBuffer(base::span<const uint8_t> data)
-    : WrappedIOBuffer(base::as_chars(data)) {}
+    // SAFETY: const cast does not affect size.
+    : IOBuffer(UNSAFE_BUFFERS(
+          base::span(const_cast<uint8_t*>(data.data()), data.size()))) {}
 
 WrappedIOBuffer::~WrappedIOBuffer() = default;
 
diff --git a/net/base/io_buffer.h b/net/base/io_buffer.h
index 998a659b..d9043c6d 100644
--- a/net/base/io_buffer.h
+++ b/net/base/io_buffer.h
@@ -114,6 +114,18 @@
 
   virtual ~IOBuffer();
 
+  // Sets `data_` and `size_` based on span. CHECKs `size_` isn't too big to fit
+  // in an int.
+  //
+  // TODO(https://crbug.com/396621713): Replace `data_` and `size_` with a
+  // private `raw_span`, with this function being the only way to modify it.
+  void SetSpan(base::span<uint8_t> span);
+
+  // Like SetSpan(base::span<uint8_t>()), but without a size check. Particularly
+  // useful to call in the destructor of subclasses, to avoid failing raw
+  // reference checks.
+  void ClearSpan();
+
   raw_ptr<char, AllowPtrArithmetic> data_ = nullptr;
   int size_ = 0;
 };
@@ -128,7 +140,7 @@
   ~IOBufferWithSize() override;
 
  private:
-  base::HeapArray<char> storage_;
+  base::HeapArray<uint8_t> storage_;
 };
 
 // This is like IOBufferWithSize, except its constructor takes a vector.
@@ -260,7 +272,7 @@
   // TODO(329476354): Convert to std::vector, use reserve()+resize() to make
   // exact reallocs, and remove `capacity_`. Possibly with an allocator the
   // default-initializes, if it's important to not initialize the new memory?
-  std::unique_ptr<char, base::FreeDeleter> real_data_;
+  std::unique_ptr<uint8_t, base::FreeDeleter> real_data_;
   int capacity_ = 0;
   int offset_ = 0;
 };
diff --git a/net/device_bound_sessions/jwk_utils.cc b/net/device_bound_sessions/jwk_utils.cc
index 3bdfad28..ff0539f 100644
--- a/net/device_bound_sessions/jwk_utils.cc
+++ b/net/device_bound_sessions/jwk_utils.cc
@@ -75,10 +75,12 @@
     return base::Value::Dict();
   }
 
-  std::vector<uint8_t> x_bytes(BN_num_bytes(x.get()));
-  std::vector<uint8_t> y_bytes(BN_num_bytes(y.get()));
-  BN_bn2bin(x.get(), x_bytes.data());
-  BN_bn2bin(y.get(), y_bytes.data());
+  std::vector<uint8_t> x_bytes(32);
+  std::vector<uint8_t> y_bytes(32);
+  if (!BN_bn2bin_padded(x_bytes.data(), x_bytes.size(), x.get()) ||
+      !BN_bn2bin_padded(y_bytes.data(), y_bytes.size(), y.get())) {
+    return base::Value::Dict();
+  }
 
   return base::Value::Dict()
       .Set(kKeyTypeParam, kEcKeyType)
diff --git a/net/device_bound_sessions/jwk_utils_unittest.cc b/net/device_bound_sessions/jwk_utils_unittest.cc
index 259c176..fda7bce 100644
--- a/net/device_bound_sessions/jwk_utils_unittest.cc
+++ b/net/device_bound_sessions/jwk_utils_unittest.cc
@@ -61,18 +61,18 @@
   static constexpr uint8_t kSpki[] = {
       0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
       0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03,
-      0x42, 0x00, 0x04, 0xEB, 0xF1, 0x81, 0xDA, 0xFA, 0x10, 0xD2, 0xAA, 0xE8,
-      0x32, 0x1E, 0x8E, 0x94, 0x31, 0x42, 0x15, 0x2F, 0xD2, 0x26, 0xB8, 0x90,
-      0x8B, 0x53, 0xD3, 0xBE, 0xF0, 0x4E, 0x84, 0x66, 0x77, 0x6C, 0x72, 0x21,
-      0xE8, 0x0E, 0x25, 0x42, 0xF2, 0x13, 0xB4, 0xB1, 0x1F, 0xF0, 0x9D, 0xD4,
-      0xA0, 0x84, 0x47, 0xB9, 0x56, 0x06, 0xF1, 0x85, 0x1D, 0x0F, 0xA1, 0xD3,
-      0x1C, 0xA3, 0xCD, 0x48, 0xC4, 0x21, 0x61};
+      0x42, 0x00, 0x04, 0x85, 0xE5, 0x22, 0x74, 0x8C, 0x74, 0x18, 0x2D, 0x65,
+      0x25, 0x6C, 0x44, 0x19, 0x29, 0x62, 0x03, 0x62, 0x7A, 0x35, 0x8E, 0x2E,
+      0x52, 0xE6, 0x58, 0xE5, 0x06, 0x15, 0xBC, 0x1E, 0x41, 0x42, 0x15, 0x00,
+      0x77, 0x6D, 0x34, 0x5A, 0x31, 0x7A, 0x6A, 0x14, 0x33, 0x6D, 0x25, 0x75,
+      0x31, 0x3B, 0xB9, 0xA4, 0x69, 0x82, 0xC8, 0x04, 0x24, 0x32, 0xE3, 0x82,
+      0x46, 0x7F, 0x2F, 0xB4, 0x3B, 0x46, 0x7E};
 
   static constexpr char kJwk[] = R"json({
-      "kty": "EC",
-      "crv": "P-256",
-      "x": "6_GB2voQ0qroMh6OlDFCFS_SJriQi1PTvvBOhGZ3bHI",
-      "y": "IegOJULyE7SxH_Cd1KCER7lWBvGFHQ-h0xyjzUjEIWE"})json";
+    "kty": "EC",
+    "crv": "P-256",
+    "x": "heUidIx0GC1lJWxEGSliA2J6NY4uUuZY5QYVvB5BQhU",
+    "y": "AHdtNFoxemoUM20ldTE7uaRpgsgEJDLjgkZ_L7Q7Rn4"})json";
 
   base::Value expected = base::JSONReader::Read(kJwk).value();
   base::Value::Dict converted =
diff --git a/net/http/http_stream_pool_attempt_manager.cc b/net/http/http_stream_pool_attempt_manager.cc
index e74f93db..540d3bef 100644
--- a/net/http/http_stream_pool_attempt_manager.cc
+++ b/net/http/http_stream_pool_attempt_manager.cc
@@ -209,12 +209,7 @@
   int WaitForSSLConfigReady(CompletionOnceCallback callback) override {
     int rv = manager_->WaitForSSLConfigReady();
     if (rv == ERR_IO_PENDING) {
-      // TODO(crbug.com/383220402): Remove the timer when the cause of the bug
-      // is fixed.
-      ssl_config_waiting_timeout_timer_.Start(
-          FROM_HERE, base::Seconds(6),
-          base::BindOnce(&InFlightAttempt::OnWaitingSSLConfigTimedout,
-                         base::Unretained(this)));
+      ssl_config_wait_start_time_ = base::TimeTicks::Now();
       ssl_config_waiting_callback_ = std::move(callback);
     }
     return rv;
@@ -230,7 +225,11 @@
   }
 
   CompletionOnceCallback TakeSSLConfigWaitingCallback() {
-    ssl_config_waiting_timeout_timer_.Stop();
+    CHECK(!ssl_config_wait_start_time_.is_null());
+    base::UmaHistogramTimes(
+        "Net.HttpStreamPool.StreamAttemptSSLConfigWaitTime",
+        base::TimeTicks::Now() - ssl_config_wait_start_time_);
+
     return std::move(ssl_config_waiting_callback_);
   }
 
@@ -261,12 +260,6 @@
   }
 
  private:
-  void OnWaitingSSLConfigTimedout() {
-    std::string manager_info = manager_->GetInfoAsValue().DebugString();
-    DEBUG_ALIAS_FOR_CSTR(aliased_info, manager_info.c_str(), 512);
-    CHECK(false) << manager_info;
-  }
-
   void OnInFlightAttemptComplete(int rv) {
     manager_->OnInFlightAttemptComplete(this, rv);
   }
@@ -284,11 +277,9 @@
   // Set to true when `this` and `attempt_` should abort. Currently used to
   // handle ECH failure.
   bool is_aborted_ = false;
+  base::TimeTicks ssl_config_wait_start_time_;
   CompletionOnceCallback ssl_config_waiting_callback_;
 
-  // TODO(crbug.com/383220402): Remove this when the cause of the bug is fixed.
-  base::OneShotTimer ssl_config_waiting_timeout_timer_;
-
   base::WeakPtrFactory<InFlightAttempt> weak_ptr_factory_{this};
 };
 
diff --git a/net/network_error_logging/network_error_logging_service.cc b/net/network_error_logging/network_error_logging_service.cc
index 5bbeeb3..c69d37b4 100644
--- a/net/network_error_logging/network_error_logging_service.cc
+++ b/net/network_error_logging/network_error_logging_service.cc
@@ -288,6 +288,11 @@
     return reporting_service_;
   }
 
+  void LoadPoliciesForTesting(std::vector<NelPolicy> policies) override {
+    started_loading_policies_ = true;
+    OnPoliciesLoaded(policies);
+  }
+
  private:
   // Map from (NAK, origin) to owned policy.
   using PolicyMap = std::map<NelPolicyKey, NelPolicy>;
@@ -1066,6 +1071,12 @@
   return nullptr;
 }
 
+void NetworkErrorLoggingService::LoadPoliciesForTesting(
+    std::vector<NetworkErrorLoggingService::NelPolicy> policies) {
+  NOTIMPLEMENTED();
+  return;
+}
+
 NetworkErrorLoggingService::NetworkErrorLoggingService()
     : clock_(base::DefaultClock::GetInstance()) {}
 
diff --git a/net/network_error_logging/network_error_logging_service.h b/net/network_error_logging/network_error_logging_service.h
index b827567..ededd5fd 100644
--- a/net/network_error_logging/network_error_logging_service.h
+++ b/net/network_error_logging/network_error_logging_service.h
@@ -296,6 +296,10 @@
   virtual PersistentNelStore* GetPersistentNelStoreForTesting();
   virtual ReportingService* GetReportingServiceForTesting();
 
+  // Loads a specified list of Nel policies and marks the service as
+  // initialized.
+  virtual void LoadPoliciesForTesting(std::vector<NelPolicy> policies);
+
  protected:
   NetworkErrorLoggingService();
 
diff --git a/net/quic/quic_session_attempt.h b/net/quic/quic_session_attempt.h
index c0b58ba..e8cc530 100644
--- a/net/quic/quic_session_attempt.h
+++ b/net/quic/quic_session_attempt.h
@@ -158,7 +158,7 @@
   bool connection_retried_ = false;
 
   // Used to populate NetErrorDetails after we reset `session_`.
-  HttpConnectionInfo connection_info_;
+  HttpConnectionInfo connection_info_ = HttpConnectionInfo::kUNKNOWN;
   quic::QuicErrorCode quic_connection_error_ = quic::QUIC_NO_ERROR;
 
   base::TimeTicks quic_connection_start_time_;
diff --git a/net/quic/quic_session_pool_test.cc b/net/quic/quic_session_pool_test.cc
index eecbc57..7afc141 100644
--- a/net/quic/quic_session_pool_test.cc
+++ b/net/quic/quic_session_pool_test.cc
@@ -167,6 +167,12 @@
         SessionUsage::kDestination, SocketTag(), NetworkAnonymizationKey(),
         SecureDnsPolicy::kAllow, /*require_dns_https_alpn=*/false);
     quic_session_alias_key_ = QuicSessionAliasKey(destination, session_key);
+    attempt_ = pool_->CreateSessionAttempt(
+        this, quic_session_alias_key_.session_key(), quic_endpoint,
+        /*cert_verify_flags=*/0,
+        /*dns_resolution_start_time=*/base::TimeTicks(),
+        /*dns_resolution_end_time=*/base::TimeTicks(), /*use_dns_aliases=*/true,
+        /*dns_aliases=*/{}, MultiplexedSessionCreationInitiator::kUnknown);
   }
 
   SessionAttemptHelper(const SessionAttemptHelper&) = delete;
@@ -182,16 +188,12 @@
   const NetLogWithSource& GetNetLog() override { return net_log_; }
 
   int Start() {
-    attempt_ = pool_->CreateSessionAttempt(
-        this, quic_session_alias_key_.session_key(), quic_endpoint,
-        /*cert_verify_flags=*/0,
-        /*dns_resolution_start_time=*/base::TimeTicks(),
-        /*dns_resolution_end_time=*/base::TimeTicks(), /*use_dns_aliases=*/true,
-        /*dns_aliases=*/{}, MultiplexedSessionCreationInitiator::kUnknown);
     return attempt_->Start(base::BindOnce(&SessionAttemptHelper::OnComplete,
                                           base::Unretained(this)));
   }
 
+  QuicSessionAttempt* attempt() const { return attempt_.get(); }
+
   std::optional<int> result() const { return result_; }
 
  private:
@@ -14725,11 +14727,18 @@
 
   SessionAttemptHelper session_attempt(factory_.get(), version_);
 
+  NetErrorDetails details;
+  session_attempt.attempt()->PopulateNetErrorDetails(&details);
+  EXPECT_EQ(details.connection_info, HttpConnectionInfo::kUNKNOWN);
+
   int rv = session_attempt.Start();
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   RunUntilIdle();
   EXPECT_THAT(session_attempt.result(), testing::Optional(OK));
   ASSERT_TRUE(GetActiveSession(kDefaultDestination));
+  session_attempt.attempt()->PopulateNetErrorDetails(&details);
+  // Check HttpConnectionInfo is updated, we don't care about the actual value.
+  EXPECT_NE(details.connection_info, HttpConnectionInfo::kUNKNOWN);
 
   socket_data.ExpectAllReadDataConsumed();
   socket_data.ExpectAllWriteDataConsumed();
diff --git a/net/server/http_connection.cc b/net/server/http_connection.cc
index 518552f..21e7f3c6 100644
--- a/net/server/http_connection.cc
+++ b/net/server/http_connection.cc
@@ -11,7 +11,9 @@
 
 #include <utility>
 
+#include "base/containers/span.h"
 #include "base/logging.h"
+#include "base/numerics/checked_math.h"
 #include "net/server/web_socket.h"
 #include "net/socket/stream_socket.h"
 
@@ -23,7 +25,8 @@
 }
 
 HttpConnection::ReadIOBuffer::~ReadIOBuffer() {
-  data_ = nullptr;  // Avoid dangling ptr when `base_` is destroyed.
+  // Avoid dangling ptr when `base_` is destroyed.
+  ClearSpan();
 }
 
 int HttpConnection::ReadIOBuffer::GetCapacity() const {
@@ -32,9 +35,11 @@
 
 void HttpConnection::ReadIOBuffer::SetCapacity(int capacity) {
   DCHECK_LE(GetSize(), capacity);
-  data_ = nullptr;
+  // Clear current span to avoid warning about dangling pointer, as
+  // SetCapacity() may destroy the old buffer.
+  ClearSpan();
   base_->SetCapacity(capacity);
-  data_ = base_->data();
+  SetSpan(base_->span());
 }
 
 bool HttpConnection::ReadIOBuffer::IncreaseCapacity() {
@@ -63,7 +68,7 @@
 void HttpConnection::ReadIOBuffer::DidRead(int bytes) {
   DCHECK_GE(RemainingCapacity(), bytes);
   base_->set_offset(base_->offset() + bytes);
-  data_ = base_->data();
+  SetSpan(base_->span());
 }
 
 int HttpConnection::ReadIOBuffer::RemainingCapacity() const {
@@ -79,7 +84,7 @@
     memmove(StartOfBuffer(), StartOfBuffer() + bytes, unconsumed_size);
   }
   base_->set_offset(unconsumed_size);
-  data_ = base_->data();
+  SetSpan(base_->span());
 
   // If capacity is too big, reduce it.
   if (GetCapacity() > kMinimumBufSize &&
@@ -88,7 +93,7 @@
     if (new_capacity < kMinimumBufSize)
       new_capacity = kMinimumBufSize;
     // this avoids the pointer to dangle until `SetCapacity` gets called.
-    data_ = nullptr;
+    ClearSpan();
     // realloc() within GrowableIOBuffer::SetCapacity() could move data even
     // when size is reduced. If unconsumed_size == 0, i.e. no data exists in
     // the buffer, free internal buffer first to guarantee no data move.
@@ -101,7 +106,8 @@
 HttpConnection::QueuedWriteIOBuffer::QueuedWriteIOBuffer() = default;
 
 HttpConnection::QueuedWriteIOBuffer::~QueuedWriteIOBuffer() {
-  data_ = nullptr;  // pending_data_ owns data_.
+  // `pending_data_` owns the underlying data.
+  ClearSpan();
 }
 
 bool HttpConnection::QueuedWriteIOBuffer::IsEmpty() const {
@@ -123,8 +129,10 @@
   total_size_ += data.size();
 
   // If new data is the first pending data, updates data_.
-  if (pending_data_.size() == 1)
+  if (pending_data_.size() == 1) {
     data_ = const_cast<char*>(pending_data_.front()->data());
+    SetSpan(base::as_writable_bytes(base::span(*pending_data_.front())));
+  }
   return true;
 }
 
@@ -135,12 +143,14 @@
     return;
 
   if (size < GetSizeToWrite()) {
-    data_ += size;
-  } else {  // size == GetSizeToWrite(). Updates data_ to next pending data.
-    data_ = nullptr;
+    SetSpan(span().subspan(base::checked_cast<size_t>(size)));
+  } else {
+    // size == GetSizeToWrite(). Updates data_ to next pending data.
+    ClearSpan();
     pending_data_.pop();
-    data_ =
-        IsEmpty() ? nullptr : const_cast<char*>(pending_data_.front()->data());
+    if (!IsEmpty()) {
+      SetSpan(base::as_writable_bytes(base::span(*pending_data_.front())));
+    }
   }
   total_size_ -= size;
 }
@@ -150,10 +160,8 @@
     DCHECK_EQ(0, total_size_);
     return 0;
   }
-  DCHECK_GE(data_, pending_data_.front()->data());
-  int consumed = static_cast<int>(data_ - pending_data_.front()->data());
-  DCHECK_GT(static_cast<int>(pending_data_.front()->size()), consumed);
-  return pending_data_.front()->size() - consumed;
+  // Return the unconsumed size of the current pending write.
+  return size();
 }
 
 HttpConnection::HttpConnection(int id, std::unique_ptr<StreamSocket> socket)
diff --git a/net/server/http_connection.h b/net/server/http_connection.h
index 39c80f7c4..48f1434 100644
--- a/net/server/http_connection.h
+++ b/net/server/http_connection.h
@@ -24,7 +24,8 @@
  public:
   // IOBuffer for data read.  It's a wrapper around GrowableIOBuffer, with more
   // functions for buffer management.  It moves unconsumed data to the start of
-  // buffer.
+  // buffer. The data() pointer points to the end of the consumed data, where
+  // the next write to the buffer should occur.
   class NET_EXPORT ReadIOBuffer : public IOBuffer {
    public:
     static const int kInitialBufSize = 1024;
@@ -45,7 +46,8 @@
 
     // Start of read data.
     char* StartOfBuffer() const;
-    // Returns the bytes of read data.
+    // Returns the number of read bytes available, which start at
+    // StartOfBuffer(). span() starts at StartOfBuffer() + GetSize().
     int GetSize() const;
     // More read data was appended.
     void DidRead(int bytes);
@@ -69,8 +71,8 @@
   };
 
   // IOBuffer of pending data to write which has a queue of pending data. Each
-  // pending data is stored in std::string.  data() is the data of first
-  // std::string stored.
+  // pending data is stored in std::string. The IOBuffer's data pointer tracks
+  // the portion of the first write in the queue that has yet to be written.
   class NET_EXPORT QueuedWriteIOBuffer : public IOBuffer {
    public:
     static const int kDefaultMaxBufferSize = 1 * 1024 * 1024;  // 1 Mbytes.
diff --git a/net/spdy/spdy_buffer.cc b/net/spdy/spdy_buffer.cc
index f7e479f..271d94f 100644
--- a/net/spdy/spdy_buffer.cc
+++ b/net/spdy/spdy_buffer.cc
@@ -59,7 +59,7 @@
   ~SharedFrameIOBuffer() override {
     // Prevent `data_` from dangling should this destructor remove the
     // last reference to `shared_frame`.
-    data_ = nullptr;
+    ClearSpan();
   }
 
   const scoped_refptr<SharedFrame> shared_frame_;
diff --git a/net/websockets/websocket_inflater.cc b/net/websockets/websocket_inflater.cc
index 3027eb41..47e9f38 100644
--- a/net/websockets/websocket_inflater.cc
+++ b/net/websockets/websocket_inflater.cc
@@ -16,6 +16,7 @@
 
 #include "base/check.h"
 #include "base/check_op.h"
+#include "base/numerics/checked_math.h"
 #include "net/base/io_buffer.h"
 #include "third_party/zlib/zlib.h"
 
@@ -28,9 +29,9 @@
   explicit ShrinkableIOBufferWithSize(size_t size) : IOBufferWithSize(size) {}
 
   void Shrink(int new_size) {
-    CHECK_GE(new_size, 0);
-    CHECK_LE(new_size, size_);
-    size_ = new_size;
+    // The `checked_cast` addresses the < 0 case.
+    CHECK_LE(new_size, size());
+    SetSpan(span().first(base::checked_cast<size_t>(new_size)));
   }
 
  private:
diff --git a/printing/backend/print_backend_consts.cc b/printing/backend/print_backend_consts.cc
index 0bcfe57..0b7049d4 100644
--- a/printing/backend/print_backend_consts.cc
+++ b/printing/backend/print_backend_consts.cc
@@ -8,13 +8,21 @@
 
 // TODO(dhoss): Evaluate removing the strings used as keys for
 // `PrinterBasicInfo.options` in favor of fields in PrinterBasicInfo.
+
+#if BUILDFLAG(IS_CHROMEOS)
 const char kCUPSEnterprisePrinter[] = "cupsEnterprisePrinter";
-const char kDriverInfoTagName[] = "system_driverinfo";
-const char kDriverNameTagName[] = "printer-make-and-model";
-const char kLocationTagName[] = "printer-location";
 const char kValueFalse[] = "false";
 const char kValueTrue[] = "true";
 const char kPrinterStatus[] = "printerStatus";
+#endif  // BUILDFLAG(IS_CHROMEOS)
+
+#if BUILDFLAG(IS_WIN)
+const char kLocationTagName[] = "printer-location";
+#endif
+
+#if BUILDFLAG(USE_CUPS)
+const char kDriverInfoTagName[] = "system_driverinfo";
+const char kDriverNameTagName[] = "printer-make-and-model";
 
 // The following values must match those defined in CUPS.
 const char kCUPSOptDeviceUri[] = "device-uri";
@@ -23,3 +31,4 @@
 const char kCUPSOptPrinterMakeAndModel[] = "printer-make-and-model";
 const char kCUPSOptPrinterType[] = "printer-type";
 const char kCUPSOptPrinterUriSupported[] = "printer-uri-supported";
+#endif  // BUILDFLAG(USE_CUPS)
diff --git a/printing/backend/print_backend_consts.h b/printing/backend/print_backend_consts.h
index 6eddabd8..42bfe53 100644
--- a/printing/backend/print_backend_consts.h
+++ b/printing/backend/print_backend_consts.h
@@ -6,14 +6,23 @@
 #define PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_
 
 #include "base/component_export.h"
+#include "build/build_config.h"
+#include "printing/buildflags/buildflags.h"
 
+#if BUILDFLAG(IS_CHROMEOS)
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSEnterprisePrinter[];
-COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDriverInfoTagName[];
-COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDriverNameTagName[];
-COMPONENT_EXPORT(PRINT_BACKEND) extern const char kLocationTagName[];
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kValueFalse[];
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kValueTrue[];
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPrinterStatus[];
+#endif  // BUILDFLAG(IS_CHROMEOS)
+
+#if BUILDFLAG(IS_WIN)
+COMPONENT_EXPORT(PRINT_BACKEND) extern const char kLocationTagName[];
+#endif
+
+#if BUILDFLAG(USE_CUPS)
+COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDriverInfoTagName[];
+COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDriverNameTagName[];
 
 // CUPS destination option names.
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptDeviceUri[];
@@ -22,5 +31,6 @@
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterMakeAndModel[];
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterType[];
 COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterUriSupported[];
+#endif  // BUILDFLAG(USE_CUPS)
 
 #endif  // PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc
index 1765eef..de38d0e6 100644
--- a/printing/backend/win_helper.cc
+++ b/printing/backend/win_helper.cc
@@ -418,12 +418,6 @@
       printer_info.options[kLocationTagName] = std::move(location);
     }
   }
-  if (info_2.get()->pDriverName) {
-    std::string driver_name = base::WideToUTF8(info_2.get()->pDriverName);
-    if (!driver_name.empty()) {
-      printer_info.options[kDriverNameTagName] = std::move(driver_name);
-    }
-  }
   return printer_info;
 }
 
diff --git a/remoting/base/compute_engine_service_client.cc b/remoting/base/compute_engine_service_client.cc
index c7b57cf..576ccf3c 100644
--- a/remoting/base/compute_engine_service_client.cc
+++ b/remoting/base/compute_engine_service_client.cc
@@ -242,6 +242,10 @@
                << ", Message: " << http_status.error_message();
   }
 
+  // Reset |url_loader_| since we've extracted the info we need from it.
+  // This will allow the caller to reuse this instance to make another request.
+  url_loader_.reset();
+
   std::move(callback).Run(http_status);
 }
 
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index 1b39abd..1206333 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -573,10 +573,6 @@
       "utempter",
       "util",
     ]
-
-    if (ozone_platform_wayland) {
-      deps += [ "//ui/events/platform/wayland:wayland_event_watcher" ]
-    }
   }
 
   if (is_linux) {
@@ -599,14 +595,9 @@
     defines += [ "REMOTING_USE_X11" ]
     sources -= [ "active_display_monitor.cc" ]
     libs += [ "//third_party/libei/cipd/lib64/libei.a" ]
-    public_deps += [
-      "//third_party/wayland:wayland_client",
-      "//third_party/wayland-protocols:xdg_output_protocol",
-    ]
     deps += [
       "//remoting/host/linux:platform_impls",
       "//remoting/host/linux:utils",
-      "//remoting/host/linux:wayland",
       "//ui/base/x",
       "//ui/events/platform/x11",
       "//ui/gfx/x",
@@ -908,10 +899,7 @@
   }
 
   if (is_linux) {
-    deps += [
-      "//remoting/host/linux:wayland",
-      "//ui/gtk:gtk_config",
-    ]
+    deps += [ "//ui/gtk:gtk_config" ]
   }
 
   if (is_linux) {
@@ -1135,15 +1123,11 @@
       defines += [ "REMOTING_USE_X11" ]
       deps += [
         "//remoting/host/linux:platform_impls",
-        "//remoting/host/linux:wayland",
         "//ui/events/platform/x11:x11",
       ]
       if (is_linux) {
         deps += [ "//ui/gtk:gtk_config" ]
       }
-      if (ozone_platform_wayland) {
-        deps += [ "//ui/events/platform/wayland:wayland_event_watcher" ]
-      }
     }
 
     if (is_posix) {
diff --git a/remoting/host/basic_desktop_environment.cc b/remoting/host/basic_desktop_environment.cc
index 780f366..02570d0 100644
--- a/remoting/host/basic_desktop_environment.cc
+++ b/remoting/host/basic_desktop_environment.cc
@@ -49,7 +49,6 @@
 
 #if defined(REMOTING_USE_X11)
 #include "base/threading/watchdog.h"
-#include "remoting/host/linux/wayland_utils.h"
 #endif
 
 namespace remoting {
@@ -213,14 +212,12 @@
       options_(options) {
   DCHECK(caller_task_runner_->BelongsToCurrentThread());
 #if defined(REMOTING_USE_X11)
-  if (!IsRunningWayland()) {
-    // TODO(yuweih): The watchdog is just to test the hypothesis.
-    // The IgnoreXServerGrabs() call should probably be moved to whichever
-    // thread that created desktop_capture_options().x_display().
-    IgnoreXServerGrabsWatchdog watchdog;
-    watchdog.Arm();
-    desktop_capture_options().x_display()->IgnoreXServerGrabs();
-  }
+  // TODO(yuweih): The watchdog is just to test the hypothesis.
+  // The IgnoreXServerGrabs() call should probably be moved to whichever
+  // thread that created desktop_capture_options().x_display().
+  IgnoreXServerGrabsWatchdog watchdog;
+  watchdog.Arm();
+  desktop_capture_options().x_display()->IgnoreXServerGrabs();
 #elif BUILDFLAG(IS_WIN)
   // Check whether D3D is available as long as the DirectX capturer wasn't
   // explicitly disabled. This check is necessary because the network process
diff --git a/remoting/host/desktop_and_cursor_conditional_composer.cc b/remoting/host/desktop_and_cursor_conditional_composer.cc
index ef91639..cae683fe 100644
--- a/remoting/host/desktop_and_cursor_conditional_composer.cc
+++ b/remoting/host/desktop_and_cursor_conditional_composer.cc
@@ -7,10 +7,6 @@
 #include "base/functional/bind.h"
 #include "build/build_config.h"
 
-#if BUILDFLAG(IS_LINUX)
-#include "remoting/host/linux/wayland_utils.h"
-#endif
-
 namespace remoting {
 
 DesktopAndCursorConditionalComposer::DesktopAndCursorConditionalComposer(
@@ -95,14 +91,6 @@
   return capturer_->IsOccluded(pos);
 }
 
-bool DesktopAndCursorConditionalComposer::SupportsFrameCallbacks() {
-#if BUILDFLAG(IS_LINUX)
-  return IsRunningWayland();
-#else
-  return false;
-#endif
-}
-
 void DesktopAndCursorConditionalComposer::SetMaxFrameRate(
     uint32_t max_frame_rate) {
   capturer_->SetMaxFrameRate(max_frame_rate);
diff --git a/remoting/host/desktop_and_cursor_conditional_composer.h b/remoting/host/desktop_and_cursor_conditional_composer.h
index 0e0059835..4977bde 100644
--- a/remoting/host/desktop_and_cursor_conditional_composer.h
+++ b/remoting/host/desktop_and_cursor_conditional_composer.h
@@ -39,7 +39,6 @@
   void SetMouseCursor(
       std::unique_ptr<webrtc::MouseCursor> mouse_cursor) override;
   void SetMouseCursorPosition(const webrtc::DesktopVector& position) override;
-  bool SupportsFrameCallbacks() override;
   void SetMaxFrameRate(uint32_t max_frame_rate) override;
 #if defined(WEBRTC_USE_GIO)
   void GetMetadataAsync(base::OnceCallback<void(webrtc::DesktopCaptureMetadata)>
diff --git a/remoting/host/desktop_capturer_proxy.cc b/remoting/host/desktop_capturer_proxy.cc
index c78e8d8..89c4d6e 100644
--- a/remoting/host/desktop_capturer_proxy.cc
+++ b/remoting/host/desktop_capturer_proxy.cc
@@ -28,8 +28,6 @@
 #if BUILDFLAG(IS_LINUX)
 #include "base/environment.h"
 #include "base/nix/xdg_util.h"
-#include "remoting/host/linux/wayland_desktop_capturer.h"
-#include "remoting/host/linux/wayland_utils.h"
 #endif
 
 namespace remoting {
@@ -97,12 +95,7 @@
     session_type = base::nix::GetSessionType(*env);
   }
 
-  if (options.allow_pipewire() &&
-      session_type == base::nix::SessionType::kWayland) {
-    capturer_ = std::make_unique<WaylandDesktopCapturer>(options);
-  } else {
     capturer_ = webrtc::DesktopCapturer::CreateScreenCapturer(options);
-  }
 #else   // !BUILDFLAG(IS_CHROMEOS)
   capturer_ = webrtc::DesktopCapturer::CreateScreenCapturer(options);
 #endif  // !BUILDFLAG(IS_CHROMEOS)
@@ -294,16 +287,6 @@
 }
 #endif
 
-bool DesktopCapturerProxy::SupportsFrameCallbacks() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-#if BUILDFLAG(IS_LINUX)
-  return IsRunningWayland();
-#else
-  return false;
-#endif
-}
-
 void DesktopCapturerProxy::SetMaxFrameRate(uint32_t max_frame_rate) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
diff --git a/remoting/host/desktop_capturer_proxy.h b/remoting/host/desktop_capturer_proxy.h
index 78cbe58..0b478f9 100644
--- a/remoting/host/desktop_capturer_proxy.h
+++ b/remoting/host/desktop_capturer_proxy.h
@@ -53,7 +53,6 @@
   void CaptureFrame() override;
   bool GetSourceList(SourceList* sources) override;
   bool SelectSource(SourceId id) override;
-  bool SupportsFrameCallbacks() override;
   void SetMaxFrameRate(uint32_t max_frame_rate) override;
 #if defined(WEBRTC_USE_GIO)
   void GetMetadataAsync(base::OnceCallback<void(webrtc::DesktopCaptureMetadata)>
diff --git a/remoting/host/desktop_capturer_wrapper.cc b/remoting/host/desktop_capturer_wrapper.cc
index 533f8406..c467c1e 100644
--- a/remoting/host/desktop_capturer_wrapper.cc
+++ b/remoting/host/desktop_capturer_wrapper.cc
@@ -13,11 +13,6 @@
 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
 
-#if BUILDFLAG(IS_LINUX)
-#include "remoting/host/linux/wayland_desktop_capturer.h"
-#include "remoting/host/linux/wayland_utils.h"
-#endif
-
 namespace remoting {
 
 DesktopCapturerWrapper::DesktopCapturerWrapper() {
@@ -33,15 +28,7 @@
     SourceId id) {
   DCHECK(!capturer_);
 
-#if BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    capturer_ = std::make_unique<WaylandDesktopCapturer>(options);
-  } else {
-    capturer_ = webrtc::DesktopCapturer::CreateScreenCapturer(options);
-  }
-#else
   capturer_ = webrtc::DesktopCapturer::CreateScreenCapturer(options);
-#endif
 
   if (capturer_) {
     capturer_->SelectSource(id);
@@ -109,16 +96,6 @@
   callback_->OnCaptureResult(result, std::move(frame));
 }
 
-bool DesktopCapturerWrapper::SupportsFrameCallbacks() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-#if BUILDFLAG(IS_LINUX)
-  return capturer_ && IsRunningWayland();
-#else
-  return false;
-#endif
-}
-
 void DesktopCapturerWrapper::SetMaxFrameRate(uint32_t max_frame_rate) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
diff --git a/remoting/host/desktop_capturer_wrapper.h b/remoting/host/desktop_capturer_wrapper.h
index 19faf94b..fd6f294 100644
--- a/remoting/host/desktop_capturer_wrapper.h
+++ b/remoting/host/desktop_capturer_wrapper.h
@@ -38,7 +38,6 @@
   void CaptureFrame() override;
   bool GetSourceList(SourceList* sources) override;
   bool SelectSource(SourceId id) override;
-  bool SupportsFrameCallbacks() override;
   void SetMaxFrameRate(uint32_t max_frame_rate) override;
 #if defined(WEBRTC_USE_GIO)
   void GetMetadataAsync(base::OnceCallback<void(webrtc::DesktopCaptureMetadata)>
diff --git a/remoting/host/input_monitor/BUILD.gn b/remoting/host/input_monitor/BUILD.gn
index adda6f40..6b88fd1 100644
--- a/remoting/host/input_monitor/BUILD.gn
+++ b/remoting/host/input_monitor/BUILD.gn
@@ -23,10 +23,7 @@
       "local_keyboard_input_monitor_linux.cc",
       "local_mouse_input_monitor_linux.cc",
     ]
-    deps += [
-      "//base",
-      "//remoting/host/linux:wayland",
-    ]
+    deps += [ "//base" ]
   }
 
   deps += [
diff --git a/remoting/host/input_monitor/local_hotkey_input_monitor_linux.cc b/remoting/host/input_monitor/local_hotkey_input_monitor_linux.cc
index 2764693..d92fef2 100644
--- a/remoting/host/input_monitor/local_hotkey_input_monitor_linux.cc
+++ b/remoting/host/input_monitor/local_hotkey_input_monitor_linux.cc
@@ -2,11 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/functional/callback.h"
-#include "base/notreached.h"
-#include "base/task/single_thread_task_runner.h"
 #include "remoting/host/input_monitor/local_hotkey_input_monitor.h"
-#include "remoting/host/linux/wayland_utils.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/functional/callback.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/task/single_thread_task_runner.h"
 
 #if defined(REMOTING_USE_X11)
 #include "remoting/host/input_monitor/local_hotkey_input_monitor_x11.h"
@@ -19,15 +22,11 @@
     scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
     base::OnceClosure disconnect_callback) {
-#if defined(REMOTING_USE_WAYLAND)
-  DCHECK(IsRunningWayland());
-  NOTIMPLEMENTED();
-  return nullptr;
-#elif defined(REMOTING_USE_X11)
+#if defined(REMOTING_USE_X11)
   return std::make_unique<LocalHotkeyInputMonitorX11>(
       caller_task_runner, input_task_runner, std::move(disconnect_callback));
 #else
-#error "Should use either wayland or x11."
+#error "Can't currently build CRD without x11."
 #endif
 }
 
diff --git a/remoting/host/input_monitor/local_mouse_input_monitor_linux.cc b/remoting/host/input_monitor/local_mouse_input_monitor_linux.cc
index c866766..b9bf386 100644
--- a/remoting/host/input_monitor/local_mouse_input_monitor_linux.cc
+++ b/remoting/host/input_monitor/local_mouse_input_monitor_linux.cc
@@ -10,7 +10,6 @@
 #include "base/notreached.h"
 #include "base/task/single_thread_task_runner.h"
 #include "remoting/host/input_monitor/local_mouse_input_monitor_x11.h"
-#include "remoting/host/linux/wayland_utils.h"
 
 namespace remoting {
 
@@ -20,10 +19,6 @@
     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
     LocalInputMonitor::PointerMoveCallback on_mouse_move,
     base::OnceClosure disconnect_callback) {
-  if (IsRunningWayland()) {
-    NOTIMPLEMENTED();
-    return nullptr;
-  }
   return std::make_unique<LocalMouseInputMonitorX11>(
       caller_task_runner, input_task_runner, std::move(on_mouse_move));
 }
diff --git a/remoting/host/it2me/BUILD.gn b/remoting/host/it2me/BUILD.gn
index 800c649..e48af3c 100644
--- a/remoting/host/it2me/BUILD.gn
+++ b/remoting/host/it2me/BUILD.gn
@@ -107,7 +107,6 @@
     deps += [
       "//build/config/linux/gtk",
       "//remoting/host/linux:platform_impls",
-      "//remoting/host/linux:wayland",
       "//ui/base:base",
 
       # GTK pulls pangoft2, which requires HarfBuzz symbols. When linking
@@ -196,9 +195,6 @@
       "//ui/gfx",
     ]
 
-    if (is_linux) {
-      deps += [ "//remoting/host/linux:wayland" ]
-    }
     if (is_linux && remoting_use_x11) {
       defines = [ "REMOTING_USE_X11" ]
       deps += [
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc
index dac9591..afe2d6ed 100644
--- a/remoting/host/it2me/it2me_host.cc
+++ b/remoting/host/it2me/it2me_host.cc
@@ -73,11 +73,6 @@
 #include "remoting/host/chromeos/features.h"
 #endif
 
-#if BUILDFLAG(IS_LINUX)
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/host/linux/wayland_utils.h"
-#endif  // BUILDFLAG(IS_LINUX)
-
 namespace remoting {
 
 using protocol::ErrorCode;
@@ -234,12 +229,6 @@
 
   OnPolicyUpdate(std::move(policies));
 
-#if BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    WaylandManager::Get()->Init(host_context_->ui_task_runner());
-  }
-#endif  // BUILDFLAG(IS_LINUX)
-
   desktop_environment_factory_ =
       std::make_unique<It2MeDesktopEnvironmentFactory>(
           host_context_->network_task_runner(), host_context_->ui_task_runner(),
@@ -390,11 +379,6 @@
 
   // Set up the desktop environment options.
   DesktopEnvironmentOptions options(DesktopEnvironmentOptions::CreateDefault());
-#if BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    options.desktop_capture_options()->set_prefer_cursor_embedded(true);
-  }
-#endif
 
 #if BUILDFLAG(IS_CHROMEOS) || !defined(NDEBUG)
   if (is_enterprise_session()) {
diff --git a/remoting/host/it2me/it2me_host_unittest.cc b/remoting/host/it2me/it2me_host_unittest.cc
index 8576514..086acb5 100644
--- a/remoting/host/it2me/it2me_host_unittest.cc
+++ b/remoting/host/it2me/it2me_host_unittest.cc
@@ -60,11 +60,6 @@
 #include "base/linux_util.h"
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
-#if BUILDFLAG(IS_LINUX)
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/host/linux/wayland_utils.h"
-#endif  // BUILDFLAG(IS_LINUX)
-
 namespace remoting {
 
 using protocol::ErrorCode;
@@ -363,11 +358,6 @@
   // Shutdown the host if it hasn't been already. Without this, the call to
   // run_loop_->Run() may never return.
   it2me_host_->Disconnect();
-#if BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    WaylandManager::Get()->CleanupRunnerForTest();
-  }
-#endif
   network_task_runner_ = nullptr;
   ui_task_runner_ = nullptr;
   host_context_.reset();
diff --git a/remoting/host/it2me/it2me_native_messaging_host_main.cc b/remoting/host/it2me/it2me_native_messaging_host_main.cc
index 61b99cf..f799811 100644
--- a/remoting/host/it2me/it2me_native_messaging_host_main.cc
+++ b/remoting/host/it2me/it2me_native_messaging_host_main.cc
@@ -34,7 +34,6 @@
 #if defined(REMOTING_USE_X11)
 #include <gtk/gtk.h>
 #include "base/linux_util.h"
-#include "remoting/host/linux/wayland_utils.h"
 #include "ui/events/platform/x11/x11_event_source.h"
 #include "ui/gfx/x/xlib_support.h"
 #endif  // defined(REMOTING_USE_X11)
@@ -78,11 +77,9 @@
 // runs the task executor until It2MeNativeMessagingHost signals shutdown.
 int It2MeNativeMessagingHostMain(int argc, char** argv) {
 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
-  if (!IsRunningWayland()) {
-    // Initialize Xlib for multi-threaded use, allowing non-Chromium code to
-    // use X11 safely (such as the WebRTC capturer, GTK ...)
-    x11::InitXlib();
-  }
+  // Initialize Xlib for multi-threaded use, allowing non-Chromium code to
+  // use X11 safely (such as the WebRTC capturer, GTK ...)
+  x11::InitXlib();
 #endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) &&
         // defined(REMOTING_USE_X11)
 
@@ -253,17 +250,14 @@
 
 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
   scoped_refptr<AutoThreadTaskRunner> input_task_runner;
-  if (!IsRunningWayland()) {
-    // Create an X11EventSource on all UI threads, so the global X11 connection
-    // (x11::Connection::Get()) can dispatch X events.
-    auto event_source =
-        std::make_unique<ui::X11EventSource>(x11::Connection::Get());
-    input_task_runner = context->input_task_runner();
-    input_task_runner->PostTask(
-        FROM_HERE, base::BindOnce([]() {
-          new ui::X11EventSource(x11::Connection::Get());
-        }));
-  }
+  // Create an X11EventSource on all UI threads, so the global X11 connection
+  // (x11::Connection::Get()) can dispatch X events.
+  auto event_source =
+      std::make_unique<ui::X11EventSource>(x11::Connection::Get());
+  input_task_runner = context->input_task_runner();
+  input_task_runner->PostTask(FROM_HERE, base::BindOnce([]() {
+                                new ui::X11EventSource(x11::Connection::Get());
+                              }));
 #endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) &&
         // defined(REMOTING_USE_X11)
 
@@ -279,11 +273,9 @@
   run_loop.Run();
 
 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
-  if (!IsRunningWayland()) {
-    input_task_runner->PostTask(FROM_HERE, base::BindOnce([]() {
-                                  delete ui::X11EventSource::GetInstance();
-                                }));
-  }
+  input_task_runner->PostTask(FROM_HERE, base::BindOnce([]() {
+                                delete ui::X11EventSource::GetInstance();
+                              }));
 #endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) &&
         // defined(REMOTING_USE_X11)
 
diff --git a/remoting/host/legacy_interaction_strategy.cc b/remoting/host/legacy_interaction_strategy.cc
index 0ac7dcb0..08b57d44 100644
--- a/remoting/host/legacy_interaction_strategy.cc
+++ b/remoting/host/legacy_interaction_strategy.cc
@@ -43,10 +43,6 @@
 #include "remoting/host/chromeos/mouse_cursor_monitor_aura.h"
 #endif
 
-#if BUILDFLAG(IS_LINUX)
-#include "remoting/host/linux/wayland_utils.h"
-#endif
-
 namespace remoting {
 
 LegacyInteractionStrategy::~LegacyInteractionStrategy() {
@@ -88,16 +84,6 @@
   scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner;
 #if BUILDFLAG(IS_CHROMEOS)
   capture_task_runner = ui_task_runner_;
-#elif BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    // Each capturer instance should get its own thread so the capturers don't
-    // compete with each other in multistream mode.
-    capture_task_runner = base::ThreadPool::CreateSingleThreadTaskRunner(
-        {base::TaskPriority::HIGHEST},
-        base::SingleThreadTaskRunnerThreadMode::DEDICATED);
-  } else {
-    capture_task_runner = video_capture_task_runner_;
-  }
 #else
   // The mouse cursor monitor runs on the |video_capture_task_runner_| so the
   // desktop capturer also needs to run on that task_runner for certain
@@ -107,14 +93,12 @@
 #endif  // !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_LINUX)
 
 #if defined(REMOTING_USE_X11)
-  if (!IsRunningWayland()) {
-    // Workaround for http://crbug.com/1361502: Run each capturer (and
-    // mouse-cursor-monitor) on a separate X11 Display.
-    auto new_options = webrtc::DesktopCaptureOptions::CreateDefault();
-    options_.desktop_capture_options()->set_x_display(
-        std::move(new_options.x_display()));
-    options_.desktop_capture_options()->x_display()->IgnoreXServerGrabs();
-  }
+  // Workaround for http://crbug.com/1361502: Run each capturer (and
+  // mouse-cursor-monitor) on a separate X11 Display.
+  auto new_options = webrtc::DesktopCaptureOptions::CreateDefault();
+  options_.desktop_capture_options()->set_x_display(
+      std::move(new_options.x_display()));
+  options_.desktop_capture_options()->x_display()->IgnoreXServerGrabs();
 #endif  // REMOTING_USE_X11
 
   std::unique_ptr<DesktopCapturer> desktop_capturer;
diff --git a/remoting/host/linux/BUILD.gn b/remoting/host/linux/BUILD.gn
index d910bb03..b671780 100644
--- a/remoting/host/linux/BUILD.gn
+++ b/remoting/host/linux/BUILD.gn
@@ -142,57 +142,24 @@
     "audio_capturer_linux.h",
     "audio_pipe_reader.cc",
     "audio_pipe_reader.h",
-    "clipboard_portal.cc",
-    "clipboard_portal.h",
-    "clipboard_portal_injector.cc",
-    "clipboard_portal_injector.h",
-    "clipboard_wayland.cc",
-    "clipboard_wayland.h",
     "curtain_mode_linux.cc",
     "desktop_display_info_loader_linux.cc",
-    "desktop_display_info_loader_wayland.cc",
-    "desktop_display_info_loader_wayland.h",
     "desktop_display_info_loader_x11.cc",
     "desktop_display_info_loader_x11.h",
     "desktop_resizer_linux.cc",
-    "desktop_resizer_wayland.cc",
-    "desktop_resizer_wayland.h",
     "desktop_resizer_x11.cc",
     "desktop_resizer_x11.h",
     "ei_event_watcher_glib.cc",
     "ei_event_watcher_glib.h",
     "input_injector_constants_linux.h",
     "input_injector_linux.cc",
-    "input_injector_wayland.cc",
-    "input_injector_wayland.h",
     "input_injector_x11.cc",
     "input_injector_x11.h",
     "keyboard_layout_monitor_linux.cc",
     "keyboard_layout_monitor_utils.cc",
     "keyboard_layout_monitor_utils.h",
-    "keyboard_layout_monitor_wayland.cc",
-    "keyboard_layout_monitor_wayland.h",
-    "remote_desktop_portal.cc",
-    "remote_desktop_portal.h",
-    "remote_desktop_portal_injector.cc",
-    "remote_desktop_portal_injector.h",
-    "wayland_connection.cc",
-    "wayland_connection.h",
-    "wayland_desktop_capturer.cc",
-    "wayland_desktop_capturer.h",
-    "wayland_display.cc",
-    "wayland_display.h",
-    "wayland_display_info.cc",
-    "wayland_display_info.h",
-    "wayland_keyboard.cc",
-    "wayland_keyboard.h",
-    "wayland_manager.cc",
-    "wayland_manager.h",
-    "wayland_seat.cc",
-    "wayland_seat.h",
   ]
   deps = [
-    ":wayland",
     ":x11",
     ":x11_display_utils",
     "//base",
@@ -208,13 +175,10 @@
     "//remoting/host/input_monitor",
     "//remoting/proto",
     "//remoting/protocol",
-    "//third_party/wayland:wayland_client",
-    "//third_party/wayland-protocols:xdg_output_protocol",
     "//third_party/webrtc_overrides:webrtc_component",
     "//ui/base",
     "//ui/base/x",
     "//ui/events:dom_keycode_converter",
-    "//ui/events/platform/wayland:wayland_event_watcher",
     "//ui/gfx/x",
   ]
 }
@@ -244,14 +208,6 @@
   ]
 }
 
-source_set("wayland") {
-  sources = [
-    "wayland_utils.cc",
-    "wayland_utils.h",
-  ]
-  deps = [ "//base" ]
-}
-
 if (remoting_use_x11) {
   source_set("x11") {
     sources = [
diff --git a/remoting/host/linux/active_display_monitor_linux.cc b/remoting/host/linux/active_display_monitor_linux.cc
index 58d9c78f..d0daaa9b 100644
--- a/remoting/host/linux/active_display_monitor_linux.cc
+++ b/remoting/host/linux/active_display_monitor_linux.cc
@@ -4,20 +4,14 @@
 
 #include "remoting/host/active_display_monitor.h"
 
-#include "base/notreached.h"
 #include "base/task/single_thread_task_runner.h"
 #include "remoting/host/linux/active_display_monitor_x11.h"
-#include "remoting/host/linux/wayland_utils.h"
 
 namespace remoting {
 
 std::unique_ptr<ActiveDisplayMonitor> ActiveDisplayMonitor::Create(
     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
     Callback active_display_callback) {
-  if (IsRunningWayland()) {
-    NOTIMPLEMENTED();
-    return nullptr;
-  }
   return std::make_unique<ActiveDisplayMonitorX11>(
       ui_task_runner, std::move(active_display_callback));
 }
diff --git a/remoting/host/linux/clipboard_portal.cc b/remoting/host/linux/clipboard_portal.cc
deleted file mode 100644
index 98f89ef..0000000
--- a/remoting/host/linux/clipboard_portal.cc
+++ /dev/null
@@ -1,147 +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.
-
-#include "remoting/host/linux/clipboard_portal.h"
-
-#include <gio/gio.h>
-#include <gio/gunixfdlist.h>
-#include <glib-object.h>
-
-#include "base/check.h"
-#include "remoting/base/logging.h"
-#include "third_party/webrtc/modules/portal/portal_request_response.h"
-#include "third_party/webrtc/modules/portal/scoped_glib.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-
-namespace remoting::xdg_portal {
-namespace {
-
-constexpr char kClipboardInterfaceName[] = "org.freedesktop.portal.Clipboard";
-
-using webrtc::Scoped;
-using webrtc::xdg_portal::RequestResponse;
-using webrtc::xdg_portal::RequestSessionProxy;
-using webrtc::xdg_portal::SessionDetails;
-
-}  // namespace
-
-ClipboardPortal::ClipboardPortal(PortalNotifier* notifier)
-    : notifier_(notifier) {
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-ClipboardPortal::~ClipboardPortal() {
-  if (cancellable_) {
-    g_cancellable_cancel(cancellable_);
-    g_object_unref(cancellable_);
-  }
-
-  // connection_ is owned by proxy_ and does not need to be freed.
-  if (proxy_) {
-    g_object_unref(proxy_);
-  }
-}
-
-void ClipboardPortal::SetSessionDetails(const SessionDetails& session_details) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  HOST_LOG << "Desktop portal session details received on the clipboard portal";
-
-  if (session_details.proxy) {
-    proxy_ = session_details.proxy;
-    connection_ = g_dbus_proxy_get_connection(proxy_);
-  }
-  if (session_details.cancellable) {
-    cancellable_ = session_details.cancellable;
-  }
-  if (!session_details.session_handle.empty()) {
-    session_handle_ = session_details.session_handle;
-  }
-}
-
-void ClipboardPortal::Start() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  cancellable_ = g_cancellable_new();
-  RequestSessionProxy(kClipboardInterfaceName, OnClipboardPortalProxyRequested,
-                      cancellable_, this);
-}
-
-// static
-void ClipboardPortal::OnClipboardPortalProxyRequested(GObject* /* object */,
-                                                      GAsyncResult* result,
-                                                      gpointer user_data) {
-  ClipboardPortal* that = static_cast<ClipboardPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  GDBusProxy* proxy = g_dbus_proxy_new_finish(result, error.receive());
-  if (!proxy) {
-    if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
-      return;
-    }
-    LOG(ERROR) << "Failed to create a proxy for the clipboard portal: "
-               << error->message;
-    that->OnPortalDone(RequestResponse::kError);
-    return;
-  }
-  that->SetSessionDetails({.proxy = proxy});
-
-  HOST_LOG << "Successfully created proxy for clipboard portal.";
-}
-
-void ClipboardPortal::OnPortalDone(RequestResponse result) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  HOST_LOG << "Clipboard portal is done setting up.";
-
-  notifier_->OnClipboardPortalDone(result);
-}
-
-void ClipboardPortal::RequestClipboard() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  HOST_LOG << "Request clipboard for the remote desktop session.";
-
-  GVariantBuilder options_builder;
-  g_variant_builder_init(&options_builder, G_VARIANT_TYPE_VARDICT);
-
-  g_dbus_proxy_call(
-      proxy_, "RequestClipboard",
-      g_variant_new("(oa{sv})", session_handle_.c_str(), &options_builder),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_, OnClipboardRequest,
-      this);
-}
-
-// static
-void ClipboardPortal::OnClipboardRequest(GObject* object,
-                                         GAsyncResult* result,
-                                         gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  auto* that = static_cast<ClipboardPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GVariant> variant(
-      g_dbus_proxy_call_finish(proxy, result, error.receive()));
-  if (!variant) {
-    LOG(ERROR) << "Failed to request clipboard: " << error->message;
-    that->OnPortalDone(RequestResponse::kError);
-    return;
-  }
-
-  that->OnPortalDone(RequestResponse::kSuccess);
-}
-
-SessionDetails ClipboardPortal::GetSessionDetails() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  HOST_LOG << "Getting session details from the wayland clipboard";
-
-  return {.proxy = proxy_.get(),
-          .cancellable = cancellable_.get(),
-          .session_handle = session_handle_};
-}
-
-}  // namespace remoting::xdg_portal
diff --git a/remoting/host/linux/clipboard_portal.h b/remoting/host/linux/clipboard_portal.h
deleted file mode 100644
index 5f33bf01..0000000
--- a/remoting/host/linux/clipboard_portal.h
+++ /dev/null
@@ -1,80 +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 REMOTING_HOST_LINUX_CLIPBOARD_PORTAL_H_
-#define REMOTING_HOST_LINUX_CLIPBOARD_PORTAL_H_
-
-#include <gio/gio.h>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "third_party/webrtc/modules/portal/portal_request_response.h"
-#include "third_party/webrtc/modules/portal/xdg_session_details.h"
-
-namespace remoting::xdg_portal {
-
-// Helper class to setup an XDG clipboard portal. It uses the same session
-// handle as the remote desktop and screencast portals (hence they should have
-// the same lifetime.) The methods on this class are called from the capturer
-// thread.
-class ClipboardPortal {
- public:
-  // |notifier| must outlive |ClipboardPortal| instance and will be called
-  // into from the capturer thread.
-  class PortalNotifier {
-   public:
-    // Called when the clipboard portal has been instantiated.
-    virtual void OnClipboardPortalDone(
-        webrtc::xdg_portal::RequestResponse result) = 0;
-
-   protected:
-    PortalNotifier() = default;
-    virtual ~PortalNotifier() = default;
-  };
-
-  explicit ClipboardPortal(PortalNotifier* notifier);
-
-  ClipboardPortal(const ClipboardPortal&) = delete;
-  ClipboardPortal& operator=(const ClipboardPortal&) = delete;
-  ~ClipboardPortal();
-
-  // Starts the portal setup.
-  void Start();
-
-  // Sets details about the remote desktop session being used.
-  void SetSessionDetails(
-      const webrtc::xdg_portal::SessionDetails& session_details);
-  webrtc::xdg_portal::SessionDetails GetSessionDetails();
-
-  // Sends a request for clipboard access to portal.  Must be called after the
-  // session details have been set and the proxy requested.
-  void RequestClipboard();
-
- private:
-  void OnPortalDone(webrtc::xdg_portal::RequestResponse result);
-
-  static void OnClipboardRequest(GObject* object,
-                                 GAsyncResult* result,
-                                 gpointer user_data);
-  static void OnClipboardPortalProxyRequested(GObject* object,
-                                              GAsyncResult* result,
-                                              gpointer user_data);
-
-  raw_ptr<GDBusConnection> connection_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<GDBusProxy> proxy_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-  raw_ptr<GCancellable> cancellable_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-
-  std::string session_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-  raw_ptr<PortalNotifier> notifier_ GUARDED_BY_CONTEXT(sequence_checker_);
-  base::RepeatingCallback<webrtc::xdg_portal::SessionDetails()>
-      clipboard_session_details_callback_ GUARDED_BY_CONTEXT(sequence_checker_);
-
-  SEQUENCE_CHECKER(sequence_checker_);
-};
-
-}  // namespace remoting::xdg_portal
-
-#endif  // REMOTING_HOST_LINUX_CLIPBOARD_PORTAL_H_
diff --git a/remoting/host/linux/clipboard_portal_injector.cc b/remoting/host/linux/clipboard_portal_injector.cc
deleted file mode 100644
index 29b4e3f..0000000
--- a/remoting/host/linux/clipboard_portal_injector.cc
+++ /dev/null
@@ -1,420 +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.
-
-#include "remoting/host/linux/clipboard_portal_injector.h"
-
-#include <gio/gio.h>
-#include <gio/gunixfdlist.h>
-
-#include <stdio.h>
-#include <unistd.h>
-
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/strings/string_util.h"
-#include "remoting/base/constants.h"
-#include "remoting/base/logging.h"
-#include "third_party/webrtc/modules/portal/scoped_glib.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-
-namespace remoting::xdg_portal {
-namespace {
-
-constexpr char kClipboardInterfaceName[] = "org.freedesktop.portal.Clipboard";
-constexpr char kPortalMimeTypeTextUtf8[] = "text/plain;charset=utf-8";
-
-using webrtc::Scoped;
-using webrtc::xdg_portal::kDesktopBusName;
-using webrtc::xdg_portal::kDesktopObjectPath;
-using webrtc::xdg_portal::SessionDetails;
-
-void UnsubscribeSignalHandler(GDBusConnection* connection, guint& signal_id) {
-  if (signal_id) {
-    g_dbus_connection_signal_unsubscribe(connection, signal_id);
-    signal_id = 0;
-  }
-}
-
-// portal expects 'text/plain;charset=utf-8' while we use 'text/plain;
-// charset=UTF-8'
-static std::string TranslateMimeTypeForPortal(std::string mime_type) {
-  if (mime_type == kMimeTypeTextUtf8) {
-    return kPortalMimeTypeTextUtf8;
-  }
-
-  return mime_type;
-}
-
-}  // namespace
-
-ClipboardPortalInjector::ClipboardPortalInjector(
-    ClipboardChangedCallback clipboard_changed_back)
-    : clipboard_changed_callback_(clipboard_changed_back) {
-  readable_mime_type_set_.insert(kPortalMimeTypeTextUtf8);
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-ClipboardPortalInjector::~ClipboardPortalInjector() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  UnsubscribeSignalHandlers();
-}
-
-void ClipboardPortalInjector::UnsubscribeSignalHandlers() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  UnsubscribeSignalHandler(connection_, selection_owner_changed_signal_id_);
-  UnsubscribeSignalHandler(connection_, selection_transfer_signal_id_);
-}
-
-void ClipboardPortalInjector::SetSessionDetails(
-    const webrtc::xdg_portal::SessionDetails& session_details) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  HOST_LOG << "Desktop portal session details received";
-  if (session_details.proxy) {
-    proxy_ = session_details.proxy;
-    connection_ = g_dbus_proxy_get_connection(proxy_);
-  }
-  if (session_details.cancellable) {
-    cancellable_ = session_details.cancellable;
-  }
-  if (!session_details.session_handle.empty()) {
-    session_handle_ = session_details.session_handle;
-  }
-
-  SubscribeClipboardSignals();
-}
-
-void ClipboardPortalInjector::SetSelection(std::string mime_type,
-                                           std::string data) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-
-  // Currently only UTF-8 is supported (which is consistent with x11.)
-  if (mime_type != kMimeTypeTextUtf8) {
-    LOG(ERROR)
-        << "ClipboardEvent: data should be UTF-8, but an unexpected mime "
-           "type was received: "
-        << mime_type;
-    return;
-  }
-
-  if (!base::IsStringUTF8AllowingNoncharacters(data)) {
-    LOG(ERROR) << "ClipboardEvent: data is not UTF-8 encoded";
-    return;
-  }
-
-  mime_type = TranslateMimeTypeForPortal(mime_type);
-  write_data_ = data;
-
-  if (!writable_mime_type_set_.contains(mime_type)) {
-    writable_mime_type_set_.insert(mime_type);
-  }
-
-  GVariantBuilder options_builder;
-  GVariantBuilder mime_types_string_builder;
-
-  g_variant_builder_init(&options_builder, G_VARIANT_TYPE_VARDICT);
-  g_variant_builder_init(&mime_types_string_builder,
-                         G_VARIANT_TYPE_STRING_ARRAY);
-
-  for (auto it : writable_mime_type_set_) {
-    g_variant_builder_add(&mime_types_string_builder, "s", it.c_str());
-  }
-
-  g_variant_builder_add(&options_builder, "{sv}", "mime_types",
-                        g_variant_builder_end(&mime_types_string_builder));
-
-  g_dbus_proxy_call(
-      proxy_, "SetSelection",
-      g_variant_new("(oa{sv})", session_handle_.c_str(), &options_builder),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-      OnSetSelectionCallback, this);
-}
-
-// static
-void ClipboardPortalInjector::OnSetSelectionCallback(GObject* object,
-                                                     GAsyncResult* result,
-                                                     gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  auto* that = static_cast<ClipboardPortalInjector*>(user_data);
-  DCHECK(that);
-
-  Scoped<GError> error;
-  Scoped<GVariant> variant(
-      g_dbus_proxy_call_finish(proxy, result, error.receive()));
-  if (!variant) {
-    LOG(ERROR) << "Failed to set selection: " << error->message;
-    return;
-  }
-}
-
-void ClipboardPortalInjector::SelectionWrite(const uint serial) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  DCHECK(serial);
-  DCHECK(!write_data_.empty());
-
-  write_serial_ = serial;
-
-  Scoped<GError> error;
-  g_dbus_proxy_call_with_unix_fd_list(
-      proxy_, "SelectionWrite",
-      g_variant_new("(ou)", session_handle_.c_str(), write_serial_),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, nullptr, cancellable_,
-      OnSelectionWriteCallback, this);
-}
-
-// static
-void ClipboardPortalInjector::OnSelectionWriteCallback(GObject* object,
-                                                       GAsyncResult* result,
-                                                       gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  auto* that = static_cast<ClipboardPortalInjector*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GUnixFDList> outlist;
-  gboolean success;
-
-  Scoped<GVariant> variant(g_dbus_proxy_call_with_unix_fd_list_finish(
-      proxy, outlist.receive(), result, error.receive()));
-  if (!variant) {
-    LOG(ERROR) << "Failed to write selection: " << error->message;
-    return;
-  }
-
-  int32_t fd_id;
-  Scoped<GError> fd_error;
-  success = false;
-
-  fd_id = g_variant_get_handle(variant.get());
-
-  base::ScopedFD fd(
-      g_unix_fd_list_get(outlist.get(), fd_id, fd_error.receive()));
-
-  if (!fd.is_valid()) {
-    LOG(ERROR) << "Failed to get file descriptor from the list: "
-               << fd_error->message;
-  } else {
-    success = base::WriteFileDescriptor(fd.get(), that->write_data_);
-    if (!success) {
-      LOG(ERROR) << "Failed to write clipboard data to file descriptor";
-    }
-  }
-
-  that->SelectionWriteDone(that->write_serial_, success);
-  that->write_serial_ = 0;
-}
-
-void ClipboardPortalInjector::SelectionWriteDone(const uint serial,
-                                                 const gboolean success) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-
-  g_dbus_proxy_call(
-      proxy_, "SelectionWriteDone",
-      g_variant_new("(oub)", session_handle_.c_str(), serial, success),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-      OnSelectionWriteDoneCallback, this);
-}
-
-// static
-void ClipboardPortalInjector::OnSelectionWriteDoneCallback(GObject* object,
-                                                           GAsyncResult* result,
-                                                           gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  auto* that = static_cast<ClipboardPortalInjector*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GVariant> variant(
-      g_dbus_proxy_call_finish(proxy, result, error.receive()));
-  if (!variant) {
-    LOG(ERROR) << "Failed selection write done: " << error->message;
-    return;
-  }
-}
-
-void ClipboardPortalInjector::SelectionRead(std::string mime_type) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-
-  // we can only process one `SelectionRead` at a time, so eat any extra
-  // requests we receive. if any requests get eaten, then we perform another
-  // read to capture the latest contents.
-  if (pending_selection_read_) {
-    queued_selection_read_ = true;
-    return;
-  }
-  pending_selection_read_ = true;
-
-  g_dbus_proxy_call_with_unix_fd_list(
-      proxy_, "SelectionRead",
-      g_variant_new("(os)", session_handle_.c_str(), mime_type.c_str()),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, nullptr, cancellable_,
-      OnSelectionReadCallback, this);
-}
-
-// static
-void ClipboardPortalInjector::OnSelectionReadCallback(GObject* object,
-                                                      GAsyncResult* result,
-                                                      gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  auto* that = static_cast<ClipboardPortalInjector*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GUnixFDList> outlist;
-
-  that->pending_selection_read_ = false;
-
-  Scoped<GVariant> variant(g_dbus_proxy_call_with_unix_fd_list_finish(
-      proxy, outlist.receive(), result, error.receive()));
-
-  if (that->queued_selection_read_) {
-    that->queued_selection_read_ = false;
-    that->SelectionRead(TranslateMimeTypeForPortal(kMimeTypeTextUtf8));
-    return;
-  }
-
-  if (!variant) {
-    LOG(ERROR) << "Failed to read selection: " << error->message;
-    return;
-  }
-
-  int32_t index;
-  g_variant_get(variant.get(), "(h)", &index);
-
-  base::ScopedFD fd(g_unix_fd_list_get(outlist.get(), index, error.receive()));
-
-  if (!fd.is_valid()) {
-    LOG(ERROR) << "Failed to get file descriptor from the list: "
-               << error->message;
-    return;
-  }
-
-  std::string read_data;
-  base::ScopedFILE stream(fdopen(fd.release(), "rb"));
-  if (!stream.get()) {
-    return;
-  }
-
-  if (base::ReadStreamToString(stream.get(), &read_data)) {
-    that->clipboard_changed_callback_.Run(kMimeTypeTextUtf8, read_data);
-  }
-}
-
-void ClipboardPortalInjector::SubscribeClipboardSignals() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // The 'SelectionOwnerChanged' signal is sent anytime the selection changes.
-  // We listen for notifications on it to know when we should copy the
-  // selection.
-  selection_owner_changed_signal_id_ = g_dbus_connection_signal_subscribe(
-      connection_, kDesktopBusName, kClipboardInterfaceName,
-      "SelectionOwnerChanged", kDesktopObjectPath, nullptr,
-      G_DBUS_SIGNAL_FLAGS_NONE,
-      static_cast<GDBusSignalCallback>(OnSelectionOwnerChangedSignal), this,
-      nullptr);
-
-  // The 'SelectionTransfer' signal is sent to request for our selection data.
-  // We use it whenever we want to update the current selection.
-  selection_transfer_signal_id_ = g_dbus_connection_signal_subscribe(
-      connection_, kDesktopBusName, kClipboardInterfaceName,
-      "SelectionTransfer", kDesktopObjectPath, nullptr,
-      G_DBUS_SIGNAL_FLAGS_NONE,
-      static_cast<GDBusSignalCallback>(OnSelectionTransferSignal), this,
-      nullptr);
-}
-
-// static
-void ClipboardPortalInjector::OnSelectionTransferSignal(
-    GDBusConnection* connection,
-    const char* sender_name,
-    const char* object_path,
-    const char* interface_name,
-    const char* signal_name,
-    GVariant* parameters,
-    gpointer user_data) {
-  ClipboardPortalInjector* that =
-      static_cast<ClipboardPortalInjector*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  HOST_LOG << "Received transfer selection signal from session";
-
-  guint serial;
-  g_variant_get(parameters, "(osu)", /*session_handle*/ nullptr,
-                /*mime_type*/ nullptr, &serial);
-
-  if (!that->write_serial_) {
-    that->SelectionWrite(serial);
-  } else {
-    // we only process one write request at a time, so tell the backend to
-    // release any extra serials it allocates.
-    LOG(ERROR)
-        << "Received clipboard write serial while busy processing another.";
-    that->SelectionWriteDone(serial, false);
-  }
-}
-
-// static
-void ClipboardPortalInjector::OnSelectionOwnerChangedSignal(
-    GDBusConnection* connection,
-    const char* sender_name,
-    const char* object_path,
-    const char* interface_name,
-    const char* signal_name,
-    GVariant* parameters,
-    gpointer user_data) {
-  ClipboardPortalInjector* that =
-      static_cast<ClipboardPortalInjector*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  HOST_LOG << "Received selection owner changed signal from session";
-
-  uint32_t session_handle;
-  Scoped<GVariant> options;
-
-  g_variant_get(parameters, "(o@a{sv})", &session_handle, options.receive());
-
-  Scoped<GVariant> session_is_owner(g_variant_lookup_value(
-      options.get(), "session_is_owner", G_VARIANT_TYPE_BOOLEAN));
-  if (session_is_owner && g_variant_get_boolean(session_is_owner.get())) {
-    return;
-  }
-
-  Scoped<GVariant> mime_types(g_variant_lookup_value(
-      options.get(), "mime_types", G_VARIANT_TYPE("(as)")));
-  if (!mime_types) {
-    return;
-  }
-
-  GVariantIter iterator;
-  gchar* mime_type;
-
-  g_variant_iter_init(&iterator,
-                      g_variant_get_child_value(mime_types.get(), 0));
-
-  while (g_variant_iter_loop(&iterator, "s", &mime_type)) {
-    if (that->readable_mime_type_set_.contains(mime_type)) {
-      that->SelectionRead(mime_type);
-      g_free(mime_type);
-      break;
-    }
-  }
-}
-
-}  // namespace remoting::xdg_portal
diff --git a/remoting/host/linux/clipboard_portal_injector.h b/remoting/host/linux/clipboard_portal_injector.h
deleted file mode 100644
index 6f26ab1..0000000
--- a/remoting/host/linux/clipboard_portal_injector.h
+++ /dev/null
@@ -1,106 +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 REMOTING_HOST_LINUX_CLIPBOARD_PORTAL_INJECTOR_H_
-#define REMOTING_HOST_LINUX_CLIPBOARD_PORTAL_INJECTOR_H_
-
-#include <gio/gio.h>
-
-#include <map>
-#include <unordered_set>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/sequence_checker.h"
-#include "third_party/webrtc/modules/portal/xdg_session_details.h"
-
-namespace remoting::xdg_portal {
-
-// This class is used by the `ChromotingInputThread` to inject input into the
-// wayland remote host using XDG desktop portal APIs.
-class ClipboardPortalInjector {
- public:
-  using ClipboardChangedCallbackSignature = void(const std::string& mime_type,
-                                                 const std::string& data);
-  using ClipboardChangedCallback =
-      base::RepeatingCallback<ClipboardChangedCallbackSignature>;
-
-  explicit ClipboardPortalInjector(
-      ClipboardChangedCallback clipboard_changed_callback);
-  ClipboardPortalInjector(const ClipboardPortalInjector&) = delete;
-  ClipboardPortalInjector& operator=(const ClipboardPortalInjector&) = delete;
-  ~ClipboardPortalInjector();
-
-  // This method populates the session details for this object. Session details
-  // are borrowed from the clipboard portal running under the wayland capturer
-  void SetSessionDetails(
-      const webrtc::xdg_portal::SessionDetails& session_details);
-
-  // SetSelection starts the process of pasting content. It prompts the portal
-  // backend to send a 'SelectionTransfer' signal, to which we will reply with a
-  // 'SelectionWrite' and 'SelectionWriteDone'
-  void SetSelection(std::string mime_type, std::string data);
-
- private:
-  void SelectionRead(std::string mime_type);
-  void SelectionWrite(const uint serial);
-  void SelectionWriteDone(const uint serial, const gboolean success);
-  void SubscribeClipboardSignals();
-  void UnsubscribeSignalHandlers();
-
-  static void OnSelectionReadCallback(GObject* object,
-                                      GAsyncResult* result,
-                                      gpointer user_data);
-  static void OnSelectionWriteCallback(GObject* object,
-                                       GAsyncResult* result,
-                                       gpointer user_data);
-  static void OnSetSelectionCallback(GObject* object,
-                                     GAsyncResult* result,
-                                     gpointer user_data);
-  static void OnSelectionWriteDoneCallback(GObject* object,
-                                           GAsyncResult* result,
-                                           gpointer user_data);
-  static void OnSelectionTransferSignal(GDBusConnection* connection,
-                                        const char* sender_name,
-                                        const char* object_path,
-                                        const char* interface_name,
-                                        const char* signal_name,
-                                        GVariant* parameters,
-                                        gpointer user_data);
-  static void OnSelectionOwnerChangedSignal(GDBusConnection* connection,
-                                            const char* sender_name,
-                                            const char* object_path,
-                                            const char* interface_name,
-                                            const char* signal_name,
-                                            GVariant* parameters,
-                                            gpointer user_data);
-
-  SEQUENCE_CHECKER(sequence_checker_);
-  raw_ptr<GDBusConnection> connection_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<GDBusProxy> proxy_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-  raw_ptr<GCancellable> cancellable_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  std::string session_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-
-  ClipboardChangedCallback clipboard_changed_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-
-  std::unordered_set<std::string> writable_mime_type_set_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  std::string write_data_ GUARDED_BY_CONTEXT(sequence_checker_);
-  guint write_serial_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
-  std::unordered_set<std::string> readable_mime_type_set_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-
-  bool pending_selection_read_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
-  bool queued_selection_read_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
-
-  guint selection_owner_changed_signal_id_ = 0;
-  guint selection_transfer_signal_id_ = 0;
-};
-
-}  // namespace remoting::xdg_portal
-
-#endif  // REMOTING_HOST_LINUX_CLIPBOARD_PORTAL_INJECTOR_H_
diff --git a/remoting/host/linux/clipboard_wayland.cc b/remoting/host/linux/clipboard_wayland.cc
deleted file mode 100644
index 8f9ed030..0000000
--- a/remoting/host/linux/clipboard_wayland.cc
+++ /dev/null
@@ -1,50 +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.
-
-#include "remoting/host/linux/clipboard_wayland.h"
-
-#include <memory>
-
-#include "remoting/host/linux/clipboard_portal_injector.h"
-#include "remoting/proto/event.pb.h"
-#include "remoting/protocol/clipboard_stub.h"
-
-namespace remoting {
-
-ClipboardWayland::ClipboardWayland()
-    : clipboard_portal_(xdg_portal::ClipboardPortalInjector(
-          base::BindRepeating(&ClipboardWayland::OnClipboardChanged,
-                              base::Unretained(this)))) {}
-
-ClipboardWayland::~ClipboardWayland() {}
-
-void ClipboardWayland::Start(
-    std::unique_ptr<protocol::ClipboardStub> client_clipboard) {
-  client_clipboard_.swap(client_clipboard);
-}
-
-void ClipboardWayland::InjectClipboardEvent(
-    const protocol::ClipboardEvent& event) {
-  clipboard_portal_.SetSelection(event.mime_type(), event.data());
-}
-
-void ClipboardWayland::SetSessionDetails(
-    const webrtc::xdg_portal::SessionDetails& session_details) {
-  clipboard_portal_.SetSessionDetails(session_details);
-}
-
-void ClipboardWayland::OnClipboardChanged(const std::string& mime_type,
-                                          const std::string& data) {
-  if (!client_clipboard_) {
-    return;
-  }
-
-  protocol::ClipboardEvent event;
-  event.set_mime_type(mime_type);
-  event.set_data(data);
-
-  client_clipboard_->InjectClipboardEvent(event);
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/clipboard_wayland.h b/remoting/host/linux/clipboard_wayland.h
deleted file mode 100644
index 2845bed..0000000
--- a/remoting/host/linux/clipboard_wayland.h
+++ /dev/null
@@ -1,45 +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 REMOTING_HOST_LINUX_CLIPBOARD_WAYLAND_H_
-#define REMOTING_HOST_LINUX_CLIPBOARD_WAYLAND_H_
-
-#include "remoting/host/clipboard.h"
-
-#include <memory>
-
-#include "remoting/host/linux/clipboard_portal_injector.h"
-#include "remoting/proto/event.pb.h"
-#include "remoting/protocol/clipboard_stub.h"
-
-namespace remoting {
-
-class ClipboardWayland : public Clipboard {
- public:
-  explicit ClipboardWayland();
-
-  ClipboardWayland(const ClipboardWayland&) = delete;
-  ClipboardWayland& operator=(const ClipboardWayland&) = delete;
-
-  ~ClipboardWayland() override;
-
-  // Clipboard interface.
-  void Start(
-      std::unique_ptr<protocol::ClipboardStub> client_clipboard) override;
-  void InjectClipboardEvent(const protocol::ClipboardEvent& event) override;
-
-  void SetSessionDetails(
-      const webrtc::xdg_portal::SessionDetails& session_details);
-
- private:
-  void OnClipboardChanged(const std::string& mime_type,
-                          const std::string& data);
-
-  std::unique_ptr<protocol::ClipboardStub> client_clipboard_;
-  xdg_portal::ClipboardPortalInjector clipboard_portal_;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_CLIPBOARD_WAYLAND_H_
diff --git a/remoting/host/linux/curtain_mode_linux.cc b/remoting/host/linux/curtain_mode_linux.cc
index 8d4c6ef..089e3e8 100644
--- a/remoting/host/linux/curtain_mode_linux.cc
+++ b/remoting/host/linux/curtain_mode_linux.cc
@@ -9,7 +9,6 @@
 #include "base/task/single_thread_task_runner.h"
 #include "remoting/base/logging.h"
 #include "remoting/host/client_session_control.h"
-#include "remoting/host/linux/wayland_utils.h"
 #include "remoting/host/linux/x11_util.h"
 
 namespace remoting {
@@ -28,13 +27,6 @@
 CurtainModeLinux::CurtainModeLinux() = default;
 
 bool CurtainModeLinux::Activate() {
-  if (IsRunningWayland()) {
-    // Our wayland implementation runs headlessly on a session with a previously
-    // unused / new display socket, so we can assume that the session is
-    // curtained.
-    return true;
-  }
-
   // We can't curtain the session in run-time in Linux.
   // Either the session is running in a virtual session (i.e. always curtained),
   // or it is attached to the physical console (i.e. impossible to curtain).
diff --git a/remoting/host/linux/desktop_display_info_loader_linux.cc b/remoting/host/linux/desktop_display_info_loader_linux.cc
index 874d96f..f278f3b 100644
--- a/remoting/host/linux/desktop_display_info_loader_linux.cc
+++ b/remoting/host/linux/desktop_display_info_loader_linux.cc
@@ -6,18 +6,12 @@
 
 #include <memory>
 
-#include "base/notreached.h"
-#include "remoting/host/linux/desktop_display_info_loader_wayland.h"
 #include "remoting/host/linux/desktop_display_info_loader_x11.h"
-#include "remoting/host/linux/wayland_utils.h"
 
 namespace remoting {
 
 // static
 std::unique_ptr<DesktopDisplayInfoLoader> DesktopDisplayInfoLoader::Create() {
-  if (IsRunningWayland()) {
-    return std::make_unique<DesktopDisplayInfoLoaderWayland>();
-  }
   return std::make_unique<DesktopDisplayInfoLoaderX11>();
 }
 
diff --git a/remoting/host/linux/desktop_display_info_loader_wayland.cc b/remoting/host/linux/desktop_display_info_loader_wayland.cc
deleted file mode 100644
index 02c5247f..0000000
--- a/remoting/host/linux/desktop_display_info_loader_wayland.cc
+++ /dev/null
@@ -1,26 +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.
-
-#include "remoting/host/linux/desktop_display_info_loader_wayland.h"
-
-#include "base/sequence_checker.h"
-#include "remoting/host/linux/wayland_manager.h"
-
-namespace remoting {
-
-DesktopDisplayInfoLoaderWayland::DesktopDisplayInfoLoaderWayland() {
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-void DesktopDisplayInfoLoaderWayland::Init() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-DesktopDisplayInfo DesktopDisplayInfoLoaderWayland::GetCurrentDisplayInfo() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  return WaylandManager::Get()->GetCurrentDisplayInfo();
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/desktop_display_info_loader_wayland.h b/remoting/host/linux/desktop_display_info_loader_wayland.h
deleted file mode 100644
index 2b007ff3..0000000
--- a/remoting/host/linux/desktop_display_info_loader_wayland.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef REMOTING_HOST_LINUX_DESKTOP_DISPLAY_INFO_LOADER_WAYLAND_H_
-#define REMOTING_HOST_LINUX_DESKTOP_DISPLAY_INFO_LOADER_WAYLAND_H_
-
-#include "base/sequence_checker.h"
-#include "remoting/host/desktop_display_info_loader.h"
-
-namespace remoting {
-
-class DesktopDisplayInfoLoaderWayland : public DesktopDisplayInfoLoader {
- public:
-  DesktopDisplayInfoLoaderWayland();
-
-  // DesktopDisplayInfoLoader implementation.
-  void Init() override;
-  DesktopDisplayInfo GetCurrentDisplayInfo() override;
-
- private:
-  SEQUENCE_CHECKER(sequence_checker_);
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_DESKTOP_DISPLAY_INFO_LOADER_WAYLAND_H_
diff --git a/remoting/host/linux/desktop_resizer_linux.cc b/remoting/host/linux/desktop_resizer_linux.cc
index af4e00d1..1f03ec66 100644
--- a/remoting/host/linux/desktop_resizer_linux.cc
+++ b/remoting/host/linux/desktop_resizer_linux.cc
@@ -9,9 +9,7 @@
 #include "base/notreached.h"
 
 #if defined(REMOTING_USE_X11)
-#include "remoting/host/linux/desktop_resizer_wayland.h"
 #include "remoting/host/linux/desktop_resizer_x11.h"
-#include "remoting/host/linux/wayland_utils.h"
 #endif
 
 namespace remoting {
@@ -19,9 +17,6 @@
 // static
 std::unique_ptr<DesktopResizer> DesktopResizer::Create() {
 #if defined(REMOTING_USE_X11)
-  if (IsRunningWayland()) {
-    return std::make_unique<DesktopResizerWayland>();
-  }
   return std::make_unique<DesktopResizerX11>();
 #else
 #error "Invalid config detected."
diff --git a/remoting/host/linux/desktop_resizer_wayland.cc b/remoting/host/linux/desktop_resizer_wayland.cc
deleted file mode 100644
index 57e75ca..0000000
--- a/remoting/host/linux/desktop_resizer_wayland.cc
+++ /dev/null
@@ -1,44 +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.
-
-#include "remoting/host/linux/desktop_resizer_wayland.h"
-
-#include "base/notreached.h"
-#include "remoting/base/logging.h"
-#include "remoting/host/linux/wayland_manager.h"
-
-namespace remoting {
-
-DesktopResizerWayland::~DesktopResizerWayland() = default;
-
-ScreenResolution DesktopResizerWayland::GetCurrentResolution(
-    webrtc::ScreenId screen_id) {
-  // TODO(crbug.com/40266740): Need to find a way to get the resolution from
-  // the capturer via wayland manager to avoid spurious resizing operations.
-  // Note: This will become more trickier for the multi-mon case.
-  return ScreenResolution();
-}
-
-std::list<ScreenResolution> DesktopResizerWayland::GetSupportedResolutions(
-    const ScreenResolution& preferred,
-    webrtc::ScreenId screen_id) {
-  return {preferred};
-}
-
-void DesktopResizerWayland::RestoreResolution(const ScreenResolution& original,
-                                              webrtc::ScreenId screen_id) {
-  NOTIMPLEMENTED();
-}
-
-void DesktopResizerWayland::SetResolution(const ScreenResolution& resolution,
-                                          webrtc::ScreenId screen_id) {
-  WaylandManager::Get()->OnUpdateScreenResolution(resolution, screen_id);
-}
-
-void DesktopResizerWayland::SetVideoLayout(
-    const protocol::VideoLayout& layout) {
-  NOTIMPLEMENTED();
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/desktop_resizer_wayland.h b/remoting/host/linux/desktop_resizer_wayland.h
deleted file mode 100644
index bee0dae..0000000
--- a/remoting/host/linux/desktop_resizer_wayland.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef REMOTING_HOST_LINUX_DESKTOP_RESIZER_WAYLAND_H_
-#define REMOTING_HOST_LINUX_DESKTOP_RESIZER_WAYLAND_H_
-
-#include <memory>
-
-#include "remoting/host/base/screen_resolution.h"
-#include "remoting/host/desktop_resizer.h"
-
-namespace remoting {
-
-class DesktopResizerWayland : public DesktopResizer {
- public:
-  DesktopResizerWayland() = default;
-  DesktopResizerWayland(const DesktopResizerWayland&) = delete;
-  DesktopResizerWayland& operator=(const DesktopResizerWayland&) = delete;
-  ~DesktopResizerWayland() override;
-
-  // DesktopResizer interface
-  ScreenResolution GetCurrentResolution(webrtc::ScreenId screen_id) override;
-  std::list<ScreenResolution> GetSupportedResolutions(
-      const ScreenResolution& preferred,
-      webrtc::ScreenId screen_id) override;
-  void RestoreResolution(const ScreenResolution& original,
-                         webrtc::ScreenId screen_id) override;
-  void SetVideoLayout(const protocol::VideoLayout& layout) override;
-  void SetResolution(const ScreenResolution& resolution,
-                     webrtc::ScreenId screen_id) override;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_DESKTOP_RESIZER_WAYLAND_H_
diff --git a/remoting/host/linux/input_injector_linux.cc b/remoting/host/linux/input_injector_linux.cc
index 922ddfd..9af7688 100644
--- a/remoting/host/linux/input_injector_linux.cc
+++ b/remoting/host/linux/input_injector_linux.cc
@@ -4,9 +4,7 @@
 
 #include "remoting/host/input_injector.h"
 
-#include "remoting/host/linux/input_injector_wayland.h"
 #include "remoting/host/linux/input_injector_x11.h"
-#include "remoting/host/linux/wayland_utils.h"
 
 namespace remoting {
 
@@ -14,9 +12,6 @@
 std::unique_ptr<InputInjector> InputInjector::Create(
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
-  if (IsRunningWayland()) {
-    return std::make_unique<InputInjectorWayland>(main_task_runner);
-  }
   auto injector = std::make_unique<InputInjectorX11>(main_task_runner);
   injector->Init();
   return std::move(injector);
diff --git a/remoting/host/linux/input_injector_wayland.cc b/remoting/host/linux/input_injector_wayland.cc
deleted file mode 100644
index 6b58312b..0000000
--- a/remoting/host/linux/input_injector_wayland.cc
+++ /dev/null
@@ -1,629 +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.
-
-#include "remoting/host/linux/input_injector_wayland.h"
-
-#include <gtk/gtk.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <optional>
-#include <set>
-#include <utility>
-
-#include "base/containers/contains.h"
-#include "base/containers/queue.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "base/functional/callback_forward.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "remoting/base/constants.h"
-#include "remoting/base/logging.h"
-#include "remoting/host/clipboard.h"
-#include "remoting/host/input_injector_metadata.h"
-#include "remoting/host/linux/clipboard_wayland.h"
-#include "remoting/host/linux/input_injector_constants_linux.h"
-#include "remoting/host/linux/remote_desktop_portal_injector.h"
-#include "remoting/host/linux/unicode_to_keysym.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/proto/internal.pb.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "third_party/webrtc/modules/portal/scoped_glib.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-#include "ui/events/keycodes/dom/dom_code.h"
-#include "ui/events/keycodes/dom/keycode_converter.h"
-
-#if BUILDFLAG(IS_CHROMEOS)
-#include "remoting/host/chromeos/point_transformer.h"
-#endif
-
-namespace remoting {
-namespace {
-
-using protocol::ClipboardEvent;
-using protocol::KeyEvent;
-using protocol::MouseEvent;
-using protocol::TextEvent;
-using protocol::TouchEvent;
-using webrtc::xdg_portal::SessionDetails;
-using xdg_portal::RemoteDesktopPortalInjector;
-
-constexpr int BUTTON_LEFT_KEYCODE = 272;
-constexpr int BUTTON_RIGHT_KEYCODE = 273;
-constexpr int BUTTON_MIDDLE_KEYCODE = 274;
-constexpr int BUTTON_FORWARD_KEYCODE = 277;
-constexpr int BUTTON_BACK_KEYCODE = 278;
-constexpr int BUTTON_UNKNOWN_KEYCODE = -1;
-constexpr int MIN_KEYCODE = 8;
-constexpr int SHIFT_KEY_CODE = 42;
-
-ScrollDirection WheelDeltaToScrollDirection(float num) {
-  return (num > 0)   ? ScrollDirection::UP
-         : (num < 0) ? ScrollDirection::DOWN
-                     : ScrollDirection::NONE;
-}
-
-bool IsDomModifierKey(ui::DomCode dom_code) {
-  return dom_code == ui::DomCode::CONTROL_LEFT ||
-         dom_code == ui::DomCode::SHIFT_LEFT ||
-         dom_code == ui::DomCode::ALT_LEFT ||
-         dom_code == ui::DomCode::META_LEFT ||
-         dom_code == ui::DomCode::CONTROL_RIGHT ||
-         dom_code == ui::DomCode::SHIFT_RIGHT ||
-         dom_code == ui::DomCode::ALT_RIGHT ||
-         dom_code == ui::DomCode::META_RIGHT;
-}
-
-int MouseButtonToEvdevCode(MouseEvent::MouseButton button) {
-  switch (button) {
-    case MouseEvent::BUTTON_LEFT:
-      return BUTTON_LEFT_KEYCODE;
-    case MouseEvent::BUTTON_RIGHT:
-      return BUTTON_RIGHT_KEYCODE;
-    case MouseEvent::BUTTON_MIDDLE:
-      return BUTTON_MIDDLE_KEYCODE;
-    case MouseEvent::BUTTON_BACK:
-      return BUTTON_BACK_KEYCODE;
-    case MouseEvent::BUTTON_FORWARD:
-      return BUTTON_FORWARD_KEYCODE;
-    case MouseEvent::BUTTON_UNDEFINED:
-    default:
-      return BUTTON_UNKNOWN_KEYCODE;
-  }
-}
-
-// Pixel-to-wheel-ticks conversion ratio used by GTK.
-// From third_party/WebKit/Source/web/gtk/WebInputEventFactory.cpp .
-constexpr float kWheelTicksPerPixel = 3.0f / 160.0f;
-
-// When the user is scrolling, generate at least one tick per time period.
-constexpr base::TimeDelta kContinuousScrollTimeout = base::Milliseconds(500);
-
-}  // namespace
-
-InputInjectorWayland::InputInjectorWayland(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  core_ = new Core(task_runner);
-
-  // Register callback with the wayland manager so that it can get details
-  // about the desktop capture metadata (which include session details of the
-  // portal).
-  auto converting_cb =
-      base::BindRepeating([](const webrtc::DesktopCaptureMetadata metadata) {
-        return metadata.session_details;
-      });
-  WaylandManager::Get()->AddCapturerMetadataCallback(converting_cb.Then(
-      base::BindRepeating(&Core::SetRemoteDesktopSessionDetails, core_)));
-  WaylandManager::Get()->AddClipboardMetadataCallback(converting_cb.Then(
-      base::BindRepeating(&Core::SetClipboardSessionDetails, core_)));
-  WaylandManager::Get()->AddCapturerDestroyedCallback(
-      base::BindRepeating(&Core::Shutdown, core_));
-}
-
-InputInjectorWayland::~InputInjectorWayland() = default;
-
-void InputInjectorWayland::InjectClipboardEvent(const ClipboardEvent& event) {
-  core_->InjectClipboardEvent(event);
-}
-
-void InputInjectorWayland::InjectKeyEvent(const KeyEvent& event) {
-  core_->InjectKeyEvent(event);
-}
-
-void InputInjectorWayland::InjectTextEvent(const TextEvent& event) {
-  core_->InjectTextEvent(event);
-}
-
-void InputInjectorWayland::InjectMouseEvent(const MouseEvent& event) {
-  core_->InjectMouseEvent(event);
-}
-
-void InputInjectorWayland::InjectTouchEvent(const TouchEvent& event) {
-  NOTIMPLEMENTED()
-      << "Raw touch event injection is not implemented for wayland.";
-}
-
-void InputInjectorWayland::Start(
-    std::unique_ptr<protocol::ClipboardStub> client_clipboard) {
-  core_->Start(std::move(client_clipboard));
-}
-
-void InputInjectorWayland::SetMetadata(InputInjectorMetadata metadata) {
-  core_->SetRemoteDesktopSessionDetails(std::move(metadata.session_details));
-}
-
-InputInjectorWayland::Core::Core(
-    scoped_refptr<base::SingleThreadTaskRunner> input_task_runner)
-    : input_task_runner_(input_task_runner) {
-  clipboard_ = std::make_unique<ClipboardWayland>();
-}
-
-void InputInjectorWayland::Core::SetCapabilityCallbacks() {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::SetCapabilityCallbacks, this));
-    return;
-  }
-
-  auto on_seat_acquired_keyboard_capability =
-      base::BindOnce(&Core::SeatAcquiredKeyboardCapability, this);
-  auto on_seat_acquired_pointer_capability =
-      base::BindOnce(&Core::SeatAcquiredPointerCapability, this);
-  auto on_seat_present =
-      base::BindOnce(&WaylandManager::SetCapabilityCallbacks,
-                     base::Unretained(WaylandManager::Get()),
-                     std::move(on_seat_acquired_keyboard_capability),
-                     std::move(on_seat_acquired_pointer_capability));
-  WaylandManager::Get()->SetSeatPresentCallback(std::move(on_seat_present));
-}
-
-void InputInjectorWayland::Core::InjectFakeKeyEvent() {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-  if (seat_has_keyboard_capability_) {
-    return;
-  }
-
-  // Press shift key once.
-  InjectKeyPress(SHIFT_KEY_CODE, /*pressed=*/true);
-  InjectKeyPress(SHIFT_KEY_CODE, /*pressed=*/false);
-}
-
-void InputInjectorWayland::Core::InjectFakePointerEvent() {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-  if (seat_has_pointer_capability_) {
-    return;
-  }
-
-  MovePointerTo(0, -1);
-  MovePointerTo(0, 1);
-}
-
-void InputInjectorWayland::Core::SeatAcquiredKeyboardCapability() {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::SeatAcquiredKeyboardCapability, this));
-    return;
-  }
-
-  seat_has_keyboard_capability_ = true;
-  if (seat_has_pointer_capability_) {
-    current_state_ = State::CAPABILITIES_RECEIVED;
-  }
-  MaybeFlushPendingEvents();
-}
-
-void InputInjectorWayland::Core::SeatAcquiredPointerCapability() {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::SeatAcquiredPointerCapability, this));
-    return;
-  }
-
-  seat_has_pointer_capability_ = true;
-  if (seat_has_keyboard_capability_) {
-    current_state_ = State::CAPABILITIES_RECEIVED;
-  }
-  MaybeFlushPendingEvents();
-}
-
-void InputInjectorWayland::Core::InjectClipboardEvent(
-    const ClipboardEvent& event) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::InjectClipboardEvent, this, event));
-    return;
-  }
-  if (!clipboard_initialized_) {
-    pending_clipboard_event_ = std::make_optional(event);
-    return;
-  }
-  clipboard_->InjectClipboardEvent(event);
-}
-
-void InputInjectorWayland::Core::QueueKeyEvent(
-    const protocol::KeyEvent& event) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  return pending_remote_desktop_tasks_.push(
-      base::BindOnce(&Core::InjectKeyEventHelper, this, event));
-}
-
-void InputInjectorWayland::Core::QueueMouseEvent(
-    const protocol::MouseEvent& event) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  return pending_remote_desktop_tasks_.push(
-      base::BindOnce(&Core::InjectMouseEventHelper, this, event));
-}
-
-void InputInjectorWayland::Core::ProcessKeyEvent(
-    const protocol::KeyEvent& event) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  switch (current_state_) {
-    case State::UNINITIALIZED:
-    case State::SESSION_INITIALIZED:
-      QueueKeyEvent(event);
-      break;
-    case State::CAPABILITIES_RECEIVED:
-      InjectKeyEventHelper(event);
-      break;
-    case State::STOPPED:
-      break;
-    default:
-      NOTREACHED();
-  }
-}
-void InputInjectorWayland::Core::ProcessMouseEvent(
-    const protocol::MouseEvent& event) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  switch (current_state_) {
-    case State::UNINITIALIZED:
-    case State::SESSION_INITIALIZED:
-      QueueMouseEvent(event);
-      break;
-    case State::CAPABILITIES_RECEIVED:
-      InjectMouseEventHelper(event);
-      break;
-    case State::STOPPED:
-      break;
-    default:
-      NOTREACHED();
-  }
-}
-
-void InputInjectorWayland::Core::InjectKeyEvent(const KeyEvent& event) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::InjectKeyEvent, this, event));
-    return;
-  }
-
-  ProcessKeyEvent(event);
-}
-
-void InputInjectorWayland::Core::InjectKeyEventHelper(const KeyEvent& event) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  // HostEventDispatcher should filter events missing the pressed field.
-  if (!event.has_pressed() || !event.has_usb_keycode()) {
-    return;
-  }
-
-  int keycode =
-      ui::KeycodeConverter::UsbKeycodeToNativeKeycode(event.usb_keycode()) -
-      MIN_KEYCODE;
-
-  // Ignore events which can't be mapped.
-  if (keycode == ui::KeycodeConverter::InvalidNativeKeycode()) {
-    LOG(ERROR) << __func__ << " : Invalid key code";
-    return;
-  }
-
-  if (event.pressed()) {
-    if (base::Contains(pressed_keys_, keycode)) {
-      // Ignore repeats for modifier keys.
-      if (IsDomModifierKey(static_cast<ui::DomCode>(event.usb_keycode()))) {
-        return;
-      }
-      // Key is already held down, so lift the key up to ensure this repeated
-      // press takes effect.
-      InjectKeyPress(keycode, /*pressed=*/false);
-    }
-    pressed_keys_.insert(keycode);
-  } else {
-    pressed_keys_.erase(keycode);
-  }
-
-  InjectKeyPress(keycode, event.pressed());
-}
-
-void InputInjectorWayland::Core::InjectTextEvent(const TextEvent& event) {
-  NOTIMPLEMENTED() << "Text event injection is not implemented for wayland.";
-}
-
-InputInjectorWayland::Core::~Core() {
-  CHECK(pressed_keys_.empty());
-
-  // may be called from the network thread when the session is closed
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->DeleteSoon(FROM_HERE, clipboard_.release());
-  }
-}
-
-void InputInjectorWayland::Core::InjectMouseEvent(const MouseEvent& event) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::InjectMouseEvent, this, event));
-    return;
-  }
-  ProcessMouseEvent(event);
-}
-
-void InputInjectorWayland::Core::InjectMouseEventHelper(
-    const MouseEvent& event) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  if (event.has_delta_x() && event.has_delta_y() &&
-      (event.delta_x() != 0 || event.delta_y() != 0)) {
-    MovePointerBy(event.delta_x(), event.delta_y());
-  } else if (event.has_x() && event.has_y()) {
-    // Injecting a motion event immediately before a button release results in
-    // a MotionNotify even if the mouse position hasn't changed, which confuses
-    // apps which assume MotionNotify implies movement. See crbug.com/138075.
-    bool inject_motion = true;
-    webrtc::DesktopVector new_mouse_position(event.x(), event.y());
-#if BUILDFLAG(IS_CHROMEOS)
-    // Interim hack to handle display rotation on Chrome OS.
-    // TODO(crbug.com/40396937): Remove this when Chrome OS has completely
-    // migrated to Ozone.
-    gfx::PointF screen_location = point_transformer_.ToScreenCoordinates(
-        gfx::PointF(event.x(), event.y()));
-    new_mouse_position.set(screen_location.x(), screen_location.y());
-#endif
-    if (event.has_button() && event.has_button_down() && !event.button_down()) {
-      if (latest_mouse_position_ &&
-          new_mouse_position.equals(*latest_mouse_position_)) {
-        inject_motion = false;
-      }
-    }
-
-    if (inject_motion) {
-      webrtc::DesktopVector target_mouse_position{
-          std::max(0, new_mouse_position.x()),
-          std::max(0, new_mouse_position.y())};
-
-      MovePointerTo(target_mouse_position.x(), target_mouse_position.y());
-      latest_mouse_position_ = {target_mouse_position.x(),
-                                target_mouse_position.y()};
-    }
-  }
-
-  if (event.has_button() && event.has_button_down()) {
-    int button_number = MouseButtonToEvdevCode(event.button());
-
-    if (button_number < 0) {
-      LOG(WARNING) << "Ignoring unknown button type: " << event.button();
-      return;
-    }
-    VLOG(3) << "Pressing mouse button: " << event.button()
-            << ", number: " << button_number;
-    InjectMouseButton(button_number, event.button_down());
-  }
-
-  // remotedesktop.google.com currently sends scroll events in pixels, which
-  // are accumulated host-side.
-  int ticks_y = 0;
-  if (event.has_wheel_ticks_y()) {
-    ticks_y = static_cast<int>(event.wheel_ticks_y());
-  } else if (event.has_wheel_delta_y()) {
-    wheel_ticks_y_ += event.wheel_delta_y() * kWheelTicksPerPixel;
-    ticks_y = static_cast<int>(wheel_ticks_y_);
-    wheel_ticks_y_ -= ticks_y;
-  }
-  auto now = base::TimeTicks::Now();
-  if (ticks_y == 0 && event.has_wheel_delta_y()) {
-    // For the y-direction only (the common case), try to ensure that a tick is
-    // injected when the user would expect one, regardless of how many pixels
-    // the client sends per tick (even if it accelerates wheel events). To do
-    // this, generate a tick if one has not occurred recently in the current
-    // scroll direction. The accumulated pixels are not reset in this case.
-    //
-    // The effect when a physical mouse is used is as follows:
-    //
-    // Client sends slightly too few pixels per tick (e.g. Linux):
-    // * First scroll in either direction synthesizes a tick.
-    // * Subsequent scrolls in the same direction are unaffected (their
-    //   accumulated pixel deltas mostly meet the threshold for a regular
-    //   tick; occasionally a tick will be dropped if the user is scrolling
-    //   quickly).
-    //
-    // Client sends far too few pixels per tick, but applies acceleration
-    // (e.g. macOs, ChromeOS):
-    // * First scroll in either direction synthesizes a tick.
-    // * Slow scrolling will synthesize a tick a few times per second.
-    // * Fast scrolling is unaffected (acceleration means that enough pixels
-    //   are accumulated naturally).
-    //
-    // Client sends too many pixels per tick (e.g. Windows):
-    // * Scrolling is unaffected (most scroll events generate one tick; every
-    //   so often one generates two ticks).
-    //
-    // The effect when a trackpad is used is that the first tick in either
-    // direction occurs sooner; subsequent ticks are mostly unaffected.
-    const ScrollDirection current_tick_y_direction =
-        WheelDeltaToScrollDirection(event.wheel_delta_y());
-    if ((now - latest_tick_y_event_ > kContinuousScrollTimeout) ||
-        latest_tick_y_direction_ != current_tick_y_direction) {
-      ticks_y = static_cast<int>(current_tick_y_direction);
-    }
-  }
-  if (ticks_y != 0) {
-    latest_tick_y_direction_ = WheelDeltaToScrollDirection(ticks_y);
-    latest_tick_y_event_ = now;
-    InjectMouseScroll(RemoteDesktopPortalInjector::ScrollType::VERTICAL_SCROLL,
-                      -ticks_y);
-  }
-
-  int ticks_x = 0;
-  if (event.has_wheel_ticks_x()) {
-    ticks_x = event.wheel_ticks_x();
-  } else if (event.has_wheel_delta_x()) {
-    wheel_ticks_x_ += event.wheel_delta_x() * kWheelTicksPerPixel;
-    ticks_x = static_cast<int>(wheel_ticks_x_);
-    wheel_ticks_x_ -= ticks_x;
-  }
-  if (ticks_x != 0) {
-    InjectMouseScroll(
-        RemoteDesktopPortalInjector::ScrollType::HORIZONTAL_SCROLL, -ticks_x);
-  }
-}
-
-void InputInjectorWayland::Core::InjectPendingEvents(bool libei_succeeded) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&Core::InjectPendingEvents, this, libei_succeeded));
-    return;
-  }
-
-  if (current_state_ == State::STOPPED) {
-    return;
-  }
-
-  if (!libei_succeeded) {
-    LOG(WARNING) << "Setting up libei failed, going to rely on slower "
-                 << "input injection path";
-
-    // These are needed so that we can acquire keyboard/pointer capability.
-    InjectFakeKeyEvent();
-    InjectFakePointerEvent();
-  } else {
-    // With libei we don't have to inject fake events and wait for
-    // capabilities, so we mark the capabilities ready here.
-    seat_has_keyboard_capability_ = true;
-    seat_has_pointer_capability_ = true;
-    current_state_ = State::CAPABILITIES_RECEIVED;
-  }
-
-  MaybeFlushPendingEvents();
-}
-
-void InputInjectorWayland::Core::SetRemoteDesktopSessionDetails(
-    const SessionDetails& session_details) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::SetRemoteDesktopSessionDetails, this,
-                                  session_details));
-    return;
-  }
-  remotedesktop_portal_.SetSessionDetails(session_details);
-  SetCapabilityCallbacks();
-
-  current_state_ = State::SESSION_INITIALIZED;
-
-  remotedesktop_portal_.SetupLibei(
-      base::BindOnce(&Core::InjectPendingEvents, this));
-}
-
-void InputInjectorWayland::Core::MaybeFlushPendingEvents() {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  if (current_state_ != State::CAPABILITIES_RECEIVED ||
-      current_state_ == State::STOPPED) {
-    return;
-  }
-
-  while (!pending_remote_desktop_tasks_.empty()) {
-    base::OnceClosure task = std::move(pending_remote_desktop_tasks_.front());
-    pending_remote_desktop_tasks_.pop();
-    std::move(task).Run();
-  }
-}
-
-void InputInjectorWayland::Core::SetClipboardSessionDetails(
-    const SessionDetails& session_details) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&Core::SetClipboardSessionDetails, this,
-                                  session_details));
-    return;
-  }
-
-  clipboard_->SetSessionDetails(session_details);
-  clipboard_initialized_ = true;
-
-  // rerun the last pending clipboard task
-  if (pending_clipboard_event_.has_value()) {
-    clipboard_->InjectClipboardEvent(pending_clipboard_event_.value());
-  }
-}
-
-void InputInjectorWayland::Core::InjectMouseButton(unsigned int code,
-                                                   bool pressed) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  remotedesktop_portal_.InjectMouseButton(code, pressed);
-}
-
-void InputInjectorWayland::Core::InjectMouseScroll(unsigned int axis,
-                                                   int steps) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  remotedesktop_portal_.InjectMouseScroll(axis, steps);
-}
-
-void InputInjectorWayland::Core::MovePointerTo(int x, int y) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  remotedesktop_portal_.MovePointerTo(x, y);
-}
-
-void InputInjectorWayland::Core::MovePointerBy(int delta_x, int delta_y) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  remotedesktop_portal_.MovePointerBy(delta_x, delta_y);
-}
-
-void InputInjectorWayland::Core::InjectKeyPress(unsigned int code,
-                                                bool pressed,
-                                                bool is_code) {
-  DCHECK(input_task_runner_->BelongsToCurrentThread());
-
-  remotedesktop_portal_.InjectKeyPress(code, pressed, is_code);
-}
-
-void InputInjectorWayland::Core::Start(
-    std::unique_ptr<protocol::ClipboardStub> client_clipboard) {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&Core::Start, this, std::move(client_clipboard)));
-    return;
-  }
-  clipboard_->Start(std::move(client_clipboard));
-}
-
-void InputInjectorWayland::Core::Shutdown() {
-  if (!input_task_runner_->BelongsToCurrentThread()) {
-    input_task_runner_->PostTask(FROM_HERE,
-                                 base::BindOnce(&Core::Shutdown, this));
-    return;
-  }
-
-  seat_has_keyboard_capability_ = false;
-  seat_has_pointer_capability_ = false;
-  clipboard_initialized_ = false;
-  current_state_ = State::STOPPED;
-  remotedesktop_portal_.Shutdown();
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/input_injector_wayland.h b/remoting/host/linux/input_injector_wayland.h
deleted file mode 100644
index bc45aff..0000000
--- a/remoting/host/linux/input_injector_wayland.h
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef REMOTING_HOST_LINUX_INPUT_INJECTOR_WAYLAND_H_
-#define REMOTING_HOST_LINUX_INPUT_INJECTOR_WAYLAND_H_
-
-#include <gtk/gtk.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <optional>
-#include <set>
-#include <utility>
-
-#include "base/containers/queue.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "base/functional/callback_forward.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "remoting/base/constants.h"
-#include "remoting/host/clipboard.h"
-#include "remoting/host/input_injector.h"
-#include "remoting/host/input_injector_metadata.h"
-#include "remoting/host/linux/clipboard_wayland.h"
-#include "remoting/host/linux/input_injector_constants_linux.h"
-#include "remoting/host/linux/remote_desktop_portal_injector.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/proto/internal.pb.h"
-
-#if BUILDFLAG(IS_CHROMEOS)
-#include "remoting/host/chromeos/point_transformer.h"
-#endif
-
-namespace remoting {
-
-// A class to generate events on wayland.
-class InputInjectorWayland : public InputInjector {
- public:
-  explicit InputInjectorWayland(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-  InputInjectorWayland(const InputInjectorWayland&) = delete;
-  InputInjectorWayland& operator=(const InputInjectorWayland&) = delete;
-  ~InputInjectorWayland() override;
-
-  // Clipboard stub interface.
-  void InjectClipboardEvent(const protocol::ClipboardEvent& event) override;
-
-  // InputStub interface.
-  void InjectKeyEvent(const protocol::KeyEvent& event) override;
-  void InjectTextEvent(const protocol::TextEvent& event) override;
-  void InjectMouseEvent(const protocol::MouseEvent& event) override;
-  void InjectTouchEvent(const protocol::TouchEvent& event) override;
-  void SetMetadata(InputInjectorMetadata metadata) override;
-
-  // InputInjector interface.
-  void Start(
-      std::unique_ptr<protocol::ClipboardStub> client_clipboard) override;
-
- private:
-  // The actual implementation resides in InputInjectorWayland::Core class.
-  class Core : public base::RefCountedThreadSafe<Core> {
-   public:
-    explicit Core(scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-    Core(const Core&) = delete;
-    Core& operator=(const Core&) = delete;
-    // Mirrors the ClipboardStub interface.
-    void InjectClipboardEvent(const protocol::ClipboardEvent& event);
-    // Mirrors the InputStub interface.
-    void InjectKeyEvent(const protocol::KeyEvent& event);
-    void InjectTextEvent(const protocol::TextEvent& event);
-    void InjectMouseEvent(const protocol::MouseEvent& event);
-    void SetRemoteDesktopSessionDetails(
-        const webrtc::xdg_portal::SessionDetails& session_details);
-    void SetClipboardSessionDetails(
-        const webrtc::xdg_portal::SessionDetails& session_details);
-    // Mirrors the InputInjector interface.
-    void Start(std::unique_ptr<protocol::ClipboardStub> client_clipboard);
-    // Sets capabilities ready callbacks on the global WaylandManager class.
-    void SetCapabilityCallbacks();
-
-    void Shutdown();
-
-   private:
-    enum class State {
-      // Start up state.
-      UNINITIALIZED = 0,
-      // Session details initialized.
-      SESSION_INITIALIZED = 1,
-      // Capabilities received (Mandated only for slow path input injection).
-      CAPABILITIES_RECEIVED = 2,
-      // Shutdown triggered or completed.
-      STOPPED = 3,
-    };
-
-    friend class base::RefCountedThreadSafe<Core>;
-    virtual ~Core();
-    void QueueKeyEvent(const protocol::KeyEvent& event);
-    void QueueMouseEvent(const protocol::MouseEvent& event);
-    void ProcessKeyEvent(const protocol::KeyEvent& event);
-    void ProcessMouseEvent(const protocol::MouseEvent& event);
-    void SeatAcquiredKeyboardCapability();
-    void SeatAcquiredPointerCapability();
-    void InjectKeyEventHelper(const protocol::KeyEvent& event);
-    void InjectMouseEventHelper(const protocol::MouseEvent& event);
-    void InjectFakeKeyEvent();
-    void InjectFakePointerEvent();
-    void MaybeFlushPendingEvents();
-    void InjectMouseButton(unsigned int code, bool pressed);
-    void InjectMouseScroll(unsigned int axis, int steps);
-    void MovePointerTo(int x, int y);
-    void MovePointerBy(int delta_x, int delta_y);
-    void InjectKeyPress(unsigned int code, bool pressed, bool is_code = true);
-    void InjectPendingEvents(bool libei_scucceeded);
-
-    scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
-    std::set<int> pressed_keys_;
-    std::optional<webrtc::DesktopVector> latest_mouse_position_;
-    float wheel_ticks_x_ = 0;
-    float wheel_ticks_y_ = 0;
-    base::TimeTicks latest_tick_y_event_;
-
-    // The direction of the last scroll event that resulted in at least one
-    // "tick" being injected.
-    ScrollDirection latest_tick_y_direction_ = ScrollDirection::NONE;
-#if BUILDFLAG(IS_CHROMEOS)
-    PointTransformer point_transformer_;
-#endif
-    std::unique_ptr<ClipboardWayland> clipboard_;
-    xdg_portal::RemoteDesktopPortalInjector remotedesktop_portal_;
-
-    base::queue<base::OnceClosure> pending_remote_desktop_tasks_;
-
-    // Similar to remote_desktop_initialized_, we keep the last clipboard event
-    // but separated so that the remote desktop isn't blocked waiting for the
-    // clipboard.
-    bool clipboard_initialized_ = false;
-    std::optional<protocol::ClipboardEvent> pending_clipboard_event_;
-
-    // Keeps track of whether or not the associated seat has keyboard
-    // capability.
-    bool seat_has_keyboard_capability_ = false;
-
-    // Keeps track of whether or not the associated seat has pointer capability.
-    bool seat_has_pointer_capability_ = false;
-
-    State current_state_ = State::UNINITIALIZED;
-  };
-  scoped_refptr<Core> core_;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_INPUT_INJECTOR_WAYLAND_H_
diff --git a/remoting/host/linux/keyboard_layout_monitor_linux.cc b/remoting/host/linux/keyboard_layout_monitor_linux.cc
index 75d4d33f..e68966c9 100644
--- a/remoting/host/linux/keyboard_layout_monitor_linux.cc
+++ b/remoting/host/linux/keyboard_layout_monitor_linux.cc
@@ -18,8 +18,6 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "remoting/host/linux/keyboard_layout_monitor_utils.h"
-#include "remoting/host/linux/keyboard_layout_monitor_wayland.h"
-#include "remoting/host/linux/wayland_utils.h"
 #include "remoting/proto/control.pb.h"
 #include "ui/base/glib/scoped_gsignal.h"
 #include "ui/events/keycodes/dom/dom_code.h"
@@ -333,9 +331,6 @@
 std::unique_ptr<KeyboardLayoutMonitor> KeyboardLayoutMonitor::Create(
     base::RepeatingCallback<void(const protocol::KeyboardLayout&)> callback,
     scoped_refptr<base::SingleThreadTaskRunner> input_task_runner) {
-  if (IsRunningWayland()) {
-    return std::make_unique<KeyboardLayoutMonitorWayland>(std::move(callback));
-  }
   return std::make_unique<KeyboardLayoutMonitorLinux>(std::move(callback));
 }
 
diff --git a/remoting/host/linux/keyboard_layout_monitor_wayland.cc b/remoting/host/linux/keyboard_layout_monitor_wayland.cc
deleted file mode 100644
index 9c893ab..0000000
--- a/remoting/host/linux/keyboard_layout_monitor_wayland.cc
+++ /dev/null
@@ -1,187 +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.
-
-#include "remoting/host/linux/keyboard_layout_monitor_wayland.h"
-
-#include <xkbcommon/xkbcommon.h>
-
-#include <memory>
-
-#include "base/functional/callback.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/notreached.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/task/single_thread_task_runner.h"
-#include "remoting/host/linux/keyboard_layout_monitor_utils.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/proto/control.pb.h"
-#include "ui/events/keycodes/dom/dom_code.h"
-#include "ui/events/keycodes/dom/keycode_converter.h"
-
-namespace remoting {
-
-KeyboardLayoutMonitorWayland::KeyboardLayoutMonitorWayland(
-    base::RepeatingCallback<void(const protocol::KeyboardLayout&)> callback)
-    : layout_changed_callback_(std::move(callback)) {}
-
-KeyboardLayoutMonitorWayland::~KeyboardLayoutMonitorWayland() {
-  if (xkb_state_) {
-    xkb_state_unref(xkb_state_.get());
-  }
-}
-
-void KeyboardLayoutMonitorWayland::Start() {
-  WaylandManager::Get()->SetKeyboardLayoutCallback(
-      base::BindRepeating(&KeyboardLayoutMonitorWayland::ProcessKeymaps,
-                          weak_factory_.GetWeakPtr()));
-  WaylandManager::Get()->AddKeyboardModifiersCallback(base::BindRepeating(
-      &KeyboardLayoutMonitorWayland::ProcessModifiersAndNotifyCallbacks,
-      weak_factory_.GetWeakPtr()));
-}
-
-void KeyboardLayoutMonitorWayland::UpdateState() {
-  if (xkb_state_) {
-    xkb_state_unref(xkb_state_.get());
-  }
-  xkb_state_ = xkb_state_new(keymap_.get());
-}
-
-void KeyboardLayoutMonitorWayland::ProcessKeymaps(
-    std::unique_ptr<struct xkb_keymap, XkbKeyMapDeleter> keymap) {
-  keymap_ = std::move(keymap);
-  UpdateState();
-}
-
-protocol::KeyboardLayout
-KeyboardLayoutMonitorWayland::GenerateProtocolLayoutMessage() {
-  protocol::KeyboardLayout layout_message;
-
-  bool have_altgr = false;
-
-  for (ui::DomCode key : KeyboardLayoutMonitor::kSupportedKeys) {
-    // Skip single-layout IME keys for now, as they are always present in the
-    // keyboard map but not present on most keyboards. Client-side IME is likely
-    // more convenient, anyway.
-    // TODO(rkjnsn): Figure out how to show these keys only when relevant.
-    if (key == ui::DomCode::LANG1 || key == ui::DomCode::LANG2 ||
-        key == ui::DomCode::CONVERT || key == ui::DomCode::NON_CONVERT ||
-        key == ui::DomCode::KANA_MODE) {
-      continue;
-    }
-
-    std::uint32_t usb_code = ui::KeycodeConverter::DomCodeToUsbKeycode(key);
-    int keycode = ui::KeycodeConverter::DomCodeToNativeKeycode(key);
-    // Insert entry for USB code. It's fine to overwrite if we somehow process
-    // the same USB code twice, since the actions will be the same.
-    auto& key_actions =
-        *(*layout_message.mutable_keys())[usb_code].mutable_actions();
-    for (int shift_level = 0; shift_level < 8; ++shift_level) {
-      // Don't bother capturing higher shift levels if there's no configured way
-      // to access them.
-      if ((shift_level & 2 && !have_altgr) || (shift_level & 4)) {
-        continue;
-      }
-      // Always consider NumLock set and CapsLock unset.
-      constexpr uint32_t SHIFT_MODIFIER = 1;
-      constexpr uint32_t CAPSLOCK_MODIFIER = 1;
-      constexpr uint32_t NUMLOCK_MODIFIER = 16;
-      constexpr uint32_t ALTGR_MODIFIER = 128;
-      uint32_t mods_locked = NUMLOCK_MODIFIER;
-      uint32_t mods_latched = 0;
-      if (shift_level & 1) {
-        mods_locked |= SHIFT_MODIFIER;
-      }
-      if (shift_level & 2) {
-        mods_locked &= ~CAPSLOCK_MODIFIER;
-        mods_latched |= ALTGR_MODIFIER;
-      }
-      xkb_state_update_mask(xkb_state_.get(), 0, mods_latched, mods_locked, 0,
-                            0, current_group_);
-      uint32_t keyval = xkb_state_key_get_one_sym(xkb_state_.get(), keycode);
-
-      if (keyval == XKB_KEY_NoSymbol) {
-        LOG(WARNING) << "Either no symbol OR multiple symbols found for a key";
-        continue;
-      }
-
-      uint32_t unicode = xkb_keysym_to_utf32(keyval);
-      if (unicode != 0) {
-        switch (unicode) {
-          case 0x08:
-            key_actions[shift_level].set_function(
-                protocol::LayoutKeyFunction::BACKSPACE);
-            break;
-          case 0x09:
-            key_actions[shift_level].set_function(
-                protocol::LayoutKeyFunction::TAB);
-            break;
-          case 0x0D:
-            key_actions[shift_level].set_function(
-                protocol::LayoutKeyFunction::ENTER);
-            break;
-          case 0x1B:
-            key_actions[shift_level].set_function(
-                protocol::LayoutKeyFunction::ESCAPE);
-            break;
-          case 0x7F:
-            key_actions[shift_level].set_function(
-                protocol::LayoutKeyFunction::DELETE_);
-            break;
-          default:
-            std::string utf8;
-            base::WriteUnicodeCharacter(unicode, &utf8);
-            key_actions[shift_level].set_character(utf8);
-        }
-        continue;
-      }
-
-      const char* dead_key_utf8 = DeadKeyToUtf8String(keyval);
-      if (dead_key_utf8) {
-        key_actions[shift_level].set_character(dead_key_utf8);
-        continue;
-      }
-      if (keyval == XKB_KEY_Caps_Lock || keyval == XKB_KEY_Num_Lock) {
-        // Don't include Num Lock or Caps Lock until we decide if / how we want
-        // to handle them.
-        // TODO(rkjnsn): Determine if supporting Num Lock / Caps Lock provides
-        // enough utility to warrant support by the soft keyboard.
-        continue;
-      }
-
-      protocol::LayoutKeyFunction function = KeyvalToFunction(keyval);
-      if (function == protocol::LayoutKeyFunction::ALT_GR) {
-        have_altgr = true;
-      }
-      key_actions[shift_level].set_function(function);
-    }
-
-    if (key_actions.empty()) {
-      layout_message.mutable_keys()->erase(usb_code);
-    }
-  }
-
-  return layout_message;
-}
-
-void KeyboardLayoutMonitorWayland::ProcessModifiersAndNotifyCallbacks(
-    uint32_t group) {
-  if (current_group_ != XKB_LAYOUT_INVALID &&
-      group == static_cast<uint32_t>(current_group_)) {
-    return;
-  }
-
-  current_group_ = static_cast<xkb_layout_index_t>(group);
-
-  if (!xkb_state_) {
-    LOG(WARNING) << "Received modifier without keymap?";
-    return;
-  }
-
-  DCHECK(keymap_);
-
-  layout_changed_callback_.Run(GenerateProtocolLayoutMessage());
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/keyboard_layout_monitor_wayland.h b/remoting/host/linux/keyboard_layout_monitor_wayland.h
deleted file mode 100644
index b34c9796..0000000
--- a/remoting/host/linux/keyboard_layout_monitor_wayland.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef REMOTING_HOST_LINUX_KEYBOARD_LAYOUT_MONITOR_WAYLAND_H_
-#define REMOTING_HOST_LINUX_KEYBOARD_LAYOUT_MONITOR_WAYLAND_H_
-
-#include <xkbcommon/xkbcommon.h>
-
-#include "base/functional/callback.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/notreached.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/task/single_thread_task_runner.h"
-#include "remoting/host/keyboard_layout_monitor.h"
-#include "remoting/host/linux/keyboard_layout_monitor_utils.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/proto/control.pb.h"
-#include "ui/events/keycodes/dom/dom_code.h"
-#include "ui/events/keycodes/dom/keycode_converter.h"
-
-namespace remoting {
-
-class KeyboardLayoutMonitorWayland : public KeyboardLayoutMonitor {
- public:
-  explicit KeyboardLayoutMonitorWayland(
-      base::RepeatingCallback<void(const protocol::KeyboardLayout&)> callback);
-  ~KeyboardLayoutMonitorWayland() override;
-  void Start() override;
-
- private:
-  void ProcessKeymaps(XkbKeyMapUniquePtr keymap);
-
-  // Generates a protocol layout message based on the keymap and the currently
-  // active group.
-  protocol::KeyboardLayout GenerateProtocolLayoutMessage();
-
-  // Processes the modifiers of the active keyboard layout and notifies the
-  // stored callbacks.
-  void ProcessModifiersAndNotifyCallbacks(uint32_t group);
-
-  void UpdateState();
-
-  XkbKeyMapUniquePtr keymap_;
-  raw_ptr<struct xkb_state> xkb_state_ = nullptr;
-  xkb_layout_index_t current_group_ = XKB_LAYOUT_INVALID;
-  base::RepeatingCallback<void(const protocol::KeyboardLayout&)>
-      layout_changed_callback_;
-  base::WeakPtrFactory<KeyboardLayoutMonitorWayland> weak_factory_{this};
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_KEYBOARD_LAYOUT_MONITOR_WAYLAND_H_
diff --git a/remoting/host/linux/remote_desktop_portal.cc b/remoting/host/linux/remote_desktop_portal.cc
deleted file mode 100644
index 92cf428..0000000
--- a/remoting/host/linux/remote_desktop_portal.cc
+++ /dev/null
@@ -1,459 +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.
-
-#include "remoting/host/linux/remote_desktop_portal.h"
-
-#include <glib-object.h>
-
-#include <utility>
-
-#include "base/check.h"
-#include "base/rand_util.h"
-#include "base/sequence_checker.h"
-#include "base/strings/stringprintf.h"
-#include "base/time/time.h"
-#include "remoting/base/logging.h"
-#include "remoting/host/linux/clipboard_portal.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-
-namespace remoting::xdg_portal {
-namespace {
-
-constexpr char kRemoteDesktopInterfaceName[] =
-    "org.freedesktop.portal.RemoteDesktop";
-constexpr char kPortalPrefix[] = "remotedesktop";
-
-using webrtc::Scoped;
-using webrtc::xdg_portal::kDesktopObjectPath;
-using webrtc::xdg_portal::kSessionInterfaceName;
-using webrtc::xdg_portal::RequestResponse;
-
-void UnsubscribeSignalHandler(GDBusConnection* connection, guint& signal_id) {
-  if (signal_id) {
-    g_dbus_connection_signal_unsubscribe(connection, signal_id);
-    signal_id = 0;
-  }
-}
-
-}  // namespace
-
-RemoteDesktopPortal::RemoteDesktopPortal(
-    webrtc::ScreenCastPortal::PortalNotifier* notifier,
-    bool prefer_cursor_embedded)
-    : notifier_(notifier) {
-  screencast_portal_ = std::make_unique<webrtc::ScreenCastPortal>(
-      webrtc::CaptureType::kScreen, this, OnScreenCastPortalProxyRequested,
-      OnSourcesRequestResponseSignal, this, prefer_cursor_embedded);
-  clipboard_portal_ = std::make_unique<xdg_portal::ClipboardPortal>(this);
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-RemoteDesktopPortal::~RemoteDesktopPortal() {
-  Stop();
-}
-
-void RemoteDesktopPortal::Stop() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (context_) {
-    g_main_context_pop_thread_default(context_);
-    g_main_context_unref(context_);
-  }
-  if (screencast_portal_) {
-    screencast_portal_.reset();
-  }
-  if (clipboard_portal_) {
-    clipboard_portal_.reset();
-  }
-  UnsubscribeSignalHandlers();
-  webrtc::xdg_portal::TearDownSession(std::move(session_handle_), proxy_,
-                                      cancellable_, connection_);
-  session_handle_.clear();
-  proxy_ = nullptr;
-  cancellable_ = nullptr;
-  connection_ = nullptr;
-}
-
-void RemoteDesktopPortal::UnsubscribeSignalHandlers() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  UnsubscribeSignalHandler(connection_, start_request_signal_id_);
-  UnsubscribeSignalHandler(connection_, session_request_signal_id_);
-  UnsubscribeSignalHandler(connection_, devices_request_signal_id_);
-  UnsubscribeSignalHandler(connection_, session_closed_signal_id_);
-}
-
-void RemoteDesktopPortal::Start() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // We create and run our own thread-default context so that all the callbacks
-  // are called on this thread rather than going to the main thread.
-  context_ = g_main_context_new();
-  g_main_context_push_thread_default(context_);
-
-  HOST_LOG << "Starting screen cast portal";
-  cancellable_ = g_cancellable_new();
-  screencast_portal_->SetSessionDetails({.cancellable = cancellable_});
-  screencast_portal_->Start();
-  clipboard_portal_->SetSessionDetails({.cancellable = cancellable_});
-  clipboard_portal_->Start();
-
-  HOST_LOG << "Starting remote desktop portal";
-  webrtc::xdg_portal::RequestSessionProxy(kRemoteDesktopInterfaceName,
-                                          OnProxyRequested, cancellable_, this);
-
-  // OpenPipewireRemote (defined on the screencast portal) is the last
-  // asynchronous call in the combined portal setup so we wait for the
-  // screencast portal to go into either failed/succeeded state before stopping
-  // our loop.
-  while (context_ && screencast_portal_status_ == RequestResponse::kUnknown) {
-    g_main_context_iteration(context_, /*may_block=*/true);
-  }
-  if (context_) {
-    g_main_context_pop_thread_default(context_);
-    g_main_context_unref(context_);
-    context_ = nullptr;
-  }
-
-  HOST_LOG << "Session setup finished";
-}
-
-uint32_t RemoteDesktopPortal::pipewire_stream_node_id() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(screencast_portal_);
-  return screencast_portal_->pipewire_stream_node_id();
-}
-
-// static
-void RemoteDesktopPortal::OnProxyRequested(GObject* gobject,
-                                           GAsyncResult* result,
-                                           gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-  DCHECK(that);
-  Scoped<GError> error;
-  // We have to acquire the proxy object via "_finish" here since otherwise
-  // the result will be freed upon return from this callback (and before newly
-  // posted task on the task runner can start/finish).
-  GDBusProxy* proxy = g_dbus_proxy_new_finish(result, error.receive());
-  if (!proxy) {
-    if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
-      return;
-    }
-    LOG(ERROR) << "Failed to get a proxy for the portal: " << error->message;
-    that->OnPortalDone(RequestResponse::kError);
-    return;
-  }
-  that->RequestSession(proxy);
-}
-
-// static
-void RemoteDesktopPortal::OnScreenCastPortalProxyRequested(GObject* /*object*/,
-                                                           GAsyncResult* result,
-                                                           gpointer user_data) {
-  webrtc::ScreenCastPortal* that =
-      static_cast<webrtc::ScreenCastPortal*>(user_data);
-  DCHECK(that);
-
-  Scoped<GError> error;
-  GDBusProxy* proxy = g_dbus_proxy_new_finish(result, error.receive());
-  if (!proxy) {
-    if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
-      return;
-    }
-    LOG(ERROR) << "Failed to create a proxy for the screen cast portal: "
-               << error->message;
-    that->OnPortalDone(RequestResponse::kError);
-    return;
-  }
-  that->SetSessionDetails({.proxy = proxy});
-
-  HOST_LOG << "Successfully created proxy for the screen cast portal.";
-}
-
-void RemoteDesktopPortal::RequestSession(GDBusProxy* proxy) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!proxy_);
-  DCHECK(!connection_);
-  proxy_ = proxy;
-  connection_ = g_dbus_proxy_get_connection(proxy);
-  webrtc::xdg_portal::SetupSessionRequestHandlers(
-      kPortalPrefix, OnSessionRequested, OnSessionRequestResponseSignal,
-      connection_, proxy_, cancellable_, portal_handle_,
-      session_request_signal_id_, this);
-}
-
-// static
-void RemoteDesktopPortal::OnSessionRequested(GDBusProxy* proxy,
-                                             GAsyncResult* result,
-                                             gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-  that->OnSessionRequestResult(proxy, result);
-}
-
-// static
-void RemoteDesktopPortal::OnDevicesRequested(GObject* object,
-                                             GAsyncResult* result,
-                                             gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  auto* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GVariant> variant(
-      g_dbus_proxy_call_finish(proxy, result, error.receive()));
-  if (!variant) {
-    LOG(ERROR) << "Failed to select the devices: " << error->message;
-    return;
-  }
-
-  Scoped<gchar> handle;
-  g_variant_get_child(variant.get(), 0, "o", handle.receive());
-  if (!handle) {
-    LOG(ERROR) << "Failed to initialize the remote desktop session.";
-    if (that->devices_request_signal_id_) {
-      g_dbus_connection_signal_unsubscribe(that->connection_,
-                                           that->devices_request_signal_id_);
-      that->devices_request_signal_id_ = 0;
-    }
-    return;
-  }
-  HOST_LOG << "Subscribed to devices signal.";
-}
-
-void RemoteDesktopPortal::RequestSources() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  screencast_portal_->SourcesRequest();
-}
-
-void RemoteDesktopPortal::RequestClipboard() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  clipboard_portal_->RequestClipboard();
-}
-
-// static
-void RemoteDesktopPortal::OnDevicesRequestImpl(GDBusConnection* connection,
-                                               const gchar* sender_name,
-                                               const gchar* object_path,
-                                               const gchar* interface_name,
-                                               const gchar* signal_name,
-                                               GVariant* parameters,
-                                               gpointer user_data) {
-  HOST_LOG << "Received device selection signal from session.";
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  guint32 portal_response;
-  g_variant_get(parameters, "(u@a{sv})", &portal_response, nullptr);
-  if (portal_response) {
-    LOG(ERROR) << "Failed to select devices for the remote desktop session.";
-    return;
-  }
-
-  that->RequestClipboard();
-}
-
-void RemoteDesktopPortal::SelectDevices() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  GVariantBuilder builder;
-
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  g_variant_builder_add(&builder, "{sv}", "multiple",
-                        g_variant_new_boolean(false));
-
-  auto name = base::StringPrintf(
-      "%s%d", kPortalPrefix, base::RandInt(0, std::numeric_limits<int>::max()));
-  g_variant_builder_add(&builder, "{sv}", "handle_token",
-                        g_variant_new_string(name.c_str()));
-  devices_handle_ =
-      webrtc::xdg_portal::PrepareSignalHandle(name.c_str(), connection_);
-  devices_request_signal_id_ = webrtc::xdg_portal::SetupRequestResponseSignal(
-      devices_handle_.c_str(), OnDevicesRequestImpl, this, connection_);
-
-  HOST_LOG << "Selecting devices from the remote desktop session.";
-  g_dbus_proxy_call(
-      proxy_, "SelectDevices",
-      g_variant_new("(oa{sv})", session_handle_.c_str(), &builder),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_, OnDevicesRequested,
-      this);
-}
-
-// static
-void RemoteDesktopPortal::OnSessionRequestResponseSignal(
-    GDBusConnection* connection,
-    const char* sender_name,
-    const char* object_path,
-    const char* interface_name,
-    const char* signal_name,
-    GVariant* parameters,
-    gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  that->RegisterSessionClosedSignalHandler(
-      OnSessionClosedSignal, parameters, that->connection_,
-      that->session_handle_, that->session_closed_signal_id_);
-  that->screencast_portal_->SetSessionDetails(
-      {.session_handle = that->session_handle_});
-  that->clipboard_portal_->SetSessionDetails(
-      {.session_handle = that->session_handle_});
-
-  that->SelectDevices();
-}
-
-// static
-void RemoteDesktopPortal::OnSessionClosedSignal(GDBusConnection* connection,
-                                                const char* sender_name,
-                                                const char* object_path,
-                                                const char* interface_name,
-                                                const char* signal_name,
-                                                GVariant* parameters,
-                                                gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  HOST_LOG << "Received closed signal from session.";
-
-  // Unsubscribe from the signal and free the session handle to avoid calling
-  // Session::Close from the destructor since it's already closed
-  g_dbus_connection_signal_unsubscribe(that->connection_,
-                                       that->session_closed_signal_id_);
-}
-
-// static
-void RemoteDesktopPortal::OnSourcesRequestResponseSignal(
-    GDBusConnection* connection,
-    const char* sender_name,
-    const char* object_path,
-    const char* interface_name,
-    const char* signal_name,
-    GVariant* parameters,
-    gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  HOST_LOG << "Received sources signal from session.";
-
-  uint32_t portal_response;
-  g_variant_get(parameters, "(u@a{sv})", &portal_response, nullptr);
-  if (portal_response) {
-    LOG(ERROR) << "Failed to select sources for the remote desktop session.";
-    that->OnPortalDone(RequestResponse::kError);
-    return;
-  }
-  that->StartRequest();
-}
-
-void RemoteDesktopPortal::StartRequest() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  webrtc::xdg_portal::StartSessionRequest(
-      kPortalPrefix, session_handle_, OnStartRequestResponseSignal,
-      OnStartRequested, proxy_, connection_, cancellable_,
-      start_request_signal_id_, start_handle_, this);
-}
-
-// static
-void RemoteDesktopPortal::OnStartRequested(GDBusProxy* proxy,
-                                           GAsyncResult* result,
-                                           gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-  that->OnStartRequestResult(proxy, result);
-}
-
-// static
-void RemoteDesktopPortal::OnStartRequestResponseSignal(
-    GDBusConnection* connection,
-    const char* sender_name,
-    const char* object_path,
-    const char* interface_name,
-    const char* signal_name,
-    GVariant* parameters,
-    gpointer user_data) {
-  RemoteDesktopPortal* that = static_cast<RemoteDesktopPortal*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-  HOST_LOG << "Start signal received.";
-  uint32_t portal_response;
-  Scoped<GVariant> response_data;
-  Scoped<GVariantIter> iter;
-  g_variant_get(parameters, "(u@a{sv})", &portal_response,
-                response_data.receive());
-  if (portal_response || !response_data) {
-    LOG(ERROR) << "Failed to start the remote desktop session.";
-    return;
-  }
-
-  if (g_variant_lookup(response_data.get(), "streams", "a(ua{sv})",
-                       iter.receive())) {
-    Scoped<GVariant> variant;
-
-    while (g_variant_iter_next(iter.get(), "@(ua{sv})", variant.receive())) {
-      uint32_t stream_id;
-      Scoped<GVariant> options;
-
-      g_variant_get(variant.get(), "(u@a{sv})", &stream_id, options.receive());
-      DCHECK(options.get());
-
-      that->screencast_portal_->SetSessionDetails(
-          {.pipewire_stream_node_id = stream_id});
-      HOST_LOG << "Pipewire stream node id has been set for the portal";
-      break;
-    }
-  }
-
-  that->screencast_portal_->OpenPipeWireRemote();
-  that->OnPortalDone(RequestResponse::kSuccess);
-  HOST_LOG << "Remote desktop portal start response successful";
-}
-
-void RemoteDesktopPortal::OnPortalDone(RequestResponse result) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LOG(INFO) << "Remote desktop portal setup is done: "
-            << webrtc::xdg_portal::RequestResponseToString(result);
-  if (result != RequestResponse::kSuccess) {
-    Stop();
-  }
-}
-
-webrtc::xdg_portal::SessionDetails RemoteDesktopPortal::GetSessionDetails() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  HOST_LOG << "Getting session details from the wayland capturer";
-  return {proxy_.get(), cancellable_.get(), session_handle_,
-          pipewire_stream_node_id()};
-}
-
-void RemoteDesktopPortal::OnScreenCastRequestResult(RequestResponse result,
-                                                    uint32_t stream_node_id,
-                                                    int fd) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  screencast_portal_status_ = result;
-  notifier_->OnScreenCastRequestResult(result, stream_node_id, fd);
-}
-
-void RemoteDesktopPortal::OnScreenCastSessionClosed() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  notifier_->OnScreenCastSessionClosed();
-}
-
-void RemoteDesktopPortal::OnClipboardPortalDone(
-    webrtc::xdg_portal::RequestResponse result) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  clipboard_portal_status_ = result;
-
-  if (result == RequestResponse::kSuccess) {
-    WaylandManager::Get()->OnClipboardMetadata(
-        {.session_details = clipboard_portal_->GetSessionDetails()});
-  }
-
-  RequestSources();
-}
-
-}  // namespace remoting::xdg_portal
diff --git a/remoting/host/linux/remote_desktop_portal.h b/remoting/host/linux/remote_desktop_portal.h
deleted file mode 100644
index a3e7ed9..0000000
--- a/remoting/host/linux/remote_desktop_portal.h
+++ /dev/null
@@ -1,153 +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 REMOTING_HOST_LINUX_REMOTE_DESKTOP_PORTAL_H_
-#define REMOTING_HOST_LINUX_REMOTE_DESKTOP_PORTAL_H_
-
-#include <gio/gio.h>
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/sequence_checker.h"
-#include "remoting/host/linux/clipboard_portal.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "third_party/webrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.h"
-#include "third_party/webrtc/modules/desktop_capture/linux/wayland/screencast_portal.h"
-#include "third_party/webrtc/modules/portal/portal_request_response.h"
-#include "third_party/webrtc/modules/portal/scoped_glib.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-#include "third_party/webrtc/modules/portal/xdg_session_details.h"
-
-namespace remoting::xdg_portal {
-
-// Helper class to setup an XDG remote desktop portal session. An instance of
-// this class is owned by the wayland capturer. The methods on this class are
-// called from the capturer thread.
-class RemoteDesktopPortal
-    : public webrtc::xdg_portal::ScreenCapturePortalInterface,
-      public webrtc::ScreenCastPortal::PortalNotifier,
-      public xdg_portal::ClipboardPortal::PortalNotifier {
- public:
-  // |notifier| must outlive |RemoteDesktopPortal| instance and will be called
-  // into from the capturer thread.
-  RemoteDesktopPortal(
-      webrtc::ScreenCastPortal::PortalNotifier* screencast_notifier,
-      bool prefer_cursor_embedded);
-  RemoteDesktopPortal(const RemoteDesktopPortal&) = delete;
-  RemoteDesktopPortal& operator=(const RemoteDesktopPortal&) = delete;
-  ~RemoteDesktopPortal() override;
-
-  // ScreenCapturePortalInterface overrides.
-  void Start() override;
-  void Stop() override;
-  void OnPortalDone(webrtc::xdg_portal::RequestResponse result) override;
-  webrtc::xdg_portal::SessionDetails GetSessionDetails() override;
-  void RequestSession(GDBusProxy* proxy) override;
-
-  // ScreenCast PortalNotifier interface.
-  void OnScreenCastRequestResult(webrtc::xdg_portal::RequestResponse result,
-                                 uint32_t stream_node_id,
-                                 int fd) override;
-  void OnScreenCastSessionClosed() override;
-
-  // Clipboard PortalNotifier interface.
-  void OnClipboardPortalDone(
-      webrtc::xdg_portal::RequestResponse result) override;
-
- private:
-  void UnsubscribeSignalHandlers();
-  void RequestSources();
-  void RequestClipboard();
-  void SelectDevices();
-  void StartRequest();
-  uint32_t pipewire_stream_node_id();
-  static void OnProxyRequested(GObject* object,
-                               GAsyncResult* result,
-                               gpointer user_data);
-  static void OnSessionRequestResponseSignal(GDBusConnection* connection,
-                                             const char* sender_name,
-                                             const char* object_path,
-                                             const char* interface_name,
-                                             const char* signal_name,
-                                             GVariant* parameters,
-                                             gpointer user_data);
-  static void OnScreenCastPortalProxyRequested(GObject* object,
-                                               GAsyncResult* result,
-                                               gpointer user_data);
-  static void OnDevicesRequestImpl(GDBusConnection* connection,
-                                   const gchar* sender_name,
-                                   const gchar* object_path,
-                                   const gchar* interface_name,
-                                   const gchar* signal_name,
-                                   GVariant* parameters,
-                                   gpointer user_data);
-  static void OnStartRequestResponseSignal(GDBusConnection* connection,
-                                           const char* sender_name,
-                                           const char* object_path,
-                                           const char* interface_name,
-                                           const char* signal_name,
-                                           GVariant* parameters,
-                                           gpointer user_data);
-  static void OnStartRequested(GDBusProxy* proxy,
-                               GAsyncResult* result,
-                               gpointer user_data);
-  static void OnSourcesRequestResponseSignal(GDBusConnection* connection,
-                                             const char* sender_name,
-                                             const char* object_path,
-                                             const char* interface_name,
-                                             const char* signal_name,
-                                             GVariant* parameters,
-                                             gpointer user_data);
-  static void OnSessionClosedSignal(GDBusConnection* connection,
-                                    const char* sender_name,
-                                    const char* object_path,
-                                    const char* interface_name,
-                                    const char* signal_name,
-                                    GVariant* parameters,
-                                    gpointer user_data);
-  static void OnSessionRequested(GDBusProxy* proxy,
-                                 GAsyncResult* result,
-                                 gpointer user_data);
-  static void OnDevicesRequested(GObject* object,
-                                 GAsyncResult* result,
-                                 gpointer user_data);
-
-  webrtc::xdg_portal::RequestResponse screencast_portal_status_
-      GUARDED_BY_CONTEXT(sequence_checker_) =
-          webrtc::xdg_portal::RequestResponse::kUnknown;
-  webrtc::xdg_portal::RequestResponse clipboard_portal_status_
-      GUARDED_BY_CONTEXT(sequence_checker_) =
-          webrtc::xdg_portal::RequestResponse::kUnknown;
-  raw_ptr<GDBusConnection> connection_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<GDBusProxy> proxy_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-  raw_ptr<GCancellable> cancellable_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<webrtc::ScreenCastPortal::PortalNotifier> notifier_
-      GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-
-  std::string portal_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-  std::string session_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-  std::string start_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-  std::string devices_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-  guint session_request_signal_id_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
-  guint start_request_signal_id_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
-  guint session_closed_signal_id_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
-  guint devices_request_signal_id_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
-  std::unique_ptr<webrtc::ScreenCastPortal> screencast_portal_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  std::unique_ptr<ClipboardPortal> clipboard_portal_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-
-  raw_ptr<GMainContext> context_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  SEQUENCE_CHECKER(sequence_checker_);
-};
-
-}  // namespace remoting::xdg_portal
-
-#endif  // REMOTING_HOST_LINUX_REMOTE_DESKTOP_PORTAL_H_
diff --git a/remoting/host/linux/remote_desktop_portal_injector.cc b/remoting/host/linux/remote_desktop_portal_injector.cc
deleted file mode 100644
index c330dd2..0000000
--- a/remoting/host/linux/remote_desktop_portal_injector.cc
+++ /dev/null
@@ -1,563 +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.
-
-#include "remoting/host/linux/remote_desktop_portal_injector.h"
-
-#include <gio/gio.h>
-#include <gio/gunixfdlist.h>
-#include <glib-object.h>
-#include <linux/input.h>
-#include <poll.h>
-
-#include <utility>
-
-#include "base/check.h"
-#include "base/notreached.h"
-#include "base/sequence_checker.h"
-#include "base/time/time.h"
-#include "remoting/base/logging.h"
-#include "third_party/libei/cipd/include/libei-1.0/libei.h"
-#include "third_party/webrtc/modules/portal/portal_request_response.h"
-#include "third_party/webrtc/modules/portal/scoped_glib.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-
-namespace remoting::xdg_portal {
-
-using webrtc::Scoped;
-
-namespace {
-// TODO(crbug.com/40212673): See if these can be pulled from a common place.
-constexpr int BUTTON_LEFT_KEYCODE = 272;
-constexpr int BUTTON_RIGHT_KEYCODE = 273;
-constexpr int BUTTON_MIDDLE_KEYCODE = 274;
-constexpr int BUTTON_FORWARD_KEYCODE = 277;
-constexpr int BUTTON_BACK_KEYCODE = 278;
-
-// See:
-// https://libinput.pages.freedesktop.org/libei/api/group__libei.html#gaf2ec4b04f6b3c706bad0f1cae66bea34
-constexpr int EI_SCROLL_FACTOR = 120;
-
-int EvdevCodeToMouseButton(int code) {
-  switch (code) {
-    case BUTTON_LEFT_KEYCODE:
-      return BTN_LEFT;
-    case BUTTON_RIGHT_KEYCODE:
-      return BTN_RIGHT;
-    case BUTTON_MIDDLE_KEYCODE:
-      return BTN_MIDDLE;
-    case BUTTON_BACK_KEYCODE:
-      return BTN_BACK;
-    case BUTTON_FORWARD_KEYCODE:
-      return BTN_FORWARD;
-    default:
-      NOTREACHED() << "Undefined code: " << code;
-  }
-}
-
-}  // namespace
-
-RemoteDesktopPortalInjector::RemoteDesktopPortalInjector() {
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-RemoteDesktopPortalInjector::~RemoteDesktopPortalInjector() {
-  DCHECK(!ei_);
-}
-
-void RemoteDesktopPortalInjector::Shutdown() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  ei_pointer_enabled_ = false;
-  ei_keyboard_enabled_ = false;
-  ei_absolute_pointer_enabled_ = false;
-  if (ei_seat_) {
-    ei_seat_unbind_capabilities(ei_seat_, EI_DEVICE_CAP_KEYBOARD,
-                                EI_DEVICE_CAP_POINTER,
-                                EI_DEVICE_CAP_POINTER_ABSOLUTE, nullptr);
-  }
-  if (ei_keyboard_) {
-    ei_device_unref(ei_keyboard_);
-    ei_keyboard_ = nullptr;
-  }
-  if (ei_pointer_) {
-    ei_device_unref(ei_pointer_);
-    ei_pointer_ = nullptr;
-  }
-  if (ei_absolute_pointer_) {
-    ei_device_unref(ei_absolute_pointer_);
-    ei_absolute_pointer_ = nullptr;
-  }
-  if (ei_seat_) {
-    ei_event_watcher_->StopProcessingEvents();
-    ei_seat_unref(ei_seat_);
-    ei_seat_ = nullptr;
-  }
-  if (ei_) {
-    ei_unref(ei_);
-    ei_ = nullptr;
-  }
-}
-
-// static
-void RemoteDesktopPortalInjector::ValidateGDPBusProxyResult(
-    GObject* proxy,
-    GAsyncResult* result,
-    gpointer user_data) {
-  RemoteDesktopPortalInjector* that =
-      static_cast<RemoteDesktopPortalInjector*>(user_data);
-  DCHECK(that);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GVariant> variant(g_dbus_proxy_call_finish(
-      reinterpret_cast<GDBusProxy*>(proxy), result, error.receive()));
-  if (!variant) {
-    if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
-      return;
-    }
-    LOG(ERROR) << "Error in input injection (without EI): " << error->message;
-  }
-}
-
-void RemoteDesktopPortalInjector::InjectMouseButton(int code, bool pressed) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (use_ei_) {
-    if (ei_pointer_enabled_) {
-      ei_device_button_button(ei_pointer_, EvdevCodeToMouseButton(code),
-                              pressed);
-      ei_device_frame(ei_pointer_, ei_now(ei_));
-    } else {
-      // Non-ei injection is blocked by portal when EI has been enabled
-      // successfully previously.
-      LOG(ERROR)
-          << "Unable to inject mouse button since EI pointer is disabled";
-    }
-    return;
-  }
-
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  DCHECK(pipewire_stream_node_id_);
-  GVariantBuilder builder;
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  g_dbus_proxy_call(proxy_, "NotifyPointerButton",
-                    g_variant_new("(oa{sv}iu)", session_handle_.c_str(),
-                                  &builder, code, pressed),
-                    G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-                    ValidateGDPBusProxyResult, this);
-}
-
-void RemoteDesktopPortalInjector::InjectMouseScroll(int axis, int steps) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (use_ei_) {
-    if (ei_absolute_pointer_enabled_) {
-      if (axis == ScrollType::VERTICAL_SCROLL) {
-        ei_device_scroll_discrete(ei_absolute_pointer_, 0,
-                                  steps * EI_SCROLL_FACTOR);
-      } else {
-        ei_device_scroll_discrete(ei_absolute_pointer_,
-                                  steps * EI_SCROLL_FACTOR, 0);
-      }
-      ei_device_scroll_stop(ei_absolute_pointer_, true, true);
-      ei_device_frame(ei_absolute_pointer_, ei_now(ei_));
-    } else {
-      LOG(ERROR) << "Unable to scroll mouse since EI pointer is disabled";
-    }
-    return;
-  }
-
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  DCHECK(pipewire_stream_node_id_);
-  GVariantBuilder builder;
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  g_dbus_proxy_call(proxy_, "NotifyPointerAxisDiscrete",
-                    g_variant_new("(oa{sv}ui)", session_handle_.c_str(),
-                                  &builder, axis, steps),
-                    G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-                    ValidateGDPBusProxyResult, this);
-}
-
-void RemoteDesktopPortalInjector::MovePointerBy(int delta_x, int delta_y) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (use_ei_) {
-    if (ei_pointer_enabled_) {
-      ei_device_pointer_motion(ei_pointer_, delta_x, delta_y);
-      ei_device_frame(ei_pointer_, ei_now(ei_));
-    } else {
-      LOG(ERROR)
-          << "Unable to do relative mouse move since EI pointer is disabled";
-    }
-    return;
-  }
-
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  DCHECK(pipewire_stream_node_id_);
-  GVariantBuilder builder;
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  g_dbus_proxy_call(
-      proxy_, "NotifyPointerMotion",
-      g_variant_new("(oa{sv}dd)", session_handle_.c_str(), &builder,
-                    static_cast<double>(delta_x), static_cast<double>(delta_y)),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-      ValidateGDPBusProxyResult, this);
-}
-
-bool RemoteDesktopPortalInjector::InDeviceRegion(uint32_t x, uint32_t y) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (const auto& region : device_regions_) {
-    if ((x >= region.x && x < region.x + region.w) &&
-        (y >= region.y && y < region.y + region.h)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void RemoteDesktopPortalInjector::MovePointerTo(int x, int y) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (use_ei_) {
-    if (ei_absolute_pointer_enabled_) {
-      if (!InDeviceRegion(x, y)) {
-        LOG(WARNING) << "Absolute coordinates " << x << "," << y
-                     << "are not in any device region, ignoring";
-        return;
-      }
-      ei_device_pointer_motion_absolute(ei_absolute_pointer_, x, y);
-      ei_device_frame(ei_absolute_pointer_, ei_now(ei_));
-    } else {
-      LOG(ERROR)
-          << "Unable to do absolute mouse move since EI pointer is disabled";
-    }
-    return;
-  }
-
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  DCHECK(pipewire_stream_node_id_);
-  GVariantBuilder builder;
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  VLOG(6) << "session handle: " << session_handle_
-          << ", stream node id: " << pipewire_stream_node_id_;
-  g_dbus_proxy_call(
-      proxy_, "NotifyPointerMotionAbsolute",
-      g_variant_new("(oa{sv}udd)", session_handle_.c_str(), &builder,
-                    pipewire_stream_node_id_, static_cast<double>(x),
-                    static_cast<double>(y)),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-      ValidateGDPBusProxyResult, this);
-}
-
-void RemoteDesktopPortalInjector::InjectKeyPress(int code,
-                                                 bool pressed,
-                                                 bool is_code) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (use_ei_) {
-    if (ei_keyboard_enabled_) {
-      ei_device_keyboard_key(ei_keyboard_, code, pressed);
-      ei_device_frame(ei_keyboard_, ei_now(ei_));
-    } else {
-      LOG(ERROR) << "Unable to inject key press since EI keyboard is disabled";
-    }
-    return;
-  }
-
-  DCHECK(proxy_);
-  DCHECK(cancellable_);
-  DCHECK(!session_handle_.empty());
-  DCHECK(pipewire_stream_node_id_);
-  GVariantBuilder builder;
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  VLOG(6) << "session handle: " << session_handle_;
-  g_dbus_proxy_call(proxy_,
-                    is_code ? "NotifyKeyboardKeycode" : "NotifyKeyboardKeysym",
-                    g_variant_new("(oa{sv}iu)", session_handle_.c_str(),
-                                  &builder, code, pressed),
-                    G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, cancellable_,
-                    ValidateGDPBusProxyResult, this);
-}
-
-void RemoteDesktopPortalInjector::SetSessionDetails(
-    webrtc::xdg_portal::SessionDetails session_details) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  HOST_LOG << "Desktop portal session details received";
-  proxy_ = session_details.proxy;
-  cancellable_ = session_details.cancellable;
-  session_handle_ = session_details.session_handle;
-  pipewire_stream_node_id_ = session_details.pipewire_stream_node_id;
-}
-
-static void ei_loghandler(struct ei* ei,
-                          enum ei_log_priority priority,
-                          const char* message,
-                          struct ei_log_context* ctx) {
-  HOST_LOG << "[EI_LOGGER] " << ei_log_context_get_func(ctx) << " : "
-           << message;
-}
-
-// static
-void RemoteDesktopPortalInjector::OnEiFdRequested(GObject* object,
-                                                  GAsyncResult* result,
-                                                  gpointer user_data) {
-  auto* proxy = reinterpret_cast<GDBusProxy*>(object);
-  RemoteDesktopPortalInjector* that =
-      static_cast<RemoteDesktopPortalInjector*>(user_data);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(that->sequence_checker_);
-
-  Scoped<GError> error;
-  Scoped<GUnixFDList> outlist;
-  Scoped<GVariant> variant(g_dbus_proxy_call_with_unix_fd_list_finish(
-      proxy, outlist.receive(), result, error.receive()));
-  if (!variant) {
-    if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
-      return;
-    }
-    LOG(ERROR) << "Failed to get the EI fd: " << error->message;
-    std::move(that->on_libei_setup_done_).Run(false);
-    return;
-  }
-
-  int32_t index;
-  g_variant_get(variant.get(), "(h)", &index);
-
-  that->ei_fd_ = g_unix_fd_list_get(outlist.get(), index, error.receive());
-
-  if (that->ei_fd_ == -1) {
-    LOG(ERROR) << "Failed to get file descriptor from the list: "
-               << error->message;
-    std::move(that->on_libei_setup_done_).Run(false);
-    return;
-  }
-
-  that->ei_ = ei_new_sender(nullptr);
-  ei_configure_name(that->ei_, "crd-input");
-  ei_log_set_priority(that->ei_, EI_LOG_PRIORITY_INFO);
-  ei_log_set_handler(that->ei_, ei_loghandler);
-  ei_setup_backend_fd(that->ei_.get(), that->ei_fd_);
-
-  that->ei_event_watcher_ =
-      std::make_unique<EiEventWatcherGlib>(that->ei_fd_, that->ei_, that);
-
-  that->ei_event_watcher_->StartProcessingEvents();
-  that->use_ei_ = true;
-  HOST_LOG << "Using LIBEI for input injection";
-  std::move(that->on_libei_setup_done_).Run(true);
-}
-
-void RemoteDesktopPortalInjector::HandleRegions(struct ei_device* device) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  uint32_t idx = 0;
-  struct ei_region* region;
-
-  while ((region = ei_device_get_region(device, idx++))) {
-    DeviceRegion device_region{.x = ei_region_get_x(region),
-                               .y = ei_region_get_y(region),
-                               .w = ei_region_get_width(region),
-                               .h = ei_region_get_height(region)};
-
-    HOST_LOG << "EI Device: " << ei_device_get_name(device) << " has region "
-             << device_region.w << "x" << device_region.h << "@"
-             << device_region.x << "," << device_region.y;
-    device_regions_.push_back(std::move(device_region));
-  }
-}
-
-void RemoteDesktopPortalInjector::OnEiSeatAddedEvent(struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (ei_seat_) {
-    return;
-  }
-
-  ei_seat_ = ei_seat_ref(ei_event_get_seat(event));
-  HOST_LOG << "EI seat added: " << ei_seat_get_name(ei_seat_);
-
-  ei_seat_bind_capabilities(
-      ei_seat_, EI_DEVICE_CAP_POINTER, EI_DEVICE_CAP_KEYBOARD,
-      EI_DEVICE_CAP_POINTER_ABSOLUTE, EI_DEVICE_CAP_BUTTON,
-      EI_DEVICE_CAP_SCROLL, nullptr);
-}
-
-void RemoteDesktopPortalInjector::OnEiSeatRemovedEvent(struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // Don't need to close the devices, libei will give us the right events.
-  if (ei_event_get_seat(event) == ei_seat_.get()) {
-    ei_seat_unref(ei_seat_);
-    ei_seat_ = nullptr;
-  }
-}
-
-void RemoteDesktopPortalInjector::OnEiDeviceAddedEvent(struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  struct ei_device* device = ei_device_ref(ei_event_get_device(event));
-
-  if (ei_device_has_capability(device, EI_DEVICE_CAP_POINTER)) {
-    HOST_LOG << "EI New pointer device: " << ei_device_get_name(device);
-    if (ei_pointer_) {
-      ei_device_unref(ei_pointer_);
-    }
-    ei_pointer_ = device;
-  }
-  if (ei_device_has_capability(device, EI_DEVICE_CAP_KEYBOARD)) {
-    HOST_LOG << "EI New keyboard device: " << ei_device_get_name(device);
-    if (ei_keyboard_) {
-      ei_device_unref(ei_keyboard_);
-    }
-    ei_keyboard_ = device;
-  }
-  if (ei_device_has_capability(device, EI_DEVICE_CAP_POINTER_ABSOLUTE)) {
-    HOST_LOG << "EI New absolute pointer device: "
-             << ei_device_get_name(device);
-    if (ei_absolute_pointer_) {
-      ei_device_unref(ei_absolute_pointer_);
-    }
-    ei_absolute_pointer_ = device;
-    HandleRegions(ei_absolute_pointer_);
-  }
-}
-
-void RemoteDesktopPortalInjector::OnEiDeviceResumedEvent(
-    struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  struct ei_device* event_device = ei_event_get_device(event);
-  if (!event_device) {
-    return;
-  }
-
-  if (event_device == ei_pointer_.get()) {
-    HOST_LOG << "EI Emulating the pointer device now";
-    ei_device_start_emulating(ei_pointer_, ++device_serial_);
-    ei_pointer_enabled_ = true;
-  } else if (event_device == ei_keyboard_.get()) {
-    HOST_LOG << "EI Emulating the keyboard device now";
-    ei_device_start_emulating(ei_keyboard_, ++device_serial_);
-    ei_keyboard_enabled_ = true;
-  } else if (event_device == ei_absolute_pointer_.get()) {
-    HOST_LOG << "EI Emulating the absolute pointer device now";
-    ei_device_start_emulating(ei_absolute_pointer_, ++device_serial_);
-    ei_absolute_pointer_enabled_ = true;
-  } else {
-    LOG(WARNING) << "EI unknown device resumed: "
-                 << ei_device_get_name(event_device);
-  }
-}
-
-void RemoteDesktopPortalInjector::OnEiDevicePausedEvent(
-    struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  struct ei_device* event_device = ei_event_get_device(event);
-  if (!event_device) {
-    return;
-  }
-
-  if (event_device == ei_pointer_.get()) {
-    HOST_LOG << "EI Pointer device paused";
-    ei_device_stop_emulating(ei_pointer_);
-    ei_pointer_enabled_ = false;
-  } else if (event_device == ei_keyboard_.get()) {
-    HOST_LOG << "EI Keyboard device paused";
-    ei_device_stop_emulating(ei_keyboard_);
-    ei_keyboard_enabled_ = false;
-  } else if (event_device == ei_absolute_pointer_.get()) {
-    HOST_LOG << "EI Absolute pointer device paused";
-    ei_device_stop_emulating(ei_absolute_pointer_);
-    ei_absolute_pointer_enabled_ = false;
-  } else {
-    LOG(WARNING) << "EI Unknown device paused: "
-                 << ei_device_get_name(event_device);
-  }
-}
-
-void RemoteDesktopPortalInjector::OnEiDeviceRemovedEvent(
-    struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  struct ei_device* event_device = ei_event_get_device(event);
-  if (!event_device) {
-    return;
-  }
-
-  if (event_device == ei_pointer_.get()) {
-    HOST_LOG << "EI Pointer device removed";
-    ei_device_unref(ei_pointer_);
-    ei_pointer_ = nullptr;
-    ei_pointer_enabled_ = false;
-  } else if (event_device == ei_keyboard_.get()) {
-    HOST_LOG << "EI Keyboard device removed";
-    ei_device_unref(ei_keyboard_);
-    ei_keyboard_ = nullptr;
-    ei_keyboard_enabled_ = false;
-  } else if (event_device == ei_absolute_pointer_.get()) {
-    HOST_LOG << "EI Absolute pointer device removed";
-    ei_device_unref(ei_absolute_pointer_);
-    ei_absolute_pointer_ = nullptr;
-    ei_absolute_pointer_enabled_ = false;
-    device_regions_.clear();
-  } else {
-    LOG(WARNING) << "EI unknown device removed: "
-                 << ei_device_get_name(event_device);
-  }
-}
-
-void RemoteDesktopPortalInjector::HandleEiEvent(struct ei_event* event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  switch (ei_event_get_type(event)) {
-    case EI_EVENT_CONNECT:
-      HOST_LOG << "EI connected";
-      break;
-    case EI_EVENT_DISCONNECT: {
-      HOST_LOG << "EI disconnected";
-      Shutdown();
-      break;
-    }
-    case EI_EVENT_SEAT_ADDED:
-      OnEiSeatAddedEvent(event);
-      break;
-    case EI_EVENT_SEAT_REMOVED:
-      OnEiSeatRemovedEvent(event);
-      break;
-    case EI_EVENT_DEVICE_ADDED:
-      OnEiDeviceAddedEvent(event);
-      break;
-    case EI_EVENT_DEVICE_RESUMED:
-      OnEiDeviceResumedEvent(event);
-      break;
-    case EI_EVENT_DEVICE_PAUSED:
-      OnEiDevicePausedEvent(event);
-      break;
-    case EI_EVENT_DEVICE_REMOVED:
-      OnEiDeviceRemovedEvent(event);
-      break;
-    case EI_EVENT_FRAME:
-    case EI_EVENT_DEVICE_START_EMULATING:
-    case EI_EVENT_DEVICE_STOP_EMULATING:
-    case EI_EVENT_POINTER_MOTION:
-    case EI_EVENT_POINTER_MOTION_ABSOLUTE:
-    case EI_EVENT_BUTTON_BUTTON:
-    case EI_EVENT_SCROLL_DELTA:
-    case EI_EVENT_SCROLL_DISCRETE:
-    case EI_EVENT_KEYBOARD_KEY:
-      break;
-    default:
-      LOG(WARNING) << "Unexpected EI event observed type: "
-                   << ei_event_get_type(event);
-  }
-}
-
-void RemoteDesktopPortalInjector::SetupLibei(
-    base::OnceCallback<void(bool)> OnLibeiDone) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  on_libei_setup_done_ = std::move(OnLibeiDone);
-  GVariantBuilder builder;
-  g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
-  g_dbus_proxy_call_with_unix_fd_list(
-      proxy_, "ConnectToEIS",
-      g_variant_new("(oa{sv})", session_handle_.c_str(), &builder),
-      G_DBUS_CALL_FLAGS_NONE, /*timeout=*/-1, /*fd_list=*/nullptr, cancellable_,
-      OnEiFdRequested, this);
-}
-
-}  // namespace remoting::xdg_portal
diff --git a/remoting/host/linux/remote_desktop_portal_injector.h b/remoting/host/linux/remote_desktop_portal_injector.h
deleted file mode 100644
index f1805bb..0000000
--- a/remoting/host/linux/remote_desktop_portal_injector.h
+++ /dev/null
@@ -1,121 +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 REMOTING_HOST_LINUX_REMOTE_DESKTOP_PORTAL_INJECTOR_H_
-#define REMOTING_HOST_LINUX_REMOTE_DESKTOP_PORTAL_INJECTOR_H_
-
-#include <gio/gio.h>
-
-#include <memory>
-#include <string>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/sequence_checker.h"
-#include "remoting/host/linux/ei_event_watcher_glib.h"
-#include "third_party/libei/cipd/include/libei-1.0/libei.h"
-#include "third_party/webrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.h"
-#include "third_party/webrtc/modules/desktop_capture/linux/wayland/screencast_portal.h"
-#include "third_party/webrtc/modules/portal/xdg_desktop_portal_utils.h"
-#include "third_party/webrtc/modules/portal/xdg_session_details.h"
-
-namespace remoting::xdg_portal {
-
-struct DeviceRegion {
-  uint32_t x;
-  uint32_t y;
-  uint32_t w;
-  uint32_t h;
-};
-
-// This class is used by the `ChromotingInputThread` to inject input into the
-// wayland remote host using XDG desktop portal APIs.
-class RemoteDesktopPortalInjector : public EiEventWatcherGlib::EiEventHandler {
- public:
-  enum ScrollType {
-    VERTICAL_SCROLL = 0,
-    HORIZONTAL_SCROLL = 1,
-  };
-
-  // Default constructor is used by input injector module.
-  RemoteDesktopPortalInjector();
-  RemoteDesktopPortalInjector(const RemoteDesktopPortalInjector&) = delete;
-  RemoteDesktopPortalInjector& operator=(const RemoteDesktopPortalInjector&) =
-      delete;
-  ~RemoteDesktopPortalInjector() override;
-
-  // This method populates the session details for this object. Session details
-  // are borrowed from the wayland desktop capturer.
-  void SetSessionDetails(webrtc::xdg_portal::SessionDetails session_details);
-
-  // Methods related to input injection.
-  void InjectMouseButton(int code, bool pressed);
-  void InjectMouseScroll(int axis, int steps);
-  void MovePointerTo(int x, int y);
-  void MovePointerBy(int delta_x, int delta_y);
-  void InjectKeyPress(int code, bool pressed, bool is_code = true);
-
-  // EiEventWatcherGlib::EiEventHandler interface
-  void HandleEiEvent(struct ei_event* event) override;
-
-  void SetupLibei(base::OnceCallback<void(bool)> OnLibeiDone);
-  void Shutdown();
-
- private:
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  static void ValidateGDPBusProxyResult(GObject* proxy,
-                                        GAsyncResult* result,
-                                        gpointer user_data);
-  static void OnEiFdRequested(GObject* object,
-                              GAsyncResult* result,
-                              gpointer user_data);
-  void HandleRegions(struct ei_device* device);
-  bool InDeviceRegion(uint32_t x, uint32_t y);
-
-  void OnEiSeatAddedEvent(struct ei_event* event);
-  void OnEiSeatRemovedEvent(struct ei_event* event);
-  void OnEiDeviceAddedEvent(struct ei_event* event);
-  void OnEiDeviceResumedEvent(struct ei_event* event);
-  void OnEiDevicePausedEvent(struct ei_event* event);
-  void OnEiDeviceRemovedEvent(struct ei_event* event);
-
-  raw_ptr<GDBusConnection> connection_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<GDBusProxy> proxy_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-  raw_ptr<GCancellable> cancellable_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-
-  uint32_t pipewire_stream_node_id_ GUARDED_BY_CONTEXT(sequence_checker_);
-  std::string session_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
-
-  // EI related fields.
-  raw_ptr<ei> ei_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-  raw_ptr<struct ei_seat> ei_seat_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<ei_device> ei_pointer_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<ei_device> ei_keyboard_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      nullptr;
-  raw_ptr<ei_device> ei_absolute_pointer_
-      GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-  bool ei_pointer_enabled_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
-  bool ei_absolute_pointer_enabled_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      false;
-  bool ei_keyboard_enabled_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
-  bool use_ei_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
-  std::unique_ptr<EiEventWatcherGlib> ei_event_watcher_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  int ei_fd_ GUARDED_BY_CONTEXT(sequence_checker_) = -1;
-  int device_serial_ GUARDED_BY_CONTEXT(sequence_checker_) = 1;
-  std::vector<DeviceRegion> device_regions_
-      GUARDED_BY_CONTEXT(sequence_checker_) = {};
-  base::OnceCallback<void(bool)> on_libei_setup_done_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-};
-
-}  // namespace remoting::xdg_portal
-
-#endif  // REMOTING_HOST_LINUX_REMOTE_DESKTOP_PORTAL_INJECTOR_H_
diff --git a/remoting/host/linux/wayland_connection.cc b/remoting/host/linux/wayland_connection.cc
deleted file mode 100644
index 8a0c131..0000000
--- a/remoting/host/linux/wayland_connection.cc
+++ /dev/null
@@ -1,98 +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.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
-#include "remoting/host/linux/wayland_connection.h"
-
-#include "base/time/time.h"
-#include "remoting/base/logging.h"
-
-namespace remoting {
-
-WaylandConnection::WaylandConnection(std::string wl_socket)
-    : wl_socket_(wl_socket),
-      display_(wl_display_connect(wl_socket_.c_str())),
-      wrapped_display_(reinterpret_cast<struct wl_proxy*>(
-          wl_proxy_create_wrapper(display_))),
-      event_queue_(wl_display_create_queue(display_)) {
-  wl_proxy_set_queue(wrapped_display_.get(), event_queue_.get());
-  registry_ = wl_display_get_registry(
-      reinterpret_cast<wl_display*>(wrapped_display_.get()));
-  wl_registry_add_listener(registry_.get(), &wl_registry_listener_, this);
-
-  event_watcher_ = ui::WaylandEventWatcher::CreateWaylandEventWatcher(
-      display_.get(), event_queue_.get());
-  event_watcher_->StartProcessingEvents();
-}
-
-WaylandConnection::~WaylandConnection() {
-  if (event_queue_) {
-    wl_event_queue_destroy(event_queue_.get());
-  }
-  if (display_) {
-    wl_display_disconnect(display_.get());
-  }
-}
-
-// static
-void WaylandConnection::OnGlobalEvent(void* data,
-                                      struct wl_registry* registry,
-                                      uint32_t name,
-                                      const char* interface,
-                                      uint32_t version) {
-  VLOG(1) << __func__
-          << ": Interface: " << interface << ", version: " << version
-          << ", name: " << name;
-  WaylandConnection* connection = static_cast<WaylandConnection*>(data);
-  DCHECK(connection);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(connection->sequence_checker_);
-  if (strcmp(interface, wl_output_interface.name) == 0 ||
-      strcmp(interface, zxdg_output_manager_v1_interface.name) == 0) {
-    connection->wayland_display_.HandleGlobalDisplayEvent(registry, name,
-                                                          interface, version);
-  } else if (strcmp(interface, wl_seat_interface.name) == 0) {
-    connection->seat_id_ = name;
-    connection->wayland_seat_.HandleGlobalSeatEvent(registry, name, interface,
-                                                    version);
-  }
-}
-
-// static
-void WaylandConnection::OnGlobalRemoveEvent(void* data,
-                                            struct wl_registry* registry,
-                                            uint32_t name) {
-  VLOG(1) << __func__ << " Removing name: " << name;
-  WaylandConnection* connection = static_cast<WaylandConnection*>(data);
-  DCHECK(connection);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(connection->sequence_checker_);
-  if (connection->seat_id_ == name) {
-    connection->wayland_seat_.HandleGlobalRemoveSeatEvent(name);
-    connection->seat_id_ = 0;
-  } else {
-    connection->wayland_display_.HandleGlobalRemoveDisplayEvent(name);
-  }
-}
-
-uint32_t WaylandConnection::GetSeatId() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_GT(wayland_seat_.GetSeatId(), 0u);
-  return wayland_seat_.GetSeatId();
-}
-
-DesktopDisplayInfo WaylandConnection::GetCurrentDisplayInfo() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return wayland_display_.GetCurrentDisplayInfo();
-}
-
-void WaylandConnection::SetSeatPresentCallback(
-    WaylandSeat::OnSeatPresentCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  wayland_seat_.SetSeatPresentCallback(std::move(callback));
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_connection.h b/remoting/host/linux/wayland_connection.h
deleted file mode 100644
index 7b0eba8..0000000
--- a/remoting/host/linux/wayland_connection.h
+++ /dev/null
@@ -1,68 +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 REMOTING_HOST_LINUX_WAYLAND_CONNECTION_H_
-#define REMOTING_HOST_LINUX_WAYLAND_CONNECTION_H_
-
-#include <wayland-client.h>
-
-#include <memory>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/sequence_checker.h"
-#include "base/timer/timer.h"
-#include "remoting/host/desktop_display_info.h"
-#include "remoting/host/linux/wayland_display.h"
-#include "remoting/host/linux/wayland_seat.h"
-#include "ui/events/platform/wayland/wayland_event_watcher.h"
-
-namespace remoting {
-
-// This class models Wayland connection and acts as a Wayland client by
-// connecting to the provided wayland socket where the Wayland compositor is
-// listening.
-class WaylandConnection {
- public:
-  explicit WaylandConnection(std::string wl_socket);
-  ~WaylandConnection();
-
-  WaylandConnection(const WaylandConnection&) = delete;
-  WaylandConnection& operator=(const WaylandConnection&) = delete;
-
-  DesktopDisplayInfo GetCurrentDisplayInfo() const;
-  uint32_t GetSeatId() const;
-  void SetSeatPresentCallback(WaylandSeat::OnSeatPresentCallback callback);
-
- private:
-  static void OnGlobalEvent(void* data,
-                            struct wl_registry* registry,
-                            uint32_t name,
-                            const char* interface,
-                            uint32_t version);
-
-  static void OnGlobalRemoveEvent(void* data,
-                                  struct wl_registry* registry,
-                                  uint32_t name);
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  std::string wl_socket_;
-  raw_ptr<struct wl_display> display_ = nullptr;
-  raw_ptr<struct wl_proxy> wrapped_display_ = nullptr;
-  raw_ptr<struct wl_event_queue> event_queue_ = nullptr;
-  raw_ptr<struct wl_registry> registry_ = nullptr;
-  const struct wl_registry_listener wl_registry_listener_ = {
-      .global = OnGlobalEvent,
-      .global_remove = OnGlobalRemoveEvent,
-  };
-  std::unique_ptr<ui::WaylandEventWatcher> event_watcher_;
-  WaylandDisplay wayland_display_;
-  WaylandSeat wayland_seat_;
-  uint32_t seat_id_ = 0;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_CONNECTION_H_
diff --git a/remoting/host/linux/wayland_desktop_capturer.cc b/remoting/host/linux/wayland_desktop_capturer.cc
deleted file mode 100644
index ab576412..0000000
--- a/remoting/host/linux/wayland_desktop_capturer.cc
+++ /dev/null
@@ -1,101 +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.
-
-#include "remoting/host/linux/wayland_desktop_capturer.h"
-
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "remoting/base/logging.h"
-#include "remoting/host/linux/remote_desktop_portal.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "third_party/webrtc/modules/portal/xdg_session_details.h"
-
-namespace remoting {
-
-using webrtc::DesktopCaptureOptions;
-#if defined(WEBRTC_USE_GIO)
-using webrtc::DesktopCaptureMetadata;
-#endif
-using webrtc::xdg_portal::RequestResponse;
-using webrtc::xdg_portal::SessionDetails;
-
-WaylandDesktopCapturer::WaylandDesktopCapturer(
-    const DesktopCaptureOptions& options)
-    : base_capturer_pipewire_(options,
-                              // Note: RemoteDesktopPortal doesn't own `this`
-                              std::make_unique<xdg_portal::RemoteDesktopPortal>(
-                                  this,
-                                  options.prefer_cursor_embedded())) {
-  base_capturer_pipewire_.SendFramesImmediately(true);
-}
-
-WaylandDesktopCapturer::~WaylandDesktopCapturer() {
-  WaylandManager::Get()->OnDesktopCapturerDestroyed();
-}
-
-void WaylandDesktopCapturer::Start(Callback* callback) {
-  base_capturer_pipewire_.Start(callback);
-}
-
-void WaylandDesktopCapturer::CaptureFrame() {
-  return base_capturer_pipewire_.CaptureFrame();
-}
-
-bool WaylandDesktopCapturer::GetSourceList(SourceList* sources) {
-  return base_capturer_pipewire_.GetSourceList(sources);
-}
-
-bool WaylandDesktopCapturer::SelectSource(SourceId id) {
-  return base_capturer_pipewire_.SelectSource(id);
-}
-
-void WaylandDesktopCapturer::SetScreenResolution(ScreenResolution resolution,
-                                                 webrtc::ScreenId screen_id) {
-  // TODO(crbug.com/40266740): For multi-mon, we will need to verify that screen
-  // id is managed by this capturer.
-  base_capturer_pipewire_.UpdateResolution(resolution.dimensions().width(),
-                                           resolution.dimensions().height());
-}
-
-void WaylandDesktopCapturer::SetMaxFrameRate(uint32_t max_frame_rate) {
-  base_capturer_pipewire_.SetMaxFrameRate(max_frame_rate);
-}
-
-#if defined(WEBRTC_USE_GIO)
-webrtc::DesktopCaptureMetadata WaylandDesktopCapturer::GetMetadata() {
-  SessionDetails session_details = base_capturer_pipewire_.GetSessionDetails();
-  DCHECK(session_details.proxy);
-  DCHECK(session_details.cancellable);
-  DCHECK(!session_details.session_handle.empty());
-  DCHECK(session_details.pipewire_stream_node_id > 0);
-  return {.session_details = std::move(session_details)};
-}
-#endif
-
-void WaylandDesktopCapturer::OnScreenCastRequestResult(RequestResponse result,
-                                                       uint32_t stream_node_id,
-                                                       int fd) {
-  base_capturer_pipewire_.OnScreenCastRequestResult(result, stream_node_id, fd);
-  if (result == RequestResponse::kSuccess) {
-    WaylandManager::Get()->OnDesktopCapturerMetadata(GetMetadata());
-    WaylandManager::Get()->AddUpdateScreenResolutionCallback(
-        base::BindRepeating(&WaylandDesktopCapturer::SetScreenResolution,
-                            weak_factory_.GetWeakPtr()));
-  } else {
-    LOG(WARNING) << "Screen cast request didn't succeed, injector won't be "
-                    "enabled";
-  }
-}
-
-void WaylandDesktopCapturer::OnScreenCastSessionClosed() {
-  base_capturer_pipewire_.OnScreenCastSessionClosed();
-}
-
-bool WaylandDesktopCapturer::SupportsFrameCallbacks() {
-  return true;
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_desktop_capturer.h b/remoting/host/linux/wayland_desktop_capturer.h
deleted file mode 100644
index 66013c06..0000000
--- a/remoting/host/linux/wayland_desktop_capturer.h
+++ /dev/null
@@ -1,58 +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 REMOTING_HOST_LINUX_WAYLAND_DESKTOP_CAPTURER_H_
-#define REMOTING_HOST_LINUX_WAYLAND_DESKTOP_CAPTURER_H_
-
-#include "base/memory/weak_ptr.h"
-#include "remoting/host/base/screen_resolution.h"
-#include "remoting/protocol/desktop_capturer.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_metadata.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "third_party/webrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.h"
-
-namespace remoting {
-
-class WaylandDesktopCapturer : public DesktopCapturer,
-                               public webrtc::ScreenCastPortal::PortalNotifier {
- public:
-  explicit WaylandDesktopCapturer(const webrtc::DesktopCaptureOptions& options);
-  WaylandDesktopCapturer(const WaylandDesktopCapturer&) = delete;
-  WaylandDesktopCapturer& operator=(const WaylandDesktopCapturer&) = delete;
-  ~WaylandDesktopCapturer() override;
-
-  // DesktopCapturer interface.
-  void Start(Callback* delegate) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool SupportsFrameCallbacks() override;
-  void SetMaxFrameRate(uint32_t max_frame_rate) override;
-
-  // PortalNotifier interface.
-  void OnScreenCastRequestResult(webrtc::xdg_portal::RequestResponse result,
-                                 uint32_t stream_node_id,
-                                 int fd) override;
-  void OnScreenCastSessionClosed() override;
-
-  void SetScreenResolution(ScreenResolution resolution,
-                           webrtc::ScreenId screen_id);
-
-#if defined(WEBRTC_USE_GIO)
-  // Gets session related details in the metadata so that input injection
-  // module can make use of the same remote desktop session to inject inputs
-  // on the remote host. This must be called only if capturer has been
-  // successfully started.
-  webrtc::DesktopCaptureMetadata GetMetadata() override;
-#endif
-
- private:
-  webrtc::BaseCapturerPipeWire base_capturer_pipewire_;
-  base::WeakPtrFactory<WaylandDesktopCapturer> weak_factory_{this};
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_DESKTOP_CAPTURER_H_
diff --git a/remoting/host/linux/wayland_display.cc b/remoting/host/linux/wayland_display.cc
deleted file mode 100644
index 7e891cf8..0000000
--- a/remoting/host/linux/wayland_display.cc
+++ /dev/null
@@ -1,256 +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.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
-#include "remoting/host/linux/wayland_display.h"
-
-#include <vector>
-
-#include "base/check.h"
-#include "base/hash/hash.h"
-#include "remoting/base/logging.h"
-
-namespace remoting {
-
-namespace {
-
-constexpr int kOutputInterfaceVersion = 2;
-constexpr int kZxdgOutputManagerVersion = 3;
-
-}  // namespace
-
-WaylandDisplay::WaylandDisplay()
-    : wl_output_listener_({
-          .geometry = OnGeometryEvent,
-          .mode = OnModeEvent,
-          .done = OnDoneEvent,
-          .scale = OnScaleEvent,
-      }),
-      xdg_output_listener_({
-          OnXdgOutputLogicalPositionEvent,
-          OnXdgOutputLogicalSizeEvent,
-          OnXdgOutputDoneEvent,
-          OnXdgOutputNameEvent,
-          OnXdgOutputDescriptionEvent,
-      }) {}
-
-WaylandDisplay::~WaylandDisplay() = default;
-
-void WaylandDisplay::HandleGlobalDisplayEvent(struct wl_registry* registry,
-                                              uint32_t name,
-                                              const char* interface,
-                                              uint32_t version) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(registry);
-  DCHECK(strcmp(interface, wl_output_interface.name) == 0 ||
-         strcmp(interface, zxdg_output_manager_v1_interface.name) == 0);
-  if (strcmp(interface, wl_output_interface.name) == 0) {
-    DisplayInfo& display_info = display_info_.emplace_back();
-    display_info.id = name;
-    display_info.output = static_cast<wl_output*>(wl_registry_bind(
-        registry, name, &wl_output_interface, kOutputInterfaceVersion));
-    wl_output_add_listener(display_info.output, &wl_output_listener_,
-                           &display_info);
-    InitXdgOutputIfPossible(display_info);
-
-  } else if (strcmp(interface, zxdg_output_manager_v1_interface.name) == 0) {
-    xdg_output_manager_ = static_cast<zxdg_output_manager_v1*>(
-        wl_registry_bind(registry, name, &zxdg_output_manager_v1_interface,
-                         kZxdgOutputManagerVersion));
-
-    // Ensure that any partially initialized displays are now initialized.
-    FinishPartialXdgOutputInitializations();
-  }
-}
-
-bool WaylandDisplay::HandleGlobalRemoveDisplayEvent(uint32_t name) {
-  size_t num_removed = std::erase_if(
-      display_info_,
-      [name](const auto& display_info) { return display_info.id == name; });
-  DCHECK(num_removed <= 1)
-      << "Duplicate displays removed. This is either chromoting bug or a bug "
-      << "in wayland compositor";
-  return num_removed >= 1;
-}
-
-void WaylandDisplay::InitXdgOutputIfPossible(DisplayInfo& display_info) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!xdg_output_manager_) {
-    return;
-  }
-  display_info.xdg_output = zxdg_output_manager_v1_get_xdg_output(
-      xdg_output_manager_, display_info.output);
-  zxdg_output_v1_add_listener(display_info.xdg_output, &xdg_output_listener_,
-                              &display_info);
-}
-
-void WaylandDisplay::FinishPartialXdgOutputInitializations() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (auto& display_info : display_info_) {
-    if (display_info.xdg_output) {
-      continue;
-    }
-    display_info.xdg_output = zxdg_output_manager_v1_get_xdg_output(
-        xdg_output_manager_.get(), display_info.output);
-    zxdg_output_v1_add_listener(display_info.xdg_output, &xdg_output_listener_,
-                                &display_info);
-  }
-}
-
-// static
-void WaylandDisplay::UpdateDisplayInfo(DisplayInfo display_info,
-                                       DisplayInfo& existing_info) {
-  if (!existing_info.last_write_from_xdg) {
-    if (display_info.x > -1) {
-      existing_info.x = display_info.x;
-    }
-    if (display_info.y > -1) {
-      existing_info.y = display_info.y;
-    }
-  }
-  if (display_info.width > -1) {
-    existing_info.width = display_info.width;
-  }
-  if (display_info.height > -1) {
-    existing_info.height = display_info.height;
-  }
-  if (display_info.physical_width > -1) {
-    existing_info.physical_width = display_info.physical_width;
-  }
-  if (display_info.physical_height > -1) {
-    existing_info.physical_height = display_info.physical_height;
-  }
-  if (display_info.transform > -1) {
-    existing_info.transform = display_info.transform;
-  }
-  if (display_info.refresh > -1) {
-    existing_info.refresh = display_info.refresh;
-  }
-  if (display_info.subpixel > -1) {
-    existing_info.subpixel = display_info.subpixel;
-  }
-  if (display_info.scale_factor != 1) {
-    existing_info.scale_factor = display_info.scale_factor;
-  }
-}
-
-// static
-void WaylandDisplay::OnGeometryEvent(void* data,
-                                     wl_output* wl_output,
-                                     int x,
-                                     int y,
-                                     int physical_width,
-                                     int physical_height,
-                                     int subpixel,
-                                     const char* make,
-                                     const char* model,
-                                     int transform) {
-  UpdateDisplayInfo(
-      DisplayInfo(x, y, transform, physical_width, physical_height, subpixel),
-      *static_cast<DisplayInfo*>(data));
-}
-
-// static
-void WaylandDisplay::OnModeEvent(void* data,
-                                 wl_output* wl_output,
-                                 uint flags,
-                                 int width,
-                                 int height,
-                                 int refresh) {
-  UpdateDisplayInfo(DisplayInfo(width, height, refresh),
-                    *static_cast<DisplayInfo*>(data));
-}
-
-// static
-void WaylandDisplay::OnDoneEvent(void* data, wl_output* wl_output) {}
-
-// static
-void WaylandDisplay::OnScaleEvent(void* data,
-                                  wl_output* wl_output,
-                                  int factor) {
-  UpdateDisplayInfo(DisplayInfo(factor), *static_cast<DisplayInfo*>(data));
-}
-
-// static
-void WaylandDisplay::OnXdgOutputLogicalPositionEvent(
-    void* data,
-    struct zxdg_output_v1* xdg_output,
-    int32_t x,
-    int32_t y) {
-  DisplayInfo* display_info = static_cast<DisplayInfo*>(data);
-  display_info->x = x;
-  display_info->y = y;
-  display_info->last_write_from_xdg = true;
-}
-
-// static
-void WaylandDisplay::OnXdgOutputLogicalSizeEvent(
-    void* data,
-    struct zxdg_output_v1* xdg_output,
-    int32_t width,
-    int32_t height) {
-  DisplayInfo* display_info = static_cast<DisplayInfo*>(data);
-  display_info->width = width;
-  display_info->height = height;
-}
-
-// static
-void WaylandDisplay::OnXdgOutputDoneEvent(void* data,
-                                          struct zxdg_output_v1* xdg_output) {}
-
-// static
-void WaylandDisplay::OnXdgOutputNameEvent(void* data,
-                                          struct zxdg_output_v1* xdg_output,
-                                          const char* name) {
-  if (!name) {
-    LOG(WARNING) << __func__ << " No monitor name found";
-    return;
-  }
-  DisplayInfo* display_info = static_cast<DisplayInfo*>(data);
-  DCHECK(display_info);
-  display_info->name = name;
-}
-
-// static
-void WaylandDisplay::OnXdgOutputDescriptionEvent(
-    void* data,
-    struct zxdg_output_v1* xdg_output,
-    const char* description) {
-  if (!description) {
-    LOG(WARNING) << __func__ << " No monitor description found";
-    return;
-  }
-  DisplayInfo* display_info = static_cast<DisplayInfo*>(data);
-  display_info->description = description;
-}
-
-DesktopDisplayInfo WaylandDisplay::GetCurrentDisplayInfo() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DesktopDisplayInfo result;
-  for (const auto& display_info : display_info_) {
-    if (display_info.name.empty()) {
-      continue;
-    }
-    DCHECK(display_info.x >= 0);
-    DCHECK(display_info.y >= 0);
-    DCHECK(display_info.width >= 0);
-    DCHECK(display_info.height >= 0);
-    result.AddDisplay(
-        {static_cast<webrtc::ScreenId>(base::Hash(display_info.name)),
-         display_info.x, display_info.y,
-         static_cast<uint32_t>(display_info.width),
-         static_cast<uint32_t>(display_info.height),
-         /* dpi */ 0,
-         /* bpp */ 0,
-         /* is_default */ false,
-         /* display_name */ std::string()});
-  }
-  return result;
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_display.h b/remoting/host/linux/wayland_display.h
deleted file mode 100644
index 3eed0b4d..0000000
--- a/remoting/host/linux/wayland_display.h
+++ /dev/null
@@ -1,99 +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 REMOTING_HOST_LINUX_WAYLAND_DISPLAY_H_
-#define REMOTING_HOST_LINUX_WAYLAND_DISPLAY_H_
-
-#include <string>
-#include <vector>
-
-#include <xdg-output-unstable-v1-client-protocol.h>
-
-#include "base/memory/raw_ptr.h"
-#include "base/sequence_checker.h"
-#include "remoting/base/logging.h"
-#include "remoting/host/desktop_display_info.h"
-#include "remoting/host/linux/wayland_display_info.h"
-
-namespace remoting {
-
-// This class gathers information about the Wayland Output / Display by
-// binding to wl_output and zxdg_output_v1 interfaces provided by the protocol.
-class WaylandDisplay {
- public:
-  WaylandDisplay();
-  ~WaylandDisplay();
-
-  WaylandDisplay(const WaylandDisplay&) = delete;
-  WaylandDisplay& operator=(const WaylandDisplay&) = delete;
-
-  // Handles output related global events (that are emitted for each display
-  // present on the system).
-  // Does not take ownership of |registry|
-  void HandleGlobalDisplayEvent(struct wl_registry* registry,
-                                uint32_t name,
-                                const char* interface,
-                                uint32_t version);
-
-  // Returns true if the global object being removed was in fact a display
-  // object.
-  bool HandleGlobalRemoveDisplayEvent(uint32_t name);
-
-  DesktopDisplayInfo GetCurrentDisplayInfo() const;
-
- private:
-  void InitXdgOutputIfPossible(DisplayInfo& display_info);
-  void FinishPartialXdgOutputInitializations();
-  static void UpdateDisplayInfo(DisplayInfo display_info,
-                                DisplayInfo& existing_info);
-
-  // wl_output interface event handlers.
-  static void OnGeometryEvent(void* data,
-                              wl_output* wl_output,
-                              int x,
-                              int y,
-                              int physical_width,
-                              int physical_height,
-                              int subpixel,
-                              const char* make,
-                              const char* model,
-                              int transform);
-  static void OnModeEvent(void* data,
-                          wl_output* wl_output,
-                          uint flags,
-                          int width,
-                          int height,
-                          int refresh);
-  static void OnDoneEvent(void* data, wl_output* wl_output);
-  static void OnScaleEvent(void* data, wl_output* wl_output, int factor);
-
-  // zxdg_output_v1 interface event handlers.
-  static void OnXdgOutputLogicalPositionEvent(void* data,
-                                              struct zxdg_output_v1* xdg_output,
-                                              int32_t x,
-                                              int32_t y);
-  static void OnXdgOutputLogicalSizeEvent(void* data,
-                                          struct zxdg_output_v1* xdg_output,
-                                          int32_t width,
-                                          int32_t height);
-  static void OnXdgOutputDoneEvent(void* data,
-                                   struct zxdg_output_v1* xdg_output);
-  static void OnXdgOutputNameEvent(void* data,
-                                   struct zxdg_output_v1* xdg_output,
-                                   const char* name);
-  static void OnXdgOutputDescriptionEvent(void* data,
-                                          struct zxdg_output_v1* xdg_output,
-                                          const char* description);
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  const struct wl_output_listener wl_output_listener_;
-  const struct zxdg_output_v1_listener xdg_output_listener_;
-  raw_ptr<struct zxdg_output_manager_v1> xdg_output_manager_ = nullptr;
-  std::vector<DisplayInfo> display_info_;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_DISPLAY_H_
diff --git a/remoting/host/linux/wayland_display_info.cc b/remoting/host/linux/wayland_display_info.cc
deleted file mode 100644
index 04feb0a..0000000
--- a/remoting/host/linux/wayland_display_info.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "remoting/host/linux/wayland_display_info.h"
-
-namespace remoting {
-
-DisplayInfo::DisplayInfo() = default;
-
-DisplayInfo::DisplayInfo(int x,
-                         int y,
-                         int transform,
-                         int physical_width,
-                         int physical_height,
-                         int subpixel)
-    : x(x),
-      y(y),
-      transform(transform),
-      physical_width(physical_width),
-      physical_height(physical_height),
-      subpixel(subpixel) {}
-
-DisplayInfo::DisplayInfo(int width, int height, int refresh)
-    : width(width), height(height), refresh(refresh) {}
-
-DisplayInfo::DisplayInfo(int scale_factor) : scale_factor(scale_factor) {}
-
-DisplayInfo::DisplayInfo(const DisplayInfo&) = default;
-DisplayInfo::DisplayInfo(DisplayInfo&&) = default;
-DisplayInfo& DisplayInfo::operator=(const DisplayInfo&) = default;
-DisplayInfo& DisplayInfo::operator=(DisplayInfo&) = default;
-DisplayInfo::~DisplayInfo() = default;
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_display_info.h b/remoting/host/linux/wayland_display_info.h
deleted file mode 100644
index 62cbead..0000000
--- a/remoting/host/linux/wayland_display_info.h
+++ /dev/null
@@ -1,59 +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 REMOTING_HOST_LINUX_WAYLAND_DISPLAY_INFO_H_
-#define REMOTING_HOST_LINUX_WAYLAND_DISPLAY_INFO_H_
-
-#include <string>
-
-#include <xdg-output-unstable-v1-client-protocol.h>
-
-#include "base/memory/raw_ptr.h"
-
-namespace remoting {
-
-// Collection of parameters for each Wayland Display object available on the
-// system.
-struct DisplayInfo {
-  DisplayInfo();
-  DisplayInfo(int x,
-              int y,
-              int transform,
-              int physical_width,
-              int physical_height,
-              int subpixel);
-  DisplayInfo(int width, int height, int refresh);
-  DisplayInfo(int scale_factor);
-  DisplayInfo(const DisplayInfo&);
-  DisplayInfo(DisplayInfo&&);
-  DisplayInfo& operator=(const DisplayInfo&);
-  DisplayInfo& operator=(DisplayInfo&);
-  ~DisplayInfo();
-
-  uint32_t id;
-  std::string name;
-  std::string description;
-  int scale_factor = 1;
-  int x = -1;
-  int y = -1;
-  int width = -1;
-  int height = -1;
-  int refresh = -1;
-  int transform = -1;
-  int physical_width = -1;
-  int physical_height = -1;
-  int subpixel = -1;
-
-  raw_ptr<struct wl_output> output = nullptr;
-  raw_ptr<struct zxdg_output_v1> xdg_output = nullptr;
-
-  // Whether last write to x, y was done by an event emitted from the xdg_output
-  // interface. If yes, we would to preserve these writes over the ones from
-  // wl_output interface.
-  bool last_write_from_xdg = false;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_DISPLAY_INFO_H_
diff --git a/remoting/host/linux/wayland_keyboard.cc b/remoting/host/linux/wayland_keyboard.cc
deleted file mode 100644
index 40d9b36..0000000
--- a/remoting/host/linux/wayland_keyboard.cc
+++ /dev/null
@@ -1,109 +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.
-
-#include "remoting/host/linux/wayland_keyboard.h"
-
-#include <sys/mman.h>
-
-#include "base/memory/ptr_util.h"
-#include "base/memory/shared_memory_mapper.h"
-#include "base/memory/shared_memory_mapping.h"
-#include "base/notreached.h"
-#include "base/unguessable_token.h"
-#include "remoting/base/logging.h"
-#include "remoting/host/linux/wayland_manager.h"
-
-namespace remoting {
-
-WaylandKeyboard::WaylandKeyboard(struct wl_seat* wl_seat)
-    : wl_seat_(wl_seat), wl_keyboard_(wl_seat_get_keyboard(wl_seat_.get())) {
-  wl_keyboard_add_listener(wl_keyboard_, &wl_keyboard_listener_, this);
-}
-
-WaylandKeyboard::~WaylandKeyboard() {
-  wl_keyboard_release(wl_keyboard_.get());
-  wl_keyboard_ = nullptr;
-  xkb_context_unref(xkb_context_.get());
-}
-
-// static
-void WaylandKeyboard::OnKeyEvent(void* data,
-                                 struct wl_keyboard* wl_keyboard,
-                                 uint32_t serial,
-                                 uint32_t time,
-                                 uint32_t key,
-                                 uint32_t state) {
-  NOTIMPLEMENTED();
-}
-
-// static
-void WaylandKeyboard::OnKeyMapEvent(void* data,
-                                    struct wl_keyboard* wl_keyboard,
-                                    uint32_t format,
-                                    int32_t fd,
-                                    uint32_t size) {
-  WaylandKeyboard* wayland_keyboard = static_cast<WaylandKeyboard*>(data);
-  DCHECK(wayland_keyboard);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(wayland_keyboard->sequence_checker_);
-
-  DCHECK(format == WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1)
-      << "Unexpected keymap format";
-
-  char* mmapped_keymap =
-      static_cast<char*>(mmap(nullptr, size, PROT_READ, MAP_SHARED, fd, 0));
-
-  if (mmapped_keymap == MAP_FAILED) {
-    LOG(ERROR) << "Failed to mmap keymap";
-    return;
-  }
-
-  XkbKeyMapUniquePtr xkb_keymap;
-  xkb_keymap.reset(xkb_keymap_new_from_string(
-      wayland_keyboard->xkb_context_.get(), mmapped_keymap,
-      XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS));
-
-  munmap(mmapped_keymap, size);
-  WaylandManager::Get()->OnKeyboardLayout(std::move(xkb_keymap));
-}
-
-// static
-void WaylandKeyboard::OnKeyboardEnterEvent(void* data,
-                                           struct wl_keyboard* wl_keyboard,
-                                           uint32_t serial,
-                                           struct wl_surface* surface,
-                                           struct wl_array* keys) {
-  // We don't have a surface associated so the keyboard will not enter
-  // any surface. We provide the event handler in any case since otherwise
-  // the Wayland compositor might crash.
-  NOTIMPLEMENTED();
-}
-
-// static
-void WaylandKeyboard::OnKeyboardLeaveEvent(void* data,
-                                           struct wl_keyboard* wl_keyboard,
-                                           uint32_t serial,
-                                           struct wl_surface* surface) {
-  NOTIMPLEMENTED();
-}
-
-// static
-void WaylandKeyboard::OnModifiersEvent(void* data,
-                                       struct wl_keyboard* wl_keyboard,
-                                       uint32_t serial,
-                                       uint32_t mods_depressed,
-                                       uint32_t mods_latched,
-                                       uint32_t mods_locked,
-                                       uint32_t group) {
-  WaylandManager::Get()->OnKeyboardModifiers(group);
-}
-
-// static
-void WaylandKeyboard::OnRepeatInfoEvent(void* data,
-                                        struct wl_keyboard* wl_keyboard,
-                                        int32_t rate,
-                                        int32_t delay) {
-  NOTIMPLEMENTED();
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_keyboard.h b/remoting/host/linux/wayland_keyboard.h
deleted file mode 100644
index ca54ba1..0000000
--- a/remoting/host/linux/wayland_keyboard.h
+++ /dev/null
@@ -1,78 +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 REMOTING_HOST_LINUX_WAYLAND_KEYBOARD_H_
-#define REMOTING_HOST_LINUX_WAYLAND_KEYBOARD_H_
-
-#include <wayland-client.h>
-#include <xkbcommon/xkbcommon.h>
-
-#include "base/memory/raw_ptr.h"
-#include "base/sequence_checker.h"
-#include "remoting/host/linux/keyboard_layout_monitor_utils.h"
-
-namespace remoting {
-
-class WaylandKeyboard {
- public:
-  // |wl_seat| must outlive this class.
-  explicit WaylandKeyboard(struct wl_seat* wl_seat);
-  WaylandKeyboard(const WaylandKeyboard&) = delete;
-  WaylandKeyboard& operator=(const WaylandKeyboard&) = delete;
-
-  ~WaylandKeyboard();
-
- private:
-  static void OnKeyEvent(void* data,
-                         struct wl_keyboard* wl_keyboard,
-                         uint32_t serial,
-                         uint32_t time,
-                         uint32_t key,
-                         uint32_t state);
-  static void OnKeyMapEvent(void* data,
-                            struct wl_keyboard* wl_keyboard,
-                            uint32_t format,
-                            int32_t fd,
-                            uint32_t size);
-  static void OnKeyboardEnterEvent(void* data,
-                                   struct wl_keyboard* wl_keyboard,
-                                   uint32_t serial,
-                                   struct wl_surface* surface,
-                                   struct wl_array* keys);
-  static void OnKeyboardLeaveEvent(void* data,
-                                   struct wl_keyboard* wl_keyboard,
-                                   uint32_t serial,
-                                   struct wl_surface* surface);
-  static void OnModifiersEvent(void* data,
-                               struct wl_keyboard* wl_keyboard,
-                               uint32_t serial,
-                               uint32_t mods_depressed,
-                               uint32_t mods_latched,
-                               uint32_t mods_locked,
-                               uint32_t group);
-  static void OnRepeatInfoEvent(void* data,
-                                struct wl_keyboard* wl_keyboard,
-                                int32_t rate,
-                                int32_t delay);
-
-  const struct wl_keyboard_listener wl_keyboard_listener_ = {
-      .keymap = OnKeyMapEvent,
-      .enter = OnKeyboardEnterEvent,
-      .leave = OnKeyboardLeaveEvent,
-      .key = OnKeyEvent,
-      .modifiers = OnModifiersEvent,
-      .repeat_info = OnRepeatInfoEvent,
-  };
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  raw_ptr<struct wl_seat> wl_seat_ = nullptr;
-  raw_ptr<struct wl_keyboard> wl_keyboard_ = nullptr;
-  raw_ptr<struct xkb_context> xkb_context_ =
-      xkb_context_new(XKB_CONTEXT_NO_FLAGS);
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_KEYBOARD_H_
diff --git a/remoting/host/linux/wayland_manager.cc b/remoting/host/linux/wayland_manager.cc
deleted file mode 100644
index 6b4a852..0000000
--- a/remoting/host/linux/wayland_manager.cc
+++ /dev/null
@@ -1,339 +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.
-
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/base/logging.h"
-
-#include "base/no_destructor.h"
-#include "base/task/bind_post_task.h"
-#include "base/task/single_thread_task_runner.h"
-
-namespace remoting {
-
-WaylandManager::WaylandManager() {}
-
-WaylandManager::~WaylandManager() {}
-
-// static
-WaylandManager* WaylandManager::Get() {
-  static base::NoDestructor<WaylandManager> instance;
-  return instance.get();
-}
-
-void WaylandManager::Init(
-    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
-  ui_task_runner_ = ui_task_runner;
-  const char* wayland_display = getenv("WAYLAND_DISPLAY");
-  if (!wayland_display) {
-    LOG(WARNING) << "WAYLAND_DISPLAY env variable is not set";
-    return;
-  }
-  wayland_connection_ =
-      std::make_unique<WaylandConnection>(getenv("WAYLAND_DISPLAY"));
-}
-
-void WaylandManager::CleanupRunnerForTest() {
-  ui_task_runner_ = nullptr;
-}
-
-void WaylandManager::AddCapturerMetadataCallback(
-    DesktopMetadataCallback callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::AddCapturerMetadataCallback,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  capturer_metadata_callback_ = std::move(callback);
-}
-
-void WaylandManager::AddCapturerDestroyedCallback(base::OnceClosure callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::AddCapturerDestroyedCallback,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  capturer_destroyed_callback_ = std::move(callback);
-}
-
-void WaylandManager::OnDesktopCapturerMetadata(
-    webrtc::DesktopCaptureMetadata metadata) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnDesktopCapturerMetadata,
-                                  base::Unretained(this), std::move(metadata)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (capturer_metadata_callback_) {
-    capturer_metadata_callback_.Run(std::move(metadata));
-  } else {
-    LOG(ERROR) << "Expected the capturer metadata observer to have register "
-               << "a callback by now";
-  }
-}
-
-void WaylandManager::OnDesktopCapturerDestroyed() {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnDesktopCapturerDestroyed,
-                                  base::Unretained(this)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (capturer_destroyed_callback_) {
-    std::move(capturer_destroyed_callback_).Run();
-  } else {
-    LOG(ERROR) << "Expected the capturer destruction observer to have register "
-               << "a callback by now";
-  }
-}
-
-void WaylandManager::AddClipboardMetadataCallback(
-    DesktopMetadataCallback callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::AddClipboardMetadataCallback,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  clipboard_metadata_callback_ = std::move(callback);
-}
-
-void WaylandManager::OnClipboardMetadata(
-    webrtc::DesktopCaptureMetadata metadata) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnClipboardMetadata,
-                                  base::Unretained(this), std::move(metadata)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (clipboard_metadata_callback_) {
-    clipboard_metadata_callback_.Run(std::move(metadata));
-  } else {
-    LOG(WARNING) << "Expected the clipboard observer to have registered "
-                 << "a callback by now";
-  }
-}
-
-void WaylandManager::AddUpdateScreenResolutionCallback(
-    UpdateScreenResolutionCallback callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::AddUpdateScreenResolutionCallback,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  screen_resolution_callback_ = std::move(callback);
-}
-
-void WaylandManager::OnUpdateScreenResolution(ScreenResolution resolution,
-                                              webrtc::ScreenId screen_id) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnUpdateScreenResolution,
-                                  base::Unretained(this), std::move(resolution),
-                                  screen_id));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (screen_resolution_callback_) {
-    screen_resolution_callback_.Run(std::move(resolution), screen_id);
-  } else {
-    LOG(WARNING) << "Expected the screen resolution observer to have register "
-                 << "a callback by now";
-  }
-}
-
-void WaylandManager::SetSeatPresentCallback(
-    WaylandSeat::OnSeatPresentCallback callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::SetSeatPresentCallback,
-                                  base::Unretained(this), std::move(callback)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  wayland_connection_->SetSeatPresentCallback(std::move(callback));
-}
-
-void WaylandManager::SetKeyboardLayoutCallback(
-    KeyboardLayoutCallback callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::SetKeyboardLayoutCallback,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  keyboard_layout_callback_ = std::move(callback);
-  if (keymap_) {
-    keyboard_layout_callback_.Run(std::move(keymap_));
-  }
-}
-
-void WaylandManager::OnKeyboardLayout(XkbKeyMapUniquePtr keymap) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnKeyboardLayout,
-                                  base::Unretained(this), std::move(keymap)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (keyboard_layout_callback_) {
-    keyboard_layout_callback_.Run(std::move(keymap));
-  } else {
-    keymap_ = std::move(keymap);
-  }
-}
-
-void WaylandManager::AddKeyboardModifiersCallback(
-    KeyboardModifiersCallback callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::AddKeyboardModifiersCallback,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  keyboard_modifier_callbacks_.AddUnsafe(std::move(callback));
-}
-
-void WaylandManager::SetCapabilityCallbacks(
-    base::OnceClosure keyboard_capability_callback,
-    base::OnceClosure pointer_capability_callback) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::SetCapabilityCallbacks,
-                       base::Unretained(this),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(keyboard_capability_callback)),
-                       base::BindPostTask(
-                           base::SingleThreadTaskRunner::GetCurrentDefault(),
-                           std::move(pointer_capability_callback))));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  keyboard_capability_callback_ = std::move(keyboard_capability_callback);
-  pointer_capability_callback_ = std::move(pointer_capability_callback);
-  if (is_keyboard_capability_acquired_) {
-    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, std::move(keyboard_capability_callback_));
-  }
-  if (is_pointer_capability_acquired_) {
-    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, std::move(pointer_capability_callback_));
-  }
-}
-
-void WaylandManager::OnSeatKeyboardCapabilityRevoked() {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::OnSeatKeyboardCapabilityRevoked,
-                       base::Unretained(this)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  is_keyboard_capability_acquired_ = false;
-}
-
-void WaylandManager::OnSeatKeyboardCapability() {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnSeatKeyboardCapability,
-                                  base::Unretained(this)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  is_keyboard_capability_acquired_ = true;
-
-  const uint32_t seat_id = wayland_connection_->GetSeatId();
-  if (!keyboard_capability_callback_) {
-    LOG(WARNING) << "Seat (" << seat_id << ") gained keyboard capability "
-                 << "before a listener is registered.";
-  } else {
-    std::move(keyboard_capability_callback_).Run();
-  }
-}
-
-void WaylandManager::OnSeatPointerCapabilityRevoked() {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WaylandManager::OnSeatPointerCapabilityRevoked,
-                       base::Unretained(this)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  is_pointer_capability_acquired_ = false;
-}
-
-void WaylandManager::OnSeatPointerCapability() {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnSeatPointerCapability,
-                                  base::Unretained(this)));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  is_pointer_capability_acquired_ = true;
-
-  const uint32_t seat_id = wayland_connection_->GetSeatId();
-  if (!pointer_capability_callback_) {
-    LOG(WARNING) << "Seat (" << seat_id << ") gained pointer capability "
-                 << "before a listener is registered.";
-  } else {
-    std::move(pointer_capability_callback_).Run();
-  }
-}
-
-void WaylandManager::OnKeyboardModifiers(uint32_t group) {
-  if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
-    ui_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&WaylandManager::OnKeyboardModifiers,
-                                  base::Unretained(this), group));
-    return;
-  }
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  keyboard_modifier_callbacks_.Notify(group);
-}
-
-DesktopDisplayInfo WaylandManager::GetCurrentDisplayInfo() {
-  return wayland_connection_->GetCurrentDisplayInfo();
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_manager.h b/remoting/host/linux/wayland_manager.h
deleted file mode 100644
index b1039cde..0000000
--- a/remoting/host/linux/wayland_manager.h
+++ /dev/null
@@ -1,162 +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 REMOTING_HOST_LINUX_WAYLAND_MANAGER_H_
-#define REMOTING_HOST_LINUX_WAYLAND_MANAGER_H_
-
-#include <memory>
-
-#include <xkbcommon/xkbcommon.h>
-
-#include "base/callback_list.h"
-#include "base/functional/callback.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/task/single_thread_task_runner.h"
-#include "remoting/host/base/screen_resolution.h"
-#include "remoting/host/linux/wayland_connection.h"
-#include "remoting/host/linux/wayland_display.h"
-#include "remoting/host/linux/wayland_seat.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_metadata.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
-
-namespace remoting {
-
-// Helper class that facilitates interaction of different Wayland related
-// components under chromoting.
-class WaylandManager {
- public:
-  using DesktopMetadataCallbackSignature = void(webrtc::DesktopCaptureMetadata);
-  using DesktopMetadataCallback =
-      base::RepeatingCallback<DesktopMetadataCallbackSignature>;
-  using UpdateScreenResolutionSignature = void(ScreenResolution,
-                                               webrtc::ScreenId);
-  using UpdateScreenResolutionCallback =
-      base::RepeatingCallback<UpdateScreenResolutionSignature>;
-  using KeyboardLayoutCallback =
-      base::RepeatingCallback<void(XkbKeyMapUniquePtr)>;
-  using KeyboardModifiersCallbackSignature = void(uint32_t group);
-  using KeyboardModifiersCallback =
-      base::RepeatingCallback<KeyboardModifiersCallbackSignature>;
-  using ClipboardMetadataCallbackSignature =
-      void(webrtc::DesktopCaptureMetadata);
-  using ClipboardMetadataCallback =
-      base::RepeatingCallback<ClipboardMetadataCallbackSignature>;
-
-  WaylandManager();
-  ~WaylandManager();
-  WaylandManager(const WaylandManager&) = delete;
-  WaylandManager& operator=(const WaylandManager&) = delete;
-
-  static WaylandManager* Get();
-
-  // Cleans up reference to runner. (Needed only for testing)
-  void CleanupRunnerForTest();
-
-  // The singleton instance should be initialized by the host process on the
-  // UI thread right after creation.
-  void Init(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
-
-  // Adds callback to be invoked when a desktop capturer has metadata available.
-  void AddCapturerMetadataCallback(DesktopMetadataCallback callback);
-
-  // Adds callback to be invoked when a desktop capturer is destroyed.
-  // TODO(crbug.com/40266740): This would need to be enhanced when supporting
-  // multiple desktops/capturers.
-  void AddCapturerDestroyedCallback(base::OnceClosure callback);
-
-  // Invoked by the desktop capturer(s), upon successful start.
-  void OnDesktopCapturerMetadata(webrtc::DesktopCaptureMetadata metadata);
-
-  // Invoked by the desktop capturer(s), upon destruction.
-  // TODO(crbug.com/40266740): This would need to be enhanced when supporting
-  // multiple desktops/capturers and is likely going to notify the listener only
-  // when the last desktop capturer is destroyed.
-  void OnDesktopCapturerDestroyed();
-
-  // Adds callback to be invoked when clipboard has metadata available.
-  void AddClipboardMetadataCallback(DesktopMetadataCallback callback);
-
-  // Invoked by the clipboard portal upon a successful start.
-  void OnClipboardMetadata(webrtc::DesktopCaptureMetadata metadata);
-
-  // Adds callback to be invoked when screen resolution is updated by the
-  // desktop resizer.
-  void AddUpdateScreenResolutionCallback(
-      UpdateScreenResolutionCallback callback);
-
-  // Invoked by the desktop_resizer_wayland upon screen resolution update from
-  // resizing_host_observer.
-  void OnUpdateScreenResolution(ScreenResolution resolution,
-                                webrtc::ScreenId screen_id);
-
-  // Sets callback to be invoked when new keyboard layout is detected.
-  void SetKeyboardLayoutCallback(KeyboardLayoutCallback callback);
-
-  // Invoked by the wayland keyboard, upon detecting a new keyboard layout
-  // mapping from the compositor.
-  void OnKeyboardLayout(XkbKeyMapUniquePtr);
-
-  // Adds callback to be invoked when new keyboard layout is detected.
-  void AddKeyboardModifiersCallback(KeyboardModifiersCallback callback);
-
-  // Invoked by the wayland keyboard, upon detecting a keyboard modifier
-  // changes from the compositor.
-  void OnKeyboardModifiers(uint32_t group);
-
-  // Gets the current information about displays available on the host.
-  DesktopDisplayInfo GetCurrentDisplayInfo();
-
-  void SetSeatPresentCallback(WaylandSeat::OnSeatPresentCallback callback);
-
-  // Sets callback to be invoked when the associated seat gains a keyboard or
-  // pointer capability.
-  void SetCapabilityCallbacks(base::OnceClosure keyboard_capability_callback,
-                              base::OnceClosure pointer_capability_callback);
-
- private:
-  friend class WaylandSeat;
-
-  // Invoked by wayland seat when wayland keyboard capability changes.
-  void OnSeatKeyboardCapability();
-  void OnSeatKeyboardCapabilityRevoked();
-
-  // Invoked by wayland seat when wayland pointer capability changes.
-  void OnSeatPointerCapability();
-  void OnSeatPointerCapabilityRevoked();
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
-  std::unique_ptr<WaylandConnection> wayland_connection_;
-  DesktopMetadataCallback capturer_metadata_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  UpdateScreenResolutionCallback screen_resolution_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  KeyboardLayoutCallback keyboard_layout_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  base::RepeatingCallbackList<KeyboardModifiersCallbackSignature>
-      keyboard_modifier_callbacks_ GUARDED_BY_CONTEXT(sequence_checker_);
-  ClipboardMetadataCallback clipboard_metadata_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  base::OnceClosure keyboard_capability_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  base::OnceClosure pointer_capability_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-  base::OnceClosure capturer_destroyed_callback_
-      GUARDED_BY_CONTEXT(sequence_checker_);
-
-  // Keeps track of the latest keymap for the case where the keyboard layout
-  // monitor has not yet registered a callback.
-  XkbKeyMapUniquePtr keymap_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
-
-  bool is_keyboard_capability_acquired_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      false;
-
-  bool is_pointer_capability_acquired_ GUARDED_BY_CONTEXT(sequence_checker_) =
-      false;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_MANAGER_H_
diff --git a/remoting/host/linux/wayland_seat.cc b/remoting/host/linux/wayland_seat.cc
deleted file mode 100644
index 9a5d0d3..0000000
--- a/remoting/host/linux/wayland_seat.cc
+++ /dev/null
@@ -1,96 +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.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
-#include "remoting/host/linux/wayland_seat.h"
-#include "base/task/sequenced_task_runner.h"
-#include "remoting/host/linux/wayland_manager.h"
-
-namespace remoting {
-
-namespace {
-
-constexpr int kSeatInterfaceVersion = 3;
-
-}  // namespace
-
-WaylandSeat::WaylandSeat() = default;
-WaylandSeat::~WaylandSeat() = default;
-
-void WaylandSeat::HandleGlobalSeatEvent(struct wl_registry* registry,
-                                        uint32_t name,
-                                        const char* interface,
-                                        uint32_t version) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(registry);
-  DCHECK(strcmp(interface, wl_seat_interface.name) == 0);
-  seat_id_ = name;
-  wl_seat_ = static_cast<wl_seat*>(wl_registry_bind(
-      registry, name, &wl_seat_interface, kSeatInterfaceVersion));
-  wl_seat_add_listener(wl_seat_, &wl_seat_listener_, this);
-  if (seat_present_callback_) {
-    std::move(seat_present_callback_).Run();
-  }
-}
-
-uint32_t WaylandSeat::GetSeatId() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return seat_id_;
-}
-
-void WaylandSeat::HandleGlobalRemoveSeatEvent(uint32_t name) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(seat_id_, name);
-  seat_id_ = 0;
-}
-
-// static
-void WaylandSeat::OnSeatCapabilitiesEvent(void* data,
-                                          struct wl_seat* wl_seat,
-                                          uint32_t capabilities) {
-  WaylandSeat* wayland_seat = static_cast<WaylandSeat*>(data);
-  DCHECK(wayland_seat);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(wayland_seat->sequence_checker_);
-  const bool has_keyboard = capabilities & WL_SEAT_CAPABILITY_KEYBOARD;
-  const bool has_pointer = capabilities & WL_SEAT_CAPABILITY_POINTER;
-  if (has_keyboard && !wayland_seat->wayland_keyboard_) {
-    wayland_seat->wayland_keyboard_ =
-        std::make_unique<WaylandKeyboard>(wayland_seat->wl_seat_);
-    WaylandManager::Get()->OnSeatKeyboardCapability();
-  } else if (!has_keyboard && wayland_seat->wayland_keyboard_) {
-    WaylandManager::Get()->OnSeatKeyboardCapabilityRevoked();
-    wayland_seat->wayland_keyboard_.reset();
-  }
-
-  if (has_pointer) {
-    WaylandManager::Get()->OnSeatPointerCapability();
-  } else {
-    WaylandManager::Get()->OnSeatPointerCapabilityRevoked();
-  }
-}
-
-// static
-void WaylandSeat::OnSeatNameEvent(void* data,
-                                  struct wl_seat* wl_seat,
-                                  const char* name) {
-  WaylandSeat* wayland_seat = static_cast<WaylandSeat*>(data);
-  DCHECK(wayland_seat);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(wayland_seat->sequence_checker_);
-}
-
-void WaylandSeat::SetSeatPresentCallback(
-    WaylandSeat::OnSeatPresentCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  seat_present_callback_ = std::move(callback);
-  if (seat_id_) {
-    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, std::move(seat_present_callback_));
-  }
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_seat.h b/remoting/host/linux/wayland_seat.h
deleted file mode 100644
index 1f0776a..0000000
--- a/remoting/host/linux/wayland_seat.h
+++ /dev/null
@@ -1,61 +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 REMOTING_HOST_LINUX_WAYLAND_SEAT_H_
-#define REMOTING_HOST_LINUX_WAYLAND_SEAT_H_
-
-#include <wayland-client.h>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/sequence_checker.h"
-#include "remoting/host/linux/wayland_keyboard.h"
-
-namespace remoting {
-
-class WaylandSeat {
- public:
-  using OnSeatPresentCallback = base::OnceCallback<void()>;
-
-  WaylandSeat();
-  ~WaylandSeat();
-
-  WaylandSeat(const WaylandSeat&) = delete;
-  WaylandSeat& operator=(const WaylandSeat&) = delete;
-
-  void HandleGlobalSeatEvent(struct wl_registry* registry,
-                             uint32_t name,
-                             const char* interface,
-                             uint32_t version);
-
-  void HandleGlobalRemoveSeatEvent(uint32_t name);
-
-  // Calling this when a seat is not available is an error.
-  uint32_t GetSeatId() const;
-
-  void SetSeatPresentCallback(OnSeatPresentCallback callback);
-
- private:
-  static void OnSeatCapabilitiesEvent(void* data,
-                                      struct wl_seat* wl_seat,
-                                      uint32_t capabilities);
-
-  static void OnSeatNameEvent(void* data,
-                              struct wl_seat* wl_seat,
-                              const char* name);
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  const struct wl_seat_listener wl_seat_listener_ {
-    .capabilities = OnSeatCapabilitiesEvent, .name = OnSeatNameEvent
-  };
-  raw_ptr<struct wl_seat> wl_seat_ = nullptr;
-  uint32_t seat_id_ = 0;
-  std::unique_ptr<WaylandKeyboard> wayland_keyboard_;
-  OnSeatPresentCallback seat_present_callback_;
-};
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_SEAT_H_
diff --git a/remoting/host/linux/wayland_utils.cc b/remoting/host/linux/wayland_utils.cc
deleted file mode 100644
index 7c756b35..0000000
--- a/remoting/host/linux/wayland_utils.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "remoting/host/linux/wayland_utils.h"
-#include "base/environment.h"
-#include "base/nix/xdg_util.h"
-
-namespace remoting {
-
-bool IsRunningWayland() {
-  static base::nix::SessionType session_type =
-      base::nix::GetSessionType(*base::Environment::Create());
-  return session_type == base::nix::SessionType::kWayland;
-}
-
-}  // namespace remoting
diff --git a/remoting/host/linux/wayland_utils.h b/remoting/host/linux/wayland_utils.h
deleted file mode 100644
index 424702c1..0000000
--- a/remoting/host/linux/wayland_utils.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef REMOTING_HOST_LINUX_WAYLAND_UTILS_H_
-#define REMOTING_HOST_LINUX_WAYLAND_UTILS_H_
-
-namespace remoting {
-
-bool IsRunningWayland();
-
-}  // namespace remoting
-
-#endif  // REMOTING_HOST_LINUX_WAYLAND_UTILS_H_
diff --git a/remoting/host/me2me_desktop_environment.cc b/remoting/host/me2me_desktop_environment.cc
index 012733d..30be5e0cb 100644
--- a/remoting/host/me2me_desktop_environment.cc
+++ b/remoting/host/me2me_desktop_environment.cc
@@ -42,7 +42,6 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if defined(REMOTING_USE_X11)
-#include "remoting/host/linux/wayland_utils.h"
 #include "remoting/host/linux/x11_util.h"
 #include "ui/gfx/x/connection.h"
 #endif  // defined(REMOTING_USE_X11)
@@ -114,15 +113,13 @@
   }
 
 #if BUILDFLAG(IS_LINUX) && defined(REMOTING_USE_X11)
-  if (!IsRunningWayland()) {
-    capabilities += " ";
-    capabilities += protocol::kMultiStreamCapability;
+  capabilities += " ";
+  capabilities += protocol::kMultiStreamCapability;
 
-    // Client-controlled layout is only supported with Xorg+video-dummy.
-    if (UsingVideoDummyDriver()) {
-      capabilities += " ";
-      capabilities += protocol::kClientControlledLayoutCapability;
-    }
+  // Client-controlled layout is only supported with Xorg+video-dummy.
+  if (UsingVideoDummyDriver()) {
+    capabilities += " ";
+    capabilities += protocol::kClientControlledLayoutCapability;
   }
 #elif BUILDFLAG(IS_MAC)
   capabilities += " ";
@@ -161,12 +158,6 @@
   // ourselves.
   mutable_desktop_capture_options()->set_detect_updated_region(false);
 #endif
-
-#if BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    mutable_desktop_capture_options()->set_prefer_cursor_embedded(false);
-  }
-#endif
 }
 
 bool Me2MeDesktopEnvironment::InitializeSecurity(
diff --git a/remoting/host/mouse_cursor_monitor_proxy.cc b/remoting/host/mouse_cursor_monitor_proxy.cc
index ffe8df6392..d94bf11 100644
--- a/remoting/host/mouse_cursor_monitor_proxy.cc
+++ b/remoting/host/mouse_cursor_monitor_proxy.cc
@@ -20,10 +20,6 @@
 #include "remoting/host/chromeos/mouse_cursor_monitor_aura.h"
 #endif
 
-#if defined(REMOTING_USE_X11)
-#include "remoting/host/linux/wayland_utils.h"
-#endif
-
 namespace remoting {
 
 class MouseCursorMonitorProxy::Core
@@ -73,13 +69,6 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
   mouse_cursor_monitor_ = std::make_unique<MouseCursorMonitorAura>();
-#elif BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    mouse_cursor_monitor_ = webrtc::MouseCursorMonitor::Create(options);
-  } else {
-    mouse_cursor_monitor_.reset(webrtc::MouseCursorMonitor::CreateForScreen(
-        options, webrtc::kFullDesktopScreenId));
-  }
 #else   // BUILDFLAG(IS_CHROMEOS)
   mouse_cursor_monitor_.reset(webrtc::MouseCursorMonitor::CreateForScreen(
       options, webrtc::kFullDesktopScreenId));
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index a423e35e..5ec425a 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -159,8 +159,6 @@
 
 #if BUILDFLAG(IS_LINUX)
 #include "remoting/host/host_utmp_logger.h"
-#include "remoting/host/linux/wayland_manager.h"
-#include "remoting/host/linux/wayland_utils.h"
 #endif  // BUILDFLAG(IS_LINUX)
 
 #if defined(REMOTING_MULTI_PROCESS)
@@ -1030,12 +1028,6 @@
       base::BindRepeating(&HostProcess::OnPolicyUpdate, base::Unretained(this)),
       base::BindRepeating(&HostProcess::OnPolicyError, base::Unretained(this)));
 
-#if BUILDFLAG(IS_LINUX)
-  if (IsRunningWayland()) {
-    WaylandManager::Get()->Init(context_->ui_task_runner());
-  }
-#endif  // BUILDFLAG(IS_LINUX)
-
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
   // If an audio pipe is specific on the command-line then initialize
   // AudioCapturerLinux to capture from it.
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index ecd0e70..16e184f6 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -1554,6 +1554,14 @@
   if (!logging_service) {
     return;
   }
+
+  // Reporting is disallowed if network access is disabled for the nonce.
+  if (network_anonymization_key.GetNonce().has_value() &&
+      !IsNetworkForNonceAndUrlAllowed(
+          network_anonymization_key.GetNonce().value(), report->outer_url)) {
+    return;
+  }
+
   std::string user_agent;
   if (url_request_context_->http_user_agent_settings() != nullptr) {
     user_agent =
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index 7716802..32a7c8d2 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -1085,7 +1085,7 @@
   const base::UnguessableToken revoked_nonce = base::UnguessableToken::Create();
   const base::UnguessableToken allowed_nonce = base::UnguessableToken::Create();
 
-  // Revoke the nonce for untrusted network access.
+  // Revoke untrusted network access for the nonce.
   base::test::TestFuture<void> revoked;
   network_context->RevokeNetworkForNonces(
       {revoked_nonce}, base::BindOnce(revoked.GetCallback()));
@@ -1118,6 +1118,91 @@
   EXPECT_EQ(allowed_type, reports[0]->type);
 }
 
+TEST_F(NetworkContextTest,
+       QueueSignedExchangeReportReportAfterNetworkRevocation) {
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeature(
+      net::features::kPartitionConnectionsByNetworkIsolationKey);
+
+  auto reporting_context = std::make_unique<net::TestReportingContext>(
+      base::DefaultClock::GetInstance(), base::DefaultTickClock::GetInstance(),
+      net::ReportingPolicy());
+  mojom::NetworkContextParamsPtr params =
+      CreateNetworkContextParamsForTesting();
+  params->user_agent = kUserAgent_;
+
+  // Ensure that a Nel store is created. This is required for reports to send
+  // out.
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+  base::FilePath reporting_and_nel_store = temp_dir.GetPath().Append(kFilename);
+  params->file_paths = mojom::NetworkContextFilePaths::New();
+  params->file_paths->data_directory = reporting_and_nel_store.DirName();
+  params->file_paths->reporting_and_nel_store_database_name =
+      reporting_and_nel_store.BaseName();
+
+  std::unique_ptr<NetworkContext> network_context = CreateContextWithParams(
+      std::move(params),
+      net::ReportingService::CreateForTesting(std::move(reporting_context)));
+
+  // Create 2 nonces. Only one will have its network access revoked.
+  const base::UnguessableToken revoked_nonce = base::UnguessableToken::Create();
+  const base::UnguessableToken allowed_nonce = base::UnguessableToken::Create();
+
+  // Revoke untrusted network access for the nonce.
+  base::test::TestFuture<void> revoked;
+  network_context->RevokeNetworkForNonces(
+      {revoked_nonce}, base::BindOnce(revoked.GetCallback()));
+  EXPECT_TRUE(revoked.Wait());
+  EXPECT_FALSE(
+      network_context->IsNetworkForNonceAndUrlAllowed(revoked_nonce, kUrl_));
+
+  // Create the 2 NetworkAnonymizationKey(s).
+  const auto site = net::SchemefulSite(kUrl_);
+  net::NetworkAnonymizationKey revoked_anonymization_key =
+      net::NetworkAnonymizationKey::CreateFromFrameSite(site, site,
+                                                        revoked_nonce);
+  net::NetworkAnonymizationKey allowed_anonymization_key =
+      net::NetworkAnonymizationKey::CreateFromFrameSite(site, site,
+                                                        allowed_nonce);
+
+  // Create a Nel policy for the revoked and allowed nonces.
+  net::NetworkErrorLoggingService::NelPolicy revoked_policy;
+  revoked_policy.key = net::NetworkErrorLoggingService::NelPolicyKey(
+      revoked_anonymization_key, kOrigin_);
+  revoked_policy.expires = base::Time::Now() + base::Days(7);
+  net::NetworkErrorLoggingService::NelPolicy allowed_policy;
+  allowed_policy.key = net::NetworkErrorLoggingService::NelPolicyKey(
+      allowed_anonymization_key, kOrigin_);
+  allowed_policy.expires = base::Time::Now() + base::Days(7);
+
+  net::NetworkErrorLoggingService* logging_service =
+      network_context->url_request_context()->network_error_logging_service();
+  logging_service->LoadPoliciesForTesting({revoked_policy, allowed_policy});
+
+  // The first report is sent with the anonymization key that contains the
+  // revoked nonce. This report should not be sent out.
+  mojom::SignedExchangeReportPtr revoked_report =
+      mojom::SignedExchangeReport::New();
+  revoked_report->outer_url = kUrl_;
+  network_context->QueueSignedExchangeReport(std::move(revoked_report),
+                                             revoked_anonymization_key);
+  std::vector<raw_ptr<const net::ReportingReport, VectorExperimental>> reports =
+      network_context->url_request_context()->reporting_service()->GetReports();
+  ASSERT_EQ(0u, reports.size());
+
+  // The second report is sent with a key whose nonce has not been revoked. This
+  // report should send.
+  mojom::SignedExchangeReportPtr allowed_report =
+      mojom::SignedExchangeReport::New();
+  allowed_report->outer_url = kUrl_;
+  network_context->QueueSignedExchangeReport(std::move(allowed_report),
+                                             allowed_anonymization_key);
+  reports =
+      network_context->url_request_context()->reporting_service()->GetReports();
+  ASSERT_EQ(1u, reports.size());
+}
+
 #if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
 
 TEST_F(NetworkContextTest, DeviceBoundSessionsDefaultParam) {
@@ -4337,7 +4422,7 @@
 
   const base::UnguessableToken nonce = base::UnguessableToken::Create();
 
-  // Revoke the nonce for untrusted network access.
+  // Revoke untrusted network access for the nonce.
   base::test::TestFuture<void> revoked;
   network_context->RevokeNetworkForNonces(
       {nonce}, base::BindOnce(revoked.GetCallback()));
@@ -4387,7 +4472,7 @@
 
   const base::UnguessableToken nonce = base::UnguessableToken::Create();
 
-  // Revoke the nonce for untrusted network access.
+  // Revoke untrusted network access for the nonce.
   base::test::TestFuture<void> revoked;
   network_context->RevokeNetworkForNonces(
       {nonce}, base::BindOnce(revoked.GetCallback()));
@@ -4440,7 +4525,7 @@
 
   const base::UnguessableToken nonce = base::UnguessableToken::Create();
 
-  // Revoke the nonce for untrusted network access.
+  // Revoke untrusted network access for the nonce.
   base::test::TestFuture<void> revoked;
   network_context->RevokeNetworkForNonces(
       {nonce}, base::BindOnce(revoked.GetCallback()));
@@ -4490,7 +4575,7 @@
 
   const base::UnguessableToken nonce = base::UnguessableToken::Create();
 
-  // Revoke the nonce for untrusted network access.
+  // Revoke untrusted network access for the nonce.
   base::test::TestFuture<void> revoked;
   network_context->RevokeNetworkForNonces(
       {nonce}, base::BindOnce(revoked.GetCallback()));
@@ -9482,7 +9567,7 @@
 
   const base::UnguessableToken nonce = base::UnguessableToken::Create();
 
-  // Revoke the nonce for untrusted network access.
+  // Revoke untrusted network access for the nonce.
   base::test::TestFuture<void> revoked;
   network_context->RevokeNetworkForNonces(
       {nonce}, base::BindOnce(revoked.GetCallback()));
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 3ff1a8b..df09f5f 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -5,6 +5,7 @@
 #include "services/network/network_service.h"
 
 #include <algorithm>
+#include <cstdint>
 #include <map>
 #include <optional>
 #include <utility>
@@ -17,6 +18,7 @@
 #include "base/debug/dump_without_crashing.h"
 #include "base/environment.h"
 #include "base/feature_list.h"
+#include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
@@ -936,18 +938,8 @@
   if (mdl.has_value()) {
     UMA_HISTOGRAM_MEMORY_KB("NetworkService.MaskedDomainList.SizeInKB",
                             mdl->ByteSizeLong() / 1024);
-
     masked_domain_list_manager_->UpdateMaskedDomainList(mdl.value(),
                                                         exclusion_list);
-
-    base::UmaHistogramBoolean(
-        "NetworkService.IpProtection.ProxyAllowList."
-        "UpdateSuccess",
-        true);
-  } else {
-    base::UmaHistogramBoolean(
-        "NetworkService.IpProtection.ProxyAllowList.UpdateSuccess", false);
-    LOG(ERROR) << "Unable to parse MDL in NetworkService";
   }
 
   base::UmaHistogramTimes(
@@ -955,6 +947,16 @@
       base::Time::Now() - start_time);
 }
 
+void NetworkService::UpdateMaskedDomainListFlatbuffer(
+    base::File default_file,
+    uint64_t default_file_size,
+    base::File regular_browsing_file,
+    uint64_t regular_browsing_file_size) {
+  masked_domain_list_manager_->UpdateMaskedDomainListFlatbuffer(
+      std::move(default_file), default_file_size,
+      std::move(regular_browsing_file), regular_browsing_file_size);
+}
+
 #if BUILDFLAG(IS_ANDROID)
 void NetworkService::DumpWithoutCrashing(base::Time dump_request_time) {
   static base::debug::CrashKeyString* time_key =
diff --git a/services/network/network_service.h b/services/network/network_service.h
index c54225b..46429d5 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -5,6 +5,7 @@
 #ifndef SERVICES_NETWORK_NETWORK_SERVICE_H_
 #define SERVICES_NETWORK_NETWORK_SERVICE_H_
 
+#include <cstdint>
 #include <map>
 #include <memory>
 #include <optional>
@@ -18,6 +19,7 @@
 #include "base/containers/flat_set.h"
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/feature_list.h"
+#include "base/files/file.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
@@ -226,6 +228,12 @@
       mojo_base::ProtoWrapper masked_domain_list,
       const std::vector<std::string>& exclusion_list) override;
 
+  void UpdateMaskedDomainListFlatbuffer(
+      base::File default_file,
+      uint64_t default_file_size,
+      base::File regular_browsing_file,
+      uint64_t regular_browsing_file_size) override;
+
 #if BUILDFLAG(IS_ANDROID)
   void DumpWithoutCrashing(base::Time dump_request_time) override;
 #endif  // BUILDFLAG(IS_ANDROID)
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index d5a2ec0..ea646af8 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -364,4 +364,11 @@
              "AdAuctionEventRegistration",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
+// Changes default Permissions Policy for features join-ad-interest-group and
+// run-ad-auction to a more restricted EnableForSelf.
+BASE_FEATURE(kAdInterestGroupAPIRestrictedPolicyByDefault,
+             "AdInterestGroupAPIRestrictedPolicyByDefault",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace network::features
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index d7da6ad..a479a24 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -155,6 +155,11 @@
 // requests be processed?
 COMPONENT_EXPORT(NETWORK_CPP) BASE_DECLARE_FEATURE(kAdAuctionEventRegistration);
 
+// Runtime flag that changes default Permissions Policy for features
+// join-ad-interest-group and run-ad-auction to a more restricted EnableForSelf.
+COMPONENT_EXPORT(NETWORK_CPP)
+BASE_DECLARE_FEATURE(kAdInterestGroupAPIRestrictedPolicyByDefault);
+
 }  // namespace network::features
 
 #endif  // SERVICES_NETWORK_PUBLIC_CPP_FEATURES_H_
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 9817bd6..1124493 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -389,6 +389,23 @@
   UpdateMaskedDomainList(mojo_base.mojom.ProtoWrapper masked_domain_list,
                          array<string> exclusion_list);
 
+  // Updates the Masked Domain List data used to generate custom proxy configs
+  // for the Privacy Proxy, with files pointing to flatbuffer files. Any
+  // existing NetworkContexts that are using the custom proxy configs will have
+  // their configs updated. This is not compatible with MDL policies that
+  // require exclusion list.
+  //
+  // These files are opened read-only, but are also deleted. Per comments in
+  // the mojom traits for `ReadOnlyFile`, the underlying file must not be
+  // deleted, so we use `File` here.
+  //
+  // File sizes must be included here, as otherwise `MemoryMappedFile` cannot
+  // tell how much memory to map.
+  UpdateMaskedDomainListFlatbuffer(mojo_base.mojom.File default_file,
+                                   uint64 default_file_size,
+                                   mojo_base.mojom.File regular_browsing_file,
+                                   uint64 regular_browsing_file_size);
+
   // Parses response headers and returns a structured version to the caller.
   // This call originates from the browser process. Used for navigations when
   // the URLLoader didn't provide ParsedHeader in the first place. This happens
diff --git a/services/on_device_model/public/mojom/BUILD.gn b/services/on_device_model/public/mojom/BUILD.gn
index 8330dfc..c5655e27 100644
--- a/services/on_device_model/public/mojom/BUILD.gn
+++ b/services/on_device_model/public/mojom/BUILD.gn
@@ -16,6 +16,11 @@
   ]
   webui_module_path = "/"
 
+  export_class_attribute_blink = "PLATFORM_EXPORT"
+  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
+  export_header_blink = "third_party/blink/renderer/platform/platform_export.h"
+  generate_legacy_js_bindings = true
+  generate_java = true
 
   cpp_typemaps = [
     {
diff --git a/services/tracing/public/cpp/BUILD.gn b/services/tracing/public/cpp/BUILD.gn
index fa61c7e..8c71ad9 100644
--- a/services/tracing/public/cpp/BUILD.gn
+++ b/services/tracing/public/cpp/BUILD.gn
@@ -60,6 +60,8 @@
     sources += [
       "perfetto/custom_event_recorder.cc",
       "perfetto/custom_event_recorder.h",
+      "perfetto/histogram_samples_data_source.cc",
+      "perfetto/histogram_samples_data_source.h",
       "perfetto/interning_index.h",
       "perfetto/metadata_data_source.cc",
       "perfetto/metadata_data_source.h",
diff --git a/services/tracing/public/cpp/background_tracing/background_tracing_agent_impl.cc b/services/tracing/public/cpp/background_tracing/background_tracing_agent_impl.cc
index 33799959..affb2df 100644
--- a/services/tracing/public/cpp/background_tracing/background_tracing_agent_impl.cc
+++ b/services/tracing/public/cpp/background_tracing/background_tracing_agent_impl.cc
@@ -88,10 +88,10 @@
     return;
   }
 
+  auto track = perfetto::NamedTrack("HistogramSamples");
   uint64_t flow_id = base::trace_event::HistogramScope::GetFlowId().value_or(
       base::trace_event::GetNextGlobalTraceId());
-
-  TRACE_EVENT("toplevel,latency", "HistogramSampleTrigger",
+  TRACE_EVENT("toplevel,latency", "HistogramSampleTrigger", track,
               [&](perfetto::EventContext ctx) {
                 perfetto::protos::pbzero::ChromeHistogramSample* new_sample =
                     ctx.event()->set_chrome_histogram_sample();
diff --git a/services/tracing/public/cpp/perfetto/custom_event_recorder.cc b/services/tracing/public/cpp/perfetto/custom_event_recorder.cc
index 4ea1aa3..60b1182 100644
--- a/services/tracing/public/cpp/perfetto/custom_event_recorder.cc
+++ b/services/tracing/public/cpp/perfetto/custom_event_recorder.cc
@@ -6,7 +6,6 @@
 
 #include "base/base64.h"
 #include "base/functional/callback_helpers.h"
-#include "base/metrics/histogram_samples.h"
 #include "base/metrics/metrics_hashes.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/metrics/user_metrics.h"
@@ -25,7 +24,6 @@
 #include "third_party/perfetto/include/perfetto/tracing/internal/track_event_internal.h"
 #include "third_party/perfetto/include/perfetto/tracing/track_event_interned_data_index.h"
 #include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.pbzero.h"
-#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_histogram_sample.pbzero.h"
 #include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_process_descriptor.pbzero.h"
 #include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_user_event.pbzero.h"
 
@@ -40,25 +38,9 @@
 namespace tracing {
 namespace {
 
-constexpr char kHistogramSamplesCategory[] =
-    TRACE_DISABLED_BY_DEFAULT("histogram_samples");
 constexpr char kUserActionSamplesCategory[] =
     TRACE_DISABLED_BY_DEFAULT("user_action_samples");
 
-struct InternedHistogramName
-    : public perfetto::TrackEventInternedDataIndex<
-          InternedHistogramName,
-          perfetto::protos::pbzero::InternedData::kHistogramNamesFieldNumber,
-          const char*> {
-  static void Add(perfetto::protos::pbzero::InternedData* interned_data,
-                  size_t iid,
-                  const char* histogram_name) {
-    auto* msg = interned_data->add_histogram_names();
-    msg->set_iid(iid);
-    msg->set_name(histogram_name);
-  }
-};
-
 }  // namespace
 
 CustomEventRecorder::CustomEventRecorder() {
@@ -106,6 +88,7 @@
 void CustomEventRecorder::OnSetup(
     const perfetto::DataSourceBase::SetupArgs& args) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(perfetto_sequence_checker_);
+
   // The legacy chrome_config is only used to specify histogram names.
   auto legacy_config = TraceConfig(args.config->chrome_config().trace_config());
   ResetHistograms(legacy_config.histogram_names());
@@ -116,25 +99,6 @@
   EmitRecurringUpdates();
 
   bool enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(kHistogramSamplesCategory, &enabled);
-  if (enabled) {
-    if (histograms_.empty() &&
-        !base::StatisticsRecorder::global_sample_callback()) {
-      // Add the global callback if it wasn't already.
-      base::StatisticsRecorder::SetGlobalSampleCallback(
-          &CustomEventRecorder::OnMetricsSampleCallback);
-    }
-    for (const std::string& histogram_name : histograms_) {
-      if (monitored_histograms_.count(histogram_name)) {
-        continue;
-      }
-      monitored_histograms_[histogram_name] = std::make_unique<
-          base::StatisticsRecorder::ScopedHistogramSampleObserver>(
-          histogram_name,
-          base::BindRepeating(&CustomEventRecorder::OnMetricsSampleCallback));
-    }
-  }
-
   TRACE_EVENT_CATEGORY_GROUP_ENABLED(kUserActionSamplesCategory, &enabled);
   if (enabled) {
     auto task_runner = base::GetRecordActionTaskRunner();
@@ -159,14 +123,7 @@
   // Write metadata events etc.
   LogHistograms();
 
-  // Clean up callbacks if no tracing sessions are recording samples.
   bool enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(kHistogramSamplesCategory, &enabled);
-  if (!enabled) {
-    base::StatisticsRecorder::SetGlobalSampleCallback(nullptr);
-    monitored_histograms_.clear();
-  }
-
   TRACE_EVENT_CATEGORY_GROUP_ENABLED(kUserActionSamplesCategory, &enabled);
   if (!enabled) {
     auto task_runner = base::GetRecordActionTaskRunner();
@@ -259,23 +216,4 @@
   DETACH_FROM_SEQUENCE(perfetto_sequence_checker_);
 }
 
-// static
-void CustomEventRecorder::OnMetricsSampleCallback(
-    const char* histogram_name,
-    uint64_t name_hash,
-    base::HistogramBase::Sample32 sample) {
-  TRACE_EVENT_INSTANT(
-      kHistogramSamplesCategory, "HistogramSample",
-      [&](perfetto::EventContext ctx) {
-        perfetto::protos::pbzero::ChromeHistogramSample* new_sample =
-            ctx.event()->set_chrome_histogram_sample();
-        new_sample->set_name_hash(name_hash);
-        new_sample->set_sample(sample);
-        if (!ctx.ShouldFilterDebugAnnotations()) {
-          size_t iid = InternedHistogramName::Get(&ctx, histogram_name);
-          new_sample->set_name_iid(iid);
-        }
-      });
-}
-
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/perfetto/custom_event_recorder.h b/services/tracing/public/cpp/perfetto/custom_event_recorder.h
index 717eadb..e06b179 100644
--- a/services/tracing/public/cpp/perfetto/custom_event_recorder.h
+++ b/services/tracing/public/cpp/perfetto/custom_event_recorder.h
@@ -7,7 +7,6 @@
 
 #include "base/component_export.h"
 #include "base/metrics/histogram_samples.h"
-#include "base/metrics/statistics_recorder.h"
 #include "base/metrics/user_metrics.h"
 #include "base/sequence_checker.h"
 #include "base/trace_event/trace_config.h"
@@ -45,13 +44,6 @@
   // base::RecordAction(), when tracing is enabled with a histogram category.
   static void OnUserActionSampleCallback(const std::string& action,
                                          base::TimeTicks action_time);
-  // Records trace event for a histogram sample. When histogram_samples category
-  // is enabled, it is registered with base::StatisticsRecorder to monitor the
-  // histograms listed in the trace config. If there are no histograms listed in
-  // the trace config, all the histograms will be monitored.
-  static void OnMetricsSampleCallback(const char* histogram_name,
-                                      uint64_t name_hash,
-                                      base::HistogramBase::Sample32 sample);
   bool IsPrivacyFilteringEnabled();
   // Thread can restart in Linux and ChromeOS when entering sandbox, so rebind
   // sequence checker.
@@ -78,12 +70,6 @@
   std::map<std::string, std::unique_ptr<base::HistogramSamples>>
       startup_histogram_samples_;
   std::vector<std::string> histograms_;
-  // Stores the registered histogram callbacks for which OnMetricsSampleCallback
-  // was set individually.
-  std::unordered_map<
-      std::string,
-      std::unique_ptr<base::StatisticsRecorder::ScopedHistogramSampleObserver>>
-      monitored_histograms_;
   base::ActionCallback user_action_callback_ =
       base::BindRepeating(&CustomEventRecorder::OnUserActionSampleCallback);
   ActiveProcessesCallback active_processes_callback_;
diff --git a/services/tracing/public/cpp/perfetto/histogram_samples_data_source.cc b/services/tracing/public/cpp/perfetto/histogram_samples_data_source.cc
new file mode 100644
index 0000000..c5d69db
--- /dev/null
+++ b/services/tracing/public/cpp/perfetto/histogram_samples_data_source.cc
@@ -0,0 +1,246 @@
+// 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 "services/tracing/public/cpp/perfetto/histogram_samples_data_source.h"
+
+#include "base/logging.h"
+#include "base/metrics/metrics_hashes.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/trace_event/trace_event.h"
+#include "base/tracing/trace_time.h"
+#include "services/tracing/public/mojom/perfetto_service.mojom.h"
+#include "third_party/perfetto/include/perfetto/base/time.h"
+#include "third_party/perfetto/include/perfetto/tracing/track_event_interned_data_index.h"
+#include "third_party/perfetto/protos/perfetto/common/data_source_descriptor.gen.h"
+#include "third_party/perfetto/protos/perfetto/config/chrome/chrome_config.gen.h"
+#include "third_party/perfetto/protos/perfetto/config/data_source_config.gen.h"
+#include "third_party/perfetto/protos/perfetto/trace/trace_packet_defaults.pbzero.h"
+#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_histogram_sample.pbzero.h"
+
+namespace tracing {
+namespace {
+
+// Counts data source that record all histograms;
+std::atomic_size_t g_num_global_sample_observers{0};
+
+std::optional<base::HistogramBase::Sample32> MaybeReferenceValue(
+    bool has_value,
+    uint64_t value) {
+  if (has_value) {
+    return base::checked_cast<base::HistogramBase::Sample32>(value);
+  }
+  return std::nullopt;
+}
+
+}  // namespace
+
+struct HistogramSamplesIncrementalState {
+  using InternedHistogramName =
+      perfetto::SmallInternedDataTraits::Index<const char*>;
+
+  bool was_cleared = true;
+  InternedHistogramName histogram_names_;
+
+  size_t GetInternedHistogramName(
+      const char* value,
+      HistogramSamplesDataSource::TraceContext::TracePacketHandle& packet) {
+    size_t iid;
+    if (histogram_names_.LookUpOrInsert(&iid, value)) {
+      return iid;
+    }
+    auto* interned_data = packet->set_interned_data();
+    auto* msg = interned_data->add_histogram_names();
+    msg->set_iid(iid);
+    msg->set_name(value);
+    return iid;
+  }
+};
+
+struct HistogramSamplesTlsState {
+  explicit HistogramSamplesTlsState(
+      const HistogramSamplesDataSource::TraceContext& trace_context) {
+    auto locked_ds = trace_context.GetDataSourceLocked();
+    if (locked_ds.valid()) {
+      filter_histogram_names = locked_ds->filter_histogram_names();
+      if (!locked_ds->records_all_histograms()) {
+        instance = reinterpret_cast<uintptr_t>(&(*locked_ds));
+      }
+    }
+  }
+  bool filter_histogram_names = false;
+  std::optional<uintptr_t> instance;
+};
+
+void HistogramSamplesDataSource::Register() {
+  perfetto::DataSourceDescriptor desc;
+  desc.set_name(tracing::mojom::kHistogramSampleSourceName);
+  perfetto::DataSource<HistogramSamplesDataSource,
+                       HistogramSamplesTraits>::Register(desc);
+}
+
+HistogramSamplesDataSource::HistogramSamplesDataSource() = default;
+HistogramSamplesDataSource::~HistogramSamplesDataSource() = default;
+
+void HistogramSamplesDataSource::OnSetup(const SetupArgs& args) {
+  if (args.config->chromium_histogram_samples_raw().empty()) {
+    return;
+  }
+  perfetto::protos::gen::ChromiumHistogramSamplesConfig config;
+  if (!config.ParseFromString(args.config->chromium_histogram_samples_raw())) {
+    DLOG(ERROR) << "Failed to parse chromium_histogram_samples";
+    return;
+  }
+  filter_histogram_names_ = config.filter_histogram_names();
+  for (const auto& histogram : config.histograms()) {
+    monitored_histograms_.push_back(histogram);
+  }
+}
+
+void HistogramSamplesDataSource::OnStart(const StartArgs&) {
+  if (monitored_histograms_.empty()) {
+    size_t num_global_sample_observers =
+        g_num_global_sample_observers.fetch_add(1, std::memory_order_relaxed);
+    if (num_global_sample_observers == 0) {
+      base::StatisticsRecorder::SetGlobalSampleCallback(
+          &HistogramSamplesDataSource::OnAnyMetricSample);
+    }
+  }
+  for (const auto& histogram : monitored_histograms_) {
+    histogram_observers_.push_back(
+        std::make_unique<
+            base::StatisticsRecorder::ScopedHistogramSampleObserver>(
+            histogram.histogram_name(),
+            base::BindRepeating(&HistogramSamplesDataSource::OnMetricSample,
+                                base::Unretained(this),
+                                MaybeReferenceValue(histogram.has_min_value(),
+                                                    histogram.min_value()),
+                                MaybeReferenceValue(histogram.has_max_value(),
+                                                    histogram.max_value()))));
+  }
+}
+
+void HistogramSamplesDataSource::OnFlush(const FlushArgs&) {}
+
+void HistogramSamplesDataSource::OnStop(const StopArgs&) {
+  if (monitored_histograms_.empty()) {
+    size_t num_global_sample_observers =
+        g_num_global_sample_observers.fetch_sub(1, std::memory_order_relaxed);
+    if (num_global_sample_observers == 1) {
+      base::StatisticsRecorder::SetGlobalSampleCallback(nullptr);
+    }
+  }
+  histogram_observers_.clear();
+}
+
+void HistogramSamplesDataSource::OnMetricSample(
+    std::optional<base::HistogramBase::Sample32> reference_lower_value,
+    std::optional<base::HistogramBase::Sample32> reference_upper_value,
+    const char* histogram_name,
+    uint64_t name_hash,
+    base::HistogramBase::Sample32 sample) {
+  if ((reference_lower_value && sample < reference_lower_value) ||
+      (reference_upper_value && sample > reference_upper_value)) {
+    return;
+  }
+  OnMetricSampleImpl(histogram_name, name_hash, sample,
+                     reinterpret_cast<uintptr_t>(this));
+}
+
+void HistogramSamplesDataSource::OnAnyMetricSample(
+    const char* histogram_name,
+    uint64_t name_hash,
+    base::HistogramBase::Sample32 sample) {
+  OnMetricSampleImpl(histogram_name, name_hash, sample, std::nullopt);
+}
+
+void HistogramSamplesDataSource::OnMetricSampleImpl(
+    const char* histogram_name,
+    uint64_t name_hash,
+    base::HistogramBase::Sample32 sample,
+    std::optional<uintptr_t> instance) {
+  HistogramSamplesDataSource::Trace([&](TraceContext ctx) {
+    if (instance != ctx.GetCustomTlsState()->instance) {
+      return;
+    }
+    bool filter_histogram_names =
+        ctx.GetCustomTlsState()->filter_histogram_names;
+    auto* incr_state = ctx.GetIncrementalState();
+
+    if (incr_state->was_cleared) {
+      ResetIncrementalState(ctx, !instance.has_value());
+      incr_state->was_cleared = false;
+    }
+
+    auto packet = ctx.NewTracePacket();
+    std::optional<size_t> iid;
+    if (!filter_histogram_names) {
+      iid = incr_state->GetInternedHistogramName(histogram_name, packet);
+    }
+
+    packet->set_timestamp(
+        TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds());
+    packet->set_sequence_flags(
+        ::perfetto::protos::pbzero::TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
+    auto* event = packet->set_track_event();
+    event->set_name_iid(1);
+    event->add_category_iids(1);
+    event->set_type(::perfetto::protos::pbzero::TrackEvent::TYPE_INSTANT);
+
+    perfetto::protos::pbzero::ChromeHistogramSample* new_sample =
+        event->set_chrome_histogram_sample();
+    new_sample->set_name_hash(name_hash);
+    new_sample->set_sample(sample);
+
+    if (iid) {
+      new_sample->set_name_iid(*iid);
+    }
+  });
+}
+
+void HistogramSamplesDataSource::ResetIncrementalState(
+    TraceContext& ctx,
+    bool records_all_histograms) {
+  uint64_t track_uuid;
+  if (records_all_histograms) {
+    auto track = perfetto::ThreadTrack::Current();
+    perfetto::internal::TrackRegistry::Get()->SerializeTrack(
+        track, ctx.NewTracePacket());
+    track_uuid = track.uuid;
+  } else {
+    // Specific histogram samples are scoped to the process because the callback
+    // is not called on the thread that emitted the record.
+    auto track = perfetto::NamedTrack("HistogramSamples");
+    perfetto::internal::TrackRegistry::Get()->SerializeTrack(
+        track, ctx.NewTracePacket());
+    track_uuid = track.uuid;
+  }
+
+  auto packet = ctx.NewTracePacket();
+  packet->set_sequence_flags(
+      ::perfetto::protos::pbzero::TracePacket::SEQ_INCREMENTAL_STATE_CLEARED);
+
+  auto* defaults = packet->set_trace_packet_defaults();
+  defaults->set_timestamp_clock_id(base::tracing::kTraceClockId);
+  auto* track_defaults = defaults->set_track_event_defaults();
+  track_defaults->set_track_uuid(track_uuid);
+
+  auto* interned_data = packet->set_interned_data();
+  auto* name = interned_data->add_event_names();
+  name->set_iid(1);
+  name->set_name("HistogramSample");
+
+  auto* category = interned_data->add_event_categories();
+  category->set_iid(1);
+  // This is a synthetic category that's created by this data source, although
+  // it can't be enabled on TrackEvent. The data is emitted this way mainly for
+  // backward compatibility with existing trace processor.
+  category->set_name(TRACE_DISABLED_BY_DEFAULT("histogram_samples"));
+}
+
+}  // namespace tracing
+
+PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS_WITH_ATTRS(
+    COMPONENT_EXPORT(TRACING_CPP),
+    tracing::HistogramSamplesDataSource,
+    tracing::HistogramSamplesTraits);
diff --git a/services/tracing/public/cpp/perfetto/histogram_samples_data_source.h b/services/tracing/public/cpp/perfetto/histogram_samples_data_source.h
new file mode 100644
index 0000000..c16a699c
--- /dev/null
+++ b/services/tracing/public/cpp/perfetto/histogram_samples_data_source.h
@@ -0,0 +1,79 @@
+// 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 SERVICES_TRACING_PUBLIC_CPP_PERFETTO_HISTOGRAM_SAMPLES_DATA_SOURCE_H_
+#define SERVICES_TRACING_PUBLIC_CPP_PERFETTO_HISTOGRAM_SAMPLES_DATA_SOURCE_H_
+
+#include <vector>
+
+#include "base/component_export.h"
+#include "base/metrics/histogram_base.h"
+#include "base/metrics/statistics_recorder.h"
+#include "third_party/perfetto/include/perfetto/tracing/data_source.h"
+#include "third_party/perfetto/protos/perfetto/config/chrome/histogram_samples.gen.h"
+
+namespace tracing {
+
+struct HistogramSamplesIncrementalState;
+struct HistogramSamplesTlsState;
+struct HistogramSamplesTraits : public perfetto::DefaultDataSourceTraits {
+  using IncrementalStateType = HistogramSamplesIncrementalState;
+  using TlsStateType = HistogramSamplesTlsState;
+};
+
+// A data source that record UMA histogram samples. This data source needs
+// "track_event" data source to be enabled for track descriptors to be emitted.
+class COMPONENT_EXPORT(TRACING_CPP) HistogramSamplesDataSource
+    : public perfetto::DataSource<HistogramSamplesDataSource,
+                                  HistogramSamplesTraits> {
+ public:
+  static void Register();
+
+  HistogramSamplesDataSource();
+  ~HistogramSamplesDataSource() override;
+
+  void OnSetup(const SetupArgs&) override;
+  void OnStart(const StartArgs&) override;
+  void OnFlush(const FlushArgs&) override;
+  void OnStop(const StopArgs&) override;
+
+  bool filter_histogram_names() const { return filter_histogram_names_; }
+  bool records_all_histograms() const { return monitored_histograms_.empty(); }
+
+ private:
+  void OnMetricSample(
+      std::optional<base::HistogramBase::Sample32> reference_lower_value,
+      std::optional<base::HistogramBase::Sample32> reference_upper_value,
+      const char* histogram_name,
+      uint64_t name_hash,
+      base::HistogramBase::Sample32 actual_value);
+  static void OnAnyMetricSample(const char* histogram_name,
+                                uint64_t name_hash,
+                                base::HistogramBase::Sample32 sample);
+  // `instance` identifies the instance that registered a callback, or nullopt
+  // if this is a global callback.
+  static void OnMetricSampleImpl(const char* histogram_name,
+                                 uint64_t name_hash,
+                                 base::HistogramBase::Sample32 sample,
+                                 std::optional<uintptr_t> instance);
+
+  static void ResetIncrementalState(TraceContext& ctx,
+                                    bool records_all_histograms);
+
+  std::vector<
+      perfetto::protos::gen::ChromiumHistogramSamplesConfig::HistogramSample>
+      monitored_histograms_;
+
+  // Stores the registered histogram callbacks for which OnMetricSample
+  // was set individually.
+  std::vector<
+      std::unique_ptr<base::StatisticsRecorder::ScopedHistogramSampleObserver>>
+      histogram_observers_;
+
+  bool filter_histogram_names_ = false;
+};
+
+}  // namespace tracing
+
+#endif  // SERVICES_TRACING_PUBLIC_CPP_PERFETTO_HISTOGRAM_SAMPLES_DATA_SOURCE_H_
diff --git a/services/tracing/public/cpp/perfetto/perfetto_config.cc b/services/tracing/public/cpp/perfetto/perfetto_config.cc
index 9517ef1..c8c3fc0 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_config.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_config.cc
@@ -24,6 +24,7 @@
 #include "build/chromecast_buildflags.h"
 #include "components/tracing/common/tracing_switches.h"
 #include "services/tracing/public/mojom/perfetto_service.mojom.h"
+#include "third_party/perfetto/protos/perfetto/config/chrome/histogram_samples.gen.h"
 #include "third_party/perfetto/protos/perfetto/config/track_event/track_event_config.gen.h"
 
 namespace tracing {
@@ -126,6 +127,25 @@
                       json_agent_label_filter);
 
   if (stripped_config.IsCategoryGroupEnabled(
+          TRACE_DISABLED_BY_DEFAULT("histogram_samples"))) {
+    auto* data_source = AddDataSourceConfig(
+        perfetto_config, tracing::mojom::kHistogramSampleSourceName,
+        chrome_config_string, privacy_filtering_enabled, convert_to_legacy_json,
+        client_priority, json_agent_label_filter);
+
+    perfetto::protos::gen::ChromiumHistogramSamplesConfig histogram_config;
+    histogram_config.set_filter_histogram_names(privacy_filtering_enabled);
+    for (const auto& histogram_name : stripped_config.histogram_names()) {
+      perfetto::protos::gen::ChromiumHistogramSamplesConfig::HistogramSample
+          sample;
+      sample.set_histogram_name(histogram_name);
+      *histogram_config.add_histograms() = sample;
+    }
+    data_source->mutable_config()->set_chromium_histogram_samples_raw(
+        histogram_config.SerializeAsString());
+  }
+
+  if (stripped_config.IsCategoryGroupEnabled(
           TRACE_DISABLED_BY_DEFAULT("cpu_profiler"))) {
     AddDataSourceConfig(
         perfetto_config, tracing::mojom::kSamplerProfilerSourceName,
@@ -285,6 +305,19 @@
     chrome_config->set_trace_config(chrome_config_string);
   }
 
+  if (config->name() == tracing::mojom::kHistogramSampleSourceName) {
+    perfetto::protos::gen::ChromiumHistogramSamplesConfig histogram_config;
+    if (!config->chromium_histogram_samples_raw().empty() &&
+        !histogram_config.ParseFromString(
+            config->chromium_histogram_samples_raw())) {
+      DLOG(ERROR) << "Failed to parse chromium_histogram_samples";
+      return;
+    }
+    histogram_config.set_filter_histogram_names(privacy_filtering_enabled);
+    config->set_chromium_histogram_samples_raw(
+        histogram_config.SerializeAsString());
+  }
+
   if (!config->track_event_config_raw().empty()) {
     config->set_name("track_event");
     perfetto::protos::gen::TrackEventConfig track_event_config;
diff --git a/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc b/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
index 9d0c5a0..9090517f 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
@@ -18,6 +18,7 @@
 #include "base/tracing/perfetto_task_runner.h"
 #include "build/build_config.h"
 #include "services/tracing/public/cpp/perfetto/custom_event_recorder.h"
+#include "services/tracing/public/cpp/perfetto/histogram_samples_data_source.h"
 #include "services/tracing/public/cpp/perfetto/metadata_data_source.h"
 #include "services/tracing/public/cpp/perfetto/perfetto_tracing_backend.h"
 #include "services/tracing/public/cpp/perfetto/track_name_recorder.h"
@@ -353,6 +354,7 @@
 
   base::TrackEvent::Register();
   tracing::TracingSamplerProfiler::RegisterDataSource();
+  tracing::HistogramSamplesDataSource::Register();
   // SystemMetricsSampler will be started when enabling
   // kSystemMetricsSourceName.
   tracing::SystemMetricsSampler::Register(/*system_wide=*/enable_consumer);
diff --git a/services/tracing/public/mojom/data_source_config_mojom_traits.cc b/services/tracing/public/mojom/data_source_config_mojom_traits.cc
index 0291308..fec9bf4 100644
--- a/services/tracing/public/mojom/data_source_config_mojom_traits.cc
+++ b/services/tracing/public/mojom/data_source_config_mojom_traits.cc
@@ -16,7 +16,7 @@
     Read(tracing::mojom::DataSourceConfigDataView data,
          perfetto::DataSourceConfig* out) {
   std::string name, legacy_config, track_event_config_raw, etw_config_raw,
-      system_metrics_config_raw;
+      system_metrics_config_raw, histogram_samples_config_raw;
   perfetto::ChromeConfig chrome_config;
   std::optional<perfetto::protos::gen::InterceptorConfig> interceptor_config;
   if (!data.ReadName(&name) || !data.ReadChromeConfig(&chrome_config) ||
@@ -24,6 +24,7 @@
       !data.ReadTrackEventConfigRaw(&track_event_config_raw) ||
       !data.ReadEtwConfigRaw(&etw_config_raw) ||
       !data.ReadSystemMetricsConfigRaw(&system_metrics_config_raw) ||
+      !data.ReadHistogramSamplesConfigRaw(&histogram_samples_config_raw) ||
       !data.ReadInterceptorConfig(&interceptor_config)) {
     return false;
   }
@@ -49,6 +50,9 @@
   if (!system_metrics_config_raw.empty()) {
     out->set_chromium_system_metrics_raw(system_metrics_config_raw);
   }
+  if (!histogram_samples_config_raw.empty()) {
+    out->set_chromium_histogram_samples_raw(histogram_samples_config_raw);
+  }
   return true;
 }
 }  // namespace mojo
diff --git a/services/tracing/public/mojom/data_source_config_mojom_traits.h b/services/tracing/public/mojom/data_source_config_mojom_traits.h
index 9539f8c..644267eb 100644
--- a/services/tracing/public/mojom/data_source_config_mojom_traits.h
+++ b/services/tracing/public/mojom/data_source_config_mojom_traits.h
@@ -54,6 +54,10 @@
       const perfetto::DataSourceConfig& src) {
     return src.chromium_system_metrics_raw();
   }
+  static const std::string& histogram_samples_config_raw(
+      const perfetto::DataSourceConfig& src) {
+    return src.chromium_histogram_samples_raw();
+  }
 
   static std::optional<perfetto::protos::gen::InterceptorConfig>
   interceptor_config(const perfetto::DataSourceConfig& src) {
diff --git a/services/tracing/public/mojom/perfetto_service.mojom b/services/tracing/public/mojom/perfetto_service.mojom
index a969282..017cd638 100644
--- a/services/tracing/public/mojom/perfetto_service.mojom
+++ b/services/tracing/public/mojom/perfetto_service.mojom
@@ -28,6 +28,8 @@
     "org.chromium.native_heap_profiler";
 const string kSystemMetricsSourceName =
     "org.chromium.system_metrics";
+const string kHistogramSampleSourceName =
+    "org.chromium.histogram_sample";
 
 // Brief description of the flow: There's a per-process ProducerClient which
 // connects to the central PerfettoService and establishes a two-way connection
@@ -132,6 +134,7 @@
   mojo_base.mojom.ByteString track_event_config_raw;
   mojo_base.mojom.ByteString etw_config_raw;
   mojo_base.mojom.ByteString system_metrics_config_raw;
+  mojo_base.mojom.ByteString histogram_samples_config_raw;
 };
 
 struct DataSourceRegistration {
diff --git a/services/webnn/coreml/graph_builder_coreml.cc b/services/webnn/coreml/graph_builder_coreml.cc
index 31697873..b495b7d 100644
--- a/services/webnn/coreml/graph_builder_coreml.cc
+++ b/services/webnn/coreml/graph_builder_coreml.cc
@@ -1142,7 +1142,11 @@
        {arg_min_max_input_supported_data_types, kNonScalarMaxRank},
        /*arg_min_max_output=*/
        kArgMinMaxOutputSupportedDataTypes,
-       /*batch_normalization_input=*/DataTypeConstraint::kFloat16To32,
+       // TODO(crbug.com/338529225): Support ND input.
+       // https://apple.github.io/coremltools/source/coremltools.converters.mil.mil.ops.defs.html#coremltools.converters.mil.mil.ops.defs.iOS15.normalization.batch_norm
+       /*batch_normalization_input=*/{DataTypeConstraint::kFloat16To32, {3, 5}},
+       /*batch_normalization_mean=*/
+       {DataTypeConstraint::kFloat16To32, SupportedRanks::Exactly(1)},
        // Note that BOOL, INT16, and UINT16 is also supported by CoreML, but
        // WebNN does not have corresponding types.
        // https://apple.github.io/coremltools/source/coremltools.converters.mil.mil.ops.defs.html#coremltools.converters.mil.mil.ops.defs.iOS17.elementwise_unary.cast
@@ -1980,17 +1984,8 @@
 GraphBuilderCoreml::AddOperationForBatchNormalization(
     const mojom::BatchNormalization& operation,
     CoreML::Specification::MILSpec::Block& block) {
-  const OperandInfo& input_operand_info =
-      GetOperandInfo(operation.input_operand_id);
-  CHECK(context_properties_.data_type_limits.batch_normalization_input.Has(
-      MILDataTypeToOperandType(input_operand_info.mil_data_type)));
-
-  // TODO(crbug.com/338529225): Support ND inputs.
-  if (input_operand_info.dimensions.size() < 3 ||
-      input_operand_info.dimensions.size() > 5) {
-    return NewNotSupportedError(
-        "Unsupported rank for batchNormalization. It must be between 3 and 5.");
-  }
+  CHECK(context_properties_.data_type_limits.batch_normalization_input.Supports(
+      GetOperand(operation.input_operand_id).descriptor));
 
   // TODO(crbug.com/338398666): Consider supporting more values for
   // `operation.axis` by transposing the input. CoreML only supports
@@ -2007,6 +2002,7 @@
   }
 
   uint64_t input_operand_id = operation.input_operand_id;
+  const OperandInfo& input_operand_info = GetOperandInfo(input_operand_id);
   // Rank of 5 causes crashes when not targeting `MLComputeUnitsCPUOnly`, see
   // crbug.com/391566721, so reshape to 4 to perform batch norm, then reshape
   // back.
diff --git a/services/webnn/dml/context_impl_dml.cc b/services/webnn/dml/context_impl_dml.cc
index eaa1a3a..72bb2b5 100644
--- a/services/webnn/dml/context_impl_dml.cc
+++ b/services/webnn/dml/context_impl_dml.cc
@@ -115,7 +115,10 @@
        /*arg_min_max_output=*/DataTypeConstraint::kInt32To64,
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_batch_normalization_operator_desc#tensor-support
-       /*batch_normalization_input=*/DataTypeConstraint::kFloat16To32,
+       /*batch_normalization_input=*/
+       {DataTypeConstraint::kFloat16To32, kMaxRank},
+       /*batch_normalization_mean=*/
+       {DataTypeConstraint::kFloat16To32, kMaxRank},
 
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_cast_operator_desc#tensor-support
        /*cast_input=*/
diff --git a/services/webnn/dml/graph_impl_dml.cc b/services/webnn/dml/graph_impl_dml.cc
index 82d4754..aee08d00 100644
--- a/services/webnn/dml/graph_impl_dml.cc
+++ b/services/webnn/dml/graph_impl_dml.cc
@@ -1535,17 +1535,23 @@
     std::unordered_map<uint64_t, uint32_t>& constant_id_to_input_index_map,
     uint64_t& next_operand_id) {
   const auto& batch_normalization = operation->get_batch_normalization();
-  const NodeOutput* input = GetNodeOutputForOperand(
-      id_to_node_output_map, batch_normalization->input_operand_id);
+  auto& id_to_operand_map = graph_info->id_to_operand_map;
+
+  uint64_t input_id = batch_normalization->input_operand_id;
+  const OperandPtr& input_operand = id_to_operand_map.at(input_id);
+  CHECK(context_properties.data_type_limits.batch_normalization_input.Supports(
+      input_operand->descriptor));
+
+  const NodeOutput* input =
+      GetNodeOutputForOperand(id_to_node_output_map, input_id);
   const TensorDesc& input_tensor_desc = input->GetTensorDesc();
   const auto input_rank = input_tensor_desc.GetDimensions().size();
 
-  auto& id_to_operand_map = graph_info->id_to_operand_map;
   uint64_t output_id = batch_normalization->output_operand_id;
   const OperandPtr& output_operand = id_to_operand_map.at(output_id);
   OperandDataType data_type = output_operand->descriptor.data_type();
-  CHECK(context_properties.data_type_limits.batch_normalization_input.Has(
-      data_type));
+  CHECK(context_properties.data_type_limits.batch_normalization_input.data_types
+            .Has(data_type));
 
   const TensorDesc output_tensor_desc(GetTensorDataType(data_type),
                                       output_operand->descriptor.shape());
diff --git a/services/webnn/features.gni b/services/webnn/features.gni
index 428e42c..ab460084 100644
--- a/services/webnn/features.gni
+++ b/services/webnn/features.gni
@@ -3,16 +3,14 @@
 # found in the LICENSE file.
 
 import("//build/config/features.gni")
-import("//build/config/sanitizers/sanitizers.gni")
 import("//services/on_device_model/on_device_model.gni")
 
 declare_args() {
   # TFLite is used as a fallback option on macOS and Windows.
   webnn_use_tflite = is_android || is_chromeos || is_linux || is_mac || is_win
 
-  # Function pointer calls between chrome and liboptimization_guide_internal.so
-  # trip up CFI's indirect function call checks.
-  webnn_use_chrome_ml_api = enable_ml_internal && !use_cfi_icall
+  # Enable the GPU delegate provided by the Optimization Guide library.
+  webnn_use_chrome_ml_api = enable_ml_internal
 
   # Enable logging of TFLite profiling information on MLGraph destruction.
   webnn_enable_tflite_profiler = false
diff --git a/services/webnn/public/cpp/data_type_limits.cc b/services/webnn/public/cpp/data_type_limits.cc
index a80f7a4..b3fcbca 100644
--- a/services/webnn/public/cpp/data_type_limits.cc
+++ b/services/webnn/public/cpp/data_type_limits.cc
@@ -12,7 +12,8 @@
                                SupportedDataTypes constant,
                                SupportedTensors arg_min_max_input,
                                SupportedDataTypes arg_min_max_output,
-                               SupportedDataTypes batch_normalization_input,
+                               SupportedTensors batch_normalization_input,
+                               SupportedTensors batch_normalization_mean,
                                SupportedTensors cast_input,
                                SupportedTensors clamp_input,
                                SupportedDataTypes concat_inputs,
@@ -118,6 +119,7 @@
       arg_min_max_input(arg_min_max_input),
       arg_min_max_output(arg_min_max_output),
       batch_normalization_input(batch_normalization_input),
+      batch_normalization_mean(batch_normalization_mean),
       cast_input(cast_input),
       clamp_input(clamp_input),
       concat_inputs(concat_inputs),
diff --git a/services/webnn/public/cpp/data_type_limits.h b/services/webnn/public/cpp/data_type_limits.h
index bfc66788..acd24d1 100644
--- a/services/webnn/public/cpp/data_type_limits.h
+++ b/services/webnn/public/cpp/data_type_limits.h
@@ -18,7 +18,8 @@
                  SupportedDataTypes constant,
                  SupportedTensors arg_min_max_input,
                  SupportedDataTypes arg_min_max_output,
-                 SupportedDataTypes batch_normalization_input,
+                 SupportedTensors batch_normalization_input,
+                 SupportedTensors batch_normalization_mean,
                  SupportedTensors cast_input,
                  SupportedTensors clamp_input,
                  SupportedDataTypes concat_inputs,
@@ -134,7 +135,8 @@
   SupportedDataTypes constant;
   SupportedTensors arg_min_max_input;
   SupportedDataTypes arg_min_max_output;
-  SupportedDataTypes batch_normalization_input;
+  SupportedTensors batch_normalization_input;
+  SupportedTensors batch_normalization_mean;
   SupportedTensors cast_input;
   SupportedTensors clamp_input;
   SupportedDataTypes concat_inputs;
@@ -244,6 +246,7 @@
          lhs.arg_min_max_input == rhs.arg_min_max_input &&
          lhs.arg_min_max_output == rhs.arg_min_max_output &&
          lhs.batch_normalization_input == rhs.batch_normalization_input &&
+         lhs.batch_normalization_mean == rhs.batch_normalization_mean &&
          lhs.cast_input == rhs.cast_input &&
          lhs.clamp_input == rhs.clamp_input &&
          lhs.concat_inputs == rhs.concat_inputs &&
diff --git a/services/webnn/public/cpp/graph_validation_utils.cc b/services/webnn/public/cpp/graph_validation_utils.cc
index 84d6457..53499b1 100644
--- a/services/webnn/public/cpp/graph_validation_utils.cc
+++ b/services/webnn/public/cpp/graph_validation_utils.cc
@@ -501,14 +501,14 @@
     const OperandDescriptor& mean,
     const OperandDescriptor& variance,
     const BatchNormalizationAttributes& attributes) {
-  // Validate input type.
+  // Validate input operand.
   const std::string& label = attributes.label;
-  if (!context_properties.data_type_limits.batch_normalization_input.Has(
-          input.data_type())) {
+  if (!context_properties.data_type_limits.batch_normalization_input.Supports(
+          input)) {
     return base::unexpected(ErrorWithLabel(
         label,
-        NotSupportedInputArgumentTypeError(
-            input.data_type(),
+        NotSupportedInputArgumentError(
+            input,
             context_properties.data_type_limits.batch_normalization_input)));
   }
 
diff --git a/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc b/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
index 8fdf995c..5b92798 100644
--- a/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
+++ b/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
@@ -29,7 +29,11 @@
        /*arg_min_max_output=*/
        {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
        /*batch_normalization_input=*/
-       {webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        kMaxRank},
+       /*batch_normalization_mean=*/
+       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
+        kMaxRank},
        /*cast_input=*/
        {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
         kMaxRank},
@@ -242,7 +246,7 @@
        {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
        {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
        {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
-       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}});
+       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}});
 
   EXPECT_TRUE(
       mojo::test::SerializeAndDeserialize<webnn::mojom::ContextProperties>(
diff --git a/services/webnn/public/mojom/data_type_limits_mojom_traits.h b/services/webnn/public/mojom/data_type_limits_mojom_traits.h
index e18bde3..4a3615b 100644
--- a/services/webnn/public/mojom/data_type_limits_mojom_traits.h
+++ b/services/webnn/public/mojom/data_type_limits_mojom_traits.h
@@ -30,10 +30,14 @@
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.arg_min_max_output;
   }
-  static webnn::SupportedDataTypes batch_normalization_input(
+  static webnn::SupportedTensors batch_normalization_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.batch_normalization_input;
   }
+  static webnn::SupportedTensors batch_normalization_mean(
+      const webnn::DataTypeLimits& data_type_limits) {
+    return data_type_limits.batch_normalization_mean;
+  }
   static webnn::SupportedTensors cast_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.cast_input;
@@ -441,6 +445,7 @@
            data.ReadArgMinMaxInput(&out->arg_min_max_input) &&
            data.ReadArgMinMaxOutput(&out->arg_min_max_output) &&
            data.ReadBatchNormalizationInput(&out->batch_normalization_input) &&
+           data.ReadBatchNormalizationMean(&out->batch_normalization_mean) &&
            data.ReadCastInput(&out->cast_input) &&
            data.ReadClampInput(&out->clamp_input) &&
            data.ReadConcatInputs(&out->concat_inputs) &&
diff --git a/services/webnn/public/mojom/webnn_context_properties.mojom b/services/webnn/public/mojom/webnn_context_properties.mojom
index 629cc97..d7f5a86 100644
--- a/services/webnn/public/mojom/webnn_context_properties.mojom
+++ b/services/webnn/public/mojom/webnn_context_properties.mojom
@@ -58,7 +58,8 @@
   SupportedTensors arg_min_max_input;
   SupportedDataTypes arg_min_max_output;
 
-  SupportedDataTypes batch_normalization_input;
+  SupportedTensors batch_normalization_input;
+  SupportedTensors batch_normalization_mean;
   SupportedTensors cast_input;
   SupportedTensors clamp_input;
   SupportedDataTypes concat_inputs;
diff --git a/services/webnn/tflite/graph_builder_tflite.cc b/services/webnn/tflite/graph_builder_tflite.cc
index 8500f292..386c20e 100644
--- a/services/webnn/tflite/graph_builder_tflite.cc
+++ b/services/webnn/tflite/graph_builder_tflite.cc
@@ -430,7 +430,12 @@
        /*arg_min_max_input=*/
        {kFloat16To32AndInt8To32AndUint8, SupportedRanks::NonScalarUpTo(8)},
        /*arg_min_max_output=*/DataTypeConstraint::kInt32To64,
-       /*batch_normalization_input=*/DataTypeConstraint::kFloat16To32,
+       // BatchNormalization is emulated by sub, mul, add and div ops that only
+       // support max rank up to 5.
+       /*batch_normalization_input=*/
+       {DataTypeConstraint::kFloat16To32, SupportedRanks::UpTo(5)},
+       /*batch_normalization_mean=*/
+       {DataTypeConstraint::kFloat16To32, SupportedRanks::Exactly(1)},
        /*cast_input=*/
        {kFloat16To32AndInts8To32AndInt64, SupportedRanks::UpTo(8)},
        // Polyfilled using MIN and MAX.
@@ -1816,8 +1821,8 @@
 auto GraphBuilderTflite::SerializeBatchNormalization(
     const mojom::BatchNormalization& batch_normalization)
     -> base::expected<OperatorOffset, std::string> {
-  CHECK(context_properties_.data_type_limits.batch_normalization_input.Has(
-      GetOperand(batch_normalization.input_operand_id).descriptor.data_type()));
+  CHECK(context_properties_.data_type_limits.batch_normalization_input.Supports(
+      GetOperand(batch_normalization.input_operand_id).descriptor));
   ASSIGN_OR_RETURN(
       const TensorInfo& input_tensor_info,
       SerializeInputTensorInfo(batch_normalization.input_operand_id));
@@ -1829,20 +1834,22 @@
   new_shape[batch_normalization.axis] = dimension_on_axis;
 
   // Reshape the 1-D tensor of the mean operand to the new shape.
+  CHECK(context_properties_.data_type_limits.batch_normalization_mean.Supports(
+      GetOperand(batch_normalization.mean_operand_id).descriptor));
   ASSIGN_OR_RETURN(
       const TensorInfo& mean_tensor_info,
       SerializeInputTensorInfo(batch_normalization.mean_operand_id));
-  CHECK_EQ(mean_tensor_info.dimensions.size(), 1u);
   const int32_t reshape_mean_tensor_index =
       SerializeTemporaryTensor(new_shape, input_tensor_type);
   operators_.emplace_back(SerializeReshapeOperation(
       mean_tensor_info.index, reshape_mean_tensor_index, new_shape));
 
   // Reshape the 1-D tensor of the variance operand to the new shape.
+  CHECK(context_properties_.data_type_limits.batch_normalization_mean.Supports(
+      GetOperand(batch_normalization.variance_operand_id).descriptor));
   ASSIGN_OR_RETURN(
       const TensorInfo& variance_tensor_info,
       SerializeInputTensorInfo(batch_normalization.variance_operand_id));
-  CHECK_EQ(variance_tensor_info.dimensions.size(), 1u);
   const int32_t reshape_variance_tensor_index =
       SerializeTemporaryTensor(new_shape, input_tensor_type);
   operators_.emplace_back(SerializeReshapeOperation(
@@ -1851,10 +1858,12 @@
   // Reshape the 1-D tensor of the scale operand to the new shape if needed.
   std::optional<int32_t> reshape_scale_tensor_index;
   if (batch_normalization.scale_operand_id) {
+    CHECK(
+        context_properties_.data_type_limits.batch_normalization_mean.Supports(
+            GetOperand(*batch_normalization.scale_operand_id).descriptor));
     ASSIGN_OR_RETURN(
         const TensorInfo& scale_tensor_info,
         SerializeInputTensorInfo(*batch_normalization.scale_operand_id));
-    CHECK_EQ(scale_tensor_info.dimensions.size(), 1u);
     reshape_scale_tensor_index =
         SerializeTemporaryTensor(new_shape, input_tensor_type);
     operators_.emplace_back(SerializeReshapeOperation(
@@ -1864,10 +1873,12 @@
   // Reshape the 1-D tensor of the bias operand to the new shape if needed.
   std::optional<int32_t> reshape_bias_tensor_index;
   if (batch_normalization.bias_operand_id) {
+    CHECK(
+        context_properties_.data_type_limits.batch_normalization_mean.Supports(
+            GetOperand(*batch_normalization.bias_operand_id).descriptor));
     ASSIGN_OR_RETURN(
         const TensorInfo& bias_tensor_info,
         SerializeInputTensorInfo(*batch_normalization.bias_operand_id));
-    CHECK_EQ(bias_tensor_info.dimensions.size(), 1u);
     reshape_bias_tensor_index =
         SerializeTemporaryTensor(new_shape, input_tensor_type);
     operators_.emplace_back(SerializeReshapeOperation(
diff --git a/services/webnn/webnn_context_impl.cc b/services/webnn/webnn_context_impl.cc
index eef9439..9bcad461 100644
--- a/services/webnn/webnn_context_impl.cc
+++ b/services/webnn/webnn_context_impl.cc
@@ -155,24 +155,26 @@
     ContextProperties backend_context_properties) {
   // A specific maximum rank is still under discussion, but 8 is the highest
   // supported by any backend.
-  constexpr SupportedRanks kMaxRank = SupportedRanks::UpTo(8);
   constexpr SupportedRanks kNonScalarMaxRank = SupportedRanks::NonScalarUpTo(8);
 
   // Only intersects for ones that have limits defined in the specification.
   // For ones that has no limit, no need to intersect with
   // `SupportedDataTypes::All()`.
   backend_context_properties.data_type_limits.batch_normalization_input
-      .RetainAll(DataTypeConstraint::kFloat16To32);
-  backend_context_properties.data_type_limits.logical_not_input.IntersectWith(
-      {DataTypeConstraint::kUint8, kMaxRank});
+      .data_types.RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.batch_normalization_mean
+      .IntersectWith(
+          {DataTypeConstraint::kFloat16To32, SupportedRanks::Exactly(1)});
+  backend_context_properties.data_type_limits.logical_not_input.data_types
+      .RetainAll(DataTypeConstraint::kUint8);
   backend_context_properties.data_type_limits.logical_output.RetainAll(
       DataTypeConstraint::kUint8);
-  backend_context_properties.data_type_limits.abs_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32Int8To32, kMaxRank});
-  backend_context_properties.data_type_limits.ceil_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.cos_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.abs_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32Int8To32);
+  backend_context_properties.data_type_limits.ceil_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.cos_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.cumulative_sum_input
       .IntersectWith(
           {DataTypeConstraint::kFloat16To32Ints32To64, kNonScalarMaxRank});
@@ -182,54 +184,54 @@
       .RetainAll(DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.dequantize_linear_zero_point
       .data_types.RetainAll(DataTypeConstraint::kInts4ToInts8);
-  backend_context_properties.data_type_limits.erf_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.exp_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.floor_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.log_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.neg_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32Int8To32, kMaxRank});
-  backend_context_properties.data_type_limits.reciprocal_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.sign_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32Int8To64, kMaxRank});
-  backend_context_properties.data_type_limits.sin_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.sqrt_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.tan_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.elu_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.erf_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.exp_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.floor_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.log_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.neg_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32Int8To32);
+  backend_context_properties.data_type_limits.reciprocal_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.sign_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32Int8To64);
+  backend_context_properties.data_type_limits.sin_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.sqrt_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.tan_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.elu_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.gather_indices.RetainAll(
       DataTypeConstraint::kGatherScatterIndicesSupportedDataTypes);
   backend_context_properties.data_type_limits.gather_elements_indices.RetainAll(
       DataTypeConstraint::kGatherScatterIndicesSupportedDataTypes);
   backend_context_properties.data_type_limits.gather_nd_indices.RetainAll(
       DataTypeConstraint::kGatherScatterIndicesSupportedDataTypes);
-  backend_context_properties.data_type_limits.gelu_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.gelu_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.gemm_input.RetainAll(
       DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.gru_input.RetainAll(
       DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.gru_cell_input.RetainAll(
       DataTypeConstraint::kFloat16To32);
-  backend_context_properties.data_type_limits.hard_sigmoid_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.hard_swish_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.hard_sigmoid_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.hard_swish_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.instance_normalization_input
       .RetainAll(DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.layer_normalization_input
       .RetainAll(DataTypeConstraint::kFloat16To32);
-  backend_context_properties.data_type_limits.leaky_relu_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.linear_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.leaky_relu_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.linear_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.lstm_input.RetainAll(
       DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.lstm_cell_input.RetainAll(
@@ -251,24 +253,24 @@
       .RetainAll(DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.quantize_linear_zero_point
       .data_types.RetainAll(DataTypeConstraint::kInts4ToInts8);
-  backend_context_properties.data_type_limits.reduce_l1_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32Ints32To64, kMaxRank});
-  backend_context_properties.data_type_limits.reduce_l2_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.reduce_log_sum_input
-      .IntersectWith({DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.reduce_l1_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32Ints32To64);
+  backend_context_properties.data_type_limits.reduce_l2_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.reduce_log_sum_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.reduce_log_sum_exp_input
       .data_types.RetainAll(DataTypeConstraint::kFloat16To32);
-  backend_context_properties.data_type_limits.reduce_mean_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.reduce_product_input
-      .IntersectWith({DataTypeConstraint::kFloat16To32Ints32To64, kMaxRank});
-  backend_context_properties.data_type_limits.reduce_sum_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32Ints32To64, kMaxRank});
-  backend_context_properties.data_type_limits.reduce_sum_square_input
-      .IntersectWith({DataTypeConstraint::kFloat16To32Ints32To64, kMaxRank});
-  backend_context_properties.data_type_limits.relu_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32Int8To32, kMaxRank});
+  backend_context_properties.data_type_limits.reduce_mean_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.reduce_product_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32Ints32To64);
+  backend_context_properties.data_type_limits.reduce_sum_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32Ints32To64);
+  backend_context_properties.data_type_limits.reduce_sum_square_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32Ints32To64);
+  backend_context_properties.data_type_limits.relu_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32Int8To32);
   backend_context_properties.data_type_limits.resample2d_input.IntersectWith(
       {DataTypeConstraint::kFloat16To32, SupportedRanks::Exactly(4)});
   backend_context_properties.data_type_limits.scatter_elements_input.ranks
@@ -281,18 +283,18 @@
   backend_context_properties.data_type_limits.scatter_nd_indices.IntersectWith(
       {DataTypeConstraint::kGatherScatterIndicesSupportedDataTypes,
        SupportedRanks::NonScalarUpTo(8)});
-  backend_context_properties.data_type_limits.sigmoid_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.sigmoid_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.slice_input.IntersectWith(
       {SupportedDataTypes::All(), kNonScalarMaxRank});
-  backend_context_properties.data_type_limits.softmax_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.softplus_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.softsign_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
-  backend_context_properties.data_type_limits.tanh_input.IntersectWith(
-      {DataTypeConstraint::kFloat16To32, kMaxRank});
+  backend_context_properties.data_type_limits.softmax_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.softplus_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.softsign_input.data_types
+      .RetainAll(DataTypeConstraint::kFloat16To32);
+  backend_context_properties.data_type_limits.tanh_input.data_types.RetainAll(
+      DataTypeConstraint::kFloat16To32);
   backend_context_properties.data_type_limits.triangular_input.IntersectWith(
       {SupportedDataTypes::All(), {2, 8}});
   backend_context_properties.data_type_limits.where_condition.data_types
diff --git a/services/webnn/webnn_test_utils.cc b/services/webnn/webnn_test_utils.cc
index 02730d9d..79c1117 100644
--- a/services/webnn/webnn_test_utils.cc
+++ b/services/webnn/webnn_test_utils.cc
@@ -583,7 +583,8 @@
        {SupportedDataTypes::All(), kMaxRank},
        /*arg_min_max_output=*/
        {OperandDataType::kInt32, OperandDataType::kInt64},
-       /*batch_normalization_input=*/SupportedDataTypes::All(),
+       /*batch_normalization_input=*/{SupportedDataTypes::All(), kMaxRank},
+       /*batch_normalization_mean=*/{SupportedDataTypes::All(), kMaxRank},
        /*cast_input=*/{SupportedDataTypes::All(), kMaxRank},
        /*clamp_input=*/{SupportedDataTypes::All(), kMaxRank},
        /*concat_inputs=*/SupportedDataTypes::All(),
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index 890438c..6b0b1694 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -67,12 +67,6 @@
     "SK_USER_CONFIG_HEADER=\"../../skia/config/SkUserConfig.h\"",
     "SK_WIN_FONTMGR_NO_SIMULATIONS",
     "SK_DISABLE_LEGACY_INIT_DECODERS",
-    "SK_DISABLE_LEGACY_BACKEND_TEXTURE_FUNCS",
-    "SK_DISABLE_LEGACY_TEXTURE_INFO_FUNCS",
-    "SK_DISABLE_LEGACY_BACKEND_SEMAPHORE_FUNCS",
-    "SK_DISABLE_LEGACY_GRAPHITE_IMAGES",
-    "SK_DISABLE_LEGACY_DAWN_TEXTURE_INFO_FUNCS",
-    "SK_DISABLE_LEGACY_DAWN_BACKEND_TEXTURE_FUNCS",
   ]
 
   include_dirs = [
@@ -84,9 +78,7 @@
     # TODO(kjlubick) make these not necessary
     defines += [
       "SK_CODEC_DECODES_JPEG",
-      "SK_ENCODE_JPEG",
-      "SK_ENCODE_PNG",
-      "SK_ENCODE_WEBP",
+      "SK_CODEC_ENCODES_JPEG",
     ]
     include_dirs += [ "//third_party/wuffs/src/release/c" ]
   }
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index c35d5101..baebb14 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -150,6 +150,21 @@
             ]
         }
     ],
+    "AccessibilityTextFormatting": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AccessibilityTextFormatting"
+                    ]
+                }
+            ]
+        }
+    ],
     "AccessibilityUnifiedSnapshots": [
         {
             "platforms": [
@@ -621,7 +636,7 @@
             ],
             "experiments": [
                 {
-                    "name": "DefaultAfterLoading",
+                    "name": "CreateByDefault_AfterLoading",
                     "params": {
                         "spare_renderer_creation_timing": "after-loading",
                         "spare_renderer_timeout_seconds": "60"
@@ -681,29 +696,7 @@
             ]
         }
     ],
-    "AndroidTabDeclutter": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "params": {
-                        "android_tab_declutter_archive_enabled": "true",
-                        "android_tab_declutter_archive_time_delta_hours": "504",
-                        "android_tab_declutter_auto_delete_enabled": "false",
-                        "android_tab_declutter_max_simultaneous_archives": "250"
-                    },
-                    "enable_features": [
-                        "AndroidTabDeclutter",
-                        "IPH_AndroidTabDeclutter"
-                    ]
-                }
-            ]
-        }
-    ],
-    "AndroidUseFrameIntervalDecider": [
+    "AndroidTabDeclutterDuplicateUrls": [
         {
             "platforms": [
                 "android"
@@ -712,7 +705,7 @@
                 {
                     "name": "Enabled",
                     "enable_features": [
-                        "UseFrameIntervalDecider"
+                        "AndroidTabDeclutterArchiveDuplicateTabs"
                     ]
                 }
             ]
@@ -6210,26 +6203,6 @@
             ]
         }
     ],
-    "ConcurrentViewTransitionsSPA": [
-        {
-            "platforms": [
-                "android_webview",
-                "android",
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ConcurrentViewTransitionsSPA"
-                    ]
-                }
-            ]
-        }
-    ],
     "ConditionalImageResize": [
         {
             "platforms": [
@@ -7494,6 +7467,21 @@
             ]
         }
     ],
+    "DefaultBrowserBannerPromo": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "DefaultBrowserBannerPromo"
+                    ]
+                }
+            ]
+        }
+    ],
     "DefaultBrowserPromoAndroid2": [
         {
             "platforms": [
@@ -10133,9 +10121,18 @@
                     ]
                 },
                 {
-                    "name": "Internal_Enabled",
+                    "name": "Freetype_Enabled",
                     "params": {
-                        "typeface": "Internal"
+                        "typeface": "Freetype"
+                    },
+                    "enable_features": [
+                        "FontDataServiceAllWebContents"
+                    ]
+                },
+                {
+                    "name": "Fontations_Enabled",
+                    "params": {
+                        "typeface": "Fontations"
                     },
                     "enable_features": [
                         "FontDataServiceAllWebContents"
@@ -11792,6 +11789,21 @@
             ]
         }
     ],
+    "IOSExplicitUITraitRegistration": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "EnableTraitCollectionRegistration"
+                    ]
+                }
+            ]
+        }
+    ],
     "IOSFastApplicationWillTerminate": [
         {
             "platforms": [
@@ -11949,6 +11961,21 @@
             ]
         }
     ],
+    "IOSImprovePasswordFieldDetectionForFilling": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "IOSImprovePasswordFieldDetectionForFilling"
+                    ]
+                }
+            ]
+        }
+    ],
     "IOSInactiveTabsIPad": [
         {
             "platforms": [
@@ -15858,28 +15885,19 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_Dogfood",
-                    "enable_features": [
-                        "AllowWindowDragUsingSystemDragDrop",
+                    "name": "Default",
+                    "disable_features": [
                         "OverrideDefaultOzonePlatformHintToAuto"
                     ]
                 },
                 {
-                    "name": "Enabled_IME_Dogfood",
-                    "enable_features": [
-                        "AllowWindowDragUsingSystemDragDrop",
-                        "OverrideDefaultOzonePlatformHintToAuto",
-                        "WaylandPerSurfaceScale",
-                        "WaylandTextInputV3"
-                    ]
-                },
-                {
-                    "name": "Enabled_IME_UiScale_Video_Dogfood",
+                    "name": "Enabled_Dogfood",
                     "enable_features": [
                         "AcceleratedVideoDecodeLinuxGL",
                         "AcceleratedVideoDecodeLinuxZeroCopyGL",
                         "AllowWindowDragUsingSystemDragDrop",
                         "OverrideDefaultOzonePlatformHintToAuto",
+                        "WaylandLinuxDrmSyncobj",
                         "WaylandPerSurfaceScale",
                         "WaylandTextInputV3",
                         "WaylandUiScale"
@@ -21770,7 +21788,7 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_Both",
+                    "name": "Enabled_Both_20250207",
                     "params": {
                         "delay_after_tasks": "30",
                         "max_chunk_size": "100"
diff --git a/third_party/angle b/third_party/angle
index f102ef0..6aa46be 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit f102ef023fcb279daa667c7ab80d72c533869c98
+Subproject commit 6aa46befc457f8876651c1b4e140fb2d352a326d
diff --git a/third_party/bidimapper/README.chromium b/third_party/bidimapper/README.chromium
index 904a5e62..6a8bc0a9c 100644
--- a/third_party/bidimapper/README.chromium
+++ b/third_party/bidimapper/README.chromium
@@ -5,7 +5,7 @@
 Date: 2025-02-19
 Revision: d627cbddd9fd896f287deabe1b9fb948f217deae
 SHA-512: f3f64c16f4c2b1566675b3e579ee51b7abef2874f10b10ae5790baf6d6c65ecc029ee39a90bf3ffa7fb53aa10e5d0eb199b0b115648f7313535dab5d28f1e8e4
-License: Apache 2.0
+License: Apache-2.0
 License File: LICENSE
 Shipped: yes
 Security Critical: no
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index d6e6b77..502e490 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -47,13 +47,6 @@
              "AvoidTrustedParamsCopies",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
-// Changes default Permissions Policy for features join-ad-interest-group and
-// run-ad-auction to a more restricted EnableForSelf.
-BASE_FEATURE(kAdInterestGroupAPIRestrictedPolicyByDefault,
-             "AdInterestGroupAPIRestrictedPolicyByDefault",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Block all MIDI access with the MIDI_SYSEX permission
 BASE_FEATURE(kBlockMidiByDefault,
              "BlockMidiByDefault",
@@ -719,6 +712,12 @@
              "DisableThirdPartyStoragePartitioning3DeprecationTrial",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Drop input events at the browser process until the process receives the first
+// signal that the renderer has sent a frame to cc (https://crbug.com/40057499).
+BASE_FEATURE(kDropInputEventsWhilePaintHolding,
+             "DropInputEventsWhilePaintHolding",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kEstablishGpuChannelAsync,
              "EstablishGpuChannelAsync",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -1248,6 +1247,15 @@
              "AttributionReportingInBrowserMigration",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kLimitLayerMergeDistance,
+             "LimitLayerMergeDistance",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE_PARAM(size_t,
+                   kLayerMergeDistanceLimit,
+                   &kLimitLayerMergeDistance,
+                   "limit",
+                   0x10000000);
+
 BASE_FEATURE(kLCPCriticalPathPredictor,
              "LCPCriticalPathPredictor",
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -2331,7 +2339,7 @@
 // Tracking bug: https://crbug.com/402694.
 BASE_FEATURE(kSetIntervalWithoutClamp,
              "SetIntervalWithoutClamp",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enable the shared storage API. Note that enabling this feature does not
 // automatically expose this API to the web, it only allows the element to be
diff --git a/third_party/blink/common/interest_group/devtools_serialization.cc b/third_party/blink/common/interest_group/devtools_serialization.cc
index 12d51f6f..cb18e0817 100644
--- a/third_party/blink/common/interest_group/devtools_serialization.cc
+++ b/third_party/blink/common/interest_group/devtools_serialization.cc
@@ -504,6 +504,8 @@
                     ig.max_trusted_bidding_signals_url_length, result);
   SerializeIntoDict("trustedBiddingSignalsCoordinator",
                     ig.trusted_bidding_signals_coordinator, result);
+  SerializeIntoDict("viewAndClickCountsProviders",
+                    ig.view_and_click_counts_providers, result);
   SerializeIntoDict("userBiddingSignals", ig.user_bidding_signals, result);
   SerializeIntoDict("ads", ig.ads, result);
   SerializeIntoDict("adComponents", ig.ad_components, result);
diff --git a/third_party/blink/common/interest_group/devtools_serialization_unittest.cc b/third_party/blink/common/interest_group/devtools_serialization_unittest.cc
index f58206b5..5a194a2 100644
--- a/third_party/blink/common/interest_group/devtools_serialization_unittest.cc
+++ b/third_party/blink/common/interest_group/devtools_serialization_unittest.cc
@@ -265,6 +265,8 @@
   ig.max_trusted_bidding_signals_url_length = 100;
   ig.trusted_bidding_signals_coordinator =
       url::Origin::Create(GURL("https://example.test"));
+  ig.view_and_click_counts_providers = {
+      {url::Origin::Create(GURL("https://example.test"))}};
   ig.user_bidding_signals = "hello";
   ig.ads = {
       {blink::InterestGroup::Ad(
@@ -309,6 +311,7 @@
     "trustedBiddingSignalsSlotSizeMode": "all-slots-requested-sizes",
     "maxTrustedBiddingSignalsURLLength": 100,
     "trustedBiddingSignalsCoordinator": "https://example.test",
+    "viewAndClickCountsProviders": ["https://example.test"],
     "userBiddingSignals": "hello",
     "ads": [ {
       "adRenderId": "ad_render_id",
diff --git a/third_party/blink/common/interest_group/interest_group.cc b/third_party/blink/common/interest_group/interest_group.cc
index a5805ec3..810a0a73 100644
--- a/third_party/blink/common/interest_group/interest_group.cc
+++ b/third_party/blink/common/interest_group/interest_group.cc
@@ -316,6 +316,14 @@
     }
   }
 
+  if (view_and_click_counts_providers) {
+    for (const url::Origin& provider : *view_and_click_counts_providers) {
+      if (provider.scheme() != url::kHttpsScheme) {
+        return false;
+      }
+    }
+  }
+
   if (ads) {
     std::optional<size_t> selectable_buyer_and_seller_reporting_ids_hard_limit;
     if (base::FeatureList::IsEnabled(
@@ -504,6 +512,11 @@
   if (trusted_bidding_signals_coordinator) {
     size += trusted_bidding_signals_coordinator->Serialize().size();
   }
+  if (view_and_click_counts_providers) {
+    for (const url::Origin& provider : *view_and_click_counts_providers) {
+      size += provider.Serialize().size();
+    }
+  }
   if (user_bidding_signals) {
     size += user_bidding_signals->size();
   }
diff --git a/third_party/blink/common/interest_group/interest_group_mojom_traits.cc b/third_party/blink/common/interest_group/interest_group_mojom_traits.cc
index b2344ca..3d26067 100644
--- a/third_party/blink/common/interest_group/interest_group_mojom_traits.cc
+++ b/third_party/blink/common/interest_group/interest_group_mojom_traits.cc
@@ -81,6 +81,8 @@
       !data.ReadTrustedBiddingSignalsKeys(&out->trusted_bidding_signals_keys) ||
       !data.ReadTrustedBiddingSignalsCoordinator(
           &out->trusted_bidding_signals_coordinator) ||
+      !data.ReadViewAndClickCountsProviders(
+          &out->view_and_click_counts_providers) ||
       !data.ReadUserBiddingSignals(&out->user_bidding_signals) ||
       !data.ReadAds(&out->ads) || !data.ReadAdComponents(&out->ad_components) ||
       !data.ReadAdSizes(&out->ad_sizes) ||
diff --git a/third_party/blink/common/interest_group/interest_group_mojom_traits_test.cc b/third_party/blink/common/interest_group/interest_group_mojom_traits_test.cc
index f79ebf44..3899f3b 100644
--- a/third_party/blink/common/interest_group/interest_group_mojom_traits_test.cc
+++ b/third_party/blink/common/interest_group/interest_group_mojom_traits_test.cc
@@ -290,6 +290,23 @@
                                        "trustedBiddingSignalsCoordinator");
 }
 
+TEST(InterestGroupMojomTraitsTest,
+     SerializeAndDeserializeViewAndClickCountsProviders) {
+  InterestGroup interest_group = CreateInterestGroup();
+  interest_group.view_and_click_counts_providers = {
+      {url::Origin::Create(GURL("https://example.test"))}};
+  SerializeAndDeserializeAndCompare(interest_group);
+}
+
+TEST(InterestGroupMojomTraitsTest,
+     SerializeAndDeserializeInvalidViewAndClickCountsProviders) {
+  InterestGroup interest_group = CreateInterestGroup();
+  interest_group.view_and_click_counts_providers = {
+      {url::Origin::Create(GURL("http://example.test"))}};
+  SerializeAndDeserializeExpectFailure(interest_group,
+                                       "viewAndClickCountsProviders");
+}
+
 TEST(InterestGroupMojomTraitsTest, SerializeAndDeserializeUserBiddingSignals) {
   InterestGroup interest_group = CreateInterestGroup();
   interest_group.user_bidding_signals = "[]";
diff --git a/third_party/blink/common/interest_group/test/interest_group_test_utils.cc b/third_party/blink/common/interest_group/test/interest_group_test_utils.cc
index 4b3f47e..4b3b2b6 100644
--- a/third_party/blink/common/interest_group/test/interest_group_test_utils.cc
+++ b/third_party/blink/common/interest_group/test/interest_group_test_utils.cc
@@ -204,6 +204,12 @@
              expected.max_trusted_bidding_signals_url_length);
   IG_COMPARE(actual.trusted_bidding_signals_coordinator,
              expected.trusted_bidding_signals_coordinator);
+  auto compare_origins = [&](const url::Origin& actual,
+                             const url::Origin& expected) {
+    IG_COMPARE(actual, expected);
+  };
+  IG_COMPARE_VEC(actual.view_and_click_counts_providers,
+                 expected.view_and_click_counts_providers, compare_origins);
   IG_COMPARE(actual.user_bidding_signals, expected.user_bidding_signals);
   auto compare_ads = [&](const blink::InterestGroup::Ad& actual,
                          const blink::InterestGroup::Ad& expected) {
@@ -218,10 +224,6 @@
                    compare_strings);
     IG_COMPARE(actual.ad_render_id, expected.ad_render_id);
 
-    auto compare_origins = [&](const url::Origin& actual,
-                               const url::Origin& expected) {
-      IG_COMPARE(actual, expected);
-    };
     IG_COMPARE_VEC(actual.allowed_reporting_origins,
                    expected.allowed_reporting_origins, compare_origins);
     IG_COMPARE(actual.creative_scanning_metadata,
diff --git a/third_party/blink/common/interest_group/test_interest_group_builder.cc b/third_party/blink/common/interest_group/test_interest_group_builder.cc
index f29d4c4..dc196392 100644
--- a/third_party/blink/common/interest_group/test_interest_group_builder.cc
+++ b/third_party/blink/common/interest_group/test_interest_group_builder.cc
@@ -143,7 +143,15 @@
 TestInterestGroupBuilder::SetTrustedBiddingSignalsCoordinator(
     std::optional<url::Origin> trusted_bidding_signals_coordinator) {
   interest_group_.trusted_bidding_signals_coordinator =
-      trusted_bidding_signals_coordinator;
+      std::move(trusted_bidding_signals_coordinator);
+  return *this;
+}
+
+TestInterestGroupBuilder&
+TestInterestGroupBuilder::SetViewAndClickCountsProviders(
+    std::optional<std::vector<url::Origin>> view_and_click_counts_providers) {
+  interest_group_.view_and_click_counts_providers =
+      std::move(view_and_click_counts_providers);
   return *this;
 }
 
@@ -194,7 +202,8 @@
 TestInterestGroupBuilder&
 TestInterestGroupBuilder::SetAggregationCoordinatorOrigin(
     std::optional<url::Origin> agg_coordinator_origin) {
-  interest_group_.aggregation_coordinator_origin = agg_coordinator_origin;
+  interest_group_.aggregation_coordinator_origin =
+      std::move(agg_coordinator_origin);
   return *this;
 }
 
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 34f0ddf0..710ac54f 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -40,11 +40,6 @@
 // Avoids copying ResourceRequest::TrustedParams when possible.
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kAvoidTrustedParamsCopies);
 
-// Runtime flag that changes default Permissions Policy for features
-// join-ad-interest-group and run-ad-auction to a more restricted EnableForSelf.
-BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
-    kAdInterestGroupAPIRestrictedPolicyByDefault);
-
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLowerHighResolutionTimerThreshold);
 
 // Allows running DevTools main thread debugger even when a renderer process
@@ -404,6 +399,8 @@
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
     kDiscardInputEventsToRecentlyMovedFrames);
 
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kDropInputEventsWhilePaintHolding);
+
 // Enables establishing the GPU channel asnchronously when requesting a new
 // layer tree frame sink.
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kEstablishGpuChannelAsync);
@@ -748,6 +745,13 @@
 // the current direction.
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kKalmanDirectionCutOff);
 
+// When enabled, PaintArtifactCompositor::Layerizer will limit the distance
+// (in number of non-mergeable intermediate PendingLayers) between merged
+// layers to kLayerMergeDistanceLimit, to reduce the cost of layerization.
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLimitLayerMergeDistance);
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t,
+                                               kLayerMergeDistanceLimit);
+
 // When enabled, LCP critical path predictor will optimize the subsequent visits
 // to websites using performance hints collected in the past page loads.
 // It enables boosting a loading priority of the possible LCP element.
diff --git a/third_party/blink/public/common/interest_group/interest_group.h b/third_party/blink/public/common/interest_group/interest_group.h
index f4e1e77..7170a853 100644
--- a/third_party/blink/public/common/interest_group/interest_group.h
+++ b/third_party/blink/public/common/interest_group/interest_group.h
@@ -170,6 +170,7 @@
       TrustedBiddingSignalsSlotSizeMode::kNone;
   int32_t max_trusted_bidding_signals_url_length = 0;
   std::optional<url::Origin> trusted_bidding_signals_coordinator;
+  std::optional<std::vector<url::Origin>> view_and_click_counts_providers;
   std::optional<std::string> user_bidding_signals;
   std::optional<std::vector<InterestGroup::Ad>> ads, ad_components;
   std::optional<base::flat_map<std::string, blink::AdSize>> ad_sizes;
@@ -181,7 +182,7 @@
   std::optional<AdditionalBidKey> additional_bid_key;
   std::optional<url::Origin> aggregation_coordinator_origin;
 
-  static_assert(__LINE__ == 184, R"(
+  static_assert(__LINE__ == 185, R"(
 If modifying InterestGroup fields, make sure to also modify:
 
 * IsValid(), EstimateSize(), and in this class
@@ -189,13 +190,13 @@
 * SerializeInterestGroupForDevtools()
     (in devtools_serialization.cc; test in devtools_serialization_unittest.cc)
 * auction_ad_interest_group.idl
-* navigator_auction.cc
+* navigator_auction.cc (test logic in interest_group_browsertest.cc)
 * interest_group_types.mojom
 * validate_blink_interest_group.cc (includes blink version of EstimateSize)
 * validate_blink_interest_group_test.cc
     (at least CreateFullyPopulatedInterestGroup)
 * test_interest_group_builder[.h/.cc]
-* interest_group_mojom_traits[.h/.cc/.test]
+* interest_group_mojom_traits[.h/.cc/_test.cc]
 * bidder_lazy_filler.cc (to pass the InterestGroup to generateBid())
 * shared_storage_worklet_global_scope.cc (interestGroups())
 * shared_storage_worklet_unittest.cc (SharedStorageWorkletTest.InterestGroups)
diff --git a/third_party/blink/public/common/interest_group/interest_group_mojom_traits.h b/third_party/blink/public/common/interest_group/interest_group_mojom_traits.h
index 70d0fff..d430013 100644
--- a/third_party/blink/public/common/interest_group/interest_group_mojom_traits.h
+++ b/third_party/blink/public/common/interest_group/interest_group_mojom_traits.h
@@ -206,6 +206,11 @@
     return interest_group.trusted_bidding_signals_coordinator;
   }
 
+  static const std::optional<std::vector<url::Origin>>&
+  view_and_click_counts_providers(const blink::InterestGroup& interest_group) {
+    return interest_group.view_and_click_counts_providers;
+  }
+
   static const std::optional<std::string>& user_bidding_signals(
       const blink::InterestGroup& interest_group) {
     return interest_group.user_bidding_signals;
diff --git a/third_party/blink/public/common/interest_group/test_interest_group_builder.h b/third_party/blink/public/common/interest_group/test_interest_group_builder.h
index 0cd7ec4f..9b0caa9 100644
--- a/third_party/blink/public/common/interest_group/test_interest_group_builder.h
+++ b/third_party/blink/public/common/interest_group/test_interest_group_builder.h
@@ -63,6 +63,8 @@
       int32_t max_trusted_bidding_signals_url_length);
   TestInterestGroupBuilder& SetTrustedBiddingSignalsCoordinator(
       std::optional<url::Origin> trusted_bidding_signals_coordinator);
+  TestInterestGroupBuilder& SetViewAndClickCountsProviders(
+      std::optional<std::vector<url::Origin>> view_and_click_counts_providers);
   TestInterestGroupBuilder& SetUserBiddingSignals(
       std::optional<std::string> user_bidding_signals);
   TestInterestGroupBuilder& SetAds(
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index b3905427..e29ab008 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -9751,6 +9751,7 @@
       EmbedderExtensionSentMessageToCachedFrame
       RequestedByWebViewClient
       PostMessageByWebViewClient
+      CacheControlNoStoreDeviceBoundSessionTerminated
 
   # Types of not restored reasons for back-forward cache.
   experimental type BackForwardCacheNotRestoredReasonType extends string
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 577b103..1b2fbd36 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -313,6 +313,7 @@
     "//services/network/public/mojom:mojom_proxy_config",
     "//services/network/public/mojom:url_loader_base",
     "//services/network/public/mojom:websocket_mojom",
+    "//services/on_device_model/public/mojom",
     "//services/service_manager/public/mojom",
     "//services/viz/public/mojom",
     "//skia/public/mojom",
diff --git a/third_party/blink/public/mojom/ai/ai_language_model.mojom b/third_party/blink/public/mojom/ai/ai_language_model.mojom
index 63d6e16..8b4eb7b 100644
--- a/third_party/blink/public/mojom/ai/ai_language_model.mojom
+++ b/third_party/blink/public/mojom/ai/ai_language_model.mojom
@@ -4,6 +4,7 @@
 
 module blink.mojom;
 
+import "services/on_device_model/public/mojom/on_device_model.mojom";
 import "third_party/blink/public/mojom/ai/ai_common.mojom";
 import "third_party/blink/public/mojom/ai/model_streaming_responder.mojom";
 
@@ -108,7 +109,8 @@
   // Prompts the model on the given input which can be an arbitrary string
   // from the JavaScript API.
   Prompt(
-    string input, pending_remote<ModelStreamingResponder> pending_responder
+    on_device_model.mojom.Input input,
+    pending_remote<ModelStreamingResponder> pending_responder
   );
   // Creates a new session with the same configuration and existing context
   // as the current session.
diff --git a/third_party/blink/public/mojom/ai/ai_manager.mojom b/third_party/blink/public/mojom/ai/ai_manager.mojom
index 539cdd2f4..b4c7b783 100644
--- a/third_party/blink/public/mojom/ai/ai_manager.mojom
+++ b/third_party/blink/public/mojom/ai/ai_manager.mojom
@@ -64,6 +64,8 @@
   kUnavailableModelNotEligible = 17,
   // The device does not have sufficient disk space for the on-device model.
   kUnavailableInsufficientDiskSpace = 18,
+  // The on-device translation is not available for the given pair of languages.
+  kUnavailableTranslationNotEligible = 19,
 
   // Append new line here
 };
diff --git a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
index 2d621098..2e2cbfe 100644
--- a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
+++ b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
@@ -179,6 +179,9 @@
   // An optional field for matching the encryption key, and indicating which
   // version of the key-value server this interest group uses.
   url.mojom.Origin? trusted_bidding_signals_coordinator;
+  // Stores the set of origins that are allowed to provide view and click
+  // counts to this interest group's generateBid() function.
+  array<url.mojom.Origin>? view_and_click_counts_providers;
   // Opaque JSON data, persisted, then passed as object to auction worklet.
   string? user_bidding_signals;
   array<InterestGroupAd>? ads;
diff --git a/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom b/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom
index b3ca77ba..4274964f 100644
--- a/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom
+++ b/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom
@@ -148,7 +148,8 @@
   TranslationAvailability availability;
 };
 
-// The manager for on-device translation.
+// Interface to manage translation between languages on-device. Process called
+// from the renderer and used to implement the translation in the browser process.
 interface TranslationManager {
   // Returns if it is supported to create a translator that could translate
   // texts from `source_lang` to `target_lang`.
@@ -172,4 +173,8 @@
 
   // Get the necessary information to calculate translator availability.
   GetTranslatorAvailabilityInfo() => (TranslatorAvailabilityInfo info);
+
+  // Returns the availability of the language pair translation.
+  TranslationAvailable(string source_lang, string target_lang) =>
+      (CanCreateTranslatorResult result);
 };
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index 47f96b8..0d881cb6 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4708,6 +4708,7 @@
   kColumnPseudoElement = 5322,
   kScrollButtonPseudoElement = 5323,
   kScrollMarkerPseudoElement = 5324,
+  kV8AITranslatorFactory_Availability_Method = 5325,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots. Also don't add extra
diff --git a/third_party/blink/public/mojom/widget/platform_widget.mojom b/third_party/blink/public/mojom/widget/platform_widget.mojom
index 3f6fb56..a15c8121 100644
--- a/third_party/blink/public/mojom/widget/platform_widget.mojom
+++ b/third_party/blink/public/mojom/widget/platform_widget.mojom
@@ -66,12 +66,16 @@
 
   // Create a CompositorFrameSink that is associated with this widget.
   // The renderer compositor will use the returned sink to submit
-  // CompositorFrames for this widget.
+  // CompositorFrames for this widget. Sends remote to browser to connect
+  // Viz <-> Renderer RenderInputRouterClient mojo interface when InputVizard is
+  // enabled.
   CreateFrameSink(
       pending_receiver<viz.mojom.CompositorFrameSink>
           compositor_frame_sink_receiver,
       pending_remote<viz.mojom.CompositorFrameSinkClient>
-          compositor_frame_sink_client);
+          compositor_frame_sink_client,
+      pending_remote<blink.mojom.RenderInputRouterClient>
+          render_input_router_client);
 
   // Register compositor RenderFrameMetadataObserver and client.
   // This call will be made in conjunction with calling CreateFrameSink.
@@ -122,11 +126,10 @@
   // none this will do nothing.
   CancelSuccessfulPresentationTimeRequest();
 
-  // Setup the RenderInputRouter mojo connections.
-  // `viz_client` is only set when `InputOnViz` flag is enabled.
-  SetupRenderInputRouterConnections(
-    pending_receiver<blink.mojom.RenderInputRouterClient> browser_client,
-    pending_receiver<blink.mojom.RenderInputRouterClient>? viz_client);
+  // Setup the RenderInputRouter mojo connection between the browser and the
+  // renderer process.
+  SetupBrowserRenderInputRouterConnections(
+    pending_receiver<blink.mojom.RenderInputRouterClient> browser_client);
 };
 
 // Implemented in Blink, this interface defines input-specific methods that will
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index 0c518d3..cfa2a64 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -834,9 +834,10 @@
   virtual void OnFrameVisibilityChanged(mojom::FrameVisibility render_status) {}
 
   // Called after a navigation which set the shared memory region for
-  // tracking smoothness via UKM.
-  virtual void SetUpSharedMemoryForSmoothness(
-      base::ReadOnlySharedMemoryRegion shared_memory) {}
+  // tracking smoothness and dropped frames UKMs.
+  virtual void SetUpSharedMemoryForUkms(
+      base::ReadOnlySharedMemoryRegion smoothness_memory,
+      base::ReadOnlySharedMemoryRegion dropped_frames_memory) {}
 
   // Returns the last commited URL used for UKM. This is slightly different
   // than the document's URL because it will contain a data URL if a base URL
diff --git a/third_party/blink/renderer/build/scripts/templates/permissions_policy_features_generated.cc.tmpl b/third_party/blink/renderer/build/scripts/templates/permissions_policy_features_generated.cc.tmpl
index 8101415..6d85d7f 100644
--- a/third_party/blink/renderer/build/scripts/templates/permissions_policy_features_generated.cc.tmpl
+++ b/third_party/blink/renderer/build/scripts/templates/permissions_policy_features_generated.cc.tmpl
@@ -7,7 +7,7 @@
 
 #include "base/no_destructor.h"
 #include "base/feature_list.h"
-#include "third_party/blink/public/common/features.h"
+#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom.h"
 
 namespace blink {
@@ -18,7 +18,7 @@
   {%- if feature.default_value_behind_flag %}
     {%- for flag, default_value in feature.default_value_behind_flag %}
       {%- if not loop.first %} else {% endif %}
-  if (base::FeatureList::IsEnabled(features::k{{flag}})) {
+  if (base::FeatureList::IsEnabled(network::features::k{{flag}})) {
     mutable_feature_list.find(network::mojom::PermissionsPolicyFeature::k{{feature.name}})->second =
       PermissionsPolicyFeatureDefault::{{default_value}};
   }
diff --git a/third_party/blink/renderer/build/scripts/tests/permissions_policy_default_value_control/output/permissions_policy_features_generated.cc.ref b/third_party/blink/renderer/build/scripts/tests/permissions_policy_default_value_control/output/permissions_policy_features_generated.cc.ref
index 0e9c1f8..a0b8ed7 100644
--- a/third_party/blink/renderer/build/scripts/tests/permissions_policy_default_value_control/output/permissions_policy_features_generated.cc.ref
+++ b/third_party/blink/renderer/build/scripts/tests/permissions_policy_default_value_control/output/permissions_policy_features_generated.cc.ref
@@ -7,14 +7,14 @@
 
 #include "base/no_destructor.h"
 #include "base/feature_list.h"
-#include "third_party/blink/public/common/features.h"
+#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom.h"
 
 namespace blink {
 
 // Applies new defaults based on flags.
 void UpdatePermissionsPolicyFeatureListFlagDefaults(PermissionsPolicyFeatureList& mutable_feature_list) {
-  if (base::FeatureList::IsEnabled(features::kTestFlag)) {
+  if (base::FeatureList::IsEnabled(network::features::kTestFlag)) {
     mutable_feature_list.find(network::mojom::PermissionsPolicyFeature::kAccelerometer)->second =
       PermissionsPolicyFeatureDefault::EnableForSelf;
   } else {
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index e4f7b87..7b167d1 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -2456,7 +2456,8 @@
   // composited via a native paint worklet. If reset, it forces Paint to
   // re-evaluate whether to paint with a native paint worklet.
   if (reason == CompositorPendingReason::kPaintWorkletImageCreated ||
-      reason == CompositorPendingReason::kPendingDowngrade) {
+      reason == CompositorPendingReason::kPendingDowngrade ||
+      reason == CompositorPendingReason::kPendingSafeRestart) {
     reason = CompositorPendingReason::kPendingRestart;
     // Composited paint status has already be set so we can skip the update.
   } else {
@@ -2857,11 +2858,11 @@
   compositor_state_.reset();
 }
 
-void Animation::RestartAnimationOnCompositor() {
+void Animation::RestartAnimationOnCompositor(CompositorPendingReason reason) {
   if (!HasActiveAnimationsOnCompositor()) {
     return;
   }
-  SetCompositorPending(CompositorPendingReason::kPendingRestart);
+  SetCompositorPending(reason);
 }
 
 void Animation::CancelIncompatibleAnimationsOnCompositor() {
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index 9e68609..3c0f1ae445 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -298,16 +298,6 @@
   void SetOutdated();
   bool Outdated() { return outdated_; }
 
-  CompositorAnimations::FailureReasons CheckCanStartAnimationOnCompositor(
-      const PaintArtifactCompositor* paint_artifact_compositor,
-      PropertyHandleSet* unsupported_properties = nullptr) const;
-  void StartAnimationOnCompositor(
-      const PaintArtifactCompositor* paint_artifact_compositor);
-  void CancelAnimationOnCompositor();
-  void RestartAnimationOnCompositor();
-  void CancelIncompatibleAnimationsOnCompositor();
-  bool HasActiveAnimationsOnCompositor();
-
   enum class CompositorPendingReason {
     kPendingUpdate,        // Update due to an API call that may affect
                            // play state or start time.
@@ -316,14 +306,29 @@
     kPendingCancel,        // Animation has been canceled, but could restart
                            // conditions permitting.
     kPendingRestart,       // Animation is to be restarted.
+    kPendingSafeRestart,   // Animation is to be restarted. We can be certain
+                           // that the CompositorPaintStatus won't change.  A compositing decision made in PrePaint for a native-paint-worklet is still valid.
     kPaintWorkletImageCreated,  // A compositable animation was held in limbo
                                 // awaiting paint of the paint worklet image. It
                                 // can now be started on the compositor.
     kPendingDowngrade  // Paint is forcing the animation to downgrade to
                        // run on the main thread.
   };
+
   void SetCompositorPending(CompositorPendingReason reason);
 
+  CompositorAnimations::FailureReasons CheckCanStartAnimationOnCompositor(
+      const PaintArtifactCompositor* paint_artifact_compositor,
+      PropertyHandleSet* unsupported_properties = nullptr) const;
+  void StartAnimationOnCompositor(
+      const PaintArtifactCompositor* paint_artifact_compositor);
+  void CancelAnimationOnCompositor();
+  void RestartAnimationOnCompositor(
+      CompositorPendingReason reason =
+          CompositorPendingReason::kPendingRestart);
+  void CancelIncompatibleAnimationsOnCompositor();
+  bool HasActiveAnimationsOnCompositor();
+
   void NotifyReady(AnimationTimeDelta ready_time);
   void CommitPendingPlay(AnimationTimeDelta ready_time);
   void CommitPendingPause(AnimationTimeDelta ready_time);
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc
index c339bbb..a50fa23 100644
--- a/third_party/blink/renderer/core/animation/element_animations.cc
+++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -147,18 +147,6 @@
 }
 
 void ElementAnimations::RecalcCompositedStatus(Element* element) {
-  // Must not run during paint or pre-paint. Can be run post-paint via JS,
-  // during stop due to detach, and post-layout from the post style animation
-  // update.
-  if ((element->GetDocument().Lifecycle().GetState() ==
-       DocumentLifecycle::kInPrePaint) ||
-      (element->GetDocument().Lifecycle().GetState() ==
-       DocumentLifecycle::kInPaint)) {
-    DCHECK(false) << "Composited status must not be reset during "
-                  << "prepaint/paint";
-    base::debug::DumpWithoutCrashing();
-  }
-
   clip_path_paint_worklet_candidate_ = nullptr;
   Animation::NativePaintWorkletReasons reasons = Animation::kNoPaintWorklet;
   // Multiple animations targeting the same property cannot be compsoited as
@@ -194,6 +182,23 @@
     ElementAnimations::CompositedPaintStatus status =
         CalculateStatusFromNativePaintReasons(Animation::kClipPathPaintWorklet,
                                               reasons, overlapping_reasons);
+    // Must not run during paint or pre-paint. Can be run post-paint via JS,
+    // during stop due to detach, and post-layout from the post style animation
+    // update.
+    if ((element->GetDocument().Lifecycle().GetState() ==
+         DocumentLifecycle::kInPaint) ||
+        (((composited_clip_path_status_ ==
+           static_cast<unsigned>(
+               ElementAnimations::CompositedPaintStatus::kComposited)) ||
+          (composited_clip_path_status_ ==
+           static_cast<unsigned>(
+               ElementAnimations::CompositedPaintStatus::kNotComposited))) &&
+         (element->GetDocument().Lifecycle().GetState() ==
+          DocumentLifecycle::kInPrePaint))) {
+      DCHECK(false) << "Composited clip path status must not be reset "
+                    << "once it has been resolved in pre-paint.";
+      base::debug::DumpWithoutCrashing();
+    }
     if (SetCompositedClipPathStatus(status) && element->GetLayoutObject()) {
       element->GetLayoutObject()->SetShouldDoFullPaintInvalidation();
       // For clip paths, we also need to update the paint properties to switch
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc
index 0030b23..2e55482 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -592,7 +592,8 @@
   if (!animation->StartTimeInternal())
     return;
 
-  animation->RestartAnimationOnCompositor();
+  animation->RestartAnimationOnCompositor(
+      Animation::CompositorPendingReason::kPendingSafeRestart);
 }
 
 bool KeyframeEffect::IsIdentityOrTranslation() const {
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index 5c1ee7c..3d4b8a7b 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -1049,9 +1049,8 @@
 
   mojo::PendingRemote<mojom::blink::RenderInputRouterClient> rir_client_remote;
   // Setup RenderInputRouter mojo connections.
-  widget_remote->SetupRenderInputRouterConnections(
-      rir_client_remote.InitWithNewPipeAndPassReceiver(),
-      /* viz_client= */ mojo::NullReceiver());
+  widget_remote->SetupBrowserRenderInputRouterConnections(
+      rir_client_remote.InitWithNewPipeAndPassReceiver());
   widget_host_->BindRenderInputRouterInterfaces(std::move(rir_client_remote));
 
   widget_host_->GetWidgetInputHandler(
@@ -1110,7 +1109,9 @@
     mojo::PendingReceiver<viz::mojom::blink::CompositorFrameSink>
         compositor_frame_sink_receiver,
     mojo::PendingRemote<viz::mojom::blink::CompositorFrameSinkClient>
-        compositor_frame_sink_client) {}
+        compositor_frame_sink_client,
+    mojo::PendingRemote<blink::mojom::blink::RenderInputRouterClient>
+        viz_rir_client_remote) {}
 
 void TestWebFrameWidgetHost::RegisterRenderFrameMetadataObserver(
     mojo::PendingReceiver<cc::mojom::blink::RenderFrameMetadataObserverClient>
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index 9da4d161..0b4e589 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -193,7 +193,9 @@
       mojo::PendingReceiver<viz::mojom::blink::CompositorFrameSink>
           compositor_frame_sink_receiver,
       mojo::PendingRemote<viz::mojom::blink::CompositorFrameSinkClient>
-          compositor_frame_sink_client) override;
+          compositor_frame_sink_client,
+      mojo::PendingRemote<blink::mojom::blink::RenderInputRouterClient>
+          viz_rir_client_remote) override;
   void RegisterRenderFrameMetadataObserver(
       mojo::PendingReceiver<cc::mojom::blink::RenderFrameMetadataObserverClient>
           render_frame_metadata_observer_client_receiver,
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
index 610b075..cfcabe9 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -563,10 +563,13 @@
             web_frame_->GetDocument().GetUkmSourceId(),
             KURL(web_frame_->Client()->LastCommittedUrlForUKM()));
 
-        auto shmem = frame_widget->CreateSharedMemoryForSmoothnessUkm();
-        if (shmem.IsValid()) {
-          web_frame_->Client()->SetUpSharedMemoryForSmoothness(
-              std::move(shmem));
+        auto smoothness_shmem =
+            frame_widget->CreateSharedMemoryForSmoothnessUkm();
+        auto dropped_frames_shmem =
+            frame_widget->CreateSharedMemoryForDroppedFramesUkm();
+        if (smoothness_shmem.IsValid() && dropped_frames_shmem.IsValid()) {
+          web_frame_->Client()->SetUpSharedMemoryForUkms(
+              std::move(smoothness_shmem), std::move(dropped_frames_shmem));
         }
       }
     }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index b9f4f55..5d8e653 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -5227,6 +5227,11 @@
   return LayerTreeHost()->CreateSharedMemoryForSmoothnessUkm();
 }
 
+base::ReadOnlySharedMemoryRegion
+WebFrameWidgetImpl::CreateSharedMemoryForDroppedFramesUkm() {
+  return LayerTreeHost()->CreateSharedMemoryForDroppedFramesUkm();
+}
+
 bool WebFrameWidgetImpl::CanComposeInline() {
   if (auto* plugin = GetFocusedPluginContainer())
     return plugin->CanComposeInline();
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index cf55c95..2d2fc240 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -718,6 +718,8 @@
   // Ask compositor to create the shared memory for smoothness ukm region.
   base::ReadOnlySharedMemoryRegion CreateSharedMemoryForSmoothnessUkm();
 
+  // Ask compositor to create the shared memory for dropped frames ukm region.
+  base::ReadOnlySharedMemoryRegion CreateSharedMemoryForDroppedFramesUkm();
 #if BUILDFLAG(IS_ANDROID)
   // Calculate and cache the most up to date line bounding boxes in the document
   // coordinate space.
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
index f0aaf3b..7a71bae 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
@@ -203,7 +203,7 @@
 void ColorChooserPopupUIController::SetValueAndClosePopup(
     int num_value,
     const String& string_value,
-    const bool is_keyboard_event) {
+    bool is_keyboard_event) {
   DCHECK(popup_);
   DCHECK(client_);
   if (num_value == kColorPickerPopupActionSetValue)
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h
index f43fb416..e2204c3e 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h
@@ -61,7 +61,7 @@
   // PagePopupClient functions:
   void WriteDocument(SegmentedBuffer&) override;
   Locale& GetLocale() override;
-  void SetValueAndClosePopup(int, const String&, const bool) override;
+  void SetValueAndClosePopup(int, const String&, bool) override;
   void SetValue(const String&) override;
   void CancelPopup() override;
   Element& OwnerElement() override;
diff --git a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
index 44b5ae6..b29fd994 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
+++ b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
@@ -280,7 +280,7 @@
 
 void DateTimeChooserImpl::SetValueAndClosePopup(int num_value,
                                                 const String& string_value,
-                                                const bool is_keyboard_event) {
+                                                bool is_keyboard_event) {
   if (num_value >= 0)
     SetValue(string_value);
   EndChooser();
diff --git a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h
index 5e4ca25..c7370dc 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h
+++ b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h
@@ -64,7 +64,7 @@
   // PagePopupClient functions:
   void WriteDocument(SegmentedBuffer&) override;
   Locale& GetLocale() override;
-  void SetValueAndClosePopup(int, const String&, const bool) override;
+  void SetValueAndClosePopup(int, const String&, bool) override;
   void SetValue(const String&) override;
   void CancelPopup() override;
   Element& OwnerElement() override;
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc
index ba77ea7b..51778cad 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -291,15 +291,8 @@
         return;
       }
       if (Form() && type_ == kReset) {
-        if (potentialCommand) {
-          AddConsoleMessage(mojom::blink::ConsoleMessageSource::kOther,
-                            mojom::blink::ConsoleMessageLevel::kWarning,
-                            "Buttons with a type of reset will ignore the "
-                            "command or commandfor attributes.");
-        }
         Form()->reset();
         event.SetDefaultHandled();
-        return;
       }
     }
 
diff --git a/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc b/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
index e44ecf3..242b0b4 100644
--- a/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
+++ b/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
@@ -580,7 +580,7 @@
 
 void InternalPopupMenu::SetValueAndClosePopup(int num_value,
                                               const String& string_value,
-                                              const bool is_keyboard_event) {
+                                              bool is_keyboard_event) {
   DCHECK(popup_);
   DCHECK(owner_element_);
   if (!string_value.empty()) {
diff --git a/third_party/blink/renderer/core/html/forms/internal_popup_menu.h b/third_party/blink/renderer/core/html/forms/internal_popup_menu.h
index 4cf2ca7c..3d28cc6 100644
--- a/third_party/blink/renderer/core/html/forms/internal_popup_menu.h
+++ b/third_party/blink/renderer/core/html/forms/internal_popup_menu.h
@@ -62,7 +62,7 @@
   CSSFontSelector* CreateCSSFontSelector(Document& popup_document) override;
   void SetValueAndClosePopup(int,
                              const String&,
-                             const bool is_keyboard_event) override;
+                             bool is_keyboard_event) override;
   void SetValue(const String&) override;
   void CancelPopup() override;
   Element& OwnerElement() override;
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendar_picker.js b/third_party/blink/renderer/core/html/forms/resources/calendar_picker.js
index 9fe51cf..8cc7737 100644
--- a/third_party/blink/renderer/core/html/forms/resources/calendar_picker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/calendar_picker.js
@@ -4128,7 +4128,8 @@
   }
 
   onClearButtonClick() {
-    window.pagePopupController.setValueAndClosePopup(0, '');
+    window.pagePopupController.setValueAndClosePopup(
+        0, '', /* is_keyboard_event= */ false);
   }
 
   onTodayButtonClick(sender) {
@@ -4689,13 +4690,15 @@
     const value = this._selection.toString();
     if (CalendarPicker.commitDelayMs == 0) {
       // For testing.
-      window.pagePopupController.setValueAndClosePopup(0, value);
+      window.pagePopupController.setValueAndClosePopup(
+          0, value, /* is_keyboard_event= */ false);
     } else if (CalendarPicker.commitDelayMs < 0) {
       // For testing.
       window.pagePopupController.setValue(value);
     } else {
       setTimeout(function() {
-        window.pagePopupController.setValueAndClosePopup(0, value);
+        window.pagePopupController.setValueAndClosePopup(
+            0, value, /* is_keyboard_event= */ false);
       }, CalendarPicker.commitDelayMs);
     }
   }
diff --git a/third_party/blink/renderer/core/html/forms/resources/list_picker.js b/third_party/blink/renderer/core/html/forms/resources/list_picker.js
index 0593e2a..66b0c22a 100644
--- a/third_party/blink/renderer/core/html/forms/resources/list_picker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/list_picker.js
@@ -159,7 +159,7 @@
     if (event.target.tagName !== 'OPTION')
       return;
     window.pagePopupController.setValueAndClosePopup(
-        0, this.selectElement_.value);
+        0, this.selectElement_.value, /* is_keyboard_event= */ false);
   }
 
   handleTouchStart_(event) {
@@ -210,7 +210,7 @@
     const target = document.elementFromPoint(touch.clientX, touch.clientY);
     if (target.tagName === 'OPTION' && !target.disabled)
       window.pagePopupController.setValueAndClosePopup(
-          0, this.selectElement_.value);
+          0, this.selectElement_.value, /* is_keyboard_event= */ false);
     this.exitTouchSelectMode_();
   }
 
diff --git a/third_party/blink/renderer/core/html/forms/resources/month_picker.js b/third_party/blink/renderer/core/html/forms/resources/month_picker.js
index 48fae30..5d06c202 100644
--- a/third_party/blink/renderer/core/html/forms/resources/month_picker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/month_picker.js
@@ -86,7 +86,8 @@
 
   onYearListViewDidSelectMonth_ = (sender, month) => {
     const selectedValue = month.toString();
-    window.pagePopupController.setValueAndClosePopup(0, selectedValue);
+    window.pagePopupController.setValueAndClosePopup(
+        0, selectedValue, /* is_keyboard_event= */ false);
   };
 
   initializeClearButton_ = () => {
@@ -98,7 +99,8 @@
   };
 
   onClearButtonClick_ = () => {
-    window.pagePopupController.setValueAndClosePopup(0, '');
+    window.pagePopupController.setValueAndClosePopup(
+        0, '', /* is_keyboard_event= */ false);
   };
 
   initializeTodayButton_ = () => {
@@ -117,7 +119,8 @@
 
   onTodayButtonClick_ = (sender) => {
     const selectedValue = Month.createFromToday().toString();
-    window.pagePopupController.setValueAndClosePopup(0, selectedValue);
+    window.pagePopupController.setValueAndClosePopup(
+        0, selectedValue, /* is_keyboard_event= */ false);
   };
 
   onKeyDown_ = (event) => {
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc
index 91bbb841..d50a139 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -151,40 +151,54 @@
   if (is_closing_) {
     return;
   }
-  base::AutoReset<bool> reset_close(&is_closing_, true);
 
-  if (!IsOpen() && !open_attribute_being_removed) {
-    return;
-  }
+  bool was_modal;
+  {
+    // The `is_closing_` variable avoids doing more work in the attribute change
+    // steps triggered by `SetBooleanAttribute(kOpenAttr)`.
+    base::AutoReset<bool> reset_close(&is_closing_, true);
 
-  Document& document = GetDocument();
-  HTMLDialogElement* old_modal_dialog = document.ActiveModalDialog();
+    if (!IsOpen() && !open_attribute_being_removed) {
+      return;
+    }
 
-  DispatchToggleEvents(/*opening=*/false);
-  if (!IsOpen() && !open_attribute_being_removed) {
-    return;
-  }
-  SetBooleanAttribute(html_names::kOpenAttr, false);
-  bool was_modal = IsModal();
-  SetIsModal(false);
-  // Because we set `is_closing_` above, the `open` attribute setter will not
-  // run its actions. We need to therefore manage the open dialogs list here.
-  DCHECK(GetDocument().AllOpenDialogs().Contains(this));
-  GetDocument().AllOpenDialogs().erase(this);
+    Document& document = GetDocument();
+    HTMLDialogElement* old_modal_dialog = document.ActiveModalDialog();
 
-  // If this dialog is open as a non-modal dialog and open as a popover at the
-  // same time, then we shouldn't remove it from the top layer because it is
-  // still open as a popover.
-  if (was_modal) {
-    document.ScheduleForTopLayerRemoval(this,
-                                        Document::TopLayerReason::kDialog);
-  }
-  InertSubtreesChanged(document, old_modal_dialog);
+    DispatchToggleEvents(/*opening=*/false);
+    if (!IsOpen() && !open_attribute_being_removed) {
+      return;
+    }
+    SetBooleanAttribute(html_names::kOpenAttr, false);
+    was_modal = IsModal();
+    SetIsModal(false);
+    // Because we set `is_closing_` above, the `open` attribute setter will not
+    // run its actions. We need to therefore manage the open dialogs list here.
+    if (isConnected()) {
+      DCHECK(GetDocument().AllOpenDialogs().Contains(this));
+      GetDocument().AllOpenDialogs().erase(this);
+    }
 
-  if (!return_value.IsNull())
-    return_value_ = return_value;
+    // If this dialog is open as a non-modal dialog and open as a popover at the
+    // same time, then we shouldn't remove it from the top layer because it is
+    // still open as a popover.
+    if (was_modal) {
+      document.ScheduleForTopLayerRemoval(this,
+                                          Document::TopLayerReason::kDialog);
+    }
+    InertSubtreesChanged(document, old_modal_dialog);
 
-  ScheduleCloseEvent();
+    if (!return_value.IsNull()) {
+      return_value_ = return_value;
+    }
+
+    ScheduleCloseEvent();
+
+    if (close_watcher_) {
+      close_watcher_->destroy();
+      close_watcher_ = nullptr;
+    }
+  }  // End of is_closing_ reset scope
 
   // We should call focus() last since it will fire a focus event which could
   // modify this element.
@@ -203,11 +217,6 @@
           nullptr, focus_options));
     }
   }
-
-  if (close_watcher_) {
-    close_watcher_->destroy();
-    close_watcher_ = nullptr;
-  }
 }
 
 void HTMLDialogElement::requestClose(const String& return_value,
@@ -495,12 +504,7 @@
 }
 
 void HTMLDialogElement::CreateCloseWatcher() {
-  if (close_watcher_) {
-    // See crbug.com/384549097. It is possible to try to create a close watcher
-    // when one already exists, due to the event handlers that get fired as part
-    // of closing a dialog.
-    return;
-  }
+  DCHECK(!close_watcher_);
   LocalDOMWindow* window = GetDocument().domWindow();
   if (!window) {
     return;
@@ -570,14 +574,13 @@
   // already created the close watcher.
   if (RuntimeEnabledFeatures::HTMLDialogLightDismissEnabled()) {
     DCHECK(close_watcher_);
+    SetCloseWatcherEnabledState();
   } else {
     CreateCloseWatcher();
   }
 
-  // Proposed new behavior: top layer elements like dialogs and fullscreen
-  // elements can be nested inside popovers.
-  // Old/existing behavior: showing a modal dialog or fullscreen
-  // element should hide all open popovers.
+  // Top layer elements like dialogs and fullscreen elements can be nested
+  // inside popovers.
   auto* hide_until = HTMLElement::TopLayerElementPopoverAncestor(
       *this, TopLayerElementType::kDialog);
   HTMLElement::HideAllPopoversUntil(
@@ -591,6 +594,21 @@
   }
 }
 
+Node::InsertionNotificationRequest HTMLDialogElement::InsertedInto(
+    ContainerNode& insertion_point) {
+  HTMLElement::InsertedInto(insertion_point);
+
+  if (FastHasAttribute(html_names::kOpenAttr) &&
+      !GetDocument().StatePreservingAtomicMoveInProgress()) {
+    DCHECK(!GetDocument().AllOpenDialogs().Contains(this));
+    GetDocument().AllOpenDialogs().insert(this);
+    if (RuntimeEnabledFeatures::HTMLDialogLightDismissEnabled()) {
+      CreateCloseWatcher();
+    }
+  }
+  return kInsertionDone;
+}
+
 void HTMLDialogElement::RemovedFrom(ContainerNode& insertion_point) {
   Document& document = GetDocument();
   HTMLDialogElement* old_modal_dialog = document.ActiveModalDialog();
@@ -603,7 +621,7 @@
 
   SetIsModal(false);
   document.RemoveFromTopLayerImmediately(this);
-
+  GetDocument().AllOpenDialogs().erase(this);
   if (close_watcher_) {
     close_watcher_->destroy();
     close_watcher_ = nullptr;
@@ -720,9 +738,8 @@
 void HTMLDialogElement::AttributeChanged(
     const AttributeModificationParams& params) {
   HTMLElement::AttributeChanged(params);
-
   if (RuntimeEnabledFeatures::HTMLDialogLightDismissEnabled() &&
-      params.name == html_names::kClosedbyAttr && IsOpen() &&
+      params.name == html_names::kClosedbyAttr && IsOpen() && isConnected() &&
       params.old_value != params.new_value) {
     SetCloseWatcherEnabledState();
   }
@@ -750,9 +767,11 @@
           close_watcher_ = nullptr;
         }
       }
-    } else if (params.old_value.IsNull()) {
-      // The `open` attribute is being added - we need to ensure there's a
-      // closewatcher created and the open dialogs list is up to date.
+    } else if (params.old_value.IsNull() && isConnected()) {
+      // The `open` attribute is being added, and the element is already
+      // connected. We need to ensure there's a closewatcher created and the
+      // open dialogs list is up to date. If the element isn't connected, then
+      // these updates will be performed when it gets inserted.
       DCHECK(!GetDocument().AllOpenDialogs().Contains(this));
       GetDocument().AllOpenDialogs().insert(this);
       if (RuntimeEnabledFeatures::HTMLDialogLightDismissEnabled()) {
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.h b/third_party/blink/renderer/core/html/html_dialog_element.h
index 68e8134..1fb8c2f 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.h
+++ b/third_party/blink/renderer/core/html/html_dialog_element.h
@@ -63,6 +63,7 @@
   void requestClose(const String& return_value, ExceptionState&);
   void show(ExceptionState&);
   void showModal(ExceptionState&);
+  InsertionNotificationRequest InsertedInto(ContainerNode&) override;
   void RemovedFrom(ContainerNode&) override;
 
   bool IsModal() const { return is_modal_; }
diff --git a/third_party/blink/renderer/core/html/rel_list.cc b/third_party/blink/renderer/core/html/rel_list.cc
index 576085dd..1b592cb 100644
--- a/third_party/blink/renderer/core/html/rel_list.cc
+++ b/third_party/blink/renderer/core/html/rel_list.cc
@@ -10,6 +10,8 @@
 #include "third_party/blink/renderer/core/html/html_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/loader/resource/link_dictionary_resource.h"
+#include "third_party/blink/renderer/core/svg/svg_element.h"
+#include "third_party/blink/renderer/core/svg_names.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
 
 namespace blink {
@@ -17,6 +19,9 @@
 RelList::RelList(Element* element)
     : DOMTokenList(*element, html_names::kRelAttr) {}
 
+RelList::RelList(Element* element, const QualifiedName& attr)
+    : DOMTokenList(*element, attr) {}
+
 static HashSet<AtomicString>& SupportedTokensLink() {
   // There is a use counter for <link rel="monetization"> but the feature is
   // actually not implemented yet, so "monetization" is not included in the
@@ -70,7 +75,8 @@
     }
   } else if ((GetElement().HasTagName(html_names::kATag) ||
               GetElement().HasTagName(html_names::kAreaTag) ||
-              GetElement().HasTagName(html_names::kFormTag)) &&
+              GetElement().HasTagName(html_names::kFormTag) ||
+              GetElement().HasTagName(svg_names::kATag)) &&
              SupportedTokensAnchorAndAreaAndForm().Contains(token_value)) {
     return true;
   }
diff --git a/third_party/blink/renderer/core/html/rel_list.h b/third_party/blink/renderer/core/html/rel_list.h
index f64406a9..9b268ff 100644
--- a/third_party/blink/renderer/core/html/rel_list.h
+++ b/third_party/blink/renderer/core/html/rel_list.h
@@ -12,6 +12,7 @@
 class RelList final : public DOMTokenList {
  public:
   explicit RelList(Element*);
+  RelList(Element*, const QualifiedName&);
 
  private:
   bool ValidateTokenValue(const AtomicString&, ExceptionState&) const override;
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css
index 43fc495..0f9754d 100644
--- a/third_party/blink/renderer/core/html/resources/html.css
+++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -1658,11 +1658,15 @@
   select:not(:-internal-list-box):not([multiple]) {
     font: -internal-auto-base(-webkit-small-control, inherit);
     text-shadow: -internal-auto-base(none, inherit);
-    text-transform: -internal-auto-base(none, inherit);
+    text-transform: -internal-auto-base(none, initial);
     text-rendering: -internal-auto-base(auto, inherit);
     letter-spacing: -internal-auto-base(normal, inherit);
     word-spacing: -internal-auto-base(normal, inherit);
-    text-align: -internal-auto-base(start, inherit);
+    text-align: -internal-auto-base(start, initial);
+    text-indent: -internal-auto-base(0px, initial);
+    -webkit-rtl-ordering: -internal-auto-base(logical, inherit);
+    cursor: -internal-auto-base(default, inherit);
+    white-space: -internal-auto-base(pre, inherit);
     /* This text-autospace rule won't work because it is set with !important
      * earlier in the UA stylesheet. After merging with the rest of the UA
      * style rules when removing the CustomizableSelect flag, it should start
@@ -1673,12 +1677,6 @@
     border: 1px solid -internal-auto-base(light-dark(#767676, #858585), currentColor);
     padding-block: -internal-auto-base(0, 0.25em);
     padding-inline: -internal-auto-base(0, 0.5em);
-    font: -internal-auto-base(-webkit-small-control, inherit);
-    color: -internal-auto-base(FieldText, inherit);
-    background-color: -internal-auto-base(Field, transparent);
-    border: 1px solid -internal-auto-base(light-dark(#767676, #858585), currentColor);
-    padding-block: -internal-auto-base(0, 0.25em);
-    padding-inline: -internal-auto-base(0, 0.5em);
 
     /* min-size rules ensure that we meet accessibility guidelines for minimum target size.
      * https://github.com/openui/open-ui/issues/1026
diff --git a/third_party/blink/renderer/core/layout/forms/layout_text_control.cc b/third_party/blink/renderer/core/layout/forms/layout_text_control.cc
index 01a9f18b..bc08a325 100644
--- a/third_party/blink/renderer/core/layout/forms/layout_text_control.cc
+++ b/third_party/blink/renderer/core/layout/forms/layout_text_control.cc
@@ -62,7 +62,7 @@
     // ::selection style is or was present on LayoutTextControl.
     if (new_style.HasPseudoElementStyle(kPseudoIdSelection) ||
         (old_style && old_style->HasPseudoElementStyle(kPseudoIdSelection))) {
-      inner_editor_layout_object->InvalidateSelectedChildrenOnStyleChange();
+      inner_editor_layout_object->InvalidateSelectionOnStyleChange();
     }
   }
 }
diff --git a/third_party/blink/renderer/core/layout/grid/grid_item.cc b/third_party/blink/renderer/core/layout/grid/grid_item.cc
index be611dd0..e6916810 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_item.cc
+++ b/third_party/blink/renderer/core/layout/grid/grid_item.cc
@@ -138,14 +138,8 @@
     bool parent_must_consider_grid_items_for_column_sizing,
     bool parent_must_consider_grid_items_for_row_sizing)
     : node(std::move(item_node)),
-      has_subgridded_columns(false),
-      has_subgridded_rows(false),
       is_considered_for_column_sizing(false),
       is_considered_for_row_sizing(false),
-      is_sizing_dependent_on_block_size(false),
-      is_subgridded_to_parent_grid(false),
-      must_consider_grid_items_for_column_sizing(false),
-      must_consider_grid_items_for_row_sizing(false),
       parent_grid_font_baseline(parent_grid_style.GetFontBaseline()) {
   const auto& style = node.Style();
 
diff --git a/third_party/blink/renderer/core/layout/grid/grid_item.h b/third_party/blink/renderer/core/layout/grid/grid_item.h
index 5caec3a..852d09e8 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_item.h
+++ b/third_party/blink/renderer/core/layout/grid/grid_item.h
@@ -31,7 +31,7 @@
   USING_FAST_MALLOC(GridItemData);
 
  public:
-  GridItemData() = delete;
+  GridItemData() = default;
   GridItemData(const GridItemData&) = default;
   GridItemData& operator=(const GridItemData&) = default;
 
@@ -41,8 +41,8 @@
                bool parent_must_consider_grid_items_for_column_sizing = false,
                bool parent_must_consider_grid_items_for_row_sizing = false);
 
-  GridItemData(BlockNode item_node, const ComputedStyle& grid_style)
-      : GridItemData(std::move(item_node), grid_style, grid_style) {}
+  GridItemData(BlockNode item_node, const ComputedStyle& parent_style)
+      : GridItemData(std::move(item_node), parent_style, parent_style) {}
 
   void SetAlignmentFallback(GridTrackSizingDirection track_direction,
                             bool has_synthesized_baseline);
@@ -78,14 +78,14 @@
                : row_alignment == AxisEdge::kLastBaseline;
   }
 
-  // For this item and track direction, computes the pair of indices |begin| and
-  // |end| such that the item spans every set from the respective collection's
-  // |sets_| with an index in the range [begin, end).
+  // For this item and track direction, computes the pair of indices `begin` and
+  // `end` such that the item spans every set from the respective collection's
+  // `sets_` with an index in the range [begin, end).
   void ComputeSetIndices(const GridLayoutTrackCollection& track_collection);
 
   // For this out of flow item and track collection, computes and stores its
   // first and last spanned ranges, as well as the start and end track offset.
-  // |grid_placement| is used to resolve the grid lines.
+  // `grid_placement` is used to resolve the grid lines.
   void ComputeOutOfFlowItemPlacement(
       const GridLayoutTrackCollection& track_collection,
       const GridPlacementData& placement_data,
@@ -112,6 +112,13 @@
                                             : row_set_indices;
   }
 
+  GridSizingTrackCollection::SetIterator SetIterator(
+      GridSizingTrackCollection* track_collection) const {
+    DCHECK(track_collection);
+    const auto& set_indices = SetIndices(track_collection->Direction());
+    return track_collection->GetSetIterator(set_indices.begin, set_indices.end);
+  }
+
   GridItemIndices& RangeIndices(GridTrackSizingDirection track_direction) {
     return (track_direction == kForColumns) ? column_range_indices
                                             : row_range_indices;
@@ -206,24 +213,32 @@
         .HasProperty(TrackSpanProperties::kHasFixedMaximumTrack);
   }
 
+  void EncompassContributionSizes(MinMaxSizes&& sizes) {
+    if (contribution_sizes) {
+      contribution_sizes->Encompass(sizes);
+    } else {
+      contribution_sizes = std::move(sizes);
+    }
+  }
+
   void Trace(Visitor* visitor) const { visitor->Trace(node); }
 
-  BlockNode node;
+  BlockNode node{nullptr};
   GridArea resolved_position;
 
-  bool has_subgridded_columns : 1;
-  bool has_subgridded_rows : 1;
-  bool is_considered_for_column_sizing : 1;
-  bool is_considered_for_row_sizing : 1;
-  bool is_opposite_direction_in_root_grid_columns : 1;
-  bool is_opposite_direction_in_root_grid_rows : 1;
-  bool is_overflow_safe_for_columns : 1;
-  bool is_overflow_safe_for_rows : 1;
-  bool is_parallel_with_root_grid : 1;
-  bool is_sizing_dependent_on_block_size : 1;
-  bool is_subgridded_to_parent_grid : 1;
-  bool must_consider_grid_items_for_column_sizing : 1;
-  bool must_consider_grid_items_for_row_sizing : 1;
+  bool has_subgridded_columns : 1 {false};
+  bool has_subgridded_rows : 1 {false};
+  bool is_considered_for_column_sizing : 1 {true};
+  bool is_considered_for_row_sizing : 1 {true};
+  bool is_opposite_direction_in_root_grid_columns : 1 {false};
+  bool is_opposite_direction_in_root_grid_rows : 1 {false};
+  bool is_overflow_safe_for_columns : 1 {false};
+  bool is_overflow_safe_for_rows : 1 {false};
+  bool is_parallel_with_root_grid : 1 {false};
+  bool is_sizing_dependent_on_block_size : 1 {false};
+  bool is_subgridded_to_parent_grid : 1 {false};
+  bool must_consider_grid_items_for_column_sizing : 1 {false};
+  bool must_consider_grid_items_for_row_sizing : 1 {false};
 
   FontBaseline parent_grid_font_baseline;
 
@@ -253,9 +268,13 @@
 
   // These fields are only for out of flow items. They are used to store their
   // start/end range indices, and offsets in range in the respective track
-  // collection; see |OutOfFlowItemPlacement|.
+  // collection; see `OutOfFlowItemPlacement`.
   OutOfFlowItemPlacement column_placement;
   OutOfFlowItemPlacement row_placement;
+
+  // Virtual masonry items don't have a node, so we cache the maximum of every
+  // intrinsic contribution among the items that make up its respective group.
+  std::optional<MinMaxSizes> contribution_sizes;
 };
 
 class CORE_EXPORT GridItems {
diff --git a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.h b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.h
index f9db1d4..f6dd343 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.h
@@ -18,18 +18,7 @@
 class ConstraintSpace;
 struct GridItemPlacementData;
 
-// This enum corresponds to each step used to accommodate grid items across
-// intrinsic tracks according to their min and max track sizing functions, as
-// defined in https://drafts.csswg.org/css-grid-2/#algo-spanning-items.
-enum class GridItemContributionType {
-  kForIntrinsicMinimums,
-  kForContentBasedMinimums,
-  kForMaxContentMinimums,
-  kForIntrinsicMaximums,
-  kForMaxContentMaximums,
-  kForFreeSpace,
-};
-
+enum class GridItemContributionType;
 enum class SizingConstraint { kLayout, kMinContent, kMaxContent };
 
 using GridItemDataPtrVector = Vector<GridItemData*, 16>;
@@ -181,6 +170,9 @@
       GridTrackSizingDirection track_direction,
       SizingConstraint sizing_constraint) const;
 
+  // TODO(ethavar): Remove these methods once we migrate them over to
+  // `grid_track_sizing_algorithm.cc`.
+  // See https://chromium-review.googlesource.com/c/chromium/src/+/6277752.
   // These methods implement the steps of the algorithm for intrinsic track size
   // resolution defined in https://drafts.csswg.org/css-grid-2/#algo-content.
   void ResolveIntrinsicTrackSizes(const GridSizingSubtree& sizing_subtree,
diff --git a/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.cc b/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.cc
index 54dd2f3..2365200 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.cc
@@ -12,7 +12,11 @@
 
 namespace {
 
+using ClampedFloat = base::ClampedNumeric<float>;
 using GridItemDataPtrVector = Vector<GridItemData*, 16>;
+using GridSetPtrVector = Vector<GridSet*, 16>;
+
+constexpr float kFloatEpsilon = std::numeric_limits<float>::epsilon();
 
 }  // namespace
 
@@ -275,4 +279,679 @@
   }
 }
 
+// Helpers for the track sizing algorithm.
+namespace {
+
+LayoutUnit DefiniteGrowthLimit(const GridSet& set) {
+  LayoutUnit growth_limit = set.GrowthLimit();
+  // For infinite growth limits, substitute the track’s base size.
+  return (growth_limit == kIndefiniteSize) ? set.BaseSize() : growth_limit;
+}
+
+// Returns the corresponding size to be increased by accommodating a grid item's
+// contribution; for intrinsic min track sizing functions, return the base size.
+// For intrinsic max track sizing functions, return the growth limit.
+LayoutUnit AffectedSizeForContribution(
+    const GridSet& set,
+    GridItemContributionType contribution_type) {
+  switch (contribution_type) {
+    case GridItemContributionType::kForIntrinsicMinimums:
+    case GridItemContributionType::kForContentBasedMinimums:
+    case GridItemContributionType::kForMaxContentMinimums:
+      return set.BaseSize();
+    case GridItemContributionType::kForIntrinsicMaximums:
+    case GridItemContributionType::kForMaxContentMaximums:
+      return DefiniteGrowthLimit(set);
+    case GridItemContributionType::kForFreeSpace:
+      NOTREACHED();
+  }
+}
+
+void GrowAffectedSizeByPlannedIncrease(
+    GridItemContributionType contribution_type,
+    GridSet* set) {
+  DCHECK(set);
+
+  set->is_infinitely_growable = false;
+  const LayoutUnit planned_increase = set->planned_increase;
+
+  // Only grow sets that accommodated a grid item.
+  if (planned_increase == kIndefiniteSize) {
+    return;
+  }
+
+  switch (contribution_type) {
+    case GridItemContributionType::kForIntrinsicMinimums:
+    case GridItemContributionType::kForContentBasedMinimums:
+    case GridItemContributionType::kForMaxContentMinimums:
+      set->IncreaseBaseSize(set->BaseSize() + planned_increase);
+      return;
+    case GridItemContributionType::kForIntrinsicMaximums:
+      // Mark any tracks whose growth limit changed from infinite to finite in
+      // this step as infinitely growable for the next step.
+      set->is_infinitely_growable = set->GrowthLimit() == kIndefiniteSize;
+      set->IncreaseGrowthLimit(DefiniteGrowthLimit(*set) + planned_increase);
+      return;
+    case GridItemContributionType::kForMaxContentMaximums:
+      set->IncreaseGrowthLimit(DefiniteGrowthLimit(*set) + planned_increase);
+      return;
+    case GridItemContributionType::kForFreeSpace:
+      NOTREACHED();
+  }
+}
+
+// Returns true if a set should increase its used size according to the steps in
+// https://drafts.csswg.org/css-grid-2/#algo-spanning-items; false otherwise.
+bool IsContributionAppliedToSet(const GridSet& set,
+                                GridItemContributionType contribution_type) {
+  switch (contribution_type) {
+    case GridItemContributionType::kForIntrinsicMinimums:
+      return set.track_size.HasIntrinsicMinTrackBreadth();
+    case GridItemContributionType::kForContentBasedMinimums:
+      return set.track_size.HasMinOrMaxContentMinTrackBreadth();
+    case GridItemContributionType::kForMaxContentMinimums:
+      // TODO(ethavar): Check if the grid container is being sized under a
+      // 'max-content' constraint to consider 'auto' min track sizing functions,
+      // see https://drafts.csswg.org/css-grid-2/#track-size-max-content-min.
+      return set.track_size.HasMaxContentMinTrackBreadth();
+    case GridItemContributionType::kForIntrinsicMaximums:
+      return set.track_size.HasIntrinsicMaxTrackBreadth();
+    case GridItemContributionType::kForMaxContentMaximums:
+      return set.track_size.HasMaxContentOrAutoMaxTrackBreadth();
+    case GridItemContributionType::kForFreeSpace:
+      return true;
+  }
+}
+
+// https://drafts.csswg.org/css-grid-2/#extra-space
+// Returns true if a set's used size should be consider to grow beyond its limit
+// (see the "Distribute space beyond limits" section); otherwise, false.
+// Note that we will deliberately return false in cases where we don't have a
+// collection of tracks different than "all affected tracks".
+bool ShouldUsedSizeGrowBeyondLimit(const GridSet& set,
+                                   GridItemContributionType contribution_type) {
+  switch (contribution_type) {
+    case GridItemContributionType::kForIntrinsicMinimums:
+    case GridItemContributionType::kForContentBasedMinimums:
+      return set.track_size.HasIntrinsicMaxTrackBreadth();
+    case GridItemContributionType::kForMaxContentMinimums:
+      return set.track_size.HasMaxContentOrAutoMaxTrackBreadth();
+    case GridItemContributionType::kForIntrinsicMaximums:
+    case GridItemContributionType::kForMaxContentMaximums:
+    case GridItemContributionType::kForFreeSpace:
+      return false;
+  }
+}
+
+bool IsDistributionForGrowthLimits(GridItemContributionType contribution_type) {
+  switch (contribution_type) {
+    case GridItemContributionType::kForIntrinsicMinimums:
+    case GridItemContributionType::kForContentBasedMinimums:
+    case GridItemContributionType::kForMaxContentMinimums:
+    case GridItemContributionType::kForFreeSpace:
+      return false;
+    case GridItemContributionType::kForIntrinsicMaximums:
+    case GridItemContributionType::kForMaxContentMaximums:
+      return true;
+  }
+}
+
+enum class InfinitelyGrowableBehavior { kEnforce, kIgnore };
+
+// We define growth potential = limit - affected size; for base sizes, the limit
+// is its growth limit. For growth limits, the limit is infinity if it is marked
+// as "infinitely growable", and equal to the growth limit otherwise.
+LayoutUnit GrowthPotentialForSet(
+    const GridSet& set,
+    GridItemContributionType contribution_type,
+    InfinitelyGrowableBehavior infinitely_growable_behavior =
+        InfinitelyGrowableBehavior::kEnforce) {
+  switch (contribution_type) {
+    case GridItemContributionType::kForIntrinsicMinimums:
+    case GridItemContributionType::kForContentBasedMinimums:
+    case GridItemContributionType::kForMaxContentMinimums: {
+      LayoutUnit growth_limit = set.GrowthLimit();
+      if (growth_limit == kIndefiniteSize) {
+        return kIndefiniteSize;
+      }
+
+      LayoutUnit increased_base_size =
+          set.BaseSize() + set.item_incurred_increase;
+      DCHECK_LE(increased_base_size, growth_limit);
+      return growth_limit - increased_base_size;
+    }
+    case GridItemContributionType::kForIntrinsicMaximums:
+    case GridItemContributionType::kForMaxContentMaximums: {
+      if (infinitely_growable_behavior ==
+              InfinitelyGrowableBehavior::kEnforce &&
+          set.GrowthLimit() != kIndefiniteSize && !set.is_infinitely_growable) {
+        // For growth limits, the potential is infinite if its value is infinite
+        // too or if the set is marked as infinitely growable; otherwise, zero.
+        return LayoutUnit();
+      }
+
+      DCHECK(set.fit_content_limit >= 0 ||
+             set.fit_content_limit == kIndefiniteSize);
+
+      // The max track sizing function of a 'fit-content' track is treated as
+      // 'max-content' until it reaches the limit specified as the 'fit-content'
+      // argument, after which it is treated as having a fixed sizing function
+      // of that argument (with a growth potential of zero).
+      if (set.fit_content_limit != kIndefiniteSize) {
+        LayoutUnit growth_potential = set.fit_content_limit -
+                                      DefiniteGrowthLimit(set) -
+                                      set.item_incurred_increase;
+        return growth_potential.ClampNegativeToZero();
+      }
+      // Otherwise, this set has infinite growth potential.
+      return kIndefiniteSize;
+    }
+    case GridItemContributionType::kForFreeSpace: {
+      LayoutUnit growth_limit = set.GrowthLimit();
+      DCHECK_NE(growth_limit, kIndefiniteSize);
+      return growth_limit - set.BaseSize();
+    }
+  }
+}
+
+template <typename T>
+bool AreEqual(T a, T b) {
+  return a == b;
+}
+
+template <>
+bool AreEqual<float>(float a, float b) {
+  return std::abs(a - b) < kFloatEpsilon;
+}
+
+// Follow the definitions from https://drafts.csswg.org/css-grid-2/#extra-space;
+// notice that this method replaces the notion of "tracks" with "sets".
+template <bool is_equal_distribution>
+void DistributeExtraSpaceToSets(LayoutUnit extra_space,
+                                float flex_factor_sum,
+                                GridItemContributionType contribution_type,
+                                GridSetPtrVector* sets_to_grow,
+                                GridSetPtrVector* sets_to_grow_beyond_limit) {
+  DCHECK_GT(extra_space, 0);
+  DCHECK(sets_to_grow);
+
+  if (extra_space == kIndefiniteSize) {
+    // Infinite extra space should only happen when distributing free space at
+    // the maximize tracks step; in such case, we can simplify this method by
+    // "filling" every track base size up to their growth limit.
+    DCHECK_EQ(contribution_type, GridItemContributionType::kForFreeSpace);
+    for (auto* set : *sets_to_grow) {
+      set->item_incurred_increase =
+          GrowthPotentialForSet(*set, contribution_type);
+    }
+    return;
+  }
+
+  DCHECK_GT(extra_space, 0);
+#if DCHECK_IS_ON()
+  if (IsDistributionForGrowthLimits(contribution_type)) {
+    DCHECK_EQ(sets_to_grow, sets_to_grow_beyond_limit);
+  }
+#endif
+
+  wtf_size_t growable_track_count = 0;
+  for (auto* set : *sets_to_grow) {
+    set->item_incurred_increase = LayoutUnit();
+
+    // From the first note in https://drafts.csswg.org/css-grid-2/#extra-space:
+    //   If the affected size was a growth limit and the track is not marked
+    //   "infinitely growable", then each item-incurred increase will be zero.
+    //
+    // When distributing space to growth limits, we need to increase each track
+    // up to its 'fit-content' limit. However, because of the note above, first
+    // we should only grow tracks marked as "infinitely growable" up to limits
+    // and then grow all affected tracks beyond limits.
+    //
+    // We can correctly resolve every scenario by doing a single sort of
+    // `sets_to_grow`, purposely ignoring the "infinitely growable" flag, then
+    // filtering out sets that won't take a share of the extra space at each
+    // step; for base sizes this is not required, but if there are no tracks
+    // with growth potential > 0, we can optimize by not sorting the sets.
+    if (GrowthPotentialForSet(*set, contribution_type)) {
+      growable_track_count += set->track_count;
+    }
+  }
+
+  using ShareRatioType =
+      typename std::conditional<is_equal_distribution, wtf_size_t, float>::type;
+  DCHECK(is_equal_distribution ||
+         !AreEqual<ShareRatioType>(flex_factor_sum, 0));
+  ShareRatioType share_ratio_sum =
+      is_equal_distribution ? growable_track_count : flex_factor_sum;
+  const bool is_flex_factor_sum_overflowing_limits =
+      share_ratio_sum >= std::numeric_limits<wtf_size_t>::max();
+
+  // We will sort the tracks by growth potential in non-decreasing order to
+  // distribute space up to limits; notice that if we start distributing space
+  // equally among all tracks we will eventually reach the limit of a track or
+  // run out of space to distribute. If the former scenario happens, it should
+  // be easy to see that the group of tracks that will reach its limit first
+  // will be that with the least growth potential. Otherwise, if tracks in such
+  // group does not reach their limit, every upcoming track with greater growth
+  // potential must be able to increase its size by the same amount.
+  if (growable_track_count ||
+      IsDistributionForGrowthLimits(contribution_type)) {
+    auto CompareSetsByGrowthPotential =
+        [contribution_type](const GridSet* lhs, const GridSet* rhs) {
+          auto growth_potential_lhs = GrowthPotentialForSet(
+              *lhs, contribution_type, InfinitelyGrowableBehavior::kIgnore);
+          auto growth_potential_rhs = GrowthPotentialForSet(
+              *rhs, contribution_type, InfinitelyGrowableBehavior::kIgnore);
+
+          if (growth_potential_lhs == kIndefiniteSize ||
+              growth_potential_rhs == kIndefiniteSize) {
+            // At this point we know that there is at least one set with
+            // infinite growth potential; if `a` has a definite value, then `b`
+            // must have infinite growth potential, and thus, `a` < `b`.
+            return growth_potential_lhs != kIndefiniteSize;
+          }
+          // Straightforward comparison of definite growth potentials.
+          return growth_potential_lhs < growth_potential_rhs;
+        };
+
+    // Only sort for equal distributions; since the growth potential of any
+    // flexible set is infinite, they don't require comparing.
+    if (AreEqual<float>(flex_factor_sum, 0)) {
+      DCHECK(is_equal_distribution);
+      std::sort(sets_to_grow->begin(), sets_to_grow->end(),
+                CompareSetsByGrowthPotential);
+    }
+  }
+
+  auto ExtraSpaceShare = [&](const GridSet& set,
+                             LayoutUnit growth_potential) -> LayoutUnit {
+    DCHECK(growth_potential >= 0 || growth_potential == kIndefiniteSize);
+
+    // If this set won't take a share of the extra space, e.g. has zero growth
+    // potential, exit so that this set is filtered out of `share_ratio_sum`.
+    if (!growth_potential) {
+      return LayoutUnit();
+    }
+
+    wtf_size_t set_track_count = set.track_count;
+    DCHECK_LE(set_track_count, growable_track_count);
+
+    ShareRatioType set_share_ratio =
+        is_equal_distribution ? set_track_count : set.FlexFactor();
+
+    // Since `share_ratio_sum` can be greater than the wtf_size_t limit, cap the
+    // value of `set_share_ratio` to prevent overflows.
+    if (set_share_ratio > share_ratio_sum) {
+      DCHECK(is_flex_factor_sum_overflowing_limits);
+      set_share_ratio = share_ratio_sum;
+    }
+
+    LayoutUnit extra_space_share;
+    if (AreEqual(set_share_ratio, share_ratio_sum)) {
+      // If this set's share ratio and the remaining ratio sum are the same, it
+      // means that this set will receive all of the remaining space. Hence, we
+      // can optimize a little by directly using the extra space as this set's
+      // share and break early by decreasing the remaining growable track count
+      // to 0 (even if there are further growable tracks, since the share ratio
+      // sum will be reduced to 0, their space share will also be 0).
+      set_track_count = growable_track_count;
+      extra_space_share = extra_space;
+    } else {
+      DCHECK(!AreEqual<ShareRatioType>(share_ratio_sum, 0));
+      DCHECK_LT(set_share_ratio, share_ratio_sum);
+
+      extra_space_share = LayoutUnit::FromRawValue(
+          (extra_space.RawValue() * set_share_ratio) / share_ratio_sum);
+    }
+
+    if (growth_potential != kIndefiniteSize) {
+      extra_space_share = std::min(extra_space_share, growth_potential);
+    }
+    DCHECK_LE(extra_space_share, extra_space);
+
+    growable_track_count -= set_track_count;
+    share_ratio_sum -= set_share_ratio;
+    extra_space -= extra_space_share;
+    return extra_space_share;
+  };
+
+  // Distribute space up to limits:
+  //   - For base sizes, grow the base size up to the growth limit.
+  //   - For growth limits, the only case where a growth limit should grow at
+  //   this step is when its set has already been marked "infinitely growable".
+  //   Increase the growth limit up to the 'fit-content' argument (if any); note
+  //   that these arguments could prevent this step to fulfill the entirety of
+  //   the extra space and further distribution would be needed.
+  for (auto* set : *sets_to_grow) {
+    // Break early if there are no further tracks to grow.
+    if (!growable_track_count) {
+      break;
+    }
+    set->item_incurred_increase =
+        ExtraSpaceShare(*set, GrowthPotentialForSet(*set, contribution_type));
+  }
+
+  // Distribute space beyond limits:
+  //   - For base sizes, every affected track can grow indefinitely.
+  //   - For growth limits, grow tracks up to their 'fit-content' argument.
+  if (sets_to_grow_beyond_limit && extra_space) {
+#if DCHECK_IS_ON()
+    // We expect `sets_to_grow_beyond_limit` to be ordered by growth potential
+    // for the following section of the algorithm to work.
+    //
+    // For base sizes, since going beyond limits should only happen after we
+    // grow every track up to their growth limits, it should be easy to see that
+    // every growth potential is now zero, so they're already ordered.
+    //
+    // Now let's consider growth limits: we forced the sets to be sorted by
+    // growth potential ignoring the "infinitely growable" flag, meaning that
+    // ultimately they will be sorted by remaining space to their 'fit-content'
+    // parameter (if it exists, infinite otherwise). If we ended up here, we
+    // must have filled the sets marked as "infinitely growable" up to their
+    // 'fit-content' parameter; therefore, if we only consider sets with
+    // remaining space to their 'fit-content' limit in the following
+    // distribution step, they should still be ordered.
+    LayoutUnit previous_growable_potential;
+    for (auto* set : *sets_to_grow_beyond_limit) {
+      LayoutUnit growth_potential = GrowthPotentialForSet(
+          *set, contribution_type, InfinitelyGrowableBehavior::kIgnore);
+      if (growth_potential) {
+        if (previous_growable_potential == kIndefiniteSize) {
+          DCHECK_EQ(growth_potential, kIndefiniteSize);
+        } else {
+          DCHECK(growth_potential >= previous_growable_potential ||
+                 growth_potential == kIndefiniteSize);
+        }
+        previous_growable_potential = growth_potential;
+      }
+    }
+#endif
+
+    auto BeyondLimitsGrowthPotential =
+        [contribution_type](const GridSet& set) -> LayoutUnit {
+      // For growth limits, ignore the "infinitely growable" flag and grow all
+      // affected tracks up to their 'fit-content' argument (note that
+      // `GrowthPotentialForSet` already accounts for it).
+      return !IsDistributionForGrowthLimits(contribution_type)
+                 ? kIndefiniteSize
+                 : GrowthPotentialForSet(set, contribution_type,
+                                         InfinitelyGrowableBehavior::kIgnore);
+    };
+
+    // If we reached this point, we must have exhausted every growable track up
+    // to their limits, meaning `growable_track_count` should be 0 and we need
+    // to recompute it considering their 'fit-content' limits instead.
+    DCHECK_EQ(growable_track_count, 0u);
+
+    for (auto* set : *sets_to_grow_beyond_limit) {
+      if (BeyondLimitsGrowthPotential(*set)) {
+        growable_track_count += set->track_count;
+      }
+    }
+
+    // In `IncreaseTrackSizesToAccommodateGridItems` we guaranteed that, when
+    // dealing with flexible tracks, there shouldn't be any set to grow beyond
+    // limits. Thus, the only way to reach the section below is when we are
+    // distributing space equally among sets.
+    DCHECK(is_equal_distribution);
+    share_ratio_sum = growable_track_count;
+
+    for (auto* set : *sets_to_grow_beyond_limit) {
+      // Break early if there are no further tracks to grow.
+      if (!growable_track_count) {
+        break;
+      }
+      set->item_incurred_increase +=
+          ExtraSpaceShare(*set, BeyondLimitsGrowthPotential(*set));
+    }
+  }
+}
+
+void DistributeExtraSpaceToSetsEqually(
+    LayoutUnit extra_space,
+    GridItemContributionType contribution_type,
+    GridSetPtrVector* sets_to_grow,
+    GridSetPtrVector* sets_to_grow_beyond_limit = nullptr) {
+  DistributeExtraSpaceToSets</*is_equal_distribution=*/true>(
+      extra_space, /*flex_factor_sum=*/0, contribution_type, sets_to_grow,
+      sets_to_grow_beyond_limit);
+}
+
+void DistributeExtraSpaceToWeightedSets(
+    LayoutUnit extra_space,
+    float flex_factor_sum,
+    GridItemContributionType contribution_type,
+    GridSetPtrVector* sets_to_grow) {
+  DistributeExtraSpaceToSets</*is_equal_distribution=*/false>(
+      extra_space, flex_factor_sum, contribution_type, sets_to_grow,
+      /*sets_to_grow_beyond_limit=*/nullptr);
+}
+
+}  // namespace
+
+void GridTrackSizingAlgorithm::IncreaseTrackSizesToAccommodateGridItems(
+    const ContributionSizeFunctionRef& contribution_size,
+    base::span<GridItemData*>::iterator group_begin,
+    base::span<GridItemData*>::iterator group_end,
+    GridItemContributionType contribution_type,
+    bool is_group_spanning_flex_track,
+    GridSizingTrackCollection* track_collection) const {
+  DCHECK(track_collection);
+
+  for (auto set_iterator = track_collection->GetSetIterator();
+       !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
+    set_iterator.CurrentSet().planned_increase = kIndefiniteSize;
+  }
+
+  GridSetPtrVector sets_to_grow;
+  GridSetPtrVector sets_to_grow_beyond_limit;
+  const auto track_direction = track_collection->Direction();
+
+  while (group_begin != group_end) {
+    auto& grid_item = **group_begin++;
+    DCHECK(grid_item.IsSpanningIntrinsicTrack(track_direction));
+
+    sets_to_grow.Shrink(0);
+    sets_to_grow_beyond_limit.Shrink(0);
+
+    ClampedFloat flex_factor_sum = 0;
+    auto spanned_tracks_size = track_collection->GutterSize() *
+                               (grid_item.SpanSize(track_direction) - 1);
+
+    for (auto set_iterator = grid_item.SetIterator(track_collection);
+         !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
+      auto& current_set = set_iterator.CurrentSet();
+
+      spanned_tracks_size +=
+          AffectedSizeForContribution(current_set, contribution_type);
+
+      if (is_group_spanning_flex_track &&
+          !current_set.track_size.HasFlexMaxTrackBreadth()) {
+        // From https://drafts.csswg.org/css-grid-2/#algo-spanning-flex-items:
+        //   Distributing space only to flexible tracks (i.e. treating all other
+        //   tracks as having a fixed sizing function).
+        continue;
+      }
+
+      if (IsContributionAppliedToSet(current_set, contribution_type)) {
+        if (current_set.planned_increase == kIndefiniteSize) {
+          current_set.planned_increase = LayoutUnit();
+        }
+
+        if (is_group_spanning_flex_track) {
+          flex_factor_sum += current_set.FlexFactor();
+        }
+
+        sets_to_grow.push_back(&current_set);
+        if (ShouldUsedSizeGrowBeyondLimit(current_set, contribution_type)) {
+          sets_to_grow_beyond_limit.push_back(&current_set);
+        }
+      }
+    }
+
+    if (sets_to_grow.empty()) {
+      continue;
+    }
+
+    // Subtract the corresponding size (base size or growth limit) of every
+    // spanned track from the grid item's size contribution to find the item's
+    // remaining size contribution. For infinite growth limits, substitute with
+    // the track's base size. This is the space to distribute, floor it at zero.
+    const auto extra_space =
+        (contribution_size(contribution_type, &grid_item) - spanned_tracks_size)
+            .ClampNegativeToZero();
+
+    if (!extra_space) {
+      continue;
+    }
+
+    // From https://drafts.csswg.org/css-grid-2/#algo-spanning-flex-items:
+    //   If the sum of the flexible sizing functions of all flexible tracks
+    //   spanned by the item is greater than zero, distributing space to such
+    //   tracks according to the ratios of their flexible sizing functions
+    //   rather than distributing space equally.
+    if (!is_group_spanning_flex_track || AreEqual<float>(flex_factor_sum, 0)) {
+      DistributeExtraSpaceToSetsEqually(
+          extra_space, contribution_type, &sets_to_grow,
+          sets_to_grow_beyond_limit.empty() ? &sets_to_grow
+                                            : &sets_to_grow_beyond_limit);
+    } else {
+      // 'fr' units are only allowed as a maximum in track definitions, meaning
+      // that no set has an intrinsic max track sizing function that would allow
+      // it to grow beyond limits (see `ShouldUsedSizeGrowBeyondLimit`).
+      DCHECK(sets_to_grow_beyond_limit.empty());
+      DistributeExtraSpaceToWeightedSets(extra_space, flex_factor_sum,
+                                         contribution_type, &sets_to_grow);
+    }
+
+    // For each affected track, if the track's item-incurred increase is larger
+    // than its planned increase, set the planned increase to that value.
+    for (auto* set : sets_to_grow) {
+      DCHECK_NE(set->item_incurred_increase, kIndefiniteSize);
+      DCHECK_NE(set->planned_increase, kIndefiniteSize);
+      set->planned_increase =
+          std::max(set->item_incurred_increase, set->planned_increase);
+    }
+  }
+
+  for (auto set_iterator = track_collection->GetSetIterator();
+       !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
+    GrowAffectedSizeByPlannedIncrease(contribution_type,
+                                      &set_iterator.CurrentSet());
+  }
+}
+
+// https://drafts.csswg.org/css-grid-2/#algo-content
+void GridTrackSizingAlgorithm::ResolveIntrinsicTrackSizes(
+    const ContributionSizeFunctionRef& contribution_size,
+    GridSizingTrackCollection* track_collection,
+    GridItems* grid_items) const {
+  DCHECK(track_collection);
+  DCHECK(grid_items);
+
+  GridItemDataPtrVector reordered_grid_items;
+  const auto track_direction = track_collection->Direction();
+  reordered_grid_items.ReserveInitialCapacity(grid_items->Size());
+
+  for (auto& grid_item : grid_items->IncludeSubgriddedItems()) {
+    if (grid_item.IsSpanningIntrinsicTrack(track_direction) &&
+        grid_item.IsConsideredForSizing(track_direction)) {
+      reordered_grid_items.emplace_back(&grid_item);
+    }
+  }
+
+  // Reorder grid items to process them as follows:
+  //   - First, consider items spanning a single non-flexible track.
+  //   - Next, consider items with span size of 2 not spanning a flexible track.
+  //   - Repeat incrementally for items with greater span sizes until all items
+  //   not spanning a flexible track have been considered.
+  //   - Finally, consider all items spanning a flexible track.
+  auto CompareGridItemsForIntrinsicTrackResolution =
+      [track_direction](GridItemData* lhs, GridItemData* rhs) -> bool {
+    if (lhs->IsSpanningFlexibleTrack(track_direction) ||
+        rhs->IsSpanningFlexibleTrack(track_direction)) {
+      // Ignore span sizes if one of the items spans a track with a flexible
+      // sizing function; items not spanning such tracks should come first.
+      return !lhs->IsSpanningFlexibleTrack(track_direction);
+    }
+    return lhs->SpanSize(track_direction) < rhs->SpanSize(track_direction);
+  };
+  std::sort(reordered_grid_items.begin(), reordered_grid_items.end(),
+            CompareGridItemsForIntrinsicTrackResolution);
+
+  auto current_group_begin = base::span(reordered_grid_items).begin();
+  const auto reordered_grid_items_end = base::span(reordered_grid_items).end();
+
+  // First, process the items that don't span a flexible track.
+  while (current_group_begin != reordered_grid_items_end &&
+         !(*current_group_begin)->IsSpanningFlexibleTrack(track_direction)) {
+    // Each iteration considers all items with the same span size.
+    const auto current_group_span_size =
+        (*current_group_begin)->SpanSize(track_direction);
+    auto current_group_end = current_group_begin;
+
+    do {
+      DCHECK(!(*current_group_end)->IsSpanningFlexibleTrack(track_direction));
+      ++current_group_end;
+    } while (current_group_end != reordered_grid_items_end &&
+             !(*current_group_end)->IsSpanningFlexibleTrack(track_direction) &&
+             (*current_group_end)->SpanSize(track_direction) ==
+                 current_group_span_size);
+
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, current_group_end,
+        GridItemContributionType::kForIntrinsicMinimums,
+        /*is_group_spanning_flex_track=*/false, track_collection);
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, current_group_end,
+        GridItemContributionType::kForContentBasedMinimums,
+        /*is_group_spanning_flex_track=*/false, track_collection);
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, current_group_end,
+        GridItemContributionType::kForMaxContentMinimums,
+        /*is_group_spanning_flex_track=*/false, track_collection);
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, current_group_end,
+        GridItemContributionType::kForIntrinsicMaximums,
+        /*is_group_spanning_flex_track=*/false, track_collection);
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, current_group_end,
+        GridItemContributionType::kForMaxContentMaximums,
+        /*is_group_spanning_flex_track=*/false, track_collection);
+
+    // Move to the next group with greater span size.
+    current_group_begin = current_group_end;
+  }
+
+  // From https://drafts.csswg.org/css-grid-2/#algo-spanning-flex-items:
+  //   Increase sizes to accommodate spanning items crossing flexible tracks:
+  //   Next, repeat the previous step instead considering (together, rather than
+  //   grouped by span size) all items that do span a track with a flexible
+  //   sizing function...
+#if DCHECK_IS_ON()
+  // Every grid item of the remaining group should span a flexible track.
+  for (auto it = current_group_begin; it != reordered_grid_items_end; ++it) {
+    DCHECK((*it)->IsSpanningFlexibleTrack(track_direction));
+  }
+#endif
+
+  // Now, process items spanning flexible tracks (if any).
+  if (current_group_begin != reordered_grid_items_end) {
+    // We can safely skip contributions for maximums since a <flex> definition
+    // does not have an intrinsic max track sizing function.
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, reordered_grid_items_end,
+        GridItemContributionType::kForIntrinsicMinimums,
+        /*is_group_spanning_flex_track=*/true, track_collection);
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, reordered_grid_items_end,
+        GridItemContributionType::kForContentBasedMinimums,
+        /*is_group_spanning_flex_track=*/true, track_collection);
+    IncreaseTrackSizesToAccommodateGridItems(
+        contribution_size, current_group_begin, reordered_grid_items_end,
+        GridItemContributionType::kForMaxContentMinimums,
+        /*is_group_spanning_flex_track=*/true, track_collection);
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.h b/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.h
index ef85a9a..dafdd3f6 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.h
+++ b/third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.h
@@ -5,6 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GRID_GRID_TRACK_SIZING_ALGORITHM_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GRID_GRID_TRACK_SIZING_ALGORITHM_H_
 
+#include "base/containers/span.h"
+#include "base/functional/function_ref.h"
 #include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
 #include "third_party/blink/renderer/core/style/grid_enums.h"
 
@@ -14,6 +16,22 @@
 class GridItems;
 class GridSizingTrackCollection;
 struct BoxStrut;
+struct GridItemData;
+
+// This enum corresponds to each step used to accommodate grid items across
+// intrinsic tracks according to their min and max track sizing functions, as
+// defined in https://drafts.csswg.org/css-grid-2/#algo-spanning-items.
+enum class GridItemContributionType {
+  kForIntrinsicMinimums,
+  kForContentBasedMinimums,
+  kForMaxContentMinimums,
+  kForIntrinsicMaximums,
+  kForMaxContentMaximums,
+  kForFreeSpace
+};
+
+using ContributionSizeFunctionRef =
+    base::FunctionRef<LayoutUnit(GridItemContributionType, GridItemData*)>;
 
 class GridTrackSizingAlgorithm {
   STACK_ALLOCATED();
@@ -44,6 +62,22 @@
       const ComputedStyle& container_style,
       const LogicalSize& container_available_size,
       const BoxStrut& container_border_scrollbar_padding);
+
+ private:
+  // These methods implement the steps of the algorithm for intrinsic track size
+  // resolution defined in https://drafts.csswg.org/css-grid-2/#algo-content.
+  void ResolveIntrinsicTrackSizes(
+      const ContributionSizeFunctionRef& contribution_size,
+      GridSizingTrackCollection* track_collection,
+      GridItems* grid_items) const;
+
+  void IncreaseTrackSizesToAccommodateGridItems(
+      const ContributionSizeFunctionRef& contribution_size,
+      base::span<GridItemData*>::iterator group_begin,
+      base::span<GridItemData*>::iterator group_end,
+      GridItemContributionType contribution_type,
+      bool is_group_spanning_flex_track,
+      GridSizingTrackCollection* track_collection) const;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/inline/fragment_items.cc b/third_party/blink/renderer/core/layout/inline/fragment_items.cc
index 629e2c6..423ff42b 100644
--- a/third_party/blink/renderer/core/layout/inline/fragment_items.cc
+++ b/third_party/blink/renderer/core/layout/inline/fragment_items.cc
@@ -74,16 +74,50 @@
 void FragmentItems::FinalizeAfterLayout(
     const HeapVector<Member<const LayoutResult>, 1>& results,
     LayoutBlockFlow& container) {
+  // This class keeps the parent GC objecct and index in case the backing buffer
+  // is moved, because `FragmentItem` is a traceable DISALLOW_NEW objects,
+  class FragmentItemPtr {
+    DISALLOW_NEW();
+
+   public:
+    FragmentItemPtr() = default;
+    FragmentItemPtr(const FragmentItem& item,
+                    const PhysicalBoxFragment& fragment,
+                    const Span& items)
+        : fragment_(fragment), index_(&item - items.data()) {
+#if EXPENSIVE_DCHECKS_ARE_ON()
+      DCHECK_EQ(fragment.Items()->Items().data(), items.data());
+#endif  // EXPENSIVE_DCHECKS_ARE_ON()
+    }
+
+    const FragmentItem* Get() const {
+      return fragment_ ? &(*fragment_->Items())[index_] : nullptr;
+    }
+    const FragmentItem& operator*() const { return *Get(); }
+
+    void Trace(Visitor* visitor) const { visitor->Trace(fragment_); }
+
+   private:
+    Member<const PhysicalBoxFragment> fragment_;
+    wtf_size_t index_ = 0;
+  };
+
+  // This struct keeps the last `FragmentItem` and other properties for a
+  // `LayoutObject`. Their lifecycles are only within this function.
   struct LastItem {
-    GC_PLUGIN_IGNORE("GC API violation: https://crbug.com/389707047")
-    const FragmentItem* item;
+    DISALLOW_NEW();
+
+   public:
+    void Trace(Visitor* visitor) const { visitor->Trace(item); }
+
+    FragmentItemPtr item;
     wtf_size_t fragment_id;
-    wtf_size_t item_index;
+    wtf_size_t total_item_index;
   };
   HeapHashMap<Member<const LayoutObject>, LastItem> last_items;
   ClearCollectionScope<HeapHashMap<Member<const LayoutObject>, LastItem>>
       clear_scope(&last_items);
-  wtf_size_t item_index = 0;
+  wtf_size_t total_item_index = 0;
   wtf_size_t line_fragment_id = FragmentItem::kInitialLineFragmentId;
 
   // If there are container fragments that don't have fragment items, or if
@@ -104,10 +138,10 @@
     }
 
     bool found_inflow_content = false;
-    fragment_items->size_of_earlier_fragments_ = item_index;
+    fragment_items->size_of_earlier_fragments_ = total_item_index;
     const Span items = fragment_items->Items();
     for (const FragmentItem& item : items) {
-      ++item_index;
+      ++total_item_index;
       if (item.Type() == FragmentItem::kLine) {
         DCHECK_EQ(item.DeltaToNextForSameLayoutObject(), 0u);
         item.SetFragmentId(line_fragment_id++);
@@ -156,23 +190,26 @@
 
       // If this is the first fragment, associate with |layout_object|.
       const auto last_item_result =
-          last_items.insert(layout_object, LastItem{&item, 0, item_index});
+          last_items.insert(layout_object, LastItem{{item, fragment, items},
+                                                    /*fragment_id*/ 0,
+                                                    total_item_index});
       const bool is_first = last_item_result.is_new_entry;
       if (is_first) {
         item.SetFragmentId(0);
-        layout_object->SetFirstInlineFragmentItemIndex(item_index);
+        layout_object->SetFirstInlineFragmentItemIndex(total_item_index);
         continue;
       }
 
       // Update the last item for |layout_object|.
       LastItem* last = &last_item_result.stored_value->value;
-      const FragmentItem* last_item = last->item;
+      const FragmentItem* last_item = last->item.Get();
       DCHECK_EQ(last_item->DeltaToNextForSameLayoutObject(), 0u);
-      const wtf_size_t last_index = last->item_index;
+      const wtf_size_t last_index = last->total_item_index;
       DCHECK_GT(last_index, 0u);
       DCHECK_LT(last_index, fragment_items->EndItemIndex());
-      DCHECK_LT(last_index, item_index);
-      last_item->SetDeltaToNextForSameLayoutObject(item_index - last_index);
+      DCHECK_LT(last_index, total_item_index);
+      last_item->SetDeltaToNextForSameLayoutObject(total_item_index -
+                                                   last_index);
       // Because we found a following fragment, reset |IsLastForNode| for the
       // last item except:
       // a. |IsLastForNode| is computed from break token. The last item already
@@ -187,8 +224,8 @@
 
       // Update this item.
       item.SetFragmentId(++last->fragment_id);
-      last->item = &item;
-      last->item_index = item_index;
+      last->item = {item, fragment, items};
+      last->total_item_index = total_item_index;
     }
 
     if (!found_inflow_content) {
diff --git a/third_party/blink/renderer/core/layout/inline/fragment_items.h b/third_party/blink/renderer/core/layout/inline/fragment_items.h
index f0e78e1..74b701c 100644
--- a/third_party/blink/renderer/core/layout/inline/fragment_items.h
+++ b/third_party/blink/renderer/core/layout/inline/fragment_items.h
@@ -35,6 +35,9 @@
   }
   bool IsSubSpan(const Span& span) const;
 
+  const FragmentItem& operator[](wtf_size_t index) const {
+    return items_[index];
+  }
   const FragmentItem& front() const {
     CHECK_GE(items_.size(), 1u);
     return items_[0];
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index f300d23..1a9b47e 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2811,10 +2811,9 @@
         };
 
     // See HighlightRegistry for ::highlight() paint invalidation.
-    // TODO(rego): We don't do anything regarding ::selection, as ::selection
+    // We don't do anything regarding ::selection, as ::selection
     // uses its own mechanism for this (see
-    // LayoutObject::InvalidateSelectedChildrenOnStyleChange()). Maybe in the
-    // future we could detect changes here for ::selection too.
+    // LayoutObject::InvalidateSelectionOnStyleChange()).
     if (RuntimeEnabledFeatures::SearchTextHighlightPseudoEnabled() &&
         UsesHighlightPseudoInheritance(kPseudoIdSearchText)) {
       HighlightPseudoUpdateDiff(kPseudoIdSearchText,
@@ -3353,7 +3352,7 @@
 
   if ((old_style && old_style->HasPseudoElementStyle(kPseudoIdSelection)) ||
       StyleRef().HasPseudoElementStyle(kPseudoIdSelection))
-    InvalidateSelectedChildrenOnStyleChange();
+    InvalidateSelectionOnStyleChange();
 }
 
 void LayoutObject::ApplyFirstLineChanges(const ComputedStyle* old_style) {
@@ -4678,8 +4677,7 @@
   bitfields_.SetShouldInvalidateSelection(true);
   SetShouldCheckForPaintInvalidation();
   // Invalidate overflow for ::selection styles that contain overflowing
-  // effects. Do this only for text objects, at least until
-  // crbug.com/1128199 is resolved (see InvalidateVisualOverflow())
+  // effects.
   if (IsText()) {
     if (auto* computed_style = GetSelectionStyle()) {
       if (computed_style->HasAppliedTextDecorations() ||
@@ -4939,13 +4937,12 @@
   return PhysicalRect();
 }
 
-void LayoutObject::InvalidateSelectedChildrenOnStyleChange() {
+void LayoutObject::InvalidateSelectionOnStyleChange() {
   NOT_DESTROYED();
   // LayoutSelection::Commit() propagates the state up the containing node
-  // chain to
-  // tell if a block contains selected nodes or not. If this layout object is
-  // not a block, we need to get the selection state from the containing block
-  // to tell if we have any selected node children.
+  // chain to tell if a block contains selected nodes or not. If this layout
+  // object is not a block, we need to get the selection state from the
+  // containing block to tell if we have any selected node children.
   LayoutBlock* block =
       IsLayoutBlock() ? To<LayoutBlock>(this) : ContainingBlock();
   if (!block)
@@ -4953,16 +4950,23 @@
   if (!block->IsSelected())
     return;
 
-  // ::selection style only applies to direct selection leaf children of the
-  // element on which the ::selection style is set. Thus, we only walk the
-  // direct children here.
+  InvalidateSelectedChildrenOnStyleChange();
+}
+
+void LayoutObject::InvalidateSelectedChildrenOnStyleChange() {
+  // Process the entire subtree for selected nodes, marking those that are
+  // leaves as needing invalidation. This is necessary because ::selection
+  // styling may apply to the entire subtree.
   for (LayoutObject* child = SlowFirstChild(); child;
        child = child->NextSibling()) {
-    if (!child->CanBeSelectionLeaf())
+    if (!child->IsSelected()) {
       continue;
-    if (!child->IsSelected())
+    }
+    if (child->CanBeSelectionLeaf()) {
+      child->SetShouldInvalidateSelection();
       continue;
-    child->SetShouldInvalidateSelection();
+    }
+    child->InvalidateSelectedChildrenOnStyleChange();
   }
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index d7e9a74..56e5d98e 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2925,9 +2925,7 @@
   void SetNeedsOverflowRecalc(
       OverflowRecalcType = OverflowRecalcType::kLayoutAndVisualOverflowRecalc);
 
-  // Call |SetShouldDoFullPaintInvalidation| for LayoutNG or
-  // |SetShouldInvalidateSelection| on all selected children.
-  void InvalidateSelectedChildrenOnStyleChange();
+  void InvalidateSelectionOnStyleChange();
 
   // The allowed touch action is the union of the effective touch action
   // (from style) and blocking touch event handlers.
@@ -3590,6 +3588,10 @@
 
   inline void InvalidateContainerIntrinsicLogicalWidths();
 
+  // Call |SetShouldDoFullPaintInvalidation| for LayoutNG or
+  // |SetShouldInvalidateSelection| on all selected children.
+  void InvalidateSelectedChildrenOnStyleChange();
+
   LayoutFlowThread* LocateFlowThreadContainingBlock() const;
   void RemoveFromLayoutFlowThreadRecursive(LayoutFlowThread*);
 
diff --git a/third_party/blink/renderer/core/layout/layout_theme_mobile.cc b/third_party/blink/renderer/core/layout/layout_theme_mobile.cc
index 8c54617..52ad57b5 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_mobile.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_mobile.cc
@@ -28,6 +28,7 @@
 #include "build/build_config.h"
 #include "third_party/blink/public/platform/web_theme_engine.h"
 #include "third_party/blink/public/resources/grit/blink_resources.h"
+#include "third_party/blink/renderer/core/html/forms/html_select_element.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/data_resource_helper.h"
 #include "third_party/blink/renderer/platform/theme/web_theme_engine_helper.h"
@@ -51,10 +52,16 @@
 LayoutThemeMobile::~LayoutThemeMobile() = default;
 
 String LayoutThemeMobile::ExtraDefaultStyleSheet() {
-  return LayoutThemeDefault::ExtraDefaultStyleSheet() +
-         UncompressResourceAsASCIIString(IDR_UASTYLE_THEME_CHROMIUM_LINUX_CSS) +
-         UncompressResourceAsASCIIString(
-             IDR_UASTYLE_THEME_CHROMIUM_ANDROID_CSS);
+  String stylesheet =
+      LayoutThemeDefault::ExtraDefaultStyleSheet() +
+      UncompressResourceAsASCIIString(IDR_UASTYLE_THEME_CHROMIUM_LINUX_CSS) +
+      UncompressResourceAsASCIIString(IDR_UASTYLE_THEME_CHROMIUM_ANDROID_CSS);
+  // This can't check for origin trials, unfortunately.
+  if (HTMLSelectElement::CustomizableSelectEnabledNoDocument()) {
+    stylesheet = stylesheet + UncompressResourceAsASCIIString(
+                                  IDR_UASTYLE_CUSTOMIZABLE_SELECT_LINUX_CSS);
+  }
+  return stylesheet;
 }
 
 String LayoutThemeMobile::ExtraFullscreenStyleSheet() {
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc
index 7884cc68..dd6c2795 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc
@@ -10,10 +10,16 @@
 
 namespace blink {
 
+MasonryLayoutAlgorithm::MasonryLayoutAlgorithm(
+    const LayoutAlgorithmParams& params)
+    : LayoutAlgorithm(params) {
+  DCHECK(params.space.IsNewFormattingContext());
+}
+
 const LayoutResult* MasonryLayoutAlgorithm::Layout() {
   for (auto child = Node().FirstChild(); child; child = child.NextSibling()) {
     To<BlockNode>(child).Layout(CreateConstraintSpaceForMeasure(
-        GridItemData(To<BlockNode>(child), Style(), Style())));
+        GridItemData(To<BlockNode>(child), Style())));
   }
 
   // TODO(ethavar): Compute the actual block size.
@@ -26,10 +32,42 @@
   return {MinMaxSizes(), /*depends_on_block_constraints=*/false};
 }
 
-MasonryLayoutAlgorithm::MasonryLayoutAlgorithm(
-    const LayoutAlgorithmParams& params)
-    : LayoutAlgorithm(params) {
-  DCHECK(params.space.IsNewFormattingContext());
+GridItems MasonryLayoutAlgorithm::VirtualMasonryItems(
+    const GridLineResolver& line_resolver,
+    wtf_size_t* start_offset) const {
+  DCHECK(start_offset);
+
+  const auto item_groups =
+      Node().CollectItemGroups(line_resolver, start_offset);
+  DCHECK_GE(*start_offset, 0u);
+
+  GridItems virtual_items;
+  const auto& style = Style();
+  const auto grid_axis_direction = style.MasonryTrackSizingDirection();
+
+  for (const auto& [group_properties, group_items] : item_groups) {
+    auto virtual_item = std::make_unique<GridItemData>();
+    auto span = group_properties.Span();
+
+    for (const auto& item_node : group_items) {
+      const auto space =
+          CreateConstraintSpaceForMeasure(GridItemData(item_node, style));
+      virtual_item->EncompassContributionSizes(
+          ComputeMinAndMaxContentContributionForSelf(item_node, space).sizes);
+    }
+
+    if (span.IsUntranslatedDefinite()) {
+      // For groups of items that are explicitly placed, we only need to add a
+      // single virtual masonry item within the specified span.
+      span.Translate(*start_offset);
+      virtual_item->resolved_position.SetSpan(span, grid_axis_direction);
+      virtual_items.Append(std::move(virtual_item));
+      continue;
+    }
+
+    DCHECK(span.IsIndefinite());
+  }
+  return virtual_items;
 }
 
 GridSizingTrackCollection MasonryLayoutAlgorithm::BuildGridAxisTracks() const {
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h
index 2c043b7..a24b4f0 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h
@@ -12,6 +12,8 @@
 
 namespace blink {
 
+class GridItems;
+class GridLineResolver;
 class GridSizingTrackCollection;
 struct GridItemData;
 
@@ -30,6 +32,14 @@
 
   wtf_size_t ComputeAutomaticRepetitions() const;
 
+  // From https://drafts.csswg.org/css-grid-3/#track-sizing-performance:
+  //   "... synthesize a virtual masonry item that has the maximum of every
+  //   intrinsic size contribution among the items in that group."
+  // Returns a collection of items that reflect the intrinsic contributions from
+  // the item groups, which will be used to resolve the grid axis' track sizes.
+  GridItems VirtualMasonryItems(const GridLineResolver& line_resolver,
+                                wtf_size_t* start_offset) const;
+
   ConstraintSpace CreateConstraintSpace(
       const GridItemData& masonry_item,
       const LogicalSize& containing_size,
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm_test.cc
index 0076e44..d1d4f96 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h"
 
 #include "third_party/blink/renderer/core/layout/base_layout_algorithm_test.h"
+#include "third_party/blink/renderer/core/layout/grid/grid_item.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_track_collection.h"
 #include "third_party/blink/renderer/core/layout/length_utils.h"
 #include "third_party/blink/renderer/core/layout/masonry/masonry_item_group.h"
@@ -16,19 +17,50 @@
   void SetUp() override { BaseLayoutAlgorithmTest::SetUp(); }
 
   void ComputeGeometry(const MasonryLayoutAlgorithm& algorithm) {
+    wtf_size_t start_offset;
+    GridLineResolver line_resolver(algorithm.Style(),
+                                   /*column_auto_repetitions=*/0,
+                                   /*row_auto_repetitions=*/0);
+    virtual_masonry_items_ =
+        algorithm.VirtualMasonryItems(line_resolver, &start_offset);
+
     grid_axis_tracks_ = std::make_unique<GridSizingTrackCollection>(
         algorithm.BuildGridAxisTracks());
   }
 
-  const GridRangeVector& Ranges() const { return grid_axis_tracks_->ranges_; }
-  wtf_size_t SetCount() const { return grid_axis_tracks_->GetSetCount(); }
+  const GridRangeVector& Ranges() { return grid_axis_tracks_->ranges_; }
+  wtf_size_t SetCount() { return grid_axis_tracks_->GetSetCount(); }
+  wtf_size_t VirtualItemCount() { return virtual_masonry_items_.Size(); }
 
-  LayoutUnit TrackSize(wtf_size_t index) const {
+  LayoutUnit TrackSize(wtf_size_t index) {
     return grid_axis_tracks_->GetSetOffset(index + 1) -
            grid_axis_tracks_->GetSetOffset(index);
   }
 
+  LayoutUnit MaxContentContribution(wtf_size_t index) {
+    return ContributionSizes(index).max_size;
+  }
+
+  LayoutUnit MinContentContribution(wtf_size_t index) {
+    return ContributionSizes(index).min_size;
+  }
+
+  const GridSpan& VirtualItemSpan(wtf_size_t index) {
+    return virtual_masonry_items_.At(index).resolved_position.Span(
+        grid_axis_tracks_->Direction());
+  }
+
+ private:
+  const MinMaxSizes& ContributionSizes(wtf_size_t index) {
+    const auto& contribution_sizes =
+        virtual_masonry_items_.At(index).contribution_sizes;
+
+    DCHECK(contribution_sizes);
+    return *contribution_sizes;
+  }
+
   std::unique_ptr<GridSizingTrackCollection> grid_axis_tracks_;
+  GridItems virtual_masonry_items_;
 };
 
 TEST_F(MasonryLayoutAlgorithmTest, BuildRanges) {
@@ -105,12 +137,7 @@
 
 TEST_F(MasonryLayoutAlgorithmTest, CollectMasonryItemGroups) {
   SetBodyInnerHTML(R"HTML(
-    <style>
-    #masonry {
-      display: masonry;
-    }
-    </style>
-    <div id="masonry">
+    <div id="masonry" style="display: masonry">
       <div></div>
       <div style="masonry-track: 1"></div>
       <div style="masonry-track: 1 / 4"></div>
@@ -121,14 +148,17 @@
   )HTML");
 
   MasonryNode node(GetLayoutBoxByElementId("masonry"));
-  const auto item_groups = node.CollectItemGroups(GridLineResolver(
-      node.Style(), /*column_auto_repetitions=*/0, /*row_auto_repetitions=*/0));
+
+  wtf_size_t start_offset;
+  GridLineResolver line_resolver(node.Style(), /*column_auto_repetitions=*/0,
+                                 /*row_auto_repetitions=*/0);
+  const auto item_groups = node.CollectItemGroups(line_resolver, &start_offset);
 
   EXPECT_EQ(item_groups.size(), 4u);
 
   for (const auto& [properties, items] : item_groups) {
     wtf_size_t expected_size = 0;
-    const auto span = properties.Span();
+    const auto& span = properties.Span();
     if (span == GridSpan::IndefiniteGridSpan(3) ||
         span == GridSpan::UntranslatedDefiniteGridSpan(0, 1)) {
       expected_size = 1;
@@ -140,4 +170,53 @@
   }
 }
 
+TEST_F(MasonryLayoutAlgorithmTest, ExplicitlyPlacedVirtualItems) {
+  LoadAhem();
+  SetBodyInnerHTML(R"HTML(
+    <style>
+    body { font: 10px/1 Ahem }
+    #masonry {
+      display: masonry;
+      masonry-template-tracks: repeat(2, 100px);
+    }
+    </style>
+    <div id="masonry">
+      <div style="masonry-track: 1">XX XX</div>
+      <div style="masonry-track: -4 / 3">XXX X</div>
+      <div style="masonry-track: span 3 / 3">X XX X</div>
+    </div>
+  )HTML");
+
+  BlockNode node(GetLayoutBoxByElementId("masonry"));
+
+  const auto space = ConstructBlockLayoutTestConstraintSpace(
+      {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      LogicalSize(LayoutUnit(100), LayoutUnit(100)),
+      /*stretch_inline_size_if_auto=*/true,
+      /*is_new_formatting_context=*/true);
+
+  const auto fragment_geometry =
+      CalculateInitialFragmentGeometry(space, node, /*break_token=*/nullptr);
+
+  MasonryLayoutAlgorithm algorithm({node, fragment_geometry, space});
+  ComputeGeometry(algorithm);
+
+  const auto item_count = VirtualItemCount();
+  EXPECT_EQ(item_count, 2u);
+
+  for (wtf_size_t i = 0; i < item_count; ++i) {
+    LayoutUnit expected_max_size, expected_min_size;
+    const auto& span = VirtualItemSpan(i);
+    if (span == GridSpan::TranslatedDefiniteGridSpan(1, 2)) {
+      expected_max_size = LayoutUnit(50);
+      expected_min_size = LayoutUnit(20);
+    } else if (span == GridSpan::TranslatedDefiniteGridSpan(0, 3)) {
+      expected_max_size = LayoutUnit(60);
+      expected_min_size = LayoutUnit(30);
+    }
+    EXPECT_EQ(MaxContentContribution(i), expected_max_size);
+    EXPECT_EQ(MinContentContribution(i), expected_min_size);
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_node.cc b/third_party/blink/renderer/core/layout/masonry/masonry_node.cc
index 0b3f69a3..46d102cd 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_node.cc
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_node.cc
@@ -9,10 +9,14 @@
 namespace blink {
 
 MasonryItemGroups MasonryNode::CollectItemGroups(
-    const GridLineResolver& line_resolver) const {
+    const GridLineResolver& line_resolver,
+    wtf_size_t* start_offset) const {
+  DCHECK(start_offset);
+
+  *start_offset = 0;
+  MasonryItemGroups item_groups;
   const auto grid_axis_direction = Style().MasonryTrackSizingDirection();
 
-  MasonryItemGroups item_groups;
   for (auto child = FirstChild(); child; child = child.NextSibling()) {
     if (child.IsOutOfFlowPositioned()) {
       continue;
@@ -22,6 +26,13 @@
         /*item_span=*/line_resolver.ResolveGridPositionsFromStyle(
             child.Style(), grid_axis_direction));
 
+    const auto& item_span = item_properties.Span();
+    if (!item_span.IsIndefinite()) {
+      DCHECK(item_span.IsUntranslatedDefinite());
+      *start_offset =
+          std::max<int>(*start_offset, -item_span.UntranslatedStartLine());
+    }
+
     const auto group_it = item_groups.find(item_properties);
     if (group_it == item_groups.end()) {
       item_groups.insert(item_properties,
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_node.h b/third_party/blink/renderer/core/layout/masonry/masonry_node.h
index 7be9658..cb0ac69 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_node.h
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_node.h
@@ -23,8 +23,10 @@
 
   // Collects the children of this node into item groups based on their
   // placement, span size, and baseline-sharing group.
-  MasonryItemGroups CollectItemGroups(
-      const GridLineResolver& line_resolver) const;
+  // `start_offset` calculates the offset of the first grid line in the implicit
+  // grid, which is used to translate definite grid spans to a 0-indexed format.
+  MasonryItemGroups CollectItemGroups(const GridLineResolver& line_resolver,
+                                      wtf_size_t* start_offset) const;
 };
 
 template <>
diff --git a/third_party/blink/renderer/core/layout/text_utils.cc b/third_party/blink/renderer/core/layout/text_utils.cc
index c6abbf4c..0ceedae4 100644
--- a/third_party/blink/renderer/core/layout/text_utils.cc
+++ b/third_party/blink/renderer/core/layout/text_utils.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/layout/text_utils.h"
 
 #include "third_party/blink/renderer/core/style/computed_style.h"
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
 #include "third_party/blink/renderer/platform/text/bidi_paragraph.h"
 #include "third_party/blink/renderer/platform/text/text_run.h"
 
@@ -16,9 +17,13 @@
   }
   // TODO(crbug.com/1229581): Re-implement this without TextRun.
   bool directional_override = style.RtlOrdering() == EOrder::kVisual;
-  return style.GetFont()->Width(
-      TextRun(text, BidiParagraph::BaseDirectionForStringOrLtr(text),
-              directional_override));
+  TextRun text_run(text, BidiParagraph::BaseDirectionForStringOrLtr(text),
+                   directional_override);
+  if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+    return PlainTextPainter::Shared().ComputeInlineSize(text_run,
+                                                        *style.GetFont());
+  }
+  return style.GetFont()->Width(text_run);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc
index c30f8b0e..8207f83 100644
--- a/third_party/blink/renderer/core/page/context_menu_controller.cc
+++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -93,6 +93,7 @@
 #include "third_party/blink/renderer/core/page/focus_controller.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
+#include "third_party/blink/renderer/core/svg/svg_a_element.h"
 #include "third_party/blink/renderer/platform/bindings/script_regexp.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_visitor.h"
@@ -777,6 +778,20 @@
     }
   }
 
+  if (RuntimeEnabledFeatures::SvgAnchorElementRelAttributesEnabled()) {
+    if (auto* anchor = DynamicTo<SVGAElement>(result.URLElement())) {
+      // TODO(dmangal): Add support for `download` attribute
+
+      // If the anchor wants to suppress the referrer, update the referrerPolicy
+      // accordingly.
+      if (anchor->HasRel(kRelationNoReferrer)) {
+        data.referrer_policy = network::mojom::ReferrerPolicy::kNever;
+      }
+
+      data.link_text = anchor->innerText().Utf8();
+    }
+  }
+
   data.selection_rect = ComputeSelectionRect(selected_frame);
   data.source_type = source_type;
 
diff --git a/third_party/blink/renderer/core/page/drag_image.cc b/third_party/blink/renderer/core/page/drag_image.cc
index 312d102..c272aa7 100644
--- a/third_party/blink/renderer/core/page/drag_image.cc
+++ b/third_party/blink/renderer/core/page/drag_image.cc
@@ -38,6 +38,7 @@
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
 #include "third_party/blink/renderer/platform/fonts/font_description.h"
 #include "third_party/blink/renderer/platform/fonts/font_metrics.h"
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
 #include "third_party/blink/renderer/platform/fonts/string_truncator.h"
 #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
 #include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
@@ -167,9 +168,15 @@
     draw_url_string = false;
     label = url_string;
   }
+  PlainTextPainter* text_painter =
+      RuntimeEnabledFeatures::PlainTextPainterEnabled()
+          ? &PlainTextPainter::Shared()
+          : nullptr;
 
   // First step is drawing the link drag image width.
-  gfx::Size label_size(label_font->Width(TextRun(label)),
+  gfx::Size label_size(text_painter ? text_painter->ComputeInlineSize(
+                                          TextRun(label), *label_font)
+                                    : label_font->Width(TextRun(label)),
                        label_font_data->GetFontMetrics().Ascent() +
                            label_font_data->GetFontMetrics().Descent());
 
@@ -183,7 +190,10 @@
                        label_size.height() + kDragLabelBorderY * 2);
 
   if (draw_url_string) {
-    url_string_size.set_width(url_font->Width(TextRun(url_string)));
+    url_string_size.set_width(
+        text_painter
+            ? text_painter->ComputeInlineSize(TextRun(url_string), *url_font)
+            : url_font->Width(TextRun(url_string)));
     url_string_size.set_height(url_font_data->GetFontMetrics().Ascent() +
                                url_font_data->GetFontMetrics().Descent());
     image_size.set_height(image_size.height() + url_string_size.height());
@@ -237,8 +247,13 @@
             (kLabelBorderYOffset + url_font_data->GetFontMetrics().Descent()));
     TextRun text_run(url_string);
     if (RuntimeEnabledFeatures::DragImageNoNodeIdEnabled()) {
-      url_font->DrawText(&resource_provider->Canvas(), text_run, text_pos,
-                         text_paint);
+      if (text_painter) {
+        text_painter->Draw(text_run, *url_font, resource_provider->Canvas(),
+                           text_pos, text_paint);
+      } else {
+        url_font->DrawText(&resource_provider->Canvas(), text_run, text_pos,
+                           text_paint);
+      }
     } else {
       url_font->DrawText(&resource_provider->Canvas(), text_run, text_pos,
                          device_scale_factor, text_paint);
@@ -255,13 +270,22 @@
       kDragLabelBorderX,
       kDragLabelBorderY + label_font->GetFontDescription().ComputedPixelSize());
   if (text_run.Direction() == TextDirection::kRtl) {
-    float text_width = label_font->Width(text_run);
+    float text_width =
+        text_painter ? text_painter->ComputeInlineSize(text_run, *label_font)
+                     : label_font->Width(text_run);
     int available_width = image_size.width() - kDragLabelBorderX * 2;
     text_pos.set_x(available_width - ceilf(text_width));
   }
-  label_font->DrawBidiText(&resource_provider->Canvas(),
-                           TextRunPaintInfo(text_run), gfx::PointF(text_pos),
-                           Font::kDoNotPaintIfFontNotReady, text_paint);
+  if (text_painter) {
+    text_painter->DrawWithBidiReorder(
+        text_run, 0, text_run.length(), *label_font,
+        Font::kDoNotPaintIfFontNotReady, resource_provider->Canvas(),
+        gfx::PointF(text_pos), text_paint);
+  } else {
+    label_font->DrawBidiText(&resource_provider->Canvas(),
+                             TextRunPaintInfo(text_run), gfx::PointF(text_pos),
+                             Font::kDoNotPaintIfFontNotReady, text_paint);
+  }
 
   scoped_refptr<StaticBitmapImage> image =
       resource_provider->Snapshot(FlushReason::kNon2DCanvas);
diff --git a/third_party/blink/renderer/core/page/page_popup_client.h b/third_party/blink/renderer/core/page/page_popup_client.h
index 5c67df9..6a35e82 100644
--- a/third_party/blink/renderer/core/page/page_popup_client.h
+++ b/third_party/blink/renderer/core/page/page_popup_client.h
@@ -84,7 +84,7 @@
   // ChromeClient::closePagePopup().
   virtual void SetValueAndClosePopup(int num_value,
                                      const String& string_value,
-                                     const bool is_keyboard_event) = 0;
+                                     bool is_keyboard_event) = 0;
 
   // This is called by the content HTML of a PagePopup.
   virtual void SetValue(const String&) = 0;
diff --git a/third_party/blink/renderer/core/page/page_popup_controller.cc b/third_party/blink/renderer/core/page/page_popup_controller.cc
index 79a6aac2..0e0f7bd 100644
--- a/third_party/blink/renderer/core/page/page_popup_controller.cc
+++ b/third_party/blink/renderer/core/page/page_popup_controller.cc
@@ -57,7 +57,7 @@
 
 void PagePopupController::setValueAndClosePopup(int num_value,
                                                 const String& string_value,
-                                                const bool is_keyboard_event) {
+                                                bool is_keyboard_event) {
   if (popup_client_) {
     popup_client_->SetValueAndClosePopup(num_value, string_value,
                                          is_keyboard_event);
diff --git a/third_party/blink/renderer/core/page/page_popup_controller.h b/third_party/blink/renderer/core/page/page_popup_controller.h
index ea1b387d..fc82fb2 100644
--- a/third_party/blink/renderer/core/page/page_popup_controller.h
+++ b/third_party/blink/renderer/core/page/page_popup_controller.h
@@ -63,7 +63,7 @@
 
   void setValueAndClosePopup(int num_value,
                              const WTF::String& string_value,
-                             const bool is_keyboard_event = false);
+                             bool is_keyboard_event);
   void setValue(const WTF::String&);
   void closePopup();
   WTF::String localizeNumberString(const WTF::String&);
diff --git a/third_party/blink/renderer/core/page/page_popup_controller.idl b/third_party/blink/renderer/core/page/page_popup_controller.idl
index 9bfaf60..564548d2 100644
--- a/third_party/blink/renderer/core/page/page_popup_controller.idl
+++ b/third_party/blink/renderer/core/page/page_popup_controller.idl
@@ -35,7 +35,7 @@
     LegacyNoInterfaceObject,
     RuntimeEnabled=PagePopup
 ] interface PagePopupController {
-    void setValueAndClosePopup(long numberValue, DOMString stringValue, optional boolean is_keyboard_event);
+    void setValueAndClosePopup(long numberValue, DOMString stringValue, boolean is_keyboard_event);
     void setValue(DOMString value);
     void closePopup();
     DOMString localizeNumberString(DOMString numberString);
diff --git a/third_party/blink/renderer/core/paint/embedded_object_painter.cc b/third_party/blink/renderer/core/paint/embedded_object_painter.cc
index ee0ba88..1ec6f40 100644
--- a/third_party/blink/renderer/core/paint/embedded_object_painter.cc
+++ b/third_party/blink/renderer/core/paint/embedded_object_painter.cc
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/core/paint/paint_info.h"
 #include "third_party/blink/renderer/platform/fonts/font.h"
 #include "third_party/blink/renderer/platform/fonts/font_selector.h"
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
 #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
 #include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h"
 #include "third_party/blink/renderer/platform/graphics/path.h"
@@ -69,8 +70,11 @@
     return;
 
   TextRun text_run(layout_embedded_object_.UnavailablePluginReplacementText());
-  gfx::SizeF text_geometry(font->Width(text_run),
-                           font_data->GetFontMetrics().Height());
+  gfx::SizeF text_geometry(
+      RuntimeEnabledFeatures::PlainTextPainterEnabled()
+          ? PlainTextPainter::Shared().ComputeInlineSize(text_run, *font)
+          : font->Width(text_run),
+      font_data->GetFontMetrics().Height());
 
   PhysicalRect background_rect(
       LayoutUnit(), LayoutUnit(),
diff --git a/third_party/blink/renderer/core/scheduler/dom_timer.cc b/third_party/blink/renderer/core/scheduler/dom_timer.cc
index d4161e61..4d23e14 100644
--- a/third_party/blink/renderer/core/scheduler/dom_timer.cc
+++ b/third_party/blink/renderer/core/scheduler/dom_timer.cc
@@ -340,7 +340,7 @@
   }
 
   async_task_context_.Cancel();
-  const bool is_interval = !RepeatInterval().is_zero();
+  const bool is_interval = RepeatInterval().has_value();
   probe::BreakableLocation(GetExecutionContext(),
                            is_interval ? "clearInterval" : "clearTimeout");
 
@@ -368,7 +368,7 @@
 
   DEVTOOLS_TIMELINE_TRACE_EVENT("TimerFire", inspector_timer_fire_event::Data,
                                 context, timeout_id_);
-  const bool is_interval = !RepeatInterval().is_zero();
+  const bool is_interval = RepeatInterval().has_value();
 
   probe::UserCallback probe(context, is_interval ? "setInterval" : "setTimeout",
                             g_null_atom, true);
@@ -387,6 +387,7 @@
   // Simple case for non-one-shot timers.
   if (IsActive()) {
     DCHECK(is_interval);
+    DCHECK(RepeatInterval());
 
     // Steps 12 and 13:
     IncrementNestingLevel();
@@ -394,8 +395,8 @@
     // Step 11:
     // Make adjustments when the nesting level becomes > |kMaxNestingLevel|.
     if (nesting_level_ == max_timer_nesting_level + 1 &&
-        RepeatInterval() < kMinimumInterval) {
-      AugmentRepeatInterval(kMinimumInterval - RepeatInterval());
+        (*RepeatInterval() < kMinimumInterval)) {
+      AugmentRepeatInterval(kMinimumInterval - *RepeatInterval());
     }
     if (nesting_level_ == max_timer_nesting_level + 1) {
       // Move to the TaskType that corresponds to nesting level >=
@@ -405,7 +406,7 @@
     }
 
     DCHECK(nesting_level_ <= max_timer_nesting_level ||
-           RepeatInterval() >= kMinimumInterval);
+           (is_interval && *RepeatInterval() >= kMinimumInterval));
 
     // No access to member variables after this point, it can delete the timer.
     action_->Execute(context);
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc
index b99eb43..eefe6a1 100644
--- a/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc
+++ b/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc
@@ -228,17 +228,12 @@
                      console_message.Utf8().c_str()));
   GetDocument().GetPage()->GetPageScheduler()->SetPageVisible(false);
 
+  // Immediate tasks are not throttled until reaching the nesting level
+  // threshold.
   platform_->RunForPeriod(base::Milliseconds(1));
-  EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(1, console_message));
-  platform_->RunForPeriod(base::Milliseconds(1));
-  EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(2, console_message));
-  platform_->RunForPeriod(base::Milliseconds(1));
-  EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(3, console_message));
-  platform_->RunForPeriod(base::Milliseconds(1));
-  EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(4, console_message));
-  platform_->RunForPeriod(base::Milliseconds(995));
   EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(6, console_message));
-  platform_->RunForPeriod(base::Milliseconds(1));
+  // But once that threshold is reached, throttling should kick in.
+  platform_->RunForPeriod(base::Seconds(1));
   EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(7, console_message));
 }
 
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.cc b/third_party/blink/renderer/core/svg/svg_a_element.cc
index 62e2cf39..73a23a1 100644
--- a/third_party/blink/renderer/core/svg/svg_a_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_a_element.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/core/events/mouse_event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/html/forms/html_form_element.h"
 #include "third_party/blink/renderer/core/html/html_anchor_element.h"
 #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h"
@@ -55,10 +56,12 @@
       SVGURIReference(this),
       svg_target_(
           MakeGarbageCollected<SVGAnimatedString>(this,
-                                                  svg_names::kTargetAttr)) {}
+                                                  svg_names::kTargetAttr)),
+      rel_list_(MakeGarbageCollected<RelList>(this, svg_names::kRelAttr)) {}
 
 void SVGAElement::Trace(Visitor* visitor) const {
   visitor->Trace(svg_target_);
+  visitor->Trace(rel_list_);
   SVGGraphicsElement::Trace(visitor);
   SVGURIReference::Trace(visitor);
 }
@@ -123,8 +126,10 @@
         }
       }
 
-      if (!GetDocument().GetFrame())
+      LocalFrame* frame = GetDocument().GetFrame();
+      if (!frame) {
         return;
+      }
 
       FrameLoadRequest frame_request(
           GetDocument().domWindow(),
@@ -146,6 +151,29 @@
       frame_request.SetClientNavigationReason(
           ClientNavigationReason::kAnchorClick);
       frame_request.SetSourceElement(this);
+
+      // TODO(dmangal): Create a common interface with HTMAnchorElement and move
+      // navigation related code to that interface.
+      if (RuntimeEnabledFeatures::SvgAnchorElementRelAttributesEnabled()) {
+        if (HasRel(kRelationNoReferrer)) {
+          frame_request.SetNoReferrer();
+          frame_request.SetNoOpener();
+        }
+        if (HasRel(kRelationNoOpener) ||
+            (EqualIgnoringASCIICase(target, "_blank") &&
+             !HasRel(kRelationOpener) &&
+             frame->GetSettings()
+                 ->GetTargetBlankImpliesNoOpenerEnabledWillBeRemoved())) {
+          frame_request.SetNoOpener();
+        }
+        if (RuntimeEnabledFeatures::RelOpenerBcgDependencyHintEnabled(
+                GetExecutionContext()) &&
+            HasRel(kRelationOpener) &&
+            !frame_request.GetWindowFeatures().noopener) {
+          frame_request.SetExplicitOpener();
+        }
+      }
+
       frame_request.SetTriggeringEventInfo(
           event.isTrusted()
               ? mojom::blink::TriggeringEventInfo::kFromTrustedEvent
@@ -153,14 +181,14 @@
       frame_request.GetResourceRequest().SetHasUserGesture(
           LocalFrame::HasTransientUserActivation(GetDocument().GetFrame()));
 
-      Frame* frame = GetDocument()
-                         .GetFrame()
-                         ->Tree()
-                         .FindOrCreateFrameForNavigation(frame_request, target)
-                         .frame;
-      if (!frame)
+      Frame* target_frame =
+          frame->Tree()
+              .FindOrCreateFrameForNavigation(frame_request, target)
+              .frame;
+      if (!target_frame) {
         return;
-      frame->Navigate(frame_request, WebFrameLoadType::kStandard);
+      }
+      target_frame->Navigate(frame_request, WebFrameLoadType::kStandard);
       return;
     }
   }
@@ -255,4 +283,40 @@
   SVGGraphicsElement::SynchronizeAllSVGAttributes();
 }
 
+void SVGAElement::ParseAttribute(const AttributeModificationParams& params) {
+  if (params.name == svg_names::kRelAttr &&
+      RuntimeEnabledFeatures::SvgAnchorElementRelAttributesEnabled()) {
+    SetRel(params.new_value);
+    rel_list_->DidUpdateAttributeValue(params.old_value, params.new_value);
+  } else {
+    SVGGraphicsElement::ParseAttribute(params);
+  }
+}
+
+bool SVGAElement::HasRel(uint32_t relation) const {
+  CHECK(RuntimeEnabledFeatures::SvgAnchorElementRelAttributesEnabled());
+
+  return link_relations_ & relation;
+}
+
+void SVGAElement::SetRel(const AtomicString& value) {
+  CHECK(RuntimeEnabledFeatures::SvgAnchorElementRelAttributesEnabled());
+
+  link_relations_ = 0;
+  SpaceSplitString new_link_relations(value.LowerASCII());
+  if (new_link_relations.Contains(AtomicString("noreferrer"))) {
+    link_relations_ |= kRelationNoReferrer;
+  }
+  if (new_link_relations.Contains(AtomicString("noopener"))) {
+    link_relations_ |= kRelationNoOpener;
+  }
+  if (new_link_relations.Contains(AtomicString("opener"))) {
+    link_relations_ |= kRelationOpener;
+  }
+  // Adding or removing a value here whose processing model is web-visible
+  // (e.g. if the value is listed as a "supported token" for `<a>`'s `rel`
+  // attribute in HTML) also requires you to update the list of tokens in
+  // RelList::SupportedTokensAnchorAndAreaAndForm().
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.h b/third_party/blink/renderer/core/svg/svg_a_element.h
index 59cb21f..1733457 100644
--- a/third_party/blink/renderer/core/svg/svg_a_element.h
+++ b/third_party/blink/renderer/core/svg/svg_a_element.h
@@ -23,6 +23,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_A_ELEMENT_H_
 
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/html/rel_list.h"
 #include "third_party/blink/renderer/core/svg/svg_graphics_element.h"
 #include "third_party/blink/renderer/core/svg/svg_uri_reference.h"
 
@@ -41,6 +42,9 @@
 
   void Trace(Visitor*) const override;
 
+  bool HasRel(uint32_t relation) const;
+  DOMTokenList& relList() const { return *rel_list_; }
+
  private:
   String title() const override;
 
@@ -68,7 +72,13 @@
       const QualifiedName& attribute_name) const override;
   void SynchronizeAllSVGAttributes() const override;
 
+  void ParseAttribute(const AttributeModificationParams&) override;
+
+  void SetRel(const AtomicString&);
+
   Member<SVGAnimatedString> svg_target_;
+  Member<RelList> rel_list_;
+  uint32_t link_relations_ = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.idl b/third_party/blink/renderer/core/svg/svg_a_element.idl
index f8041a9..ef5ce7d 100644
--- a/third_party/blink/renderer/core/svg/svg_a_element.idl
+++ b/third_party/blink/renderer/core/svg/svg_a_element.idl
@@ -28,6 +28,9 @@
 [Exposed=Window]
 interface SVGAElement : SVGGraphicsElement {
     [ImplementedAs=svgTarget, Measure] readonly attribute SVGAnimatedString target;
+
+    [RuntimeEnabled=SvgAnchorElementRelAttributes, Reflect] attribute DOMString rel;
+    [RuntimeEnabled=SvgAnchorElementRelAttributes, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
 };
 
 SVGAElement includes SVGURIReference;
diff --git a/third_party/blink/renderer/core/svg/svg_attribute_names.json5 b/third_party/blink/renderer/core/svg/svg_attribute_names.json5
index 88a7646..31ae9e5 100644
--- a/third_party/blink/renderer/core/svg/svg_attribute_names.json5
+++ b/third_party/blink/renderer/core/svg/svg_attribute_names.json5
@@ -147,6 +147,7 @@
     "radius",
     "refX",
     "refY",
+    "rel",
     "repeatCount",
     "repeatDur",
     "requiredExtensions",
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
index 6a950aa2..e58a400 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
+++ b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
@@ -10,6 +10,7 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/not_fatal_until.h"
+#include "cc/base/features.h"
 #include "components/viz/common/view_transition_element_resource_id.h"
 #include "third_party/blink/public/resources/grit/blink_resources.h"
 #include "third_party/blink/renderer/core/animation/element_animations.h"
@@ -403,7 +404,12 @@
   }
 
   if (!transform.HasPerspective()) {
-    transform.Round2dTranslationComponents();
+    if (base::FeatureList::IsEnabled(
+            ::features::kViewTransitionFloorTransform)) {
+      transform.Floor2dTranslationComponents();
+    } else {
+      transform.Round2dTranslationComponents();
+    }
   }
 
   return transform;
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_supplement.cc b/third_party/blink/renderer/core/view_transition/view_transition_supplement.cc
index eb23af9c..1071e789 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition_supplement.cc
+++ b/third_party/blink/renderer/core/view_transition/view_transition_supplement.cc
@@ -23,47 +23,6 @@
 #include "third_party/blink/renderer/platform/scheduler/public/task_attribution_tracker.h"
 
 namespace blink {
-namespace {
-
-bool HasActiveTransitionInAncestorFrame(LocalFrame* frame) {
-  auto* parent = frame ? frame->Parent() : nullptr;
-
-  while (parent && parent->IsLocalFrame()) {
-    if (To<LocalFrame>(parent)->GetDocument() &&
-        ViewTransitionUtils::GetTransition(
-            *To<LocalFrame>(parent)->GetDocument())) {
-      return true;
-    }
-
-    parent = parent->Parent();
-  }
-
-  return false;
-}
-
-// Skips transitions in all local frames underneath |curr_frame|'s local root
-// except |curr_frame| itself.
-void SkipTransitionInAllLocalFrames(LocalFrame* curr_frame) {
-  auto* root_view = curr_frame ? curr_frame->LocalFrameRoot().View() : nullptr;
-  if (!root_view)
-    return;
-
-  root_view->ForAllChildLocalFrameViews([curr_frame](LocalFrameView& child) {
-    if (child.GetFrame() == *curr_frame)
-      return;
-
-    auto* document = child.GetFrame().GetDocument();
-    auto* transition =
-        document ? ViewTransitionUtils::GetTransition(*document) : nullptr;
-    if (!transition)
-      return;
-
-    transition->SkipTransition();
-    DCHECK(!ViewTransitionUtils::GetTransition(*document));
-  });
-}
-
-}  // namespace
 
 // static
 const char ViewTransitionSupplement::kSupplementName[] = "ViewTransition";
@@ -174,24 +133,7 @@
     return skipped_transition->GetScriptDelegate();
   }
 
-  // If there is a transition in a parent frame, give that precedence over a
-  // transition in a child frame.
-  if (!RuntimeEnabledFeatures::ConcurrentViewTransitionsSPAEnabled() &&
-      HasActiveTransitionInAncestorFrame(document.GetFrame())) {
-    auto skipped_transition = transition_;
-    skipped_transition->SkipTransition();
-
-    DCHECK(!transition_);
-    return skipped_transition->GetScriptDelegate();
-  }
-
-  // Skip transitions in all frames associated with this widget. We can only
-  // have one transition per widget/CC.
-  if (!RuntimeEnabledFeatures::ConcurrentViewTransitionsSPAEnabled()) {
-    SkipTransitionInAllLocalFrames(document.GetFrame());
-  }
   DCHECK(transition_);
-
   return transition_->GetScriptDelegate();
 }
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc
index f6e533f..959f4db 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc
@@ -390,6 +390,10 @@
   // necessary to again recompute this part of the tree.
   parent_ = parent;
   UpdateCachedAttributeValuesIfNeeded(false);
+
+#if DCHECK_IS_ON()
+  is_initialized_ = true;
+#endif
 }
 
 void AXInlineTextBox::Detach() {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 94d7e47e..c4b6b63 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -763,6 +763,10 @@
   // Set the parent again, this time via SetParent(), so that all related checks
   // and calls occur now that we have the role and updated cached values.
   SetParent(parent_);
+
+#if DCHECK_IS_ON()
+  is_initialized_ = true;
+#endif
 }
 
 void AXObject::Detach() {
@@ -8406,6 +8410,14 @@
 }
 
 String AXObject::ToString(bool verbose) const {
+#if DCHECK_IS_ON()
+  CHECK(is_initialized_) << "Init() must be called before ToString().";
+#endif
+
+  CHECK(!(parent_ == nullptr && role_ == ax::mojom::blink::Role::kUnknown &&
+          id_ == 0))
+      << "Calling ToString() on an AxObject before Init() is not allowed.";
+
   // Build a friendly name for debugging the object.
   // If verbose, build a longer name name in the form of:
   // CheckBox axid#28 <input.someClass#cbox1> name="checkbox"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index 6d326471..9e5f19ec 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -255,6 +255,7 @@
   bool is_initializing_ = false;
   bool is_computing_role_ = false;
   bool is_updating_cached_values_ = false;
+  bool is_initialized_ = false;
 #endif
 #if !defined(NDEBUG)
   // Keep track of what the object used to be, to make it easier to debug
@@ -1475,6 +1476,7 @@
   void PreSerializationConsistencyCheck() const;
 
   // Returns a string representation of this object.
+  // Must only be used after `init()`has been called.
   virtual String ToString(bool verbose = true) const;
 
   void PopulateAXRelativeBounds(ui::AXRelativeBounds& bounds,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 4e32fce..2a68bf6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -2316,6 +2316,10 @@
             "https://w3c.github.io/aria/#aria-hidden.\n"
             "Element with focus: %s\nAncestor with aria-hidden: ",
             focused_element.TagQName().ToString().Ascii().c_str()));
+#if AX_FAIL_FAST_BUILD()
+    LOG(ERROR) << "Parent chain for focused node's AXObject:\n"
+               << ParentChainToStringHelper(&obj);
+#endif
   }
 
   Node* bad_aria_hidden_ancestor_node = bad_aria_hidden_ancestor->GetNode();
@@ -2338,6 +2342,7 @@
   if (bad_aria_hidden_ancestor) {
     CHECK(!bad_aria_hidden_ancestor->IsAriaHiddenRoot());
     CHECK(!bad_aria_hidden_ancestor->IsAriaHidden());
+    MarkAXSubtreeDirtyWithCleanLayout(bad_aria_hidden_ancestor);
   }
   if (AXObject* new_focused_obj = Get(&focused_element)) {
     CHECK(!new_focused_obj->IsAriaHidden());
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl
index 64f1a58c..0d838fd 100644
--- a/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl
+++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl
@@ -67,6 +67,8 @@
   long maxTrustedBiddingSignalsURLLength;
   [RuntimeEnabled=FledgeTrustedSignalsKVv2Support]
   USVString trustedBiddingSignalsCoordinator;
+  [RuntimeEnabled=FledgeClickiness]
+  sequence<USVString> viewAndClickCountsProviders;
   any userBiddingSignals;
   sequence<AuctionAd> ads;
   sequence<AuctionAd> adComponents;
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
index c6704b88..7ce16d8 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -942,6 +942,31 @@
   return true;
 }
 
+bool CopyViewAndClickCountsProvidersFromIdlToMojo(
+    ExceptionState& exception_state,
+    const AuctionAdInterestGroup& input,
+    mojom::blink::InterestGroup& output) {
+  if (!input.hasViewAndClickCountsProviders()) {
+    return true;
+  }
+
+  Vector<scoped_refptr<const SecurityOrigin>> view_and_click_counts_providers;
+  for (const String& provider : input.viewAndClickCountsProviders()) {
+    scoped_refptr<const SecurityOrigin> parsed_provider = ParseOrigin(provider);
+    if (!parsed_provider) {
+      exception_state.ThrowTypeError(String::Format(
+          "viewAndClickCountsProviders '%s' for AuctionAdInterestGroup "
+          "with name '%s' must be a valid https origin.",
+          provider.Utf8().c_str(), input.name().Utf8().c_str()));
+      return false;
+    }
+  }
+
+  output.view_and_click_counts_providers =
+      std::move(view_and_click_counts_providers);
+  return true;
+}
+
 bool CopyUserBiddingSignalsFromIdlToMojo(const ScriptState& script_state,
                                          ExceptionState& exception_state,
                                          const AuctionAdInterestGroup& input,
@@ -3464,6 +3489,8 @@
           exception_state, *group, *mojo_group) ||
       !CopyTrustedBiddingSignalsCoordinatorFromIdlToMojo(exception_state,
                                                          *group, *mojo_group) ||
+      !CopyViewAndClickCountsProvidersFromIdlToMojo(exception_state, *group,
+                                                    *mojo_group) ||
       !CopyUserBiddingSignalsFromIdlToMojo(*script_state, exception_state,
                                            *group, *mojo_group) ||
       !CopyAdsFromIdlToMojo(*context, *script_state, exception_state, *group,
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc
index 54f7742..aab29bd 100644
--- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc
+++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc
@@ -123,6 +123,12 @@
   if (group.trusted_bidding_signals_coordinator) {
     size += group.trusted_bidding_signals_coordinator->ToString().length();
   }
+  if (group.view_and_click_counts_providers) {
+    for (const scoped_refptr<const SecurityOrigin>& provider :
+         *group.view_and_click_counts_providers) {
+      size += provider->ToString().length();
+    }
+  }
   size += group.user_bidding_signals.length();
 
   if (group.ads) {
@@ -317,6 +323,18 @@
     }
   }
 
+  if (group.view_and_click_counts_providers) {
+    for (const scoped_refptr<const SecurityOrigin>& provider :
+         *group.view_and_click_counts_providers) {
+      if (provider->Protocol() != url::kHttpsScheme) {
+        error_field_name = "viewAndClickCountsProviders";
+        error_field_value = provider->ToString();
+        error = "viewAndClickCountsProviders origin must be HTTPS.";
+        return false;
+      }
+    }
+  }
+
   if (group.ads) {
     std::optional<WTF::wtf_size_t>
         selectable_buyer_and_seller_reporting_ids_hard_limit;
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
index 477dfddb..72a4fe4e 100644
--- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
+++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
@@ -179,6 +179,9 @@
     blink_interest_group->max_trusted_bidding_signals_url_length = 8000;
     blink_interest_group->trusted_bidding_signals_coordinator =
         kCoordinatorOrigin;
+    blink_interest_group->view_and_click_counts_providers.emplace();
+    blink_interest_group->view_and_click_counts_providers->emplace_back(
+        kOrigin);
     blink_interest_group->user_bidding_signals =
         String::FromUTF8("\"This field isn't actually validated\"");
 
@@ -1549,4 +1552,32 @@
           "trustedBiddingSignalsCoordinator origin must be HTTPS."));
 }
 
+TEST_F(ValidateBlinkInterestGroupTest, InvalidViewAndClickCountsProviders) {
+  mojom::blink::InterestGroupPtr blink_interest_group =
+      CreateMinimalInterestGroup();
+  blink_interest_group->view_and_click_counts_providers.emplace();
+  blink_interest_group->view_and_click_counts_providers->emplace_back(
+      SecurityOrigin::CreateFromString(
+          String::FromUTF8("http://origin.test/")));
+  ExpectInterestGroupIsNotValid(
+      blink_interest_group,
+      /*expected_error_field_name=*/
+      String::FromUTF8("viewAndClickCountsProviders"),
+      /*expected_error_field_value=*/String::FromUTF8("http://origin.test"),
+      /*expected_error=*/
+      String::FromUTF8("viewAndClickCountsProviders origin must be HTTPS."));
+
+  blink_interest_group->view_and_click_counts_providers.emplace();
+  blink_interest_group->view_and_click_counts_providers->emplace_back(
+      SecurityOrigin::CreateFromString(String::FromUTF8("data:,foo")));
+  // Data URLs have opaque origins, which are mapped to the string "null".
+  ExpectInterestGroupIsNotValid(
+      blink_interest_group,
+      /*expected_error_field_name=*/
+      String::FromUTF8("viewAndClickCountsProviders"),
+      /*expected_error_field_value=*/String::FromUTF8("null"),
+      /*expected_error=*/
+      String::FromUTF8("viewAndClickCountsProviders origin must be HTTPS."));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/DEPS b/third_party/blink/renderer/modules/ai/DEPS
new file mode 100644
index 0000000..a49f3bec
--- /dev/null
+++ b/third_party/blink/renderer/modules/ai/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+    "+services/on_device_model/public/mojom/on_device_model.mojom-blink.h",
+]
diff --git a/third_party/blink/renderer/modules/ai/ai_availability.cc b/third_party/blink/renderer/modules/ai/ai_availability.cc
index 09922f2f..5ea886c 100644
--- a/third_party/blink/renderer/modules/ai/ai_availability.cc
+++ b/third_party/blink/renderer/modules/ai/ai_availability.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "third_party/blink/public/mojom/ai/ai_manager.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/ai/ai_manager.mojom-blink.h"
+#include "third_party/blink/public/mojom/on_device_translation/translation_manager.mojom-blink.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/modules/ai/ai_metrics.h"
 #include "third_party/blink/renderer/modules/ai/exception_helpers.h"
@@ -48,6 +49,41 @@
   return availability;
 }
 
+AIAvailability HandleTranslatorAvailabilityCheckResult(
+    ExecutionContext* execution_context,
+    mojom::blink::CanCreateTranslatorResult result) {
+  switch (result) {
+    case mojom::blink::CanCreateTranslatorResult::kReadily:
+      return HandleModelAvailabilityCheckResult(
+          execution_context, AIMetrics::AISessionType::kTranslator,
+          mojom::blink::ModelAvailabilityCheckResult::kAvailable);
+    case mojom::blink::CanCreateTranslatorResult::kAfterDownloadLibraryNotReady:
+    case mojom::blink::CanCreateTranslatorResult::
+        kAfterDownloadLanguagePackNotReady:
+    case mojom::blink::CanCreateTranslatorResult::
+        kAfterDownloadLibraryAndLanguagePackNotReady:
+      return HandleModelAvailabilityCheckResult(
+          execution_context, AIMetrics::AISessionType::kTranslator,
+          mojom::blink::ModelAvailabilityCheckResult::kDownloadable);
+    case mojom::blink::CanCreateTranslatorResult::kNoNotSupportedLanguage:
+      return HandleModelAvailabilityCheckResult(
+          execution_context, AIMetrics::AISessionType::kTranslator,
+          mojom::blink::ModelAvailabilityCheckResult::
+              kUnavailableUnsupportedLanguage);
+    case mojom::blink::CanCreateTranslatorResult::kNoAcceptLanguagesCheckFailed:
+    case mojom::blink::CanCreateTranslatorResult::
+        kNoExceedsLanguagePackCountLimitation:
+    case mojom::blink::CanCreateTranslatorResult::kNoServiceCrashed:
+    case mojom::blink::CanCreateTranslatorResult::kNoDisallowedByPolicy:
+    case mojom::blink::CanCreateTranslatorResult::
+        kNoExceedsServiceCountLimitation:
+      return HandleModelAvailabilityCheckResult(
+          execution_context, AIMetrics::AISessionType::kTranslator,
+          mojom::blink::ModelAvailabilityCheckResult::
+              kUnavailableTranslationNotEligible);
+  }
+}
+
 V8AIAvailability AIAvailabilityToV8(AIAvailability availability) {
   switch (availability) {
     case AIAvailability::kUnavailable:
diff --git a/third_party/blink/renderer/modules/ai/ai_availability.h b/third_party/blink/renderer/modules/ai/ai_availability.h
index bbe61a4..9e6a5d8dad 100644
--- a/third_party/blink/renderer/modules/ai/ai_availability.h
+++ b/third_party/blink/renderer/modules/ai/ai_availability.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_AI_AI_AVAILABILITY_H_
 
 #include "third_party/blink/public/mojom/ai/ai_manager.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/on_device_translation/translation_manager.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ai_availability.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/ai/ai_metrics.h"
@@ -32,6 +33,10 @@
     AIMetrics::AISessionType session_type,
     mojom::blink::ModelAvailabilityCheckResult result);
 
+AIAvailability HandleTranslatorAvailabilityCheckResult(
+    ExecutionContext* execution_context,
+    mojom::blink::CanCreateTranslatorResult result);
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_AI_AI_AVAILABILITY_H_
diff --git a/third_party/blink/renderer/modules/ai/ai_language_model.cc b/third_party/blink/renderer/modules/ai/ai_language_model.cc
index 6a0b60f..88a0ffb 100644
--- a/third_party/blink/renderer/modules/ai/ai_language_model.cc
+++ b/third_party/blink/renderer/modules/ai/ai_language_model.cc
@@ -7,6 +7,7 @@
 #include "base/check.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/types/pass_key.h"
+#include "services/on_device_model/public/mojom/on_device_model.mojom-blink.h"
 #include "third_party/blink/public/mojom/ai/ai_language_model.mojom-blink.h"
 #include "third_party/blink/public/mojom/ai/model_streaming_responder.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -206,6 +207,9 @@
     return promise;
   }
   const WTF::String& input_string = input->GetAsString();
+  auto odm_input = on_device_model::mojom::blink::Input::New();
+  odm_input->pieces.push_back(
+      on_device_model::mojom::blink::InputPiece::NewText(input_string));
 
   base::UmaHistogramEnumeration(AIMetrics::GetAIAPIUsageMetricName(
                                     AIMetrics::AISessionType::kLanguageModel),
@@ -233,7 +237,8 @@
                     WrapWeakPersistent(this)),
       WTF::BindRepeating(&AILanguageModel::OnContextOverflow,
                          WrapWeakPersistent(this)));
-  language_model_remote_->Prompt(input_string, std::move(pending_remote));
+  language_model_remote_->Prompt(std::move(odm_input),
+                                 std::move(pending_remote));
   return promise;
 }
 
@@ -253,6 +258,9 @@
     return nullptr;
   }
   const WTF::String& input_string = input->GetAsString();
+  auto odm_input = on_device_model::mojom::blink::Input::New();
+  odm_input->pieces.push_back(
+      on_device_model::mojom::blink::InputPiece::NewText(input_string));
 
   base::UmaHistogramEnumeration(AIMetrics::GetAIAPIUsageMetricName(
                                     AIMetrics::AISessionType::kLanguageModel),
@@ -280,7 +288,9 @@
                         WrapWeakPersistent(this)),
           WTF::BindRepeating(&AILanguageModel::OnContextOverflow,
                              WrapWeakPersistent(this)));
-  language_model_remote_->Prompt(input_string, std::move(pending_remote));
+
+  language_model_remote_->Prompt(std::move(odm_input),
+                                 std::move(pending_remote));
   return readable_stream;
 }
 
diff --git a/third_party/blink/renderer/modules/ai/exception_helpers.cc b/third_party/blink/renderer/modules/ai/exception_helpers.cc
index a4a68cd..fe3ec5f 100644
--- a/third_party/blink/renderer/modules/ai/exception_helpers.cc
+++ b/third_party/blink/renderer/modules/ai/exception_helpers.cc
@@ -226,6 +226,9 @@
         kUnavailableInsufficientDiskSpace:
       return "The device does not have enough space for downloading the "
              "on-device model";
+    case mojom::blink::ModelAvailabilityCheckResult::
+        kUnavailableTranslationNotEligible:
+      return "The on-device translation is not available.";
     case mojom::blink::ModelAvailabilityCheckResult::kAvailable:
     case mojom::blink::ModelAvailabilityCheckResult::kDownloadable:
     case mojom::blink::ModelAvailabilityCheckResult::kDownloading:
@@ -235,6 +238,6 @@
   }
   NOTREACHED();
 }
-// LINT.ThenChange(//third_party/blink/public/mojom/ai_manager.mojom:ModelAvailabilityCheckResult)
+// LINT.ThenChange(//third_party/blink/public/mojom/ai/ai_manager.mojom:ModelAvailabilityCheckResult)
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.cc b/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.cc
index 96c7ea3..ef12516 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.cc
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.cc
@@ -150,6 +150,39 @@
     : ExecutionContextClient(context),
       task_runner_(context->GetTaskRunner(TaskType::kInternalDefault)) {}
 
+ScriptPromise<V8AIAvailability> AITranslatorFactory::availability(
+    ScriptState* script_state,
+    AITranslatorCreateCoreOptions* options,
+    ExceptionState& exception_state) {
+  if (!script_state->ContextIsValid()) {
+    ThrowInvalidContextException(exception_state);
+    return ScriptPromise<V8AIAvailability>();
+  }
+
+  ScriptPromiseResolver<V8AIAvailability>* resolver =
+      MakeGarbageCollected<ScriptPromiseResolver<V8AIAvailability>>(
+          script_state);
+  ScriptPromise<V8AIAvailability> promise = resolver->Promise();
+  ExecutionContext* execution_context = GetExecutionContext();
+
+  GetTranslationManagerRemote()->TranslationAvailable(
+      options->sourceLanguage(), options->targetLanguage(),
+      WTF::BindOnce(
+          [](ExecutionContext* execution_context,
+             ScriptPromiseResolver<V8AIAvailability>* resolver,
+             mojom::blink::CanCreateTranslatorResult result) {
+            CHECK(resolver);
+
+            AIAvailability availability =
+                HandleTranslatorAvailabilityCheckResult(execution_context,
+                                                        result);
+            resolver->Resolve(AIAvailabilityToV8(availability));
+          },
+          WrapPersistent(execution_context), WrapPersistent(resolver)));
+
+  return promise;
+}
+
 ScriptPromise<AITranslator> AITranslatorFactory::create(
     ScriptState* script_state,
     AITranslatorCreateOptions* options,
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.h b/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.h
index 0dc723c3..d5127fc 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.h
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_ai_translator_create_options.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
+#include "third_party/blink/renderer/modules/ai/ai_availability.h"
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_translator.h"
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_capabilities.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
@@ -26,6 +27,11 @@
  public:
   explicit AITranslatorFactory(ExecutionContext* execution_context);
 
+  ScriptPromise<V8AIAvailability> availability(
+      ScriptState* script_state,
+      AITranslatorCreateCoreOptions* options,
+      ExceptionState& exception_state);
+
   ScriptPromise<AITranslator> create(ScriptState* script_state,
                                      AITranslatorCreateOptions* options,
                                      ExceptionState& exception_state);
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.idl b/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.idl
index 7a21ea1..857f0dad 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.idl
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_translator_factory.idl
@@ -9,12 +9,18 @@
     CallWith=ScriptState,
     RaisesException
   ]
+  Promise<AIAvailability> availability(AITranslatorCreateCoreOptions options);
+  [
+    Measure,
+    CallWith=ScriptState,
+    RaisesException
+  ]
   Promise<AITranslator> create(AITranslatorCreateOptions options);
-  // TODO(crbug.com/390459310): Replace with availability.
   [
     CallWith=ScriptState,
     RaisesException
   ]
+  // TODO(crbug.com/392185835): Remove capabilities method.
   Promise<AITranslatorCapabilities> capabilities();
 };
 
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
index d753ef37..10f19f0 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -487,15 +487,8 @@
   ~FakeCanvasResourceProvider() override = default;
   bool IsAccelerated() const override { return is_accelerated_; }
   scoped_refptr<CanvasResource> ProduceCanvasResource(FlushReason) override {
-    const SkImageInfo& info = GetSkImageInfo();
     return scoped_refptr<CanvasResource>(CanvasResourceSharedImage::Create(
-        gfx::Size(info.width(), info.height()),
-        viz::SkColorTypeToSinglePlaneSharedImageFormat(
-            info.colorInfo().colorType()),
-        info.colorInfo().alphaType(),
-        // NOTE: The SkImageInfo here is hardcoded to have a null colorspace,
-        // which corresponds to SRGB.
-        gfx::ColorSpace::CreateSRGB(),
+        Size(), GetSharedImageFormat(), GetAlphaType(), GetColorSpace(),
         SharedGpuContext::ContextProviderWrapper(), CreateWeakPtr(),
         IsAccelerated(),
         gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
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 09859027..66b1d0b2 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
@@ -501,7 +501,7 @@
       return;
     }
     case RequestTokenStatus::kError: {
-      if (!RuntimeEnabledFeatures::FedCmErrorEnabled() || !error) {
+      if (!error) {
         resolver->Reject(MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kNetworkError, "Error retrieving a token."));
         return;
@@ -2160,8 +2160,7 @@
       UseCounter::Count(resolver->GetExecutionContext(),
                         WebFeature::kFedCmLoginHint);
     }
-    if (RuntimeEnabledFeatures::FedCmDomainHintEnabled() &&
-        provider->hasDomainHint()) {
+    if (provider->hasDomainHint()) {
       UseCounter::Count(resolver->GetExecutionContext(),
                         WebFeature::kFedCmDomainHint);
     }
@@ -2256,38 +2255,35 @@
   }
 
   mojom::blink::RpMode rp_mode = mojom::blink::RpMode::kPassive;
-  if (blink::RuntimeEnabledFeatures::FedCmButtonModeEnabled(
-          resolver->GetExecutionContext())) {
-    auto v8_rp_mode = identity_options.mode();
-    // TODO(crbug.com/372198646): remove the debugging aid enums after shipping
-    // active mode.
-    if (v8_rp_mode ==
-            blink::V8IdentityCredentialRequestOptionsMode::Enum::kWidget ||
-        v8_rp_mode ==
-            blink::V8IdentityCredentialRequestOptionsMode::Enum::kButton) {
-      resolver->GetExecutionContext()->AddConsoleMessage(
-          MakeGarbageCollected<ConsoleMessage>(
-              mojom::blink::ConsoleMessageSource::kJavaScript,
-              mojom::blink::ConsoleMessageLevel::kWarning,
-              "The mode button/widget are renamed to active/passive "
-              "respectively and will be deprecated soon."));
-    }
+  auto v8_rp_mode = identity_options.mode();
+  // TODO(crbug.com/372198646): remove the debugging aid enums after shipping
+  // active mode.
+  if (v8_rp_mode ==
+          blink::V8IdentityCredentialRequestOptionsMode::Enum::kWidget ||
+      v8_rp_mode ==
+          blink::V8IdentityCredentialRequestOptionsMode::Enum::kButton) {
+    resolver->GetExecutionContext()->AddConsoleMessage(
+        MakeGarbageCollected<ConsoleMessage>(
+            mojom::blink::ConsoleMessageSource::kJavaScript,
+            mojom::blink::ConsoleMessageLevel::kWarning,
+            "The mode button/widget are renamed to active/passive "
+            "respectively and will be deprecated soon."));
+  }
 
-    rp_mode = mojo::ConvertTo<mojom::blink::RpMode>(v8_rp_mode);
-    if (rp_mode == mojom::blink::RpMode::kActive) {
-      if (identity_provider_ptrs.size() > 1u) {
-        resolver->Reject(MakeGarbageCollected<DOMException>(
-            DOMExceptionCode::kInvalidStateError,
-            "Active mode is not currently supported with multiple identity "
-            "providers."));
-        return;
-      }
-      if (mediation_requirement == CredentialMediationRequirement::kSilent) {
-        resolver->Reject(MakeGarbageCollected<DOMException>(
-            DOMExceptionCode::kNotSupportedError,
-            "mediation:silent is not supported in active mode"));
-        return;
-      }
+  rp_mode = mojo::ConvertTo<mojom::blink::RpMode>(v8_rp_mode);
+  if (rp_mode == mojom::blink::RpMode::kActive) {
+    if (identity_provider_ptrs.size() > 1u) {
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "Active mode is not currently supported with multiple identity "
+          "providers."));
+      return;
+    }
+    if (mediation_requirement == CredentialMediationRequirement::kSilent) {
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "mediation:silent is not supported in active mode"));
+      return;
     }
   }
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container_test.cc b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container_test.cc
index 49623ad..ac99f7c 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container_test.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container_test.cc
@@ -444,12 +444,10 @@
 
 class AuthenticationCredentialsContainerActiveModeMultiIdpTest
     : public testing::Test,
-      private ScopedFedCmMultipleIdentityProvidersForTest,
-      ScopedFedCmButtonModeForTest {
+      private ScopedFedCmMultipleIdentityProvidersForTest {
  protected:
   AuthenticationCredentialsContainerActiveModeMultiIdpTest()
-      : ScopedFedCmMultipleIdentityProvidersForTest(true),
-        ScopedFedCmButtonModeForTest(true) {}
+      : ScopedFedCmMultipleIdentityProvidersForTest(true) {}
 };
 
 TEST_F(AuthenticationCredentialsContainerActiveModeMultiIdpTest,
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc
index f58d982..af552c5 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc
@@ -983,11 +983,7 @@
 
   mojo_options->nonce = options.getNonceOr("");
   mojo_options->login_hint = options.getLoginHintOr("");
-  mojo_options->domain_hint =
-      blink::RuntimeEnabledFeatures::FedCmDomainHintEnabled()
-          ? options.getDomainHintOr("")
-          : "";
-
+  mojo_options->domain_hint = options.getDomainHintOr("");
   if (options.hasFormat()) {
     // Only one format type is supported at the time and the bindings code
     // verifies that the correct one was specified.
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc b/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc
index 66b7997..6da1ab50 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc
@@ -46,9 +46,6 @@
 IdentityCredential* IdentityCredential::Create(const String& token,
                                                bool is_auto_selected,
                                                const String& config_url) {
-  if (!RuntimeEnabledFeatures::FedCmAutoSelectedFlagEnabled()) {
-    is_auto_selected = false;
-  }
   return MakeGarbageCollected<IdentityCredential>(token, is_auto_selected,
                                                   config_url);
 }
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_credential.idl
index c8554d86..1a6a8eb2 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential.idl
@@ -17,13 +17,11 @@
     readonly attribute USVString token;
 
     // Whether an account was automatically selected in the FedCM flow.
-    [RuntimeEnabled=FedCmAutoSelectedFlag]
     readonly attribute boolean isAutoSelected;
 
     // The config URL of the selected identity provider.
     [RuntimeEnabled=FedCmMultipleIdentityProviders] readonly attribute USVString configURL;
 
     // https://github.com/fedidcg/FedCM/pull/515
-    [RuntimeEnabled=FedCmDisconnect, CallWith=ScriptState, RaisesException, MeasureAs=FedCmDisconnect] static Promise<undefined> disconnect(IdentityCredentialDisconnectOptions options);
-
+    [CallWith=ScriptState, RaisesException, MeasureAs=FedCmDisconnect] static Promise<undefined> disconnect(IdentityCredentialDisconnectOptions options);
 };
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl
index 6b269bc..14658039 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl
@@ -12,7 +12,7 @@
 [
     Exposed=Window,
     SecureContext,
-    RuntimeEnabled=FedCmError
+    RuntimeEnabled=FedCm
 ] interface IdentityCredentialError : DOMException {
     constructor(optional DOMString message = "", optional IdentityCredentialErrorInit options = {});
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
index 0017ad2..1a61d26 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
@@ -23,7 +23,7 @@
     required sequence<IdentityProviderRequestOptions> providers;
     IdentityCredentialRequestOptionsContext context = "signin";
     // Allows an RP to select between the two modes of operation: active or passive.
-    [RuntimeEnabled=FedCmButtonMode, MeasureAs=FedCmButtonMode] IdentityCredentialRequestOptionsMode mode = "passive";
+    [MeasureAs=FedCmButtonMode] IdentityCredentialRequestOptionsMode mode = "passive";
     // A querying language that allows an RP to ask what it wants from the IdPs.
     [RuntimeEnabled=FedCmSelectiveDisclosure] IdentityStandardClaims claims;
     // This is a debugging aid string instead of an actual member of this dictionary.
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
index 32a1a355..e480723 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
@@ -27,8 +27,7 @@
     [CallWith=ScriptState, RaisesException, MeasureAs=FedCmUserInfo]
     static Promise<sequence<IdentityUserInfo>> getUserInfo(IdentityProviderConfig config);
 
-    [RuntimeEnabled=FedCm, CallWith=ScriptState]
-    static void close();
+    [CallWith=ScriptState] static void close();
 
     [RuntimeEnabled=FedCmIdPRegistration, CallWith=ScriptState, ImplementedAs=registerIdentityProvider]
     static Promise<boolean> register(USVString configURL);
@@ -37,6 +36,5 @@
 
     // Allows an IdP to return a token to the RP from the content area, as opposed to
     // over HTTP with the id_assertion_endpoint.
-    [RuntimeEnabled=FedCmAuthz, CallWith=ScriptState]
-    static Promise<undefined> resolve((USVString or IdentityProviderToken) token, optional IdentityResolveOptions options = {});
+    [CallWith=ScriptState] static Promise<undefined> resolve((USVString or IdentityProviderToken) token, optional IdentityResolveOptions options = {});
 };
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl
index 7b223c4..6a5d1e7 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl
@@ -26,8 +26,8 @@
 dictionary IdentityProviderRequestOptions : IdentityProviderConfig {
   USVString nonce;
   DOMString loginHint;
-  [RuntimeEnabled=FedCmDomainHint] DOMString domainHint;
-  [RuntimeEnabled=FedCmAuthz] sequence<(USVString or IdentityProviderField)> fields;
-  [RuntimeEnabled=FedCmAuthz] any params;
+  DOMString domainHint;
+  sequence<(USVString or IdentityProviderField)> fields;
+  any params;
   [RuntimeEnabled=FedCmDelegation] IdentityProviderRequestOptionsFormat format;
 };
diff --git a/third_party/blink/renderer/modules/csspaint/nativepaint/clip_path_paint_definition_test.cc b/third_party/blink/renderer/modules/csspaint/nativepaint/clip_path_paint_definition_test.cc
index 95348ef..f0eeb406 100644
--- a/third_party/blink/renderer/modules/csspaint/nativepaint/clip_path_paint_definition_test.cc
+++ b/third_party/blink/renderer/modules/csspaint/nativepaint/clip_path_paint_definition_test.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/core/animation/string_keyframe.h"
 #include "third_party/blink/renderer/core/animation/timing.h"
 #include "third_party/blink/renderer/core/css/clip_path_paint_image_generator.h"
+#include "third_party/blink/renderer/core/css/properties/longhands.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/execution_context/security_context.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -21,7 +22,9 @@
 #include "third_party/blink/renderer/core/paint/clip_path_clipper.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
+#include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h"
 #include "third_party/blink/renderer/platform/graphics/image.h"
+#include "third_party/blink/renderer/platform/testing/layer_tree_host_embedder.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 
 namespace blink {
@@ -57,6 +60,19 @@
     return ea->Animations().begin()->key;
   }
 
+  Animation* GetFirstAnimationForProperty(const Element* element,
+                                          const CSSProperty& property) {
+    for (const auto& animation :
+         element->GetElementAnimations()->Animations()) {
+      if (animation.key->CalculateAnimationPlayState() !=
+              V8AnimationPlayState::Enum::kIdle &&
+          animation.key->Affects(*element, property)) {
+        return animation.key;
+      }
+    }
+    return nullptr;
+  }
+
   void EnsureCCClipPathInvariantsHoldStyleAndLayout(
       bool needs_repaint,
       CompositedPaintStatus status,
@@ -146,6 +162,15 @@
         override_scheduled_animation);
   }
 
+  // Some animations require the paint artifact compositor's update flag to be
+  // correctly cleared. This ensures that the Paint Artifact Compositor has a
+  // LayerTreeHost so it will run its normal logic.
+  void InitPaintArtifactCompositor() {
+    layer_tree_ = std::make_unique<LayerTreeHostEmbedder>();
+    layer_tree_->layer_tree_host()->SetRootLayer(
+        GetDocument().View()->GetPaintArtifactCompositor()->RootLayer());
+  }
+
  protected:
   void SetUp() override {
     scoped_composite_clip_path_animation =
@@ -154,6 +179,7 @@
         std::make_unique<ScopedCompositeBGColorAnimationForTest>(false);
     chrome_client_ = MakeGarbageCollected<MockSchedulingChromeClient>();
     PageTestBase::SetupPageWithClients(chrome_client_);
+
     GetDocument().GetSettings()->SetAcceleratedCompositingEnabled(true);
     GetDocument().Timeline().ResetForTesting();
   }
@@ -165,6 +191,7 @@
       scoped_composite_bgcolor_animation;
 
   Persistent<MockSchedulingChromeClient> chrome_client_;
+  std::unique_ptr<LayerTreeHostEmbedder> layer_tree_;
 };
 
 // Test the case where there is a clip-path animation with two simple
@@ -567,4 +594,92 @@
       element, animation);
 }
 
+// Test that the special animation restart for percent translate animations does
+// not trigger lifecycle issues for cc clippaths.
+TEST_F(ClipPathPaintDefinitionTest, ChangeDimensionPecentTranslateAnim) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+        @keyframes transform {
+            0% {
+                transform: translate(10%, 10%);
+            }
+            100% {
+                transform: translate(20%, 20%);
+            }
+        }
+        @keyframes clippath {
+            0% {
+                clip-path: circle(50% at 50% 50%);
+                transform: translate(10%, 10%);
+            }
+            100% {
+                clip-path: circle(30% at 30% 30%);
+                transform: translate(20%, 20%);
+            }
+        }
+        .animation1 {
+            animation: transform 30s;
+        }
+        .animation2 {
+            animation: clippath 30s;
+        }
+        .oldsize {
+            width: 100px;
+            height: 100px;
+        }
+        .newsize {
+            width: 125px;
+            height: 125px;
+        }
+
+        #target {
+            transform: translate(1%, 1%);
+        }
+    </style>
+    <div id="target" class="oldsize">
+    </div>
+  )HTML");
+  InitPaintArtifactCompositor();
+  UpdateAllLifecyclePhasesForTest();
+
+  Element* element = GetElementById("target");
+
+  // TODO(crbug.com/396645699): Due to a separate issue animations on clip-path
+  // and transform will only be composited in certain situations when updates
+  // are forced. Here, we're starting a valid transform animation and replacing
+  // it with one with both properties. This primes the paint properties to be
+  // correct so that the clip path animation will be composited. This can also
+  // happen in other situations where there are multiple animations running.
+  // This code should be removed when the linked crbug is fixed.
+  element->setAttribute(html_names::kClassAttr,
+                        AtomicString("animation1 oldsize"));
+  UpdateAllLifecyclePhasesForTest();
+
+  // Init animation with clip-path and a translate.
+
+  element->setAttribute(html_names::kClassAttr,
+                        AtomicString("animation2 oldsize"));
+
+  EnsureCCClipPathInvariantsHoldStyleAndLayout(
+      /* needs_repaint= */ true, CompositedPaintStatus::kComposited, element);
+
+  Animation* animation =
+      GetFirstAnimationForProperty(element, GetCSSPropertyClipPath());
+
+  GetDocument().GetAnimationClock().UpdateTime(base::TimeTicks() +
+                                               base::Milliseconds(0));
+  animation->NotifyReady(ANIMATION_TIME_DELTA_FROM_MILLISECONDS(0));
+
+  EnsureCCClipPathInvariantsHoldThroughoutPainting(
+      /* needs_repaint= */ true, CompositedPaintStatus::kComposited, element,
+      animation);
+
+  element->setAttribute(html_names::kClassAttr,
+                        AtomicString("animation2 newsize"));
+
+  EnsureCCClipPathInvariantsHoldThroughoutLifecycle(
+      /* needs_repaint= */ false, CompositedPaintStatus::kComposited, element,
+      animation, /* override_scheduled_animation= */ true);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ml/ml_context.cc b/third_party/blink/renderer/modules/ml/ml_context.cc
index 1ca913e..6fbdc02 100644
--- a/third_party/blink/renderer/modules/ml/ml_context.cc
+++ b/third_party/blink/renderer/modules/ml/ml_context.cc
@@ -245,18 +245,18 @@
 
   MLBatchNormalizationSupportLimits* batch_normalization =
       MLBatchNormalizationSupportLimits::Create();
-  batch_normalization->setInput(SupportedDataTypesToDataTypeLimits(
+  batch_normalization->setInput(SupportedTensorLimitsToTensorLimits(
       data_type_limits.batch_normalization_input));
-  batch_normalization->setMean(SupportedDataTypesToDataTypeLimits(
-      data_type_limits.batch_normalization_input));
-  batch_normalization->setVariance(SupportedDataTypesToDataTypeLimits(
-      data_type_limits.batch_normalization_input));
-  batch_normalization->setScale(SupportedDataTypesToDataTypeLimits(
-      data_type_limits.batch_normalization_input));
-  batch_normalization->setBias(SupportedDataTypesToDataTypeLimits(
-      data_type_limits.batch_normalization_input));
+  batch_normalization->setMean(SupportedTensorLimitsToTensorLimits(
+      data_type_limits.batch_normalization_mean));
+  batch_normalization->setVariance(SupportedTensorLimitsToTensorLimits(
+      data_type_limits.batch_normalization_mean));
+  batch_normalization->setScale(SupportedTensorLimitsToTensorLimits(
+      data_type_limits.batch_normalization_mean));
+  batch_normalization->setBias(SupportedTensorLimitsToTensorLimits(
+      data_type_limits.batch_normalization_mean));
   batch_normalization->setOutput(SupportedDataTypesToDataTypeLimits(
-      data_type_limits.batch_normalization_input));
+      data_type_limits.batch_normalization_input.data_types));
   op_support_limits->setBatchNormalization(batch_normalization);
 
   MLSingleInputSupportLimits* cast = MLSingleInputSupportLimits::Create();
diff --git a/third_party/blink/renderer/modules/ml/ml_context.idl b/third_party/blink/renderer/modules/ml/ml_context.idl
index 6a3dfe9..2748b29 100644
--- a/third_party/blink/renderer/modules/ml/ml_context.idl
+++ b/third_party/blink/renderer/modules/ml/ml_context.idl
@@ -36,11 +36,11 @@
 };
 
 dictionary MLBatchNormalizationSupportLimits {
-  MLDataTypeLimits input;
-  MLDataTypeLimits mean;
-  MLDataTypeLimits variance;
-  MLDataTypeLimits scale;
-  MLDataTypeLimits bias;
+  MLTensorLimits input;
+  MLTensorLimits mean;
+  MLTensorLimits variance;
+  MLTensorLimits scale;
+  MLTensorLimits bias;
   MLDataTypeLimits output;
 };
 
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
index 72d105e..c4bab7b 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
@@ -558,7 +558,10 @@
          {webnn::SupportedDataTypes::All(), kMaxRank},
          /*arg_min_max_output=*/
          webnn::SupportedDataTypes::All(),
-         /*batch_normalization_input=*/webnn::SupportedDataTypes::All(),
+         /*batch_normalization_input=*/
+         {webnn::SupportedDataTypes::All(), kMaxRank},
+         /*batch_normalization_mean=*/
+         {webnn::SupportedDataTypes::All(), kMaxRank},
          /*cast_input=*/
          {webnn::SupportedDataTypes::All(), kMaxRank},
          /*clamp_input=*/
diff --git a/third_party/blink/renderer/modules/shapedetection/shape_detector.cc b/third_party/blink/renderer/modules/shapedetection/shape_detector.cc
index 7b58d22..96c8e20 100644
--- a/third_party/blink/renderer/modules/shapedetection/shape_detector.cc
+++ b/third_party/blink/renderer/modules/shapedetection/shape_detector.cc
@@ -30,6 +30,7 @@
 
 namespace blink {
 
+// static
 std::optional<SkBitmap> ShapeDetector::GetBitmapFromSource(
     ScriptState* script_state,
     const V8ImageBitmapSource* image_source,
@@ -123,6 +124,7 @@
   return std::move(n32_bitmap);
 }
 
+// static
 std::optional<SkBitmap> ShapeDetector::GetBitmapFromImageData(
     ScriptState* script_state,
     ImageData* image_data,
@@ -158,6 +160,7 @@
   return std::move(sk_bitmap);
 }
 
+// static
 std::optional<SkBitmap> ShapeDetector::GetBitmapFromImageElement(
     ScriptState* script_state,
     const HTMLImageElement* img,
diff --git a/third_party/blink/renderer/modules/shapedetection/shape_detector.h b/third_party/blink/renderer/modules/shapedetection/shape_detector.h
index e30ab87..9a58349 100644
--- a/third_party/blink/renderer/modules/shapedetection/shape_detector.h
+++ b/third_party/blink/renderer/modules/shapedetection/shape_detector.h
@@ -19,19 +19,22 @@
  public:
   ~ShapeDetector() override = default;
 
- protected:
-  std::optional<SkBitmap> GetBitmapFromSource(
+  // Returns the SkBitmap data from an ImageBitmapSource. Throws an exception
+  // and returns nullopt if the source is inaccessible, incompatible, etc.
+  // https://html.spec.whatwg.org/C/#imagebitmapsource
+  static std::optional<SkBitmap> GetBitmapFromSource(
       ScriptState* script_state,
       const V8ImageBitmapSource* image_source,
       ExceptionState&);
 
  private:
-  std::optional<SkBitmap> GetBitmapFromImageData(ScriptState*,
-                                                 ImageData*,
-                                                 ExceptionState&);
-  std::optional<SkBitmap> GetBitmapFromImageElement(ScriptState*,
-                                                    const HTMLImageElement*,
-                                                    ExceptionState&);
+  static std::optional<SkBitmap> GetBitmapFromImageData(ScriptState*,
+                                                        ImageData*,
+                                                        ExceptionState&);
+  static std::optional<SkBitmap> GetBitmapFromImageElement(
+      ScriptState*,
+      const HTMLImageElement*,
+      ExceptionState&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc
index de687cd..ae30b1e 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc
@@ -876,6 +876,22 @@
                         ->trusted_bidding_signals_coordinator->ToString());
               }
 
+              if (mojom_group->interest_group
+                      ->view_and_click_counts_providers) {
+                Vector<String> view_and_click_counts_providers;
+                view_and_click_counts_providers.reserve(
+                    mojom_group->interest_group->view_and_click_counts_providers
+                        ->size());
+                for (const scoped_refptr<const blink::SecurityOrigin>& origin :
+                     *mojom_group->interest_group
+                          ->view_and_click_counts_providers) {
+                  view_and_click_counts_providers.emplace_back(
+                      origin->ToString());
+                }
+                group->setViewAndClickCountsProviders(
+                    std::move(view_and_click_counts_providers));
+              }
+
               if (mojom_group->interest_group->user_bidding_signals) {
                 group->setUserBiddingSignals(JsonStringToScriptValue(
                     resolver->GetScriptState(),
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_unittest.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_unittest.cc
index 77d4007..10be888d 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_unittest.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_unittest.cc
@@ -1942,6 +1942,8 @@
   ig.max_trusted_bidding_signals_url_length = 100;
   ig.trusted_bidding_signals_coordinator =
       url::Origin::Create(GURL("https://example.test"));
+  ig.view_and_click_counts_providers = {
+      {url::Origin::Create(GURL("https://example.test"))}};
   ig.user_bidding_signals = "\"hello\"";
   ig.ads = {
       {blink::InterestGroup::Ad(
@@ -2193,7 +2195,8 @@
               "trustedBiddingSignalsUrl": "https://example.org/trust.json",
               "updateURL": "https://example.org/ig_update.json",
               "updateUrl": "https://example.org/ig_update.json",
-              "userBiddingSignals": "hello"
+              "userBiddingSignals": "hello",
+              "viewAndClickCountsProviders": ["https://example.test"]
             }
           ];
 
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition.cc b/third_party/blink/renderer/modules/speech/speech_recognition.cc
index fb6fc7f..0b53713 100644
--- a/third_party/blink/renderer/modules/speech/speech_recognition.cc
+++ b/third_party/blink/renderer/modules/speech/speech_recognition.cc
@@ -328,8 +328,14 @@
 }
 
 void SpeechRecognition::StartInternal(ExceptionState* exception_state) {
-  if (!controller_ || !GetExecutionContext())
+  if (!controller_ || !GetExecutionContext()) {
+    if (exception_state) {
+      exception_state->ThrowDOMException(
+          DOMExceptionCode::kInvalidStateError,
+          "Cannot start speech recognition on a detached document.");
+    }
     return;
+  }
 
   if (started_) {
     // https://wicg.github.io/speech-api/#dom-speechrecognition-start
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 96dd94e7..212b693 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -730,6 +730,8 @@
     "fonts/orientation_iterator.h",
     "fonts/palette_interpolation.cc",
     "fonts/palette_interpolation.h",
+    "fonts/plain_text_painter.cc",
+    "fonts/plain_text_painter.h",
     "fonts/resolved_font_features.h",
     "fonts/script_run_iterator.cc",
     "fonts/script_run_iterator.h",
diff --git a/third_party/blink/renderer/platform/exported/web_font.cc b/third_party/blink/renderer/platform/exported/web_font.cc
index d86bd938..9ecf672b 100644
--- a/third_party/blink/renderer/platform/exported/web_font.cc
+++ b/third_party/blink/renderer/platform/exported/web_font.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/fonts/font.h"
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
 #include "third_party/blink/renderer/platform/fonts/font_description.h"
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
 #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
 #include "third_party/blink/renderer/platform/text/text_run.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -84,14 +85,28 @@
   cc::PaintFlags flags;
   flags.setColor(color);
   flags.setAntiAlias(true);
+  if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+    PlainTextPainter::Shared().Draw(text_run, *private_->GetFont(), *canvas,
+                                    left_baseline, flags);
+    return;
+  }
   private_->GetFont()->DrawText(canvas, text_run, left_baseline, flags);
 }
 
 int WebFont::CalculateWidth(const WebTextRun& run) const {
+  if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+    return PlainTextPainter::Shared().ComputeInlineSize(
+        run, *private_->GetFont(), nullptr);
+  }
   return private_->GetFont()->Width(run, nullptr);
 }
 
 int WebFont::OffsetForPosition(const WebTextRun& run, float position) const {
+  if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+    return PlainTextPainter::Shared().OffsetForPosition(
+        run, *private_->GetFont(), position, kIncludePartialGlyphs,
+        BreakGlyphsOption(false));
+  }
   return private_->GetFont()->OffsetForPosition(
       run, position, kIncludePartialGlyphs, BreakGlyphsOption(false));
 }
@@ -101,6 +116,10 @@
                                          int height,
                                          int from,
                                          int to) const {
+  if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+    return PlainTextPainter::Shared().SelectionRectForText(
+        run, from, to, *private_->GetFont(), left_baseline, height);
+  }
   return private_->GetFont()->SelectionRectForText(run, left_baseline, height,
                                                    from, to);
 }
diff --git a/third_party/blink/renderer/platform/fonts/plain_text_painter.cc b/third_party/blink/renderer/platform/fonts/plain_text_painter.cc
new file mode 100644
index 0000000..b8f09abd
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/plain_text_painter.cc
@@ -0,0 +1,91 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
+
+#include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
+
+namespace blink {
+
+PlainTextPainter::PlainTextPainter(PlainTextPainter::Mode mode) : mode_(mode) {}
+
+void PlainTextPainter::Trace(Visitor* visitor) const {}
+
+PlainTextPainter& PlainTextPainter::Shared() {
+  DCHECK(RuntimeEnabledFeatures::PlainTextPainterEnabled());
+  DCHECK(IsMainThread());
+  DEFINE_STATIC_LOCAL(Persistent<PlainTextPainter>, shared_instance,
+                      (MakeGarbageCollected<PlainTextPainter>(kShared)));
+  return *shared_instance;
+}
+
+void PlainTextPainter::Draw(const TextRun& run,
+                            const Font& font,
+                            cc::PaintCanvas& canvas,
+                            const gfx::PointF& location,
+                            const cc::PaintFlags& flags,
+                            Font::DrawType draw_type) {
+  // TODO(crbug.com/389726691): Implement this without Font::DrawText().
+  font.DrawText(&canvas, run, location, flags, draw_type);
+}
+
+bool PlainTextPainter::DrawWithBidiReorder(
+    const TextRun& run,
+    unsigned from_index,
+    unsigned to_index,
+    const Font& font,
+    Font::CustomFontNotReadyAction action,
+    cc::PaintCanvas& canvas,
+    const gfx::PointF& location,
+    const cc::PaintFlags& flags,
+    Font::DrawType draw_type) {
+  // TODO(crbug.com/389726691): Implement this without Font::DrawText().
+  TextRunPaintInfo run_info(run);
+  run_info.from = from_index;
+  run_info.to = to_index;
+  return font.DrawBidiText(&canvas, run_info, location, action, flags,
+                           draw_type);
+}
+
+float PlainTextPainter::ComputeInlineSize(const TextRun& run,
+                                          const Font& font,
+                                          gfx::RectF* glyph_bounds) {
+  // TODO(crbug.com/389726691): Implement this without Font::Width().
+  return font.Width(run, glyph_bounds);
+}
+
+float PlainTextPainter::ComputeSubInlineSize(const TextRun& run,
+                                             unsigned from_index,
+                                             unsigned to_index,
+                                             const Font& font,
+                                             gfx::RectF* glyph_bounds) {
+  // TODO(crbug.com/389726691): Implement this without Font::SubRunWidth().
+  return font.SubRunWidth(run, from_index, to_index, glyph_bounds);
+}
+
+int PlainTextPainter::OffsetForPosition(
+    const TextRun& run,
+    const Font& font,
+    float position,
+    IncludePartialGlyphsOption partial_option,
+    BreakGlyphsOption break_option) const {
+  // TODO(crbug.com/389726691): Implement this without
+  // Font::OffsetForPosition().
+  return font.OffsetForPosition(run, position, partial_option, break_option);
+}
+
+gfx::RectF PlainTextPainter::SelectionRectForText(
+    const TextRun& run,
+    unsigned from_index,
+    unsigned to_index,
+    const Font& font,
+    const gfx::PointF& left_baseline,
+    float height) const {
+  // TODO(crbug.com/389726691): Implement this without
+  // Font::SelectionRectForText().
+  return font.SelectionRectForText(run, left_baseline, height, from_index,
+                                   to_index);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/plain_text_painter.h b/third_party/blink/renderer/platform/fonts/plain_text_painter.h
new file mode 100644
index 0000000..7ae5bdef
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/plain_text_painter.h
@@ -0,0 +1,103 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_PLAIN_TEXT_PAINTER_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_PLAIN_TEXT_PAINTER_H_
+
+#include "third_party/blink/renderer/platform/fonts/font.h"
+
+namespace gfx {
+class PointF;
+class RectF;
+}  // namespace gfx
+
+namespace cc {
+class PaintCanvas;
+class PaintFlags;
+}  // namespace cc
+
+namespace blink {
+
+class TextRun;
+
+// PlainTextPainter provides functionality to render plain text, excluding
+// CSS and SVG.
+//
+// This class supports two modes: kCanvas and kShared.
+// - kCanvas: Designed for use with HTML <canvas> and OffscreenCanvas.
+// - kShared: Intended for purposes other than canvas rendering.
+//
+// The modes differ in how whitespace within the text is handled and how
+// caching behaves.
+//
+// Instances in kCanvas mode are created one per canvas instance.
+// Instances in kShared mode are created only once and accessed via
+// PlainTextPainter::Shared().
+class PLATFORM_EXPORT PlainTextPainter
+    : public GarbageCollected<PlainTextPainter> {
+ public:
+  enum Mode { kCanvas, kShared };
+  explicit PlainTextPainter(Mode mode);
+  void Trace(Visitor* visitor) const;
+
+  PlainTextPainter(const PlainTextPainter&) = delete;
+  PlainTextPainter& operator=(const PlainTextPainter&) = delete;
+
+  // Return the shared instance for non-<canvas>.
+  static PlainTextPainter& Shared();
+
+  // Draw the specified text. This doesn't apply BiDi reorder.
+  void Draw(const TextRun& run,
+            const Font& font,
+            cc::PaintCanvas& canvas,
+            const gfx::PointF& location,
+            const cc::PaintFlags& flags,
+            Font::DrawType = Font::DrawType::kGlyphsOnly);
+
+  // Draw the specified text, from `from_index` to `to_index` (exclusive). This
+  // applies BiDi reorder.
+  // This function returns `false` if a web font `font` is not ready and
+  // `action` is `kDoNotPaintIfFontNotReady`.
+  bool DrawWithBidiReorder(const TextRun& run,
+                           unsigned from_index,
+                           unsigned to_index,
+                           const Font& font,
+                           Font::CustomFontNotReadyAction action,
+                           cc::PaintCanvas& canvas,
+                           const gfx::PointF& location,
+                           const cc::PaintFlags& flags,
+                           Font::DrawType = Font::DrawType::kGlyphsOnly);
+
+  // Glyph bounds will be the minimum rect containing all glyph strokes, in
+  // coordinates using (<text run x position>, <baseline position>) as the
+  // origin. If the pointer is not null, glyph_bounds is expected to be
+  // default-initialized.
+  float ComputeInlineSize(const TextRun& run,
+                          const Font& font,
+                          gfx::RectF* glyph_bounds = nullptr);
+  float ComputeSubInlineSize(const TextRun&,
+                             unsigned from_index,
+                             unsigned to_index,
+                             const Font& font,
+                             gfx::RectF* glyph_bounds = nullptr);
+
+  int OffsetForPosition(const TextRun& run,
+                        const Font& font,
+                        float position,
+                        IncludePartialGlyphsOption partial_option,
+                        BreakGlyphsOption break_option) const;
+  gfx::RectF SelectionRectForText(const TextRun& run,
+                                  unsigned from_index,
+                                  unsigned to_index,
+                                  const Font& font,
+                                  const gfx::PointF& left_baseline,
+                                  float height) const;
+
+ private:
+  [[maybe_unused]] const Mode mode_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_PLAIN_TEXT_PAINTER_H_
diff --git a/third_party/blink/renderer/platform/fonts/string_truncator.cc b/third_party/blink/renderer/platform/fonts/string_truncator.cc
index d3191cfc..ccb0cda 100644
--- a/third_party/blink/renderer/platform/fonts/string_truncator.cc
+++ b/third_party/blink/renderer/platform/fonts/string_truncator.cc
@@ -29,6 +29,7 @@
 #include "third_party/blink/renderer/platform/fonts/string_truncator.h"
 
 #include "third_party/blink/renderer/platform/fonts/font.h"
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
 #include "third_party/blink/renderer/platform/text/text_break_iterator.h"
 #include "third_party/blink/renderer/platform/text/text_run.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
@@ -101,6 +102,10 @@
 
 static float StringWidth(const Font& renderer,
                          base::span<const UChar> characters) {
+  if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+    return PlainTextPainter::Shared().ComputeInlineSize(TextRun(characters),
+                                                        renderer);
+  }
   return renderer.Width(TextRun(characters));
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
index d71bb77..d7ca65a 100644
--- a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
+++ b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
@@ -147,10 +147,6 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 }
 
-SkImageInfo AcceleratedStaticBitmapImage::GetSkImageInfo() const {
-  return sk_image_info_;
-}
-
 scoped_refptr<StaticBitmapImage>
 AcceleratedStaticBitmapImage::MakeUnaccelerated() {
   CreateImageFromMailboxIfNeeded();
diff --git a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h
index 20e1996..95c005c 100644
--- a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h
+++ b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h
@@ -127,7 +127,21 @@
 
   PaintImage PaintImageForCurrentFrame() override;
 
-  SkImageInfo GetSkImageInfo() const override;
+  gfx::Size GetSize() const override {
+    return gfx::Size(sk_image_info_.width(), sk_image_info_.height());
+  }
+  SkAlphaType GetAlphaType() const override {
+    return sk_image_info_.alphaType();
+  }
+  SkColorType GetSkColorType() const override {
+    return sk_image_info_.colorType();
+  }
+  sk_sp<SkColorSpace> GetSkColorSpace() const override {
+    return sk_image_info_.refColorSpace();
+  }
+  viz::SharedImageFormat GetSharedImageFormat() const override {
+    return viz::SkColorTypeToSinglePlaneSharedImageFormat(GetSkColorType());
+  }
 
  private:
   struct ReleaseContext {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
index 8da64e0..e6df036 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -23,6 +23,7 @@
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/mutator_host.h"
 #include "cc/view_transition/view_transition_request.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/geometry/geometry_as_json.h"
 #include "third_party/blink/renderer/platform/graphics/compositing/adjust_mask_layer_geometry.h"
@@ -530,7 +531,9 @@
   Layerizer(PaintArtifactCompositor& compositor,
             const PaintArtifact& artifact,
             wtf_size_t reserve_capacity)
-      : compositor_(compositor),
+      : layer_merge_distance_limit_(base::saturated_cast<wtf_size_t>(
+            features::kLayerMergeDistanceLimit.Get())),
+        compositor_(compositor),
         artifact_(artifact),
         chunk_cursor_(artifact.GetPaintChunks().begin()) {
     pending_layers_.reserve(reserve_capacity);
@@ -565,6 +568,7 @@
                          const EffectPaintPropertyNode& effect,
                          wtf_size_t layer_index);
 
+  const wtf_size_t layer_merge_distance_limit_;
   PaintArtifactCompositor& compositor_;
   const PaintArtifact& artifact_;
   PaintChunks::const_iterator chunk_cursor_;
@@ -756,8 +760,11 @@
     auto is_composited_scroll = [this](const TransformPaintPropertyNode& t) {
       return compositor_.NeedsCompositedScrolling(t);
     };
-    for (wtf_size_t candidate_index = pending_layers_.size() - 1;
-         candidate_index-- > first_layer_in_current_group;) {
+    wtf_size_t candidate_index = pending_layers_.size() - 1;
+    while (candidate_index > first_layer_in_current_group &&
+           pending_layers_.size() - candidate_index <=
+               layer_merge_distance_limit_) {
+      --candidate_index;
       PendingLayer& candidate_layer = pending_layers_[candidate_index];
       if (candidate_layer.Merge(new_layer, compositor_.lcd_text_preference_,
                                 is_composited_scroll)) {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
index 86701b9..b059374 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -10,6 +10,7 @@
 #include "base/containers/adapters.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_simple_task_runner.h"
 #include "build/build_config.h"
 #include "cc/input/main_thread_scrolling_reason.h"
@@ -269,6 +270,76 @@
   EXPECT_FALSE(GetTransformNode(child).transform_changed);
 }
 
+TEST_P(PaintArtifactCompositorTest, MergeDistanceLimit0) {
+  gfx::Rect bounds(100, 100);
+  TestPaintArtifact ta;
+  ta.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+  const auto& artifact = ta.Build();
+  Update(artifact);
+  ASSERT_EQ(1u, LayerCount());
+
+  // No merge with merge distance limit 0.
+  base::test::ScopedFeatureList feature;
+  feature.InitAndEnableFeatureWithParameters(features::kLimitLayerMergeDistance,
+                                             {{"limit", "0"}});
+  Update(artifact);
+  EXPECT_EQ(3u, LayerCount());
+}
+
+TEST_P(PaintArtifactCompositorTest, MergeDistanceLimit1) {
+  gfx::Rect bounds(100, 100);
+  // The foreign layer doesn't overlap with other chunks.
+  gfx::Point foreign_layer_origin(200, 200);
+  TestPaintArtifact ta;
+  ta.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+  ta.ForeignLayerChunk(cc::Layer::Create(), foreign_layer_origin);
+  ta.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+  const auto& artifact = ta.Build();
+  Update(artifact);
+  ASSERT_EQ(2u, LayerCount());
+
+  // Only merge mergeable adjacent layers.
+  base::test::ScopedFeatureList feature;
+  feature.InitAndEnableFeatureWithParameters(features::kLimitLayerMergeDistance,
+                                             {{"limit", "1"}});
+  Update(artifact);
+  EXPECT_EQ(3u, LayerCount());
+}
+
+TEST_P(PaintArtifactCompositorTest, MergeDistanceLimit2) {
+  gfx::Rect bounds(100, 100);
+  // The foreign layers don't overlap with the non-foreign-layer chunks.
+  gfx::Point foreign_layer_origin(200, 200);
+
+  // One foreign layer between other mergeable layers.
+  TestPaintArtifact ta1;
+  ta1.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+  ta1.ForeignLayerChunk(cc::Layer::Create(), foreign_layer_origin);
+  ta1.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+
+  // Three foreign layers between other mergeable layers.
+  TestPaintArtifact ta2;
+  ta2.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+  ta2.ForeignLayerChunk(cc::Layer::Create(), foreign_layer_origin);
+  ta2.ForeignLayerChunk(cc::Layer::Create(), foreign_layer_origin);
+  ta2.Chunk().Bounds(bounds).Chunk().Bounds(bounds).Chunk().Bounds(bounds);
+
+  const auto& artifact1 = ta1.Build();
+  const auto& artifact2 = ta2.Build();
+  Update(artifact1);
+  ASSERT_EQ(2u, LayerCount());
+  Update(artifact2);
+  ASSERT_EQ(3u, LayerCount());
+
+  base::test::ScopedFeatureList feature;
+  feature.InitAndEnableFeatureWithParameters(features::kLimitLayerMergeDistance,
+                                             {{"limit", "2"}});
+  Update(artifact1);
+  EXPECT_EQ(2u, LayerCount());
+  Update(artifact2);
+  EXPECT_EQ(4u, LayerCount());
+}
+
 TEST_P(PaintArtifactCompositorTest, OneTransform) {
   // A 90 degree clockwise rotation about (100, 100).
   auto* transform =
@@ -935,7 +1006,7 @@
 
   TestPaintArtifact test_artifact;
   test_artifact.Chunk().RectDrawing(gfx::Rect(0, 0, 100, 100), Color::kWhite);
-  test_artifact.Chunk().ForeignLayer(layer, gfx::Point(50, 60));
+  test_artifact.ForeignLayerChunk(layer, gfx::Point(50, 60));
   test_artifact.Chunk().RectDrawing(gfx::Rect(0, 0, 100, 100), Color::kGray);
 
   auto& artifact = test_artifact.Build();
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc
index 3aa55570..0018d297 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_context.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
@@ -35,6 +35,7 @@
 #include "components/paint_preview/common/paint_preview_tracker.h"
 #include "skia/ext/platform_canvas.h"
 #include "third_party/blink/public/mojom/frame/color_scheme.mojom-blink.h"
+#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
 #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
 #include "third_party/blink/renderer/platform/geometry/float_rounded_rect.h"
 #include "third_party/blink/renderer/platform/graphics/dark_mode_settings_builder.h"
@@ -561,6 +562,16 @@
                                    const gfx::PointF& point,
                                    const AutoDarkMode& auto_dark_mode) {
   DrawTextPasses([&](const cc::PaintFlags& flags) {
+    if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
+      if (PlainTextPainter::Shared().DrawWithBidiReorder(
+              run, 0, run.length(), font, Font::kDoNotPaintIfFontNotReady,
+              *canvas_, point, DarkModeFlags(this, auto_dark_mode, flags),
+              printing_ ? Font::DrawType::kGlyphsAndClusters
+                        : Font::DrawType::kGlyphsOnly)) {
+        paint_controller_.SetTextPainted();
+      }
+      return;
+    }
     if (font.DrawBidiText(canvas_, TextRunPaintInfo(run), point,
                           Font::kDoNotPaintIfFontNotReady,
                           DarkModeFlags(this, auto_dark_mode, flags),
diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h b/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
index b2a70400..5872cea9 100644
--- a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
+++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
@@ -87,7 +87,7 @@
   virtual void UpdateSyncToken(const gpu::SyncToken&) { NOTREACHED(); }
 
   bool IsPremultiplied() const {
-    return GetSkImageInfo().alphaType() == SkAlphaType::kPremul_SkAlphaType;
+    return GetAlphaType() == SkAlphaType::kPremul_SkAlphaType;
   }
 
   // Methods have exactly the same implementation for all sub-classes
@@ -113,17 +113,11 @@
   Vector<uint8_t> CopyImageData(const SkImageInfo& info,
                                 bool apply_orientation);
 
-  gfx::Size GetSize() const {
-    return gfx::Size(GetSkImageInfo().width(), GetSkImageInfo().height());
-  }
-  SkAlphaType GetAlphaType() { return GetSkImageInfo().alphaType(); }
-  SkColorType GetSkColorType() { return GetSkImageInfo().colorType(); }
-  sk_sp<SkColorSpace> GetSkColorSpace() {
-    return GetSkImageInfo().refColorSpace();
-  }
-  viz::SharedImageFormat GetSharedImageFormat() {
-    return viz::SkColorTypeToSinglePlaneSharedImageFormat(GetSkColorType());
-  }
+  virtual gfx::Size GetSize() const = 0;
+  virtual SkAlphaType GetAlphaType() const = 0;
+  virtual SkColorType GetSkColorType() const = 0;
+  virtual sk_sp<SkColorSpace> GetSkColorSpace() const = 0;
+  virtual viz::SharedImageFormat GetSharedImageFormat() const = 0;
 
  protected:
   // Helper for sub-classes
@@ -145,10 +139,6 @@
   // AcceleratedStaticBitmapImage. To change this property, the call site would
   // have to call SetOriginClean().
   bool is_origin_clean_ = true;
-
- private:
-  // Return the SkImageInfo of the internal representation of this image.
-  virtual SkImageInfo GetSkImageInfo() const = 0;
 };
 
 template <>
diff --git a/third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h b/third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h
index 143c218..b134edf 100644
--- a/third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h
+++ b/third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h
@@ -41,7 +41,22 @@
   bool CopyToResourceProvider(CanvasResourceProvider* resource_provider,
                               const gfx::Rect& copy_rect) override;
 
-  SkImageInfo GetSkImageInfo() const override;
+  SkImageInfo GetSkImageInfo() const;
+  gfx::Size GetSize() const override {
+    return gfx::Size(GetSkImageInfo().width(), GetSkImageInfo().height());
+  }
+  SkAlphaType GetAlphaType() const override {
+    return GetSkImageInfo().alphaType();
+  }
+  SkColorType GetSkColorType() const override {
+    return GetSkImageInfo().colorType();
+  }
+  sk_sp<SkColorSpace> GetSkColorSpace() const override {
+    return GetSkImageInfo().refColorSpace();
+  }
+  viz::SharedImageFormat GetSharedImageFormat() const override {
+    return viz::SkColorTypeToSinglePlaneSharedImageFormat(GetSkColorType());
+  }
 
  private:
   UnacceleratedStaticBitmapImage(sk_sp<SkImage>, ImageOrientation);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 0875ef98..3202deb9 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -906,10 +906,6 @@
       }
     },
     {
-      name: "ConcurrentViewTransitionsSPA",
-      status: "stable",
-    },
-    {
       name: "ConsiderFullChildNodeContentForListify",
       status: "stable",
     },
@@ -1866,32 +1862,6 @@
       base_feature: "none",
     },
     {
-      name: "FedCmAuthz",
-      depends_on: ["FedCm"],
-      public: true,
-      browser_process_read_access: true,
-      status: "stable",
-      base_feature: "none",
-      origin_trial_feature_name: "FedCmContinueOnBundle",
-      origin_trial_allows_third_party: true,
-    },
-    {
-      name: "FedCmAutoSelectedFlag",
-      depends_on: ["FedCm"],
-      public: true,
-      status: "stable",
-      base_feature: "none",
-    },
-    {
-      name: "FedCmButtonMode",
-      depends_on: ["FedCm"],
-      public: true,
-      status: "stable",
-      base_feature: "none",
-      origin_trial_feature_name: "FedCmButtonMode",
-      origin_trial_allows_third_party: true,
-    },
-    {
       name: "FedCmDelegation",
       depends_on: ["FedCm"],
       public: true,
@@ -1899,27 +1869,6 @@
       base_feature: "none",
     },
     {
-      name: "FedCmDisconnect",
-      depends_on: ["FedCm"],
-      base_feature: "none",
-      status: "stable",
-      public: true,
-    },
-    {
-      name: "FedCmDomainHint",
-      depends_on: ["FedCm"],
-      public: true,
-      status: "stable",
-      base_feature: "none",
-    },
-    {
-      name: "FedCmError",
-      depends_on: ["FedCm"],
-      public: true,
-      status: "stable",
-      base_feature: "none",
-    },
-    {
       name: "FedCmIdPRegistration",
       depends_on: ["FedCm"],
       public: true,
@@ -2000,18 +1949,9 @@
     },
     {
       // The Blink runtime-enabled feature name for the API's IDL.
+      // https://chromestatus.com/feature/4654499737632768
       name: "FetchLaterAPI",
-      status: "experimental",
-      origin_trial_feature_name: "FetchLaterAPI",
-      origin_trial_allows_third_party: true,
-      base_feature: "FetchLaterAPI",
-      // base_feature is meant as kill-switch. This runtime-enabled feature
-      // should follow the Origin Trial unless explicitly overriden by Finch or
-      // commandline flags.
-      base_feature_status: "enabled",
-      // Enables the Blink feature only when the base::Feature is overridden by
-      // field trial or command line.
-      copied_from_base_feature_if: "overridden",
+      status: "stable",
     },
     {
       name: "FetchUploadStreaming",
@@ -2113,6 +2053,10 @@
       name: "FledgeBiddingAndAuctionServerAPIMultiSeller",
     },
     {
+      name: "FledgeClickiness",
+      status: "test",
+    },
+    {
       name: "FledgeCustomMaxAuctionAdComponents",
       status: "stable",
     },
@@ -2552,6 +2496,7 @@
     },
     {
       name: "InstallOnDeviceSpeechRecognition",
+      status: "experimental",
     },
     {
       name: "InterestGroupsInSharedStorageWorklet",
@@ -2858,7 +2803,12 @@
     },
     {
       name: "MediaStreamTrackWebSpeech",
-      status: "experimental",
+      status: {
+        "Linux": "stable",
+        "Mac": "stable",
+        "Win": "stable",
+        "default": "experimental",
+      },
     },
     {
       name: "MessagePortCloseEvent",
@@ -3059,6 +3009,7 @@
     },
     {
       name: "OnDeviceWebSpeechAvailable",
+      status: "experimental",
     },
     {
       // This flag makes the <option> element's label attribute render the
@@ -3962,6 +3913,8 @@
     {
       // If enabled, the select element will not dispatch a mouseup event when
       // an option is selected using the keyboard.
+      // This should ship in M135, and it can be removed after M137.
+      // http://crbug.com/396611142
       name: "SelectNoMouseUpForKeyboardSelection",
       status: "stable",
     },
@@ -4246,6 +4199,10 @@
       base_feature: "none",
     },
     {
+      name: "SvgAnchorElementRelAttributes",
+      status: "experimental",
+    },
+    {
       name: "SvgContextPaint",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/testing/test_paint_artifact.cc b/third_party/blink/renderer/platform/testing/test_paint_artifact.cc
index de04df9..cf453a48 100644
--- a/third_party/blink/renderer/platform/testing/test_paint_artifact.cc
+++ b/third_party/blink/renderer/platform/testing/test_paint_artifact.cc
@@ -65,14 +65,15 @@
   return RectDrawing(NewClient(), bounds, color);
 }
 
-TestPaintArtifact& TestPaintArtifact::ForeignLayer(
+TestPaintArtifact& TestPaintArtifact::ForeignLayerChunk(
     scoped_refptr<cc::Layer> layer,
-    const gfx::Point& offset) {
+    const gfx::Point& origin) {
   DEFINE_STATIC_DISPLAY_ITEM_CLIENT(client, "ForeignLayer");
+  Chunk().Bounds(gfx::Rect(origin, layer->bounds()));
   paint_artifact_->GetDisplayItemList()
       .AllocateAndConstruct<ForeignLayerDisplayItem>(
           client->Id(), DisplayItem::kForeignLayerFirst, std::move(layer),
-          offset, RasterEffectOutset::kNone,
+          origin, RasterEffectOutset::kNone,
           client->GetPaintInvalidationReason());
   paint_artifact_->RecordDebugInfo(client->Id(), client->DebugName(),
                                    client->OwnerNodeId());
diff --git a/third_party/blink/renderer/platform/testing/test_paint_artifact.h b/third_party/blink/renderer/platform/testing/test_paint_artifact.h
index 90299ed..fe87896 100644
--- a/third_party/blink/renderer/platform/testing/test_paint_artifact.h
+++ b/third_party/blink/renderer/platform/testing/test_paint_artifact.h
@@ -90,8 +90,8 @@
   // automatically created client.
   TestPaintArtifact& RectDrawing(const gfx::Rect& bounds, Color color);
 
-  TestPaintArtifact& ForeignLayer(scoped_refptr<cc::Layer> layer,
-                                  const gfx::Point& offset);
+  TestPaintArtifact& ForeignLayerChunk(scoped_refptr<cc::Layer> layer,
+                                       const gfx::Point& origin);
 
   // Add display item with the specified client in the chunk.
   TestPaintArtifact& RectDrawing(const DisplayItemClient&,
diff --git a/third_party/blink/renderer/platform/timer.cc b/third_party/blink/renderer/platform/timer.cc
index 85513279..54cf08e 100644
--- a/third_party/blink/renderer/platform/timer.cc
+++ b/third_party/blink/renderer/platform/timer.cc
@@ -52,7 +52,7 @@
 }
 
 void TimerBase::Start(base::TimeDelta next_fire_interval,
-                      base::TimeDelta repeat_interval,
+                      std::optional<base::TimeDelta> repeat_interval,
                       const base::Location& caller,
                       bool precise) {
 #if DCHECK_IS_ON()
@@ -73,7 +73,7 @@
   DCHECK_EQ(thread_, CurrentThread());
 #endif
 
-  repeat_interval_ = base::TimeDelta();
+  repeat_interval_ = std::nullopt;
   next_fire_time_ = base::TimeTicks::Max();
   delayed_task_handle_.CancelTask();
 }
@@ -123,7 +123,8 @@
 #if DCHECK_IS_ON()
   DCHECK_EQ(thread_, CurrentThread());
 #endif
-  if (next_fire_time_ != next_fire_time) {
+  if (next_fire_time_ != next_fire_time ||
+      (repeat_interval_ && repeat_interval_->is_zero())) {
     next_fire_time_ = next_fire_time;
 
     // Cancel any previously posted task.
@@ -146,14 +147,19 @@
       << location_.file_name() << " was run on a different thread";
 #endif
 
-  if (!repeat_interval_.is_zero()) {
-    base::TimeTicks now = TimerCurrentTimeTicks();
-    // The next tick is `next_fire_time_ + repeat_interval_`, but if late wakeup
-    // happens we could miss ticks. To avoid posting immediate "catch-up" tasks,
-    // the next task targets the tick following a minimum interval of
-    // repeat_interval_ / 20.
-    SetNextFireTime((now + repeat_interval_ / 20)
-                        .SnappedToNextTick(next_fire_time_, repeat_interval_));
+  if (repeat_interval_) {
+    if (repeat_interval_->is_zero()) {
+      SetNextFireTime(base::TimeTicks());
+    } else {
+      // The next tick is `next_fire_time_ + repeat_interval_`, but if late
+      // wakeup happens we could miss ticks. To avoid posting immediate
+      // "catch-up" tasks, the next task targets the tick following a minimum
+      // interval of repeat_interval_ / 20.
+      base::TimeTicks now = TimerCurrentTimeTicks();
+      SetNextFireTime(
+          (now + *repeat_interval_ / 20)
+              .SnappedToNextTick(next_fire_time_, *repeat_interval_));
+    }
   } else {
     next_fire_time_ = base::TimeTicks::Max();
   }
diff --git a/third_party/blink/renderer/platform/timer.h b/third_party/blink/renderer/platform/timer.h
index d772c79..cbdb423e 100644
--- a/third_party/blink/renderer/platform/timer.h
+++ b/third_party/blink/renderer/platform/timer.h
@@ -26,6 +26,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_TIMER_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_TIMER_H_
 
+#include <optional>
+
 #include "base/check_op.h"
 #include "base/dcheck_is_on.h"
 #include "base/location.h"
@@ -63,7 +65,7 @@
   // If |precise|, the task is scheduled with a precise delay policy to run
   // preferably as close as possible to the specified delay.
   void Start(base::TimeDelta next_fire_interval,
-             base::TimeDelta repeat_interval,
+             std::optional<base::TimeDelta> repeat_interval,
              const base::Location&,
              bool precise = false);
 
@@ -78,7 +80,7 @@
   void StartOneShot(base::TimeDelta interval,
                     const base::Location& caller,
                     bool precise = false) {
-    Start(interval, base::TimeDelta(), caller, precise);
+    Start(interval, std::nullopt, caller, precise);
   }
 
   // Timer cancellation is fast enough that you shouldn't have to worry
@@ -88,12 +90,15 @@
   const base::Location& GetLocation() const { return location_; }
 
   base::TimeDelta NextFireInterval() const;
-  base::TimeDelta RepeatInterval() const { return repeat_interval_; }
+  std::optional<base::TimeDelta> RepeatInterval() const {
+    return repeat_interval_;
+  }
 
   void AugmentRepeatInterval(base::TimeDelta delta) {
     SetNextFireTime(next_fire_time_.is_null() ? TimerCurrentTimeTicks() + delta
                                               : next_fire_time_ + delta);
-    repeat_interval_ += delta;
+    DCHECK(repeat_interval_);
+    *repeat_interval_ += delta;
   }
 
   void MoveToNewTaskRunner(scoped_refptr<base::SingleThreadTaskRunner>);
@@ -117,7 +122,7 @@
 
   base::TimeTicks next_fire_time_ =
       base::TimeTicks::Max();        // Max() if inactive
-  base::TimeDelta repeat_interval_;  // 0 if not repeating
+  std::optional<base::TimeDelta> repeat_interval_;
   base::Location location_;
   scoped_refptr<base::SingleThreadTaskRunner> web_task_runner_;
   // The tick clock used to calculate the run time for scheduled tasks.
diff --git a/third_party/blink/renderer/platform/timer_test.cc b/third_party/blink/renderer/platform/timer_test.cc
index 6fc13ee4c..9245874 100644
--- a/third_party/blink/renderer/platform/timer_test.cc
+++ b/third_party/blink/renderer/platform/timer_test.cc
@@ -467,7 +467,7 @@
   TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
                                    &TimerTest::CountingTask);
 
-  EXPECT_TRUE(timer.RepeatInterval().is_zero());
+  EXPECT_FALSE(timer.RepeatInterval());
 }
 
 TEST_F(TimerTest, RepeatInterval_OneShotZero) {
@@ -475,7 +475,7 @@
                                    &TimerTest::CountingTask);
   timer.StartOneShot(base::TimeDelta(), FROM_HERE);
 
-  EXPECT_TRUE(timer.RepeatInterval().is_zero());
+  EXPECT_FALSE(timer.RepeatInterval());
 }
 
 TEST_F(TimerTest, RepeatInterval_OneShotNonZero) {
@@ -483,7 +483,7 @@
                                    &TimerTest::CountingTask);
   timer.StartOneShot(base::Seconds(10), FROM_HERE);
 
-  EXPECT_TRUE(timer.RepeatInterval().is_zero());
+  EXPECT_FALSE(timer.RepeatInterval());
 }
 
 TEST_F(TimerTest, RepeatInterval_Repeating) {
@@ -491,20 +491,20 @@
                                    &TimerTest::CountingTask);
   timer.StartRepeating(base::Seconds(20), FROM_HERE);
 
-  EXPECT_EQ(base::Seconds(20), timer.RepeatInterval());
+  EXPECT_EQ(base::Seconds(20), *timer.RepeatInterval());
 }
 
 TEST_F(TimerTest, AugmentRepeatInterval) {
   TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
                                    &TimerTest::CountingTask);
   timer.StartRepeating(base::Seconds(10), FROM_HERE);
-  EXPECT_EQ(base::Seconds(10), timer.RepeatInterval());
+  EXPECT_EQ(base::Seconds(10), *timer.RepeatInterval());
   EXPECT_EQ(base::Seconds(10), timer.NextFireInterval());
 
   platform_->AdvanceClock(base::Seconds(2));
   timer.AugmentRepeatInterval(base::Seconds(10));
 
-  EXPECT_EQ(base::Seconds(20), timer.RepeatInterval());
+  EXPECT_EQ(base::Seconds(20), *timer.RepeatInterval());
   EXPECT_EQ(base::Seconds(18), timer.NextFireInterval());
 
   RunUntilDeadline(start_time_ + base::Seconds(50));
@@ -518,13 +518,13 @@
   TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
                                    &TimerTest::CountingTask);
   timer.StartRepeating(base::Seconds(10), FROM_HERE);
-  EXPECT_EQ(base::Seconds(10), timer.RepeatInterval());
+  EXPECT_EQ(base::Seconds(10), *timer.RepeatInterval());
   EXPECT_EQ(base::Seconds(10), timer.NextFireInterval());
 
   platform_->AdvanceClock(base::Seconds(123));  // Make the timer long overdue.
   timer.AugmentRepeatInterval(base::Seconds(10));
 
-  EXPECT_EQ(base::Seconds(20), timer.RepeatInterval());
+  EXPECT_EQ(base::Seconds(20), *timer.RepeatInterval());
   // The timer is overdue so it should be scheduled to fire immediatly.
   EXPECT_TRUE(timer.NextFireInterval().is_zero());
 }
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index 0ec6c81b..f7c44dd 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -614,19 +614,16 @@
   tab_switch_time_recorder_.TabWasHidden();
 }
 
-void WidgetBase::SetupRenderInputRouterConnections(
+void WidgetBase::SetupBrowserRenderInputRouterConnections(
     mojo::PendingReceiver<mojom::blink::RenderInputRouterClient>
-        browser_request,
-    mojo::PendingReceiver<mojom::blink::RenderInputRouterClient> viz_request) {
-  TRACE_EVENT("renderer", "WidgetBase::SetupRenderInputRouterConnections");
+        browser_request) {
+  TRACE_EVENT("renderer",
+              "WidgetBase::SetupBrowserRenderInputRouterConnections");
 
   // TODO(b/322833330): Investigate binding |browser_input_receiver_| on
   // RendererCompositor to break dependency on CrRendererMain and avoiding
   // contention with javascript during method calls.
   browser_input_receiver_.Bind(std::move(browser_request), task_runner_);
-  if (viz_request) {
-    viz_input_receiver_.Bind(std::move(viz_request), task_runner_);
-  }
 }
 
 void WidgetBase::ApplyViewportChanges(
@@ -813,9 +810,13 @@
     return;
   }
 
+  viz_input_receiver_.reset();
+
   if (Platform::Current()->IsGpuCompositingDisabled()) {
-    widget_host_->CreateFrameSink(std::move(compositor_frame_sink_receiver),
-                                  std::move(compositor_frame_sink_client));
+    widget_host_->CreateFrameSink(
+        std::move(compositor_frame_sink_receiver),
+        std::move(compositor_frame_sink_client),
+        viz_input_receiver_.BindNewPipeAndPassRemote(task_runner_));
     widget_host_->RegisterRenderFrameMetadataObserver(
         std::move(render_frame_metadata_observer_client_receiver),
         std::move(render_frame_metadata_observer_remote));
@@ -885,8 +886,10 @@
       !is_embedded_) {
     // TODO(ericrk): Collapse with non-webview registration below.
     if (::features::IsUsingVizFrameSubmissionForWebView()) {
-      widget_host_->CreateFrameSink(std::move(compositor_frame_sink_receiver),
-                                    std::move(compositor_frame_sink_client));
+      widget_host_->CreateFrameSink(
+          std::move(compositor_frame_sink_receiver),
+          std::move(compositor_frame_sink_client),
+          viz_input_receiver_.BindNewPipeAndPassRemote(task_runner_));
     }
     widget_host_->RegisterRenderFrameMetadataObserver(
         std::move(render_frame_metadata_observer_client_receiver),
@@ -910,8 +913,10 @@
     return;
   }
 #endif
-  widget_host_->CreateFrameSink(std::move(compositor_frame_sink_receiver),
-                                std::move(compositor_frame_sink_client));
+  widget_host_->CreateFrameSink(
+      std::move(compositor_frame_sink_receiver),
+      std::move(compositor_frame_sink_client),
+      viz_input_receiver_.BindNewPipeAndPassRemote(task_runner_));
   widget_host_->RegisterRenderFrameMetadataObserver(
       std::move(render_frame_metadata_observer_client_receiver),
       std::move(render_frame_metadata_observer_remote));
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h
index 98546d3a..1ef6340 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.h
+++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -166,11 +166,9 @@
       mojom::blink::RecordContentToVisibleTimeRequestPtr visible_time_request)
       override;
   void CancelSuccessfulPresentationTimeRequest() override;
-  void SetupRenderInputRouterConnections(
+  void SetupBrowserRenderInputRouterConnections(
       mojo::PendingReceiver<mojom::blink::RenderInputRouterClient>
-          browser_request,
-      mojo::PendingReceiver<mojom::blink::RenderInputRouterClient> viz_request)
-      override;
+          browser_request) override;
 
   // LayerTreeViewDelegate overrides:
   // Applies viewport related properties during a commit from the compositor
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 604ab2d7..b81d2110 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -380,16 +380,20 @@
     },
     {
         'paths': [
-            'third_party/blink/common/interest_group/interest_group.cc',
-            'third_party/blink/public/common/interest_group/interest_group.h'
+            'third_party/blink/common/interest_group/',
+            'third_party/blink/public/common/interest_group/',
         ],
         'allowed': [
             # For hashing of k-anonymity keys
             'crypto::SHA256HashString',
 
-            # Types used to compute k-anonymity keys.
+            # Types used to compute k-anonymity keys, also many IG fields are
+            # origins and URLs.
             "url::Origin",
             "GURL",
+
+            # For checking if origins in interest group are https.
+            "url::kHttpsScheme",
         ],
     },
     {
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/factory.py b/third_party/blink/tools/blinkpy/web_tests/port/factory.py
index 0eeb715..19dbdff 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/factory.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/factory.py
@@ -366,6 +366,11 @@
                 'virtual tests, reset the virtual baselines. If '
                 '--flag-specific is specified, reset the flag-specific '
                 'baselines.'))
+        results_group.add_argument(
+            '--no-expectations',
+            action='store_true',
+            help=('Do not use TestExpectations. All the results will be '
+                  'reported as expected.'))
 
 
 def add_testing_options_group(parser: argparse.ArgumentParser,
diff --git a/third_party/blink/tools/blinkpy/wpt_tests/test_loader.py b/third_party/blink/tools/blinkpy/wpt_tests/test_loader.py
index cba461a..8048ab7e 100644
--- a/third_party/blink/tools/blinkpy/wpt_tests/test_loader.py
+++ b/third_party/blink/tools/blinkpy/wpt_tests/test_loader.py
@@ -135,7 +135,6 @@
                 test_name = f'virtual/{virtual_suite}/{test_name}'
             assert not test_type or test_type == item.item_type, item
             test_type = item.item_type
-            exp_line = self._expectations.get_expectations(test_name)
             expected_text = self._port.expected_text(test_name)
             if expected_text:
                 testharness_lines = parse_testharness_baseline(
@@ -143,7 +142,11 @@
             else:
                 testharness_lines = []
 
-            if exp_line.results == {ResultType.Pass} and not testharness_lines:
+            exp_line = self._expectations.get_expectations(test_name)
+            # Do not create test metadata when there is no baseline and test is
+            # expected to pass or run with no test expectations.
+            if (self._port.get_option('no_expectations') or exp_line.results
+                    == {ResultType.Pass}) and not testharness_lines:
                 continue
             test_file_ast.append(
                 self._build_test_ast(item.item_type, exp_line,
@@ -165,8 +168,12 @@
         exp_line: ExpectationType,
         testharness_lines: List[TestharnessLine],
     ) -> wptnode.DataNode:
+        # Use the default result 'Pass' when run with --no-expectations
+        exp_results = ({
+            ResultType.Pass
+        } if self._port.get_option('no_expectations') else exp_line.results)
         test_statuses = chromium_to_wptrunner_statuses(
-            exp_line.results - {ResultType.Skip}, test_type)
+            exp_results - {ResultType.Skip}, test_type)
         harness_errors = {
             line
             for line in testharness_lines
@@ -176,7 +183,7 @@
             # Temporarily expect PASS so that unexpected passes don't contribute
             # to retries or build failures.
             test_statuses.add(Status.PASS.name)
-        elif ResultType.Failure in exp_line.results or not harness_errors:
+        elif ResultType.Failure in exp_results or not harness_errors:
             # Add `OK` for `[ Failure ]` lines or no explicit harness error in
             # the baseline.
             test_statuses.update(
@@ -197,7 +204,7 @@
         # If `[ Failure ]` is expected, the baseline is allowed to be anything.
         # To mimic this, skip creating any explicit subtests, and rely on
         # implicit subtest creation.
-        if ResultType.Failure in exp_line.results:
+        if ResultType.Failure in exp_results:
             expect_any = wptnode.KeyValueNode('expect_any_subtests')
             expect_any.append(wptnode.AtomNode(True))
             test_ast.append(expect_any)
diff --git a/third_party/blink/tools/blinkpy/wpt_tests/test_loader_unittest.py b/third_party/blink/tools/blinkpy/wpt_tests/test_loader_unittest.py
index 8a8e4ec..9ee1000 100644
--- a/third_party/blink/tools/blinkpy/wpt_tests/test_loader_unittest.py
+++ b/third_party/blink/tools/blinkpy/wpt_tests/test_loader_unittest.py
@@ -59,6 +59,7 @@
     @contextlib.contextmanager
     def _make_loader(self, **kwargs):
         port = self.host.port_factory.get('test-linux-trusty')
+        port.set_option_default('no_expectations', False)
         with self.fs.patch_builtins():
             manifest = load_and_update(
                 self.finder.path_from_wpt_tests(),
diff --git a/third_party/blink/tools/blinkpy/wpt_tests/wpt_adapter.py b/third_party/blink/tools/blinkpy/wpt_tests/wpt_adapter.py
index 6703d17..52dba37 100644
--- a/third_party/blink/tools/blinkpy/wpt_tests/wpt_adapter.py
+++ b/third_party/blink/tools/blinkpy/wpt_tests/wpt_adapter.py
@@ -158,7 +158,7 @@
                   port_name: Optional[str] = None):
         options, tests = parse_arguments(args)
         cls._ensure_value(options, 'wpt_only', True)
-        # only run virtual tests for headless shell
+        # Do not run virtual tests for mobile embedders
         cls._ensure_value(options, 'no_virtual_tests', options.product
                           not in ['headless_shell', 'chrome'])
 
@@ -168,7 +168,9 @@
         env_total_shards = host.environ.get('GTEST_TOTAL_SHARDS')
         if env_total_shards is not None:
             cls._ensure_value(options, 'total_shards', int(env_total_shards))
-
+        if options.use_upstream_wpt:
+            # do not use expectations when run with upstream WPT
+            options.no_expectations = True
         if options.product in cls.PORT_NAME_BY_PRODUCT:
             port_name = cls.PORT_NAME_BY_PRODUCT[options.product]
         port = host.port_factory.get(port_name, options)
@@ -730,10 +732,6 @@
     params = vars(parser.parse_args(argv))
     args = params.pop('tests')
     options = optparse.Values(params)
-    # Parameter needed by `WebTestFinder`. TODO(crbug.com/1426296): Port
-    # `--no-expectations` to `run_wpt_tests.py`, and skip reporting results when
-    # the flag is passed.
-    options.no_expectations = False
     return options, args
 
 
diff --git a/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor.py b/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor.py
index 1423124..649147d 100644
--- a/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor.py
+++ b/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor.py
@@ -157,6 +157,7 @@
                  test_type: Optional[str] = None,
                  exp_line: Optional[ExpectationType] = None,
                  baseline: Optional[List[TestharnessLine]] = None,
+                 no_expectations: bool = False,
                  **kwargs):
         kwargs.setdefault('expected', exp_line.results)
         super().__init__(*args, **kwargs)
@@ -165,6 +166,7 @@
         self._exp_line = exp_line or Expectation()
         self._baseline = baseline or []
         self.image_diff_stats = None
+        self.no_expectations = no_expectations
         # TODO(crbug.com/41494889): Populate `self.failure_reason` like
         # `run_web_tests.py` does to help LUCI cluster failures.
 
@@ -213,6 +215,9 @@
                 self.actual = ResultType.Pass
             else:
                 self.actual = ResultType.Failure
+        # When run with --no-expectations, all results are expected
+        if self.no_expectations:
+            self.expected = self.actual
         self.unexpected = self.actual not in self.expected
         self.is_regression = self.actual != ResultType.Pass and self.unexpected
 
@@ -636,7 +641,8 @@
             file_path=self._file_path_for_test(test),
             test_type=self.get_test_type(test),
             exp_line=self._expectations.get_expectations(test),
-            baseline=baseline)
+            baseline=baseline,
+            no_expectations=self.port.get_option('no_expectations'))
 
     def get_path_from_test_root(self, test: str) -> str:
         wpt_dir, url_from_wpt_dir = self.port.split_wpt_dir(test)
diff --git a/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor_unittest.py b/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor_unittest.py
index c9bc33a..7237bdc1 100644
--- a/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor_unittest.py
+++ b/third_party/blink/tools/blinkpy/wpt_tests/wpt_results_processor_unittest.py
@@ -35,6 +35,7 @@
         port.set_option_default('manifest_update', False)
         port.set_option_default('product', 'chrome')
         port.set_option_default('test_types', typing.get_args(TestType))
+        port.set_option_default('no_expectations', False)
 
         # Create a testing manifest containing any test files that we
         # might interact with.
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-skia-graphite b/third_party/blink/web_tests/FlagExpectations/enable-skia-graphite
index ecf6dff..98e9935 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-skia-graphite
+++ b/third_party/blink/web_tests/FlagExpectations/enable-skia-graphite
@@ -22,5 +22,5 @@
 # finder:enable-general
 
 # ====== New tests from wpt-importer added here ======
-external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
+crbug.com/397523920 external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
 crbug.com/396958489 external/wpt/trusted-types/set-attributes-mutations-in-callback.tentative.html [ Crash ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 36dbc64..faa8ff56 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -1333,12 +1333,12 @@
 crbug.com/1404951 [ Mac13 Release ] external/wpt/fedcm/fedcm-iframe.https.html [ Slow ]
 crbug.com/1404951 [ Release Win ] external/wpt/fedcm/fedcm-iframe.https.html [ Slow ]
 crbug.com/1494119 external/wpt/fedcm/fedcm-login-status/confirm-idp-login.https.html [ Slow ]
-crbug.com/1489239 [ Debug Mac13-arm64 ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
-crbug.com/1489239 [ Linux ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
-crbug.com/1489239 [ Mac11 Release ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
-crbug.com/1489239 [ Mac12 Release ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
-crbug.com/1489239 [ Mac13 ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
-crbug.com/1489239 [ Release Win ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
+crbug.com/1489239 [ Debug Mac13-arm64 ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
+crbug.com/1489239 [ Linux ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
+crbug.com/1489239 [ Mac11 Release ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
+crbug.com/1489239 [ Mac12 Release ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
+crbug.com/1489239 [ Mac13 ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
+crbug.com/1489239 [ Release Win ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on.https.html [ Slow ]
 
 # Slow because it contains thousands of subtests
 crbug.com/1423483 [ Linux ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index e0f9a33b..205b8df 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -103,6 +103,9 @@
 
 crbug.com/807686 crbug.com/24182 jquery/manipulation.html [ Pass Timeout ]
 
+# Temporarily disable these tests, due to an API change
+crbug.com/397449611 external/wpt/wasm/jsapi/jspi/* [ Failure Pass ]
+
 # The following tests need to remove the assumption that user activation is
 # available in child/sibling frames.  This assumption doesn't hold with User
 # Activation v2 (UAv2).
@@ -326,8 +329,6 @@
 # View transition failures
 crbug.com/1351556 virtual/threaded/view-transition/capture-callback-exception.html [ Failure ]
 crbug.com/1351556 virtual/view-transition-wide-gamut/view-transition/capture-callback-exception.html [ Failure ]
-crbug.com/1412910 [ Mac ] virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html [ Failure ]
-crbug.com/1412910 [ Mac ] virtual/threaded/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html [ Failure ]
 crbug.com/1430357 [ Mac ] virtual/threaded/external/wpt/css/css-view-transitions/massive-element-* [ Failure Pass ]
 crbug.com/1430357 [ Mac ] virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/massive-element-* [ Failure Pass ]
 crbug.com/40283765 [ Mac ] virtual/threaded/external/wpt/css/css-view-transitions/navigation/transition-to-prerender.html [ Failure ]
@@ -348,9 +349,6 @@
 crbug.com/373759981 virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/layered-capture/* [ Failure Skip ]
 crbug.com/373759981 virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/layered-capture/* [ Failure Skip ]
 
-# View transition SPA failures with MPA serialization.
-crbug.com/1443559 [ Mac ] virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html [ Failure ]
-
 # Flaky on Mac
 crbug.com/40946176 [ Mac ] virtual/threaded/external/wpt/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html [ Failure Pass ]
 crbug.com/40946176 [ Mac ] virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html [ Failure Pass ]
@@ -2649,20 +2647,20 @@
 [ Linux ] external/wpt/webdriver/tests/bidi/network/continue_response/cookies.py [ Pass Timeout ]
 
 # ====== New tests from wpt-importer added here ======
-[ Mac13 ] external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html?5-6 [ Crash ]
+crbug.com/397500917 [ Mac13 ] external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html?5-6 [ Crash ]
 [ Mac12-arm64 ] external/wpt/notifications/tag.https.html [ Crash Failure ]
 [ Mac11-arm64 ] external/wpt/notifications/tag.https.html [ Crash Failure ]
-[ Win10.20h2 ] external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
-[ Mac14 ] external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
-[ Linux ] external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
-[ Mac15-arm64 ] external/wpt/webrtc-encoded-transform/tentative/RTCEncodedFrame-timestamps.html [ Timeout ]
-[ Mac15 ] external/wpt/webrtc-encoded-transform/tentative/RTCEncodedFrame-timestamps.html [ Timeout ]
-virtual/threaded/external/wpt/css/css-view-transitions/window-resize-aborts-transition-before-ready.html [ Timeout ]
-virtual/threaded/external/wpt/css/css-view-transitions/window-resize-aborts-transition.html [ Timeout ]
-virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/window-resize-aborts-transition-before-ready.html [ Timeout ]
-virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/window-resize-aborts-transition.html [ Timeout ]
-virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/window-resize-aborts-transition-before-ready.html [ Timeout ]
-virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/window-resize-aborts-transition.html [ Timeout ]
+crbug.com/397523920 [ Win10.20h2 ] external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
+crbug.com/397523920 [ Mac14 ] external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
+crbug.com/397523920 [ Linux ] external/wpt/trusted-types/modify-attributes-in-callback.html [ Crash ]
+crbug.com/397483597 [ Mac15-arm64 ] external/wpt/webrtc-encoded-transform/tentative/RTCEncodedFrame-timestamps.html [ Timeout ]
+crbug.com/397483597 [ Mac15 ] external/wpt/webrtc-encoded-transform/tentative/RTCEncodedFrame-timestamps.html [ Timeout ]
+crbug.com/397483598 virtual/threaded/external/wpt/css/css-view-transitions/window-resize-aborts-transition-before-ready.html [ Timeout ]
+crbug.com/397483598 virtual/threaded/external/wpt/css/css-view-transitions/window-resize-aborts-transition.html [ Timeout ]
+crbug.com/397483598 virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/window-resize-aborts-transition-before-ready.html [ Timeout ]
+crbug.com/397483598 virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/window-resize-aborts-transition.html [ Timeout ]
+crbug.com/397483598 virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/window-resize-aborts-transition-before-ready.html [ Timeout ]
+crbug.com/397483598 virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/window-resize-aborts-transition.html [ Timeout ]
 crbug.com/397150490 external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html [ Failure Timeout ]
 crbug.com/396958489 [ Win10.20h2 ] external/wpt/trusted-types/set-attributes-mutations-in-callback.tentative.html [ Crash ]
 crbug.com/396958489 [ Mac14 ] external/wpt/trusted-types/set-attributes-mutations-in-callback.tentative.html [ Crash ]
@@ -2688,7 +2686,7 @@
 crbug.com/394920629 [ Mac14 ] external/wpt/css/css-pseudo/active-selection-021.html [ Failure ]
 crbug.com/394920629 [ Mac15 ] external/wpt/css/css-pseudo/active-selection-021.html [ Failure ]
 crbug.com/394932379 [ Mac12 ] external/wpt/html/cross-origin-opener-policy/popup-with-structured-header.https.html [ Crash ]
-crbug.com/394656809 [ Mac13 ] external/wpt/css/css-overflow/scroll-marker-group-keeps-active-in-view.html [ Failure ]
+crbug.com/394656809 [ Mac ] external/wpt/css/css-overflow/scroll-marker-group-keeps-active-in-view.html [ Failure ]
 crbug.com/394331189 [ Mac15 ] external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html?7-8 [ Crash Failure ]
 crbug.com/394331189 [ Mac13 ] external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html [ Crash ]
 crbug.com/393523568 external/wpt/css/css-text/line-breaking/segment-break-transformation-currency-001.html [ Failure ]
@@ -2745,8 +2743,9 @@
 crbug.com/388319477 [ Mac13 ] external/wpt/css/css-page/margin-boxes/dimensions-008-print.html [ Crash ]
 crbug.com/388319477 [ Win ] external/wpt/css/css-page/margin-boxes/dimensions-008-print.html [ Crash ]
 crbug.com/388345823 [ Win ] external/wpt/fetch/api/credentials/cookies.any.sharedworker.html [ Crash ]
-crbug.com/388326073 [ Mac14 ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-disclosure-text-shown.https.html [ Crash ]
-crbug.com/388326073 [ Win ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-disclosure-text-shown.https.html [ Crash ]
+crbug.com/388326073 [ Mac14 ] external/wpt/fedcm/fedcm-authz/fedcm-disclosure-text-shown.https.html [ Crash ]
+crbug.com/388326073 [ Win ] external/wpt/fedcm/fedcm-authz/fedcm-disclosure-text-shown.https.html [ Crash ]
+crbug.com/41482163 [ Linux ] external/wpt/fedcm/fedcm-authz/fedcm-continue-on-with-account.https.html [ Timeout ]
 [ Linux ] virtual/fenced-frame-mparch-internal/wpt_internal/fenced_frame/revoke-manual-report-event-beacons.https.html [ Crash ]
 [ Win ] virtual/fenced-frame-mparch-internal/wpt_internal/fenced_frame/revoke-manual-report-event-beacons.https.html [ Crash ]
 [ Mac14 ] virtual/keepalive-in-browser-migration/external/wpt/background-fetch/abort.https.window.html [ Crash Timeout ]
@@ -2803,7 +2802,7 @@
 crbug.com/385918134 [ Linux ] external/wpt/wasm/core/memory_trap.wast.js.html [ Crash ]
 crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_address.wast.js.html [ Crash ]
 crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_f32x4_pmin_pmax.wast.js.htm [ Crash Pass ]
-crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_f64x2_pmin_pmax.wast.js.htm [ Crash Pass ]
+crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_f64x2_pmin_pmax.wast.js.htm [ Crash Pass Timeout ]
 crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_load_extend.wast.js.html [ Crash ]
 crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_load_splat.wast.js.html [ Crash ]
 crbug.com/385918134 [ Linux ] external/wpt/wasm/core/simd/simd_load_zero.wast.js.html [ Crash ]
@@ -3372,7 +3371,7 @@
 crbug.com/626703 virtual/threaded/external/wpt/css/css-view-transitions/no-white-flash-before-activation.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-values/viewport-units-scrollbars-auto-vhw-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-values/viewport-units-scrollbars-scroll-vhw-001.html [ Failure ]
-crbug.com/626703 [ Win11-arm64 ] virtual/fedcm-button-and-other-account/external/wpt/fedcm/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html [ Timeout ]
+crbug.com/626703 [ Win11-arm64 ] external/wpt/fedcm/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html [ Timeout ]
 crbug.com/626703 [ Win11-arm64 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/default-enabled-features-attribution-disabled.https.html [ Timeout ]
 crbug.com/626703 [ Win11-arm64 ] virtual/shared-storage-fenced-frame-mparch/external/wpt/shared-storage/embedder-context.tentative.https.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-transforms/transform-box/svgbox-stroke-box-005.html [ Failure ]
@@ -3447,10 +3446,8 @@
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-003.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-004.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-005.html [ Failure ]
-crbug.com/626703 external/wpt/css/compositing/root-element-background-image-transparency-001.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/compositing/root-element-background-image-transparency-002.html [ Failure ]
-crbug.com/626703 external/wpt/css/compositing/root-element-background-image-transparency-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/compositing/root-element-background-image-transparency-004.html [ Failure ]
+crbug.com/397737220 [ Mac ] external/wpt/css/compositing/root-element-background-image-transparency-002.html [ Failure ]
+crbug.com/397737220 [ Mac ] external/wpt/css/compositing/root-element-background-image-transparency-004.html [ Failure ]
 crbug.com/626703 [ Win11 ] external/wpt/fetch/orb/tentative/known-mime-type.sub.any.html [ Failure Timeout ]
 crbug.com/626703 [ Win ] external/wpt/background-fetch/fetch.https.window.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-shadow-parts/animation-part.html [ Failure ]
@@ -6990,7 +6987,7 @@
 
 crbug.com/1480054 [ Win ] external/wpt/fedcm/fedcm-loginhint.https.html [ Pass Timeout ]
 
-crbug.com/328129675 virtual/fedcm-button-and-other-account/external/wpt/fedcm/fedcm-button-and-other-account/fedcm-button-mode-priority.tentative.https.html [ Pass Timeout ]
+crbug.com/328129675 external/wpt/fedcm/fedcm-button-and-other-account/fedcm-button-mode-priority.tentative.https.html [ Pass Timeout ]
 
 # We skip these tests in the base test suite in NeverFixTests, but we do want
 # to run them in the virtual test suite.
@@ -7063,9 +7060,6 @@
 # Sheriff 2022-12-07
 crbug.com/1396185 accessibility/reach-and-scroll-overflow-div-without-mouse.html [ Pass Timeout ]
 
-# Should pass when SetIntervalWithoutClamp is turned on.
-crbug.com/6240888 external/wpt/html/webappapis/timers/setinterval-settimeout-clamping.html [ Failure ]
-
 # TODO(crbug.com/1401396): Re-enable this test
 external/wpt/webrtc/simulcast/setParameters-active.https.html [ Pass Timeout ]
 
@@ -7706,7 +7700,7 @@
 crbug.com/326065568 [ Win11-arm64 ] external/wpt/fedcm/fedcm-disconnect-iframe.sub.https.html [ Failure Pass Timeout ] # Flaky
 crbug.com/326065727 [ Win11-arm64 ] external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.html [ Failure Pass Timeout ] # Flaky
 crbug.com/326065972 [ Win11-arm64 ] external/wpt/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams-video.https.html [ Failure Pass Timeout ] # Flaky
-crbug.com/326067001 [ Win11-arm64 ] virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-userinfo-after-resolve.https.html [ Failure Pass Timeout ] # Flaky
+crbug.com/326067001 [ Win11-arm64 ] external/wpt/fedcm/fedcm-authz/fedcm-userinfo-after-resolve.https.html [ Failure Pass Timeout ] # Flaky
 crbug.com/326067598 [ Win11-arm64 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/set-automatic-beacon.https.html [ Failure Pass Timeout ] # Flaky
 crbug.com/326066872 [ Win11-arm64 ] virtual/prefetch-reusable/external/wpt/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https.html?prefetch=true [ Failure Pass Timeout ] # Flaky
 crbug.com/326066872 [ Win11-arm64 ] virtual/prefetch-new-wait-loop/external/wpt/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https.html?prefetch=true [ Failure Pass Timeout ] # Flaky
@@ -8869,12 +8863,6 @@
 
 # Gardener 2024-10-31
 crbug.com/376589790 [ Win11-arm64 ] fast/js/toString-stack-overflow.html [ Failure Pass ]
-crbug.com/376491758 external/wpt/largest-contentful-paint/first-letter-background.html [ Failure Pass ]
-crbug.com/376491758 external/wpt/largest-contentful-paint/observe-css-generated-text.html [ Failure Pass ]
-crbug.com/376491758 external/wpt/largest-contentful-paint/text-with-display-style.html [ Failure Pass ]
-crbug.com/376491758 virtual/scalefactor200/external/wpt/largest-contentful-paint/first-letter-background.html [ Failure Pass ]
-crbug.com/376491758 virtual/scalefactor200/external/wpt/largest-contentful-paint/observe-css-generated-text.html [ Failure Pass ]
-crbug.com/376491758 virtual/scalefactor200/external/wpt/largest-contentful-paint/text-with-display-style.html [ Failure Pass ]
 
 # Flaky Test Disable 2024-10-31
 crbug.com/376675482 virtual/shared-storage-fenced-frame-mparch/external/wpt/shared-storage/shared-storage-writable-permissions-policy-default.tentative.https.sub.html [ Failure Pass ]
@@ -8954,7 +8942,7 @@
 
 # Gardener 2024-11-21
 crbug.com/380323589 [ Win11 ] external/wpt/pointerevents/pointerevent_sequence_at_implicit_release_on_drag.html [ Failure Pass Timeout ]
-crbug.com/380327348 [ Mac ] media/encrypted-media/encrypted-media-async-creation-with-gc.html [ Crash Failure Pass ]
+crbug.com/380327348 media/encrypted-media/encrypted-media-async-creation-with-gc.html [ Crash Failure Pass ]
 crbug.com/380327348 [ Mac ] media/encrypted-media/encrypted-media-async-setcert-with-gc.html [ Crash Failure Pass ]
 
 # This test will [PRECONDITION_FAILED] on some bots and not others based on its HW capabilities, skip the test on such bots.
@@ -9125,3 +9113,6 @@
 
 #Gardener 2025-12-14
 crbug.com/41378979 [ Mac ] external/wpt/client-hints/viewport-size/viewport-size-subresource.https.html [ Failure Pass ]
+
+#Gardener 2025-02-19
+crbug.com/396687592 [ Mac ] external/wpt/workers/interfaces/WorkerUtils/importScripts/report-error-same-origin.sub.any.worker.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/TestLists/content_shell.filter b/third_party/blink/web_tests/TestLists/content_shell.filter
index 517dfa6e..468667b 100644
--- a/third_party/blink/web_tests/TestLists/content_shell.filter
+++ b/third_party/blink/web_tests/TestLists/content_shell.filter
@@ -490,6 +490,7 @@
 external/wpt/css/selectors/user-invalid-form-submission-invalidation.html
 external/wpt/density-size-correction/density-corrected-image-in-canvas.html
 external/wpt/dom/events/scrolling/input-text-scroll-event-when-using-arrow-keys.html
+external/wpt/dom/events/scrolling/scrollend-event-fired-after-snap.html
 external/wpt/dom/events/scrolling/scrollend-event-fires-on-visual-viewport.html
 external/wpt/dom/events/scrolling/scrollend-event-fires-to-iframe-window.html
 external/wpt/dom/events/scrolling/wheel-event-transactions-basic.html?include=scroll-over-scrollable-child
@@ -943,8 +944,6 @@
 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/webkit-line-clamp-025.html
 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/webkit-line-clamp-036.html
 virtual/document-isolation-policy/external/wpt/html/document-isolation-policy/shared-workers.tentative.https.html
-virtual/fedcm-authz/external/wpt/fedcm/fedcm-authz/fedcm-disclosure-text-shown.https.html
-virtual/fedcm-button-and-other-account/external/wpt/fedcm/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html
 virtual/fedcm-multi-idp/external/wpt/fedcm/fedcm-multi-idp/fedcm-multi-idp-mediation-optional.https.html
 virtual/fedcm-multi-idp/external/wpt/fedcm/fedcm-multi-idp/fedcm-multi-idp-mediation-silent.https.html
 virtual/fedcm-register/external/wpt/fedcm/fedcm-register/fedcm-no-registered-idps.https.html
diff --git a/third_party/blink/web_tests/TestLists/translator.filter b/third_party/blink/web_tests/TestLists/translator.filter
new file mode 100644
index 0000000..84361540
--- /dev/null
+++ b/third_party/blink/web_tests/TestLists/translator.filter
@@ -0,0 +1,2 @@
+# The subset of tests from blink_wpt_tests suite to run on translator builders.
+external/wpt/ai/translator/*
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index cb880e3..10d126a 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1856,24 +1856,6 @@
     "expires": "Jul 1, 2025"
   },
   {
-    "prefix": "fedcm-authz",
-    "platforms": ["Linux", "Mac", "Win"],
-    "bases": ["external/wpt/fedcm/fedcm-authz/"],
-    "exclusive_tests": "ALL",
-    "args": ["--enable-features=FedCmAuthz"],
-    "owners": ["cbiesinger@chromium.org", "goto@chromium.org"],
-    "expires": "May 1, 2025"
-  },
-  {
-    "prefix": "fedcm-button-and-other-account",
-    "platforms": ["Linux", "Mac", "Win"],
-    "bases": ["external/wpt/fedcm/fedcm-button-and-other-account/"],
-    "exclusive_tests": "ALL",
-    "args": ["--enable-features=FedCmUseOtherAccount,FedCmButtonMode"],
-    "owners": ["cbiesinger@chromium.org", "yigu@chromium.org"],
-    "expires": "May 1, 2025"
-  },
-  {
     "prefix": "fedcm-multi-idp",
     "owners": ["npm@chromium.org", "web-identity-eng@google.com"],
     "platforms": ["Linux", "Mac", "Win"],
@@ -2150,7 +2132,7 @@
     "bases": ["external/wpt/html/semantics/permission-element"],
     "args": ["--enable-blink-features=PermissionElement"],
     "owners": ["permissions-core@google.com"],
-    "expires": "Feb 1, 2025"
+    "expires": "Jul 1, 2025"
   },
   {
     "prefix": "permission-element-disabled",
@@ -2158,7 +2140,7 @@
     "bases": [],
     "args": ["--disable-blink-features=PermissionElement"],
     "owners": ["permissions-core@google.com"],
-    "expires": "Feb 1, 2025"
+    "expires": "Jul 1, 2025"
   },
   "The GenericSensorExtraClasses feature is controlled by a flag, which has ",
   "an expiration date. |expires| below is set to 'never' to avoid having to ",
@@ -3237,8 +3219,7 @@
       "external/wpt/screen-details/getScreenDetails.tentative.https.window.js",
       "wpt_internal/geolocation-api/disconnected-frame-permission-denied.https.html",
       "wpt_internal/geolocation-api/disconnected-frame.https.html",
-      "wpt_internal/presentation/presentation-receiver-terminate-connection.https.html",
-      "wpt_internal/speech/scripted/speechrecognition-no-crash-detached.html"
+      "wpt_internal/presentation/presentation-receiver-terminate-connection.https.html"
      ],
     "args": ["--disable-features=DeprecateUnload"],
     "expires": "Jun 1, 2025",
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-deleteDatabase-request-success.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-deleteDatabase-request-success.any.js
new file mode 100644
index 0000000..0aa1543baa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-deleteDatabase-request-success.any.js
@@ -0,0 +1,22 @@
+// META: title=IDBFactory deleteDatabase()
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbfactory-deleteDatabase
+
+'use strict';
+
+async_test(t => {
+  const dbname = self.location + '-' + t.name;
+  const rq = indexedDB.deleteDatabase(dbname);
+  rq.onerror = t.unreached_func('deleteDatabase should succeed');
+  rq.onsuccess = t.step_func(() => {
+    assert_equals(
+        rq.readyState, 'done', 'request done flag should be set on success');
+    assert_equals(
+        rq.result, undefined,
+        'request result should be undefined on success');
+    assert_equals(rq.error, null, 'request error should be null on success');
+    t.done();
+  });
+}, 'IDBFactory deleteDatabase() request properties on success');
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-deleteDatabase-request-success.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-deleteDatabase-request-success.html
deleted file mode 100644
index 130c427a..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-deleteDatabase-request-success.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBFactory deleteDatabase(): request properties on success</title>
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbfactory-deleteDatabase">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=resources/support.js></script>
-<script>
-
-async_test(t => {
-  const dbname = document.location + '-' + t.name;
-  const rq = indexedDB.deleteDatabase(dbname);
-  rq.onerror = t.unreached_func('deleteDatabase should succeed');
-  rq.onsuccess = t.step_func(() => {
-    assert_equals(
-      rq.readyState, 'done',
-      'request done flag should be set on success');
-    assert_equals(
-      rq.result, undefined,
-      'request result should still be set to undefined on success');
-    assert_equals(
-      rq.error, null,
-      'request error should be null on success');
-    t.done();
-  });
-}, 'Properties of IDBOpenDBRequest during IDBFactory deleteDatabase()');
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-error-properties.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-error-properties.any.js
similarity index 60%
rename from third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-error-properties.html
rename to third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-error-properties.any.js
index c4bc3ff..d216e2a 100644
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-error-properties.html
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-error-properties.any.js
@@ -1,14 +1,13 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>IndexedDB: Test IDBFactory open() error event properties</title>
-<meta name=help href="https://w3c.github.io/IndexedDB/#dom-idbfactory-open">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-<script>
+// META: title=IndexedDB: Test IDBFactory open() error event properties
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbfactory-open
+
+'use strict';
 
 async_test(t => {
-  const dbname = document.location + '-' + t.name;
+  const dbname = self.location + '-' + t.name;
   indexedDB.deleteDatabase(dbname);
   const open = indexedDB.open(dbname);
   open.onsuccess = t.unreached_func('open should not succeed');
@@ -24,5 +23,3 @@
     t.done();
   });
 }, 'Properties of error event from failed open()');
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-error.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-error.any.js
new file mode 100644
index 0000000..d96c4717
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-error.any.js
@@ -0,0 +1,61 @@
+// META: title=IDBFactory open(): request properties on error
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbfactory-open
+
+'use strict';
+
+let saw_abort = false;
+
+indexeddb_test(
+    (t, db, tx, rq) => {
+      const store = db.createObjectStore('store');
+      store.put({name: 'a'}, 1);
+      store.put({name: 'a'}, 2);
+      store.createIndex('index', 'name', {unique: true});
+
+      assert_equals(
+          rq.readyState, 'done',
+          'request done flag should be set during upgradeneeded');
+      assert_equals(
+          rq.result, db,
+          'request result should be set (to connection) during upgradeneeded');
+      assert_equals(
+          rq.error, null, 'request result should be null during upgradeneeded');
+
+      tx.oncomplete = t.unreached_func('transaction should abort');
+      tx.onabort = t.step_func(() => {
+        saw_abort = true;
+
+        assert_equals(
+            rq.readyState, 'done',
+            'request done flag should still be set during abort');
+
+        // Chrome is flaky here. See: https://crbug.com/723846
+        /*
+        assert_equals(
+          rq.result, db,
+          'request result should still be set (to connection) during abort');
+        assert_equals(
+          rq.error, null,
+          'request result should still be null during abort');
+        */
+      });
+
+      rq.onerror = t.step_func(() => {
+        assert_true(saw_abort, 'abort event should fire before error');
+        assert_equals(
+            rq.readyState, 'done', 'request done flag should be set on error');
+        assert_equals(
+            rq.result, undefined,
+            'request result should be undefined on error');
+        assert_equals(
+            rq.error.name, 'AbortError',
+            'request error should be AbortError on error');
+        t.done();
+      });
+    },
+    (t, db) => {},
+    'Properties of IDBOpenDBRequest during failed IDBFactory open()',
+    {upgrade_will_abort: true});
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-error.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-error.html
deleted file mode 100644
index cfd6862..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-error.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBFactory open(): request properties on error</title>
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbfactory-open">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=resources/support.js></script>
-<script>
-
-let saw_abort = false;
-
-indexeddb_test(
-  (t, db, tx, rq) => {
-    const store = db.createObjectStore('store');
-    store.put({name: 'a'}, 1);
-    store.put({name: 'a'}, 2);
-    store.createIndex('index', 'name', {unique: true});
-
-    assert_equals(
-      rq.readyState, 'done',
-      'request done flag should be set during upgradeneeded');
-    assert_equals(
-      rq.result, db,
-      'request result should be set (to connection) during upgradeneeded');
-    assert_equals(
-      rq.error, null,
-      'request result should be null during upgradeneeded');
-
-    tx.oncomplete = t.unreached_func('transaction should abort');
-    tx.onabort = t.step_func(() => {
-      saw_abort = true;
-
-      assert_equals(
-        rq.readyState, 'done',
-        'request done flag should still be set during abort');
-
-      // Chrome is flaky here. See: https://crbug.com/723846
-      /*
-      assert_equals(
-        rq.result, db,
-        'request result should still be set (to connection) during abort');
-      assert_equals(
-        rq.error, null,
-        'request result should still be null during abort');
-      */
-    });
-
-    rq.onerror = t.step_func(() => {
-      assert_true(saw_abort, 'abort event should fire before error');
-      assert_equals(
-        rq.readyState, 'done',
-        'request done flag should be set on error');
-      assert_equals(
-        rq.result, undefined,
-        'request result should be undefined on error');
-      assert_equals(
-        rq.error.name, 'AbortError',
-        'request error should be AbortError on error');
-      t.done();
-    });
-  },
-  (t, db) => {},
-  'Properties of IDBOpenDBRequest during failed IDBFactory open()',
-  {upgrade_will_abort: true});
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-success.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-success.any.js
new file mode 100644
index 0000000..4d0d7fd8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-success.any.js
@@ -0,0 +1,47 @@
+// META: title=IDBFactory open(): request properties on success
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbfactory-open
+
+'use strict';
+
+let saw_complete = false;
+
+indexeddb_test(
+    (t, db, tx, rq) => {
+      assert_equals(
+          rq.readyState, 'done',
+          'request done flag should be set during upgradeneeded');
+      assert_equals(
+          rq.result, db,
+          'request result should be set (to connection) during upgradeneeded');
+      assert_equals(
+          rq.error, null, 'request result should be null during upgradeneeded');
+
+      tx.onabort = t.unreached_func('transaction should complete');
+      tx.oncomplete = t.step_func(() => {
+        saw_complete = true;
+
+        assert_equals(
+            rq.readyState, 'done',
+            'request done flag should still be set during complete');
+        assert_equals(
+            rq.result, db,
+            'request result should still be set (to connection) during complete');
+        assert_equals(
+            rq.error, null,
+            'request result should still be null during complete');
+      });
+    },
+    (t, db, rq) => {
+      assert_true(saw_complete, 'complete event should fire before success');
+      assert_equals(
+          rq.readyState, 'done', 'request done flag should be set on success');
+      assert_equals(
+          rq.result, db,
+          'request result should still be set (to connection) on success');
+      assert_equals(rq.error, null, 'request error should be null on success');
+      t.done();
+    },
+    'Properties of IDBOpenDBRequest during successful IDBFactory open()');
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-success.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-success.html
deleted file mode 100644
index fb6ff903..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-request-success.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBFactory open(): request properties on success</title>
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbfactory-open">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=resources/support.js></script>
-<script>
-
-let saw_complete = false;
-
-indexeddb_test(
-  (t, db, tx, rq) => {
-    assert_equals(
-      rq.readyState, 'done',
-      'request done flag should be set during upgradeneeded');
-    assert_equals(
-      rq.result, db,
-      'request result should be set (to connection) during upgradeneeded');
-    assert_equals(
-      rq.error, null,
-      'request result should be null during upgradeneeded');
-
-    tx.onabort = t.unreached_func('transaction should complete');
-    tx.oncomplete = t.step_func(() => {
-      saw_complete = true;
-
-      assert_equals(
-        rq.readyState, 'done',
-        'request done flag should still be set during complete');
-      assert_equals(
-        rq.result, db,
-        'request result should still be set (to connection) during complete');
-      assert_equals(
-        rq.error, null,
-        'request result should still be null during complete');
-    });
-  },
-  (t, db, rq) => {
-    assert_true(saw_complete, 'complete event should fire before success');
-    assert_equals(
-      rq.readyState, 'done',
-      'request done flag should be set on success');
-    assert_equals(
-      rq.result, db,
-      'request result should still be set (to connection) on success');
-    assert_equals(
-      rq.error, null,
-      'request error should be null on success');
-    t.done();
-  },
-  'Properties of IDBOpenDBRequest during successful IDBFactory open()');
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-query-exception-order.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-query-exception-order.any.js
new file mode 100644
index 0000000..343cc46
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-query-exception-order.any.js
@@ -0,0 +1,62 @@
+// META: title=IndexedDB: IDBIndex query method Ordering
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-get
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-getall
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-getallkeys
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-count
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-opencursor
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-openkeycursor
+
+'use strict';
+
+[   'get',
+    'getAll',
+    'getAllKeys',
+    'count',
+    'openCursor',
+    'openKeyCursor'
+   ].forEach(method => {
+     indexeddb_test(
+       (t, db) => {
+         const store = db.createObjectStore('s');
+         const store2 = db.createObjectStore('s2');
+         const index = store2.createIndex('i', 'keyPath');
+         store2.deleteIndex('i');
+
+         setTimeout(t.step_func(() => {
+           assert_throws_dom(
+             'InvalidStateError', () => { index[method]('key'); },
+             '"has been deleted" check (InvalidStateError) should precede ' +
+             '"not active" check (TransactionInactiveError)');
+           t.done();
+         }), 0);
+       },
+       (t, db) => {},
+       `IDBIndex.${method} exception order: ` +
+       'InvalidStateError vs. TransactionInactiveError'
+     );
+
+     indexeddb_test(
+       (t, db) => {
+         const store = db.createObjectStore('s');
+         const index = store.createIndex('i', 'keyPath');
+       },
+       (t, db) => {
+         const tx = db.transaction('s', 'readonly');
+         const store = tx.objectStore('s');
+         const index = store.index('i');
+
+         setTimeout(t.step_func(() => {
+           assert_throws_dom(
+             'TransactionInactiveError', () => { index[method]({}); },
+             '"not active" check (TransactionInactiveError) should precede ' +
+             'query check (DataError)');
+           t.done();
+         }), 0);
+       },
+       `IDBIndex.${method} exception order: ` +
+       'TransactionInactiveError vs. DataError'
+     );
+   });
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-query-exception-order.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-query-exception-order.html
deleted file mode 100644
index 5b35a95..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-query-exception-order.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>IndexedDB: IDBIndex query method Ordering</title>
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-get">
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-getall">
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-getallkeys">
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-count">
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-opencursor">
-<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbindex-openkeycursor">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-<script>
-
-['get',
- 'getAll',
- 'getAllKeys',
- 'count',
- 'openCursor',
- 'openKeyCursor'
-].forEach(method => {
-
-  indexeddb_test(
-    (t, db) => {
-      const store = db.createObjectStore('s');
-      const store2 = db.createObjectStore('s2');
-      const index = store2.createIndex('i', 'keyPath');
-
-      store2.deleteIndex('i');
-
-      setTimeout(t.step_func(() => {
-        assert_throws_dom(
-          'InvalidStateError', () => { index[method]('key'); },
-          '"has been deleted" check (InvalidStateError) should precede ' +
-          '"not active" check (TransactionInactiveError)');
-        t.done();
-      }), 0);
-    },
-    (t, db) => {},
-    `IDBIndex.${method} exception order: ` +
-    'InvalidStateError vs. TransactionInactiveError'
-  );
-
-  indexeddb_test(
-    (t, db) => {
-      const store = db.createObjectStore('s');
-      const index = store.createIndex('i', 'keyPath');
-    },
-    (t, db) => {
-      const tx = db.transaction('s', 'readonly');
-      const store = tx.objectStore('s');
-      const index = store.index('i');
-
-      setTimeout(t.step_func(() => {
-        assert_throws_dom(
-          'TransactionInactiveError', () => { index[method]({}); },
-          '"not active" check (TransactionInactiveError) should precede ' +
-          'query check (DataError)');
-        t.done();
-      }), 0);
-    },
-    `IDBIndex.${method} exception order: ` +
-    'TransactionInactiveError vs. DataError'
-  );
-});
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-request-source.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-request-source.any.js
new file mode 100644
index 0000000..296b4d3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-request-source.any.js
@@ -0,0 +1,32 @@
+// META: title=IndexedDB: The source of requests made against indexes
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#dom-idbrequest-source
+
+'use strict';
+
+[
+    index => index.get(0),
+    index => index.getKey(0),
+    index => index.getAll(),
+    index => index.getAllKeys(),
+    index => index.count(),
+    index => index.openCursor(),
+    index => index.openKeyCursor()
+].forEach(func => indexeddb_test(
+    (t, db) => {
+        const store =
+            db.createObjectStore('store', {autoIncrement: true});
+        store.createIndex('index', 'kp');
+    },
+    (t, db) => {
+        const tx = db.transaction('store', 'readwrite');
+        const index = tx.objectStore('store').index('index');
+        assert_equals(
+            func(index).source, index,
+            `${func}.source should be the index itself`);
+        t.done();
+    },
+    `The source of the request from ${func} is the index itself`
+));
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-request-source.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-request-source.html
deleted file mode 100644
index ac4e284..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex-request-source.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>IndexedDB: The source of requests made against indexes</title>
-<meta name="help" href="https://w3c.github.io/IndexedDB/#dom-idbrequest-source">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-<script>
-
-[
-  index => index.get(0),
-  index => index.getKey(0),
-  index => index.getAll(),
-  index => index.getAllKeys(),
-  index => index.count(),
-
-  index => index.openCursor(),
-  index => index.openKeyCursor()
-].forEach(func => indexeddb_test(
-  (t, db) => {
-    const store = db.createObjectStore('store', {autoIncrement: true});
-    store.createIndex('index', 'kp');
-  },
-  (t, db) => {
-    const tx = db.transaction('store', 'readwrite');
-    const index = tx.objectStore('store').index('index');
-    assert_equals(func(index).source, index,
-                  `${func}.source should be the index itself`);
-    t.done();
-  },
-  `The source of the request from ${func} is the index itself`
-));
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_indexNames.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_indexNames.any.js
new file mode 100644
index 0000000..743cfcc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_indexNames.any.js
@@ -0,0 +1,27 @@
+// META: global=window,worker
+// META: title=IDBObjectStore.indexNames
+// META: script=resources/support.js
+
+'use_strict';
+
+async_test(t => {
+  let db;
+  const open_rq = createdb(t);
+  open_rq.onupgradeneeded = t.step_func(e => {
+    db = e.target.result;
+    const objStore = db.createObjectStore('test', {keyPath: 'key'});
+    objStore.createIndex('index', 'data');
+
+    assert_equals(objStore.indexNames[0], 'index', 'indexNames');
+    assert_equals(objStore.indexNames.length, 1, 'indexNames.length');
+  });
+
+  open_rq.onsuccess = t.step_func(e => {
+    const objStore = db.transaction('test', 'readonly').objectStore('test');
+
+    assert_equals(objStore.indexNames[0], 'index', 'indexNames (second)');
+    assert_equals(objStore.indexNames.length, 1, 'indexNames.length (second)');
+
+    t.done();
+  });
+}, 'Verify IDBObjectStore.indexNames property');
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_indexNames.htm b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_indexNames.htm
deleted file mode 100644
index 72c0cf4d9..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_indexNames.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBIndex.getKey() - returns the record's primary key</title>
-<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
-    var db,
-      t = async_test();
-
-    var open_rq = createdb(t);
-    open_rq.onupgradeneeded = function(e) {
-        db = e.target.result;
-        var objStore = db.createObjectStore("test", { keyPath: "key" });
-        objStore.createIndex("index", "data");
-
-        assert_equals(objStore.indexNames[0], "index", "indexNames");
-        assert_equals(objStore.indexNames.length, 1, "indexNames.length");
-    };
-
-    open_rq.onsuccess = function(e) {
-        var objStore = db.transaction("test", "readonly")
-                   .objectStore("test");
-
-        assert_equals(objStore.indexNames[0], "index", "indexNames (second)");
-        assert_equals(objStore.indexNames.length, 1, "indexNames.length (second)");
-
-        t.done();
-    };
-</script>
-
-<div id="log"></div>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange-includes.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange-includes.any.js
new file mode 100644
index 0000000..19ba3cb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange-includes.any.js
@@ -0,0 +1,146 @@
+// META: title=IndexedDB: IDBKeyRange.includes()
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#keyrange
+
+'use strict';
+
+test(() => {
+  const range = IDBKeyRange.bound(12, 34);
+  assert_throws_js(TypeError, () => {
+    range.includes();
+  }, 'throws if key is not specified');
+
+  assert_throws_dom('DataError', () => {
+    range.includes(undefined);
+  }, 'throws if key is undefined');
+  assert_throws_dom('DataError', () => {
+    range.includes(null);
+  }, 'throws if key is null');
+  assert_throws_dom('DataError', () => {
+    range.includes({});
+  }, 'throws if key is not valid type');
+  assert_throws_dom('DataError', () => {
+    range.includes(NaN);
+  }, 'throws if key is not valid number');
+  assert_throws_dom('DataError', () => {
+    range.includes(new Date(NaN));
+  }, 'throws if key is not valid date');
+  assert_throws_dom('DataError', () => {
+    var a = [];
+    a[0] = a;
+    range.includes(a);
+  }, 'throws if key is not valid array');
+}, 'IDBKeyRange.includes() with invalid input');
+
+test(() => {
+  const closedRange = IDBKeyRange.bound(5, 20);
+  assert_true(!!closedRange.includes, 'IDBKeyRange has a .includes');
+  assert_true(closedRange.includes(7), 'in range');
+  assert_false(closedRange.includes(1), 'below range');
+  assert_false(closedRange.includes(42), 'above range');
+  assert_true(closedRange.includes(5.01), 'at the lower end of the range');
+  assert_true(closedRange.includes(19.99), 'at the upper end of the range');
+  assert_false(closedRange.includes(4.99), 'right below range');
+  assert_false(closedRange.includes(21.01), 'right above range');
+
+  assert_true(closedRange.includes(5), 'lower boundary');
+  assert_true(closedRange.includes(20), 'upper boundary');
+}, 'IDBKeyRange.includes() with a closed range');
+
+test(() => {
+  const closedRange = IDBKeyRange.bound(5, 20, true, true);
+  assert_true(closedRange.includes(7), 'in range');
+  assert_false(closedRange.includes(1), 'below range');
+  assert_false(closedRange.includes(42), 'above range');
+  assert_true(closedRange.includes(5.01), 'at the lower end of the range');
+  assert_true(closedRange.includes(19.99), 'at the upper end of the range');
+  assert_false(closedRange.includes(4.99), 'right below range');
+  assert_false(closedRange.includes(21.01), 'right above range');
+
+  assert_false(closedRange.includes(5), 'lower boundary');
+  assert_false(closedRange.includes(20), 'upper boundary');
+}, 'IDBKeyRange.includes() with an open range');
+
+test(() => {
+  const range = IDBKeyRange.bound(5, 20, true);
+  assert_true(range.includes(7), 'in range');
+  assert_false(range.includes(1), 'below range');
+  assert_false(range.includes(42), 'above range');
+  assert_true(range.includes(5.01), 'at the lower end of the range');
+  assert_true(range.includes(19.99), 'at the upper end of the range');
+  assert_false(range.includes(4.99), 'right below range');
+  assert_false(range.includes(21.01), 'right above range');
+
+  assert_false(range.includes(5), 'lower boundary');
+  assert_true(range.includes(20), 'upper boundary');
+}, 'IDBKeyRange.includes() with a lower-open upper-closed range');
+
+test(() => {
+  const range = IDBKeyRange.bound(5, 20, false, true);
+  assert_true(range.includes(7), 'in range');
+  assert_false(range.includes(1), 'below range');
+  assert_false(range.includes(42), 'above range');
+  assert_true(range.includes(5.01), 'at the lower end of the range');
+  assert_true(range.includes(19.99), 'at the upper end of the range');
+  assert_false(range.includes(4.99), 'right below range');
+  assert_false(range.includes(21.01), 'right above range');
+
+  assert_true(range.includes(5), 'lower boundary');
+  assert_false(range.includes(20), 'upper boundary');
+}, 'IDBKeyRange.includes() with a lower-closed upper-open range');
+
+test(() => {
+  const onlyRange = IDBKeyRange.only(42);
+  assert_true(onlyRange.includes(42), 'in range');
+  assert_false(onlyRange.includes(1), 'below range');
+  assert_false(onlyRange.includes(9000), 'above range');
+  assert_false(onlyRange.includes(41), 'right below range');
+  assert_false(onlyRange.includes(43), 'right above range');
+}, 'IDBKeyRange.includes() with an only range');
+
+test(() => {
+  const range = IDBKeyRange.lowerBound(5);
+  assert_false(range.includes(4), 'value before closed lower bound');
+  assert_true(range.includes(5), 'value at closed lower bound');
+  assert_true(range.includes(6), 'value after closed lower bound');
+  assert_true(range.includes(42), 'value way after open lower bound');
+}, 'IDBKeyRange.includes() with an closed lower-bounded range');
+
+test(() => {
+  const range = IDBKeyRange.lowerBound(5, true);
+  assert_false(range.includes(4), 'value before open lower bound');
+  assert_false(range.includes(5), 'value at open lower bound');
+  assert_true(range.includes(6), 'value after open lower bound');
+  assert_true(range.includes(42), 'value way after open lower bound');
+}, 'IDBKeyRange.includes() with an open lower-bounded range');
+
+test(() => {
+  const range = IDBKeyRange.upperBound(5);
+  assert_true(range.includes(-42), 'value way before closed upper bound');
+  assert_true(range.includes(4), 'value before closed upper bound');
+  assert_true(range.includes(5), 'value at closed upper bound');
+  assert_false(range.includes(6), 'value after closed upper bound');
+}, 'IDBKeyRange.includes() with an closed upper-bounded range');
+
+test(() => {
+  const range = IDBKeyRange.upperBound(5, true);
+  assert_true(range.includes(-42), 'value way before closed upper bound');
+  assert_true(range.includes(4), 'value before open upper bound');
+  assert_false(range.includes(5), 'value at open upper bound');
+  assert_false(range.includes(6), 'value after open upper bound');
+}, 'IDBKeyRange.includes() with an open upper-bounded range');
+
+test((t) => {
+  assert_true(IDBKeyRange.bound(new Date(0), new Date())
+                  .includes(new Date(102729600000)));
+  assert_false(IDBKeyRange.bound(new Date(0), new Date(1e11))
+                   .includes(new Date(1e11 + 1)));
+
+  assert_true(IDBKeyRange.bound('a', 'c').includes('b'));
+  assert_false(IDBKeyRange.bound('a', 'c').includes('d'));
+
+  assert_true(IDBKeyRange.bound([], [[], []]).includes([[]]));
+  assert_false(IDBKeyRange.bound([], [[]]).includes([[[]]]));
+}, 'IDBKeyRange.includes() with non-numeric keys');
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange-includes.htm b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange-includes.htm
deleted file mode 100644
index 96769ae0..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange-includes.htm
+++ /dev/null
@@ -1,140 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>IndexedDB: IDBKeyRange.includes()</title>
-<meta name="help" href="https://w3c.github.io/IndexedDB/#keyrange">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script>
-
-test(function() {
-  var range = IDBKeyRange.bound(12, 34);
-  assert_throws_js(TypeError, function() { range.includes(); },
-      'throws if key is not specified');
-
-  assert_throws_dom('DataError', function() { range.includes(undefined); },
-      'throws if key is undefined');
-  assert_throws_dom('DataError', function() { range.includes(null); },
-      'throws if key is null');
-  assert_throws_dom('DataError', function() { range.includes({}); },
-      'throws if key is not valid type');
-  assert_throws_dom('DataError', function() { range.includes(NaN); },
-      'throws if key is not valid number');
-  assert_throws_dom('DataError', function() { range.includes(new Date(NaN)); },
-      'throws if key is not valid date');
-  assert_throws_dom('DataError', function() {
-      var a = []; a[0] = a; range.includes(a);
-  }, 'throws if key is not valid array');
-}, "IDBKeyRange.includes() with invalid input");
-
-test(function() {
-  var closedRange = IDBKeyRange.bound(5, 20);
-  assert_true(!!closedRange.includes, "IDBKeyRange has a .includes");
-  assert_true(closedRange.includes(7), "in range");
-  assert_false(closedRange.includes(1), "below range");
-  assert_false(closedRange.includes(42), "above range");
-  assert_true(closedRange.includes(5.01), "at the lower end of the range");
-  assert_true(closedRange.includes(19.99), "at the upper end of the range");
-  assert_false(closedRange.includes(4.99), "right below range");
-  assert_false(closedRange.includes(21.01), "right above range");
-
-  assert_true(closedRange.includes(5), "lower boundary");
-  assert_true(closedRange.includes(20), "upper boundary");
-}, "IDBKeyRange.includes() with a closed range");
-
-test(function() {
-  var closedRange = IDBKeyRange.bound(5, 20, true, true);
-  assert_true(closedRange.includes(7), "in range");
-  assert_false(closedRange.includes(1), "below range");
-  assert_false(closedRange.includes(42), "above range");
-  assert_true(closedRange.includes(5.01), "at the lower end of the range");
-  assert_true(closedRange.includes(19.99), "at the upper end of the range");
-  assert_false(closedRange.includes(4.99), "right below range");
-  assert_false(closedRange.includes(21.01), "right above range");
-
-  assert_false(closedRange.includes(5), "lower boundary");
-  assert_false(closedRange.includes(20), "upper boundary");
-}, "IDBKeyRange.includes() with an open range");
-
-test(function() {
-  var range = IDBKeyRange.bound(5, 20, true);
-  assert_true(range.includes(7), "in range");
-  assert_false(range.includes(1), "below range");
-  assert_false(range.includes(42), "above range");
-  assert_true(range.includes(5.01), "at the lower end of the range");
-  assert_true(range.includes(19.99), "at the upper end of the range");
-  assert_false(range.includes(4.99), "right below range");
-  assert_false(range.includes(21.01), "right above range");
-
-  assert_false(range.includes(5), "lower boundary");
-  assert_true(range.includes(20), "upper boundary");
-}, "IDBKeyRange.includes() with a lower-open upper-closed range");
-
-test(function() {
-  var range = IDBKeyRange.bound(5, 20, false, true);
-  assert_true(range.includes(7), "in range");
-  assert_false(range.includes(1), "below range");
-  assert_false(range.includes(42), "above range");
-  assert_true(range.includes(5.01), "at the lower end of the range");
-  assert_true(range.includes(19.99), "at the upper end of the range");
-  assert_false(range.includes(4.99), "right below range");
-  assert_false(range.includes(21.01), "right above range");
-
-  assert_true(range.includes(5), "lower boundary");
-  assert_false(range.includes(20), "upper boundary");
-}, "IDBKeyRange.includes() with a lower-closed upper-open range");
-
-test(function() {
-  var onlyRange = IDBKeyRange.only(42);
-  assert_true(onlyRange.includes(42), "in range");
-  assert_false(onlyRange.includes(1), "below range");
-  assert_false(onlyRange.includes(9000), "above range");
-  assert_false(onlyRange.includes(41), "right below range");
-  assert_false(onlyRange.includes(43), "right above range");
-}, "IDBKeyRange.includes() with an only range");
-
-test(function() {
-  var range = IDBKeyRange.lowerBound(5);
-  assert_false(range.includes(4), 'value before closed lower bound');
-  assert_true(range.includes(5), 'value at closed lower bound');
-  assert_true(range.includes(6), 'value after closed lower bound');
-  assert_true(range.includes(42), 'value way after open lower bound');
-}, "IDBKeyRange.includes() with an closed lower-bounded range");
-
-test(function() {
-  var range = IDBKeyRange.lowerBound(5, true);
-  assert_false(range.includes(4), 'value before open lower bound');
-  assert_false(range.includes(5), 'value at open lower bound');
-  assert_true(range.includes(6), 'value after open lower bound');
-  assert_true(range.includes(42), 'value way after open lower bound');
-}, "IDBKeyRange.includes() with an open lower-bounded range");
-
-test(function() {
-  var range = IDBKeyRange.upperBound(5);
-  assert_true(range.includes(-42), 'value way before closed upper bound');
-  assert_true(range.includes(4), 'value before closed upper bound');
-  assert_true(range.includes(5), 'value at closed upper bound');
-  assert_false(range.includes(6), 'value after closed upper bound');
-}, "IDBKeyRange.includes() with an closed upper-bounded range");
-
-test(function() {
-  var range = IDBKeyRange.upperBound(5, true);
-  assert_true(range.includes(-42), 'value way before closed upper bound');
-  assert_true(range.includes(4), 'value before open upper bound');
-  assert_false(range.includes(5), 'value at open upper bound');
-  assert_false(range.includes(6), 'value after open upper bound');
-}, "IDBKeyRange.includes() with an open upper-bounded range");
-
-test(function(t) {
-    assert_true(IDBKeyRange.bound(new Date(0), new Date())
-        .includes(new Date(102729600000)));
-    assert_false(IDBKeyRange.bound(new Date(0), new Date(1e11))
-        .includes(new Date(1e11 + 1)));
-
-    assert_true(IDBKeyRange.bound('a', 'c').includes('b'));
-    assert_false(IDBKeyRange.bound('a', 'c').includes('d'));
-
-    assert_true(IDBKeyRange.bound([], [[], []]).includes([[]]));
-    assert_false(IDBKeyRange.bound([], [[]]).includes([[[]]]));
-}, 'IDBKeyRange.includes() with non-numeric keys');
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange.any.js
new file mode 100644
index 0000000..d22167a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange.any.js
@@ -0,0 +1,124 @@
+// META: title=IDBKeyRange Tests
+// META: global=window,worker
+// META: script=resources/support.js
+
+'use strict';
+
+test(() => {
+  const keyRange = IDBKeyRange.only(1);
+  assert_true(
+      keyRange instanceof IDBKeyRange, 'keyRange instanceof IDBKeyRange');
+  assert_equals(keyRange.lower, 1, 'keyRange');
+  assert_equals(keyRange.upper, 1, 'keyRange');
+  assert_false(keyRange.lowerOpen, 'keyRange.lowerOpen');
+  assert_false(keyRange.upperOpen, 'keyRange.upperOpen');
+}, 'IDBKeyRange.only() - returns an IDBKeyRange and the properties are set correctly');
+
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.only(undefined);
+  }, 'undefined is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.only(null);
+  }, 'null is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.only({});
+  }, 'Object is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.only(Symbol());
+  }, 'Symbol is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.only(true);
+  }, 'boolean is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.only(() => {});
+  }, 'function is not a valid key');
+}, 'IDBKeyRange.only() - throws on invalid keys');
+
+test(() => {
+  const keyRange = IDBKeyRange.lowerBound(1, true);
+  assert_true(
+      keyRange instanceof IDBKeyRange, 'keyRange instanceof IDBKeyRange');
+  assert_equals(keyRange.lower, 1, 'keyRange.lower');
+  assert_equals(keyRange.upper, undefined, 'keyRange.upper');
+  assert_true(keyRange.lowerOpen, 'keyRange.lowerOpen');
+  assert_true(keyRange.upperOpen, 'keyRange.upperOpen');
+}, 'IDBKeyRange.lowerBound() - returns an IDBKeyRange and the properties are set correctly');
+
+test(() => {
+  const keyRange = IDBKeyRange.lowerBound(1);
+  assert_false(keyRange.lowerOpen, 'keyRange.lowerOpen');
+}, 'IDBKeyRange.lowerBound() - \'open\' parameter has correct default set');
+
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.lowerBound(undefined);
+  }, 'undefined is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.lowerBound(null);
+  }, 'null is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.lowerBound({});
+  }, 'Object is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.lowerBound(Symbol());
+  }, 'Symbol is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.lowerBound(true);
+  }, 'boolean is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.lowerBound(() => {});
+  }, 'function is not a valid key');
+}, 'IDBKeyRange.lowerBound() - throws on invalid keys');
+
+test(() => {
+  const keyRange = IDBKeyRange.upperBound(1, true);
+  assert_true(
+      keyRange instanceof IDBKeyRange, 'keyRange instanceof IDBKeyRange');
+  assert_equals(keyRange.lower, undefined, 'keyRange.lower');
+  assert_equals(keyRange.upper, 1, 'keyRange.upper');
+  assert_true(keyRange.lowerOpen, 'keyRange.lowerOpen');
+  assert_true(keyRange.upperOpen, 'keyRange.upperOpen');
+}, 'IDBKeyRange.upperBound() - returns an IDBKeyRange and the properties are set correctly');
+
+test(() => {
+  const keyRange = IDBKeyRange.upperBound(1);
+  assert_false(keyRange.upperOpen, 'keyRange.upperOpen');
+}, 'IDBKeyRange.upperBound() - \'open\' parameter has correct default set');
+
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.upperBound(undefined);
+  }, 'undefined is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.upperBound(null);
+  }, 'null is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.upperBound({});
+  }, 'Object is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.upperBound(Symbol());
+  }, 'Symbol is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.upperBound(true);
+  }, 'boolean is not a valid key');
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.upperBound(() => {});
+  }, 'function is not a valid key');
+}, 'IDBKeyRange.upperBound() - throws on invalid keys');
+
+test(() => {
+  const keyRange = IDBKeyRange.bound(1, 2, true, true);
+  assert_true(
+      keyRange instanceof IDBKeyRange, 'keyRange instanceof IDBKeyRange');
+  assert_equals(keyRange.lower, 1, 'keyRange');
+  assert_equals(keyRange.upper, 2, 'keyRange');
+  assert_true(keyRange.lowerOpen, 'keyRange.lowerOpen');
+  assert_true(keyRange.upperOpen, 'keyRange.upperOpen');
+}, 'IDBKeyRange.bound() - returns an IDBKeyRange and the properties are set correctly');
+
+test(() => {
+  const keyRange = IDBKeyRange.bound(1, 2);
+  assert_false(keyRange.lowerOpen, 'keyRange.lowerOpen');
+  assert_false(keyRange.upperOpen, 'keyRange.upperOpen');
+}, 'IDBKeyRange.bound() - \'lowerOpen\' and \'upperOpen\' parameters have correct defaults set');
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange.htm b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange.htm
deleted file mode 100644
index a387dc7..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange.htm
+++ /dev/null
@@ -1,94 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBKeyRange Tests</title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=resources/support.js></script>
-
-<script>
-    // only
-    test( function() {
-        var keyRange = IDBKeyRange.only(1);
-        assert_true(keyRange instanceof IDBKeyRange, "keyRange instanceof IDBKeyRange");
-        assert_equals(keyRange.lower, 1, "keyRange");
-        assert_equals(keyRange.upper, 1, "keyRange");
-        assert_false(keyRange.lowerOpen, "keyRange.lowerOpen");
-        assert_false(keyRange.upperOpen, "keyRange.upperOpen");
-    }, "IDBKeyRange.only() - returns an IDBKeyRange and the properties are set correctly");
-
-    test( function() {
-        assert_throws_dom('DataError', function() { IDBKeyRange.only(undefined); }, 'undefined is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.only(null); }, 'null is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.only({}); }, 'Object is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.only(Symbol()); }, 'Symbol is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.only(true); }, 'boolean is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.only(() => {}); }, 'function is not a valid key');
-    }, "IDBKeyRange.only() - throws on invalid keys");
-
-    // lowerBound
-    test( function() {
-        var keyRange = IDBKeyRange.lowerBound(1, true)
-        assert_true(keyRange instanceof IDBKeyRange, "keyRange instanceof IDBKeyRange");
-        assert_equals(keyRange.lower, 1, "keyRange.lower");
-        assert_equals(keyRange.upper, undefined, "keyRange.upper");
-        assert_true(keyRange.lowerOpen, "keyRange.lowerOpen");
-        assert_true(keyRange.upperOpen, "keyRange.upperOpen");
-    }, "IDBKeyRange.lowerBound() - returns an IDBKeyRange and the properties are set correctly");
-
-    test( function() {
-        var keyRange = IDBKeyRange.lowerBound(1);
-        assert_false(keyRange.lowerOpen, "keyRange.lowerOpen");
-    }, "IDBKeyRange.lowerBound() - 'open' parameter has correct default set");
-
-    test( function() {
-        assert_throws_dom('DataError', function() { IDBKeyRange.lowerBound(undefined); }, 'undefined is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.lowerBound(null); }, 'null is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.lowerBound({}); }, 'Object is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.lowerBound(Symbol()); }, 'Symbol is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.lowerBound(true); }, 'boolean is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.lowerBound(() => {}); }, 'function is not a valid key');
-    }, "IDBKeyRange.lowerBound() - throws on invalid keys");
-
-    // upperBound
-    test( function() {
-            var keyRange = IDBKeyRange.upperBound(1, true);
-            assert_true(keyRange instanceof IDBKeyRange, "keyRange instanceof IDBKeyRange");
-            assert_equals(keyRange.lower, undefined, "keyRange.lower");
-            assert_equals(keyRange.upper, 1, "keyRange.upper");
-            assert_true(keyRange.lowerOpen, "keyRange.lowerOpen");
-            assert_true(keyRange.upperOpen, "keyRange.upperOpen");
-    }, "IDBKeyRange.upperBound() - returns an IDBKeyRange and the properties are set correctly");
-
-    test( function() {
-        var keyRange = IDBKeyRange.upperBound(1);
-        assert_false(keyRange.upperOpen, "keyRange.upperOpen");
-    }, "IDBKeyRange.upperBound() - 'open' parameter has correct default set");
-
-    test( function() {
-        assert_throws_dom('DataError', function() { IDBKeyRange.upperBound(undefined); }, 'undefined is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.upperBound(null); }, 'null is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.upperBound({}); }, 'Object is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.upperBound(Symbol()); }, 'Symbol is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.upperBound(true); }, 'boolean is not a valid key');
-        assert_throws_dom('DataError', function() { IDBKeyRange.upperBound(() => {}); }, 'function is not a valid key');
-    }, "IDBKeyRange.upperBound() - throws on invalid keys");
-
-    // bound
-    test( function() {
-        var keyRange = IDBKeyRange.bound(1, 2, true, true);
-        assert_true(keyRange instanceof IDBKeyRange, "keyRange instanceof IDBKeyRange");
-        assert_equals(keyRange.lower, 1, "keyRange");
-        assert_equals(keyRange.upper, 2, "keyRange");
-        assert_true(keyRange.lowerOpen, "keyRange.lowerOpen");
-        assert_true(keyRange.upperOpen, "keyRange.upperOpen");
-    }, "IDBKeyRange.bound() - returns an IDBKeyRange and the properties are set correctly");
-
-    test( function() {
-        var keyRange = IDBKeyRange.bound(1, 2);
-        assert_false(keyRange.lowerOpen, "keyRange.lowerOpen");
-        assert_false(keyRange.upperOpen, "keyRange.upperOpen");
-    }, "IDBKeyRange.bound() - 'lowerOpen' and 'upperOpen' parameters have correct defaults set");
-</script>
-
-<div id=log></div>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange_incorrect.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange_incorrect.any.js
new file mode 100644
index 0000000..79c7b27f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange_incorrect.any.js
@@ -0,0 +1,76 @@
+// META: title=IDBKeyRange Tests - Incorrect
+// META: global=window,worker
+// META: script=resources/support.js
+
+// Spec: https://w3c.github.io/IndexedDB/#keyrange
+
+'use strict';
+
+// TypeError: bound requires more than 0 arguments
+test(() => {
+  assert_throws_js(TypeError, () => {
+    IDBKeyRange.bound();
+  });
+}, 'IDBKeyRange.bound() - bound requires more than 0 arguments.');
+
+// Null parameters
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound(null, null);
+  });
+}, 'IDBKeyRange.bound(null, null) - null parameters are incorrect.');
+
+// Null parameter
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound(1, null);
+  });
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound(null, 1);
+  });
+}, 'IDBKeyRange.bound(1, null / null, 1) - null parameter is incorrect.');
+
+// bound incorrect
+test(() => {
+  const lowerBad = Math.floor(Math.random() * 31) + 5;
+  const upper = lowerBad - 1;
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound(lowerBad, upper);
+  });
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound('b', 'a');
+  });
+}, "IDBKeyRange.bound(lower, upper / lower > upper) - lower' is greater than 'upper'.");
+
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound('a', 1);
+  });
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound(new Date(), 1);
+  });
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound([1, 2], 1);
+  });
+}, "IDBKeyRange.bound(DOMString/Date/Array, 1) - A DOMString, Date and Array are greater than a float.");
+
+// ReferenceError: the variable is not defined
+test(() => {
+  const goodVariable = 1;
+  assert_throws_js(ReferenceError, () => {
+    IDBKeyRange.bound(noExistingVariable, 1);
+  });
+  assert_throws_js(
+      ReferenceError,
+      () => {
+        IDBKeyRange.bound(goodVariable, noExistingVariable);
+      });
+}, 'IDBKeyRange.bound(noExistingVariable, 1 / goodVariable, noExistingVariable) -\
+    noExistingVariable is not defined.');
+
+// Valid type key error
+test(() => {
+  assert_throws_dom('DataError', () => {
+    IDBKeyRange.bound(true, 1);
+  });
+}, 'IDBKeyRange.bound(true, 1) - boolean is not a valid key type.');
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange_incorrect.htm b/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange_incorrect.htm
deleted file mode 100644
index ec72a7e7a..0000000
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbkeyrange_incorrect.htm
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE html>
-<!-- Submitted from TestTWF Paris -->
-<html>
-    <head>
-        <meta charset=utf-8>
-        <title id='desc'>IDBKeyRange Tests - Incorrect</title>
-        <link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#range-concept">
-        <link rel=assert title="If the lower key is greater than the upper key, then a DOMException of type DataError must be thrown.">
-        <link rel=author href="mailto:chrcharles67@gmail.com" title="Christophe CHARLES">
-
-        <script src="/resources/testharness.js"></script>
-        <script src="/resources/testharnessreport.js"></script>
-        <script src="resources/support.js"></script>
-
-        <script type="text/javascript">
-
-            // TypeError: bound requires more than 0 arguments
-            test( function() {
-                assert_throws_js(TypeError, function() {
-                    IDBKeyRange.bound();
-                });
-            }, "IDBKeyRange.bound() - bound requires more than 0 arguments.");
-
-            // Null parameters
-            test( function() {
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound(null, null);
-                });
-            }, "IDBKeyRange.bound(null, null) - null parameters are incorrect.");
-
-            // // Null parameter
-            test( function() {
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound(1, null);
-                });
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound(null, 1);
-                });
-            }, "IDBKeyRange.bound(1, null / null, 1) - null parameter is incorrect.");
-
-            // bound incorrect
-            test( function() {
-                var lowerBad = Math.floor(Math.random()*31) + 5;
-                var upper = lowerBad - 1;
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound(lowerBad, upper);
-                });
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound('b', 'a');
-                });
-            }, "IDBKeyRange.bound(lower, upper / lower > upper) -  'lower' is greater than 'upper'."
-            );
-
-            test( function() {
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound('a', 1);
-                });
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound(new Date(), 1);
-                });
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound([1, 2], 1);
-                });
-            }, "IDBKeyRange.bound(DOMString/Date/Array, 1) - A DOMString, Date and Array are greater than a float.");
-
-
-            // ReferenceError: the variable is not defined
-            test( function() {
-                var goodVariable = 1;
-                assert_throws_js(ReferenceError, function() {
-                    IDBKeyRange.bound(noExistingVariable, 1);
-                });
-                assert_throws_js(ReferenceError, function() {
-                    IDBKeyRange.bound(goodVariable, noExistingVariable);
-                });
-            }, "IDBKeyRange.bound(noExistingVariable, 1 / goodVariable, noExistingVariable) - noExistingVariable is not defined.");
-
-            // Valid type key error
-            test( function() {
-                assert_throws_dom("DataError", function() {
-                    IDBKeyRange.bound(true, 1);
-                });
-            }, "IDBKeyRange.bound(true, 1) - boolean is not a valid key type.");
-
-
-        </script>
-    </head>
-
-    <body>
-        <div id="log"></div>
-    </body>
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-001.html b/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-001.html
index 1f07d6037..2d05fb5 100644
--- a/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-001.html
@@ -7,7 +7,7 @@
     <meta name="assert" content="The background image should have opacity applied to
     it as part of the Root Element Group">
     <link rel="match" href="root-element-background-image-transparency-001-ref.html">
-    <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-9600" />
+    <meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-240000" />
     <style>
       html {
         background: url(support/transform-triangle-left.svg);
diff --git a/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-003.html b/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-003.html
index 0aded92..0dead30 100644
--- a/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-transparency-003.html
@@ -7,7 +7,7 @@
     <meta name="assert" content="The background image should have opacity applied to
     it as part of the Root Element Group">
     <link rel="match" href="root-element-background-image-transparency-001-ref.html">
-    <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-237600" />
+    <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-240000" />
     <style>
       html {
         background: url(support/transform-triangle-left.svg);
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-styling-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-styling-005-ref.html
new file mode 100644
index 0000000..19f6c86
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-styling-005-ref.html
@@ -0,0 +1,21 @@
+<!doctype HTML>
+<html>
+  <meta charset="utf-8">
+  <title>CSS Pseudo-Elements Reference: Invalidation on custom property changes</title>
+  <script src="support/selections.js"></script>
+  <link rel="stylesheet" href="support/highlights.css">
+  <style>
+    main::selection {
+      background-color: green;
+    }
+  </style>
+  <body>
+    <p>Test passes if the text below has green background.</p>
+    <main class="highlight_reftest">
+      <p>quick</p>
+    </main>
+    <script>
+      selectNodeContents(document.querySelector('main'));
+    </script>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-styling-005.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-styling-005.html
new file mode 100644
index 0000000..2e07edd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-styling-005.html
@@ -0,0 +1,39 @@
+<!doctype HTML>
+<html class="reftest-wait">
+  <meta charset="utf-8">
+  <title>CSS Pseudo-Elements Test: Invalidation on custom property changes</title>
+  <link rel="author" title="Stephen Chenney" href="mailto:schenney@schenney.com">
+  <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#highlight-styling">
+  <link rel="match" href="highlight-styling-005-ref.html">
+  <meta name="assert" value="Verify that changing a custom property value on the root updates highlights that use the property.">
+  <script src="support/selections.js"></script>
+  <link rel="stylesheet" href="support/highlights.css">
+  <script src="/common/reftest-wait.js"></script>
+  <style>
+    :root {
+      --bg: red;
+    }
+    main::selection {
+      background-color: var(--bg, red);
+    }
+  </style>
+  <body onload="runTest()">
+    <p>Test passes if the text below has green background.</p>
+    <main class="highlight_reftest">
+      <p id="selected">quick</p>
+    </main>
+    <script>
+      function runTest() {
+        selectNodeContents(document.querySelector('main'));
+        requestAnimationFrame(() => {
+          requestAnimationFrame(() => {
+            document.querySelector(':root').style.setProperty('--bg', 'green');
+            requestAnimationFrame(() => {
+              takeScreenshot();
+            });
+          });
+        });
+      }
+    </script>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform-ref.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform-ref.html
index 0721fca..ba35c34 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform-ref.html
@@ -10,20 +10,33 @@
   background: grey;
 }
 
-#target {
+#composited {
   width: 100px;
   height: 100px;
   position: fixed;
   top: 0px;
   left: 0px;
   transform: translate(100.52px, 100.37px);
+  will-change: transform;
 
   view-transition-name: target;
-  contain: layout;
-  will-change: transform;
+}
+
+#noncomposited {
+  width: 100px;
+  height: 100px;
+  position: fixed;
+  top: 0px;
+  left: 0px;
+  transform: translate(100.52px, 250.37px);
+
+  view-transition-name: target;
 }
 </style>
 
-<div id=target>
-  Here is some text which should not be blurry.
+<div id=composited>
+  XXXXXXX XXXXXXX XXXXXXX XXXXXXX
+</div>
+<div id=noncomposited>
+  XXXXXXX XXXXXXX XXXXXXX XXXXXXX
 </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html
index 7027a90..4018887 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-translation-from-transform.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="fractional-translation-from-transform-ref.html">
-<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-100">
+<meta name="fuzzy" content="maxDifference=0-100; totalPixels=0-10">
 <script src="/common/reftest-wait.js"></script>
 <style>
 body {
@@ -13,35 +13,51 @@
   background: grey;
 }
 
-#target {
+#composited {
   width: 100px;
   height: 100px;
   position: fixed;
   top: 0px;
   left: 0px;
   transform: translate(100.52px, 100.37px);
+  will-change: transform;
 
-  view-transition-name: target;
-  contain: layout;
+  view-transition-name: composited;
 }
 
-/* Keep the animation running for 30s to screenshot pseudo DOM */
+#noncomposited {
+  width: 100px;
+  height: 100px;
+  position: fixed;
+  top: 0px;
+  left: 0px;
+  transform: translate(100.52px, 250.37px);
+
+  view-transition-name: noncomposited;
+}
+
+/* Keep the animation running for 300s to screenshot pseudo DOM */
 ::view-transition-new(root), ::view-transition-old(root) {
-  animation-duration: 30s;
+  animation-duration: 300s;
 }
 
-::view-transition-new(target) {
+::view-transition-new(composited), {
+::view-transition-new(noncomposited) {
   opacity: 1;
   animation: unset;
 }
-::view-transition-old(target) {
+::view-transition-old(composited), {
+::view-transition-old(noncomposited) {
   opacity: 0;
   animation: unset;
 }
 </style>
 
-<div id=target>
-  Here is some text which should not be blurry.
+<div id=composited>
+  XXXXXXX XXXXXXX XXXXXXX XXXXXXX
+</div>
+<div id=noncomposited>
+  XXXXXXX XXXXXXX XXXXXXX XXXXXXX
 </div>
 
 <script>
diff --git a/third_party/blink/web_tests/external/wpt/dom/lists/DOMTokenList-coverage-for-attributes-expected.txt b/third_party/blink/web_tests/external/wpt/dom/lists/DOMTokenList-coverage-for-attributes-expected.txt
deleted file mode 100644
index 21256155..0000000
--- a/third_party/blink/web_tests/external/wpt/dom/lists/DOMTokenList-coverage-for-attributes-expected.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This is a testharness.js-based test.
-Found 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
-[FAIL] a.relList in http://www.w3.org/2000/svg namespace should be DOMTokenList.
-  assert_class_string: expected "[object DOMTokenList]" but got "[object Undefined]"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
index 62b355f..fc96e56c 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
@@ -521,6 +521,8 @@
             'fonts': [],
         }
         params.update(test)
+        if 'variants' in params:
+            del params['variants']
         return _Variant(params)
 
     def merge_params(self, params: _TestParams) -> '_Variant':
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/compositing.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/compositing.yaml
index 838ad4b0..9b57a02 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/compositing.yaml
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/compositing.yaml
@@ -407,3 +407,256 @@
         img_ctx.fillRect(0, 0, {{ size[0] }}, {{ size[1] }});
         ctx.fillStyle = ctx.createPattern(img_canvas, 'repeat');
         ctx.fillRect(5, 5, 50, 30);
+
+# Composite operation tests
+# <http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2007-March/010608.html>
+- name: 2d.composite
+  macros: |
+    {% macro calc_output(A, B, FA, FB) %}
+      {% set RA, GA, BA, aA = A -%}
+      {% set RB, GB, BB, aB = B -%}
+      {% set rA, gA, bA = RA * aA, GA * aA, BA * aA -%}
+      {% set rB, gB, bB = RB * aB, GB * aB, BB * aB -%}
+
+      {% set FA = FA[0] + FA[1] * aA + FA[2] * aB -%}
+      {% set FB = FB[0] + FB[1] * aA + FB[2] * aB -%}
+
+      {% set rO = rA * FA + rB * FB -%}
+      {% set gO = gA * FA + gB * FB -%}
+      {% set bO = bA * FA + bB * FB -%}
+      {% set aO = aA * FA + aB * FB -%}
+
+      {% set rO = (255, rO) | min -%}
+      {% set gO = (255, gO) | min -%}
+      {% set bO = (255, bO) | min -%}
+      {% set aO = (1, aO) | min -%}
+
+      {% set RO = rO / aO if aO else 0 -%}
+      {% set GO = gO / aO if aO else 0 -%}
+      {% set BO = bO / aO if aO else 0 -%}
+
+      {{- '%f,%f,%f,%f' | format(RO, GO, BO, aO) -}}
+    {% endmacro %}
+
+    {% macro rgba_format(color) %}
+      {% set r, g, b, a = color -%}
+      rgba{{ (r, g, b, a) -}}
+    {% endmacro %}
+
+    {% macro js_format(color) %}
+      {% set r, g, b, a = color.split(',') | map('float') %}
+      {{- '%d,%d,%d,%d' |
+          format(r | round, g | round, b | round, (a * 255) | round) -}}
+    {% endmacro %}
+
+    {% macro cairo_format(color) %}
+      {% set r, g, b, a = color.split(',') | map('float') %}
+      {{- '%f,%f,%f,%f' | format(r / 255.0, g / 255.0, b / 255.0, a) -}}
+    {% endmacro %}
+  code: |
+    {% import 'macros' as m -%}
+    ctx.fillStyle = '{{ m.rgba_format(dest_color) }}';
+    ctx.fillRect(0, 0, 100, 50);
+    ctx.globalCompositeOperation = '{{ variant_names[1] }}';
+    {{ draw_code }}
+    {{ assertion }}
+  assertion: |-
+    {% import 'macros' as m -%}
+    @assert pixel 50,25 ==~ {{ m.js_format(expected_color) }} +/- 5;
+  expected: |
+    {% import 'macros' as m %}
+    size 100 50
+    cr.set_source_rgba({{ m.cairo_format(expected_color) }})
+    cr.rectangle(0, 0, 100, 50)
+    cr.fill()
+  new_auxiliary_canvas: |-
+    {%- if canvas_type == 'HtmlCanvas' -%}
+    document.createElement('canvas');
+    canvas2.width = canvas.width;
+    canvas2.height = canvas.height;
+    {%- else -%}
+    new OffscreenCanvas(canvas.width, canvas.height);
+    {%- endif -%}
+  variants:
+  - solid:
+      src_color: [255, 255, 0, 1.0]
+      dest_color: [0, 255, 255, 1.0]
+      draw_code: |-
+        {% import 'macros' as m %}
+        ctx.fillStyle = '{{ m.rgba_format(src_color) }}';
+        ctx.fillRect(0, 0, 100, 50);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output(src_color, dest_color, fa, fb) }}
+    transparent:
+      src_color: [0, 0, 255, 0.75]
+      dest_color: [0, 255, 0, 0.5]
+      draw_code: |-
+        {% import 'macros' as m %}
+        ctx.fillStyle = '{{ m.rgba_format(src_color) }}';
+        ctx.fillRect(0, 0, 100, 50);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output(src_color, dest_color, fa, fb) }}
+    image:
+      src_color: [255, 255, 0, 0.75]
+      dest_color: [0, 255, 255, 0.5]
+      test_type: 'promise'
+      draw_code: |-
+        const response = await fetch('/images/yellow75.png')
+        const blob = await response.blob();
+        const bitmap = await createImageBitmap(blob);
+        ctx.drawImage(bitmap, 0, 0);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output(src_color, dest_color, fa, fb) }}
+    canvas:
+      src_color: [255, 255, 0, 0.75]
+      dest_color: [0, 255, 255, 0.5]
+      test_type: 'promise'
+      draw_code: |-
+        const canvas2 = {{ new_auxiliary_canvas }}
+        const ctx2 = canvas2.getContext('2d');
+        const response = await fetch('/images/yellow75.png')
+        const blob = await response.blob();
+        const bitmap = await createImageBitmap(blob);
+        ctx2.drawImage(bitmap, 0, 0);
+        ctx.drawImage(canvas2, 0, 0);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output(src_color, dest_color, fa, fb) }}
+    uncovered.fill:
+      desc: >-
+          fill() draws pixels not covered by the source object as (0,0,0,0), and
+          does not leave the pixels unchanged.
+      src_color: [0, 0, 255, 0.75]
+      dest_color: [0, 255, 0, 0.5]
+      draw_code: |-
+        {% import 'macros' as m %}
+        ctx.fillStyle = '{{ m.rgba_format(src_color) }}';
+        ctx.translate(0, 25);
+        ctx.fillRect(0, 50, 100, 50);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output([0, 0, 0, 0], dest_color, fa, fb) }}
+      enabled: |-
+        {{ variant_names[1] in ['source-in',
+                                'destination-in',
+                                'source-out',
+                                'destination-atop',
+                                'copy'] }}
+      timeout: |-
+        {%- if variant_names[1] == 'destination-in' and
+               canvas_type != 'HtmlCanvas' -%}
+          long
+        {%- endif -%}
+    uncovered.image:
+      desc: >-
+        drawImage() draws pixels not covered by the source object as (0,0,0,0),
+        and does not leave the pixels unchanged.
+      src_color: [255, 255, 0, 1.0]
+      dest_color: [0, 255, 255, 0.5]
+      test_type: 'promise'
+      draw_code: |-
+        const response = await fetch('/images/yellow.png')
+        const blob = await response.blob();
+        const bitmap = await createImageBitmap(blob);
+        ctx.drawImage(bitmap, 40, 40, 10, 10, 40, 50, 10, 10);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output([0, 0, 0, 0], dest_color, fa, fb) }}
+      enabled: |-
+        {{ variant_names[1] in ['source-in',
+                                'destination-in',
+                                'source-out',
+                                'destination-atop',
+                                'copy'] }}
+    uncovered.nocontext:
+      desc: >-
+        drawImage() of a canvas with no context draws pixels as (0,0,0,0), and
+        does not leave the pixels unchanged.
+      src_color: [255, 255, 0, 1.0]
+      dest_color: [0, 255, 255, 0.5]
+      draw_code: |-
+        const canvas2 = {{ new_auxiliary_canvas }}
+        ctx.drawImage(canvas2, 0, 0);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output([0, 0, 0, 0], dest_color, fa, fb) }}
+      enabled: |-
+        {{ variant_names[1] in ['source-in',
+                                'destination-in',
+                                'source-out',
+                                'destination-atop',
+                                'copy'] }}
+    uncovered.pattern:
+      desc: >-
+        Pattern fill() draws pixels not covered by the source object as
+        (0,0,0,0), and does not leave the pixels unchanged.
+      src_color: [255, 255, 0, 1.0]
+      dest_color: [0, 255, 255, 0.5]
+      test_type: 'promise'
+      draw_code: |-
+        const response = await fetch('/images/yellow.png')
+        const blob = await response.blob();
+        const bitmap = await createImageBitmap(blob);
+        ctx.fillStyle = ctx.createPattern(bitmap, 'no-repeat');
+        ctx.fillRect(0, 50, 100, 50);
+      expected_color: |
+        {% import 'macros' as m %}
+        {{ m.calc_output([0, 0, 0, 0], dest_color, fa, fb) }}
+      enabled: |-
+        {{ variant_names[1] in ['source-in',
+                                'destination-in',
+                                'source-out',
+                                'destination-atop',
+                                'copy'] }}
+    clip:
+      desc: fill() does not affect pixels outside the clip region.
+      src_color: [255, 0, 0, 1]
+      dest_color: [0, 255, 0, 1]
+      draw_code: |-
+        {% import 'macros' as m %}
+        ctx.rect(-20, -20, 10, 10);
+        ctx.clip();
+        ctx.fillStyle = '{{ m.rgba_format(src_color) }}';
+        ctx.fillRect(0, 0, 50, 50);
+      assertion: |-
+        @assert pixel 50,25 == 0,255,0,255;
+      expected: green
+  - source-over:
+      fa: [1, 0, 0]   # 1
+      fb: [1, -1, 0]  # 1-aA
+    destination-over:
+      fa: [1, 0, -1]  # 1-aB
+      fb: [1, 0, 0]   # 1
+    source-in:
+      fa: [0, 0, 1]   # aB
+      fb: [0, 0, 0]   # 0
+    destination-in:
+      fa: [0, 0, 0]   # 0
+      fb: [0, 1, 0]   # aA
+    source-out:
+      fa: [1, 0, -1]  # 1-aB
+      fb: [0, 0, 0]   # 0
+    destination-out:
+      fa: [0, 0, 0]   # 0
+      fb: [1, -1, 0]  # 1-aA
+    source-atop:
+      fa: [0, 0, 1]   # aB
+      fb: [1, -1, 0]  # 1-aA
+    destination-atop:
+      fa: [1, 0, -1]  # 1-aB
+      fb: [0, 1, 0]   # aA
+    xor:
+      fa: [1, 0, -1]  # 1-aB
+      fb: [1, -1, 0]  # 1-aA
+    copy:
+      fa: [1, 0, 0]  # 1
+      fb: [0, 0, 0]  # 0
+    lighter:
+      fa: [1, 0, 0]  # 1
+      fb: [1, 0, 0]  # 1
+    clear:
+      fa: [0, 0, 0]  # 0
+      fb: [0, 0, 0]  # 0
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/meta.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/meta.yaml
index 9ebe42e..15e93e3 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/meta.yaml
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/meta.yaml
@@ -1,253 +1,4 @@
 - meta: |
-    # Composite operation tests
-    # <http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2007-March/010608.html>
-    ops = [
-        # name               FA      FB
-        ('source-over',      '1',    '1-aA'),
-        ('destination-over', '1-aB', '1'),
-        ('source-in',        'aB',   '0'),
-        ('destination-in',   '0',    'aA'),
-        ('source-out',       '1-aB', '0'),
-        ('destination-out',  '0',    '1-aA'),
-        ('source-atop',      'aB',   '1-aA'),
-        ('destination-atop', '1-aB', 'aA'),
-        ('xor',              '1-aB', '1-aA'),
-        ('copy',             '1',    '0'),
-        ('lighter',          '1',    '1'),
-        ('clear',            '0',    '0'),
-    ]
-
-    # The ones that change the output when src = (0,0,0,0):
-    ops_trans = [ 'source-in', 'destination-in', 'source-out', 'destination-atop', 'copy' ];
-
-    def calc_output(A, B, FA_code, FB_code):
-        (RA, GA, BA, aA) = A
-        (RB, GB, BB, aB) = B
-        rA, gA, bA = RA*aA, GA*aA, BA*aA
-        rB, gB, bB = RB*aB, GB*aB, BB*aB
-
-        FA = eval(FA_code)
-        FB = eval(FB_code)
-
-        rO = rA*FA + rB*FB
-        gO = gA*FA + gB*FB
-        bO = bA*FA + bB*FB
-        aO = aA*FA + aB*FB
-
-        rO = min(255, rO)
-        gO = min(255, gO)
-        bO = min(255, bO)
-        aO = min(1, aO)
-
-        if aO:
-            RO = rO / aO
-            GO = gO / aO
-            BO = bO / aO
-        else: RO = GO = BO = 0
-
-        return (RO, GO, BO, aO)
-
-    def to_test(color):
-        r, g, b, a = color
-        return '%d,%d,%d,%d' % (round(r), round(g), round(b), round(a*255))
-    def to_cairo(color):
-        r, g, b, a = color
-        return '%f,%f,%f,%f' % (r/255., g/255., b/255., a)
-
-    for (name, src, dest) in [
-        ('solid', (255, 255, 0, 1.0), (0, 255, 255, 1.0)),
-        ('transparent', (0, 0, 255, 0.75), (0, 255, 0, 0.5)),
-            # catches the atop, xor and lighter bugs in Opera 9.10
-    ]:
-        for op, FA_code, FB_code in ops:
-            expected = calc_output(src, dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, src, to_test(expected)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % to_cairo(expected),
-            } )
-
-    for (name, src, dest) in [ ('image', (255, 255, 0, 0.75), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            expected = calc_output(src, dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const response = await fetch('/images/yellow75.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx.drawImage(bitmap, 0, 0);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % to_cairo(expected),
-            } )
-
-    for (name, src, dest) in [ ('canvas', (255, 255, 0, 0.75), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            expected = calc_output(src, dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const canvas2 = document.createElement('canvas');
-    canvas2.width = canvas.width;
-    canvas2.height = canvas.height;
-    const ctx2 = canvas2.getContext('2d');
-    const response = await fetch('/images/yellow75.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx2.drawImage(bitmap, 0, 0);
-    ctx.drawImage(canvas2, 0, 0);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % to_cairo(expected),
-            } )
-
-
-    for (name, src, dest) in [ ('uncovered.fill', (0, 0, 255, 0.75), (0, 255, 0, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    ctx.fillStyle = 'rgba%s';
-    ctx.translate(0, 25);
-    ctx.fillRect(0, 50, 100, 50);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, src, to_test(expected0)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % (to_cairo(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('uncovered.image', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.',
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const response = await fetch('/images/yellow.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx.drawImage(bitmap, 40, 40, 10, 10, 40, 50, 10, 10);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected0)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % (to_cairo(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('uncovered.nocontext', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const canvas2 = document.createElement('canvas');
-    canvas2.width = canvas.width;
-    canvas2.height = canvas.height;
-    ctx.drawImage(canvas2, 0, 0);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected0)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % (to_cairo(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('uncovered.pattern', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.',
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const response = await fetch('/images/yellow.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx.fillStyle = ctx.createPattern(bitmap, 'no-repeat');
-    ctx.fillRect(0, 50, 100, 50);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected0)),
-                'expected': """size 100 50
-    cr.set_source_rgba(%s)
-    cr.rectangle(0, 0, 100, 50)
-    cr.fill()
-    """ % (to_cairo(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('clip', (255, 0, 0, 1), (0, 255, 0, 1)) ]:
-        for op, FA_code, FB_code in ops:
-            expected = (0, 255, 0, 1.0)
-            tests.append( {
-                'name': '2d.composite.clip.%s' % (op),
-                'desc': 'fill() does not affect pixels outside the clip region.',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    ctx.rect(-20, -20, 10, 10);
-    ctx.clip();
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 50, 50);
-    @assert pixel 50,25 == %s;
-    """ % (dest, op, src, to_test(expected)),
-                'expected': 'green'
-            } )
-
-- meta: |
     # Color parsing tests
 
     # Try most of the CSS3 Color <color> values - http://www.w3.org/TR/css3-color/#colorunits
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/meta.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/meta.yaml
index e9f4239..635f6636 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/meta.yaml
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/meta.yaml
@@ -1,219 +1,4 @@
 - meta: |
-    # Composite operation tests
-    # <http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2007-March/010608.html>
-    ops = [
-        # name               FA      FB
-        ('source-over',      '1',    '1-aA'),
-        ('destination-over', '1-aB', '1'),
-        ('source-in',        'aB',   '0'),
-        ('destination-in',   '0',    'aA'),
-        ('source-out',       '1-aB', '0'),
-        ('destination-out',  '0',    '1-aA'),
-        ('source-atop',      'aB',   '1-aA'),
-        ('destination-atop', '1-aB', 'aA'),
-        ('xor',              '1-aB', '1-aA'),
-        ('copy',             '1',    '0'),
-        ('lighter',          '1',    '1'),
-        ('clear',            '0',    '0'),
-    ]
-
-    # The ones that change the output when src = (0,0,0,0):
-    ops_trans = [ 'source-in', 'destination-in', 'source-out', 'destination-atop', 'copy' ];
-
-    def calc_output(A, B, FA_code, FB_code):
-        RA, GA, BA, aA = A
-        RB, GB, BB, aB = B
-        rA, gA, bA = RA*aA, GA*aA, BA*aA
-        rB, gB, bB = RB*aB, GB*aB, BB*aB
-
-        FA = eval(FA_code)
-        FB = eval(FB_code)
-
-        rO = rA*FA + rB*FB
-        gO = gA*FA + gB*FB
-        bO = bA*FA + bB*FB
-        aO = aA*FA + aB*FB
-
-        rO = min(255, rO)
-        gO = min(255, gO)
-        bO = min(255, bO)
-        aO = min(1, aO)
-
-        if aO:
-            RO = rO / aO
-            GO = gO / aO
-            BO = bO / aO
-        else: RO = GO = BO = 0
-
-        return (RO, GO, BO, aO)
-
-    def to_test(color):
-        r, g, b, a = color
-        return '%d,%d,%d,%d' % (round(r), round(g), round(b), round(a*255))
-    def to_cairo(color):
-        r, g, b, a = color
-        return '%f,%f,%f,%f' % (r/255., g/255., b/255., a)
-
-    for (name, src, dest) in [
-        ('solid', (255, 255, 0, 1.0), (0, 255, 255, 1.0)),
-        ('transparent', (0, 0, 255, 0.75), (0, 255, 0, 0.5)),
-            # catches the atop, xor and lighter bugs in Opera 9.10
-    ]:
-        for op, FA_code, FB_code in ops:
-            expected = calc_output(src, dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    t.done();
-    """ % (dest, op, src, to_test(expected)),
-            } )
-
-    for (name, src, dest) in [ ('image', (255, 255, 0, 0.75), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            expected = calc_output(src, dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const response = await fetch('/images/yellow75.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx.drawImage(bitmap, 0, 0);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected)),
-            } )
-
-    for (name, src, dest) in [ ('canvas', (255, 255, 0, 0.75), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            expected = calc_output(src, dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const canvas2 = new OffscreenCanvas(canvas.width, canvas.height);
-    const ctx2 = canvas2.getContext('2d');
-    const response = await fetch('/images/yellow75.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx2.drawImage(bitmap, 0, 0);
-    ctx.drawImage(canvas2, 0, 0);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected)),
-            } )
-
-    for (name, src, dest) in [ ('uncovered.fill', (0, 0, 255, 0.75), (0, 255, 0, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            new_test = {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    ctx.fillStyle = 'rgba%s';
-    ctx.translate(0, 25);
-    ctx.fillRect(0, 50, 100, 50);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    t.done();
-    """ % (dest, op, src, to_test(expected0)),
-            }
-            if op == 'destination-in':
-              new_test['timeout'] = 'long'
-            tests.append(new_test)
-
-    for (name, src, dest) in [ ('uncovered.image', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.',
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const response = await fetch('/images/yellow.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx.drawImage(bitmap, 40, 40, 10, 10, 40, 50, 10, 10);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('uncovered.nocontext', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const canvas2 = new OffscreenCanvas(canvas.width, canvas.height);
-    ctx.drawImage(canvas2, 0, 0);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    t.done();
-    """ % (dest, op, to_test(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('uncovered.pattern', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]:
-        for op, FA_code, FB_code in ops:
-            if op not in ops_trans: continue
-            expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code)
-            tests.append( {
-                'name': '2d.composite.%s.%s' % (name, op),
-                'desc': 'Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.',
-                'test_type': 'promise',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    const response = await fetch('/images/yellow.png')
-    const blob = await response.blob();
-    const bitmap = await createImageBitmap(blob);
-    ctx.fillStyle = ctx.createPattern(bitmap, 'no-repeat');
-    ctx.fillRect(0, 50, 100, 50);
-    @assert pixel 50,25 ==~ %s +/- 5;
-    """ % (dest, op, to_test(expected0)),
-            } )
-
-    for (name, src, dest) in [ ('clip', (255, 0, 0, 1), (0, 255, 0, 1)) ]:
-        for op, FA_code, FB_code in ops:
-            expected = (0, 255, 0, 1.0)
-            tests.append( {
-                'name': '2d.composite.clip.%s' % (op),
-                'desc': 'fill() does not affect pixels outside the clip region.',
-                'code': """
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 100, 50);
-    ctx.globalCompositeOperation = '%s';
-    ctx.rect(-20, -20, 10, 10);
-    ctx.clip();
-    ctx.fillStyle = 'rgba%s';
-    ctx.fillRect(0, 0, 50, 50);
-    @assert pixel 50,25 == %s;
-    t.done();
-    """ % (dest, op, src, to_test(expected)),
-            } )
-
-- meta: |
     # Color parsing tests
 
     # Try most of the CSS3 Color <color> values - http://www.w3.org/TR/css3-color/#colorunits
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/fallback-helper.js b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/fallback-helper.js
index d2b9343e..5b62c71e 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/fallback-helper.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-select-element/customizable-select/resources/fallback-helper.js
@@ -51,6 +51,14 @@
 `;
 
 async function generateTestFrame(numOptions,initialx,initialy) {
+  const featureCheck = document.createElement('span');
+  featureCheck.innerHTML = '<select><div>';
+  if (!featureCheck.querySelector('div')) {
+    document.body.textContent = 'FAIL: customizable select is disabled';
+    document.documentElement.classList.remove('reftest-wait');
+    return;
+  }
+
   const singleOption = `<option>${testSelectOptionText}</option>`
   const options = Array(numOptions).fill(singleOption).join('\n');
   const content = `
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-corner-cases.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-corner-cases.html
new file mode 100644
index 0000000..e25b953
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-corner-cases.html
@@ -0,0 +1,154 @@
+<!doctype html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<link rel=help href="https://html.spec.whatwg.org/multipage/interactive-elements.html#dialog-light-dismiss">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="../../popovers/resources/popover-utils.js"></script>
+
+<button id="outside">Outside</button>
+<dialog id="dialog" closedby="any"></dialog>
+
+<script>
+  const dialog = document.getElementById('dialog');
+  async function openDialog(openMethod) {
+    dialog.close();
+    if (!dialog.open) {
+      assert_false(dialog.matches(':open'),'Should be closed to start');
+      switch (openMethod) {
+        case 'modeless' :
+          dialog.show();
+          break;
+        case 'modal' :
+          dialog.showModal();
+          break;
+        case 'open' :
+          dialog.open = true;
+          break;
+        default:
+          assert_unreached('Invalid open method');
+      }
+    }
+    await waitForRender();
+    assert_true(dialog.open,'Should be open now');
+    assert_true(dialog.matches(':open'),'Should be open now (pseudo)');
+  }
+
+  const changeMethods = [
+    {
+      description: 'focusin removes and reinserts',
+      setup: (openMethod,signal) => {
+        document.body.addEventListener('focusin',(e) => {
+          if (!dialog.contains(e.target)) {
+            const position = dialog.nextElementSibling;
+            dialog.remove();
+            document.body.insertBefore(dialog,position);
+          }
+        }, {signal});
+      }
+    },
+    {
+      description: 'focusin closes dialog',
+      setup: (openMethod,signal) => {
+        document.body.addEventListener('focusin',(e) => {
+          if (!dialog.contains(e.target)) {
+            dialog.close();
+          }
+        }, {signal});
+      }
+    },
+    {
+      description: 'focusin calls showModal',
+      setup: (openMethod,signal) => {
+        document.body.addEventListener('focusin',(e) => {
+          if (!dialog.contains(e.target)) {
+            try {
+              dialog.showModal();
+            } catch {}
+          }
+        }, {signal});
+        // Since the closing steps will trigger another call to showModal
+        // in this case, before we're done with closing, we should expect
+        // that the ESC/light dismiss still results in a showing modal, if it
+        // was originally modal.
+        return openMethod !== 'modal';
+      }
+    },
+    {
+      description: 'requestIdleCallback calls showModal',
+      setup: (openMethod,signal) => {
+        requestIdleCallback(() => {
+          try {
+            dialog.showModal();
+          } catch {}
+        });
+      }
+    },
+    {
+      description: 'beforetoggle closes dialog',
+      setup: (openMethod,signal) => {
+        dialog.addEventListener('beforetoggle',() => dialog.close(), {signal});
+      }
+    },
+    {
+      description: 'beforetoggle calls showModal',
+      setup: (openMethod,signal) => {
+        let stackProtector = 0;
+        dialog.addEventListener('beforetoggle',() => {
+          if (++stackProtector > 20) {
+            return;
+          }
+          try {
+            dialog.showModal();
+          } catch {}
+        }, {signal});
+      }
+    },
+  ];
+
+  function runTest(openMethod, changeMethod) {
+    promise_test(async (t) => {
+      assert_false(dialog.open,'setup');
+      assert_false(dialog.matches(':open'));
+
+      const controller = new AbortController();
+      t.add_cleanup(() => {
+        controller.abort();
+        dialog.close();
+      });
+      const expectResponds = changeMethod.setup(openMethod,controller.signal) ?? true;
+
+      // Open the dialog
+      await openDialog(openMethod);
+
+      // Try hitting ESC
+      const ESC = '\uE00C';
+      await test_driver.send_keys(document.documentElement,ESC);
+      await waitForRender();
+      const respondsToEsc = !dialog.open;
+      assert_equals(!dialog.matches(':open'),respondsToEsc,':open should match dialog.open');
+      dialog.close();
+
+      // Try clicking outside
+      await openDialog(openMethod);
+      await clickOn(outside);
+      const respondsToLightDismiss = !dialog.open;
+      assert_equals(!dialog.matches(':open'),respondsToLightDismiss,':open should match dialog.open');
+      dialog.close();
+
+      // See if expectations match
+      assert_equals(respondsToEsc,expectResponds,`Dialog ${expectResponds ? "should" : "should NOT"} respond to ESC`);
+      assert_equals(respondsToLightDismiss,expectResponds,`Dialog ${expectResponds ? "should" : "should NOT"} respond to light dismiss`);
+    }, `${changeMethod.description}, ${openMethod}`);
+  }
+
+  // Run tests
+  for(openMethod of ['modeless','modal','open']) {
+    for (const changeMethod of changeMethods) {
+      runTest(openMethod, changeMethod);
+    }
+  }
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open-expected.txt
deleted file mode 100644
index 4b5bc47..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Opening and closing a dialog during the dialog focus fixup should still leave closedby functional
-  assert_false: ESC should still work expected false got true
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open.html
index 52432ff..0606d9b0 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-start-open.html
@@ -16,12 +16,16 @@
 promise_test(async (t) => {
   const dialog = document.querySelector('dialog#test1');
   assert_true(dialog.open);
+  assert_true(dialog.matches(':open'));
   await new test_driver.send_keys(document.documentElement,ESC);
   assert_false(dialog.open);
+  assert_false(dialog.matches(':open'));
   dialog.showModal();
   assert_true(dialog.open);
+  assert_true(dialog.matches(':open'));
   await new test_driver.send_keys(document.documentElement,ESC);
   assert_false(dialog.open);
+  assert_false(dialog.matches(':open'));
 }, `Dialogs that start open and have closedby should still function`);
 </script>
 
@@ -32,11 +36,24 @@
 
 <script>
 promise_test(async (t) => {
-  // This test case is pulled from `dialog-closewatcher-crash.html`.
+  // This test case is pulled from `dialog-closewatcher-crash.html`. It is
+  // constructed such that this happens:
+  //  1. The dialog `open` attribute is removed, which (depending on whether
+  //     https://github.com/whatwg/html/pull/10124 behavior is happening) calls
+  //     the close() steps.
+  //  2. the last step of close() is to restore focus to the previously-focused
+  //     element.
+  //  3. Changing focus triggers the `focusin` event, which calls `showModal()`.
+  //  4. In showModal(), the dialog is again made modal, re-constructing the
+  //     close watcher and re-setting the `open` attribute.
+  //  5. The call to close() ends.
+  // After all of this, if things are working, the ESC key should still cause
+  // the dialog to be closed.
   const dialog = document.querySelector('dialog#test2');
+  const controller = new AbortController();
   document.querySelector('dl').addEventListener("focusin", () => {
     dialog.showModal();
-  });
+  },{signal:controller.signal});
   // This will trigger the focus-the-previous-element behavior, which will fire
   // the `focusin` event.
   dialog.open = false;
@@ -48,7 +65,11 @@
     });
   });
   assert_true(dialog.open);
-  await new test_driver.send_keys(document.documentElement,ESC);
+  assert_true(dialog.matches(':open'));
+  // Stop re-running showModal(), so we can check that the dialog closes with ESC:
+  controller.abort();
+  await test_driver.send_keys(document.documentElement,ESC);
   assert_false(dialog.open,'ESC should still work');
+  assert_false(dialog.matches(':open'));
 }, `Opening and closing a dialog during the dialog focus fixup should still leave closedby functional`);
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby.html
index 65902ed..50d60021 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby.html
@@ -12,92 +12,128 @@
 <button id="outside">Outside</button>
 
 <!-- test cases: -->
+
+<!-- normal cases: -->
 <dialog closedby="any" data-behavior="any"></dialog>
 <dialog closedby="closerequest" data-behavior="closerequest"></dialog>
 <dialog closedby="none" data-behavior="none"></dialog>
 
+<!-- case sensitivity: -->
 <dialog closedby="AnY" data-behavior="any"></dialog>
 <dialog closedby="ClOsErEqUeSt" data-behavior="closerequest"></dialog>
 <dialog closedby="NoNe" data-behavior="none"></dialog>
 
+<!-- invalid value, no value, missing attribute: -->
 <dialog closedby="invalid" data-behavior="auto"></dialog>
 <dialog closedby data-behavior="auto"></dialog>
 <dialog data-behavior="auto"></dialog>
 
 <script>
-  function openDialog(dialog,modal) {
-    assert_false(dialog.open);
-    if (modal) {
-      dialog.showModal();
-    } else {
-      dialog.show();
+  async function openDialog(dialog,openMethod) {
+    assert_false(dialog.open,'Should be closed to start');
+    assert_equals(dialog.matches(':open'),dialog.open,':open should match .open');
+    switch (openMethod) {
+      case 'modeless' :
+        dialog.show();
+        break;
+      case 'modal' :
+        dialog.showModal();
+        break;
+      case 'open' :
+        dialog.open = true;
+        break;
+      default:
+        assert_unreached('Invalid open method');
     }
-    assert_true(dialog.open);
-    assert_equals(dialog.matches(':modal'),modal);
+    await waitForRender();
+    assert_true(dialog.open,'Should be open now');
+    assert_equals(dialog.matches(':open'),dialog.open,':open should match .open');
   }
-  function runTest(dialog) {
-    for(modal of [false,true]) {
-      promise_test(async (t) => {
-        assert_false(dialog.open);
-        t.add_cleanup(() => dialog.close());
-        // Try hitting ESC
-        openDialog(dialog,modal);
-        const closedByReflectionWhileOpen = dialog.closedBy;
-        const ESC = '\uE00C';
-        await new test_driver.send_keys(document.documentElement,ESC);
-        const respondsToEsc = !dialog.open;
-        dialog.close();
-        // Try clicking outside
-        openDialog(dialog,modal);
-        await clickOn(outside);
-        const respondsToLightDismiss = !dialog.open;
-        dialog.close();
-        // See if expectations match
-        let expectedReflectionWhileOpen = dialog.dataset.behavior;
-        let expectedReflectionWhileClosed = dialog.dataset.behavior;
-        switch (dialog.dataset.behavior) {
-          case 'any':
-            assert_true(respondsToEsc,'Dialog should respond to ESC');
-            assert_true(respondsToLightDismiss,'Dialog should respond to light dismiss');
-            break;
-          case 'closerequest':
-            assert_true(respondsToEsc,'Dialog should respond to ESC');
-            assert_false(respondsToLightDismiss,'Dialog should NOT respond to light dismiss');
-            break;
-          case 'none':
-            assert_false(respondsToEsc,'Dialog should NOT respond to ESC');
-            assert_false(respondsToLightDismiss,'Dialog should NOT respond to light dismiss');
-            break;
-          case 'auto':
-            if (modal) {
-              assert_true(respondsToEsc,'Modal dialog in auto state should respond to ESC');
-              assert_false(respondsToLightDismiss,'Modal dialog in auto state should NOT respond to light dismiss');
-              expectedReflectionWhileOpen = 'closerequest';
-            } else {
-              assert_false(respondsToEsc,'Non-modal dialog in auto state should NOT respond to ESC');
-              assert_false(respondsToLightDismiss,'Non-modal dialog in auto state should NOT respond to light dismiss');
-              expectedReflectionWhileOpen = 'none';
-            }
-            expectedReflectionWhileClosed = 'none';
-            break;
-          default:
-            assert_unreached('Invalid expectation');
+
+  function getDefaultExpectations(behavior, openMethod) {
+    switch (behavior) {
+      case 'any':
+        return {
+          respondsToEsc: true,
+          respondsToLightDismiss: true,
+          expectedReflectionWhileOpen: behavior,
+          expectedReflectionWhileClosed: behavior,
+        };
+      case 'closerequest':
+        return {
+          respondsToEsc: true,
+          respondsToLightDismiss: false,
+          expectedReflectionWhileOpen: behavior,
+          expectedReflectionWhileClosed: behavior,
+        };
+      case 'none':
+        return {
+          respondsToEsc: false,
+          respondsToLightDismiss: false,
+          expectedReflectionWhileOpen: behavior,
+          expectedReflectionWhileClosed: behavior,
+        };
+      case 'auto':
+        if (openMethod === 'modal') {
+          return {
+            respondsToEsc: true,
+            respondsToLightDismiss: false,
+            expectedReflectionWhileOpen: 'closerequest',
+            expectedReflectionWhileClosed: 'none',
+          };
+        } else {
+          return {
+            respondsToEsc: false,
+            respondsToLightDismiss: false,
+            expectedReflectionWhileOpen: 'none',
+            expectedReflectionWhileClosed: 'none',
+          };
         }
-        // Check reflection
-        assert_equals(closedByReflectionWhileOpen,expectedReflectionWhileOpen,'Reflection should be limited to known values (open)');
-        assert_equals(dialog.closedBy,expectedReflectionWhileClosed,'Reflection should be limited to known values (closed)');
-      }, `closedby=${dialog.getAttribute('closedby')}, ${modal ? 'Modal' : 'Non-modal'}`);
+      default:
+        assert_unreached('Invalid expectation');
     }
   }
 
-  // Add close button, in case of manual testing
-  const testDialogs = document.querySelectorAll('dialog');
-  testDialogs.forEach(dialog => {
-    const button = dialog.appendChild(document.createElement('button'));
-    button.innerText = 'Close';
-    button.addEventListener('click',() => dialog.close());
-  });
+  function runTest(dialog, openMethod) {
+    promise_test(async (t) => {
+      assert_false(dialog.open,'setup');
+      assert_false(dialog.matches(':open'));
+      t.add_cleanup(() => dialog.close());
+
+      // Open the dialog
+      await openDialog(dialog,openMethod);
+      assert_equals(dialog.matches(':modal'),openMethod === 'modal',':modal incorrect');
+      const closedByReflectionWhileOpen = dialog.closedBy;
+
+      // Try hitting ESC
+      const ESC = '\uE00C';
+      await test_driver.send_keys(document.documentElement,ESC);
+      await waitForRender();
+      const respondsToEsc = !dialog.open;
+      assert_equals(!dialog.matches(':open'),respondsToEsc,':open should match dialog.open');
+      dialog.close();
+
+      // Try clicking outside
+      await openDialog(dialog,openMethod);
+      assert_equals(dialog.matches(':modal'),openMethod === 'modal',':modal incorrect');
+      await clickOn(outside);
+      const respondsToLightDismiss = !dialog.open;
+      assert_equals(!dialog.matches(':open'),respondsToLightDismiss,':open should match dialog.open');
+      dialog.close();
+
+      // See if expectations match
+      let expectations = getDefaultExpectations(dialog.dataset.behavior, openMethod);
+      assert_equals(respondsToEsc,expectations.respondsToEsc,`Dialog ${expectations.respondsToEsc ? "should" : "should NOT"} respond to ESC`);
+      assert_equals(respondsToLightDismiss,expectations.respondsToLightDismiss,`Dialog ${expectations.respondsToLightDismiss ? "should" : "should NOT"} respond to light dismiss`);
+      assert_equals(closedByReflectionWhileOpen,expectations.expectedReflectionWhileOpen,'Reflection should be limited to known values (open)');
+      assert_equals(dialog.closedBy,expectations.expectedReflectionWhileClosed,'Reflection should be limited to known values (closed)');
+    }, `closedby=${dialog.getAttribute('closedby')}, ${openMethod}`);
+  }
 
   // Run tests
-  testDialogs.forEach(runTest);
+  document.querySelectorAll('dialog').forEach((dialog) => {
+    for(openMethod of ['modeless','modal','open']) {
+      runTest(dialog, openMethod);
+    }
+  });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-simple.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-simple.html
index f1d78e1..afea395 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-simple.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-simple.html
@@ -53,11 +53,11 @@
     'dialog should close if closedby=any');
   resetDialogOuterTest(dialog,popover);
   const ESC = '\uE00C';
-  await new test_driver.send_keys(document.documentElement,ESC);
+  await test_driver.send_keys(document.documentElement,ESC);
   assert_false(popover.matches(':popover-open'),
     'popover should close after first ESC');
   assert_true(dialog.open,'dialog should stay open for first ESC');
-  await new test_driver.send_keys(document.documentElement,ESC);
+  await test_driver.send_keys(document.documentElement,ESC);
   assert_equals(dialog.open,dialog.closedBy === 'none',
     'dialog should close on second ESC, if closedby is not none');
 }
@@ -115,12 +115,12 @@
   }
   resetPopoverOuterTest(dialog,popover);
   const ESC = '\uE00C';
-  await new test_driver.send_keys(document.documentElement,ESC);
+  await test_driver.send_keys(document.documentElement,ESC);
   assert_equals(dialog.open,dialog.closedBy === 'none',
   'dialog should close after first ESC, if closedby!=none');
   assert_true(popover.matches(':popover-open'),
   'popover should stay open for first ESC');
-  await new test_driver.send_keys(document.documentElement,ESC);
+  await test_driver.send_keys(document.documentElement,ESC);
   assert_equals(popover.matches(':popover-open'),dialog.closedBy === 'none',
   'popover should close on second ESC, unless inner dialog prevents with closedby==none');
 }
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
index 3790926..f63bc91 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
@@ -11,15 +11,25 @@
 
 <script>
 const dialog = document.querySelector('dialog');
-function openDialog(modal) {
+function openDialog(openMethod) {
   assert_false(dialog.open);
-  if (modal) {
-    dialog.showModal();
-  } else {
-    dialog.show();
+  assert_false(dialog.matches(':open'));
+  switch (openMethod) {
+    case 'modeless':
+      dialog.show();
+      break;
+    case 'modal':
+      dialog.showModal();
+      break;
+    case 'open':
+      dialog.open = true;
+      break;
+    default:
+      assert_unreached('Unknown open method');
   }
   assert_true(dialog.open);
-  assert_equals(dialog.matches(':modal'),modal);
+  assert_true(dialog.matches(':open'));
+  assert_equals(dialog.matches(':modal'),openMethod === 'modal');
 }
 function getSignal(t) {
   const controller = new AbortController();
@@ -43,14 +53,15 @@
   return getSignal(t);
 }
 
-[false,true].forEach(modal => {
+['modeless','modal','open'].forEach(openMethod => {
   [null,'any','closedrequest','none'].forEach(closedby => {
-    const testDescription = `for ${modal ? "modal" : "modeless"} dialog with closedby=${closedby}`;
+    const testDescription = `for ${openMethod} dialog with closedby=${closedby}`;
     promise_test(async (t) => {
       await setup(t,closedby);
-      openDialog(modal);
+      openDialog(openMethod);
       dialog.requestClose();
       assert_false(dialog.open);
+      assert_false(dialog.matches(':open'));
     },`requestClose basic behavior ${testDescription}`);
 
     promise_test(async (t) => {
@@ -58,10 +69,11 @@
       let events = [];
       dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
       dialog.addEventListener('close',() => events.push('close'),{signal});
-      openDialog(modal);
+      openDialog(openMethod);
       assert_array_equals(events,[]);
       dialog.requestClose();
       assert_false(dialog.open);
+      assert_false(dialog.matches(':open'));
       assert_array_equals(events,['cancel'],'close is scheduled');
       await new Promise(resolve => requestAnimationFrame(resolve));
       assert_array_equals(events,['cancel','close']);
@@ -72,14 +84,15 @@
       let events = [];
       dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
       dialog.addEventListener('close',() => events.push('close'),{signal});
-      openDialog(modal);
+      openDialog(openMethod);
       dialog.setAttribute('closedby',closedby);
       assert_array_equals(events,[]);
       dialog.requestClose();
       assert_false(dialog.open,'Adding closedby after dialog is open');
+      assert_false(dialog.matches(':open'));
       assert_array_equals(events,['cancel']);
       events=[];
-      openDialog(modal);
+      openDialog(openMethod);
       dialog.removeAttribute('closedby');
       assert_array_equals(events,[]);
       dialog.requestClose();
@@ -96,32 +109,36 @@
             e.preventDefault();
           }
         },{signal});
-        openDialog(modal);
+        openDialog(openMethod);
         dialog.requestClose();
         assert_true(dialog.open,'cancel event was cancelled - dialog shouldn\'t close');
+        assert_true(dialog.matches(':open'));
         shouldPreventDefault = false;
         dialog.requestClose();
         assert_false(dialog.open,'cancel event was not cancelled - dialog should now close');
+        assert_false(dialog.matches(':open'));
       },`requestClose can be cancelled ${testDescription}`);
 
       promise_test(async (t) => {
         const signal = await setup(t,closedby);
         dialog.addEventListener('cancel',(e) => e.preventDefault(),{signal});
-        openDialog(modal);
+        openDialog(openMethod);
         // No user activation here.
         dialog.requestClose();
         dialog.requestClose();
         dialog.requestClose();
         assert_true(dialog.open,'cancel event was cancelled - dialog shouldn\'t close');
+        assert_true(dialog.matches(':open'));
       },`requestClose avoids abuse prevention logic ${testDescription}`);
 
       promise_test(async (t) => {
         await setup(t,closedby);
-        openDialog(modal);
+        openDialog(openMethod);
         assert_equals(dialog.returnValue,'','Return value starts out empty');
         const returnValue = 'The return value';
         dialog.requestClose(returnValue);
         assert_false(dialog.open);
+        assert_false(dialog.matches(':open'));
         assert_equals(dialog.returnValue,returnValue,'Return value should be set');
         dialog.show();
         dialog.close();
@@ -134,11 +151,12 @@
       promise_test(async (t) => {
         await setup(t,closedby);
         dialog.addEventListener('cancel',(e) => e.preventDefault(),{once:true});
-        openDialog(modal);
+        openDialog(openMethod);
         dialog.returnValue = 'foo';
         assert_equals(dialog.returnValue,'foo');
         dialog.requestClose('This should not get saved');
         assert_true(dialog.open,'cancelled');
+        assert_true(dialog.matches(':open'));
         assert_equals(dialog.returnValue,'foo','Return value should not be changed');
       },`requestClose(returnValue) doesn't change returnvalue when cancelled ${testDescription}`);
     }
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/button-type-popovertarget-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/button-type-popovertarget-expected.txt
deleted file mode 100644
index 4809845e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/button-type-popovertarget-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Button type=reset in form should trigger form reset and toggle popover
-  assert_true: type=reset should toggle the popover expected true got false
-[FAIL] Button type=reset with form attr should trigger form reset and toggle popover
-  assert_true: type=reset should toggle the popover expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/resources/popover-utils.js b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/resources/popover-utils.js
index 10783e6..544ec843 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/resources/popover-utils.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/resources/popover-utils.js
@@ -22,7 +22,7 @@
 async function sendTab() {
   await waitForRender();
   const kTab = '\uE004';
-  await new test_driver.send_keys(document.activeElement || document.documentElement, kTab);
+  await test_driver.send_keys(document.activeElement || document.documentElement, kTab);
   await waitForRender();
 }
 async function sendShiftTab() {
@@ -39,12 +39,12 @@
 }
 async function sendEscape() {
   await waitForRender();
-  await new test_driver.send_keys(document.activeElement || document.documentElement,'\uE00C'); // Escape
+  await test_driver.send_keys(document.activeElement || document.documentElement,'\uE00C'); // Escape
   await waitForRender();
 }
 async function sendEnter() {
   await waitForRender();
-  await new test_driver.send_keys(document.activeElement || document.documentElement,'\uE007'); // Enter
+  await test_driver.send_keys(document.activeElement || document.documentElement,'\uE007'); // Enter
   await waitForRender();
 }
 function isElementVisible(el) {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch.tentative-expected.txt
deleted file mode 100644
index 080c736..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch.tentative-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] event does dispatch if button is form associated, with explicit type=reset
-  assert_true: event was called expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/button-type-behavior.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/button-type-behavior.tentative-expected.txt
deleted file mode 100644
index 4809845e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/button-type-behavior.tentative-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Button type=reset in form should trigger form reset and toggle popover
-  assert_true: type=reset should toggle the popover expected true got false
-[FAIL] Button type=reset with form attr should trigger form reset and toggle popover
-  assert_true: type=reset should toggle the popover expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/speech-api/SpeechRecognition-detached-iframe.window.js b/third_party/blink/web_tests/external/wpt/speech-api/SpeechRecognition-detached-iframe.window.js
new file mode 100644
index 0000000..3587be2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speech-api/SpeechRecognition-detached-iframe.window.js
@@ -0,0 +1,35 @@
+// META: title=SpeechRecognition in a detached iframe test
+
+test(() => {
+  // Create the iframe and append it to the document.
+  const iframe = document.createElement("iframe");
+  document.body.appendChild(iframe);
+  const frameWindow = iframe.contentWindow;
+
+  // Detach the iframe.
+  iframe.remove();
+
+  assert_equals(
+    undefined,
+    frameWindow.SpeechRecognition || frameWindow.webkitSpeechRecognition,
+  );
+}, "SpeechRecognition constructor does not exist in detached iframes");
+
+test((t) => {
+  // Create the iframe and append it to the document.
+  const iframe = document.createElement("iframe");
+  document.body.appendChild(iframe);
+  const frameWindow = iframe.contentWindow;
+  const frameDOMException = frameWindow.DOMException;
+
+  frameWindow.SpeechRecognition =
+    frameWindow.SpeechRecognition || frameWindow.webkitSpeechRecognition;
+  const speechRecognition = new frameWindow.SpeechRecognition();
+
+  // Detach the iframe.
+  iframe.remove();
+
+  assert_throws_dom("InvalidStateError", frameDOMException, () =>
+    speechRecognition.start(),
+  );
+}, "SpeechRecognition.start() on detached frame throws");
diff --git a/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt b/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt
index 45028a27..f901530 100644
--- a/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 182 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 178 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] SVGElement interface: attribute correspondingElement
   assert_true: The prototype object must have a property "correspondingElement" expected true got false
 [FAIL] SVGElement interface: attribute correspondingUseElement
@@ -200,10 +200,6 @@
   assert_true: The prototype object must have a property "download" expected true got false
 [FAIL] SVGAElement interface: attribute ping
   assert_true: The prototype object must have a property "ping" expected true got false
-[FAIL] SVGAElement interface: attribute rel
-  assert_true: The prototype object must have a property "rel" expected true got false
-[FAIL] SVGAElement interface: attribute relList
-  assert_true: The prototype object must have a property "relList" expected true got false
 [FAIL] SVGAElement interface: attribute hreflang
   assert_true: The prototype object must have a property "hreflang" expected true got false
 [FAIL] SVGAElement interface: attribute type
@@ -236,10 +232,6 @@
   assert_inherits: property "download" not found in prototype chain
 [FAIL] SVGAElement interface: objects.a must inherit property "ping" with the proper type
   assert_inherits: property "ping" not found in prototype chain
-[FAIL] SVGAElement interface: objects.a must inherit property "rel" with the proper type
-  assert_inherits: property "rel" not found in prototype chain
-[FAIL] SVGAElement interface: objects.a must inherit property "relList" with the proper type
-  assert_inherits: property "relList" not found in prototype chain
 [FAIL] SVGAElement interface: objects.a must inherit property "hreflang" with the proper type
   assert_inherits: property "hreflang" not found in prototype chain
 [FAIL] SVGAElement interface: objects.a must inherit property "type" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-getter-01-expected.txt b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-getter-01-expected.txt
deleted file mode 100644
index 9b6b22b..0000000
--- a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-getter-01-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Test anchor's rel getter
-  assert_equals: expected (string) "noreferrer" but got (undefined) undefined
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-noopener-policy.html b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-noopener-policy.html
new file mode 100644
index 0000000..1e2d6d4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-noopener-policy.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/linking.html#InterfaceSVGAElement">
+<title> Rel attribute with noopener value </title>
+<svg>
+  <a id="test" href="resources/a.rel-noopener-policy-target.html" rel="noopener"></a>
+  <script>
+    var anchorElement = document.getElementById('test');
+
+    // Simulate a click event
+    var event = new MouseEvent('click', {
+      view: window,
+      bubbles: true,
+      cancelable: true
+    });
+
+    // Dispatch the event to the anchor element
+    anchorElement.dispatchEvent(event);
+  </script>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-noreferrer-policy.html b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-noreferrer-policy.html
new file mode 100644
index 0000000..3e063e13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/a.rel-noreferrer-policy.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/linking.html#InterfaceSVGAElement">
+<title> Rel attribute with noreferrer value </title>
+<svg>
+  <a id="test" href="resources/a.rel-noreferrer-policy-target.html" rel="noreferrer"></a>
+  <script>
+    var anchorElement = document.getElementById('test');
+
+    // Simulate a click event
+    var event = new MouseEvent('click', {
+      view: window,
+      bubbles: true,
+      cancelable: true
+    });
+
+    // Dispatch the event to the anchor element
+    anchorElement.dispatchEvent(event);
+  </script>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/rellist-feature-detection-expected.txt b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/rellist-feature-detection-expected.txt
deleted file mode 100644
index caae3838..0000000
--- a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/rellist-feature-detection-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Make sure that relList based feature detection is working
-  Cannot read properties of undefined (reading 'contains')
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/resources/a.rel-noopener-policy-target.html b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/resources/a.rel-noopener-policy-target.html
new file mode 100644
index 0000000..39aaa784
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/resources/a.rel-noopener-policy-target.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/linking.html#InterfaceSVGAElement">
+<script>
+  test(function () {
+    assert_equals(true,window.opener == null);
+  }, "No Opener policy attribute on svg anchor element is applied");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/linking/scripted/resources/a.rel-noreferrer-policy-target.html b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/resources/a.rel-noreferrer-policy-target.html
new file mode 100644
index 0000000..76b15f5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/linking/scripted/resources/a.rel-noreferrer-policy-target.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/linking.html#InterfaceSVGAElement">
+<script>
+  test(function () {
+    assert_equals("", document.referrer);
+  }, "No Referrer policy attribute on svg anchor element is applied");
+</script>
diff --git a/third_party/blink/web_tests/fast/dom/Window/post-message-detach-in-handler.html b/third_party/blink/web_tests/fast/dom/Window/post-message-detach-in-handler.html
index 0faa5fd3..6e61fd4 100644
--- a/third_party/blink/web_tests/fast/dom/Window/post-message-detach-in-handler.html
+++ b/third_party/blink/web_tests/fast/dom/Window/post-message-detach-in-handler.html
@@ -14,7 +14,9 @@
 }
 
 function postMessageToSelf() {
-    setInterval(function() { iframe.contentWindow.postMessage("msg", "*"); }, 0);
+    setInterval(function() {
+        if (iframe.contentWindow)
+            iframe.contentWindow.postMessage("msg", "*"); }, 0);
 }
 
 function receiveMessage(event) {
diff --git a/third_party/blink/web_tests/fast/events/event-hit-testing-fallback-to-iframe.html b/third_party/blink/web_tests/fast/events/event-hit-testing-fallback-to-iframe.html
index 1c38a1f..596e258 100644
--- a/third_party/blink/web_tests/fast/events/event-hit-testing-fallback-to-iframe.html
+++ b/third_party/blink/web_tests/fast/events/event-hit-testing-fallback-to-iframe.html
@@ -1,11 +1,12 @@
 <!DOCTYPE html>
 
+<script src="../../resources/js-test.js"></script>
+
 <body>
-  <iframe src="resources/body-overflow-iframe.html" height="100px"></iframe>
+  <iframe id=targetFrame height="100px"></iframe>
   <div id='console'></div>
 </body>
 
-<script src="../../resources/js-test.js"></script>
 <script>
 description("Test that when the hit test of input event in an iframe does not hit " +
             "anything (not even the html/body), the input event is still captured " +
@@ -48,4 +49,7 @@
 
 }, true);
 
+window.onload = function() {
+  targetFrame.src = 'resources/body-overflow-iframe.html';
+};
 </script>
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 4bee010..06c5252 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -125,6 +125,7 @@
     method languagePairAvailable
 interface AITranslatorFactory
     attribute @@toStringTag
+    method availability
     method capabilities
     method constructor
     method create
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-expected.txt
deleted file mode 100644
index 4025233..0000000
--- a/third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-expected.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] closedby=any, Non-modal
-  assert_true: Dialog should respond to light dismiss expected true got false
-[FAIL] closedby=any, Modal
-  assert_true: Dialog should respond to light dismiss expected true got false
-[FAIL] closedby=closerequest, Non-modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=closerequest, Modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=none, Non-modal
-  assert_false: Dialog should NOT respond to ESC expected false got true
-[FAIL] closedby=none, Modal
-  assert_false: Dialog should NOT respond to ESC expected false got true
-[FAIL] closedby=AnY, Non-modal
-  assert_true: Dialog should respond to light dismiss expected true got false
-[FAIL] closedby=AnY, Modal
-  assert_true: Dialog should respond to light dismiss expected true got false
-[FAIL] closedby=ClOsErEqUeSt, Non-modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=ClOsErEqUeSt, Modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=NoNe, Non-modal
-  assert_false: Dialog should NOT respond to ESC expected false got true
-[FAIL] closedby=NoNe, Modal
-  assert_false: Dialog should NOT respond to ESC expected false got true
-[FAIL] closedby=invalid, Non-modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=invalid, Modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=, Non-modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=, Modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=null, Non-modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-[FAIL] closedby=null, Modal
-  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_cpu-expected.txt
index 3c54b73..5f1749f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_cpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_cpu-expected.txt
@@ -1,10 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] batchNormalization float32 2D tensor (mean and variance are non-constant) default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D constant tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 4D NHWC tensor options.axis=3
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization float32 4D NHWC tensor all options
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_cpu-expected.txt
index 3c54b73..5f1749f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_cpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_cpu-expected.txt
@@ -1,10 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] batchNormalization float32 2D tensor (mean and variance are non-constant) default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D constant tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 4D NHWC tensor options.axis=3
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization float32 4D NHWC tensor all options
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt
index 79057441..429567c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt
@@ -4,29 +4,29 @@
 [FAIL] convTranspose2d default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + relu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + leakyRelu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + sigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + clamp
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + elu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + gelu
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + hardSigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + hardSwish
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + linear
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + softplus
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + softsign
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0  + softmax
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any_cpu-expected.txt
index 79057441..429567c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any_cpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any_cpu-expected.txt
@@ -4,29 +4,29 @@
 [FAIL] convTranspose2d default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + relu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + leakyRelu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + sigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + clamp
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + elu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + gelu
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + hardSigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + hardSwish
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + linear
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + softplus
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + softsign
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0  + softmax
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_gpu-expected.txt
index 3c54b73..5f1749f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_gpu-expected.txt
@@ -1,10 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] batchNormalization float32 2D tensor (mean and variance are non-constant) default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D constant tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 4D NHWC tensor options.axis=3
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization float32 4D NHWC tensor all options
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_gpu-expected.txt
index 3c54b73..5f1749f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_gpu-expected.txt
@@ -1,10 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] batchNormalization float32 2D tensor (mean and variance are non-constant) default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D constant tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 4D NHWC tensor options.axis=3
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization float32 4D NHWC tensor all options
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_gpu-expected.txt
index 79057441..429567c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_gpu-expected.txt
@@ -4,29 +4,29 @@
 [FAIL] convTranspose2d default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + relu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + leakyRelu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + sigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + clamp
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + elu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + gelu
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + hardSigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + hardSwish
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + linear
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + softplus
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + softsign
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0  + softmax
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any_gpu-expected.txt
index 79057441..429567c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any_gpu-expected.txt
@@ -4,29 +4,29 @@
 [FAIL] convTranspose2d default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + relu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + leakyRelu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + sigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + clamp
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + elu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + gelu
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + hardSigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + hardSwish
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + linear
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + softplus
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + softsign
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0  + softmax
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-corner-cases-expected.txt b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-corner-cases-expected.txt
new file mode 100644
index 0000000..2f5c973
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-corner-cases-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+[FAIL] focusin removes and reinserts, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] focusin closes dialog, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] focusin calls showModal, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] requestIdleCallback calls showModal, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] beforetoggle closes dialog, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] beforetoggle calls showModal, modeless
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] focusin removes and reinserts, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] focusin closes dialog, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] requestIdleCallback calls showModal, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] beforetoggle closes dialog, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] beforetoggle calls showModal, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] focusin removes and reinserts, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] focusin closes dialog, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] focusin calls showModal, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] requestIdleCallback calls showModal, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] beforetoggle closes dialog, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] beforetoggle calls showModal, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-expected.txt b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-expected.txt
new file mode 100644
index 0000000..87ec3659
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-closedby-expected.txt
@@ -0,0 +1,57 @@
+This is a testharness.js-based test.
+[FAIL] closedby=any, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=any, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] closedby=any, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=closerequest, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=closerequest, modal
+  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
+[FAIL] closedby=closerequest, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=none, modeless
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=none, modal
+  assert_equals: Dialog should NOT respond to ESC expected false but got true
+[FAIL] closedby=none, open
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=AnY, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=AnY, modal
+  assert_equals: Dialog should respond to light dismiss expected true but got false
+[FAIL] closedby=AnY, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=ClOsErEqUeSt, modeless
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=ClOsErEqUeSt, modal
+  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
+[FAIL] closedby=ClOsErEqUeSt, open
+  assert_equals: Dialog should respond to ESC expected true but got false
+[FAIL] closedby=NoNe, modeless
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=NoNe, modal
+  assert_equals: Dialog should NOT respond to ESC expected false but got true
+[FAIL] closedby=NoNe, open
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=invalid, modeless
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=invalid, modal
+  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
+[FAIL] closedby=invalid, open
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=, modeless
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=, modal
+  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
+[FAIL] closedby=, open
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=null, modeless
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+[FAIL] closedby=null, modal
+  assert_equals: Reflection should be limited to known values (open) expected (string) "closerequest" but got (undefined) undefined
+[FAIL] closedby=null, open
+  assert_equals: Reflection should be limited to known values (open) expected (string) "none" but got (undefined) undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex-expected.txt b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex-expected.txt
rename to third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex-expected.txt
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose-expected.txt b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose-expected.txt
similarity index 68%
rename from third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose-expected.txt
rename to third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose-expected.txt
index c42cda0..154029a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose-expected.txt
+++ b/third_party/blink/web_tests/virtual/dialog-light-dismiss-disabled/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 59 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 87 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] requestClose basic behavior for modeless dialog with closedby=null
   promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
 [FAIL] requestClose fires both cancel and close for modeless dialog with closedby=null
@@ -112,6 +112,62 @@
   promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
 [FAIL] requestClose(returnValue) doesn't change returnvalue when cancelled for modal dialog with closedby=none
   promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose basic behavior for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose fires both cancel and close for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] closedby has no effect on dialog.requestClose() for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose can be cancelled for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose avoids abuse prevention logic for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) passes along the return value for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) doesn't change returnvalue when cancelled for open dialog with closedby=null
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose basic behavior for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose fires both cancel and close for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] closedby has no effect on dialog.requestClose() for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose can be cancelled for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose avoids abuse prevention logic for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) passes along the return value for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) doesn't change returnvalue when cancelled for open dialog with closedby=any
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose basic behavior for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose fires both cancel and close for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] closedby has no effect on dialog.requestClose() for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose can be cancelled for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose avoids abuse prevention logic for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) passes along the return value for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) doesn't change returnvalue when cancelled for open dialog with closedby=closedrequest
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose basic behavior for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose fires both cancel and close for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] closedby has no effect on dialog.requestClose() for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose can be cancelled for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose avoids abuse prevention logic for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) passes along the return value for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
+[FAIL] requestClose(returnValue) doesn't change returnvalue when cancelled for open dialog with closedby=none
+  promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
 [FAIL] requestClose basic behavior when dialog is open via attribute
   promise_test: Unhandled rejection with value: object "TypeError: dialog.requestClose is not a function"
 [FAIL] requestClose fires cancel and close when dialog is open via attribute
diff --git a/third_party/blink/web_tests/virtual/fedcm-authz/DIR_METADATA b/third_party/blink/web_tests/virtual/fedcm-authz/DIR_METADATA
deleted file mode 100644
index 861fce45..0000000
--- a/third_party/blink/web_tests/virtual/fedcm-authz/DIR_METADATA
+++ /dev/null
@@ -1,6 +0,0 @@
-monorail: {
-  component: "Chromium > Blink > Identity > FedCM"
-}
-buganizer_public: {
-  component_id: 1456331
-}
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/fedcm-authz/README.md b/third_party/blink/web_tests/virtual/fedcm-authz/README.md
deleted file mode 100644
index a60065b..0000000
--- a/third_party/blink/web_tests/virtual/fedcm-authz/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# FedCmAuthz
-This suite runs the tests in wpt/credential-management/fedcm-authz/ with
-`--enable-features=FedCmAuthz`.
-
-See crbug.com/1429083.
diff --git a/third_party/blink/web_tests/virtual/fedcm-button-and-other-account/DIR_METADATA b/third_party/blink/web_tests/virtual/fedcm-button-and-other-account/DIR_METADATA
deleted file mode 100644
index 861fce45..0000000
--- a/third_party/blink/web_tests/virtual/fedcm-button-and-other-account/DIR_METADATA
+++ /dev/null
@@ -1,6 +0,0 @@
-monorail: {
-  component: "Chromium > Blink > Identity > FedCM"
-}
-buganizer_public: {
-  component_id: 1456331
-}
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/fedcm-button-and-other-account/README.md b/third_party/blink/web_tests/virtual/fedcm-button-and-other-account/README.md
deleted file mode 100644
index 79a8c38..0000000
--- a/third_party/blink/web_tests/virtual/fedcm-button-and-other-account/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# FedCmButtonMode and FedCmAddAccount
-This suite runs the tests in wpt/credential-management/fedcm-button-and-other-account/ with
-`--enable-features=FedCmButtonMode,FedCmAddAccount`.
-
-See crbug.com/40284792.
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
index 19d05cb..ee7661b 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
@@ -33,6 +33,8 @@
 clipboard-write
 compute-pressure
 cross-origin-isolated
+deferred-fetch
+deferred-fetch-minimal
 display-capture
 encrypted-media
 fullscreen
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index ec63db8..344c8f9d 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -2586,6 +2586,10 @@
     attribute @@toStringTag
     method constructor
     method setSharedStorageContext
+interface FetchLaterResult
+    attribute @@toStringTag
+    getter activated
+    method constructor
 interface File : Blob
     attribute @@toStringTag
     getter lastModified
@@ -12074,6 +12078,7 @@
     method confirm
     method createImageBitmap
     method fetch
+    method fetchLater
     method find
     method focus
     method gc
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_npu-expected.txt
index 3c54b73..5f1749f 100644
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_npu-expected.txt
+++ b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any.worker_npu-expected.txt
@@ -1,10 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] batchNormalization float32 2D tensor (mean and variance are non-constant) default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D constant tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 4D NHWC tensor options.axis=3
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization float32 4D NHWC tensor all options
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_npu-expected.txt
index 3c54b73..5f1749f 100644
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_npu-expected.txt
+++ b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/batch_normalization.https.any_npu-expected.txt
@@ -1,10 +1,10 @@
 This is a testharness.js-based test.
 [FAIL] batchNormalization float32 2D tensor (mean and variance are non-constant) default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D constant tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 2D tensor default options
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization float32 4D NHWC tensor options.axis=3
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization float32 4D NHWC tensor all options
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_npu-expected.txt
index 79057441..429567c 100644
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_npu-expected.txt
+++ b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_npu-expected.txt
@@ -4,29 +4,29 @@
 [FAIL] convTranspose2d default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + relu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + leakyRelu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + sigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + clamp
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + elu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + gelu
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + hardSigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + hardSwish
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + linear
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + softplus
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + softsign
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0  + softmax
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any_npu-expected.txt
index 79057441..429567c 100644
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any_npu-expected.txt
+++ b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any_npu-expected.txt
@@ -4,29 +4,29 @@
 [FAIL] convTranspose2d default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + relu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + leakyRelu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + sigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + clamp
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + prelu
   promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type float32 must be one of []."
 [FAIL] batchNormalization default + elu
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + gelu
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + hardSigmoid
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + hardSwish
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization default + linear
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0 + softplus
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 [FAIL] batchNormalization default + softsign
-  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported rank for batchNormalization. It must be between 3 and 5."
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'batchNormalization' on 'MLGraphBuilder': Unsupported rank 2 for argument input (must be at least 3)."
 [FAIL] batchNormalization options.axis=0  + softmax
   promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': Unsupported axis for batchNormalization. It must be the channel dimension."
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
index be12645..9ec78d25 100644
--- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -1611,6 +1611,8 @@
     property href
     property interestTargetElement
     property nearestViewportElement
+    property rel
+    property relList
     property requiredExtensions
     property systemLanguage
     property target
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index e2fa68e..3f34dab 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -130,6 +130,7 @@
 [Worker]     method languagePairAvailable
 [Worker] interface AITranslatorFactory
 [Worker]     attribute @@toStringTag
+[Worker]     method availability
 [Worker]     method capabilities
 [Worker]     method constructor
 [Worker]     method create
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index ba06d55..69788e6 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -129,6 +129,7 @@
     method languagePairAvailable
 interface AITranslatorFactory
     attribute @@toStringTag
+    method availability
     method capabilities
     method constructor
     method create
@@ -8230,9 +8231,13 @@
     attribute @@toStringTag
     getter href
     getter interestTargetElement
+    getter rel
+    getter relList
     getter target
     method constructor
     setter interestTargetElement
+    setter rel
+    setter relList
 interface SVGAngle
     attribute @@toStringTag
     attribute SVG_ANGLETYPE_DEG
@@ -12723,12 +12728,15 @@
     method addFromUri
     method item
 interface webkitSpeechRecognition : EventTarget
+    static method availableOnDevice
+    static method installOnDevice
     attribute @@toStringTag
     getter continuous
     getter grammars
     getter interimResults
     getter lang
     getter maxAlternatives
+    getter mode
     getter onaudioend
     getter onaudiostart
     getter onend
@@ -12748,6 +12756,7 @@
     setter interimResults
     setter lang
     setter maxAlternatives
+    setter mode
     setter onaudioend
     setter onaudiostart
     setter onend
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index 30d8ace8..76df2c96 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -130,6 +130,7 @@
 [Worker]     method languagePairAvailable
 [Worker] interface AITranslatorFactory
 [Worker]     attribute @@toStringTag
+[Worker]     method availability
 [Worker]     method capabilities
 [Worker]     method constructor
 [Worker]     method create
diff --git a/third_party/blink/web_tests/wpt_internal/isolated-permissions-policy-stable/permissions_policy.https.html b/third_party/blink/web_tests/wpt_internal/isolated-permissions-policy-stable/permissions_policy.https.html
index 294ebc5..947bde7 100644
--- a/third_party/blink/web_tests/wpt_internal/isolated-permissions-policy-stable/permissions_policy.https.html
+++ b/third_party/blink/web_tests/wpt_internal/isolated-permissions-policy-stable/permissions_policy.https.html
@@ -44,6 +44,8 @@
   'clipboard-write',
   'compute-pressure',
   'cross-origin-isolated',
+  'deferred-fetch',
+  'deferred-fetch-minimal',
   'display-capture',
   'encrypted-media',
   'fullscreen',
diff --git a/third_party/blink/web_tests/wpt_internal/speech/scripted/speechrecognition-no-crash-detached.html b/third_party/blink/web_tests/wpt_internal/speech/scripted/speechrecognition-no-crash-detached.html
deleted file mode 100644
index 317b902e..0000000
--- a/third_party/blink/web_tests/wpt_internal/speech/scripted/speechrecognition-no-crash-detached.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype html>
-<title>Accessing SpeechRecognition on a detached window should not crash.</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script type="module">
-import {MockSpeechRecognizer} from '../resources/mock-speechrecognizer.js';
-
-const mock = new MockSpeechRecognizer();
-
-async_test(t => {
-  const w = window.open('../resources/window-postmessage-open-close.html');
-  let recognitionConstructor;
-  let recognition;
-
-  window.addEventListener('message', t.step_func(event => {
-    if (event.data == "opened") {
-      recognitionConstructor = w.webkitSpeechRecognition;
-      recognition = new recognitionConstructor();
-      w.close();
-    } else if (event.data == "closed") {
-      recognition.start();
-      recognition.stop();
-      recognition.abort();
-      recognition = new recognitionConstructor();
-      recognition.start();
-      recognition.stop();
-      recognition.abort();
-      t.done();
-    }
-  }), false);
-});
-
-</script>
diff --git a/third_party/boringssl/src b/third_party/boringssl/src
index 2b619cc4..294ab97 160000
--- a/third_party/boringssl/src
+++ b/third_party/boringssl/src
@@ -1 +1 @@
-Subproject commit 2b619cc49cbe54279ae2aaa3c3a32c9cf2a23e0b
+Subproject commit 294ab9730c570213b496cfc2fc14b3c0bfcd4bcc
diff --git a/third_party/catapult b/third_party/catapult
index cfa9c31..30345af 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit cfa9c31cbefb033f14b4281483ab9abcf43e4dc6
+Subproject commit 30345af7ee8bf6e5ac59d4fc9a2fa3edbb707a4a
diff --git a/third_party/cros-components/src b/third_party/cros-components/src
index 5d78647..3597d73 160000
--- a/third_party/cros-components/src
+++ b/third_party/cros-components/src
@@ -1 +1 @@
-Subproject commit 5d7864796c5ed4059c265d9eef3e22e9db46ea33
+Subproject commit 3597d73c5d3524faf4bbfcbe418deba9958b0f2f
diff --git a/third_party/cros_system_api b/third_party/cros_system_api
index 12fde60..869814c 160000
--- a/third_party/cros_system_api
+++ b/third_party/cros_system_api
@@ -1 +1 @@
-Subproject commit 12fde60ccc102d3243fec651d5ee30207dc491aa
+Subproject commit 869814cf6278c02facde7189073d20d4d33a0d1e
diff --git a/third_party/crossbench b/third_party/crossbench
index 0bdccb1..380bb97 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 0bdccb1bad9730955a96fc4b95331750cc561c98
+Subproject commit 380bb97970f8e72aa326eb4c6872fc204dd57a85
diff --git a/third_party/dawn b/third_party/dawn
index 0287e27..4bec057 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 0287e2776f63e1d6d6eea5b80e58479a1289d22e
+Subproject commit 4bec057b7e2af7de9a82d5fb46a33a772c2e4437
diff --git a/third_party/depot_tools b/third_party/depot_tools
index ee429f3..ab387d1 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit ee429f3694c51421c8b2f2af52049102ef43bca9
+Subproject commit ab387d1ddc530d405f662904f2df292f700e4b0f
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index dcf6750..e8b377b 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit dcf675078d9647719ca69e082358962b0296e2a9
+Subproject commit e8b377b3c7a08eb7bf3e3a1a69ef599a04110396
diff --git a/third_party/fuchsia-sdk/README.chromium b/third_party/fuchsia-sdk/README.chromium
index 3d5d3e0..fc13d415 100644
--- a/third_party/fuchsia-sdk/README.chromium
+++ b/third_party/fuchsia-sdk/README.chromium
@@ -4,7 +4,7 @@
 Revision: DEPS
 Security Critical: yes
 Shipped: yes
-License: BSD 2-Clause, Apache 2.0, MIT
+License: BSD-2-Clause, Apache-2.0, MIT
 License File: sdk/LICENSE
 
 Description:
diff --git a/third_party/hunspell/README.chromium b/third_party/hunspell/README.chromium
index a2ae3947..30e94c8b6 100644
--- a/third_party/hunspell/README.chromium
+++ b/third_party/hunspell/README.chromium
@@ -2,7 +2,7 @@
 URL: http://hunspell.sourceforge.net/
 Version: v1.7.0
 CPEPrefix: cpe:/a:hunspell_project:hunspell:1.7.0
-License: MPL 1.1
+License: MPL-1.1
 License File: COPYING.MPL
 Security Critical: yes
 Shipped: yes
diff --git a/third_party/jdk11/README.chromium b/third_party/jdk11/README.chromium
index 9c6aeb1..bf0ffaf 100644
--- a/third_party/jdk11/README.chromium
+++ b/third_party/jdk11/README.chromium
@@ -2,7 +2,7 @@
 Short Name: JDK
 URL: https://openjdk.java.net/
 Version: 11.0.15+10.cr0
-License: GPL v2
+License: GPL-2.0
 Security Critical: no
 Shipped: no
 
diff --git a/third_party/jdk17/README.chromium b/third_party/jdk17/README.chromium
index 624f3341..8ba1f7c 100644
--- a/third_party/jdk17/README.chromium
+++ b/third_party/jdk17/README.chromium
@@ -2,7 +2,7 @@
 Short Name: JDK
 URL: https://openjdk.java.net/
 Version: 17
-License: GPL v2
+License: GPL-2.0
 Security Critical: no
 Shipped: no
 
diff --git a/third_party/jni_zero/codegen/natives_header.py b/third_party/jni_zero/codegen/natives_header.py
index 497f101..356b81a 100644
--- a/third_party/jni_zero/codegen/natives_header.py
+++ b/third_party/jni_zero/codegen/natives_header.py
@@ -16,7 +16,7 @@
   return f'jni_zero::ScopedJavaLocalRef<{java_type.to_cpp()}>'
 
 
-def _param_type_cpp(java_type):
+def _param_type_cpp(java_type, use_param_type):
   if converted_type := java_type.converted_type:
     # Drop & when the type is obviously a pointer to avoid "const char *&".
     if not java_type.is_primitive() and not converted_type.endswith('*'):
@@ -26,7 +26,10 @@
   ret = java_type.to_cpp()
   if java_type.is_primitive():
     return ret
-  return f'const jni_zero::JavaParamRef<{ret}>&'
+  if use_param_type:
+    return f'const jni_zero::JavaParamRef<{ret}>&'
+  else:
+    return f'const jni_zero::JavaRef<{ret}>&'
 
 
 def _impl_forward_declaration(sb, native, params):
@@ -38,7 +41,27 @@
       plist.append('JNIEnv* env')
       if not native.static:
         plist.append('const jni_zero::JavaParamRef<jobject>& jcaller')
-      plist.extend(f'{_param_type_cpp(p.java_type)} {p.cpp_name()}'
+      plist.extend(f'{_param_type_cpp(p.java_type, True)} {p.cpp_name()}'
+                   for p in params)
+
+
+def _entry_point_example(sb, native):
+  if native.first_param_cpp_type:
+    name = f'{native.first_param_cpp_type}::'
+    params = native.params[1:]
+  else:
+    name = f'JNI_{native.java_class.name}_'
+    params = native.params
+  name += native.capitalized_name
+  with sb.statement():
+    if not native.first_param_cpp_type:
+      sb('static ')
+    sb(f'{_return_type_cpp(native.return_type)} {name}')
+    with sb.param_list() as plist:
+      plist.append('JNIEnv* env')
+      if not native.static:
+        plist.append('const jni_zero::JavaRef<jobject>& jcaller')
+      plist.extend(f'{_param_type_cpp(p.java_type, False)} {p.cpp_name()}'
                    for p in params)
 
 
@@ -87,17 +110,23 @@
     plist.extend(f'{p.java_type.to_cpp()} {p.cpp_name()}' for p in params)
 
 
-def entry_point_method(sb, jni_mode, jni_obj, native, gen_jni_class):
+def entry_point_method(sb,
+                       jni_mode,
+                       jni_obj,
+                       native,
+                       gen_jni_class,
+                       include_forward_declaration=False):
   """The method called by JNI, or by multiplexing methods."""
   params = native.params
   cpp_class = native.first_param_cpp_type
   if cpp_class:
     params = params[1:]
 
-  # Only non-class methods need to be forward-declared.
-  if not cpp_class:
-    _impl_forward_declaration(sb, native, params)
-    sb('\n')
+  if include_forward_declaration:
+    # Only non-class methods need to be forward-declared.
+    if not cpp_class:
+      _impl_forward_declaration(sb, native, params)
+      sb('\n')
 
   entry_point_declaration(sb, jni_mode, jni_obj, native, gen_jni_class)
 
@@ -154,6 +183,34 @@
         sb('converted_ret')
 
 
+def natives_macro_definition(sb, jni_mode, jni_obj, gen_jni_class, *,
+                             enable_definition_macros):
+  macro_name = f'DEFINE_JNI_FOR_{jni_obj.java_class.name}'
+  if enable_definition_macros and jni_obj.natives:
+    with sb.section(
+        'Example signatures (to be implemented by #including file).'):
+      with sb.commented_section():
+        for native in jni_obj.natives:
+          _entry_point_example(sb, native)
+          sb('\n')
+
+    with sb.section('Java to native functions'):
+      with sb.cpp_macro(macro_name):
+        # Anonymous namespace to scope the "using namespace" declaration.
+        # All symbols use extern "C", so it doesn't actually hide symbols.
+        with sb.namespace(''):
+          if jni_obj.jni_namespace:
+            sb(f'using namespace {jni_obj.jni_namespace};\n')
+          for native in jni_obj.natives:
+            entry_point_method(sb, jni_mode, jni_obj, native, gen_jni_class)
+  elif enable_definition_macros:
+    sb(f'// There are no Java->Native methods.\n')
+    sb(f'#define {macro_name}()\n')
+  else:
+    sb(f'// Macro for transition to enable_definition_macros=true.\n')
+    sb(f'#define {macro_name}()\n')
+
+
 def multiplexing_boundary_method(sb, muxed_aliases, gen_jni_class):
   """The method called by JNI when multiplexing is enabled."""
   native = muxed_aliases[0]
diff --git a/third_party/jni_zero/common.py b/third_party/jni_zero/common.py
index d794eb2..d231269 100644
--- a/third_party/jni_zero/common.py
+++ b/third_party/jni_zero/common.py
@@ -33,23 +33,38 @@
   def __init__(self):
     self._sb = []
     self._indent = 0
-    self._start_of_line = True
+    self._comment_indent = None
+    self._in_cpp_macro = False
+    self._cur_line_len = 0
 
   def __call__(self, value):
     lines = value.splitlines(keepends=True)
     for line in lines:
-      if self._start_of_line and line != '\n':
-        self._sb.append(' ' * self._indent)
-      self._sb.append(line)
-      self._start_of_line = line[-1] == '\n'
+      # Add any applicable prefix.
+      if self._cur_line_len == 0:
+        if self._comment_indent is not None:
+          self._sb.append(' ' * self._comment_indent)
+          # Do not add trailing whitespace for blank lines.
+          prefix = '//' if line == '\n' else '// '
+          self._sb.append(prefix)
+          self._cur_line_len += self._comment_indent + len(prefix)
 
-  def _cur_line_length(self):
-    ret = 0
-    for l in reversed(self._sb):
-      if l.endswith('\n'):
-        break
-      ret += len(l)
-    return ret
+        if line != '\n' and self._indent > 0:
+          self._sb.append(' ' * self._indent)
+          self._cur_line_len += self._indent
+
+      self._sb.append(line)
+      self._cur_line_len += len(line)
+
+      if line[-1] == '\n':
+        if self._in_cpp_macro:
+          self._sb[-1] = self._sb[-1][:-1]
+          remaining = _TARGET_LINE_LENGTH - self._cur_line_len - 1
+          if remaining > 0:
+            self._sb.append(' ' * remaining)
+          self._sb.append(' \\\n')
+
+        self._cur_line_len = 0
 
   @contextlib.contextmanager
   def _param_list_generator(self):
@@ -65,7 +80,7 @@
     if values:
       punctuation_size = 2 * len(values) # punctuation: ", ()"
       single_line_size = sum(len(v) for v in values) + punctuation_size
-      if self._cur_line_length() + single_line_size < _TARGET_LINE_LENGTH:
+      if self._cur_line_len + single_line_size < _TARGET_LINE_LENGTH:
         self(', '.join(values))
       else:
         self('\n')
@@ -84,6 +99,7 @@
 
   @contextlib.contextmanager
   def section(self, section_title):
+    assert not self._in_cpp_macro
     if not ''.join(self._sb[-2:]).endswith('\n\n'):
       self('\n')
     self(f'// {section_title}\n')
@@ -98,7 +114,10 @@
     value = f' {namespace_name}' if namespace_name else ''
     self(f'namespace{value} {{\n\n')
     yield
-    self(f'\n}}  // namespace{value}\n')
+    if self._in_cpp_macro:
+      self(f'\n}}  /* namespace{value} */\n')
+    else:
+      self(f'\n}}  // namespace{value}\n')
 
   @contextlib.contextmanager
   def block(self, *, indent=2, after=None):
@@ -118,6 +137,34 @@
     yield
     self._indent -= amount
 
+  @contextlib.contextmanager
+  def commented_section(self):
+    assert self._comment_indent is None
+    assert not self._in_cpp_macro
+    self._comment_indent = self._indent
+    self._indent = 0
+    yield
+    self._indent = self._comment_indent
+    self._comment_indent = None
+
+  @contextlib.contextmanager
+  def cpp_macro(self, macro_name):
+    assert self._indent == 0
+    assert not self._in_cpp_macro
+    self(f'#define {macro_name}()')
+    self._in_cpp_macro = True
+    self('\n')
+    with self.indent(2):
+      yield
+    self._in_cpp_macro = False
+    # Check that the last call to __call__ ended with a \n, which will result
+    # in self._sb ending with [indent, slash-and-newline].
+    assert self._cur_line_len == 0
+    assert self._sb[-1] == ' \\\n', 'was: ' + self._sb[-1]
+    assert self._sb[-2].isspace(), 'was: ' + self._sb[-2]
+    self._sb.pop()
+    self._sb[-1] = '\n'
+
   def to_string(self):
     return ''.join(self._sb)
 
diff --git a/third_party/jni_zero/jni_export.h b/third_party/jni_zero/jni_export.h
index 9658172..6552db1 100644
--- a/third_party/jni_zero/jni_export.h
+++ b/third_party/jni_zero/jni_export.h
@@ -38,6 +38,7 @@
 #define JNI_ZERO_ALWAYS_INLINE
 #endif
 
+// extern "C" used to ensure symbol is not within a namespace.
 #define JNI_ZERO_MUXED_ENTRYPOINT extern "C" JNI_ZERO_ALWAYS_INLINE
 
 #endif  // JNI_ZERO_JNI_EXPORT_H_
diff --git a/third_party/jni_zero/jni_generator.py b/third_party/jni_zero/jni_generator.py
index 6252730c..f0e81e3 100644
--- a/third_party/jni_zero/jni_generator.py
+++ b/third_party/jni_zero/jni_generator.py
@@ -317,16 +317,24 @@
   return sorted(ret)
 
 
-def _generate_header(jni_mode, jni_obj, extra_includes, gen_jni_class):
+def _generate_header(jni_mode, jni_obj, extra_includes, gen_jni_class, *,
+                     enable_definition_macros):
   preamble, epilogue = header_common.header_preamble(
       GetScriptName(),
       jni_obj.java_class,
       system_includes=['jni.h'],
       user_includes=['third_party/jni_zero/jni_export.h'] + extra_includes)
-  java_classes = _CollectReferencedClasses(jni_obj)
   sb = common.StringBuilder()
   sb(preamble)
 
+  natives_header.natives_macro_definition(
+      sb,
+      jni_mode,
+      jni_obj,
+      gen_jni_class,
+      enable_definition_macros=enable_definition_macros)
+
+  java_classes = _CollectReferencedClasses(jni_obj)
   if java_classes:
     with sb.section('Class Accessors'):
       header_common.class_accessors(sb, java_classes, jni_obj.module_name)
@@ -337,11 +345,15 @@
         called_by_native_header.constants_enums(sb, jni_obj.java_class,
                                                 jni_obj.constant_fields)
 
-    if jni_obj.natives:
+    if jni_obj.natives and not enable_definition_macros:
       with sb.section('Java to native functions'):
         for native in jni_obj.natives:
-          natives_header.entry_point_method(sb, jni_mode, jni_obj, native,
-                                            gen_jni_class)
+          natives_header.entry_point_method(sb,
+                                            jni_mode,
+                                            jni_obj,
+                                            native,
+                                            gen_jni_class,
+                                            include_forward_declaration=True)
 
     if jni_obj.called_by_natives:
       with sb.section('Native to Java functions'):
@@ -498,10 +510,16 @@
                   output_names,
                   output_dir,
                   extra_includes,
-                  gen_jni_class=None):
+                  gen_jni_class=None,
+                  enable_definition_macros=False):
   for jni_obj, header_name in zip(jni_objs, output_names):
     output_file = os.path.join(output_dir, header_name)
-    content = _generate_header(jni_mode, jni_obj, extra_includes, gen_jni_class)
+    content = _generate_header(
+        jni_mode,
+        jni_obj,
+        extra_includes,
+        gen_jni_class,
+        enable_definition_macros=enable_definition_macros)
 
     with common.atomic_output(output_file, 'w') as f:
       f.write(content)
@@ -536,8 +554,13 @@
       package_prefix=args.package_prefix,
       package_prefix_filter=args.package_prefix_filter)
 
-  _WriteHeaders(jni_mode, jni_objs, args.output_names, args.output_dir,
-                args.extra_includes, gen_jni_class)
+  _WriteHeaders(jni_mode,
+                jni_objs,
+                args.output_names,
+                args.output_dir,
+                args.extra_includes,
+                gen_jni_class,
+                enable_definition_macros=args.enable_definition_macros)
 
   jni_objs_with_proxy_natives = [x for x in jni_objs if x.proxy_natives]
   # Write .srcjar
diff --git a/third_party/jni_zero/jni_zero.gni b/third_party/jni_zero/jni_zero.gni
index 7db951d..19cad9ac 100644
--- a/third_party/jni_zero/jni_zero.gni
+++ b/third_party/jni_zero/jni_zero.gni
@@ -375,6 +375,10 @@
         if (defined(invoker.namespace)) {
           args += [ "--namespace=${invoker.namespace}" ]
         }
+        if (defined(invoker.enable_definition_macros) &&
+            invoker.enable_definition_macros) {
+          args += [ "--enable-definition-macros" ]
+        }
 
         # Cronet needs to rename jni_zero classes
         if (defined(is_cronet_build) && is_cronet_build) {
diff --git a/third_party/jni_zero/jni_zero.py b/third_party/jni_zero/jni_zero.py
index db6875f..69821f7 100755
--- a/third_party/jni_zero/jni_zero.py
+++ b/third_party/jni_zero/jni_zero.py
@@ -125,6 +125,10 @@
         action='store_true',
         help='Generate .srcjar and .h such that a final generate-final '
         'step is not necessary')
+    group.add_argument(
+        '--enable-definition-macros',
+        action='store_true',
+        help='Generate JNI glue code in DEFINE_JNI_FOR_MyClass() macros')
 
   if is_javap:
     group.add_argument('--unchecked-exceptions',
diff --git a/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden b/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden
index fce92d9..0ebcb36 100644
--- a/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleForTests()
 
 // Class Accessors
 #ifndef org_jni_1zero_SampleForTests_clazz_defined
diff --git a/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden b/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden
index 90e22f1..a2b3642 100644
--- a/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden
@@ -11,6 +11,66 @@
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
 
+// Example signatures (to be implemented by #including file).
+// static jint JNI_SampleBidirectionalNonProxy_Init(
+//     JNIEnv* env,
+//     const jni_zero::JavaRef<jobject>& jcaller);
+//
+// static jint JNI_SampleBidirectionalNonProxy_Init(
+//     JNIEnv* env,
+//     const jni_zero::JavaRef<jobject>& jcaller);
+//
+// jint Test::Method(JNIEnv* env, const jni_zero::JavaRef<jobject>& jcaller, jint arg1);
+//
+// jint Test::StaticMethod(JNIEnv* env, jint arg1);
+//
+
+// Java to native functions
+#define DEFINE_JNI_FOR_SampleBidirectionalNonProxy()                                               \
+  namespace {                                                                                      \
+                                                                                                   \
+  JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeInit(         \
+      JNIEnv* env,                                                                                 \
+      jobject jcaller) {                                                                           \
+    auto _ret = JNI_SampleBidirectionalNonProxy_Init(                                              \
+        env,                                                                                       \
+        jni_zero::JavaParamRef<jobject>(env, jcaller));                                            \
+    return _ret;                                                                                   \
+  }                                                                                                \
+                                                                                                   \
+  JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeInit(         \
+      JNIEnv* env,                                                                                 \
+      jobject jcaller) {                                                                           \
+    auto _ret = JNI_SampleBidirectionalNonProxy_Init(                                              \
+        env,                                                                                       \
+        jni_zero::JavaParamRef<jobject>(env, jcaller));                                            \
+    return _ret;                                                                                   \
+  }                                                                                                \
+                                                                                                   \
+  JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeMethod(       \
+      JNIEnv* env,                                                                                 \
+      jobject jcaller,                                                                             \
+      jlong nativeTest,                                                                            \
+      jint arg1) {                                                                                 \
+    auto _ret = reinterpret_cast<Test*>(nativeTest)->Method(                                       \
+        env,                                                                                       \
+        jni_zero::JavaParamRef<jobject>(env, jcaller),                                             \
+        arg1);                                                                                     \
+    return _ret;                                                                                   \
+  }                                                                                                \
+                                                                                                   \
+  JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeStaticMethod( \
+      JNIEnv* env,                                                                                 \
+      jclass jcaller,                                                                              \
+      jlong nativeTest,                                                                            \
+      jint arg1) {                                                                                 \
+    auto _ret = reinterpret_cast<Test*>(nativeTest)->StaticMethod(env, arg1);                      \
+    return _ret;                                                                                   \
+  }                                                                                                \
+                                                                                                   \
+                                                                                                   \
+  }  /* namespace */
+
 // Class Accessors
 #ifndef org_jni_1zero_SampleBidirectionalNonProxy_clazz_defined
 #define org_jni_1zero_SampleBidirectionalNonProxy_clazz_defined
@@ -22,57 +82,6 @@
 #endif
 
 
-// Java to native functions
-// Forward declaration. To be implemented by the including .cc file.
-static jint JNI_SampleBidirectionalNonProxy_Init(
-    JNIEnv* env,
-    const jni_zero::JavaParamRef<jobject>& jcaller);
-
-JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  auto _ret = JNI_SampleBidirectionalNonProxy_Init(
-      env,
-      jni_zero::JavaParamRef<jobject>(env, jcaller));
-  return _ret;
-}
-
-// Forward declaration. To be implemented by the including .cc file.
-static jint JNI_SampleBidirectionalNonProxy_Init(
-    JNIEnv* env,
-    const jni_zero::JavaParamRef<jobject>& jcaller);
-
-JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  auto _ret = JNI_SampleBidirectionalNonProxy_Init(
-      env,
-      jni_zero::JavaParamRef<jobject>(env, jcaller));
-  return _ret;
-}
-
-JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeMethod(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativeTest,
-    jint arg1) {
-  auto _ret = reinterpret_cast<Test*>(nativeTest)->Method(
-      env,
-      jni_zero::JavaParamRef<jobject>(env, jcaller),
-      arg1);
-  return _ret;
-}
-
-JNI_ZERO_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleBidirectionalNonProxy_nativeStaticMethod(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeTest,
-    jint arg1) {
-  auto _ret = reinterpret_cast<Test*>(nativeTest)->StaticMethod(env, arg1);
-  return _ret;
-}
-
-
 // Native to Java functions
 static void Java_SampleBidirectionalNonProxy_addStructB(
     JNIEnv* env,
diff --git a/third_party/jni_zero/test/golden/testEndToEndProxyHashed-SampleForAnnotationProcessor_jni.h.golden b/third_party/jni_zero/test/golden/testEndToEndProxyHashed-SampleForAnnotationProcessor_jni.h.golden
index f3a377b..b946bdb 100644
--- a/third_party/jni_zero/test/golden/testEndToEndProxyHashed-SampleForAnnotationProcessor_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testEndToEndProxyHashed-SampleForAnnotationProcessor_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleForAnnotationProcessor()
 
 // Class Accessors
 #ifndef org_jni_1zero_SampleForAnnotationProcessor_clazz_defined
diff --git a/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-SampleModule_jni.h.golden b/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-SampleModule_jni.h.golden
index 59c5510..084c0e7 100644
--- a/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-SampleModule_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-SampleModule_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleModule()
 
 // Java to native functions
 // Forward declaration. To be implemented by the including .cc file.
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptHash-SampleProxyEdgeCases_jni.h.golden b/third_party/jni_zero/test/golden/testForTestingKeptHash-SampleProxyEdgeCases_jni.h.golden
index e5ac4d7..9c1d7d2 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptHash-SampleProxyEdgeCases_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptHash-SampleProxyEdgeCases_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleProxyEdgeCases()
 
 // Java to native functions
 // Forward declaration. To be implemented by the including .cc file.
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-SampleProxyEdgeCases_jni.h.golden b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-SampleProxyEdgeCases_jni.h.golden
index 6bdbd06..1c31092 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-SampleProxyEdgeCases_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-SampleProxyEdgeCases_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleProxyEdgeCases()
 
 // Java to native functions
 // Forward declaration. To be implemented by the including .cc file.
diff --git a/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden b/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden
index 468faceb..3b046ad 100644
--- a/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_JavapClass()
 
 // Class Accessors
 #ifndef org_jni_1zero_JavapClass_clazz_defined
diff --git a/third_party/jni_zero/test/golden/testNonProxy-SampleNonProxy_jni.h.golden b/third_party/jni_zero/test/golden/testNonProxy-SampleNonProxy_jni.h.golden
index febeffb..aed9b45 100644
--- a/third_party/jni_zero/test/golden/testNonProxy-SampleNonProxy_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testNonProxy-SampleNonProxy_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleNonProxy()
 
 // Java to native functions
 // Forward declaration. To be implemented by the including .cc file.
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden
index ca584ce..e5f7014 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleForTests()
 
 // Class Accessors
 #ifndef this_is_a_package_prefix_org_jni_1zero_SampleForTests_clazz_defined
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden
index ca584ce..e5f7014 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleForTests()
 
 // Class Accessors
 #ifndef this_is_a_package_prefix_org_jni_1zero_SampleForTests_clazz_defined
diff --git a/third_party/jni_zero/test/golden/testPerFileNatives-SampleForAnnotationProcessor_jni.h.golden b/third_party/jni_zero/test/golden/testPerFileNatives-SampleForAnnotationProcessor_jni.h.golden
index 4a16cc1..86ce506 100644
--- a/third_party/jni_zero/test/golden/testPerFileNatives-SampleForAnnotationProcessor_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testPerFileNatives-SampleForAnnotationProcessor_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleForAnnotationProcessor()
 
 // Class Accessors
 #ifndef org_jni_1zero_SampleForAnnotationProcessor_clazz_defined
diff --git a/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-ImportsTinySample_jni.h.golden b/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-ImportsTinySample_jni.h.golden
index 8d1bce7..a3d7b76 100644
--- a/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-ImportsTinySample_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-ImportsTinySample_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_ImportsTinySample()
 
 // Java to native functions
 // Forward declaration. To be implemented by the including .cc file.
diff --git a/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-TinySample_jni.h.golden b/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-TinySample_jni.h.golden
index 7db6066..ab40553d 100644
--- a/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-TinySample_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testPlaceholdersOverlapping-TinySample_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_TinySample()
 
 // Java to native functions
 // Forward declaration. To be implemented by the including .cc file.
diff --git a/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden b/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden
index 36e4795..40902cd 100644
--- a/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden
+++ b/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden
@@ -10,6 +10,8 @@
 
 #include "third_party/jni_zero/jni_export.h"
 #include "third_party/jni_zero/jni_zero_helper.h"
+// Macro for transition to enable_definition_macros=true.
+#define DEFINE_JNI_FOR_SampleUniqueAnnotations()
 
 // Class Accessors
 #ifndef org_jni_1zero_SampleUniqueAnnotations_clazz_defined
diff --git a/third_party/jni_zero/test/integration_tests.py b/third_party/jni_zero/test/integration_tests.py
index 31b5f3e..7e897e5 100755
--- a/third_party/jni_zero/test/integration_tests.py
+++ b/third_party/jni_zero/test/integration_tests.py
@@ -52,6 +52,7 @@
     self.output_files = None if is_final else []
     self.header_path = None
     self.enable_jni_multiplexing = False
+    self.enable_definition_macros = False
     self.package_prefix = None
     self.package_prefix_filter = None
     self.use_proxy_hash = False
@@ -67,6 +68,8 @@
     ret = [os.path.join(_SCRIPT_DIR, os.pardir, 'jni_zero.py'), self.action]
     if self.enable_jni_multiplexing:
       ret.append('--enable-jni-multiplexing')
+    if self.enable_definition_macros:
+      ret.append('--enable-definition-macros')
     if self.package_prefix:
       ret += ['--package-prefix', self.package_prefix]
     if self.package_prefix_filter:
@@ -354,7 +357,8 @@
     self._TestEndToEndGeneration(['SampleNonProxy.java'])
 
   def testBirectionalNonProxy(self):
-    self._TestEndToEndGeneration(['SampleBidirectionalNonProxy.java'])
+    self._TestEndToEndGeneration(['SampleBidirectionalNonProxy.java'],
+                                 enable_definition_macros=True)
 
   def testBidirectionalClass(self):
     self._TestEndToEndGeneration(['SampleForTests.java'], srcjar=True)
diff --git a/third_party/libjingle_xmpp/README.chromium b/third_party/libjingle_xmpp/README.chromium
index 9d8ae84..2dc01c5 100644
--- a/third_party/libjingle_xmpp/README.chromium
+++ b/third_party/libjingle_xmpp/README.chromium
@@ -2,7 +2,7 @@
 URL: https://chromium.googlesource.com/external/webrtc
 Version: 5493b8a59deb16cf0481e24707a0ed72d19047dc
 Revision: 5493b8a59deb16cf0481e24707a0ed72d19047dc
-License: BSD
+License: BSD-3-Clause
 License File: LICENSE
 Security Critical: Yes
 Shipped: yes
diff --git a/third_party/libtess2/README.chromium b/third_party/libtess2/README.chromium
index 266888f..0e6266d 100644
--- a/third_party/libtess2/README.chromium
+++ b/third_party/libtess2/README.chromium
@@ -2,7 +2,7 @@
 URL: https://github.com/memononen/libtess2
 Version: 1.0.2
 Revision: fc52516467dfa124bdd967c15c7cf9faf02a34ca
-License: SGI Free Software License B
+License: SGI-B-2.0
 License File: LICENSE
 Shipped: yes
 Security Critical: yes
diff --git a/third_party/libunwind/src b/third_party/libunwind/src
index b05ea6f..62e217a 160000
--- a/third_party/libunwind/src
+++ b/third_party/libunwind/src
@@ -1 +1 @@
-Subproject commit b05ea6f335254c55d6f967b5881cc6b38045d824
+Subproject commit 62e217a12ee1133833d9890b2f7adde900e4efbd
diff --git a/third_party/libva-fake-driver/README.chromium b/third_party/libva-fake-driver/README.chromium
index 0abbe3b..1033aa94 100644
--- a/third_party/libva-fake-driver/README.chromium
+++ b/third_party/libva-fake-driver/README.chromium
@@ -2,7 +2,7 @@
 URL: https://chromium.googlesource.com/chromiumos/platform/libva-fake-driver/
 Version: N/A
 Revision: a9bcab9cd6b15d4e3634ca44d5e5f7652c612194
-License: BSD 3-Clause
+License: BSD-3-Clause
 License File: LICENSE
 Shipped: no
 Security Critical: no
@@ -12,4 +12,4 @@
 and performs video decoding using sw decoders.
 
 Local Modifications:
-None
\ No newline at end of file
+None
diff --git a/third_party/lit/v3_0/BUILD.gn b/third_party/lit/v3_0/BUILD.gn
index 084f824..8a1fe7a8 100644
--- a/third_party/lit/v3_0/BUILD.gn
+++ b/third_party/lit/v3_0/BUILD.gn
@@ -78,6 +78,7 @@
     "//chrome/test/data/webui/privacy_sandbox/internals/private_state_tokens:build_ts",
     "//chrome/test/data/webui/privacy_sandbox/internals/related_website_sets:build_ts",
     "//chrome/test/data/webui/signin:build_ts",
+    "//chrome/test/data/webui/signin/signout_confirmation:build_ts",
     "//chrome/test/data/webui/tab_search:build_ts",
     "//components/commerce/core/internals/resources:build_ts",
     "//components/download/resources/download_internals:build_ts",
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn
index 36fe33d..bde4b9b1 100644
--- a/third_party/nearby/BUILD.gn
+++ b/third_party/nearby/BUILD.gn
@@ -789,12 +789,14 @@
     ":nearby_defines",
   ]
   sources = [
-    "src/internal/platform/base_input_stream.cc",
     "src/internal/platform/byte_utils.cc",
+    "src/internal/platform/stream_reader.cc",
+    "src/internal/platform/stream_writer.cc",
   ]
   public = [
-    "src/internal/platform/base_input_stream.h",
     "src/internal/platform/byte_utils.h",
+    "src/internal/platform/stream_reader.h",
+    "src/internal/platform/stream_writer.h",
   ]
   public_deps = [
     ":platform_base",
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index 15ffed7..fe21c51a 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: 97690c6996f683a6f3e07d75fc4557958c55ac7b
+Version: eea3441da94fa0dd07d7535f1c57158bcbc92b70
 License: Apache-2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src
index 97690c6..eea3441 160000
--- a/third_party/nearby/src
+++ b/third_party/nearby/src
@@ -1 +1 @@
-Subproject commit 97690c6996f683a6f3e07d75fc4557958c55ac7b
+Subproject commit eea3441da94fa0dd07d7535f1c57158bcbc92b70
diff --git a/third_party/node/README.chromium b/third_party/node/README.chromium
index 03f2a96c..263148c 100644
--- a/third_party/node/README.chromium
+++ b/third_party/node/README.chromium
@@ -463,7 +463,7 @@
 Short Name: lit
 URL: https://lit.dev
 Version: 3.0.2
-License: BSD 3-Clause
+License: BSD-3-Clause
 License File: LICENSE
 Security Critical: no
 Shipped: yes
@@ -487,7 +487,7 @@
 Short Name: @mediapipe/tasks-vision
 URL: https://www.npmjs.com/package/@mediapipe/tasks-vision
 Version: 0.10.9
-License: Apache 2.0
+License: Apache-2.0
 License File: LICENSE
 Security Critical: no
 Shipped: yes
@@ -563,7 +563,7 @@
 Name: Microsoft Authentication Library for JavaScript (MSAL.js) for Browser-Based Single-Page Applications
 Short Name: msal-browser
 URL: https://www.npmjs.com/package/@azure/msal-browser
-Version: 3.27.0
+Version: 4.2.1
 License: MIT
 License File: MSAL_LICENSE
 Security Critical: yes
diff --git a/third_party/node/node_modules.tar.gz.sha1 b/third_party/node/node_modules.tar.gz.sha1
index e222eb2..70a26462 100644
--- a/third_party/node/node_modules.tar.gz.sha1
+++ b/third_party/node/node_modules.tar.gz.sha1
@@ -1 +1 @@
-e87cbaec0ae5267758119ccaf57fca06f76fcdb1
+e7cdf2d4b8c9cdf2b55da8e139881e9b4740b937
diff --git a/third_party/node/package-lock.json b/third_party/node/package-lock.json
index ecca86c..2339208 100644
--- a/third_party/node/package-lock.json
+++ b/third_party/node/package-lock.json
@@ -8,7 +8,7 @@
       "name": "webui-node-modules",
       "version": "1.0.0",
       "dependencies": {
-        "@azure/msal-browser": "3.27.0",
+        "@azure/msal-browser": "4.2.1",
         "@mediapipe/tasks-vision": "0.10.9",
         "@rollup/wasm-node": "4.21.0",
         "@stylistic/eslint-plugin": "3.1.0",
@@ -49,21 +49,21 @@
       }
     },
     "node_modules/@azure/msal-browser": {
-      "version": "3.27.0",
-      "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.27.0.tgz",
-      "integrity": "sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.2.1.tgz",
+      "integrity": "sha512-pJX+HNVxEEvxqj3xvnFKMi/Yb6jadwOWN2QkDagj2GV2XXxJg3qq5zkE+czVw6Cmf4QiXxct+J0WF23sE8vZyA==",
       "license": "MIT",
       "dependencies": {
-        "@azure/msal-common": "14.16.0"
+        "@azure/msal-common": "15.1.1"
       },
       "engines": {
         "node": ">=0.8.0"
       }
     },
     "node_modules/@azure/msal-common": {
-      "version": "14.16.0",
-      "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz",
-      "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==",
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.1.1.tgz",
+      "integrity": "sha512-bvLWYq9fleAcTJ6H+hfkG91On6vI/UhGyOB7Z6r0Bsa+KTL3zPtigmGCOJgdxrEklOYD88X9SehexLDH/5NRKQ==",
       "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
@@ -2376,17 +2376,17 @@
       "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA=="
     },
     "@azure/msal-browser": {
-      "version": "3.27.0",
-      "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.27.0.tgz",
-      "integrity": "sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.2.1.tgz",
+      "integrity": "sha512-pJX+HNVxEEvxqj3xvnFKMi/Yb6jadwOWN2QkDagj2GV2XXxJg3qq5zkE+czVw6Cmf4QiXxct+J0WF23sE8vZyA==",
       "requires": {
-        "@azure/msal-common": "14.16.0"
+        "@azure/msal-common": "15.1.1"
       }
     },
     "@azure/msal-common": {
-      "version": "14.16.0",
-      "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz",
-      "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA=="
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.1.1.tgz",
+      "integrity": "sha512-bvLWYq9fleAcTJ6H+hfkG91On6vI/UhGyOB7Z6r0Bsa+KTL3zPtigmGCOJgdxrEklOYD88X9SehexLDH/5NRKQ=="
     },
     "@es-joy/jsdoccomment": {
       "version": "0.48.0",
diff --git a/third_party/node/package.json b/third_party/node/package.json
index 6f037b9..9dd6b62 100644
--- a/third_party/node/package.json
+++ b/third_party/node/package.json
@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "author": "dpapad@chromium.org",
   "dependencies": {
-    "@azure/msal-browser": "3.27.0",
+    "@azure/msal-browser": "4.2.1",
     "@mediapipe/tasks-vision": "0.10.9",
     "@rollup/wasm-node": "4.21.0",
     "@stylistic/eslint-plugin": "3.1.0",
diff --git a/third_party/perfetto b/third_party/perfetto
index 503da06..1e97ffd 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 503da067462f94898544f65e0fd751b4613ca9b8
+Subproject commit 1e97ffd1534d3cff6b33ba2c01ba30eff2f249cb
diff --git a/third_party/rust/UNSAFE_RUST_OWNERS b/third_party/rust/UNSAFE_RUST_OWNERS
index 503960ec..a534522 100644
--- a/third_party/rust/UNSAFE_RUST_OWNERS
+++ b/third_party/rust/UNSAFE_RUST_OWNERS
@@ -38,8 +38,9 @@
 # Gerrit will preferentially suggest the gwsq review alias above.
 #
 # Please keep this list alphabetized and in sync with the gwsq config (see
-# go/chrome-ipc-review).
+# go/chrome-unsafe-rust-reviews).
 dcheng@chromium.org            #{LAST_RESORT_SUGGESTION}
+djmitche@chromium.org          #{LAST_RESORT_SUGGESTION}
+liza@chromium.org              #{LAST_RESORT_SUGGESTION}
 lukasza@chromium.org           #{LAST_RESORT_SUGGESTION}
-# TODO: Announce gwsq alias to `unsafe-rust-in-chrome@google.com` and add
-# other volunteers here.
+phao@chromium.org              #{LAST_RESORT_SUGGESTION}
diff --git a/third_party/search_engines_data/resources b/third_party/search_engines_data/resources
index 6dc3b54..f9ec429 160000
--- a/third_party/search_engines_data/resources
+++ b/third_party/search_engines_data/resources
@@ -1 +1 @@
-Subproject commit 6dc3b54b420e6e03a34ee7259fcd2b1978fac5f3
+Subproject commit f9ec42985da1b80796019c6258317efaa6768cb5
diff --git a/third_party/skia b/third_party/skia
index a3847c8..e1be182 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit a3847c896e22997313f2d3dc127abfd2cd8806ae
+Subproject commit e1be182426377ca8ae1b322e0f2c81118d0aab8b
diff --git a/third_party/smhasher/README.chromium b/third_party/smhasher/README.chromium
index 53f0c16b..ca71e0db 100644
--- a/third_party/smhasher/README.chromium
+++ b/third_party/smhasher/README.chromium
@@ -2,7 +2,7 @@
 URL: https://github.com/aappleby/smhasher
 Version: N/A
 Revision: 0ff96f7835817a27d0487325b6c16033e2992eb5
-License: MIT, Public Domain
+License: MIT, Unlicense
 License File: LICENSE
 Security Critical: yes
 Shipped: yes
diff --git a/third_party/swiftshader b/third_party/swiftshader
index 720189c..d7ed113 160000
--- a/third_party/swiftshader
+++ b/third_party/swiftshader
@@ -1 +1 @@
-Subproject commit 720189cae8478484f51531a9eed9abc6d8635271
+Subproject commit d7ed113c66ecb95244f0f01c08afce6d7cb6ce48
diff --git a/third_party/tflite/README.chromium b/third_party/tflite/README.chromium
index 3c84984..60840ab7 100644
--- a/third_party/tflite/README.chromium
+++ b/third_party/tflite/README.chromium
@@ -1,8 +1,8 @@
 Name: TensorFlow Lite
 Short Name: tflite
 URL: https://github.com/tensorflow/tensorflow
-Version: b8ffdbdf19bcc43639bc0f3c05ef7d9a4667527f
-Date: 2025-02-13
+Version: d120e39920c0e61cc1227bc1abe50fd6ecd3ce66
+Date: 2025-02-19
 License: Caffe, Apache-2.0
 License File: LICENSE
 Security Critical: Yes
diff --git a/third_party/tflite/src b/third_party/tflite/src
index b8ffdbd..d120e39 160000
--- a/third_party/tflite/src
+++ b/third_party/tflite/src
@@ -1 +1 @@
-Subproject commit b8ffdbdf19bcc43639bc0f3c05ef7d9a4667527f
+Subproject commit d120e39920c0e61cc1227bc1abe50fd6ecd3ce66
diff --git a/third_party/webgpu-cts/README.chromium b/third_party/webgpu-cts/README.chromium
index e18685a8..862bcb6 100644
--- a/third_party/webgpu-cts/README.chromium
+++ b/third_party/webgpu-cts/README.chromium
@@ -6,7 +6,7 @@
 SOURCE CODE: git clone https://github.com/gpuweb/cts.git
 Security Critical: no
 Shipped: no
-License: BSD-3-Clause, MIT License
+License: BSD-3-Clause, MIT
 
 Description:
 The WebGPU conformance test suite upstream source, DEPS'd at the same version
diff --git a/third_party/webrtc b/third_party/webrtc
index afae3c2..3822af6 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit afae3c2252d76665593652293743457ebcb1bbf7
+Subproject commit 3822af6ef1ab5d1bda81c97cf3cf797db8e288d5
diff --git a/third_party/webrtc_overrides/README.chromium b/third_party/webrtc_overrides/README.chromium
index a148912..1d9222b1 100644
--- a/third_party/webrtc_overrides/README.chromium
+++ b/third_party/webrtc_overrides/README.chromium
@@ -2,7 +2,7 @@
 URL: http://www.webrtc.org
 Version: 0
 Revision: 0
-License: BSD 3-Clause
+License: BSD-3-Clause
 License File: LICENSE
 Security Critical: yes
 Shipped: yes
diff --git a/third_party/widevine/README.chromium b/third_party/widevine/README.chromium
index 293118c..1b6bfd1 100644
--- a/third_party/widevine/README.chromium
+++ b/third_party/widevine/README.chromium
@@ -3,7 +3,7 @@
 URL: https://www.widevine.com
 Version: N/A
 Revision: DEPS
-License: By exception only
+License: Commercial
 License File: LICENSE
 Security Critical: yes
 Shipped: yes
diff --git a/tools/android/avd/proto/android_35_google_apis_x64.textpb b/tools/android/avd/proto/android_35_google_apis_x64.textpb
index b37930a..68c89099 100644
--- a/tools/android/avd/proto/android_35_google_apis_x64.textpb
+++ b/tools/android/avd/proto/android_35_google_apis_x64.textpb
@@ -11,15 +11,15 @@
 
 system_image_package {
   package_name: "chromium/third_party/android_sdk/public/system-images/android-35/google_apis/x86_64"
-  version: "vNcoxPG6VS5NgGEWmx2Qi3R9P8EC8E-MvyVZ-diDxWYC"  # (r8) AE3A.240806.005
+  version: "RlhGUPY3gzHBfmiZuOqMu1uuznsnr5mbavafY8kK73AC"  # (r9) AE3A.240806.043
 }
 system_image_name: "system-images;android-35;google_apis;x86_64"
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-35/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8723031256415080033
+  # Created in https://ci.chromium.org/ui/b/8722568763762162577
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "QxYmJxrVAbnBxpl-WfzXQcz0mV26KZijrlLgtwbhOXIC"
+  version: "Ou1x_yjL6tk7yW-vIgCh_5PDctrXnj-vsHM_ytNyq7wC"
 }
 avd_name: "android_35_google_apis_x64"
 
diff --git a/tools/android/avd/proto/android_35_google_apis_x64_local.textpb b/tools/android/avd/proto/android_35_google_apis_x64_local.textpb
index 9db8a01..fd383e21 100644
--- a/tools/android/avd/proto/android_35_google_apis_x64_local.textpb
+++ b/tools/android/avd/proto/android_35_google_apis_x64_local.textpb
@@ -11,15 +11,15 @@
 
 system_image_package {
   package_name: "chromium/third_party/android_sdk/public/system-images/android-35/google_apis/x86_64"
-  version: "vNcoxPG6VS5NgGEWmx2Qi3R9P8EC8E-MvyVZ-diDxWYC"  # (r8) AE3A.240806.005
+  version: "RlhGUPY3gzHBfmiZuOqMu1uuznsnr5mbavafY8kK73AC"  # (r9) AE3A.240806.043
 }
 system_image_name: "system-images;android-35;google_apis;x86_64"
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-35/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8723031256415080033
+  # Created in https://ci.chromium.org/ui/b/8722568763762162577
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "re705AN99oH_mnS6s8vt3YfDB4CKBdozAkdWrgrwaFIC"
+  version: "GwwpXJzojadqpY9o7RuqyrKEvOTs6s8SY0Rc4lcmY20C"
 }
 avd_name: "android_35_google_apis_x64"
 
diff --git a/tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb b/tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb
index 7ed95ed..f43bce7 100644
--- a/tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb
+++ b/tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb
@@ -12,15 +12,15 @@
 
 system_image_package {
   package_name: "chromium/third_party/android_sdk/public/system-images/android-35/google_apis/x86_64"
-  version: "vNcoxPG6VS5NgGEWmx2Qi3R9P8EC8E-MvyVZ-diDxWYC"  # (r8) AE3A.240806.005
+  version: "RlhGUPY3gzHBfmiZuOqMu1uuznsnr5mbavafY8kK73AC"  # (r9) AE3A.240806.043
 }
 system_image_name: "system-images;android-35;google_apis;x86_64"
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-35/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8723031256415080033
+  # Created in https://ci.chromium.org/ui/b/8722568763762162577
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "NoAZObOI8nW1mZf9GyOu7ELynAjCCcdXAWkm1IJL2tYC"
+  version: "y-fVX5jX5nWX4yzoiiSx-DKdaZUeDd0lWSkfa1dB8aEC"
 }
 avd_name: "android_35_google_apis_x64"
 
diff --git a/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb b/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb
index 8ab6130e..17d3798f 100644
--- a/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb
+++ b/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb
@@ -12,15 +12,15 @@
 
 system_image_package {
   package_name: "chromium/third_party/android_sdk/public/system-images/android-35/google_apis/x86_64"
-  version: "vNcoxPG6VS5NgGEWmx2Qi3R9P8EC8E-MvyVZ-diDxWYC"  # (r8) AE3A.240806.005
+  version: "RlhGUPY3gzHBfmiZuOqMu1uuznsnr5mbavafY8kK73AC"  # (r9) AE3A.240806.043
 }
 system_image_name: "system-images;android-35;google_apis;x86_64"
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-35/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8723031256415080033
+  # Created in https://ci.chromium.org/ui/b/8722568763762162577
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "VLH0f-i32rJFNdB7tVwQNugQMQEYoMg4bg5TJ56faAgC"
+  version: "zS0fYXmI2l4ElGLuez32vU5JtVW-y9gj1Idr9hoM3FIC"
 }
 avd_name: "android_35_google_apis_x64"
 
diff --git a/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape_local.textpb b/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape_local.textpb
index c962d94a..0d5b52d 100644
--- a/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape_local.textpb
+++ b/tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape_local.textpb
@@ -12,15 +12,15 @@
 
 system_image_package {
   package_name: "chromium/third_party/android_sdk/public/system-images/android-35/google_apis/x86_64"
-  version: "vNcoxPG6VS5NgGEWmx2Qi3R9P8EC8E-MvyVZ-diDxWYC"  # (r8) AE3A.240806.005
+  version: "RlhGUPY3gzHBfmiZuOqMu1uuznsnr5mbavafY8kK73AC"  # (r9) AE3A.240806.043
 }
 system_image_name: "system-images;android-35;google_apis;x86_64"
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-35/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8723031256415080033
+  # Created in https://ci.chromium.org/ui/b/8722568763762162577
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "XF0_ROe9p-iUbYDPHtQv7UEBO8KpYtWAFLR4sk5_-msC"
+  version: "QJVplKZXwIWoFJkAENDvQFVaXUCJuvQLdSkQ-_RQPhkC"
 }
 avd_name: "android_35_google_apis_x64"
 
diff --git a/tools/android/avd/proto/android_35_google_apis_x64_tablet_local.textpb b/tools/android/avd/proto/android_35_google_apis_x64_tablet_local.textpb
index 27e1296..3d3784fb 100644
--- a/tools/android/avd/proto/android_35_google_apis_x64_tablet_local.textpb
+++ b/tools/android/avd/proto/android_35_google_apis_x64_tablet_local.textpb
@@ -12,15 +12,15 @@
 
 system_image_package {
   package_name: "chromium/third_party/android_sdk/public/system-images/android-35/google_apis/x86_64"
-  version: "vNcoxPG6VS5NgGEWmx2Qi3R9P8EC8E-MvyVZ-diDxWYC"  # (r8) AE3A.240806.005
+  version: "RlhGUPY3gzHBfmiZuOqMu1uuznsnr5mbavafY8kK73AC"  # (r9) AE3A.240806.043
 }
 system_image_name: "system-images;android-35;google_apis;x86_64"
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-35/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8723031256415080033
+  # Created in https://ci.chromium.org/ui/b/8722568763762162577
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "-yXVcpDfNo_R9GHFKCQpfkeilZD0Z5VyupfvTLMuDToC"
+  version: "qklg9GEsbHa3GF7ejERO70-E-X0GzrhqDdvqmnzm8AAC"
 }
 avd_name: "android_35_google_apis_x64"
 
diff --git a/tools/cfi/ignores.txt b/tools/cfi/ignores.txt
index cfc1c75..49bb5f2 100644
--- a/tools/cfi/ignores.txt
+++ b/tools/cfi/ignores.txt
@@ -206,6 +206,12 @@
 src:*third_party/vulkan-validation-layers/src/layers/*
 src:*third_party/angle/src/common/vulkan/vulkan_icd.cpp
 
+# Calls to TFLiteDelegate functions in a shared library.
+src:*services/webnn/tflite/op_resolver.cc
+src:*third_party/tflite/src/tensorflow/lite/c/common_internal.cc
+src:*third_party/tflite/src/tensorflow/lite/core/subgraph.cc
+src:*third_party/tflite/src/tensorflow/lite/delegates/utils.cc
+
 src:*components/os_crypt/sync/*
 
 src:*ui/accessibility/platform/browser_accessibility_auralinux.cc
diff --git a/tools/clang/spanify/rewrite-multiple-platforms.sh b/tools/clang/spanify/rewrite-multiple-platforms.sh
index eb6796e..737b40d 100755
--- a/tools/clang/spanify/rewrite-multiple-platforms.sh
+++ b/tools/clang/spanify/rewrite-multiple-platforms.sh
@@ -262,16 +262,21 @@
     fi
 
     # Main rewrite.
+    #
+    # To avoid spending too much time writing to disk, we use `awk '!x[$0]++'`
+    # to removes duplicate lines. This reduces the output by a 62 factor: from
+    # 20GB to 300MB. It is faster than `sort -u`. This consumes RAM, but
+    # cloudtops have plenty of it.
     echo "*** Running the main rewrite phase for $PLATFORM ***"
-    time tools/clang/scripts/run_tool.py \
+    time (
+      tools/clang/scripts/run_tool.py \
         $TARGET_OS_OPTION \
         --tool spanify \
         --generate-compdb \
         -p $OUT_DIR \
-        $COMPILE_DIRS > ~/scratch/rewriter-$PLATFORM.main.out \
-        2>~/scratch/rewriter-"${PLATFORM}".main.err
-    touch ~/scratch/rewriter.main.out
-    cat ~/scratch/rewriter-$PLATFORM.main.out >> ~/scratch/rewriter.main.out
+        $COMPILE_DIRS    2>~/scratch/rewriter-${PLATFORM}.main.err \
+        | awk '!x[$0]++' 1>~/scratch/rewriter-${PLATFORM}.main.out
+    )
 }
 
 if [ $REWRITE = true ]
@@ -296,9 +301,9 @@
   rm ~/scratch/patch*
 
   echo "*** Applying edits ***"
-  cat ~/scratch/rewriter.main.out | \
-      tools/clang/spanify/extract_edits.py | \
-      tools/clang/scripts/apply_edits.py -p $OUT_DIR $EDIT_DIRS
+  cat ~/scratch/rewriter-*.main.out \
+    | tools/clang/spanify/extract_edits.py \
+    | tools/clang/scripts/apply_edits.py -p $OUT_DIR $EDIT_DIRS
 else
   echo "*** Skipping edits ***"
 fi
diff --git a/tools/code_coverage/run_all_fuzzers.py b/tools/code_coverage/run_all_fuzzers.py
index 44e38c1..3c83b8a 100644
--- a/tools/code_coverage/run_all_fuzzers.py
+++ b/tools/code_coverage/run_all_fuzzers.py
@@ -9,10 +9,13 @@
 """
 
 import argparse
-from multiprocessing import Process, Manager, cpu_count, Pool
+import glob
+import math
 import os
 import subprocess
-import glob
+import sys
+
+from multiprocessing import Process, Manager, cpu_count, Pool
 from typing import Mapping, Sequence
 
 WHOLE_CORPUS_RETRIES = 2
@@ -21,6 +24,12 @@
 INDIVIDUAL_TESTCASES_MAX_TO_TRY = 500
 INDIVIDUAL_TESTCASES_SUCCESSES_NEEDED = 100
 
+LIBFUZZER = 'libfuzzer'
+CENTIPEDE = 'centipede'
+FUZZILLI = 'fuzzilli'
+ALL_FUZZER_TYPES = [LIBFUZZER, CENTIPEDE, FUZZILLI]
+REPORT_DIR = 'out/report'
+
 
 def _profdata_merge(inputs: Sequence[str], output: str) -> bool:
   """Merges the given profraw files into a single file.
@@ -131,6 +140,7 @@
   cmd = target_details['cmd']
   env = target_details['env']
   corpus_dir = target_details['corpus']
+  corpus_files = target_details['files']
   profraw_dir = target_details['profraw_dir']
   target_profdata = target_details['profdata_file']
 
@@ -147,6 +157,7 @@
                       f"full corpus attempt {i}")
     if ok:
       break
+
   valid_profiles = 0
   matching_profraws = list(_matching_profraws(fullcorpus_profraw))
   # There may be several if the fuzzer involved multiple processes,
@@ -154,13 +165,19 @@
   ok = _profdata_merge(matching_profraws, target_profdata)
   if ok:
     valid_profiles = 1
-  if valid_profiles == 0:
+
+  if valid_profiles == 0 and corpus_files is not None:
     # We failed to run the fuzzer with the whole corpus in one go. That probably
     # means one of the test cases caused a crash. Let's run each test
     # case one at a time. The resulting profraw files can be hundreds of MB
     # each so after each test case, we merge them into an accumulated
     # profdata file.
-    for count, corpus_entry in enumerate(os.listdir(corpus_dir)):
+    if corpus_files == '*':
+      corpus_files = os.listdir(corpus_dir)
+    else:
+      corpus_files = corpus_files.split()
+
+    for count, corpus_entry in enumerate(corpus_files):
       specific_test_case_profraw = os.path.join(
           profraw_dir, target + "_" + str(count) + "_%p.profraw")
       test_case = os.path.join(corpus_dir, corpus_entry)
@@ -208,8 +225,7 @@
          num_targets, len(verified_fuzzer_targets)))
 
 
-
-def _ParseCommandArguments():
+def _parse_command_arguments():
   """Adds and parses relevant arguments for tool commands.
 
   Returns:
@@ -235,114 +251,182 @@
                           type=str,
                           help='Directory where profdata will be stored.')
 
+  arg_parser.add_argument('--fuzzer',
+                          choices=ALL_FUZZER_TYPES,
+                          default=LIBFUZZER,
+                          help='The type of fuzzer tests to run.')
+
   arg_parser.add_argument
   args = arg_parser.parse_args()
   return args
 
 
-args = _ParseCommandArguments()
+def _get_all_target_details(args):
+  incomplete_targets = []
+  all_target_details = []
 
-incomplete_targets = []
-verified_fuzzer_targets = Manager().list()
-failed_targets = Manager().list()
-reportdir = 'out/report'
-all_target_details = []
-llvm_profdata = 'third_party/llvm-build/Release+Asserts/bin/llvm-profdata'
+  for fuzzer_target in os.listdir(args.fuzzer_corpora_dir):
+    fuzzer_target_binpath = os.path.join(args.fuzzer_binaries_dir,
+                                         fuzzer_target)
+    fuzzer_target_corporadir = os.path.join(args.fuzzer_corpora_dir,
+                                            fuzzer_target)
 
-if not (os.path.isfile(llvm_profdata)):
-  print('No valid llvm_profdata at %s' % llvm_profdata)
-  exit(2)
+    if not (os.path.isfile(fuzzer_target_binpath)
+            and os.path.isdir(fuzzer_target_corporadir)):
+      print((
+          'Could not find binary file for %s, or, the provided corpora path is '
+          'not a directory') % fuzzer_target)
+      incomplete_targets.append(fuzzer_target)
+    else:
+      env = dict()
+      if 'DISPLAY' in os.environ:
+        # Inherit X settings from the real environment
+        env['DISPLAY'] = os.environ['DISPLAY']
+      all_target_details.append({
+          'name':
+          fuzzer_target,
+          'profraw_dir':
+          REPORT_DIR,
+          'profdata_file':
+          os.path.join(REPORT_DIR, fuzzer_target + ".profdata"),
+          'env':
+          env,
+          # RSS limit 8GB. Some of our fuzzers which involve running significant
+          # chunks of Chromium code require more than the 2GB default.
+          'cmd': [
+              fuzzer_target_binpath, '-runs=0', '-rss_limit_mb=8192',
+              fuzzer_target_corporadir
+          ],
+          'corpus':
+          fuzzer_target_corporadir,
+          'files':
+          '*'
+      })
 
-if not (os.path.isdir(args.profdata_outdir)):
-  print('%s does not exist or is not a directory' % args.profdata_outdir)
-  exit(2)
-
-for fuzzer_target in os.listdir(args.fuzzer_corpora_dir):
-  fuzzer_target_binpath = os.path.join(args.fuzzer_binaries_dir, fuzzer_target)
-  fuzzer_target_corporadir = os.path.join(args.fuzzer_corpora_dir,
-                                          fuzzer_target)
-
-  if not (os.path.isfile(fuzzer_target_binpath)
-          and os.path.isdir(fuzzer_target_corporadir)):
-    print(
-        ('Could not find binary file for %s, or, the provided corpora path is '
-         'not a directory') % fuzzer_target)
-    incomplete_targets.append(fuzzer_target)
+  # We also want to run ./chrome without a valid X server.
+  # It will almost immediately exit.
+  # This runs essentially no Chrome code, so will result in all the lines
+  # of code in the Chrome binary being marked as 0 in the code coverage
+  # report. Without doing this step, many of the files of Chrome source
+  # code simply don't appear in the coverage report at all.
+  chrome_target_binpath = os.path.join(args.fuzzer_binaries_dir, "chrome")
+  if not os.path.isfile(chrome_target_binpath):
+    print('Could not find binary file for Chrome itself')
   else:
-    env = dict()
-    if 'DISPLAY' in os.environ:
-      # Inherit X settings from the real environment
-      env['DISPLAY'] = os.environ['DISPLAY']
+    profraw_file = chrome_target_binpath + ".profraw"
+
+    env = {'DISPLAY': 'not-a-real-display'}
     all_target_details.append({
         'name':
-        fuzzer_target,
+        "chrome",
         'profraw_dir':
-        reportdir,
+        REPORT_DIR,
         'profdata_file':
-        os.path.join(reportdir, fuzzer_target + ".profdata"),
+        os.path.join(REPORT_DIR, "chrome.profdata"),
         'env':
         env,
-        # RSS limit 8GB. Some of our fuzzers which involve running significant
-        # chunks of Chromium code require more than the 2GB default.
-        'cmd': [
-            fuzzer_target_binpath, '-runs=0', '-rss_limit_mb=8192',
-            fuzzer_target_corporadir
-        ],
+        'cmd': [chrome_target_binpath],
         'corpus':
-        fuzzer_target_corporadir
+        None,
+        'files':
+        None
     })
+  print("Incomplete targets (couldn't find binary): %s" % incomplete_targets)
+  return all_target_details
 
-# We also want to run ./chrome without a valid X server.
-# It will almost immediately exit.
-# This runs essentially no Chrome code, so will result in all the lines
-# of code in the Chrome binary being marked as 0 in the code coverage
-# report. Without doing this step, many of the files of Chrome source
-# code simply don't appear in the coverage report at all.
-chrome_target_binpath = os.path.join(args.fuzzer_binaries_dir, "chrome")
-if not os.path.isfile(chrome_target_binpath):
-  print('Could not find binary file for Chrome itself')
-else:
-  profraw_file = chrome_target_binpath + ".profraw"
-  profraw_path = os.path.join(reportdir, profraw_file)
 
-  env = {'DISPLAY': 'not-a-real-display'}
-  all_target_details.append({
-      'name':
-      "chrome",
-      'profraw_dir':
-      reportdir,
-      'profdata_file':
-      os.path.join(reportdir, "chrome.profdata"),
-      'env':
-      env,
-      'cmd': [chrome_target_binpath],
-      'corpus':
-      None
-  })
+def _get_fuzzilli_target_details(args):
+  all_target_details = []
+  fuzzer_target_binpath = os.path.join(args.fuzzer_binaries_dir, 'd8')
+  if not os.path.isfile(fuzzer_target_binpath):
+    print(f'Could not find binary file: {fuzzer_target_binpath}')
+    return all_target_details
 
-# Run the fuzzers in parallel.
-cpu_count = int(cpu_count())
-num_targets = len(all_target_details)
-print("Running %d fuzzers across %d CPUs" % (num_targets, cpu_count))
-with Pool(cpu_count) as p:
-  results = p.map(
-      _run_fuzzer_target,
-      [(target_details, verified_fuzzer_targets, failed_targets, num_targets)
-       for target_details in all_target_details])
+  for corpora_dir in os.listdir(args.fuzzer_corpora_dir):
+    target_corpora_dir = os.path.join(args.fuzzer_corpora_dir, corpora_dir)
+    if not os.path.isdir(target_corpora_dir):
+      continue
+    # for each corpora dir, the json file containing the command line args is at
+    # x/fuzzdir/settings.json. Javascript files are at x/fuzzdir/corpus
+    path_to_settings = os.path.join(target_corpora_dir, 'fuzzdir',
+                                    'settings.json')
+    with open(path_to_settings, 'r') as fp:
+      settings = json.load(fp)
+    cmd = [fuzzer_target_binpath]
+    cmd.extend(settings['processArguments'])
+    path_to_js_dir = os.path.join(target_corpora_dir, 'fuzzdir', 'corpus')
+    jsfiles = [
+        file for file in os.listdir(path_to_js_dir) if file.endswith('.js')
+    ]
+    files_per_chunk = 10
+    num_of_chunks = math.ceil(len(jsfiles) / files_per_chunk)
+    for i in range(num_of_chunks):
+      chunk = jsfiles[files_per_chunk * i:files_per_chunk * (i + 1)]
+      all_target_details.append({
+          'name':
+          f'{corpora_dir}_{i}',
+          'profraw_dir':
+          REPORT_DIR,
+          'profdata_file':
+          os.path.join(REPORT_DIR, f'{corpora_dir}_{i}.profdata'),
+          'env':
+          env,
+          'cmd':
+          cmd + chunk,
+          'corpus':
+          fuzzer_target_corporadir,
+          'files':
+          ' '.join(chunk)
+      })
 
-print("Successful targets: %s" % verified_fuzzer_targets)
-print("Failed targets: %s" % failed_targets)
-print("Incomplete targets (couldn't find binary): %s" % incomplete_targets)
 
-print("Finished getting coverage information. Copying to %s" %
-      args.profdata_outdir)
-for fuzzer in verified_fuzzer_targets:
-  cmd = [
-      'cp',
-      os.path.join(reportdir, fuzzer + '.profdata'), args.profdata_outdir
-  ]
-  print(cmd)
-  try:
-    subprocess.check_call(cmd)
-  except:
-    print.warning("Warning: failed to copy profdata for %s" % fuzzer)
+def main():
+  args = _parse_command_arguments()
+
+  verified_fuzzer_targets = Manager().list()
+  failed_targets = Manager().list()
+  all_target_details = []
+  llvm_profdata = 'third_party/llvm-build/Release+Asserts/bin/llvm-profdata'
+
+  if not (os.path.isfile(llvm_profdata)):
+    print('No valid llvm_profdata at %s' % llvm_profdata)
+    exit(2)
+
+  if not (os.path.isdir(args.profdata_outdir)):
+    print('%s does not exist or is not a directory' % args.profdata_outdir)
+    exit(2)
+
+  if args.fuzzer == 'FUZZILLI':
+    all_target_details = _get_fuzzilli_target_details(args)
+  else:
+    all_target_details = _get_all_target_details(args)
+
+  # Run the fuzzers in parallel.
+  num_cpus = int(cpu_count())
+  num_targets = len(all_target_details)
+  print("Running %d fuzzers across %d CPUs" % (num_targets, num_cpus))
+  with Pool(num_cpus) as p:
+    results = p.map(
+        _run_fuzzer_target,
+        [(target_details, verified_fuzzer_targets, failed_targets, num_targets)
+         for target_details in all_target_details])
+
+  print("Successful targets: %s" % verified_fuzzer_targets)
+  print("Failed targets: %s" % failed_targets)
+
+  print("Finished getting coverage information. Copying to %s" %
+        args.profdata_outdir)
+  for fuzzer in verified_fuzzer_targets:
+    cmd = [
+        'cp',
+        os.path.join(REPORT_DIR, fuzzer + '.profdata'), args.profdata_outdir
+    ]
+    print(cmd)
+    try:
+      subprocess.check_call(cmd)
+    except:
+      print.warning("Warning: failed to copy profdata for %s" % fuzzer)
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index f292b7c4..b162935 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -432,6 +432,10 @@
     "META": {"sizes": {"includes": [30]}},
     "includes": [4010],
   },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/glic/fre/resources.grd": {
+    "META": {"sizes": {"includes": [5]}},
+    "includes": [4020],
+  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/history/resources.grd": {
     "META": {"sizes": {"includes": [50]}},
     "includes": [4040],
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index f82bc92..92fc6b1 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -47679,6 +47679,8 @@
   <suffix name="iOSPromoPostRestore" label="For iOSPromoPostRestore feature"/>
   <suffix name="iOSPromoPostRestoreDefaultBrowser"
       label="For iOSPromoPostRestoreDefaultBrowser feature"/>
+  <suffix name="iOSPromoSigninFullscreen"
+      label="For iOSPromoSigninFullscreen feature"/>
   <suffix name="iOSPromoStaySafe" label="For Stay Safe default browser promo."/>
   <suffix name="iOSPromoWhatsNew" label="For iOSPromoWhatsNew feature"/>
   <suffix name="iOSPullToRefreshFeature"
diff --git a/tools/metrics/histograms/README.md b/tools/metrics/histograms/README.md
index f7c5309e..68cd0196 100644
--- a/tools/metrics/histograms/README.md
+++ b/tools/metrics/histograms/README.md
@@ -161,6 +161,8 @@
 - not renumber or reuse enumerator values. When adding a new enumerator, append
   the new enumerator to the end. When removing an unused enumerator, comment it
   out, making it clear the value was previously used.
+  - Note that enum labels may be revised in some cases; see
+    [Revising Histograms](#revising).
 
 If your enum histogram has a catch-all / miscellaneous bucket, put that bucket
 first (`= 0`). This makes the bucket easy to find on the dashboard if additional
@@ -620,7 +622,7 @@
 the initial statistics with a grain of salt; they're probably *mostly* right but
 not entirely so.
 
-## Revising Histograms
+## Revising Histograms {#revising}
 
 When changing the semantics of a histogram (when it's emitted, what the buckets
 represent, the bucket range or number of buckets, etc.), create a new histogram
@@ -629,6 +631,15 @@
 recommendation is to simply append a '2' to the name. See [Cleaning Up Histogram
 Entries](#obsolete) for details on how to handle the XML changes.
 
+Changes to a histogram are allowed in some cases when the semantics have not
+changed at all. Here are some examples that would be allowed:
+- A histogram's summary can be rewritten to be more accurate.
+- An enum bucket's label can be changed, as long it still refers to the same
+  thing that it did before, e.g. if an enum listed some manufacturer's products,
+  and the manufacturer later renamed one of them.
+  - Note that downstream tooling will apply the updated label to past data
+    retroactively.
+
 ## Deleting Histograms
 
 Please delete code that emits to histograms that are no longer needed.
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4d08005..a5b6c1c 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -8704,6 +8704,7 @@
   <int value="-2132591642" label="enable-input-view"/>
   <int value="-2132161378" label="SendTabToSelfHistory:disabled"/>
   <int value="-2131860332" label="WebRtcPipeWireCamera:enabled"/>
+  <int value="-2130901095" label="MediaAppImageMantisErase:disabled"/>
   <int value="-2130526300"
       label="BlinkSchedulerDiscreteInputMatchesResponsivenessMetrics:disabled"/>
   <int value="-2129940395" label="WebAssemblySimd:disabled"/>
@@ -9022,6 +9023,8 @@
   <int value="-2022956008" label="ExternalPciDevicesAllowed:disabled"/>
   <int value="-2022243258" label="SiteDataImprovements:enabled"/>
   <int value="-2021954068" label="TapVisualizerApp:disabled"/>
+  <int value="-2020886334"
+      label="MediaAppImageMantisExpandBackground:disabled"/>
   <int value="-2020721975" label="smart-virtual-keyboard"/>
   <int value="-2020024440" label="scroll-end-effect"/>
   <int value="-2019050827" label="AIPromptAPIMultimodalInput:enabled"/>
@@ -9427,6 +9430,7 @@
   <int value="-1863066403" label="MoveThemePrefsToSpecifics:disabled"/>
   <int value="-1863020461" label="PasswordChangeInSettings:enabled"/>
   <int value="-1861814223" label="MidiManagerDynamicInstantiation:enabled"/>
+  <int value="-1861712507" label="MediaAppImageMantisMakeASticker:disabled"/>
   <int value="-1861278695" label="BulkTabRestore:enabled"/>
   <int value="-1860959988" label="Picker:disabled"/>
   <int value="-1860481724" label="ChromeHomeExpandButton:enabled"/>
@@ -9493,6 +9497,7 @@
   <int value="-1837401779" label="EnableFileManagerFormatDialog:enabled"/>
   <int value="-1837359971" label="kEnterOverviewFromWallpaper:enabled"/>
   <int value="-1837329460" label="NewEncodeCpuLoadEstimator:enabled"/>
+  <int value="-1837137559" label="MediaAppImageMantisErase:enabled"/>
   <int value="-1836854634" label="CloseTabSuggestions:enabled"/>
   <int value="-1836511093"
       label="QueryTilesRemoveTrendingAfterInactivity:enabled"/>
@@ -11128,6 +11133,7 @@
   <int value="-1190174011" label="enable-hdr"/>
   <int value="-1190171773" label="NtpHistoryClustersModuleTextOnly:enabled"/>
   <int value="-1188066168" label="Mahi:disabled"/>
+  <int value="-1188052495" label="MediaAppImageMantisExpandBackground:enabled"/>
   <int value="-1188042082" label="ZeroSuggestPrefetchingOnSRP:enabled"/>
   <int value="-1187546444" label="MuteNotificationSnoozeAction:enabled"/>
   <int value="-1187251500" label="OmniboxPedalsBatch2NonEnglish:disabled"/>
@@ -11220,6 +11226,7 @@
   <int value="-1156639003" label="ArcResizeCompat:enabled"/>
   <int value="-1156179600" label="OmniboxRichEntitySuggestions:enabled"/>
   <int value="-1155543191" label="CopylessPaste:disabled"/>
+  <int value="-1155470492" label="AutofillEnableCardExpiredText:enabled"/>
   <int value="-1155411808" label="HoldingSpacePredictability:enabled"/>
   <int value="-1155071457"
       label="CCTResizableAllowResizeByUserGesture:disabled"/>
@@ -12018,6 +12025,7 @@
   <int value="-838233458" label="RustyPng:enabled"/>
   <int value="-837650216" label="DisableCryptAuthV1DeviceSync:disabled"/>
   <int value="-837473047" label="AutofillEnableStickyPaymentsBubble:disabled"/>
+  <int value="-837209358" label="AutofillEnableCardExpiredText:disabled"/>
   <int value="-836123854" label="wallet-service-use-sandbox"/>
   <int value="-835672415" label="PointerEventV1SpecCapturing:disabled"/>
   <int value="-835627918" label="QuickSettingsNetworkRevamp:enabled"/>
@@ -13511,6 +13519,7 @@
   <int value="-250822813" label="PwaImprovedSplashScreen:enabled"/>
   <int value="-250721831" label="AndroidAutofillAccessibility:disabled"/>
   <int value="-250543540" label="DeferAllScript:enabled"/>
+  <int value="-250357169" label="MediaAppImageMantisReimagine:enabled"/>
   <int value="-249636068" label="ChromeRootStoreUsed:enabled"/>
   <int value="-249443346" label="PhoneHubCallNotification:disabled"/>
   <int value="-249415830" label="FilteringScrollPrediction:disabled"/>
@@ -14568,6 +14577,7 @@
   <int value="174917935" label="ReengagementNotification:disabled"/>
   <int value="175254474" label="SpectreVariant2Mitigation:enabled"/>
   <int value="176284157" label="HistoryOptInEntryPoints:enabled"/>
+  <int value="176329316" label="MediaAppImageMantisReimagine:disabled"/>
   <int value="176401620" label="TabGroupParityAndroid:enabled"/>
   <int value="176421334"
       label="OmniboxHistoryQuickProviderSpecificityScoreCountUniqueHosts:enabled"/>
@@ -15763,6 +15773,7 @@
   <int value="649508040" label="AutofillEnableCompanyName:enabled"/>
   <int value="650013099" label="PrivacySandboxSettings2:disabled"/>
   <int value="650168383" label="PulseaudioLoopbackForScreenShare:enabled"/>
+  <int value="650334758" label="MediaAppImageMantisRemoveBackground:disabled"/>
   <int value="651421878" label="VideoRotateToFullscreen:enabled"/>
   <int value="651471603" label="MediaFoundationD3D11VideoCapture:enabled"/>
   <int value="651562604" label="RawClipboard:enabled"/>
@@ -15791,6 +15802,7 @@
       label="Prerender2EarlyDocumentLifecycleUpdate:enabled"/>
   <int value="661020875" label="AutofillSaveCardShowNoThanks:disabled"/>
   <int value="661537613" label="WebNotesPublish:enabled"/>
+  <int value="661566521" label="MediaAppImageMantisRemoveBackground:enabled"/>
   <int value="662001716" label="ToolbarIphAndroid:disabled"/>
   <int value="662331859" label="ConversionMeasurement:enabled"/>
   <int value="662707634" label="DynamicColorAndroid:enabled"/>
@@ -18959,6 +18971,7 @@
   <int value="1874910934" label="(Obsolete) CrOSSuspendToDiskAllowS4:disabled"/>
   <int value="1875156497" label="CaptureMode:enabled"/>
   <int value="1877769074" label="PhoneHubFeatureSetupErrorHandling:enabled"/>
+  <int value="1877956196" label="AccessibilityTextFormatting:disabled"/>
   <int value="1878331098" label="GuestViewCrossProcessFrames:enabled"/>
   <int value="1880148987" label="PrivacySandboxAdTopicsContentParity:disabled"/>
   <int value="1880955305" label="enable-preconnect-to-search"/>
@@ -19033,6 +19046,7 @@
   <int value="1906901281" label="WebFilterInterstitialRefresh:enabled"/>
   <int value="1906942630" label="enable-easy-unlock"/>
   <int value="1907273605" label="NtpZeroSuggest:disabled"/>
+  <int value="1908930956" label="AccessibilityTextFormatting:enabled"/>
   <int value="1909117215" label="animated-image-resume"/>
   <int value="1909961759" label="SurfaceSyncFullscreenKillswitch:enabled"/>
   <int value="1910240042" label="enable-experimental-fullscreen-exit-ui"/>
@@ -19597,6 +19611,7 @@
   <int value="2125732298" label="RetailCoupons:disabled"/>
   <int value="2126030721" label="VCBackgroundBlur:disabled"/>
   <int value="2126203058" label="force-show-update-menu-badge"/>
+  <int value="2126699423" label="MediaAppImageMantisMakeASticker:enabled"/>
   <int value="2126724836" label="TpcdHeuristicsGrants:disabled"/>
   <int value="2127648677" label="OmniboxExperimentalSuggestScoring:disabled"/>
   <int value="2127700228" label="NtpHistoryClustersModule:enabled"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/enums.xml b/tools/metrics/histograms/metadata/accessibility/enums.xml
index c06ee3e..440e6ac 100644
--- a/tools/metrics/histograms/metadata/accessibility/enums.xml
+++ b/tools/metrics/histograms/metadata/accessibility/enums.xml
@@ -1744,9 +1744,11 @@
   <int value="4" label="Lexend Deca"/>
   <int value="5" label="EB Garamond"/>
   <int value="6" label="STIX Two Text"/>
+  <int value="7" label="Andika"/>
+  <int value="8" label="Atkinson Hyperlegible"/>
 </enum>
 
-<!-- LINT.ThenChange(//chrome/common/read_anything/read_anything_constants.h:ReadAnythingFont) -->
+<!-- LINT.ThenChange(//chrome/common/read_anything/read_anything_util.cc:ReadAnythingFont) -->
 
 <!-- LINT.IfChange(ReadAnythingHighlightGranularity) -->
 
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 57c3937..c76ccac 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -2988,7 +2988,7 @@
 
 <histogram
     name="Android.MultiWindowMode.AssertIndicesMatch.PreExistingActivityDestroyed"
-    enum="PreAssignedActivityState" expires_after="2025-03-09">
+    enum="PreAssignedActivityState" expires_after="2026-02-11">
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -3052,7 +3052,7 @@
 
 <histogram
     name="Android.MultiWindowMode.MismatchedIndices.ActivityCreationTimeDelta"
-    units="ms" expires_after="2025-03-09">
+    units="ms" expires_after="2026-02-11">
   <owner>aishwaryarj@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -3065,6 +3065,22 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Android.MultiWindowMode.MismatchedIndices.TimeToPreExistingActivityDestruction"
+    units="ms" expires_after="2026-02-11">
+  <owner>aishwaryarj@google.com</owner>
+  <owner>clank-large-form-factors@google.com</owner>
+  <summary>
+    When the TabWindowManager allocates a different tab model index than the
+    window Id selected by MultiInstanceManagerApi31, it means the requested tab
+    model Id was assigned to a different Activity.
+
+    When this mismatch happened, if #onDestroy is called for an activity found
+    at the requested index, record the time it took for this activity to get
+    destroyed after the mismatch was reported.
+  </summary>
+</histogram>
+
 <histogram name="Android.MultiWindowMode.TotalDuration" units="ms"
     expires_after="2025-05-11">
   <owner>skavuluru@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ash/enums.xml b/tools/metrics/histograms/metadata/ash/enums.xml
index 2c760e8d..328d64d 100644
--- a/tools/metrics/histograms/metadata/ash/enums.xml
+++ b/tools/metrics/histograms/metadata/ash/enums.xml
@@ -163,15 +163,6 @@
   <int value="2" label="(Obsolete) Notification's button clicked"/>
 </enum>
 
-<enum name="AshNightLightDisplayCrtcCtmSupportType">
-  <summary>
-    Defines the possible displays' color transform matrix support types
-  </summary>
-  <int value="0" label="No display support"/>
-  <int value="1" label="Mixed display support"/>
-  <int value="2" label="All displays support"/>
-</enum>
-
 <enum name="AshNightLightScheduleType">
   <summary>Defines the possible Night Light schedule types</summary>
   <int value="0" label="None"/>
@@ -2002,11 +1993,12 @@
   <int value="1" label="Consent disclaimer rejected"/>
   <int value="2" label="Sunfish screen entered via shortcut"/>
   <int value="3"
-      label="Sunfish screen: initial screen capture sent to scanner server"/>
+      label="DEPRECATED: Sunfish screen: initial screen capture sent to
+             scanner server"/>
   <int value="4" label="Screen capture mode: Scanner button shown"/>
   <int value="5"
-      label="Screen capture mode: initial screen capture sent to scanner
-             server"/>
+      label="DEPRECATED: Screen capture mode: initial screen capture sent to
+             scanner server"/>
   <int value="6" label="No actions detected"/>
   <int value="7" label="New calendar event action detected"/>
   <int value="8" label="New calendar event action finished successfully"/>
@@ -2062,6 +2054,16 @@
   <int value="40" label="&quot;Do not show UI&quot; resulted from kiosk mode"/>
   <int value="41" label="Launcher was shown without Sunfish-session button"/>
   <int value="42" label="Launcher was shown with Sunfish-session button"/>
+  <int value="43"
+      label="Image captured in Sunfish-session, and actions were not fetched"/>
+  <int value="44"
+      label="Image captured in Sunfish-session, and actions started fetching"/>
+  <int value="45"
+      label="Image captured from smart actions button, and actions were not
+             fetched"/>
+  <int value="46"
+      label="Image captured from smart actions button, and actions started
+             fetching"/>
 </enum>
 
 <!-- LINT.ThenChange(//ash/scanner/scanner_metrics.h:ScannerFeatureUserState) -->
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index a9fdc93..b38c1bf 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -6024,18 +6024,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ash.NightLight.DisplayCrtcCtmSupport"
-    enum="AshNightLightDisplayCrtcCtmSupportType" expires_after="2022-02-01">
-  <owner>afakhry@chromium.org</owner>
-  <owner>tclaiborne@chromium.org</owner>
-  <summary>
-    The type of CRTC color transorm matrix support for the currently connected
-    displays. Emitted when cursor compositing status is refreshed, but only when
-    Night Light is on. The cursor compositing status is refreshed whenever there
-    is a change in Night Light status or color temperature.
-  </summary>
-</histogram>
-
 <histogram name="Ash.NightLight.ScheduleType" enum="AshNightLightScheduleType"
     expires_after="2024-05-19">
   <owner>afakhry@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index e7c2f29..f4f05412 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -78,6 +78,11 @@
   <variant name="Natwest" summary="card issued by Natwest"/>
 </variants>
 
+<variants name="Autofill.CreditCardIssuerId.WithBenefits">
+  <variant name="Amex" summary="card issued by American Express"/>
+  <variant name="Bmo" summary="card issued by BMO"/>
+</variants>
+
 <variants name="Autofill.CreditCardNetwork">
   <variant name="Mastercard" summary="card with the Mastercard network."/>
   <variant name="Visa" summary="card with the Visa network."/>
@@ -2885,7 +2890,8 @@
     and logs at each of those times. Log emission pertains to the credit card
     issuer, {CardIssuerId}.
   </summary>
-  <token key="CardIssuerId" variants="Autofill.CreditCardIssuerId"/>
+  <token key="CardIssuerId"
+      variants="Autofill.CreditCardIssuerId.WithBenefits"/>
 </histogram>
 
 <histogram name="Autofill.FormEvents.CreditCard.WithOffer"
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml
index e274c7b..6510507 100644
--- a/tools/metrics/histograms/metadata/blink/enums.xml
+++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -5925,6 +5925,7 @@
   <int value="5322" label="ColumnPseudoElement"/>
   <int value="5323" label="ScrollButtonPseudoElement"/>
   <int value="5324" label="ScrollMarkerPseudoElement"/>
+  <int value="5325" label="V8AITranslatorFactory_Availability_Method"/>
 </enum>
 
 <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) -->
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml
index 02980f5..d2a60d97 100644
--- a/tools/metrics/histograms/metadata/dev/histograms.xml
+++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -511,6 +511,17 @@
   </summary>
 </histogram>
 
+<histogram name="DevTools.TraceLoad2" units="ms" expires_after="2025-07-18">
+  <owner>paulirish@google.com</owner>
+  <owner>jacktfranklin@google.com</owner>
+  <owner>victorporof@google.com</owner>
+  <summary>
+    Measures the time a trace is loading. Starts when recording is stopped or
+    file/url load was started. Stops after the first render of the flamechart.
+    Supports values over 10s.
+  </summary>
+</histogram>
+
 <histogram name="DevTools.VisualLogging.ProcessingTime" units="ms"
     expires_after="2025-12-31">
   <owner>danilsomsikov@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 83b04b1..7f0a4d0 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -150,6 +150,24 @@
   <variant name=".InitialEnrollment" summary="Initial Enrollment Exchange"/>
 </variants>
 
+<variants name="EnterpriseReportingEventType">
+  <variant name="All" summary="All events"/>
+  <variant name="BrowserCrash" summary="Browser crash events"/>
+  <variant name="DangerousDownload" summary="Dangerous download events"/>
+  <variant name="ExtensionInstall" summary="Extension install events"/>
+  <variant name="ExtensionTelemetry" summary="Extension telemetry events"/>
+  <variant name="Interstitial" summary="Interstitial events"/>
+  <variant name="Login" summary="Login events"/>
+  <variant name="PasswordBreach" summary="Password breach events"/>
+  <variant name="PasswordChanged" summary="Password changed events"/>
+  <variant name="PasswordReuse" summary="Password reuse events"/>
+  <variant name="SensitiveData" summary="Sensitive data events"/>
+  <variant name="Unknown" summary="Unknown/uncategorized events"/>
+  <variant name="UnscannedFile" summary="Unscanned file events"/>
+  <variant name="UrlFilteringInterstitial"
+      summary="URL filtering interstitial events"/>
+</variants>
+
 <variants name="EnterpriseSignals">
   <variant name="AntiVirus" summary="antivirus"/>
   <variant name="FileSystemInfo" summary="file system information"/>
@@ -2992,6 +3010,19 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.ReportingEvent.{EventType}.UploadSize" units="B"
+    expires_after="2025-08-14">
+  <owner>domfc@chromium.org</owner>
+  <owner>xanth@google.com</owner>
+  <owner>nancylanxiao@google.com</owner>
+  <summary>
+    The size of the UploadEventsRequest for {EventType} events sent to the
+    reporting server, in bytes. This is recorded once per upload request when
+    the payload is generated in RealtimeReportingJobConfiguration::GetPayload.
+  </summary>
+  <token key="EventType" variants="EnterpriseReportingEventType"/>
+</histogram>
+
 <histogram name="Enterprise.ReportingEventUploadFailure"
     enum="EnterpriseReportingEventType" expires_after="2025-11-27">
   <owner>xanth@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/extensions/enums.xml b/tools/metrics/histograms/metadata/extensions/enums.xml
index 6830221a..e690328 100644
--- a/tools/metrics/histograms/metadata/extensions/enums.xml
+++ b/tools/metrics/histograms/metadata/extensions/enums.xml
@@ -151,6 +151,8 @@
   <int value="33554432" label="DISABLE_UNKNOWN"/>
 </enum>
 
+<!-- LINT.IfChange(ExtensionEvents) -->
+
 <enum name="ExtensionEvents">
 <!-- Generated from extensions/browser/extension_event_histogram_value.h.
 Called by update_extension_histograms.py.-->
@@ -768,6 +770,8 @@
   <int value="564" label="OMNIBOX_ON_ACTION_EXECUTED"/>
 </enum>
 
+<!-- LINT.ThenChange(//extensions/browser/extension_event_histogram_value.h:HistogramValue) -->
+
 <enum name="ExtensionForceInstalledPreInstalledDeprecatedSite">
   <int value="0" label="Gmail"/>
   <int value="1" label="Docs"/>
@@ -782,6 +786,8 @@
   <int value="1" label="External install location"/>
 </enum>
 
+<!-- LINT.IfChange(ExtensionFunctions) -->
+
 <enum name="ExtensionFunctions">
 <!-- Generated from extensions/browser/extension_function_histogram_value.h.
 Called by update_extension_histograms.py.-->
@@ -2797,6 +2803,8 @@
   <int value="1923" label="AUTOTESTPRIVATE_OVERRIDESCANNERRESPONSESFORTESTING"/>
 </enum>
 
+<!-- LINT.ThenChange(//extensions/browser/extension_function_histogram_value.h:HistogramValue) -->
+
 <enum name="ExtensionInstallationCrxInstallError">
   <int value="0" label="NONE"/>
   <int value="1" label="CONVERT_USER_SCRIPT_TO_EXTENSION_FAILED"/>
@@ -3526,6 +3534,17 @@
 
 <!-- LINT.ThenChange(/extensions/browser/api/web_request/web_request_api.h:ProxyDecision) -->
 
+<!-- LINT.IfChange(WebRequestProxyDecisionDetailsForExtension) -->
+
+<enum name="WebRequest.ProxyDecisionDetailsForExtension">
+  <int value="0" label="kOnlyForWebRequest"/>
+  <int value="1" label="kOnlyForDeclarativeRequest"/>
+  <int value="2" label="kOnlyForWebView"/>
+  <int value="3" label="kForMixedReasons"/>
+</enum>
+
+<!-- LINT.ThenChange(/extensions/browser/api/web_request/web_request_api.cc:ProxyDecisionDetailsForExtension) -->
+
 <enum name="WebRequest.RequestHeader">
   <int value="0" label="kNone"/>
   <int value="1" label="kOther"/>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index 6271f465..2ba4fc5 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -5254,6 +5254,18 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.WebRequest.ProxyDecisionDetailsForExtension"
+    enum="WebRequest.ProxyDecisionDetailsForExtension"
+    expires_after="2025-05-18">
+  <owner>toyoshim@chromium.org</owner>
+  <owner>chrome-loading@google.com</owner>
+  <summary>
+    Records the reason of kWillProxyForExtension in the ProxyDecision2. This is
+    recorded if and only if the reason is kWillProxyForExtension when a
+    URLLoaderFactory is created for renderers.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.WebRequest.RequestHeaderAdded"
     enum="WebRequest.RequestHeader" expires_after="never">
 <!-- expires-never: For monitoring Web Request API usage. -->
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index b6a18edd..bbd1394c 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -312,6 +312,8 @@
       summary="showing the Post Restore Promo on iOS"/>
   <variant name="IPH_iOSPromoPostRestoreDefaultBrowser"
       summary="showing the Post Restore Default Browser Promo on iOS"/>
+  <variant name="IPH_iOSPromoSigninFullscreen"
+      summary="showing the Signin Fullscreen Promo on iOS"/>
   <variant name="IPH_iOSPromoStaySafe"
       summary="showing Stay Safe default browser promo"/>
   <variant name="IPH_iOSPromoWhatsNew"
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index b10b512..af6eae4 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -862,7 +862,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Errors.Drive"
-    enum="OfficeDriveOpenErrors" expires_after="2025-05-01">
+    enum="OfficeDriveOpenErrors" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -872,7 +872,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Errors.OneDrive"
-    enum="OfficeOneDriveOpenErrors" expires_after="2025-07-06">
+    enum="OfficeOneDriveOpenErrors" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -882,7 +882,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Errors.{CloudProvider}.MetricState"
-    enum="MetricState" expires_after="2025-07-06">
+    enum="MetricState" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -893,7 +893,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.FileHandler.{RootType}.{ConnectionStatus}"
-    enum="OfficeFileHandler" expires_after="2025-07-06">
+    enum="OfficeFileHandler" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -912,7 +912,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.FileOpen.Time.{Transfer}.{Size}.To.{CloudProvider}"
-    units="ms" expires_after="2025-08-03">
+    units="ms" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -944,7 +944,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.AuthAttempt"
-    enum="OfficeOneDriveAuthAttemptType" expires_after="2025-07-06">
+    enum="OfficeOneDriveAuthAttemptType" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -965,7 +965,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.AuthResult.Interactive"
-    enum="OfficeOneDriveAuthResultInteractive" expires_after="2025-07-06">
+    enum="OfficeOneDriveAuthResultInteractive" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -975,7 +975,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.AuthResult.NonInteractive"
-    enum="OfficeOneDriveAuthResultNonInteractive" expires_after="2025-07-06">
+    enum="OfficeOneDriveAuthResultNonInteractive" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -996,7 +996,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.DriveType"
-    enum="OfficeOneDriveType" expires_after="2025-07-06">
+    enum="OfficeOneDriveType" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1006,7 +1006,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.FileSize.{Direction}" units="KiB"
-    expires_after="2025-08-03">
+    expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1020,7 +1020,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.FileSystemProvider.Completion.{API-FSP}"
-    enum="FileSystemProviderOperationCompletion" expires_after="2025-07-06">
+    enum="FileSystemProviderOperationCompletion" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1033,7 +1033,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.FileSystemProvider.Error.{API-FSP}"
-    enum="PlatformFileError" expires_after="2025-07-06">
+    enum="PlatformFileError" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1045,7 +1045,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.FileSystemProvider.ExtendedError.{ExtendedFSPOperation}"
-    enum="FileSystemProviderExtendedODFSError" expires_after="2025-07-06">
+    enum="FileSystemProviderExtendedODFSError" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1056,7 +1056,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.FileSystemProvider.Time.{API-FSP}"
-    units="ms" expires_after="2025-07-06">
+    units="ms" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1067,7 +1067,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.GraphAPI.DeltaSize.{Case}"
-    units="count" expires_after="2025-07-06">
+    units="count" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1083,7 +1083,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.GraphAPI.LastResponseCode.{GetDeltaCallType}"
-    enum="OfficeGraphAPIResult" expires_after="2025-05-01">
+    enum="OfficeGraphAPIResult" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1096,7 +1096,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.GraphAPI.ResponseCode.{GraphAPIMethod}"
-    enum="OfficeGraphAPIResult" expires_after="2025-05-01">
+    enum="OfficeGraphAPIResult" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1109,7 +1109,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.ODFS.GraphAPI.ResponseCodeSparse.{GraphAPIMethod}"
-    enum="OfficeGraphAPIResult" expires_after="2025-07-06">
+    enum="OfficeGraphAPIResult" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1120,7 +1120,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.GraphAPI.Time.{GraphAPIMethod}"
-    units="ms" expires_after="2025-05-01">
+    units="ms" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1130,7 +1130,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.MimeType.{Direction}"
-    enum="DownloadMimeTypeResult" expires_after="2025-05-01">
+    enum="DownloadMimeTypeResult" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1143,7 +1143,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.MountStatePostRestore"
-    enum="MountStatePostRestore" expires_after="2025-07-06">
+    enum="MountStatePostRestore" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1153,7 +1153,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.MountStatePreRestore"
-    enum="MountStatePreRestore" expires_after="2025-07-06">
+    enum="MountStatePreRestore" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1175,7 +1175,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.Throughput.{Direction}"
-    units="KiB/s" expires_after="2025-05-01">
+    units="KiB/s" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1188,7 +1188,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.Version" units="version"
-    expires_after="2025-07-06">
+    expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1199,7 +1199,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.WebUrlFormat" enum="WebUrlFormat"
-    expires_after="2025-07-06">
+    expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1209,7 +1209,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Open.CloudProvider"
-    enum="CloudProvider" expires_after="2025-07-06">
+    enum="CloudProvider" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1221,7 +1221,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Open.FileType.{CloudProvider}"
-    enum="OfficeOpenExtensions" expires_after="2025-07-06">
+    enum="OfficeOpenExtensions" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1233,7 +1233,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.Open.IOTaskError.{CloudProvider}.{Transfer}"
-    enum="PlatformFileError" expires_after="2025-07-06">
+    enum="PlatformFileError" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1253,7 +1253,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.Open.IOTaskError.{CloudProvider}.{Transfer}.MetricState"
-    enum="MetricState" expires_after="2025-07-06">
+    enum="MetricState" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1270,7 +1270,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Open.NumberOfFiles.{CloudProvider}"
-    units="count" expires_after="2025-07-06">
+    units="count" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1281,7 +1281,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Open.SourceVolume.{CloudProvider}"
-    enum="OfficeFilesSourceVolume" expires_after="2025-07-06">
+    enum="OfficeFilesSourceVolume" expires_after="2026-02-18">
   <owner>austinct@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1303,7 +1303,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.Open.SourceVolume.{CloudProvider}.MetricState"
-    enum="MetricState" expires_after="2025-07-06">
+    enum="MetricState" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1314,7 +1314,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Open.TransferRequired.{CloudProvider}"
-    enum="OfficeFilesTransferRequired" expires_after="2025-07-06">
+    enum="OfficeFilesTransferRequired" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1326,7 +1326,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.Open.TransferRequired.{CloudProvider}.MetricState"
-    enum="MetricState" expires_after="2025-07-06">
+    enum="MetricState" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1337,7 +1337,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Open.UploadResult.{CloudProvider}"
-    enum="OfficeFilesUploadResult" expires_after="2025-07-06">
+    enum="OfficeFilesUploadResult" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1349,7 +1349,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.Open.UploadResult.{CloudProvider}.MetricState"
-    enum="MetricState" expires_after="2025-07-06">
+    enum="MetricState" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1360,7 +1360,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.CancelPage"
-    enum="OfficeSetupPage" expires_after="2025-07-06">
+    enum="OfficeSetupPage" expires_after="2026-02-18">
   <owner>austinct@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1371,7 +1371,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.FileHandlerSelection"
-    enum="OfficeSetupFileHandler" expires_after="2025-07-06">
+    enum="OfficeSetupFileHandler" expires_after="2026-02-18">
   <owner>austinct@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1382,7 +1382,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.Setup.FirstTimeMicrosoft365Availability"
-    enum="Microsoft365Availability" expires_after="2025-07-06">
+    enum="Microsoft365Availability" expires_after="2026-02-18">
   <owner>austinct@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1392,7 +1392,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.ODFSAvailability"
-    enum="BooleanAvailable" expires_after="2025-07-06">
+    enum="BooleanAvailable" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1402,7 +1402,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.OfficeWebAppInstallation"
-    enum="WebAppInstallResultCode" expires_after="2025-07-06">
+    enum="WebAppInstallResultCode" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1413,7 +1413,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.OfficeWebAppOfflineInstallation"
-    enum="WebAppInstallResultCode" expires_after="2025-07-13">
+    enum="WebAppInstallResultCode" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1424,7 +1424,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.TaskResult.{CloudProvider}"
-    enum="OfficeTaskResult" expires_after="2025-07-06">
+    enum="OfficeTaskResult" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1443,7 +1443,7 @@
 
 <histogram
     name="FileBrowser.OfficeFiles.TaskResult.{CloudProvider}.MetricState"
-    enum="MetricState" expires_after="2025-07-06">
+    enum="MetricState" expires_after="2026-02-18">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1453,7 +1453,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.UseOutsideDrive"
-    enum="OfficeFilesUseOutsideDriveHook" expires_after="2025-05-01">
+    enum="OfficeFilesUseOutsideDriveHook" expires_after="2026-02-18">
   <owner>cassycc@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index be13cb2..5d57ada 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1079,6 +1079,17 @@
   </summary>
 </histogram>
 
+<histogram name="GPU.IOSurface.CreationTimeUs" units="microseconds"
+    expires_after="2025-06-30">
+  <owner>sunnyps@chromium.org</owner>
+  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
+  <summary>
+    The time that it took to create an IOSurface. Recorded for every IOSurface
+    that's created. This metric is only collected on Mac, which only has
+    high-resolution clocks.
+  </summary>
+</histogram>
+
 <histogram name="Gpu.Mac.BackpressureUs" units="microseconds"
     expires_after="2025-07-27">
   <owner>magchen@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 3fd7e842..88c0b05 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -7543,7 +7543,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType"
-    expires_after="2025-03-30">
+    expires_after="2025-08-18">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -7554,7 +7554,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Sink.SelectedType.{Ui}" enum="MediaSinkType"
-    expires_after="2025-04-09">
+    expires_after="2025-08-18">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/enums.xml b/tools/metrics/histograms/metadata/memory/enums.xml
index 36e699b..4c82e99 100644
--- a/tools/metrics/histograms/metadata/memory/enums.xml
+++ b/tools/metrics/histograms/metadata/memory/enums.xml
@@ -34,6 +34,11 @@
   <int value="4" label="EvictAll"/>
 </enum>
 
+<enum name="BooleanAreAllPagesFrozen">
+  <int value="0" label="Not all pages are frozen"/>
+  <int value="1" label="All pages are frozen"/>
+</enum>
+
 <enum name="BooleanGreaterOrEqualThan200MB">
   <int value="0" label="lt; 200MB"/>
   <int value="1" label="gt;= 200MB"/>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index f7f2adb..2963ff1 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -2171,8 +2171,8 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.SelfCompact2.Renderer.AreAllPagesFrozen" units="bool"
-    expires_after="2025-10-06">
+<histogram name="Memory.SelfCompact2.Renderer.AreAllPagesFrozen"
+    enum="BooleanAreAllPagesFrozen" expires_after="2025-10-06">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@google.com</owner>
   <summary>
@@ -2181,7 +2181,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.SelfCompact2.Renderer.TimeSinceLastCancel" units="s"
+<histogram name="Memory.SelfCompact2.Renderer.TimeSinceLastCancel" units="ms"
     expires_after="2025-10-06">
   <owner>thiabaud@google.com</owner>
   <owner>lizeb@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/enums.xml b/tools/metrics/histograms/metadata/navigation/enums.xml
index 19ba097d..c8aae0c 100644
--- a/tools/metrics/histograms/metadata/navigation/enums.xml
+++ b/tools/metrics/histograms/metadata/navigation/enums.xml
@@ -223,6 +223,9 @@
   <int value="66" label="WebView injected message listener"/>
   <int value="67" label="WebView safe browsing allowlist changed"/>
   <int value="68" label="WebView added document start javascript"/>
+  <int value="69"
+      label="CacheControlNoStore is present and Device Bound Session
+             terminated"/>
 </enum>
 
 <!-- LINT.ThenChange(//content/public/browser/back_forward_cache.h:NotRestoredReason) -->
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index aa15d4e..c257fe2b 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -2680,6 +2680,16 @@
   </summary>
 </histogram>
 
+<histogram name="Net.HttpStreamPool.StreamAttemptSSLConfigWaitTime" units="ms"
+    expires_after="2025-07-13">
+  <owner>bashi@chromium.org</owner>
+  <owner>blink-network-stack@google.com</owner>
+  <summary>
+    Record the time that a StreamAttempt is waiting for SSLConfig. Recorded for
+    each StreamAttempt if it waited for SSLConfig.
+  </summary>
+</histogram>
+
 <histogram name="Net.HttpStreamPool.StreamAttemptTime.{Result}" units="ms"
     expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 681bac90..7b8c25e 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -5125,6 +5125,18 @@
   </summary>
 </histogram>
 
+<histogram
+    name="NetworkService.IpProtection.ProxyAllowList.FlatbufferBuildTime"
+    units="ms" expires_after="2025-06-08">
+  <owner>djmitche@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Records the time it takes to build the MaskedDomainList flatbuffer data
+    structure. This is recorded once for each successful call to
+    `BuildFromProto`.
+  </summary>
+</histogram>
+
 <histogram name="NetworkService.IpProtection.ProxyAllowList.UpdateProcessTime"
     units="ms" expires_after="2025-08-10">
   <owner>aakallam@chromium.org</owner>
@@ -5134,7 +5146,8 @@
   <summary>
     Records the time it takes to update the MaskedDomainListManager with the
     contents of the Masked Domain List after the Network Service receives an
-    update from Component Updater.
+    update from Component Updater. This is only measured for the
+    UrlMatcherWithBypass implementation.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 5d971006..bd931b8 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -2655,13 +2655,14 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.Network.Result.{ReportType}"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-11-17">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-08-18">
   <owner>zackhan@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
     Response or error codes from SafeBrowsing real time URL lookups when the
     report type is {ReportType}. Logged on each resource check for which a
-    lookup request is sent to the server.
+    lookup request is sent to the server. Warning: this histogram was expired
+    from 2024-11-17 to 2025-02-19; data may be missing.
   </summary>
   <token key="ReportType">
     <variant name="NormalPing" summary="normal ping"/>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index 7cc962f..7b2adb4 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -920,6 +920,10 @@
   <token key="HistorySyncState">
     <variant name="WithHistorySync"
         summary="enabled (with or without persistent auth error)"/>
+    <variant name="WithHistorySyncAndAuthError"
+        summary="enabled but with persistent auth error"/>
+    <variant name="WithHistorySyncWithoutAuthError"
+        summary="enabled and without persistent auth error"/>
     <variant name="WithoutHistorySync" summary="NOT enabled"/>
   </token>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index 45ea473..20f16a0 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -27,6 +27,7 @@
   <variant name="BiddingAndAuctionServerKeyProtos"
       summary="BiddingAndAuctionServerKeyProtos"/>
   <variant name="KAnonKeyProtos" summary="KAnonKeyProtos"/>
+  <variant name="ListOfOrigins" summary="ListOfOrigins"/>
 </variants>
 
 <histogram name="API.EffectiveStorageAccess.AllowedByStorageAccessType"
diff --git a/tools/metrics/histograms/metadata/translate/histograms.xml b/tools/metrics/histograms/metadata/translate/histograms.xml
index c865ad7..a7c4b4a 100644
--- a/tools/metrics/histograms/metadata/translate/histograms.xml
+++ b/tools/metrics/histograms/metadata/translate/histograms.xml
@@ -28,6 +28,7 @@
 </variants>
 
 <variants name="OnDeviceTranslationAction">
+  <variant name="Availability"/>
   <variant name="CanTranslate"/>
   <variant name="Create"/>
   <variant name="Translate"/>
diff --git a/tools/metrics/histograms/metadata/ui/enums.xml b/tools/metrics/histograms/metadata/ui/enums.xml
index 8d89fd7..12e392f 100644
--- a/tools/metrics/histograms/metadata/ui/enums.xml
+++ b/tools/metrics/histograms/metadata/ui/enums.xml
@@ -816,6 +816,7 @@
   <int value="762064551" label="chrome://graduation/"/>
   <int value="770641362" label="chrome://shortcut-customization/"/>
   <int value="784140714" label="chrome://predictors/"/>
+  <int value="807323521" label="chrome://glic-fre/"/>
   <int value="812624791" label="chrome://dom-distiller/"/>
   <int value="821023334" label="chrome://screenlock-icon/"/>
   <int value="858923205" label="chrome://cloud-upload/"/>
diff --git a/tools/perf/chrome_telemetry_build/BUILD.gn b/tools/perf/chrome_telemetry_build/BUILD.gn
index 7b28151..82017ed 100644
--- a/tools/perf/chrome_telemetry_build/BUILD.gn
+++ b/tools/perf/chrome_telemetry_build/BUILD.gn
@@ -111,9 +111,12 @@
 if (is_android) {
   _bitness_if_needed = ""
   _webview_bitness_if_needed = ""
-  if (android_64bit_target_cpu && !skip_secondary_abi_for_cq) {
+  if (defined(android_app_secondary_abi)) {
     _bitness_if_needed = "_64_32"
     _webview_bitness_if_needed = "_32_64"
+  } else if (android_64bit_target_cpu) {
+    _bitness_if_needed = "_64"
+    _webview_bitness_if_needed = "_64"
   }
   group("telemetry_chrome_test_android_chrome") {
     testonly = true
@@ -162,7 +165,7 @@
     ]
   }
 
-  if (android_64bit_target_cpu) {
+  if (defined(android_app_secondary_abi)) {
     group("telemetry_chrome_test_android_trichrome_chrome_64_32_bundle") {
       testonly = true
 
diff --git a/tools/perf/chrome_telemetry_build/android_browser_types.gni b/tools/perf/chrome_telemetry_build/android_browser_types.gni
index 6810b596b..48714ea8 100644
--- a/tools/perf/chrome_telemetry_build/android_browser_types.gni
+++ b/tools/perf/chrome_telemetry_build/android_browser_types.gni
@@ -16,7 +16,7 @@
   "_android_trichrome_chrome_bundle",
 ]
 
-if (android_64bit_target_cpu) {
+if (defined(android_app_secondary_abi)) {
   telemetry_android_browser_target_suffixes +=
       [ "_android_trichrome_chrome_64_32_bundle" ]
 }
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 9568fbe..7bd49baa 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/v49.0/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "132984fe6afed3c32025685458e2e9e1b4957e62",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/245820b2b912adf17b6a530f0ff5b09abe537bf4/trace_processor_shell.exe"
+            "hash": "fdc8d3dc0b675802443ba6ba1c1c4e8960591079",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/1e97ffd1534d3cff6b33ba2c01ba30eff2f249cb/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "a15d8362d80cfd7cd8d785cf6afc22586de688cd",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v49.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "8dd6733fdadc6d560fed40cd46d847cbf79dc47a",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/0e6fa583b3b593331786fa890c85f09e7a93e7d8/trace_processor_shell"
+            "hash": "405dc6d0d87eab8fd8f937947c9ef6cb56570436",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/1e97ffd1534d3cff6b33ba2c01ba30eff2f249cb/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/page_sets/speedometer3_pages.py b/tools/perf/page_sets/speedometer3_pages.py
index 7bd5199..1579694 100644
--- a/tools/perf/page_sets/speedometer3_pages.py
+++ b/tools/perf/page_sets/speedometer3_pages.py
@@ -120,7 +120,7 @@
           startButton.click();
         }
         """)
-    action_runner.WaitForJavaScriptCondition('testDone', timeout=900)
+    action_runner.WaitForJavaScriptCondition('testDone', timeout=1800)
     if self._take_memory_measurement:
       action_runner.MeasureMemory(deterministic_mode=True)
 
diff --git a/tools/pgo/BUILD.gn b/tools/pgo/BUILD.gn
index e4c60efa9..5581186 100644
--- a/tools/pgo/BUILD.gn
+++ b/tools/pgo/BUILD.gn
@@ -54,7 +54,7 @@
   suffix = "_android_trichrome_chrome_bundle"
 }
 
-if (android_64bit_target_cpu) {
+if (defined(android_app_secondary_abi)) {
   generate_profile_test(
       "generate_profile_android_trichrome_chrome_64_32_bundle") {
     browser_name = "android-trichrome-chrome-64-32-bundle"
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 304b62a..fd8ddc6b 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -507,4 +507,5 @@
  <item id="remoting_compute_engine_instance_access_token" added_in_milestone="135" content_hash_code="0117134b" os_list="linux,windows,chromeos,android" file_path="remoting/base/compute_engine_service_client.cc" />
  <item id="remoting_compute_engine_instance_access_token_scopes" added_in_milestone="135" content_hash_code="023331d4" os_list="linux,windows,chromeos,android" file_path="remoting/base/compute_engine_service_client.cc" />
  <item id="metrics_report_dwa" added_in_milestone="135" content_hash_code="04a744db" os_list="linux,windows,android,chromeos" file_path="components/metrics/net/net_metrics_log_uploader.cc" />
+ <item id="version_history" added_in_milestone="135" content_hash_code="03c4973a" os_list="linux,windows" file_path="chrome/browser/upgrade_detector/version_history_client.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 9ffca10c..decbff7 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -370,6 +370,7 @@
       <annotation id="remoting_compute_engine_instance_access_token"/>
       <annotation id="remoting_compute_engine_instance_access_token_scopes"/>
       <annotation id="metrics_report_dwa"/>
+      <annotation id="version_history"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/tools/typescript/tsconfig_base_lit_389737066.json b/tools/typescript/tsconfig_base_lit_389737066.json
new file mode 100644
index 0000000..e1225a0
--- /dev/null
+++ b/tools/typescript/tsconfig_base_lit_389737066.json
@@ -0,0 +1,8 @@
+{
+  "extends": "./tsconfig_base_lit.json",
+  "compilerOptions": {
+    "target": "ES2024",
+    "lib": ["ES2024", "DOM", "DOM.Iterable"],
+    "useDefineForClassFields": true
+  }
+}
diff --git a/tools/typescript/tsconfig_base_polymer_389737066.json b/tools/typescript/tsconfig_base_polymer_389737066.json
new file mode 100644
index 0000000..e81afac3
--- /dev/null
+++ b/tools/typescript/tsconfig_base_polymer_389737066.json
@@ -0,0 +1,6 @@
+{
+  "extends": "./tsconfig_base_polymer.json",
+  "compilerOptions": {
+    "useDefineForClassFields": true
+  }
+}
diff --git a/tools/typescript/validate_tsconfig.py b/tools/typescript/validate_tsconfig.py
index a31d2d8..d6b52b81 100644
--- a/tools/typescript/validate_tsconfig.py
+++ b/tools/typescript/validate_tsconfig.py
@@ -38,21 +38,23 @@
     'compilerOptions',
 ]
 
-# Allowed compilerOptions
-_allowed_compiler_options = [
-    'allowUmdGlobalAccess',
-    'isolatedModules',
-    'lib',
-    'noPropertyAccessFromIndexSignature',
-    'noUncheckedIndexedAccess',
-    'noUncheckedSideEffectImports',
-    'noUnusedLocals',
-    'skipLibCheck',
-    'strictPropertyInitialization',
-    'typeRoots',
-    'types',
-    'useDefineForClassFields',
-]
+# Allowed compilerOptions. A 'None' value indicates that all values are allowed,
+# otherwise only the set of specified values is allowed.
+_allowed_compiler_options = {
+    'allowUmdGlobalAccess': None,
+    'isolatedModules': None,
+    'lib': None,
+    'noPropertyAccessFromIndexSignature': None,
+    'noUncheckedIndexedAccess': None,
+    'noUncheckedSideEffectImports': None,
+    'noUnusedLocals': None,
+    'skipLibCheck': None,
+    'strictPropertyInitialization': None,
+    'target': ['ESNext', 'ES2024'],
+    'typeRoots': None,
+    'types': None,
+    'useDefineForClassFields': None,
+}
 
 
 def validateTsconfigJson(tsconfig, tsconfig_file, is_base_tsconfig):
@@ -88,10 +90,16 @@
       return True, None
 
     if not is_base_tsconfig:
-      for input_param in tsconfig['compilerOptions'].keys():
-        if input_param not in _allowed_compiler_options:
-          return False, f'Disallowed |{input_param}| flag detected in '+ \
+      for param, param_value in tsconfig['compilerOptions'].items():
+        if param not in _allowed_compiler_options:
+          return False, f'Disallowed |{param}| flag detected in '+ \
               f'{tsconfig_file}.'
+        else:
+          allowed_values = _allowed_compiler_options[param]
+          if (allowed_values is not None and param_value not in allowed_values):
+            return False, f'Disallowed value |{param_value}| for |{param}| ' + \
+                f'flag detected in {tsconfig_file}. Must be one of ' + \
+                f'{allowed_values}.'
 
   return True, None
 
diff --git a/ui/accessibility/platform/browser_accessibility.h b/ui/accessibility/platform/browser_accessibility.h
index 20b16db..d99340f 100644
--- a/ui/accessibility/platform/browser_accessibility.h
+++ b/ui/accessibility/platform/browser_accessibility.h
@@ -246,7 +246,9 @@
     Iterator begin() { return {parent_, child_tree_root_}; }
     Iterator end() {
       unsigned int count =
-          child_tree_root_ ? 1U : parent_->node()->children().size();
+          child_tree_root_
+              ? 1U
+              : static_cast<unsigned int>(parent_->node()->children().size());
       return {parent_, child_tree_root_, count};
     }
 
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index b5a86a4a..f83cfab 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -2,14 +2,31 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/buildflag_header.gni")
 import("//build/config/android/rules.gni")
 import("//build/config/locales.gni")
+import("//build/rust/rust_static_library.gni")
 import("//testing/test.gni")
 import("//third_party/jni_zero/jni_zero.gni")
 import("//tools/grit/grit_rule.gni")
 
 assert(is_android)
 
+declare_args() {
+  # Include the new texture compressor in build (still subject to feature
+  # flags).
+  # If toolchain roll breaks due to usage of nightly features, it is OK to flip
+  # this off. Please ping OWNERS of texture_compressor on the CL.
+  enable_new_texture_compressor = true
+}
+
+buildflag_header("buildflags") {
+  header = "buildflags.h"
+  flags = [
+    "UI_ANDROID_ENABLE_NEW_TEXTURE_COMPRESSOR=$enable_new_texture_compressor",
+  ]
+}
+
 component("android") {
   output_name = "ui_android"
   sources = [
@@ -69,6 +86,7 @@
   defines = [ "UI_ANDROID_IMPLEMENTATION" ]
 
   deps = [
+    ":buildflags",
     ":java_enums_srcjar",
     ":ui_android_jni_headers",
     "//base",
@@ -93,6 +111,10 @@
     "//ui/touch_selection",
     "//url",
   ]
+
+  if (enable_new_texture_compressor) {
+    deps += [ ":texture_compressor" ]
+  }
 }
 
 java_cpp_features("java_features_srcjar") {
@@ -758,6 +780,9 @@
     "//ui/gfx/geometry",
     "//ui/resources:ui_test_pak",
   ]
+  if (enable_new_texture_compressor) {
+    deps += [ ":texture_compressor_unittests" ]
+  }
 }
 
 android_library("clipboard_java_test_support") {
@@ -832,3 +857,44 @@
     "javatests/src/org/chromium/ui/test/util/modaldialog/FakeModalDialogManager.java",
   ]
 }
+
+if (enable_new_texture_compressor) {
+  rust_static_library("texture_compressor") {
+    crate_root = "texture_compressor/lib.rs"
+    sources = [
+      "texture_compressor/cxx.rs",
+      "texture_compressor/dither.rs",
+      "texture_compressor/lib.rs",
+      "texture_compressor/quant.rs",
+      "texture_compressor/selectors.rs",
+    ]
+    allow_unsafe = true
+    cxx_bindings = [ "texture_compressor/cxx.rs" ]
+    deps = [ "//third_party/rust/bytemuck/v1:lib" ]
+
+    # Required for #[feature(portable_simd)]
+    configs -= [ "//build/config/compiler:disallow_unstable_features" ]
+    rustflags = [ "-Zallow-features=portable_simd" ]
+  }
+
+  rust_static_library("texture_compressor_unittests") {
+    testonly = true
+    is_gtest_unittests = true
+    crate_root = "texture_compressor/tests.rs"
+    sources = [
+      "texture_compressor/lib_tests.rs",
+      "texture_compressor/quant_tests.rs",
+      "texture_compressor/selectors_tests.rs",
+      "texture_compressor/tests.rs",
+    ]
+
+    deps = [
+      ":texture_compressor",
+      "//testing/rust_gtest_interop",
+    ]
+
+    # Required for #[feature(portable_simd)]
+    configs -= [ "//build/config/compiler:disallow_unstable_features" ]
+    rustflags = [ "-Zallow-features=portable_simd" ]
+  }
+}
diff --git a/ui/android/texture_compressor/OWNERS b/ui/android/texture_compressor/OWNERS
new file mode 100644
index 0000000..662e8b6
--- /dev/null
+++ b/ui/android/texture_compressor/OWNERS
@@ -0,0 +1,4 @@
+uekawa@chromium.org
+
+# Backup OWNERS
+ckitagawa@chromium.org  #{LAST_RESORT_SUGGESTION}
diff --git a/ui/android/texture_compressor/README.md b/ui/android/texture_compressor/README.md
new file mode 100644
index 0000000..11e40e40
--- /dev/null
+++ b/ui/android/texture_compressor/README.md
@@ -0,0 +1,54 @@
+# Texture Compressor
+
+This directory contains a compressor for GPU texture formats. It is primarily
+meant for compressing thumbnails to save memory. Currently, only the ETC1 format
+is supported, and this is only used on Android.
+
+## Goals
+
+  * Fast: Compressing a 4K screenshot takes less than 100ms (roughly 100
+    megapixels/s). Currently, it can achieve 220 megapixels/s on x64 desktop.
+  * Safe: Free of memory safety issues and suitable for running in the
+    privileged browser process.
+  * Portable: SIMD code shared across x86 (SSE) and ARM (NEON). Easy to modify
+    and validate for correctness.
+
+## Algorithm
+
+Vectorization is done by assigning each 4x4 SIMD lane to a different block. This
+minimizes cross-lane shuffle operations (which are typically architecture
+dependent) and makes the code significantly more portable.
+
+Compression of ETC1 is done by first searching through the flip / no-flip and
+individual / differential space to decide on the quantization of average, then
+searching through selector tables and values for each subblock.
+
+Detailed comments about the algorithm can be found in the source.
+
+## Similar projects
+
+  * [etcpak][etcpak] heavily inspired this project. Most of the algorithm
+    (except vectorization scheme) and math tricks are borrowed from etcpak.
+  * [ISPC Texture Compressor][ispctexcomp] influenced the vectorization scheme.
+    Unlike this project, the compressor is written in ISPC and requires a
+    dedicated compiler.
+  * [AOSP ETC1 library][aospetc1] also uses a similar search algorithm and is
+    easier to read, thanks to the scalar implementation.
+
+While reading the code, the [ETC1 specification][etc1spec] should also be
+useful.
+
+## (Currently) Missing Pieces
+
+This project is functional, but still a work-in-progress. The following pieces
+are missing:
+
+  * Testing coverage
+  * Dynamic dispatch (multiversioning) and AVX2 support
+  * Running on stable toolchain (using the `wide` crate instead of
+    `#[feature(portable_simd)]`)
+
+[etcpak]: https://github.com/wolfpld/etcpak
+[ispctexcomp]: https://github.com/GameTechDev/ISPCTextureCompressor
+[aospetc1]: https://cs.android.com/android/platform/superproject/main/+/main:frameworks/native/opengl/libs/ETC1/
+[etc1spec]: https://registry.khronos.org/DataFormat/specs/1.1/dataformat.1.1.html#ETC1
diff --git a/ui/android/texture_compressor/cxx.rs b/ui/android/texture_compressor/cxx.rs
new file mode 100644
index 0000000..4bdbb81
--- /dev/null
+++ b/ui/android/texture_compressor/cxx.rs
@@ -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.
+
+#[cxx::bridge]
+mod ffi {
+    extern "Rust" {
+        fn compress_etc1(
+            src: &[u32],
+            dst: &mut [u64],
+            width: u32,
+            height: u32,
+            src_row_width: u32,
+            dst_row_width: u32,
+        );
+    }
+}
+
+use crate::compress_etc1;
diff --git a/ui/android/texture_compressor/dither.rs b/ui/android/texture_compressor/dither.rs
new file mode 100644
index 0000000..9c0f807
--- /dev/null
+++ b/ui/android/texture_compressor/dither.rs
@@ -0,0 +1,52 @@
+// 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 std::simd::prelude::*;
+use std::simd::Simd;
+
+use crate::Reg;
+
+const fn create_bayer_matrix(num: i32, denom: i32) -> [[i16; 4]; 4] {
+    #[rustfmt::skip]
+    let base_pattern: [[i32; 4]; 4] = [
+        [ 0,  8,  2, 10],
+        [12,  4, 14,  6],
+        [ 3, 11,  1,  9],
+        [15,  7, 13,  5],
+    ];
+    let mut matrix = [[0i16; 4]; 4];
+    // Only while loops are possible, not for, in const fns
+    let mut y = 0;
+    let mut x = 0;
+    while y < 4 {
+        while x < 4 {
+            let value = (base_pattern[y][x] - 8) * num / denom / 16;
+            matrix[y][x] = value as i16;
+            x += 1;
+        }
+        y += 1;
+    }
+    matrix
+}
+
+// RGB565 dither table, strengthened by 1.33x (for better masking of banding).
+const BAYER_31: [[i16; 4]; 4] = create_bayer_matrix(255 * 4, 31 * 3);
+const BAYER_63: [[i16; 4]; 4] = create_bayer_matrix(255 * 4, 63 * 3);
+
+/// Bayer dithering. The purpose of the dithering is mostly to mask artifacts;
+/// the strength of dithering is not really related to the quantization scheme
+/// (444 or 555) nor the selector table values.
+#[inline]
+pub fn dither(data: &[[[Reg; 3]; 4]; 4]) -> [[[Reg; 3]; 4]; 4] {
+    let mut out = [[[Reg::default(); 3]; 4]; 4];
+    for y in 0..4 {
+        for x in 0..4 {
+            for (ch, matrix) in [(0, &BAYER_31), (1, &BAYER_63), (2, &BAYER_31)] {
+                out[y][x][ch] = (data[y][x][ch] + Simd::splat(matrix[y][x]))
+                    .simd_clamp(Simd::splat(0), Simd::splat(255));
+            }
+        }
+    }
+    out
+}
diff --git a/ui/android/texture_compressor/lib.rs b/ui/android/texture_compressor/lib.rs
new file mode 100644
index 0000000..87a922a
--- /dev/null
+++ b/ui/android/texture_compressor/lib.rs
@@ -0,0 +1,144 @@
+// 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.
+
+#![feature(portable_simd)]
+
+// Modules public for testing, don't expect stable API.
+mod cxx;
+pub mod dither;
+pub mod quant;
+pub mod selectors;
+
+use std::simd::prelude::*;
+use std::simd::Simd;
+
+use crate::dither::dither;
+use crate::quant::{quantize_averages, QuantResult};
+use crate::selectors::search_table_and_selectors;
+
+// We primarily compute with 16-bit integers and a width of 8 fills a 128-bit
+// wide lane (SSE, NEON). TODO(b/393494744): When we introduce multiversioning
+// and support for AVX2 etc. this should be converted to a template parameter
+// that varies based on the target architecture.
+const SIMD_WIDTH: usize = 8;
+const HALF_WIDTH: usize = SIMD_WIDTH / 2;
+const QUARTER_WIDTH: usize = SIMD_WIDTH / 4;
+type Reg = Simd<i16, SIMD_WIDTH>;
+type Reg32 = Simd<i32, SIMD_WIDTH>;
+type UReg = Simd<u16, SIMD_WIDTH>;
+
+/// Define a helper to interleave elements from two vectors, reinterpret
+/// it as a type twice as large, and return the resulting vector.
+/// Each argument / return value is an array of vectors; conceptually, this
+/// represents a vector that is <width> * <len> large; however, since std::simd
+/// types have upper limits on their width we represent them using arrays to be
+/// portable.
+macro_rules! define_interleave {
+    ($fn_name:ident, $src_ty:ty, $dst_ty:ty, $src_width:expr, $dst_width:expr, $src_len:literal) => {
+        fn $fn_name(
+            a: [Simd<$src_ty, $src_width>; $src_len],
+            b: [Simd<$src_ty, $src_width>; $src_len],
+        ) -> [Simd<$dst_ty, $dst_width>; $src_len * 2] {
+            let mut iter = (0..$src_len).flat_map(|i| {
+                let (a, b) = a[i].interleave(b[i]);
+                [a, b].map(|x| bytemuck::cast(x))
+            });
+            let res = std::array::from_fn(|_| iter.next().unwrap());
+            assert!(iter.next().is_none());
+            res
+        }
+    };
+}
+
+/// Convert individual codewords laid out as [15..0, 31..16, 47..32, 63..48]
+/// into interleaved u64 arrays, while flipping the endianness (our internal
+/// representation is little endian while ETC1 requires big endian).
+#[inline]
+pub fn interleave_etc1(regs: [UReg; 4]) -> [Simd<u64, QUARTER_WIDTH>; 4] {
+    // The interleaving assumes little endian.
+    #[cfg(target_endian = "big")]
+    compile_error!("Big endian is not supported");
+
+    define_interleave!(conv_16_to_32, u16, u32, SIMD_WIDTH, HALF_WIDTH, 1);
+    define_interleave!(conv_32_to_64, u32, u64, HALF_WIDTH, QUARTER_WIDTH, 2);
+    // Step 1: make each u16 codeword big-endian
+    let regs = regs.map(|r| r.swap_bytes());
+    // Step 2: [aaaa, bbbb] to [baba, baba]
+    let regs = [conv_16_to_32([regs[1]], [regs[0]]), conv_16_to_32([regs[3]], [regs[2]])];
+    // Step 3: [baba, baba], [dcdc, dcdc] to [dcba, dcba], [dcba, dcba]
+    let regs = conv_32_to_64(regs[1], regs[0]);
+    regs
+}
+
+/// Compress RGB pixels to ETC1.
+///
+/// `src` should be in RGBA.
+/// `dst` will be filled with compressed ETC1 blocks.
+/// `width` and `height` does not need to be multiple of 4. The boundary pixels
+/// will be padded with unspecified values.
+/// `src_row_width` and `dst_row_width` specifies the stride, in units of pixels
+/// and blocks, respectively.
+pub fn compress_etc1(
+    src: &[u32],
+    dst: &mut [u64],
+    width: u32,
+    height: u32,
+    src_row_width: u32,
+    dst_row_width: u32,
+) {
+    let dst_height = height.div_ceil(4);
+    let dst_width = width.div_ceil(4);
+    let mut data = [[[Reg::default(); 3]; 4]; 4];
+    // Note on vectorization scheme:
+    //
+    // We process one 4x4 block per SIMD lane, instead of the more common practice
+    // of processing pixels within the same block in parallel using multiple
+    // lanes. The one-block-per-lane scheme, more akin to SPMD programming,
+    // allows most of our code to be shuffle-free, and works much better with
+    // portable SIMD than schemes that heavily shuffles.
+    for dst_y in 0..dst_height {
+        for dst_x0 in (0..dst_width).step_by(SIMD_WIDTH) {
+            // For now, input load and output store are not vectorized. The main reason is
+            // that efficient loading requires shuffling and is poorly supported
+            // by std::simd and the wide crate (which we plan to use for
+            // supporting stable toolchain). Input load currently accounts for
+            // ~20% of the runtime. If shuffle support improves this would be a
+            // good candidate for optimization.
+            for i in 0..4 {
+                for j in 0..4 {
+                    let mut buf = [0u32; SIMD_WIDTH];
+                    for dst_x1 in 0..SIMD_WIDTH as u32 {
+                        let x = (dst_x0 + dst_x1) * 4 + j as u32;
+                        let y = dst_y * 4 + i as u32;
+                        if x < width && y < height {
+                            buf[dst_x1 as usize] = src[(y * src_row_width + x) as usize];
+                        }
+                    }
+                    let rgbx = Simd::from_array(buf);
+                    let extract_channel = |x: Simd<u32, SIMD_WIDTH>, shift: u32| {
+                        (x >> shift).cast::<i16>() & Simd::splat(0xFF)
+                    };
+                    data[i][j][0] = extract_channel(rgbx, 0);
+                    data[i][j][1] = extract_channel(rgbx, 8);
+                    data[i][j][2] = extract_channel(rgbx, 16);
+                }
+            }
+
+            let data = dither(&data);
+            let QuantResult { lo: hdr0, hi: hdr1, scaled0: ep0, scaled1: ep1 } =
+                quantize_averages(&data);
+            let best_fit = search_table_and_selectors(hdr0, hdr1, &data, [ep0, ep1]);
+            let regs = interleave_etc1(best_fit);
+
+            let slice = &mut dst[(dst_y * dst_row_width + dst_x0) as usize..];
+            for i in 0..4 {
+                for (j, word) in regs[i].as_array().iter().enumerate() {
+                    if let Some(out) = slice.get_mut(i * QUARTER_WIDTH + j) {
+                        *out = *word;
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/ui/android/texture_compressor/lib_tests.rs b/ui/android/texture_compressor/lib_tests.rs
new file mode 100644
index 0000000..f537a81
--- /dev/null
+++ b/ui/android/texture_compressor/lib_tests.rs
@@ -0,0 +1,21 @@
+// 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 rust_gtest_interop::prelude::*;
+use std::simd::prelude::*;
+
+chromium::import! {
+    "//ui/android:texture_compressor";
+}
+
+use texture_compressor::interleave_etc1;
+
+#[gtest(TextureCompressorTest, InterleaveEtc1)]
+fn test_interleave_etc1() {
+    let input =
+        [Simd::splat(0x1234), Simd::splat(0x5678), Simd::splat(0x9ABC), Simd::splat(0xDEF0)];
+    let expected = [Simd::splat(0x3412_7856_BC9A_F0DE); 4];
+    let result = interleave_etc1(input);
+    expect_eq!(result, expected);
+}
diff --git a/ui/android/texture_compressor/quant.rs b/ui/android/texture_compressor/quant.rs
new file mode 100644
index 0000000..f7b33833
--- /dev/null
+++ b/ui/android/texture_compressor/quant.rs
@@ -0,0 +1,236 @@
+// 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 std::simd::prelude::*;
+use std::simd::Simd;
+
+use crate::{Reg, Reg32, UReg};
+
+/// Subblock sums and averages, used in eval_quant_err.
+#[derive(Default, Copy, Clone)]
+pub struct SubblockStats {
+    pub sum: [Reg; 3],
+    pub avg: [Reg; 3],
+}
+
+#[inline]
+pub fn fast_div_255_round(x: Reg) -> Reg {
+    let r = x + Simd::splat(128);
+    (r + ((r + Simd::splat(257)) >> 8)) >> 8
+}
+
+/// Compute subblock (2x4 or 4x2) sums and averages.
+///
+/// Returns: subblock averages in order of top, bottom, left, right.
+#[inline]
+pub fn prepare_averages(data: &[[[Reg; 3]; 4]; 4]) -> [SubblockStats; 4] {
+    let mut sum_2x2 = [[Reg::default(); 3]; 4];
+    for y in 0..2 {
+        for x in 0..2 {
+            for ch in 0..3 {
+                sum_2x2[y * 2 + x][ch] = data[y * 2][x * 2][ch]
+                    + data[y * 2 + 1][x * 2][ch]
+                    + data[y * 2][x * 2 + 1][ch]
+                    + data[y * 2 + 1][x * 2 + 1][ch];
+            }
+        }
+    }
+    let mut out = [SubblockStats::default(); 4];
+    for (i, (s0, s1)) in [(0, 1), (2, 3), (0, 2), (1, 3)].into_iter().enumerate() {
+        for ch in 0..3 {
+            out[i].sum[ch] = sum_2x2[s0][ch] + sum_2x2[s1][ch];
+            out[i].avg[ch] = (out[i].sum[ch] + Simd::splat(4)) >> 3;
+        }
+    }
+    out
+}
+
+struct QuantResultWithErr {
+    /// Bit 47..32 of ETC1 codeword
+    lo: UReg,
+    /// Bit 63..48 of ETC1 codeword
+    hi: UReg,
+    /// Value of endpoint 0, scaled to `0..=255``
+    scaled0: [Reg; 3],
+    /// Value of endpoint 1, scaled to `0..=255``
+    scaled1: [Reg; 3],
+    /// Error metric, see [`eval_quant_err`]
+    err: Reg32,
+}
+
+pub struct QuantResult {
+    /// Bit 47..32 of ETC1 codeword
+    pub lo: UReg,
+    /// Bit 63..48 of ETC1 codeword
+    pub hi: UReg,
+    /// Value of endpoint 0, scaled to `0..=255``
+    pub scaled0: [Reg; 3],
+    /// Value of endpoint 1, scaled to `0..=255``
+    pub scaled1: [Reg; 3],
+}
+
+#[inline]
+fn quant_444(
+    avg0: [Reg; 3],
+    avg1: [Reg; 3],
+    sum0: [Reg; 3],
+    sum1: [Reg; 3],
+    flip: bool,
+) -> QuantResultWithErr {
+    #[inline]
+    fn quant(avg: [Reg; 3]) -> [Reg; 3] {
+        avg.map(|x| fast_div_255_round(x * Simd::splat(15)))
+    }
+
+    #[inline]
+    fn scale(q: [Reg; 3]) -> [Reg; 3] {
+        q.map(|x| (x << 4) | x)
+    }
+
+    #[inline]
+    fn encode(q0: [Reg; 3], q1: [Reg; 3], flip: bool) -> (UReg, UReg) {
+        let flip = if flip { UReg::splat(1) } else { UReg::splat(0) };
+        let diff = UReg::splat(0);
+        let base1_b = q1[2].cast::<u16>() << 8;
+        let base0_b = q0[2].cast::<u16>() << 12;
+        let lo = flip | diff | base1_b | base0_b;
+
+        let base1_g = q1[1].cast::<u16>();
+        let base0_g = q0[1].cast::<u16>() << 4;
+        let base1_r = q1[0].cast::<u16>() << 8;
+        let base0_r = q0[0].cast::<u16>() << 12;
+        let hi = base1_g | base0_g | base1_r | base0_r;
+
+        (lo, hi)
+    }
+
+    let q0 = quant(avg0);
+    let q1 = quant(avg1);
+    let scaled0 = scale(q0);
+    let scaled1 = scale(q1);
+    let err = eval_quant_err(scaled0, scaled1, sum0, sum1);
+    let (lo, hi) = encode(q0, q1, flip);
+    QuantResultWithErr { lo, hi, scaled0, scaled1, err }
+}
+
+#[inline]
+fn quant_555(
+    avg0: [Reg; 3],
+    avg1: [Reg; 3],
+    sum0: [Reg; 3],
+    sum1: [Reg; 3],
+    flip: bool,
+) -> QuantResultWithErr {
+    #[inline]
+    fn quant(avg: [Reg; 3]) -> [Reg; 3] {
+        avg.map(|x| fast_div_255_round(x * Simd::splat(31)))
+    }
+    #[inline]
+    fn scale(q: [Reg; 3]) -> [Reg; 3] {
+        // Per ETC1 spec, the "five-bit codewords are extended to eight bits by
+        // replicating the top three highest-order bits to the three lowest
+        // order bits".
+        q.map(|x| (x << 3) | (x >> 2))
+    }
+    #[inline]
+    fn encode(q0: [Reg; 3], delta: [Reg; 3], flip: bool) -> (UReg, UReg) {
+        #[inline]
+        fn encode_delta(d: Reg) -> UReg {
+            d.cast::<u16>() & Simd::splat(0b111)
+        }
+
+        let flip = if flip { UReg::splat(1) } else { UReg::splat(0) };
+        let diff = UReg::splat(1 << 1);
+        let delta_b = encode_delta(delta[2]) << 8;
+        let base_b = q0[2].cast::<u16>() << 11;
+        let lo = flip | diff | delta_b | base_b;
+
+        let delta_g = encode_delta(delta[1]);
+        let base_g = q0[1].cast::<u16>() << 3;
+        let delta_r = encode_delta(delta[0]) << 8;
+        let base_r = q0[0].cast::<u16>() << 11;
+        let hi = delta_g | base_g | delta_r | base_r;
+
+        (lo, hi)
+    }
+
+    let q0 = quant(avg0);
+    let q1 = quant(avg1);
+    let delta = [0, 1, 2].map(|i| (q1[i] - q0[i]).simd_clamp(Simd::splat(-4), Simd::splat(3)));
+    let q1 = [0, 1, 2].map(|i| q0[i] + delta[i]);
+
+    let scaled0 = scale(q0);
+    let scaled1 = scale(q1);
+    let err = eval_quant_err(scaled0, scaled1, sum0, sum1);
+    let (lo, hi) = encode(q0, delta, flip);
+    QuantResultWithErr { lo, hi, scaled0, scaled1, err }
+}
+
+#[inline]
+fn eval_quant_err(q0: [Reg; 3], q1: [Reg; 3], sum0: [Reg; 3], sum1: [Reg; 3]) -> Reg32 {
+    // Target error metric:
+    //   sum((x - q) ** 2)  (for each pixel)
+    //   where x is the original pixel value, and
+    //         q is the quantized average of the block
+    // This can be rewritten as:
+    //   sum(x ** 2) - 2 * sum(x * q) + sum(q ** 2)
+    // For relative comparisons, sum(x ** 2) is constant and can be omitted.
+    // With this and more simplification:
+    //   q * sum(q - 2 * x)
+    // Assuming that we are computing the sum for 8 pixels within a subblock:
+    //   q * (8 * q - 2 * sum(x))
+    // Dividing by 2:
+    //   q * ((q << 2) - sum(x))
+    (0..3).fold(Reg32::splat(0), |mut acc, i| {
+        let q0 = q0[i].cast::<i32>();
+        let q1 = q1[i].cast::<i32>();
+        let sum0 = sum0[i].cast::<i32>();
+        let sum1 = sum1[i].cast::<i32>();
+        acc += q0 * ((q0 << 2) - sum0);
+        acc += q1 * ((q1 << 2) - sum1);
+        acc
+    })
+}
+
+#[inline]
+fn quantize_endpoint_pairs(
+    avg0: [Reg; 3],
+    avg1: [Reg; 3],
+    sum0: [Reg; 3],
+    sum1: [Reg; 3],
+    flip: bool,
+) -> QuantResultWithErr {
+    let q444 = quant_444(avg0, avg1, sum0, sum1, flip);
+    let q555 = quant_555(avg0, avg1, sum0, sum1, flip);
+
+    let prefer555_32 = q555.err.simd_lt(q444.err);
+    let prefer555 = prefer555_32.cast::<i16>();
+    QuantResultWithErr {
+        lo: prefer555.select(q555.lo, q444.lo),
+        hi: prefer555.select(q555.hi, q444.hi),
+        scaled0: [0, 1, 2].map(|i| prefer555.select(q555.scaled0[i], q444.scaled0[i])),
+        scaled1: [0, 1, 2].map(|i| prefer555.select(q555.scaled1[i], q444.scaled1[i])),
+        err: prefer555_32.select(q555.err, q444.err),
+    }
+}
+
+#[inline]
+/// Search through flip / no-flip and individual / differential modes, and
+/// return the result with the least MSE from original pixels.
+pub fn quantize_averages(data: &[[[Reg; 3]; 4]; 4]) -> QuantResult {
+    let stats = prepare_averages(&data);
+
+    let flip =
+        quantize_endpoint_pairs(stats[0].avg, stats[1].avg, stats[0].sum, stats[1].sum, true);
+    let no_flip =
+        quantize_endpoint_pairs(stats[2].avg, stats[3].avg, stats[2].sum, stats[3].sum, false);
+
+    let prefer_flip = flip.err.simd_lt(no_flip.err).cast::<i16>();
+    QuantResult {
+        lo: prefer_flip.select(flip.lo, no_flip.lo),
+        hi: prefer_flip.select(flip.hi, no_flip.hi),
+        scaled0: [0, 1, 2].map(|i| prefer_flip.select(flip.scaled0[i], no_flip.scaled0[i])),
+        scaled1: [0, 1, 2].map(|i| prefer_flip.select(flip.scaled1[i], no_flip.scaled1[i])),
+    }
+}
diff --git a/ui/android/texture_compressor/quant_tests.rs b/ui/android/texture_compressor/quant_tests.rs
new file mode 100644
index 0000000..cf5cdc2d
--- /dev/null
+++ b/ui/android/texture_compressor/quant_tests.rs
@@ -0,0 +1,73 @@
+// 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 rust_gtest_interop::prelude::*;
+use std::simd::prelude::*;
+
+chromium::import! {
+    "//ui/android:texture_compressor";
+}
+
+use texture_compressor::quant::{fast_div_255_round, prepare_averages, quantize_averages};
+
+#[gtest(TextureCompressorTest, FastDiv255)]
+fn test_fast_div_255() {
+    let multipliers = [15, 31];
+    for m in multipliers {
+        for i in 0..255 {
+            let expected = (m * i + 128) / 255;
+            expect_eq!(fast_div_255_round(Simd::splat(m * i)), Simd::splat(expected));
+        }
+    }
+}
+
+#[gtest(TextureCompressorTest, Averages)]
+fn test_average() {
+    let values = [[0, 255, 0, 255]; 4].map(|row| row.map(|x| [Simd::splat(x); 3]));
+    let result = prepare_averages(&values);
+    for i in 0..4 {
+        // NB: Each subblock is 8 pixels.
+        expect_eq!(result[i].sum, [Simd::splat(255 * 2 * 2); 3]);
+        expect_eq!(result[i].avg, [Simd::splat(128); 3]);
+    }
+}
+
+#[gtest(TextureCompressorTest, AveragesMax)]
+// Check that the maximum value doesn't overflow.
+fn test_average_max() {
+    let values = [[255; 4]; 4].map(|row| row.map(|x| [Simd::splat(x); 3]));
+    let result = prepare_averages(&values);
+    for i in 0..4 {
+        // NB: Each subblock is 8 pixels.
+        expect_eq!(result[i].sum, [Simd::splat(255 * 4 * 2); 3]);
+        expect_eq!(result[i].avg, [Simd::splat(255); 3]);
+    }
+}
+
+#[gtest(TextureCompressorTest, QuantDiff)]
+fn test_quant_diff() {
+    // Test input colors that are perfectly quantizable in diff mode.
+    // We don't strictly require diff mode to be selected however, because it is
+    // possible for a value to be perfectly quantizable in both modes.
+    for c_quantized in 0..31 {
+        let c_scaled = (c_quantized << 3) | (c_quantized >> 2);
+        let values = [[c_scaled; 4]; 4].map(|row| row.map(|x| [Simd::splat(x); 3]));
+        let result = quantize_averages(&values);
+        expect_eq!(result.scaled0, [Simd::splat(c_scaled); 3]);
+        expect_eq!(result.scaled1, [Simd::splat(c_scaled); 3]);
+    }
+}
+
+#[gtest(TextureCompressorTest, QuantIndiv)]
+fn test_quant_indiv() {
+    let c1 = [0, 0, 0].map(|x| Simd::splat(x));
+    let c2 = [255, 255, 255].map(|x| Simd::splat(x));
+    let values = [[c1, c1, c2, c2]; 4];
+    let result = quantize_averages(&values);
+    expect_eq!(result.scaled0, [Simd::splat(0); 3]);
+    expect_eq!(result.scaled1, [Simd::splat(255); 3]);
+
+    let flip = (result.lo & Simd::splat(0x1)).simd_eq(Simd::splat(0x1));
+    expect_false!(flip.any());
+}
diff --git a/ui/android/texture_compressor/selectors.rs b/ui/android/texture_compressor/selectors.rs
new file mode 100644
index 0000000..d1d0094
--- /dev/null
+++ b/ui/android/texture_compressor/selectors.rs
@@ -0,0 +1,198 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Note: This file refers to modifiers in ETC1 spec as "selectors". The jargon
+//       was inherited from etcpak.
+
+use std::simd::prelude::*;
+use std::simd::{Mask, Simd};
+
+use crate::{Reg, Reg32, UReg, SIMD_WIDTH};
+
+// Selector tables from ETC1 spec. The negative part is omitted due to symmetry.
+pub const TABLES: [[i16; 2]; 8] =
+    [[2, 8], [5, 17], [9, 29], [13, 42], [18, 60], [24, 80], [33, 106], [47, 183]];
+
+/// Conditionally exchange the bottom left 2x2 block with top right 2x2 block,
+/// if `flip` for that lane is true.
+///
+/// i.e. the goal is to flip from:
+/// ```text
+/// aeim
+/// bfjn
+/// cgko
+/// dhlp
+/// ```
+/// to:
+/// ```text
+/// aecg
+/// bfdh
+/// imko
+/// jnlp
+/// ```
+#[inline]
+pub fn flip_pixels(d: &[[[Reg; 3]; 4]; 4], flip: Mask<i16, SIMD_WIDTH>) -> [[[Reg; 3]; 4]; 4] {
+    let mut o = [[[Reg::default(); 3]; 4]; 4];
+    for y0 in [0, 2] {
+        for x0 in [0, 2] {
+            for y1 in 0..2 {
+                for x1 in 0..2 {
+                    for ch in 0..3 {
+                        if y0 == x0 {
+                            o[y0 + y1][x0 + x1][ch] = d[y0 + y1][x0 + x1][ch];
+                        } else {
+                            o[y0 + y1][x0 + x1][ch] =
+                                flip.select(d[x0 + y1][y0 + x1][ch], d[y0 + y1][x0 + x1][ch]);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    o
+}
+
+/// Flip the selector codeword if `flip` for that lane is true.
+///
+/// See [`flip_pixels`] for a description of the flip operation.
+#[inline]
+pub fn flip_selectors(x: UReg, flip: Mask<i16, SIMD_WIDTH>) -> UReg {
+    let keep = x & Simd::splat(0xCC33);
+    let bottom_left = x & Simd::splat(0x00CC);
+    let top_right = x & Simd::splat(0x3300);
+
+    let flipped = keep | (bottom_left << 6) | (top_right >> 6);
+    flip.select(flipped, x)
+}
+
+pub struct Fit {
+    pub err: Reg32,
+    pub table_idx: UReg,
+    pub selector_lo: UReg,
+    pub selector_hi: UReg,
+}
+
+/// Search for the optimal table and selectors for a subblock.
+///
+/// `data` should be in flipped layout, i.e. 4x2.
+///
+/// The error function used here is a bit quirky, see code comment for details.
+#[inline]
+pub fn search_table_and_selectors_subblock(data: &[[[Reg; 3]; 4]], base_color: [Reg; 3]) -> Fit {
+    assert_eq!(data.len(), 2);
+    // Use fold to compute minimum. Essentially a vector version of min_by_key.
+    TABLES
+        .iter()
+        .enumerate()
+        .fold(None, |best_fit, (table_idx, sel_table)| {
+            let mut outer_err = Reg32::splat(0);
+            let mut selector_lo = UReg::splat(0);
+            let mut selector_hi = UReg::splat(0);
+            for y in 0..2 {
+                for x in 0..4 {
+                    // Below, we search for the optimal selector among [-lg, -sm, sm, lg] (sm
+                    // and lg is from the selector table).
+                    //
+                    // We use the error metric:
+                    //   abs(gray(q + s - x))
+                    //   where q = quantized average, s = selector, x = pixel before compression
+                    //         gray(p) = 19*p.r + 38*p.g + 7*p.b  (cf. rec601)
+                    //
+                    // Note that this is abs(gray(..)) not gray(abs(..)), i.e. the absolute
+                    // is taken after computing to grayscale. This allows precomputing
+                    // gray(q-x), then exploiting the fact that the selector is same for all
+                    // three channels to calculate the final error with a single addition.
+                    //
+                    // We will first precompute gray(q - x).
+                    let mut base_err = Reg::splat(0);
+                    let rgb_weight = [19, 38, 7];
+                    for ch in 0..3 {
+                        base_err += (base_color[ch] - data[y][x][ch]) * Simd::splat(rgb_weight[ch]);
+                    }
+
+                    // Now, the sign of selector can be easily decided. To minimize the
+                    // absolute value, the selector should be the opposite sign of
+                    // gray(q - x).
+                    let prefer_neg = base_err.simd_gt(Simd::splat(0));
+
+                    // Finally, we compute the error metric for both sm and lg and decide the
+                    // winner.
+                    let base_err_abs = base_err.abs();
+                    // Subtract in the direction that the final error metric is smaller.
+                    // The selector is same for all three channels, so just multiply it by the
+                    // total weight.
+                    let weight_sum = 64;
+                    let err_sm = (base_err_abs - Reg::splat(sel_table[0] * weight_sum)).abs();
+                    let err_lg = (base_err_abs - Reg::splat(sel_table[1] * weight_sum)).abs();
+                    let prefer_lg = err_lg.simd_lt(err_sm);
+
+                    // The error can be fairly large (a crude upper bound is 255*64). To avoid
+                    // overflow after squaring, we use widening multiply and accumulate. This
+                    // is somewhat expensive.
+                    let best_err = prefer_lg.select(err_lg, err_sm).cast::<i32>();
+                    outer_err += best_err * best_err;
+
+                    let pixel_idx = (y + x * 4) as u16;
+                    selector_lo |= prefer_lg.select(UReg::splat(1 << pixel_idx), UReg::splat(0));
+                    selector_hi |= prefer_neg.select(UReg::splat(1 << pixel_idx), UReg::splat(0));
+                }
+            }
+
+            let table_idx = UReg::splat(table_idx as u16);
+            match best_fit {
+                None => Some(Fit { err: outer_err, table_idx, selector_lo, selector_hi }),
+                Some(best) => {
+                    let lt_32 = outer_err.simd_lt(best.err);
+                    let lt = lt_32.cast::<i16>();
+                    Some(Fit {
+                        err: lt_32.select(outer_err, best.err),
+                        table_idx: lt.select(table_idx, best.table_idx),
+                        selector_lo: lt.select(selector_lo, best.selector_lo),
+                        selector_hi: lt.select(selector_hi, best.selector_hi),
+                    })
+                }
+            }
+        })
+        .unwrap()
+}
+
+/// Search through possible selector tables and selector values for each
+/// subblock.
+///
+/// Returns: Four 16-bit codewords coding the optimal coefficients.
+#[inline]
+pub fn search_table_and_selectors(
+    mut hdr0: UReg,
+    hdr1: UReg,
+    data: &[[[Reg; 3]; 4]; 4],
+    base_color: [[Reg; 3]; 2],
+) -> [UReg; 4] {
+    // We need to work on pixels in the first subblock, then the second. To allow
+    // uniform indices, the flip functions takes care of moving the first
+    // subblock to the top half and the second to bottom half. We will fix up
+    // the shuffled results in the end.
+    let flip = (hdr0 & (UReg::splat(1))).simd_ne(UReg::splat(0));
+    let permuted_data = flip_pixels(&data, !flip);
+
+    let mut selector_lo = UReg::splat(0);
+    let mut selector_hi = UReg::splat(0);
+
+    for subblock in 0..2 {
+        let best_fit = search_table_and_selectors_subblock(
+            &permuted_data[subblock * 2..subblock * 2 + 2],
+            base_color[subblock],
+        );
+        let subblock_bit = match subblock {
+            0 => 5,
+            1 => 2,
+            _ => unreachable!(),
+        };
+        hdr0 |= best_fit.table_idx << subblock_bit;
+        selector_lo |= best_fit.selector_lo << (subblock as u16 * 2);
+        selector_hi |= best_fit.selector_hi << (subblock as u16 * 2);
+    }
+    selector_lo = flip_selectors(selector_lo, !flip);
+    selector_hi = flip_selectors(selector_hi, !flip);
+    [selector_lo, selector_hi, hdr0, hdr1]
+}
diff --git a/ui/android/texture_compressor/selectors_tests.rs b/ui/android/texture_compressor/selectors_tests.rs
new file mode 100644
index 0000000..aa81a54
--- /dev/null
+++ b/ui/android/texture_compressor/selectors_tests.rs
@@ -0,0 +1,90 @@
+// 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 rust_gtest_interop::prelude::*;
+use std::simd::prelude::*;
+
+chromium::import! {
+    "//ui/android:texture_compressor";
+}
+
+use texture_compressor::selectors::{
+    flip_pixels, flip_selectors, search_table_and_selectors_subblock, TABLES,
+};
+
+#[gtest(TextureCompressorTest, FlipPixels)]
+fn test_flip_pixels() {
+    #[rustfmt::skip]
+    let input = [
+        [ 0,  1,  2,  3],
+        [ 4,  5,  6,  7],
+        [ 8,  9, 10, 11],
+        [12, 13, 14, 15],
+    ];
+    let input = input.map(|row| row.map(|x| [Simd::splat(x); 3]));
+    #[rustfmt::skip]
+    let expected = [
+        [ 0,  1,  8,  9],
+        [ 4,  5, 12, 13],
+        [ 2,  3, 10, 11],
+        [ 6,  7, 14, 15],
+    ];
+    let expected = expected.map(|row| row.map(|x| [Simd::splat(x); 3]));
+    expect_eq!(flip_pixels(&input, Mask::splat(true)), expected);
+}
+
+#[gtest(TextureCompressorTest, FlipSelectors)]
+fn test_flip_selectors() {
+    #[rustfmt::skip]
+    let input = [
+         0,  1,  2,  3,
+         4,  5,  6,  7,
+         8,  9, 10, 11,
+        12, 13, 14, 15,
+    ];
+    let input = input.map(|x| Simd::splat(1u16 << x));
+    #[rustfmt::skip]
+    let expected = [
+         0,  1,  8,  9,
+         4,  5, 12, 13,
+         2,  3, 10, 11,
+         6,  7, 14, 15,
+    ];
+    let expected = expected.map(|x| Simd::splat(1u16 << x));
+    for (input, expected) in input.into_iter().zip(expected) {
+        expect_eq!(flip_selectors(input, Mask::splat(true)), expected);
+    }
+}
+
+#[gtest(TextureCompressorTest, SearchTableAndSelectors)]
+fn test_search_table_and_selectors() {
+    for (table_idx, table) in TABLES.iter().enumerate() {
+        let (sm, lg) = (table[0], table[1]);
+        let input = [[sm, lg, -sm, -lg], [-lg, -sm, lg, sm]]
+            .map(|row| row.map(|x| [Simd::splat(128 + x); 3]));
+        let base_color = [Simd::splat(128); 3];
+        let result = search_table_and_selectors_subblock(&input, base_color);
+        // The bits are arranged as col3_col2_col1_col0, with top 2 bits of each column
+        // being zeroed
+        expect_eq!(result.selector_hi, Simd::splat(0b0001_0001_0010_0010));
+        expect_eq!(result.selector_lo, Simd::splat(0b0001_0010_0001_0010));
+        expect_eq!(result.table_idx, Simd::splat(table_idx as u16));
+    }
+}
+
+#[gtest(TextureCompressorTest, SearchTableAndSelectorsMax)]
+fn test_search_table_and_selectors_max() {
+    // Test for overflow handling of the error function.
+    // The base color is set to an arbitrarily far value rather than being the
+    // average. In this case, table 7 has the smallest but non-zero error value.
+    // This test can catch overflows if it causes smaller tables to achieve a
+    // smaller error value than table 7.
+    let input = [[[Simd::splat(255); 3]; 4]; 2];
+    let base_color = [Simd::splat(0); 3];
+    let result = search_table_and_selectors_subblock(&input, base_color);
+    // See test_search_table_and_selectors for notes on bit arrangement.
+    expect_eq!(result.selector_hi, Simd::splat(0)); // All positive
+    expect_eq!(result.selector_lo, Simd::splat(0b0011_0011_0011_0011)); // All large
+    expect_eq!(result.table_idx, Simd::splat(7)); // Largest variance table
+}
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/Placeholder.java b/ui/android/texture_compressor/tests.rs
similarity index 63%
rename from chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/Placeholder.java
rename to ui/android/texture_compressor/tests.rs
index e1e5a97a..49bb570 100644
--- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/Placeholder.java
+++ b/ui/android/texture_compressor/tests.rs
@@ -2,6 +2,8 @@
 // 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.bookmarks;
+#![feature(portable_simd)]
 
-public class Placeholder {}
+mod lib_tests;
+mod quant_tests;
+mod selectors_tests;
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 2f2ec52..008df59 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -1053,7 +1053,7 @@
 Compositor::ScopedKeepSurfaceAliveCallback
 Compositor::TakeScopedKeepSurfaceAliveCallback(
     const viz::SurfaceId& surface_id) {
-  DCHECK(surface_id.is_valid());
+  CHECK(surface_id.is_valid()) << "Compositor Visible: " << IsVisible();
   CHECK(!pending_surface_copies_.contains(pending_surface_copy_id_));
   pending_surface_copies_[pending_surface_copy_id_] =
       host_->CreateScopedKeepSurfaceAlive(surface_id);
diff --git a/ui/gfx/geometry/transform.cc b/ui/gfx/geometry/transform.cc
index f278849d..4de4022 100644
--- a/ui/gfx/geometry/transform.cc
+++ b/ui/gfx/geometry/transform.cc
@@ -995,6 +995,17 @@
   }
 }
 
+void Transform::Floor2dTranslationComponents() {
+  if (!full_matrix_) [[likely]] {
+    axis_2d_ = AxisTransform2d::FromScaleAndTranslation(
+        axis_2d_.scale(), Vector2dF(std::floor(axis_2d_.translation().x()),
+                                    std::floor(axis_2d_.translation().y())));
+  } else {
+    matrix_.set_rc(0, 3, std::floor(matrix_.rc(0, 3)));
+    matrix_.set_rc(1, 3, std::floor(matrix_.rc(1, 3)));
+  }
+}
+
 void Transform::RoundToIdentityOrIntegerTranslation() {
   if (!full_matrix_) [[likely]] {
     axis_2d_ = AxisTransform2d::FromScaleAndTranslation(
diff --git a/ui/gfx/geometry/transform.h b/ui/gfx/geometry/transform.h
index 0c536f8..95fc5b45 100644
--- a/ui/gfx/geometry/transform.h
+++ b/ui/gfx/geometry/transform.h
@@ -544,6 +544,9 @@
   // Rounds 2d translation components rc(0, 3), rc(1, 3) to integers.
   void Round2dTranslationComponents();
 
+  // Makes rc(0, 3) and rc(1, 3) components integers by flooring.
+  void Floor2dTranslationComponents();
+
   // Rounds translation components to integers, and all other components to
   // identity. Normally this function is meaningful only if
   // IsApproximatelyIdentityOrIntegerTranslation() is true.
diff --git a/ui/gfx/geometry/transform_unittest.cc b/ui/gfx/geometry/transform_unittest.cc
index a45f8793..f40b476 100644
--- a/ui/gfx/geometry/transform_unittest.cc
+++ b/ui/gfx/geometry/transform_unittest.cc
@@ -3610,6 +3610,43 @@
   EXPECT_EQ(expected.ToString(), translation.ToString());
 }
 
+TEST(XFormTest, Floor2dTranslationComponents) {
+  Transform translation;
+  Transform expected;
+
+  translation.Floor2dTranslationComponents();
+  EXPECT_EQ(expected.ToString(), translation.ToString());
+
+  translation.Translate(1.0f, 1.0f);
+  expected.Translate(1.0f, 1.0f);
+  translation.Floor2dTranslationComponents();
+  EXPECT_EQ(expected.ToString(), translation.ToString());
+
+  translation.Translate(0.5f, 0.4f);
+  expected.Translate(0.0f, 0.0f);
+  translation.Floor2dTranslationComponents();
+  EXPECT_EQ(expected.ToString(), translation.ToString());
+
+  // Flooring should only affect 2d translation components.
+  translation.Translate3d(0.f, 0.f, 0.5f);
+  expected.Translate3d(0.f, 0.f, 0.5f);
+  translation.Floor2dTranslationComponents();
+  EXPECT_EQ(expected.ToString(), translation.ToString());
+
+  translation.Translate(3.9f, 4.4f);
+  expected.Translate(3.0f, 4.0f);
+  translation.Floor2dTranslationComponents();
+  EXPECT_EQ(expected.ToString(), translation.ToString());
+
+  translation.Translate(3.9f, 4.4f);
+  translation.EnsureFullMatrixForTesting();
+  expected.Translate(3.0f, 4.0f);
+  translation.EnsureFullMatrixForTesting();
+
+  translation.Floor2dTranslationComponents();
+  EXPECT_EQ(expected.ToString(), translation.ToString());
+}
+
 TEST(XFormTest, BackFaceVisiblilityTolerance) {
   Transform backface_invisible;
   backface_invisible.set_rc(0, 3, 1.f);
diff --git a/ui/gfx/mac/io_surface.cc b/ui/gfx/mac/io_surface.cc
index 400ba66..dfe1a6f0 100644
--- a/ui/gfx/mac/io_surface.cc
+++ b/ui/gfx/mac/io_surface.cc
@@ -242,6 +242,8 @@
     bool should_clear,
     bool override_rgba_to_bgra) {
   TRACE_EVENT0("ui", "CreateIOSurface");
+  base::TimeTicks start_time = base::TimeTicks::Now();
+
   base::apple::ScopedCFTypeRef<CFMutableDictionaryRef> properties(
       CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
                                 &kCFTypeDictionaryKeyCallBacks,
@@ -333,6 +335,10 @@
   IOSurfaceSetValue(surface.get(), CFSTR("IOSurfaceColorSpace"),
                     kCGColorSpaceSRGB);
 
+  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+      "GPU.IOSurface.CreationTimeUs", base::TimeTicks::Now() - start_time,
+      base::Microseconds(1), base::Milliseconds(50), /*bucket_count=*/100);
+
   return surface;
 }
 
diff --git a/ui/gl/gl_utils.cc b/ui/gl/gl_utils.cc
index 2eaeb197..b8ebfcf 100644
--- a/ui/gl/gl_utils.cc
+++ b/ui/gl/gl_utils.cc
@@ -168,8 +168,8 @@
   }
 }
 
-// Same as LabelSwapChainAndBuffers, but only does the buffers. Used for resize
-// operations
+// Labels swapchain with the name_prefix and its buffers with the string
+// name_prefix + _Buffer_ + <buffer_number>.
 void LabelSwapChainAndBuffers(IDXGISwapChain* swap_chain,
                               const char* name_prefix) {
   SetDebugName(swap_chain, name_prefix);
diff --git a/ui/gl/gl_utils.h b/ui/gl/gl_utils.h
index 2df6abe..d1bc244 100644
--- a/ui/gl/gl_utils.h
+++ b/ui/gl/gl_utils.h
@@ -65,7 +65,7 @@
 // BufferCount for the root surface swap chain.
 GL_EXPORT unsigned int DirectCompositionRootSurfaceBufferCount();
 
-// Labels swapchain with the name_prefix and ts buffers buffers with the string
+// Labels swapchain with the name_prefix and its buffers with the string
 // name_prefix + _Buffer_ + <buffer_number>.
 GL_EXPORT void LabelSwapChainAndBuffers(IDXGISwapChain* swap_chain,
                                         const char* name_prefix);
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
index ca3a7ba5..ef9364d 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -35,6 +35,10 @@
 
 constexpr uint32_t kMaxNumberOfFrames = 20u;
 constexpr uint32_t kMaxFramesInFlight = 3u;
+// Using a smaller value may cause too many unwanted timeouts, so use a
+// value that optimally identifies a freeze due to window occlusion so
+// that it warrants ignoring frame callbacks during tab capture.
+constexpr int kFrameCallbackTimeoutMs = 50;
 
 constexpr base::TimeDelta kPresentationFlushTimerDuration =
     base::Milliseconds(160);
@@ -44,8 +48,6 @@
 constexpr char kBoundsRectNanOrInf[] =
     "Overlay bounds_rect is invalid (NaN or infinity).";
 
-bool potential_compositor_buffer_lock = false;
-
 bool ValidateRect(const gfx::RectF& rect) {
   return !std::isnan(rect.x()) && !std::isnan(rect.y()) &&
          !std::isnan(rect.width()) && !std::isnan(rect.height()) &&
@@ -153,9 +155,11 @@
   if (!frame)
     return;
 
-  // Frame callback hasn't been acked, need to wait.
+  // Frame callback hasn't been acked, need to wait, unless we are explicitly
+  // skipping frame callbacks due to a frame callback freeze during tab capture.
   if (!submitted_frames_.empty() &&
-      submitted_frames_.back()->wl_frame_callback) {
+      (!should_skip_frame_callbacks_ &&
+       submitted_frames_.back()->wl_frame_callback)) {
     TRACE_EVENT_INSTANT("wayland", "WaitForFrameCallback", "cb_owner_frame_id",
                         submitted_frames_.back()->frame_id);
     return;
@@ -224,10 +228,12 @@
   }
 
   // wl_frame_callback drives the continuous playback of frames, if the frame we
-  // just played-back did not set up a wl_frame_callback, we should playback
-  // another frame.
+  // just played-back did not set up a wl_frame_callback or we are not relying
+  // on frame callbacks to drive frame playback during tab capture, we should
+  // playback another frame.
   if (!submitted_frames_.empty() &&
-      !submitted_frames_.back()->wl_frame_callback) {
+      (should_skip_frame_callbacks_ ||
+       !submitted_frames_.back()->wl_frame_callback)) {
     MaybeProcessPendingFrame();
   }
 }
@@ -285,6 +291,7 @@
       // freeze.
       if (!submitted_frames_.empty()) {
         submitted_frames_.back()->wl_frame_callback.reset();
+        frame_callback_timer_.Stop();
         submitted_frames_.back()->feedback =
             gfx::PresentationFeedback::Failure();
         submitted_frames_.back()->submitted_buffers.clear();
@@ -360,15 +367,6 @@
 
   // Empty frames do not expect feedbacks so don't push to |submitted_frames_|.
   if (!empty_frame) {
-    if (potential_compositor_buffer_lock &&
-        ++frames_in_flight_ >= kMaxFramesInFlight) {
-      if (freeze_timeout_timer_.IsRunning()) {
-        freeze_timeout_timer_.Reset();
-      } else {
-        freeze_timeout_timer_.Start(FROM_HERE, base::Milliseconds(500), this,
-                                    &WaylandFrameManager::FreezeTimeout);
-      }
-    }
     submitted_frames_.push_back(std::move(frame));
   }
 
@@ -479,12 +477,19 @@
     // new wl_buffer, which leads to graphics freeze. So only setup
     // frame_callback when we're attaching a different buffer and frame
     // callbacks are not being skipped due to video capture in the background.
-    if (!frame->wl_frame_callback && !should_skip_frame_callbacks_) {
+    if (!frame->wl_frame_callback) {
       static constexpr wl_callback_listener kFrameCallbackListener = {
           .done = &OnFrameDone};
       TRACE_EVENT_INSTANT("wayland", "CreateFrameCallback", "cb_owner_frame_id",
                           frame->frame_id);
       frame->wl_frame_callback.reset(wl_surface_frame(surface->surface()));
+      if (frame_callback_timer_.IsRunning()) {
+        frame_callback_timer_.Reset();
+      } else {
+        frame_callback_timer_.Start(
+            FROM_HERE, base::Milliseconds(kFrameCallbackTimeoutMs), this,
+            &WaylandFrameManager::FrameCallbackTimeout);
+      }
       wl_callback_add_listener(frame->wl_frame_callback.get(),
                                &kFrameCallbackListener, this);
       needs_commit = true;
@@ -538,6 +543,7 @@
     // Applying pending state failed. So we need to reset this frame so that
     // it can be discarded by the caller.
     frame->wl_frame_callback.reset();
+    frame_callback_timer_.Stop();
     frame->pending_feedback.reset();
     frame->submitted_buffers.clear();
     return std::nullopt;
@@ -556,10 +562,23 @@
 }
 
 void WaylandFrameManager::HandleFrameCallback(wl_callback* callback) {
+  if (frame_callback_freeze_detected_ &&
+      submitted_frames_.back()->wl_frame_callback.get() != callback) {
+    // If there is a frame callback freeze, frames are still submitted without
+    // waiting for callbacks to drive playback. So the callbacks for previous
+    // frames should just be ignored.
+    return;
+  }
   DCHECK(submitted_frames_.back()->wl_frame_callback.get() == callback);
-  submitted_frames_.back()->wl_frame_callback.reset();
   TRACE_EVENT("wayland", "HandleFrameCallback", "cb_owner_frame_id",
               submitted_frames_.back()->frame_id);
+  submitted_frames_.back()->wl_frame_callback.reset();
+  DVLOG_IF(1, frame_callback_freeze_detected_)
+      << "surface=" << window_->root_surface()->get_surface_id()
+      << " recovered from frame callback freeze";
+  frame_callback_timer_.Stop();
+  frame_callback_freeze_detected_ = false;
+  EvaluateShouldSkipFrameCallbacks();
   MaybeProcessPendingFrame();
 }
 
@@ -893,12 +912,6 @@
          !connection_->presentation());
   frame->submission_acked = true;
 
-  if (potential_compositor_buffer_lock &&
-      frame != submitted_frames_.front().get()) {
-    --frames_in_flight_;
-    freeze_timeout_timer_.Stop();
-  }
-
   // If presentation feedback is not supported, use a fake feedback. This
   // literally means there are no presentation feedback callbacks created.
   if (!connection_->presentation()) {
@@ -945,6 +958,13 @@
   }
 }
 
+void WaylandFrameManager::FrameCallbackTimeout() {
+  DVLOG(1) << "surface=" << window_->root_surface()->get_surface_id()
+           << " frame callback timed out";
+  frame_callback_freeze_detected_ = true;
+  EvaluateShouldSkipFrameCallbacks();
+}
+
 void WaylandFrameManager::FreezeTimeout() {
   LOG(WARNING) << "Freeze detected, immediately release a frame";
   for (auto& frame : submitted_frames_) {
@@ -963,6 +983,7 @@
   if (!submitted_frames_.empty() &&
       submitted_frames_.back()->wl_frame_callback) {
     submitted_frames_.back()->wl_frame_callback.reset();
+    frame_callback_timer_.Stop();
     // Mutter sometimes does not call buffer.release if wl_surface role is
     // destroyed, causing graphics freeze. Manually release them and trigger
     // OnSubmission callbacks.
@@ -995,7 +1016,9 @@
 }
 
 void WaylandFrameManager::OnVideoCaptureUpdate() {
-  VLOG(1) << __func__ << " new capture count=" << video_capture_count_;
+  DVLOG(1) << __func__
+           << " surface=" << window_->root_surface()->get_surface_id()
+           << " new capture count=" << video_capture_count_;
   EvaluateShouldAckSwapWithoutCommit();
   if (!should_ack_swap_without_commit_) {
     // If we're not already ACK-ing swaps immediately, see if we should fallback
@@ -1004,13 +1027,10 @@
   }
 }
 
-void WaylandFrameManager::OnWindowActivationChanged() {
-  VLOG(1) << __func__ << " is_active=" << window_->IsActive();
-  EvaluateShouldSkipFrameCallbacks();
-}
-
 void WaylandFrameManager::OnWindowSuspensionChanged() {
-  VLOG(1) << __func__ << " is_suspended=" << window_->IsSuspended();
+  DVLOG(1) << __func__
+           << " surface=" << window_->root_surface()->get_surface_id()
+           << " is_suspended=" << window_->IsSuspended();
   EvaluateShouldAckSwapWithoutCommit();
 }
 
@@ -1019,15 +1039,20 @@
   should_ack_swap_without_commit_ =
       video_capture_count_ > 0 && window_->IsSuspended();
   if (!prev_should_ack_swap_without_commit && should_ack_swap_without_commit_) {
-    // Clear existing frame callback.
+    // Clear all submitted frames to be safe from blocked callbacks or buffers
+    // for any of them.
+    // For instance, even when kwin sends the suspended state it still blocks a
+    // buffer from a submitted frame which is not guaranteed to be the last one.
     if (!submitted_frames_.empty()) {
-      auto& last_frame = submitted_frames_.back();
-      if (last_frame->wl_frame_callback) {
-        last_frame->wl_frame_callback.reset();
-      }
-      last_frame->submitted_buffers.clear();
-      if (!last_frame->feedback.has_value() || last_frame->feedback->failed()) {
-        SetFakeFeedback(last_frame.get());
+      for (auto& frame : submitted_frames_) {
+        if (frame->wl_frame_callback) {
+          frame->wl_frame_callback.reset();
+          frame_callback_timer_.Stop();
+        }
+        frame->submitted_buffers.clear();
+        if (!frame->feedback.has_value() || frame->feedback->failed()) {
+          SetFakeFeedback(frame.get());
+        }
       }
     }
 
@@ -1042,44 +1067,32 @@
 
 void WaylandFrameManager::EvaluateShouldSkipFrameCallbacks() {
   bool prev_skip_frame_callbacks = should_skip_frame_callbacks_;
-  // When video capture is active compositor can stop sending frame callbacks
-  // [1]. Ideally we should check for suspended state here in addition to the
-  // video capture state. But mutter sends suspended state 3 seconds later when
-  // window is obscured [2] [3] and KDE does not send suspended state in this
-  // case [4]. So as a compromise fallback to not using frame callbacks
-  // when the window is not active and video capture is active.
-  //
-  // TODO(crbug.com/364197252): Switch to using suspended state instead when
-  // that is reliable.
+  // When video capture is active, the compositor can stop sending frame
+  // callbacks [1]. Ideally an occlusion state is needed here in addition to the
+  // video capture state. But wayland supports suspended state, which can be
+  // sent with a delay after occlusion comes into effect, e.g. mutter sends
+  // suspended state 3 seconds ater window is occluded [2] [3]. So as a
+  // compromise fallback to not wait for frame callbacks to drive playback when
+  // video capture is active if a frame callback is not received in a while.
   //
   // [1] https://wayland.app/protocols/wayland#wl_surface:request:frame
   // [2] https://gitlab.gnome.org/GNOME/mutter/-/issues/3663.
   // [3]
   // https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3019/diffs#0d2bb2c9a5b108a9e8d01556d3f3bf5d3e4ecca2_115_117
-  // [4] https://bugs.kde.org/show_bug.cgi?id=492924
   should_skip_frame_callbacks_ =
-      video_capture_count_ > 0 && !window_->IsActive();
+      video_capture_count_ > 0 && frame_callback_freeze_detected_;
 
-  // The following is needed to prevent a graphics freeze when the
-  // window is fully obscured at the same time as being inactive, e.g. by
-  // hitting Alt+tab to switch windows.
-  // This is because it could be that at this point the frame callback could
-  // be already blocked. So we need to unblock and discard those frames.
   if (!prev_skip_frame_callbacks && should_skip_frame_callbacks_) {
-    // Clear existing frame callback.
-    if (!submitted_frames_.empty() &&
-        submitted_frames_.back()->wl_frame_callback) {
-      submitted_frames_.back()->wl_frame_callback.reset();
-      submitted_frames_.back()->feedback = gfx::PresentationFeedback::Failure();
-    }
-
-    MaybeProcessSubmittedFrames();
-
+    DVLOG(1) << "surface=" << window_->root_surface()->get_surface_id()
+             << " will skip wait for frame callbacks";
     // Now we need to ensure pending frames are processed again.
-    // It should be safe to do so as after this point frame callbacks will not
-    // be used.
+    // It should be safe to do so as after this point frame callbacks will no
+    // longer be waited on.
     MaybeProcessPendingFrame();
   }
+  DVLOG_IF(1, prev_skip_frame_callbacks && !should_skip_frame_callbacks_)
+      << "surface=" << window_->root_surface()->get_surface_id()
+      << " wait for frame callbacks again";
 }
 
 void WaylandFrameManager::ClearStates() {
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.h b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
index 605b9c7..87db62c 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.h
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
@@ -139,8 +139,8 @@
   void SetVideoCapture();
   void ReleaseVideoCapture();
 
-  void OnWindowActivationChanged();
   void OnWindowSuspensionChanged();
+  void FrameCallbackTimeout();
 
   static base::TimeDelta GetPresentationFlushTimerDurationForTesting();
 
@@ -257,20 +257,34 @@
   // Set when invalid frame data is sent and the gpu process must be terminated.
   std::string fatal_error_message_;
 
-  uint32_t frames_in_flight_ = 0;
-  base::OneShotTimer freeze_timeout_timer_;
-
   base::OneShotTimer presentation_flush_timer_;
 
+  base::OneShotTimer frame_callback_timer_;
+
   int video_capture_count_ = 0;
 
+  // Indicates that a graphics freeze was detected from the compositor no longer
+  // sending frame callbacks, which is the case in mutter before before it sends
+  // the suspended state. If this occurs during tab capture, the captured
+  // content would look frozen until the suspended state is received.
+  // This is set when that is detected and a fallback rendering can be used
+  // during tab capture without relying on frame callbacks. See
+  // |should_skip_frame_callbacks_| below.
+  int frame_callback_freeze_detected_ = false;
+
   // Indicates if fallback rendering should be used by not relying on frame
-  // callbacks.
+  // callbacks to drive playback when |frame_callback_freeze_detected_| is true
+  // and |video_capture_count_| is more than 0. The frame callbacks are still
+  // set to be able to get notified once the compositor starts sending frame
+  // callbacks again so that they can be used for playback again.
   bool should_skip_frame_callbacks_ = false;
 
   // Indicates if rendering should continue in the background without sending
   // surface commits to wayland. This is used to ensure video capture works when
   // we know the window is occluded and can simply bypass wayland in this case.
+  // This optimized rendering path can only be used after we are notified of
+  // suspended state which may be sent a few seconds after the window gets
+  // occluded, as is the case in mutter.
   bool should_ack_swap_without_commit_ = false;
 
   base::WeakPtrFactory<WaylandFrameManager> weak_factory_;
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager_unittest.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager_unittest.cc
index 40f33d9..b743035c 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager_unittest.cc
@@ -45,12 +45,17 @@
     WaylandTestSimple::SetUp();
     frame_manager_ =
         std::make_unique<WaylandFrameManager>(window_.get(), connection_.get());
+    // Frame callbacks get reset on the client side when they are skipped. So
+    // make MockSurface aware of that.
+    PostToServerAndWait([id = window_->root_surface()->get_surface_id()](
+                            wl::TestWaylandServerThread* server) {
+      auto* mock_surface = server->GetObject<wl::MockSurface>(id);
+      mock_surface->AllowResettingFrameCallback();
+    });
   }
 
  protected:
-  void ApplySurfaceConfigureAndCheckFrameCallback(bool expect_frame_callback) {
-    constexpr uint32_t kBufferId = 1;
-    // Setup wl_buffers.
+  void InitBufferManager() {
     EXPECT_TRUE(connection_->buffer_manager_host());
     auto interface_ptr = connection_->buffer_manager_host()->BindInterface();
     buffer_manager_gpu_->Initialize(std::move(interface_ptr), {},
@@ -59,39 +64,32 @@
                                     /*supports_acquire_fence=*/false,
                                     /*supports_overlays=*/true,
                                     /*supports_single_pixel_buffer=*/true);
-    buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), kLength, kBufferSize,
-                                              kBufferId);
-    base::RunLoop().RunUntilIdle();
-
-    wl::WaylandOverlayConfig config;
-    config.buffer_id = kBufferId;
-    config.bounds_rect = {0, 0, kWidth, kHeight};
-
-    auto* surface = window_->root_surface();
-    WaylandFrame frame(surface, std::move(config));
-
-    frame_manager_->ApplySurfaceConfigure(&frame, surface, frame.root_config,
-                                          false);
-    EXPECT_EQ(!!frame.wl_frame_callback, expect_frame_callback);
   }
 
-  void RecordFrameAndCheckSurfaceCommits(bool expect_surface_commits) {
-    constexpr uint32_t kBufferId = 1;
-    // Setup wl_buffers.
-    EXPECT_TRUE(connection_->buffer_manager_host());
-    auto interface_ptr = connection_->buffer_manager_host()->BindInterface();
-    buffer_manager_gpu_->Initialize(std::move(interface_ptr), {},
-                                    /*supports_dma_buf=*/false,
-                                    /*supports_viewporter=*/true,
-                                    /*supports_acquire_fence=*/false,
-                                    /*supports_overlays=*/true,
-                                    /*supports_single_pixel_buffer=*/true);
+  void RecordFrame() {
     buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), kLength, kBufferSize,
-                                              kBufferId);
+                                              buffer_id_);
     base::RunLoop().RunUntilIdle();
 
     wl::WaylandOverlayConfig config;
-    config.buffer_id = kBufferId;
+    config.buffer_id = buffer_id_;
+    config.bounds_rect = {0, 0, kWidth, kHeight};
+    auto* surface = window_->root_surface();
+    std::unique_ptr<WaylandFrame> frame =
+        std::make_unique<WaylandFrame>(surface, std::move(config));
+    frame_manager_->RecordFrame(std::move(frame));
+    ++buffer_id_;
+  }
+
+  void TestSurfaceCommits(bool expect_surface_commits) {
+    // Setup wl_buffers.
+    InitBufferManager();
+    buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), kLength, kBufferSize,
+                                              buffer_id_);
+    base::RunLoop().RunUntilIdle();
+
+    wl::WaylandOverlayConfig config;
+    config.buffer_id = buffer_id_;
     config.bounds_rect = {0, 0, kWidth, kHeight};
 
     auto* surface = window_->root_surface();
@@ -145,98 +143,119 @@
     });
   }
 
+  void SendFrameCallback() {
+    PostToServerAndWait([id = window_->root_surface()->get_surface_id()](
+                            wl::TestWaylandServerThread* server) {
+      auto* mock_surface = server->GetObject<wl::MockSurface>(id);
+      mock_surface->SendFrameCallback();
+    });
+  }
+
   std::unique_ptr<WaylandFrameManager> frame_manager_;
+  size_t buffer_id_ = 1;
 };
 
-// Tests video capture should not affect frame callbaks if window is active.
-TEST_F(WaylandFrameManagerTest, FrameCallbackSet_WindowActive) {
-  WaylandWindow::WindowStates window_states;
-  window_states.is_activated = true;
-  window_->HandleToplevelConfigure(kWidth, kHeight, window_states);
+// Tests that frame callbacks are waited on during video capture if there is no
+// frame callback timeout.
+TEST_F(WaylandFrameManagerTest, WaitForFrameCallbacks_VideoCapturingNoTimeout) {
+  InitBufferManager();
 
   frame_manager_->SetVideoCapture();
 
-  ApplySurfaceConfigureAndCheckFrameCallback(true);
+  // The first frame should be submitted.
+  RecordFrame();
+  EXPECT_EQ(0u, NumPendingFrames());
+  EXPECT_EQ(1u, NumSubmittedFrames());
+
+  // The second frame should be pending until frame callback is received from
+  // the previous frame.
+  RecordFrame();
+  EXPECT_EQ(1u, NumPendingFrames());
+  EXPECT_EQ(1u, NumSubmittedFrames());
 }
 
-// Tests frame callbacks are set when window is inactive and video is not being
-// captured.
+// Tests frame callbacks are waited on when there is a timeout and video is not
+// being captured.
 TEST_F(WaylandFrameManagerTest,
-       FrameCallbackSet_WindowInactiveVideoNotCapturing) {
-  WaylandWindow::WindowStates window_states;
-  // Make window inactive
-  window_states.is_activated = false;
-  window_->HandleToplevelConfigure(kWidth, kHeight, window_states);
+       WaitForFrameCallbacks_TimeoutVideoNotCapturing) {
+  InitBufferManager();
 
-  // Capture count should be zero.
   frame_manager_->SetVideoCapture();
   frame_manager_->SetVideoCapture();
   frame_manager_->ReleaseVideoCapture();
   frame_manager_->ReleaseVideoCapture();
+  frame_manager_->FrameCallbackTimeout();
 
-  ApplySurfaceConfigureAndCheckFrameCallback(true);
+  // The first frame should be submitted.
+  RecordFrame();
+  EXPECT_EQ(0u, NumPendingFrames());
+  EXPECT_EQ(1u, NumSubmittedFrames());
+
+  // The second frame should be pending until frame callback is received from
+  // the previous frame.
+  RecordFrame();
+  EXPECT_EQ(1u, NumPendingFrames());
+  EXPECT_EQ(1u, NumSubmittedFrames());
 }
 
-// Tests that frame callbacks are not set when window is inactive during video
+// Tests frame callbacks are NOT waited on when there is a timeout during video
 // capture.
-TEST_F(WaylandFrameManagerTest,
-       FrameCallbackNotSet_WindowInactiveVideoCapturing) {
-  // Make window inactive
-  WaylandWindow::WindowStates window_states;
-  window_states.is_activated = false;
-  window_->HandleToplevelConfigure(kWidth, kHeight, window_states);
+TEST_F(WaylandFrameManagerTest, FrameCallbacksSkipped_TimeoutVideoCapturing) {
+  InitBufferManager();
 
-  // Ensure at least one video capture is active.
+  // Ensure at least one video capture exists.
   frame_manager_->SetVideoCapture();
   frame_manager_->SetVideoCapture();
   frame_manager_->ReleaseVideoCapture();
+  // Trigger frame callback timeout, to detect the freeze.
+  frame_manager_->FrameCallbackTimeout();
 
-  ApplySurfaceConfigureAndCheckFrameCallback(false);
+  // The first frame should be submitted.
+  RecordFrame();
+  EXPECT_EQ(0u, NumPendingFrames());
+  EXPECT_EQ(1u, NumSubmittedFrames());
+
+  // The second frame should be submitted without waiting for frame callback
+  // from the first one to be received.
+  RecordFrame();
+  EXPECT_EQ(0u, NumPendingFrames());
+  EXPECT_EQ(2u, NumSubmittedFrames());
+
+  // Send last frame callback, which removes the freeze.
+  SendFrameCallback();
+
+  // Now this frame should be submitted as the frame callback for the last
+  // submitted frame was received.
+  RecordFrame();
+  EXPECT_EQ(0u, NumPendingFrames());
+  EXPECT_EQ(3u, NumSubmittedFrames());
+
+  // Now it should go back to waiting as there is no longer a freeze.
+  RecordFrame();
+  EXPECT_EQ(1u, NumPendingFrames());
+  EXPECT_EQ(3u, NumSubmittedFrames());
 }
 
-// Tests that frames are unblocked when both video capture state and window
-// inactive state become true.
+// Tests that frames are unblocked when both video capture state and frame
+// callback frozen state become true and we transition to fallback rendering.
 TEST_F(WaylandFrameManagerTest,
-       UnblockFrames_BothInactiveAndVideoCaptureBecomeTrue) {
-  constexpr uint32_t kBufferId = 1;
+       UnblockFrames_OnTransitionToSkipFrameCallbacks) {
   // Setup wl_buffers.
-  EXPECT_TRUE(connection_->buffer_manager_host());
-  auto interface_ptr = connection_->buffer_manager_host()->BindInterface();
-  buffer_manager_gpu_->Initialize(std::move(interface_ptr), {},
-                                  /*supports_dma_buf=*/false,
-                                  /*supports_viewporter=*/true,
-                                  /*supports_acquire_fence=*/false,
-                                  /*supports_overlays=*/true,
-                                  /*supports_single_pixel_buffer=*/true);
-  buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), kLength, kBufferSize,
-                                            kBufferId);
-  base::RunLoop().RunUntilIdle();
-
-  wl::WaylandOverlayConfig config;
-  config.buffer_id = kBufferId;
-  config.bounds_rect = {0, 0, kWidth, kHeight};
-
-  auto* surface = window_->root_surface();
-  auto frame = std::make_unique<WaylandFrame>(surface, std::move(config));
-
-  frame_manager_->RecordFrame(std::move(frame));
+  InitBufferManager();
+  RecordFrame();
   EXPECT_EQ(1u, NumSubmittedFrames());
   EXPECT_TRUE(LastSubmittedFrameHasFrameCallback());
   EXPECT_TRUE(LastSubmittedFrameHasSubmittedBuffers());
   EXPECT_EQ(0u, NumPendingFrames());
   EXPECT_TRUE(LastSubmittedFrameHasFrameCallback());
 
-  auto frame2 = std::make_unique<WaylandFrame>(surface, std::move(config));
-
   // Ensure pending frame
-  frame_manager_->RecordFrame(std::move(frame2));
+  RecordFrame();
   EXPECT_EQ(1u, NumSubmittedFrames());
   EXPECT_EQ(1u, NumPendingFrames());
 
-  // Make window inactive
-  WaylandWindow::WindowStates window_states;
-  window_states.is_activated = false;
-  window_->HandleToplevelConfigure(kWidth, kHeight, window_states);
+  // Trigger timeout
+  frame_manager_->FrameCallbackTimeout();
 
   // Ensure at least one video capture is active.
   frame_manager_->SetVideoCapture();
@@ -244,11 +263,9 @@
   // The empty pending frame should be cleared.
   EXPECT_EQ(0u, NumPendingFrames());
 
-  // The existing submitted frame should be there still until buffer release.
-  // But it should not longer have a frame callback.
-  EXPECT_EQ(1u, NumSubmittedFrames());
-  EXPECT_FALSE(LastSubmittedFrameHasFrameCallback());
-  EXPECT_TRUE(LastSubmittedFrameHasSubmittedBuffers());
+  // The second frame should be submitted without waiting for a frame callback
+  // from the first one.
+  EXPECT_EQ(2u, NumSubmittedFrames());
 }
 
 // Tests video capture should not affect surface commit if window is not
@@ -261,7 +278,7 @@
 
   frame_manager_->SetVideoCapture();
 
-  RecordFrameAndCheckSurfaceCommits(/*expect_surface_commits=*/true);
+  TestSurfaceCommits(/*expect_surface_commits=*/true);
 }
 
 // Tests surface commits are sent as usual when window is suspended but video is
@@ -279,7 +296,7 @@
   frame_manager_->ReleaseVideoCapture();
   frame_manager_->ReleaseVideoCapture();
 
-  RecordFrameAndCheckSurfaceCommits(/*expect_surface_commits=*/true);
+  TestSurfaceCommits(/*expect_surface_commits=*/true);
 }
 
 // Tests that swaps are ACKed immediately without involving the compositor when
@@ -297,7 +314,7 @@
   frame_manager_->SetVideoCapture();
   frame_manager_->ReleaseVideoCapture();
 
-  RecordFrameAndCheckSurfaceCommits(/*expect_surface_commits=*/false);
+  TestSurfaceCommits(/*expect_surface_commits=*/false);
 
   constexpr uint32_t kBufferId2 = 2;
   buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), kLength, kBufferSize,
@@ -328,41 +345,26 @@
   EXPECT_TRUE(LastSubmittedFrameAcked());
 }
 
-TEST_F(WaylandFrameManagerTest,
-       UnblockFrames_BothSuspendedAndVideoCaptureBecomeTrue) {
-  constexpr uint32_t kBufferId = 1;
+TEST_F(WaylandFrameManagerTest, UnblockFrames_OnTransitionToSwapWithoutCommit) {
   // Setup wl_buffers.
-  EXPECT_TRUE(connection_->buffer_manager_host());
-  auto interface_ptr = connection_->buffer_manager_host()->BindInterface();
-  buffer_manager_gpu_->Initialize(std::move(interface_ptr), {},
-                                  /*supports_dma_buf=*/false,
-                                  /*supports_viewporter=*/true,
-                                  /*supports_acquire_fence=*/false,
-                                  /*supports_overlays=*/true,
-                                  /*supports_single_pixel_buffer=*/true);
-  buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), kLength, kBufferSize,
-                                            kBufferId);
-  base::RunLoop().RunUntilIdle();
-
-  wl::WaylandOverlayConfig config;
-  config.buffer_id = kBufferId;
-  config.bounds_rect = {0, 0, kWidth, kHeight};
-
-  auto* surface = window_->root_surface();
-  auto frame = std::make_unique<WaylandFrame>(surface, std::move(config));
-
-  frame_manager_->RecordFrame(std::move(frame));
+  InitBufferManager();
+  RecordFrame();
   EXPECT_EQ(1u, NumSubmittedFrames());
   EXPECT_EQ(0u, NumPendingFrames());
   EXPECT_TRUE(LastSubmittedFrameHasFrameCallback());
 
-  auto frame2 = std::make_unique<WaylandFrame>(surface, std::move(config));
-
   // Ensure pending frame
-  frame_manager_->RecordFrame(std::move(frame2));
+  RecordFrame();
   EXPECT_EQ(1u, NumSubmittedFrames());
   EXPECT_EQ(1u, NumPendingFrames());
 
+  // Send frame callback and record another frame to end up with 2 submitted
+  // frames and one pending.
+  SendFrameCallback();
+  RecordFrame();
+  EXPECT_EQ(2u, NumSubmittedFrames());
+  EXPECT_EQ(1u, NumPendingFrames());
+
   // Make window suspended
   WaylandWindow::WindowStates window_states;
   window_states.is_suspended = true;
@@ -371,10 +373,11 @@
   // Ensure at least one video capture is active.
   frame_manager_->SetVideoCapture();
 
-  // The empty pending frame should be cleared.
+  // There should be no more pending frames.
   EXPECT_EQ(0u, NumPendingFrames());
 
-  // The first frame should be removed, leaving the second frame
+  // 2 submitted frames should be cleared and one pending frame should be
+  // submitted.
   EXPECT_EQ(1u, NumSubmittedFrames());
   EXPECT_FALSE(LastSubmittedFrameHasFrameCallback());
   EXPECT_FALSE(LastSubmittedFrameHasSubmittedBuffers());
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
index 47830ec..26a8653 100644
--- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -500,7 +500,6 @@
   }
 
   if (did_active_change) {
-    frame_manager()->OnWindowActivationChanged();
     if (active_bubble()) {
       ActivateBubble(is_active_ ? active_bubble() : nullptr);
     } else {
diff --git a/ui/ozone/platform/wayland/test/mock_surface.h b/ui/ozone/platform/wayland/test/mock_surface.h
index 19ab05c..c7205792 100644
--- a/ui/ozone/platform/wayland/test/mock_surface.h
+++ b/ui/ozone/platform/wayland/test/mock_surface.h
@@ -96,6 +96,10 @@
   gfx::Rect input_region() const { return input_region_; }
 
   void set_frame_callback(wl_resource* callback_resource) {
+    if (allow_resetting_frame_callback_ && frame_callback_) {
+      wl_resource_destroy(frame_callback_);
+      frame_callback_ = nullptr;
+    }
     DCHECK(!frame_callback_);
     frame_callback_ = callback_resource;
   }
@@ -123,6 +127,7 @@
   void ReleaseBufferFenced(wl_resource* buffer,
                            gfx::GpuFenceHandle release_fence);
   void SendFrameCallback();
+  void AllowResettingFrameCallback() { allow_resetting_frame_callback_ = true; }
 
   int32_t buffer_scale() const { return buffer_scale_; }
   void set_buffer_scale(int32_t buffer_scale) { buffer_scale_ = buffer_scale; }
@@ -140,6 +145,7 @@
   gfx::Rect input_region_ = {-1, -1, 0, 0};
 
   raw_ptr<wl_resource, AcrossTasksDanglingUntriaged> frame_callback_ = nullptr;
+  bool allow_resetting_frame_callback_ = false;
   base::flat_map<wl_resource*, raw_ptr<wl_resource, CtnExperimental>>
       linux_buffer_releases_;
 
diff --git a/ui/qt/qt_ui.cc b/ui/qt/qt_ui.cc
index 2f11134..2b3cb3d 100644
--- a/ui/qt/qt_ui.cc
+++ b/ui/qt/qt_ui.cc
@@ -230,7 +230,12 @@
   // SESSION_MANAGER to prevent creating an ICE connection.  See [1] and [2].
   // [1] https://crbug.com/1450759
   // [2] https://bugreports.qt.io/browse/QTBUG-38599
-  base::ScopedEnvironmentVariableOverride env_override("SESSION_MANAGER");
+  base::ScopedEnvironmentVariableOverride session_manager("SESSION_MANAGER");
+
+  // Disable QT input device handling since it's not needed and may result in
+  // crashes on certain device changes. See [3].
+  // [3] https://crbug.com/396193145
+  base::ScopedEnvironmentVariableOverride qt_xcb_no_xi2("QT_XCB_NO_XI2", "1");
 
   auto cmd_line = *base::CommandLine::ForCurrentProcess();
   if (auto* delegate = ui::LinuxUiDelegate::GetInstance()) {
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 20d44d7..c19f5af 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -779,6 +779,7 @@
       "accessibility/ax_virtual_view_wrapper.h",
       "accessibility/ax_widget_obj_wrapper.h",
       "accessibility/ax_window_obj_wrapper.h",
+      "accessibility/tree/browser_views_ax_manager.h",
       "accessibility/tree/views_ax_manager.h",
       "controls/native/native_view_host_aura.h",
       "corewm/tooltip.h",
@@ -808,6 +809,7 @@
       "accessibility/ax_virtual_view_wrapper.cc",
       "accessibility/ax_widget_obj_wrapper.cc",
       "accessibility/ax_window_obj_wrapper.cc",
+      "accessibility/tree/browser_views_ax_manager.cc",
       "accessibility/tree/views_ax_manager.cc",
       "controls/menu/menu_pre_target_handler_aura.cc",
       "controls/menu/menu_pre_target_handler_aura.h",
@@ -1510,6 +1512,10 @@
       sources += [ "touchui/touch_selection_menu_runner_views_unittest.cc" ]
     }
 
+    if (!is_chromeos) {
+      sources += [ "accessibility/tree/browser_views_ax_manager_unittest.cc" ]
+    }
+
     if (enable_desktop_aura) {
       sources += [
         "widget/desktop_aura/desktop_focus_rules_unittest.cc",
diff --git a/ui/views/accessibility/ax_update_notifier.cc b/ui/views/accessibility/ax_update_notifier.cc
index 4760833..81917e4 100644
--- a/ui/views/accessibility/ax_update_notifier.cc
+++ b/ui/views/accessibility/ax_update_notifier.cc
@@ -6,6 +6,7 @@
 
 #include "base/no_destructor.h"
 #include "base/observer_list.h"
+#include "ui/accessibility/accessibility_features.h"
 #include "ui/views/accessibility/ax_update_observer.h"
 
 namespace views {
@@ -40,4 +41,22 @@
                     event_type);
 }
 
+void AXUpdateNotifier::NotifyViewDataChanged(views::View* view) {
+#if BUILDFLAG(IS_CHROMEOS)
+  if (::features::IsViewsAccessibilitySerializeOnDataChangeEnabled()) {
+    observers_.Notify(&AXUpdateObserver::OnDataChanged, view);
+  }
+#endif
+}
+
+void AXUpdateNotifier::NotifyVirtualViewDataChanged(
+    views::AXVirtualView* virtual_view) {
+#if BUILDFLAG(IS_CHROMEOS)
+  if (::features::IsViewsAccessibilitySerializeOnDataChangeEnabled()) {
+    observers_.Notify(&AXUpdateObserver::OnVirtualViewDataChanged,
+                      virtual_view);
+  }
+#endif
+}
+
 }  // namespace views
diff --git a/ui/views/accessibility/ax_update_notifier.h b/ui/views/accessibility/ax_update_notifier.h
index 05c8b312b..d472f284 100644
--- a/ui/views/accessibility/ax_update_notifier.h
+++ b/ui/views/accessibility/ax_update_notifier.h
@@ -34,6 +34,10 @@
   void NotifyVirtualViewEvent(views::AXVirtualView* virtual_view,
                               ax::mojom::Event event_type);
 
+  // Notifies observers of a data change. `view` must not be null.
+  void NotifyViewDataChanged(views::View* view);
+  void NotifyVirtualViewDataChanged(views::AXVirtualView* virtual_view);
+
  private:
   base::ObserverList<AXUpdateObserver> observers_;
 };
diff --git a/ui/views/accessibility/ax_update_observer.h b/ui/views/accessibility/ax_update_observer.h
index 4f29b54d2..90912b0 100644
--- a/ui/views/accessibility/ax_update_observer.h
+++ b/ui/views/accessibility/ax_update_observer.h
@@ -22,6 +22,9 @@
   virtual void OnVirtualViewEvent(views::AXVirtualView* virtual_view,
                                   ax::mojom::Event event_type) {}
 
+  virtual void OnDataChanged(views::View* view) {}
+  virtual void OnVirtualViewDataChanged(views::AXVirtualView* virtual_view) {}
+
  protected:
   AXUpdateObserver();
   ~AXUpdateObserver() override;
diff --git a/ui/views/accessibility/ax_virtual_view.cc b/ui/views/accessibility/ax_virtual_view.cc
index 645d457..92f8ab2 100644
--- a/ui/views/accessibility/ax_virtual_view.cc
+++ b/ui/views/accessibility/ax_virtual_view.cc
@@ -249,6 +249,10 @@
   AXUpdateNotifier::Get()->NotifyVirtualViewEvent(this, event_type);
 }
 
+void AXVirtualView::NotifyDataChanged() {
+  AXUpdateNotifier::Get()->NotifyVirtualViewDataChanged(this);
+}
+
 // ui::AXPlatformNodeDelegate
 
 const ui::AXNodeData& AXVirtualView::GetData() const {
diff --git a/ui/views/accessibility/ax_virtual_view.h b/ui/views/accessibility/ax_virtual_view.h
index 6203e63..9eee082 100644
--- a/ui/views/accessibility/ax_virtual_view.h
+++ b/ui/views/accessibility/ax_virtual_view.h
@@ -200,6 +200,7 @@
   // `ViewAccessibility` overrides.
   void NotifyEvent(ax::mojom::Event event_type,
                    bool send_native_event) override;
+  void NotifyDataChanged() override;
   void UpdateFocusableState() override;
   void UpdateInvisibleState() override;
   void OnWidgetClosing(Widget* widget) override;
diff --git a/ui/views/accessibility/tree/browser_views_ax_manager.cc b/ui/views/accessibility/tree/browser_views_ax_manager.cc
new file mode 100644
index 0000000..76331a75
--- /dev/null
+++ b/ui/views/accessibility/tree/browser_views_ax_manager.cc
@@ -0,0 +1,182 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/accessibility/tree/browser_views_ax_manager.h"
+
+#include <utility>
+
+#include "base/auto_reset.h"
+#include "base/functional/bind.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/task/single_thread_task_runner.h"
+#include "components/crash/core/common/crash_key.h"
+#include "ui/accessibility/accessibility_features.h"
+#include "ui/accessibility/aura/aura_window_properties.h"
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_event.h"
+#include "ui/accessibility/ax_tree_source_checker.h"
+#include "ui/accessibility/platform/ax_platform.h"
+#include "ui/accessibility/platform/browser_accessibility_manager.h"
+#include "ui/aura/client/focus_client.h"
+#include "ui/aura/env.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/display/screen.h"
+#include "ui/views/accessibility/accessibility_alert_window.h"
+#include "ui/views/accessibility/ax_aura_obj_wrapper.h"
+#include "ui/views/accessibility/ax_root_obj_wrapper.h"
+#include "ui/views/accessibility/ax_update_notifier.h"
+#include "ui/views/accessibility/ax_virtual_view.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+#include "ui/wm/core/coordinate_conversion.h"
+#include "ui/wm/public/activation_client.h"
+
+namespace views {
+
+BrowserViewsAXManager* BrowserViewsAXManager::GetInstance() {
+  CHECK(::features::IsAccessibilityTreeForViewsEnabled());
+#if BUILDFLAG(IS_CHROMEOS)
+  return nullptr;
+#else
+  static base::NoDestructor<BrowserViewsAXManager> instance;
+  return instance.get();
+#endif
+}
+
+ui::AXPlatformNodeId BrowserViewsAXManager::GetOrCreateAXNodeUniqueId(
+    ui::AXNodeID ax_node_id) {
+  auto iter = ax_unique_ids_.lower_bound(ax_node_id);
+  if (iter == ax_unique_ids_.end() || iter->first != ax_node_id) {
+    iter =
+        ax_unique_ids_.emplace_hint(iter, ax_node_id, ui::AXUniqueId::Create());
+  }
+  return iter->second;
+}
+
+void BrowserViewsAXManager::OnAXNodeDeleted(ui::AXNodeID ax_node_id) {
+  ax_unique_ids_.erase(ax_node_id);
+}
+
+void BrowserViewsAXManager::AccessibilityPerformAction(
+    const ui::AXActionData& data) {
+  NOTIMPLEMENTED();
+}
+
+bool BrowserViewsAXManager::AccessibilityViewHasFocus() {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+void BrowserViewsAXManager::AccessibilityViewSetFocus() {
+  NOTIMPLEMENTED();
+}
+
+gfx::Rect BrowserViewsAXManager::AccessibilityGetViewBounds() {
+  NOTIMPLEMENTED();
+  return gfx::Rect();
+}
+
+float BrowserViewsAXManager::AccessibilityGetDeviceScaleFactor() {
+  NOTIMPLEMENTED();
+  return 1.0f;
+}
+
+void BrowserViewsAXManager::UnrecoverableAccessibilityError() {
+  NOTIMPLEMENTED();
+}
+
+gfx::AcceleratedWidget
+BrowserViewsAXManager::AccessibilityGetAcceleratedWidget() {
+  NOTIMPLEMENTED();
+  return gfx::kNullAcceleratedWidget;
+}
+
+gfx::NativeViewAccessible
+BrowserViewsAXManager::AccessibilityGetNativeViewAccessible() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+gfx::NativeViewAccessible
+BrowserViewsAXManager::AccessibilityGetNativeViewAccessibleForWindow() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+gfx::NativeViewAccessible
+BrowserViewsAXManager::GetRootViewNativeViewAccessible() {
+  if (!is_enabled()) {
+    return nullptr;
+  }
+
+  ui::BrowserAccessibility* root =
+      ax_tree_manager_->GetBrowserAccessibilityRoot();
+  if (!root) {
+    return nullptr;
+  }
+  return root->GetNativeViewAccessible();
+}
+
+void BrowserViewsAXManager::AccessibilityHitTest(
+    const gfx::Point& point_in_frame_pixels,
+    const ax::mojom::Event& opt_event_to_fire,
+    int opt_request_id,
+    base::OnceCallback<void(ui::AXPlatformTreeManager* hit_manager,
+                            ui::AXNodeID hit_node_id)> opt_callback) {
+  NOTIMPLEMENTED();
+}
+
+gfx::NativeWindow BrowserViewsAXManager::GetTopLevelNativeWindow() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+bool BrowserViewsAXManager::CanFireAccessibilityEvents() const {
+  return is_enabled();
+}
+
+bool BrowserViewsAXManager::AccessibilityIsRootFrame() const {
+  return true;
+}
+
+bool BrowserViewsAXManager::ShouldSuppressAXLoadComplete() {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+content::WebContentsAccessibility*
+BrowserViewsAXManager::AccessibilityGetWebContentsAccessibility() {
+  // This will never be a web content tree.
+  return nullptr;
+}
+
+bool BrowserViewsAXManager::AccessibilityIsWebContentSource() {
+  return false;
+}
+
+void BrowserViewsAXManager::OnAXModeAdded(ui::AXMode mode) {
+  if (mode.has_mode(ui::AXMode::kNativeAPIs)) {
+    Enable();
+  }
+}
+
+void BrowserViewsAXManager::ShutdownForTesting() {
+  ui::AXPlatform::GetInstance().RemoveModeObserver(this);
+}
+
+BrowserViewsAXManager::BrowserViewsAXManager() {
+  CHECK(::features::IsAccessibilityTreeForViewsEnabled());
+  ui::AXPlatform::GetInstance().AddModeObserver(this);
+}
+
+BrowserViewsAXManager::~BrowserViewsAXManager() = default;
+
+void BrowserViewsAXManager::Reset(bool reset_serializer) {
+  ViewsAXManager::Reset(reset_serializer);
+  ax_tree_manager_.reset(ui::BrowserAccessibilityManager::Create(*this, this));
+}
+
+}  // namespace views
diff --git a/ui/views/accessibility/tree/browser_views_ax_manager.h b/ui/views/accessibility/tree/browser_views_ax_manager.h
new file mode 100644
index 0000000..2573b340
--- /dev/null
+++ b/ui/views/accessibility/tree/browser_views_ax_manager.h
@@ -0,0 +1,85 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_ACCESSIBILITY_TREE_BROWSER_VIEWS_AX_MANAGER_H_
+#define UI_VIEWS_ACCESSIBILITY_TREE_BROWSER_VIEWS_AX_MANAGER_H_
+
+#include <map>
+#include <memory>
+
+#include "ui/accessibility/ax_mode_observer.h"
+#include "ui/accessibility/platform/ax_node_id_delegate.h"
+#include "ui/accessibility/platform/ax_platform_tree_manager_delegate.h"
+#include "ui/accessibility/platform/ax_unique_id.h"
+#include "ui/views/accessibility/tree/views_ax_manager.h"
+
+namespace ui {
+class BrowserAccessibilityManager;
+}  // namespace ui
+
+namespace views {
+
+class VIEWS_EXPORT BrowserViewsAXManager
+    : public ViewsAXManager,
+      public ui::AXNodeIdDelegate,
+      public ui::AXPlatformTreeManagerDelegate,
+      public ui::AXModeObserver {
+ public:
+  BrowserViewsAXManager(const BrowserViewsAXManager&) = delete;
+  BrowserViewsAXManager& operator=(const BrowserViewsAXManager&) = delete;
+
+  static BrowserViewsAXManager* GetInstance();
+
+  // ui::AXNodeIdDelegate:
+  ui::AXPlatformNodeId GetOrCreateAXNodeUniqueId(
+      ui::AXNodeID ax_node_id) override;
+  void OnAXNodeDeleted(ui::AXNodeID ax_node_id) override;
+
+  // ui::AXPlatformTreeManagerDelegate:
+  void AccessibilityPerformAction(const ui::AXActionData& data) override;
+  bool AccessibilityViewHasFocus() override;
+  void AccessibilityViewSetFocus() override;
+  gfx::Rect AccessibilityGetViewBounds() override;
+  float AccessibilityGetDeviceScaleFactor() override;
+  void UnrecoverableAccessibilityError() override;
+  gfx::AcceleratedWidget AccessibilityGetAcceleratedWidget() override;
+  gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override;
+  gfx::NativeViewAccessible AccessibilityGetNativeViewAccessibleForWindow()
+      override;
+  gfx::NativeViewAccessible GetRootViewNativeViewAccessible();
+  void AccessibilityHitTest(
+      const gfx::Point& point_in_frame_pixels,
+      const ax::mojom::Event& opt_event_to_fire,
+      int opt_request_id,
+      base::OnceCallback<void(ui::AXPlatformTreeManager* hit_manager,
+                              ui::AXNodeID hit_node_id)> opt_callback) override;
+  gfx::NativeWindow GetTopLevelNativeWindow() override;
+  bool CanFireAccessibilityEvents() const override;
+  bool AccessibilityIsRootFrame() const override;
+  bool ShouldSuppressAXLoadComplete() override;
+  content::WebContentsAccessibility* AccessibilityGetWebContentsAccessibility()
+      override;
+  bool AccessibilityIsWebContentSource() override;
+
+  // ui::AXModeObserver:
+  void OnAXModeAdded(ui::AXMode mode) override;
+
+  void ShutdownForTesting();
+
+ private:
+  friend class base::NoDestructor<BrowserViewsAXManager>;
+  BrowserViewsAXManager();
+  ~BrowserViewsAXManager() override;
+
+  void Reset(bool reset_serializer) override;
+
+  // Holds the generated AXTree of AXNodes for the views-based tree.
+  std::unique_ptr<ui::BrowserAccessibilityManager> ax_tree_manager_;
+
+  std::map<ui::AXNodeID, ui::AXUniqueId> ax_unique_ids_;
+};
+
+}  // namespace views
+
+#endif  // UI_VIEWS_ACCESSIBILITY_TREE_BROWSER_VIEWS_AX_MANAGER_H_
diff --git a/ui/views/accessibility/tree/browser_views_ax_manager_unittest.cc b/ui/views/accessibility/tree/browser_views_ax_manager_unittest.cc
new file mode 100644
index 0000000..5a14138
--- /dev/null
+++ b/ui/views/accessibility/tree/browser_views_ax_manager_unittest.cc
@@ -0,0 +1,78 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/accessibility/tree/browser_views_ax_manager.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/accessibility_features.h"
+#include "ui/accessibility/ax_mode.h"
+#include "ui/accessibility/platform/ax_platform.h"
+#include "ui/accessibility/platform/ax_platform_for_test.h"
+
+namespace views {
+namespace {
+
+class BrowserViewsAXManagerTest : public ::testing::Test {
+ protected:
+  BrowserViewsAXManagerTest() {
+    scoped_feature_list_.InitAndEnableFeature(
+        features::kAccessibilityTreeForViews);
+  }
+
+  void TearDown() override {
+    BrowserViewsAXManager::GetInstance()->ShutdownForTesting();
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(BrowserViewsAXManagerTest, IsEnabledAfterAXModeAdded) {
+  BrowserViewsAXManager* manager = BrowserViewsAXManager::GetInstance();
+  ASSERT_NE(manager, nullptr);
+  // Initially, the manager should not be enabled.
+  EXPECT_FALSE(manager->is_enabled());
+
+  // Simulate that AXMode with kNativeAPIs was added.
+  ui::AXPlatform::GetInstance().NotifyModeAdded(ui::AXMode::kNativeAPIs);
+  EXPECT_TRUE(manager->is_enabled());
+}
+
+// This death test verifies that GetInstance() crashes (via CHECK) when the flag
+// is off.
+TEST_F(BrowserViewsAXManagerTest, GetInstanceCrashesWhenFlagOff) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(features::kAccessibilityTreeForViews);
+  EXPECT_DEATH(BrowserViewsAXManager::GetInstance(), "");
+}
+
+TEST_F(BrowserViewsAXManagerTest, GetOrCreateAXNodeUniqueId) {
+  BrowserViewsAXManager* manager = BrowserViewsAXManager::GetInstance();
+
+  ASSERT_NE(manager, nullptr);
+  int ax_node_id = 100;
+  ui::AXPlatformNodeId id1 = manager->GetOrCreateAXNodeUniqueId(ax_node_id);
+  ui::AXPlatformNodeId id2 = manager->GetOrCreateAXNodeUniqueId(ax_node_id);
+  EXPECT_EQ(id1, id2);
+
+  int another_ax_node_id = 200;
+  ui::AXPlatformNodeId id3 =
+      manager->GetOrCreateAXNodeUniqueId(another_ax_node_id);
+  EXPECT_NE(id1, id3);
+}
+
+TEST_F(BrowserViewsAXManagerTest, OnAXNodeDeleted) {
+  BrowserViewsAXManager* manager = BrowserViewsAXManager::GetInstance();
+
+  ASSERT_NE(manager, nullptr);
+  int ax_node_id = 300;
+  ui::AXPlatformNodeId id1 = manager->GetOrCreateAXNodeUniqueId(ax_node_id);
+  manager->OnAXNodeDeleted(ax_node_id);
+  ui::AXPlatformNodeId id2 = manager->GetOrCreateAXNodeUniqueId(ax_node_id);
+  EXPECT_NE(id1, id2);
+}
+
+}  // namespace
+}  // namespace views
diff --git a/ui/views/accessibility/tree/views_ax_manager.cc b/ui/views/accessibility/tree/views_ax_manager.cc
index bfdf8b6..99cfa6a 100644
--- a/ui/views/accessibility/tree/views_ax_manager.cc
+++ b/ui/views/accessibility/tree/views_ax_manager.cc
@@ -34,11 +34,6 @@
 
 namespace views {
 
-ViewsAXManager* ViewsAXManager::GetInstance() {
-  static base::NoDestructor<ViewsAXManager> instance;
-  return instance.get();
-}
-
 void ViewsAXManager::Enable() {
   is_enabled_ = true;
   Reset(/*reset_serializer=*/false);
@@ -57,12 +52,17 @@
   pending_events_.push_back({tree_source_->GetRoot()->GetUniqueId(),
                              ax::mojom::Event::kLoadComplete, -1,
                              currently_performing_action_});
-  SendPendingEvents();
+  pending_data_updates_.insert(tree_source_->GetRoot()->GetUniqueId());
+  SendPendingUpdate();
 
   // Intentionally not reset at shutdown since we cannot rely on the shutdown
   // ordering of two base::Singletons.
   cache_->SetDelegate(this);
 
+  if (!display::Screen::GetScreen()) {
+    return;
+  }
+
   const display::Display& display =
       display::Screen::GetScreen()->GetPrimaryDisplay();
   aura::Window* root_window = nullptr;
@@ -96,15 +96,6 @@
   cache_ = std::make_unique<views::AXAuraObjCache>();
 }
 
-void ViewsAXManager::InitIfNeeded() {
-  if (is_enabled_ || !ui::AXPlatform::GetInstance().GetMode().has_mode(
-                         ui::AXMode::kNativeAPIs)) {
-    return;
-  }
-
-  Enable();
-}
-
 void ViewsAXManager::HandleAlert(const std::string& text) {
   if (!is_enabled_) {
     return;
@@ -121,6 +112,63 @@
   }
 }
 
+void ViewsAXManager::OnDataChanged(views::View* view) {
+  CHECK(view);
+  if (!is_enabled_) {
+    return;
+  }
+
+  DCHECK(tree_source_.get());
+
+  views::Widget* widget = view->GetWidget();
+  if (widget && !widget->GetNativeView()) {
+    return;
+  }
+
+  views::AXAuraObjWrapper* obj = cache_->GetOrCreate(view);
+  if (!obj) {
+    return;
+  }
+
+  pending_data_updates_.insert(obj->GetUniqueId());
+
+  if (processing_update_posted_) {
+    return;
+  }
+
+  processing_update_posted_ = true;
+  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(&ViewsAXManager::SendPendingUpdate,
+                                base::Unretained(this)));
+}
+
+void ViewsAXManager::OnVirtualViewDataChanged(
+    views::AXVirtualView* virtual_view) {
+  CHECK(virtual_view);
+
+  if (!is_enabled_) {
+    return;
+  }
+
+  DCHECK(tree_source_.get());
+
+  views::AXAuraObjWrapper* obj = virtual_view->GetOrCreateWrapper(cache_.get());
+  if (!obj) {
+    return;
+  }
+
+  pending_data_updates_.insert(obj->GetUniqueId());
+
+  if (processing_update_posted_) {
+    return;
+  }
+
+  processing_update_posted_ = true;
+  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(&ViewsAXManager::SendPendingUpdate,
+                                base::Unretained(this)));
+}
+
 void ViewsAXManager::PerformAction(const ui::AXActionData& data) {
   if (!is_enabled_) {
     return;
@@ -233,19 +281,20 @@
                                bool from_user) {
   pending_events_.push_back({id, event_type, action_request_id,
                              currently_performing_action_, from_user});
+  pending_data_updates_.insert(id);
 
-  if (processing_posted_) {
+  if (processing_update_posted_) {
     return;
   }
 
-  processing_posted_ = true;
+  processing_update_posted_ = true;
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE, base::BindOnce(&ViewsAXManager::SendPendingEvents,
+      FROM_HERE, base::BindOnce(&ViewsAXManager::SendPendingUpdate,
                                 base::Unretained(this)));
 }
 
-void ViewsAXManager::SendPendingEvents() {
-  processing_posted_ = false;
+void ViewsAXManager::SendPendingUpdate() {
+  processing_update_posted_ = false;
   if (!is_enabled_ || !tree_serializer_) {
     return;
   }
@@ -254,7 +303,9 @@
   std::vector<ui::AXEvent> events;
 
   auto pending_events_copy = std::move(pending_events_);
+  auto pending_data_changes_copy = std::move(pending_data_updates_);
   pending_events_.clear();
+  pending_data_updates_.clear();
 
   for (auto& event_copy : pending_events_copy) {
     const int id = event_copy.id;
@@ -271,12 +322,17 @@
       continue;
     }
 
+    // We can't defer serialization until the loop of the
+    // `pending_data_changes_copy` since we need to first fire the event but
+    // only if the object in the client tree, and we need to serialize to know
+    // this.
     ui::AXTreeUpdate update;
     if (!tree_serializer_->SerializeChanges(aura_obj, &update)) {
       OnSerializeFailure(event_type, update);
       return;
     }
     tree_updates.push_back(std::move(update));
+    pending_data_changes_copy.erase(id);
 
     // Fire the event on the node, but only if it's actually in the tree.
     // Sometimes we get events fired on nodes with an ancestor that's
@@ -298,6 +354,21 @@
     }
   }
 
+  // We must now serialize any changes that were not associated with an event.
+  ui::AXTreeUpdate update;
+  for (auto& id : pending_data_changes_copy) {
+    auto* aura_obj = cache_->Get(id);
+    if (!aura_obj) {
+      continue;
+    }
+
+    if (!tree_serializer_->SerializeChanges(aura_obj, &update)) {
+      OnSerializeFailure(ax::mojom::Event::kChildrenChanged, update);
+      return;
+    }
+    tree_updates.push_back(std::move(update));
+  }
+
   // Make sure the focused node is serialized.
   views::AXAuraObjWrapper* focus = cache_->GetFocus();
   if (focus) {
diff --git a/ui/views/accessibility/tree/views_ax_manager.h b/ui/views/accessibility/tree/views_ax_manager.h
index ded07b99..c4886a7 100644
--- a/ui/views/accessibility/tree/views_ax_manager.h
+++ b/ui/views/accessibility/tree/views_ax_manager.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 #include <string>
+#include <unordered_set>
 #include <utility>
 #include <vector>
 
@@ -52,16 +53,12 @@
   ViewsAXManager(const ViewsAXManager&) = delete;
   ViewsAXManager& operator=(const ViewsAXManager&) = delete;
 
-  static ViewsAXManager* GetInstance();
-
   // Enables platform accessibility support for views.
   virtual void Enable();
 
   // Disables platform accessibility support for views.
   virtual void Disable();
 
-  void InitIfNeeded();
-
   // Handle a textual alert.
   void HandleAlert(const std::string& text);
 
@@ -80,6 +77,9 @@
   void OnVirtualViewEvent(views::AXVirtualView* virtual_view,
                           ax::mojom::Event event_type) override;
 
+  void OnDataChanged(views::View* view) override;
+  void OnVirtualViewDataChanged(views::AXVirtualView* virtual_view) override;
+
   bool is_enabled() const { return is_enabled_; }
 
   void set_ax_aura_obj_cache_for_testing(
@@ -94,14 +94,14 @@
 
   // Resets internal state, optionally resetting the serializer too to save
   // memory.
-  void Reset(bool reset_serializer);
+  virtual void Reset(bool reset_serializer);
 
   void PostEvent(int id,
                  ax::mojom::Event event_type,
                  int action_request_id = -1,
                  bool from_user = false);
 
-  virtual void SendPendingEvents();
+  virtual void SendPendingUpdate();
 
   // Subclasses override this to do final dispatching of events.
   virtual void DispatchAccessibilityEvents(
@@ -135,8 +135,9 @@
 
   std::unique_ptr<views::AccessibilityAlertWindow> alert_window_;
 
-  // Indicates whether we have already posted a task to SendPendingEvents().
-  bool processing_posted_ = false;
+  // Indicates whether we have already posted an event or data changed task to
+  // SendPendingUpdate().
+  bool processing_update_posted_ = false;
 
   ax::mojom::Action currently_performing_action_ = ax::mojom::Action::kNone;
 
@@ -148,6 +149,8 @@
     bool from_user;
   };
   std::vector<Event> pending_events_;
+
+  std::unordered_set<ui::AXNodeID> pending_data_updates_;
 };
 }  // namespace views
 
diff --git a/ui/views/accessibility/view_accessibility.cc b/ui/views/accessibility/view_accessibility.cc
index 9bcb0fd3a..5f70dbb 100644
--- a/ui/views/accessibility/view_accessibility.cc
+++ b/ui/views/accessibility/view_accessibility.cc
@@ -302,6 +302,8 @@
   } else {
     data_.RemoveIntAttribute(ax::mojom::IntAttribute::kRestriction);
   }
+
+  NotifyDataChanged();
 }
 
 bool ViewAccessibility::GetIsPruned() const {
@@ -315,6 +317,7 @@
 
   OnIntListAttributeChanged(ax::mojom::IntListAttribute::kCharacterOffsets,
                             offsets);
+  NotifyDataChanged();
 }
 
 const std::vector<int32_t>& ViewAccessibility::GetCharacterOffsets() const {
@@ -326,6 +329,7 @@
   data_.AddIntListAttribute(ax::mojom::IntListAttribute::kWordStarts, offsets);
 
   OnIntListAttributeChanged(ax::mojom::IntListAttribute::kWordStarts, offsets);
+  NotifyDataChanged();
 }
 
 const std::vector<int32_t>& ViewAccessibility::GetWordStarts() const {
@@ -336,6 +340,7 @@
   data_.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, offsets);
 
   OnIntListAttributeChanged(ax::mojom::IntListAttribute::kWordEnds, offsets);
+  NotifyDataChanged();
 }
 
 const std::vector<int32_t>& ViewAccessibility::GetWordEnds() const {
@@ -353,14 +358,17 @@
                             std::nullopt);
   OnIntListAttributeChanged(ax::mojom::IntListAttribute::kWordEnds,
                             std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetControlIds(const std::vector<int32_t>& ids) {
   data_.AddIntListAttribute(ax::mojom::IntListAttribute::kControlsIds, ids);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveControlIds() {
   data_.RemoveIntListAttribute(ax::mojom::IntListAttribute::kControlsIds);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetClipsChildren(bool clips_children) {
@@ -369,16 +377,19 @@
 
   OnBoolAttributeChanged(ax::mojom::BoolAttribute::kClipsChildren,
                          clips_children);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetClassName(const std::string& class_name) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kClassName, class_name);
 
   OnStringAttributeChanged(ax::mojom::StringAttribute::kClassName, class_name);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetHasPopup(const ax::mojom::HasPopup has_popup) {
   data_.SetHasPopup(has_popup);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetRole(const ax::mojom::Role role) {
@@ -406,6 +417,8 @@
   UpdateInvisibleState();
 
   OnRoleChanged(role);
+
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetRole(const ax::mojom::Role role,
@@ -467,6 +480,7 @@
                            base::UTF16ToUTF8(name));
 
   NotifyEvent(ax::mojom::Event::kTextChanged, true);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetName(std::string_view name,
@@ -491,6 +505,7 @@
 
   data_.AddIntListAttribute(ax::mojom::IntListAttribute::kLabelledbyIds,
                             {naming_view.GetViewAccessibility().GetUniqueId()});
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveName() {
@@ -498,6 +513,7 @@
   data_.RemoveIntAttribute(ax::mojom::IntAttribute::kNameFrom);
 
   OnStringAttributeChanged(ax::mojom::StringAttribute::kName, std::nullopt);
+  NotifyDataChanged();
 }
 
 std::u16string ViewAccessibility::GetCachedName() const {
@@ -529,6 +545,7 @@
 
   OnStringAttributeChanged(ax::mojom::StringAttribute::kRoleDescription,
                            base::UTF16ToUTF8(role_description));
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetRoleDescription(
@@ -546,6 +563,7 @@
 
   OnStringAttributeChanged(ax::mojom::StringAttribute::kRoleDescription,
                            std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsEditable(bool editable) {
@@ -558,72 +576,84 @@
   }
   data_.relative_bounds.bounds = bounds;
   NotifyEvent(ax::mojom::Event::kLocationChanged, false);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetPosInSet(int pos_in_set) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kPosInSet, pos_in_set);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kPosInSet, pos_in_set);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetSetSize(int set_size) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kSetSize, set_size);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kSetSize, set_size);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearPosInSet() {
   data_.RemoveIntAttribute(ax::mojom::IntAttribute::kPosInSet);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kPosInSet, 0);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearSetSize() {
   data_.RemoveIntAttribute(ax::mojom::IntAttribute::kSetSize);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kSetSize, 0);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetScrollX(int scroll_x) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollX, scroll_x);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kScrollX, scroll_x);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetScrollXMin(int scroll_x_min) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollXMin, scroll_x_min);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kScrollXMin, scroll_x_min);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetScrollXMax(int scroll_x_max) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollXMax, scroll_x_max);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kScrollXMax, scroll_x_max);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetScrollY(int scroll_y) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollY, scroll_y);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kScrollY, scroll_y);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetScrollYMin(int scroll_y_min) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollYMin, scroll_y_min);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kScrollYMin, scroll_y_min);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetScrollYMax(int scroll_y_max) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollYMax, scroll_y_max);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kScrollYMax, scroll_y_max);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsScrollable(bool is_scrollable) {
   data_.AddBoolAttribute(ax::mojom::BoolAttribute::kScrollable, is_scrollable);
 
   OnBoolAttributeChanged(ax::mojom::BoolAttribute::kScrollable, is_scrollable);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetActiveDescendant(views::View& view) {
@@ -640,6 +670,7 @@
   OnIntAttributeChanged(ax::mojom::IntAttribute::kActivedescendantId, id);
 
   NotifyEvent(ax::mojom::Event::kActiveDescendantChanged, true);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearActiveDescendant() {
@@ -652,6 +683,7 @@
                         std::nullopt);
 
   NotifyEvent(ax::mojom::Event::kActiveDescendantChanged, true);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsInvisible(bool is_invisible) {
@@ -707,6 +739,7 @@
   // this. Some platforms have specific state-changed events and this generic
   // event does not suggest what changed.
   NotifyEvent(ax::mojom::Event::kStateChanged, true);
+  NotifyDataChanged();
 }
 
 bool ViewAccessibility::GetIsEnabled() const {
@@ -717,6 +750,7 @@
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTableRowCount, row_count);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableRowCount, row_count);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTableColumnCount(int column_count) {
@@ -725,12 +759,14 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableColumnCount,
                         column_count);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetAriaTableRowCount(int row_count) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kAriaRowCount, row_count);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kAriaRowCount, row_count);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetAriaTableColumnCount(int column_count) {
@@ -739,12 +775,14 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kAriaColumnCount,
                         column_count);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearTableRowCount() {
   data_.RemoveIntAttribute(ax::mojom::IntAttribute::kTableRowCount);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableRowCount, std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearTableColumnCount() {
@@ -752,12 +790,14 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableColumnCount,
                         std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearAriaTableRowCount() {
   data_.RemoveIntAttribute(ax::mojom::IntAttribute::kAriaRowCount);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kAriaRowCount, std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearAriaTableColumnCount() {
@@ -765,12 +805,14 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kAriaColumnCount,
                         std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTableRowIndex(int cell_index) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTableRowIndex, cell_index);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableRowIndex, cell_index);
+  NotifyDataChanged();
 }
 
 int ViewAccessibility::GetTableRowIndex() const {
@@ -783,18 +825,21 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableCellColumnIndex,
                         cell_index);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTableCellRowIndex(int row_index) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowIndex, row_index);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableCellRowIndex, row_index);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTableCellRowSpan(int row_span) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowSpan, row_span);
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableCellRowSpan, row_span);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTableCellColumnSpan(int column_span) {
@@ -803,6 +848,7 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kTableCellColumnSpan,
                         column_span);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetSortDirection(
@@ -812,6 +858,7 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kSortDirection,
                         static_cast<int>(sort_direction));
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::ClearDescriptionAndDescriptionFrom() {
@@ -819,6 +866,7 @@
 
   OnStringAttributeChanged(ax::mojom::StringAttribute::kDescription,
                            std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveDescription() {
@@ -829,6 +877,7 @@
                            std::nullopt);
   OnIntAttributeChanged(ax::mojom::IntAttribute::kDescriptionFrom,
                         std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetDescription(
@@ -849,6 +898,7 @@
                            description);
   OnIntAttributeChanged(ax::mojom::IntAttribute::kDescriptionFrom,
                         static_cast<int>(description_from));
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetDescription(
@@ -872,6 +922,7 @@
   data_.AddIntListAttribute(ax::mojom::IntListAttribute::kDescribedbyIds, ids);
 
   OnIntListAttributeChanged(ax::mojom::IntListAttribute::kDescribedbyIds, ids);
+  NotifyDataChanged();
 }
 
 std::u16string ViewAccessibility::GetCachedDescription() const {
@@ -921,6 +972,7 @@
 void ViewAccessibility::SetPlaceholder(const std::string& placeholder) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kPlaceholder,
                            placeholder);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::AddAction(ax::mojom::Action action) {
@@ -929,6 +981,7 @@
   }
 
   data_.AddAction(action);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetCheckedState(ax::mojom::CheckedState checked_state) {
@@ -941,6 +994,7 @@
                         static_cast<int>(checked_state));
 
   NotifyEvent(ax::mojom::Event::kCheckedStateChanged, true);
+  NotifyDataChanged();
 }
 
 ax::mojom::CheckedState ViewAccessibility::GetCheckedState() const {
@@ -952,33 +1006,40 @@
     data_.RemoveIntAttribute(ax::mojom::IntAttribute::kCheckedState);
 
     OnIntAttributeChanged(ax::mojom::IntAttribute::kCheckedState, std::nullopt);
+    NotifyDataChanged();
   }
 }
 
 void ViewAccessibility::SetKeyShortcuts(const std::string& key_shortcuts) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kKeyShortcuts,
                            key_shortcuts);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveKeyShortcuts() {
   data_.RemoveStringAttribute(ax::mojom::StringAttribute::kKeyShortcuts);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetAccessKey(const std::string& access_key) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kAccessKey, access_key);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveAccessKey() {
   data_.RemoveStringAttribute(ax::mojom::StringAttribute::kAccessKey);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetChildTreeNodeAppId(const std::string& app_id) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kChildTreeNodeAppId,
                            app_id);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveChildTreeNodeAppId() {
   data_.RemoveStringAttribute(ax::mojom::StringAttribute::kChildTreeNodeAppId);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsSelected(bool selected) {
@@ -997,19 +1058,24 @@
   if (selected) {
     NotifyEvent(ax::mojom::Event::kSelection, true);
   }
+
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsMultiselectable(bool multiselectable) {
   SetState(ax::mojom::State::kMultiselectable, multiselectable);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsModal(bool modal) {
   data_.AddBoolAttribute(ax::mojom::BoolAttribute::kModal, modal);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::AddHTMLAttributes(
     std::pair<std::string, std::string> attribute) {
   data_.html_attributes.push_back(attribute);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsIgnored(bool is_ignored) {
@@ -1070,11 +1136,14 @@
   for (auto& virtual_child : virtual_children()) {
     virtual_child->SetShowContextMenuRecursive(show_context_menu);
   }
+
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetContainerLiveStatus(const std::string& status) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kContainerLiveStatus,
                            status);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveContainerLiveStatus() {
@@ -1083,6 +1152,7 @@
     return;
   }
   data_.RemoveStringAttribute(ax::mojom::StringAttribute::kContainerLiveStatus);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetValue(const std::string& value) {
@@ -1095,6 +1165,8 @@
     OnStringAttributeChanged(ax::mojom::StringAttribute::kValue, value);
     NotifyEvent(ax::mojom::Event::kValueChanged, true);
   }
+
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetValue(std::u16string_view value) {
@@ -1110,6 +1182,7 @@
   OnStringAttributeChanged(ax::mojom::StringAttribute::kValue, std::nullopt);
 
   NotifyEvent(ax::mojom::Event::kValueChanged, true);
+  NotifyDataChanged();
 }
 
 std::u16string ViewAccessibility::GetValue() const {
@@ -1131,11 +1204,13 @@
 
   OnIntAttributeChanged(ax::mojom::IntAttribute::kDefaultActionVerb,
                         std::nullopt);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetAutoComplete(const std::string& autocomplete) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kAutoComplete,
                            autocomplete);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetHasFocusableAncestor(bool ancestor_focusable) {
@@ -1268,6 +1343,7 @@
       << "This method should only be called on the RootView.";
   data_.AddStringAttribute(ax::mojom::StringAttribute::kUrl, url);
   OnStringAttributeChanged(ax::mojom::StringAttribute::kUrl, url);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetRootViewIsReadyToNotifyEvents() {
@@ -1308,6 +1384,7 @@
 
     OnStringAttributeChanged(ax::mojom::StringAttribute::kChildTreeId,
                              tree_id.ToString());
+    NotifyDataChanged();
   }
 }
 
@@ -1321,12 +1398,14 @@
 
   OnStringAttributeChanged(ax::mojom::StringAttribute::kChildTreeId,
                            std::string());
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetChildTreeScaleFactor(float scale_factor) {
   if (data_.HasChildTreeID()) {
     data_.AddFloatAttribute(ax::mojom::FloatAttribute::kChildTreeScale,
                             scale_factor);
+    NotifyDataChanged();
   }
 }
 
@@ -1682,6 +1761,7 @@
   }
 
   OnStateChanged(state, is_enabled);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetBlockNotifyEvents(bool block) {
@@ -1713,6 +1793,7 @@
 
 void ViewAccessibility::SetPopupForId(ui::AXPlatformNodeId popup_for_id) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kPopupForId, popup_for_id);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTextDirection(int text_direction) {
@@ -1722,6 +1803,7 @@
            static_cast<int32_t>(ax::mojom::WritingDirection::kMaxValue));
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTextDirection,
                         text_direction);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetIsProtected(bool is_protected) {
@@ -1794,39 +1876,47 @@
 
 void ViewAccessibility::SetTextSelStart(int32_t text_sel_start) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTextSelStart, text_sel_start);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetTextSelEnd(int32_t text_sel_end) {
   data_.AddIntAttribute(ax::mojom::IntAttribute::kTextSelEnd, text_sel_end);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetLiveAtomic(bool live_atomic) {
   data_.AddBoolAttribute(ax::mojom::BoolAttribute::kLiveAtomic, live_atomic);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetLiveStatus(const std::string& live_status) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kLiveStatus,
                            live_status);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetLiveRelevant(const std::string& live_relevant) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kLiveRelevant,
                            live_relevant);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveLiveRelevant() {
   data_.RemoveStringAttribute(ax::mojom::StringAttribute::kLiveRelevant);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::SetContainerLiveRelevant(
     const std::string& live_relevant) {
   data_.AddStringAttribute(ax::mojom::StringAttribute::kContainerLiveRelevant,
                            live_relevant);
+  NotifyDataChanged();
 }
 
 void ViewAccessibility::RemoveContainerLiveRelevant() {
   data_.RemoveStringAttribute(
       ax::mojom::StringAttribute::kContainerLiveRelevant);
+  NotifyDataChanged();
 }
 
 ui::AXAttributeChangedCallbacks*
@@ -1839,4 +1929,9 @@
   return attribute_changed_callbacks_.get();
 }
 
+void ViewAccessibility::NotifyDataChanged() {
+  CHECK(view_);
+  AXUpdateNotifier::Get()->NotifyViewDataChanged(view_);
+}
+
 }  // namespace views
diff --git a/ui/views/accessibility/view_accessibility.h b/ui/views/accessibility/view_accessibility.h
index a5ce177..776ae77a 100644
--- a/ui/views/accessibility/view_accessibility.h
+++ b/ui/views/accessibility/view_accessibility.h
@@ -756,6 +756,8 @@
 
   ui::AXAttributeChangedCallbacks* GetOrCreateAXAttributeChangedCallbacks();
 
+  virtual void NotifyDataChanged();
+
   // Weak. Owns this.
   const raw_ptr<View> view_;
 
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc
index 5d0ae99..f9adc7c 100644
--- a/ui/views/controls/button/label_button.cc
+++ b/ui/views/controls/button/label_button.cc
@@ -80,13 +80,6 @@
   SetTextInternal(text);
   SetLayoutManager(std::make_unique<DelegatingLayoutManager>(this));
   GetViewAccessibility().SetIsDefault(is_default_);
-
-#if BUILDFLAG(IS_WIN)
-  // Paint image(s) to a layer so that the canvas is snapped to pixel
-  // boundaries.
-  image_container_view()->SetPaintToLayer();
-  image_container_view()->layer()->SetFillsBoundsOpaquely(false);
-#endif
 }
 
 LabelButton::~LabelButton() {
@@ -541,10 +534,8 @@
 
 void LabelButton::AddLayerToRegion(ui::Layer* new_layer,
                                    views::LayerRegion region) {
-#if !BUILDFLAG(IS_WIN)
   image_container_view()->SetPaintToLayer();
   image_container_view()->layer()->SetFillsBoundsOpaquely(false);
-#endif
   ink_drop_container()->SetVisible(true);
   ink_drop_container()->AddLayerToRegion(new_layer, region);
 }
@@ -552,9 +543,7 @@
 void LabelButton::RemoveLayerFromRegions(ui::Layer* old_layer) {
   ink_drop_container()->RemoveLayerFromRegions(old_layer);
   ink_drop_container()->SetVisible(false);
-#if !BUILDFLAG(IS_WIN)
   image_container_view()->DestroyLayer();
-#endif
 }
 
 std::unique_ptr<ActionViewInterface> LabelButton::GetActionViewInterface() {
diff --git a/ui/views/views_delegate.cc b/ui/views/views_delegate.cc
index a2abd8e..7ec216d 100644
--- a/ui/views/views_delegate.cc
+++ b/ui/views/views_delegate.cc
@@ -9,11 +9,12 @@
 #include "base/command_line.h"
 #include "build/build_config.h"
 #include "ui/accessibility/accessibility_features.h"
+#include "ui/accessibility/platform/ax_platform.h"
 #include "ui/base/mojom/window_show_state.mojom.h"
 #include "ui/views/widget/native_widget_private.h"
 
 #if defined(USE_AURA)
-#include "ui/views/accessibility/tree/views_ax_manager.h"
+#include "ui/views/accessibility/tree/browser_views_ax_manager.h"
 #include "ui/views/touchui/touch_selection_menu_runner_views.h"
 #endif
 
@@ -36,9 +37,14 @@
   // will not get the replacement.
   touch_selection_menu_runner_ =
       std::make_unique<TouchSelectionMenuRunnerViews>();
+#endif
 
-  if (::features::IsAccessibilityTreeForViewsEnabled()) {
-    ViewsAXManager::GetInstance()->InitIfNeeded();
+#if BUILDFLAG(ENABLE_DESKTOP_AURA)
+  if (::features::IsAccessibilityTreeForViewsEnabled() &&
+      (BrowserViewsAXManager::GetInstance()->is_enabled() ||
+       !ui::AXPlatform::GetInstance().GetMode().has_mode(
+           ui::AXMode::kNativeAPIs))) {
+    BrowserViewsAXManager::GetInstance()->Enable();
   }
 #endif
 }
diff --git a/ui/webui/resources/tools/codemods/389737066_migration_lit.js b/ui/webui/resources/tools/codemods/389737066_migration_lit.js
new file mode 100644
index 0000000..c7bfe5f
--- /dev/null
+++ b/ui/webui/resources/tools/codemods/389737066_migration_lit.js
@@ -0,0 +1,53 @@
+// 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.
+
+// Codemod for adding a "accessor" keyword before every Lit property
+// declaration in a class. To be used to update Lit UIs for the
+// purposes of fixing cbug.com/389737066.
+
+module.exports = function transformer(file, api) {
+  const source = file.source;
+  const j = api.jscodeshift;
+  const root = j(source);
+
+  const classProperties = new Set();
+  root.find(j.Function, {key: {name: 'properties'}})
+      .find(j.ObjectExpression)
+      .forEach(p => {
+        p.value.properties.forEach(property => {
+          // Ignore nested ObjectExpressions.
+          if (p.parentPath.value.type !== 'ReturnStatement') {
+            return;
+          }
+          classProperties.add(property.key.name);
+        });
+      });
+
+  root.find(j.ClassDeclaration).forEach(path => {
+    path.node.body.body.forEach(classMember => {
+      if (classMember.type === 'ClassProperty' &&
+          classProperties.has(classMember.key.name)) {
+        // Add an @accessor decorator since jscodeshift does not support the
+        // "accessor" keyword yet. It will be replaced later using a regular
+        // expression.
+        const decorator = j.decorator(j.identifier('accessor'));
+        classMember.decorators = [decorator];
+      }
+    });
+  });
+
+  const outputOptions = {quote: 'single'};
+
+  let out = root.toSource(outputOptions);
+  // Replace @accessor with the 'accessor' keyword and place it on the same line
+  // as the property.
+  out = out.replaceAll(/@accessor\n\s+/g, 'accessor ');
+
+  // Fix error: "error TS1029: 'private' modifier must precede 'accessor'
+  // modifier."
+  out = out.replaceAll(/\baccessor private\b/g, 'private accessor');
+  out = out.replaceAll(/\baccessor protected\b/g, 'protected accessor');
+
+  return out;
+};
diff --git a/ui/webui/resources/tools/codemods/389737066_migration.js b/ui/webui/resources/tools/codemods/389737066_migration_polymer.js
similarity index 87%
rename from ui/webui/resources/tools/codemods/389737066_migration.js
rename to ui/webui/resources/tools/codemods/389737066_migration_polymer.js
index ff00c46c..5f071b7 100644
--- a/ui/webui/resources/tools/codemods/389737066_migration.js
+++ b/ui/webui/resources/tools/codemods/389737066_migration_polymer.js
@@ -11,7 +11,7 @@
   const j = api.jscodeshift;
   const root = j(source);
 
-  const polymerProperties = new Set();
+  const classProperties = new Set();
   root.find(j.Function, {key: {name: 'properties'}})
       .find(j.ObjectExpression)
       .forEach(p => {
@@ -20,14 +20,14 @@
           if (p.parentPath.value.type !== 'ReturnStatement') {
             return;
           }
-          polymerProperties.add(property.key.name);
+          classProperties.add(property.key.name);
         });
       });
 
   root.find(j.ClassDeclaration).forEach(path => {
     path.node.body.body.forEach(classMember => {
       if (classMember.type === 'ClassProperty' &&
-          polymerProperties.has(classMember.key.name)) {
+          classProperties.has(classMember.key.name)) {
         classMember.declare = true;
       }
     });
diff --git a/ui/webui/resources/tools/codemods/389737066_migration.py b/ui/webui/resources/tools/codemods/jscodeshift.py
similarity index 60%
rename from ui/webui/resources/tools/codemods/389737066_migration.py
rename to ui/webui/resources/tools/codemods/jscodeshift.py
index fee5a30..73049c9 100755
--- a/ui/webui/resources/tools/codemods/389737066_migration.py
+++ b/ui/webui/resources/tools/codemods/jscodeshift.py
@@ -7,7 +7,7 @@
 import os
 import sys
 """
-Helper script for updating Polymer code to address https://crbug.com/389737066.
+Helper script for running jscodeshift codemods over a set of files.
 """
 
 _HERE_PATH = os.path.dirname(__file__)
@@ -30,25 +30,34 @@
 
  3) Invoke the script from the root directory of the repository. For example
 
-    python3 ui/webui/resources/tools/codemods/389737066_migration.py \
-        --files chrome/browser/resources/print_preview/ui/color_settings.js
+    python3 ui/webui/resources/tools/codemods/jscodeshift.py \
+        --transform ui/webui/resources/tools/codemods/my_transform.js
+        --files ui/webui/resources/cr_elements/cr_button/cr_button.ts
 
-    python3 ui/webui/resources/tools/codemods/389737066_migration.py \
-        --files `find chrome/browser/resources/print_preview/ui/ -name '*.ts'`
+    python3 ui/webui/resources/tools/codemods/jscodeshift.py \
+        --transform ui/webui/resources/tools/codemods/my_transform.js
+        --files `find ui/webui/resources/cr_elements/cr_button/ -name '*.ts'`
 """
 
 
 def main(argv):
   parser = argparse.ArgumentParser()
+  parser.add_argument('--transform', required=True)
   parser.add_argument('--files', nargs='*', required=True)
   args = parser.parse_args(argv)
 
+  if not os.path.exists(args.transform):
+    print(
+        f'Error: jscodeshift.py: Could not file transform file \'args.transform\'',
+        file=sys.stderr)
+    sys.exit(1)
+
   print(f'Migrating {len(args.files)} files...')
 
   # Update TS file.
   out = node.RunNode([
       os.path.join(_HERE_PATH, 'node_modules/jscodeshift/bin/jscodeshift.js'),
-      '--transform=' + os.path.join(_HERE_PATH, '389737066_migration.js'),
+      '--transform=' + args.transform,
       '--extensions=ts',
       '--parser=ts',
   ] + args.files)
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java
index 5873969..bd3819bf 100644
--- a/url/android/java/src/org/chromium/url/GURL.java
+++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -23,6 +23,7 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
 import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.Contract;
 import org.chromium.build.annotations.Initializer;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
@@ -139,6 +140,7 @@
     }
 
     /** @return true if the GURL is null, empty, or invalid. */
+    @Contract("null -> true")
     public static boolean isEmptyOrInvalid(@Nullable GURL gurl) {
         return gurl == null || gurl.isEmpty() || !gurl.isValid();
     }
diff --git a/v8 b/v8
index a5ca09d..194368f 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit a5ca09d7e54499e81ce889a614cfe01970895e03
+Subproject commit 194368fea07c867d4518e6670fc6350a537a3480