diff --git a/DEPS b/DEPS
index 5c04cb8..0904702 100644
--- a/DEPS
+++ b/DEPS
@@ -304,7 +304,7 @@
   # 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': '6ec1f74e13e49ae02c524f252181e545587f0868',
+  'skia_revision': '0c17323a610cf8dd5c0d3b3a218c8120c979aba8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -312,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '61728827d2e5ecce685578bc54bb2c744b65fc9a',
+  'angle_revision': '24ac26c3f0e41e18b6a0d643033260191c9bf277',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -331,7 +331,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:11.20230104.0.1',
+  'fuchsia_version': 'version:11.20230104.1.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -383,7 +383,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': 'e067d1574a0afe409be3e4ce4f18f4e56e6beb0e',
+  'devtools_frontend_revision': 'bf6074afc5227df4da945c04f0f161e64b7d2c6f',
   # 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.
@@ -419,7 +419,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': '7c26d3152dab9d733393b4394b146ca86d4664eb',
+  'dawn_revision': '0fa5fb16bd4d54a7d8b3c26e76f9f03c55c8cfd2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -443,7 +443,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': '6edd1d11b0a6d5f502cc29394eaf8ee0c62f5930',
+  'nearby_revision': 'f7f0a266fe5baf2abc96564e696e666d24b54920',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -770,12 +770,12 @@
 
   'src/clank': {
     'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
-    '4fd455be8be02791ebe805a6291561ea5a86c1b4',
+    '1a38de2236bb113e65e48ec9f74e017e6b9666cc',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '76a2b9434a11ad136aa14c3cf98c354e6a138072',
+    'url': Var('chromium_git') + '/website.git' + '@' + 'fa6cc1faab749e4fe01d632e019c6fbaeaf6d06d',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -869,7 +869,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'q1_wnmZ3AWZfADyopIWx0lv1-PYzWjRKd51-j24gYiQC',
+          'version': '6GECQGgagrYcKg772YDWesprolIh27UUM2iL-slAB4AC',
         },
       ],
       'dep_type': 'cipd',
@@ -880,7 +880,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'pBvQIJQS0vuaSWu6yDzmpT5EY8zeTBH7DJueJumGJZ8C',
+          'version': 'XIBwdoXRMFrakg5VQGhzJGo0qsOkvNZmKNWdJbLh7gYC',
         },
       ],
       'dep_type': 'cipd',
@@ -891,7 +891,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'i9PVYQ-5aV9H2Q8AJAJrhTdqAjhRa_vo5N9-xLOwg4oC',
+          'version': 'm_xucOaUCXBtAzXt-j_A28rACQLUyEqAqVgz8e2_kj0C',
         },
       ],
       'dep_type': 'cipd',
@@ -959,7 +959,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'Hjrr3kAG6HDx0Ht22sw-pZY5W_Vnltz4SdhqbBcEdw4C',
+          'version': '8vzAXUAnepCYVnjMB9nfrZvZWC6iHzigISFArrguaYgC',
       },
     ],
     'condition': 'checkout_android',
@@ -1210,7 +1210,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '78dae60e4194d5fa1116a1e835d2e74cbc718a44',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'a784a05439f1bd0c23460c413d48d9cc4daecbf3',
     'condition': 'checkout_src_internal',
   },
 
@@ -1679,7 +1679,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': 'GBS8IZ2wumMlodGQUSzolGjJELkBWiZDNIEOLGiV1MsC',
+              'version': 'fCfmTCTodJobBFr8fnGgzGEOm8w4aaHiVjWr5Id9cEwC',
           },
       ],
       'condition': 'checkout_android',
@@ -1824,7 +1824,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0673bb68c214c0a6c56d00b30e6600dcc9f02b93',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '0c2981364f4ba1ee189afd69de02893bd3d3bdc1',
+    Var('webrtc_git') + '/src.git' + '@' + '925324030525f9174b50a321a78da00cad163087',
 
   # 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.
@@ -1894,7 +1894,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@758a833aa6cc6b962f2ef119e0da54d6642cddfb',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@8079e184de29903328f63837f46346756ba299d4',
     'condition': 'checkout_src_internal',
   },
 
@@ -1924,7 +1924,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'Pek19fVha5PkKEc1PHJlHhSXLTWcT-O116JR6P8XR3gC',
+        'version': 'vaTDyXFZBxpIiH5tEZOKo4Oaz-N3aKD5giHqany7QbcC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1946,7 +1946,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': '4PAbbqYdyqc5eZow1WtJq4s3LCezhXhQMpIwu8H6PkAC',
+        'version': 'KXWQbRfx6r5JpysNQCeZiicfpw7Ek_FiynBC4_vNx70C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 1d70c01a4..ec5d53e 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -365,7 +365,7 @@
 // Enables to allow low storage warning feature in the camera app.
 BASE_FEATURE(kCameraAppLowStorageWarning,
              "CameraAppLowStorageWarning",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables to show multi-page UI when for document scanning feature in the
 // camera app.
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb
index 096a9d2..a5d9a30 100644
--- a/ash/strings/ash_strings_be.xtb
+++ b/ash/strings/ash_strings_be.xtb
@@ -925,6 +925,7 @@
 <translation id="6040143037577758943">Закрыць</translation>
 <translation id="6043212731627905357">Гэты манітор не падыходзіць да прылады <ph name="DEVICE_TYPE" /> (манітор не падтрымліваецца).</translation>
 <translation id="6043994281159824495">Выйсці</translation>
+<translation id="6045629311476491587">Выкарыстоўваюцца <ph name="APP_COUNT" /> праграмамі</translation>
 <translation id="6047696787498798094">Пры пераключэнні на іншага карыстальніка абагульванне экрана перастане працаваць. Працягнуць?</translation>
 <translation id="6054305421211936131">Увайсці з дапамогай разумнай карткі</translation>
 <translation id="6059276912018042191">Нядаўна адкрытыя ўкладкі Chrome</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index f91724f70..534609be 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -882,7 +882,7 @@
 <translation id="5805809050170488595">Klik for at aktivere <ph name="NETWORK_NAME" /></translation>
 <translation id="5825969630400862129">Indstillinger for tilsluttede enheder</translation>
 <translation id="5837036133683224804">Stop <ph name="ROUTE_TITLE" /> på <ph name="RECEIVER_NAME" /></translation>
-<translation id="584525477304726060">Hold fingeren nede på vinduet for at maksimere det</translation>
+<translation id="584525477304726060">Hold fingeren på vinduet for at maksimere det</translation>
 <translation id="5856638668464565213"><ph name="NETWORK_NAME" /> er ikke aktiveret.</translation>
 <translation id="5860033963881614850">Fra</translation>
 <translation id="5860491529813859533">Aktivér</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
index 86938cf..59635d62 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -71,7 +71,7 @@
 <translation id="3411958449466169012">טיימר כבוי</translation>
 <translation id="3448774564454087943">הסרטון לא נשמר כי הוא קצר מדי</translation>
 <translation id="346539236881580388">צילום חוזר</translation>
-<translation id="3517926952904427380">לא ניתן לצלם לאורך</translation>
+<translation id="3517926952904427380">לא ניתן לצלם תמונת דיוקן</translation>
 <translation id="3566302376254083266">מתבצעת תזוזה לשמאל למעלה</translation>
 <translation id="3569311554794739032">להסיר את <ph name="FILE" />?</translation>
 <translation id="3573890771273113519">מעבר למצב סריקה</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
index d3f30124..2c60644 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -47,12 +47,12 @@
 <translation id="2501278716633472235">Nazaj</translation>
 <translation id="2501853267655415902">Snemanje je ustavljeno</translation>
 <translation id="2501953888035679275">Fotografirajte in snemajte videoposnetke s fotoaparatom.</translation>
-<translation id="2517472476991765520">Išči</translation>
+<translation id="2517472476991765520">Optično preberi</translation>
 <translation id="2549985041256363841">Začetek snemanja</translation>
 <translation id="2577915835281444458">Snemanje bo kmalu ustavljeno. Odprite shrambo v napravi, da sprostite prostor.</translation>
 <translation id="2599796128805996109">Hrbtni fotoaparat</translation>
 <translation id="2759905922487820242"><ph name="CURRENT" />/<ph name="MAXIMAL" /> s</translation>
-<translation id="2761536921376153655">Vrsta iskanja</translation>
+<translation id="2761536921376153655">Vrsta optičnega branja</translation>
 <translation id="28682968802727151">Predogled zrcaljenja</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> je priključena.</translation>
 <translation id="2904654629665923749">Na voljo je optično branje dokumentov</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
index 571edb7a..912d009 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -17,7 +17,7 @@
 <translation id="1467231725790366244">已解除連接「<ph name="CAMERA" />」。</translation>
 <translation id="1473110567575736769">3 秒計時器</translation>
 <translation id="148783771699678004">向右上移動</translation>
-<translation id="1545749641540134597">掃描 QR 圖碼</translation>
+<translation id="1545749641540134597">掃描 QR code</translation>
 <translation id="1560052704389894104">GIF</translation>
 <translation id="1588438908519853928">一般</translation>
 <translation id="1620510694547887537">攝影機</translation>
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index a1c6d019..7bb28bf 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -1348,6 +1348,44 @@
   EXPECT_EQ(requested_size, predicted_capacity);
 }
 
+#if defined(PA_HAS_MEMORY_TAGGING)
+TEST_P(PartitionAllocTest, MTEProtectsFreedPtr) {
+  // This test checks that Arm's memory tagging extension (MTE) is correctly
+  // protecting freed pointers.
+  base::CPU cpu;
+  if (!cpu.has_mte()) {
+    // This test won't pass without MTE support.
+    GTEST_SKIP();
+  }
+
+  // Create an arbitrarily-sized small allocation.
+  size_t alloc_size = 64 - ExtraAllocSize(allocator);
+  uint64_t* ptr1 =
+      static_cast<uint64_t*>(allocator.root()->Alloc(alloc_size, type_name));
+  EXPECT_TRUE(ptr1);
+
+  // Invalidate the pointer by freeing it.
+  allocator.root()->Free(ptr1);
+
+  // When we immediately reallocate a pointer, we should see the same allocation
+  // slot but with a different tag (PA_EXPECT_PTR_EQ ignores the MTE tag).
+  uint64_t* ptr2 =
+      static_cast<uint64_t*>(allocator.root()->Alloc(alloc_size, type_name));
+  PA_EXPECT_PTR_EQ(ptr1, ptr2);
+  // The different tag bits mean that ptr1 is not the same as ptr2.
+  EXPECT_NE(ptr1, ptr2);
+
+  // When we free again, we expect a new tag for that area that's different from
+  // ptr1 and ptr2.
+  allocator.root()->Free(ptr2);
+  uint64_t* ptr3 =
+      static_cast<uint64_t*>(allocator.root()->Alloc(alloc_size, type_name));
+  PA_EXPECT_PTR_EQ(ptr2, ptr3);
+  EXPECT_NE(ptr1, ptr3);
+  EXPECT_NE(ptr2, ptr3);
+}
+#endif  // defined(PA_HAS_MEMORY_TAGGING)
+
 #if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
 TEST_P(PartitionAllocTest, IsValidPtrDelta) {
   if (!UseBRPPool())
@@ -2348,6 +2386,41 @@
                "Passed DoReturnNullTest");
 }
 
+#if defined(PA_HAS_MEMORY_TAGGING)
+// Check that Arm's memory tagging extension (MTE) is correctly protecting
+// freed pointers. Writes to a free pointer should result in a crash.
+TEST_P(PartitionAllocDeathTest, MTEProtectsFreedPtr) {
+  base::CPU cpu;
+  if (!cpu.has_mte()) {
+    // This test won't pass on systems without MTE.
+    GTEST_SKIP();
+  }
+
+  constexpr uint64_t kCookie = 0x1234567890ABCDEF;
+  constexpr uint64_t kQuarantined = 0xEFEFEFEFEFEFEFEF;
+
+  // Make an arbitrary-sized small allocation.
+  size_t alloc_size = 64 - ExtraAllocSize(allocator);
+  uint64_t* ptr =
+      static_cast<uint64_t*>(allocator.root()->Alloc(alloc_size, type_name));
+  EXPECT_TRUE(ptr);
+
+  // Check that the allocation's writable.
+  *ptr = kCookie;
+
+  // Invalidate ptr by freeing it.
+  allocator.root()->Free(ptr);
+
+  // Writing to ptr after free() should crash
+  EXPECT_EXIT(
+      {
+        // Should be in synchronous MTE mode for running this test.
+        *ptr1 = kQuarantined;
+      },
+      testing::KilledBySignal(SIGSEGV), "");
+}
+#endif  // defined(PA_HAS_MEMORY_TAGGING)
+
 // Make sure that malloc(-1) dies.
 // In the past, we had an integer overflow that would alias malloc(-1) to
 // malloc(0), which is not good.
@@ -2439,40 +2512,6 @@
   }
 }
 
-#if defined(PA_HAS_MEMORY_TAGGING)
-TEST_P(PartitionAllocTest, MTEProtectsFreedPtr) {
-  // This test checks that Arm's memory tagging extension is correctly
-  // protecting freed pointers. Writes to a freed pointer should cause a crash.
-  base::CPU cpu;
-  if (!cpu.has_mte()) {
-    // This test won't pass on non-MTE systems.
-    GTEST_SKIP();
-  }
-
-  constexpr uint64_t kCookie = 0x1234567890ABCDEF;
-  constexpr uint64_t kQuarantined = 0xEFEFEFEFEFEFEFEF;
-
-  size_t alloc_size = 64 - ExtraAllocSize(allocator);
-  uint64_t* ptr1 =
-      static_cast<uint64_t*>(allocator.root()->Alloc(alloc_size, type_name));
-  EXPECT_TRUE(ptr1);
-
-  // Write to the pointer whilst it's live
-  *ptr1 = kCookie;
-
-  // Invalidate the pointer on free.
-  allocator.root()->Free(ptr1);
-
-  // Writing to ptr1 after free should crash.
-  EXPECT_EXIT(
-      {
-        // Should be in synchronous MTE mode for running this test.
-        *ptr1 = kQuarantined;
-      },
-      testing::KilledBySignal(SIGSEGV), "");
-}
-#endif  // defined(PA_HAS_MEMORY_TAGGING)
-
 // These tests rely on precise layout. They handle cookie, not ref-count.
 #if !BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) && \
     defined(PA_HAS_FREELIST_SHADOW_ENTRY)
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h
index a38faa469..37c0401 100644
--- a/base/allocator/partition_allocator/partition_root.h
+++ b/base/allocator/partition_allocator/partition_root.h
@@ -1279,7 +1279,10 @@
   if (PA_LIKELY(root->IsMemoryTaggingEnabled())) {
     const size_t slot_size = slot_span->bucket->slot_size;
     if (PA_LIKELY(slot_size <= internal::kMaxMemoryTaggingSize)) {
-      internal::TagMemoryRangeIncrement(slot_start, slot_size);
+      // slot_span is untagged at this point, so we have to recover its tag
+      // again to increment and provide use-after-free mitigations.
+      internal::TagMemoryRangeIncrement(internal::TagAddr(slot_start),
+                                        slot_size);
       // Incrementing the MTE-tag in the memory range invalidates the |object|'s
       // tag, so it must be retagged.
       object = internal::TagPtr(object);
diff --git a/base/values.cc b/base/values.cc
index 3f5381d8..43c5747 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -1581,25 +1581,6 @@
 
 DictionaryValue::DictionaryValue() : Value(Type::DICTIONARY) {}
 
-bool DictionaryValue::GetDictionary(StringPiece path,
-                                    const DictionaryValue** out_value) const {
-  const Value* value = GetDict().FindByDottedPath(path);
-  if (!value || !value->is_dict()) {
-    return false;
-  }
-
-  if (out_value)
-    *out_value = static_cast<const DictionaryValue*>(value);
-
-  return true;
-}
-
-bool DictionaryValue::GetDictionary(StringPiece path,
-                                    DictionaryValue** out_value) {
-  return std::as_const(*this).GetDictionary(
-      path, const_cast<const DictionaryValue**>(out_value));
-}
-
 ///////////////////// ListValue ////////////////////
 
 // static
diff --git a/base/values.h b/base/values.h
index f7db04e..91b3d733 100644
--- a/base/values.h
+++ b/base/values.h
@@ -1251,17 +1251,6 @@
   static std::unique_ptr<DictionaryValue> From(std::unique_ptr<Value> value);
 
   DictionaryValue();
-
-  // These are convenience forms of `Get()`.  The value will be retrieved
-  // and the return value will be true if the path is valid and the value at
-  // the end of the path can be returned in the form specified.
-  // `out_value` is optional and will only be set if non-NULL.
-  //
-  // DEPRECATED: prefer `Value::Dict::FindDict()` (if the path only has one
-  // component, i.e. has no dots), or `Value::Dict::FindDictByDottedPath()`
-  // otherwise.
-  bool GetDictionary(StringPiece path, const DictionaryValue** out_value) const;
-  bool GetDictionary(StringPiece path, DictionaryValue** out_value);
 };
 
 // This type of Value represents a list of other Value values.
diff --git a/base/values_unittest.cc b/base/values_unittest.cc
index 468a97a..a8e834b8 100644
--- a/base/values_unittest.cc
+++ b/base/values_unittest.cc
@@ -2137,22 +2137,22 @@
   base->GetDict().Set("dict", std::move(child->GetDict()));
   EXPECT_EQ(1U, base->DictSize());
 
-  DictionaryValue* original_child;
-  EXPECT_TRUE(base->GetDictionary("dict", &original_child));
+  base::Value::Dict* original_child = base->GetDict().FindDict("dict");
+  EXPECT_FALSE(original_child->empty());
 
   std::unique_ptr<DictionaryValue> merged(new DictionaryValue);
   merged->MergeDictionary(base.get());
   EXPECT_EQ(1U, merged->DictSize());
-  DictionaryValue* ptr;
-  EXPECT_TRUE(merged->GetDictionary("dict", &ptr));
+  base::Value::Dict* ptr = merged->GetDict().FindDict("dict");
+  EXPECT_FALSE(ptr->empty());
   EXPECT_NE(original_child, ptr);
-  value = ptr->GetDict().FindString("test");
+  value = ptr->FindString("test");
   ASSERT_TRUE(value);
   EXPECT_EQ("value", *value);
 
-  original_child->SetStringKey("test", "overwrite");
+  original_child->Set("test", "overwrite");
   base.reset();
-  value = ptr->GetDict().FindString("test");
+  value = ptr->FindString("test");
   ASSERT_TRUE(value);
   EXPECT_EQ("value", *value);
 }
@@ -2246,46 +2246,6 @@
   EXPECT_TRUE(seen2);
 }
 
-// DictionaryValue/ListValue's Get*() methods should accept NULL as an out-value
-// and still return true/false based on success.
-TEST(ValuesTest, GetWithNullOutValue) {
-  DictionaryValue main_dict;
-  ListValue main_list;
-
-  Value bool_value(false);
-  Value int_value(1234);
-  Value double_value(12.34567);
-  Value string_value("foo");
-  Value binary_value(Value::Type::BINARY);
-  DictionaryValue dict_value;
-  ListValue list_value;
-
-  main_dict.SetKey("bool", bool_value.Clone());
-  main_dict.SetKey("int", int_value.Clone());
-  main_dict.SetKey("double", double_value.Clone());
-  main_dict.SetKey("string", string_value.Clone());
-  main_dict.SetKey("binary", binary_value.Clone());
-  main_dict.SetKey("dict", dict_value.Clone());
-  main_dict.SetKey("list", list_value.Clone());
-
-  main_list.Append(bool_value.Clone());
-  main_list.Append(int_value.Clone());
-  main_list.Append(double_value.Clone());
-  main_list.Append(string_value.Clone());
-  main_list.Append(binary_value.Clone());
-  main_list.Append(dict_value.Clone());
-  main_list.Append(list_value.Clone());
-
-  EXPECT_FALSE(main_dict.GetDictionary("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("int", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("double", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("string", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("binary", nullptr));
-  EXPECT_TRUE(main_dict.GetDictionary("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("list", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("DNE", nullptr));
-}
-
 TEST(ValuesTest, SelfSwap) {
   base::Value test(1);
   std::swap(test, test);
diff --git a/build/config/arm.gni b/build/config/arm.gni
index b50fd62..cc82ed5 100644
--- a/build/config/arm.gni
+++ b/build/config/arm.gni
@@ -133,16 +133,14 @@
     # - "pac": Enables Pointer Authentication Code (PAC, featured in Armv8.3)
     # - "standard": Enables both PAC and Branch Target Identification (Armv8.5).
     # - "none": No branch protection.
-    arm_control_flow_integrity = "standard"
+    arm_control_flow_integrity = "none"
 
-    # TODO(cavalcantii): enable the feature for the following OSes next.
-    if (is_mac || is_chromeos || is_fuchsia || is_win ||
-        target_cpu != "arm64") {
-      # target_cpu != "arm64" covers some cases (e.g. the ChromeOS x64 MSAN
-      # build) where the target platform is x64, but V8 is configured to use
-      # the arm64 simulator. Pointer authentication doesn't work properly
-      # in this mode (yet).
-      arm_control_flow_integrity = "none"
+    if ((is_android || is_linux) && target_cpu == "arm64") {
+      # Enable PAC and BTI on AArch64 Linux/Android systems.
+      # target_cpu == "arm64" filters out some cases (e.g. the ChromeOS x64
+      # MSAN build) where the target platform is x64, but V8 is configured to
+      # use the arm64 simulator.
+      arm_control_flow_integrity = "standard"
     }
   }
   assert(arm_control_flow_integrity == "none" ||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
index 3023144..c16619f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -29,7 +29,8 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.base.task.AsyncTask;
+import org.chromium.base.task.PostTask;
+import org.chromium.base.task.TaskTraits;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.flags.BooleanCachedFieldTrialParameter;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -39,6 +40,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
 import org.chromium.chrome.browser.ui.native_page.FrozenNativePage;
 import org.chromium.chrome.browser.ui.native_page.NativePage;
+import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.display.DisplayAndroid;
 import org.chromium.url.GURL;
@@ -466,65 +468,61 @@
         // Try JPEG thumbnail first before using the more costly
         // TabContentManagerJni.get().getEtc1TabThumbnail.
         TraceEvent.startAsync("GetTabThumbnailFromDisk", tabId);
-        new AsyncTask<Bitmap>() {
-            @Override
-            public Bitmap doInBackground() {
-                return getJpegForTab(tabId, thumbnailSize);
-            }
+        PostTask.postTask(TaskTraits.USER_VISIBLE_MAY_BLOCK, () -> {
+            Bitmap bitmap = getJpegForTab(tabId, thumbnailSize);
+            PostTask.postTask(UiThreadTaskTraits.USER_VISIBLE,
+                    () -> { onBitmapRead(tabId, bitmap, callback); });
+        });
+    }
 
-            @Override
-            public void onPostExecute(Bitmap jpeg) {
-                TraceEvent.finishAsync("GetTabThumbnailFromDisk", tabId);
-                mOnTheFlyRequests--;
-                if (mOnTheFlyRequests == 0 && !mLastThumbnailHappened) {
-                    mLastThumbnailHappened = true;
-                    mNumOfThumbnailsForLastThumbnail = mRequests;
-                    notifyOnLastThumbnail();
-                }
-                if (jpeg != null) {
-                    if (ALLOW_TO_REFETCH_TAB_THUMBNAIL_VARIATION.getValue()) {
-                        // TODO(crbug.com/1344354): compare the height instead of pixel tolerance.
-                        double jpegAspectRatio = jpeg.getHeight() == 0
-                                ? 0
-                                : 1.0 * jpeg.getWidth() / jpeg.getHeight();
-                        // Retry fetching thumbnail once for all tabs that are:
-                        //  * Thumbnail's aspect ratio is different from the expected ratio.
-                        if (!mRefectchedTabIds.contains(tabId)
-                                && Math.abs(jpegAspectRatio - getTabCaptureAspectRatio())
-                                        >= ASPECT_RATIO_PRECISION) {
-                            recordThumbnailFetchingResult(
-                                    ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG);
+    private void onBitmapRead(@NonNull int tabId, Bitmap jpeg, @NonNull Callback<Bitmap> callback) {
+        TraceEvent.finishAsync("GetTabThumbnailFromDisk", tabId);
+        mOnTheFlyRequests--;
+        if (mOnTheFlyRequests == 0 && !mLastThumbnailHappened) {
+            mLastThumbnailHappened = true;
+            mNumOfThumbnailsForLastThumbnail = mRequests;
+            notifyOnLastThumbnail();
+        }
+        if (jpeg != null) {
+            if (ALLOW_TO_REFETCH_TAB_THUMBNAIL_VARIATION.getValue()) {
+                // TODO(crbug.com/1344354): compare the height instead of pixel tolerance.
+                double jpegAspectRatio =
+                        jpeg.getHeight() == 0 ? 0 : 1.0 * jpeg.getWidth() / jpeg.getHeight();
+                // Retry fetching thumbnail once for all tabs that are:
+                //  * Thumbnail's aspect ratio is different from the expected ratio.
+                if (!mRefectchedTabIds.contains(tabId)
+                        && Math.abs(jpegAspectRatio - getTabCaptureAspectRatio())
+                                >= ASPECT_RATIO_PRECISION) {
+                    recordThumbnailFetchingResult(
+                            ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG);
 
-                            if (mNativeTabContentManager == 0) {
-                                callback.onResult(jpeg);
-                                return;
-                            }
-                            if (!mSnapshotsEnabled) return;
-
-                            mRefectchedTabIds.add(tabId);
-                            TabContentManagerJni.get().getEtc1TabThumbnail(mNativeTabContentManager,
-                                    TabContentManager.this, tabId, getTabCaptureAspectRatio(),
-                                    callback);
-                            return;
-                        }
+                    if (mNativeTabContentManager == 0) {
+                        callback.onResult(jpeg);
+                        return;
                     }
-                    recordThumbnailFetchingResult(ThumbnailFetchingResult.GOT_JPEG);
+                    if (!mSnapshotsEnabled) return;
 
-                    callback.onResult(jpeg);
+                    mRefectchedTabIds.add(tabId);
+                    TabContentManagerJni.get().getEtc1TabThumbnail(mNativeTabContentManager,
+                            TabContentManager.this, tabId, getTabCaptureAspectRatio(), callback);
                     return;
                 }
-                if (mNativeTabContentManager == 0 || !mSnapshotsEnabled) return;
-                TabContentManagerJni.get().getEtc1TabThumbnail(mNativeTabContentManager,
-                        TabContentManager.this, tabId, getTabCaptureAspectRatio(), (etc1) -> {
-                            if (etc1 != null) {
-                                recordThumbnailFetchingResult(ThumbnailFetchingResult.GOT_ETC1);
-                            } else {
-                                recordThumbnailFetchingResult(ThumbnailFetchingResult.GOT_NOTHING);
-                            }
-                            callback.onResult(etc1);
-                        });
             }
-        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+            recordThumbnailFetchingResult(ThumbnailFetchingResult.GOT_JPEG);
+
+            callback.onResult(jpeg);
+            return;
+        }
+        if (mNativeTabContentManager == 0 || !mSnapshotsEnabled) return;
+        TabContentManagerJni.get().getEtc1TabThumbnail(mNativeTabContentManager,
+                TabContentManager.this, tabId, getTabCaptureAspectRatio(), (etc1) -> {
+                    if (etc1 != null) {
+                        recordThumbnailFetchingResult(ThumbnailFetchingResult.GOT_ETC1);
+                    } else {
+                        recordThumbnailFetchingResult(ThumbnailFetchingResult.GOT_NOTHING);
+                    }
+                    callback.onResult(etc1);
+                });
     }
 
     private static void recordThumbnailFetchingResult(@ThumbnailFetchingResult int result) {
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index a502a72a..fb3b2f6c 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -10350,6 +10350,9 @@
       <message name="IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_BOOKMARKS" desc="This string appears as an item in a list of sync data types on a page that asks users if they want to turn on sync. Translate 'bookmarks' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=59c31bb. Used in the tangible sync confirmation page.">
         Bookmarks
       </message>
+      <message name="IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_READING_LIST" desc="This string appears as an item in a list of sync data types on a page that asks users if they want to turn on sync. Translate 'reading list' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=4de6a318. Used in the tangible sync confirmation page.">
+        Reading List
+      </message>
       <message name="IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_AUTOFILL" desc="This string appears as an item in a list of sync data types on a page that asks users if they want to turn on sync. Translate 'autofill' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=77d3626. Used in the tangible sync confirmation page.">
         Autofill
       </message>
@@ -14197,106 +14200,6 @@
     </message>
 
     <!-- Privacy Sandbox Notice Dialog M1 strings -->
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_TITLE" translateable="false" desc="Title of privacy sandbox notice EEA dialog">
-      Lorem ipsum Notice EEA
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_DESCRIPTION_1" translateable="false" desc="First part of description in privacy sandbox notice EEA dialog">
-      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pretium pulvinar metus non mollis. Quisque placerat eget nisl sit amet facilisis.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_1" translateable="false" desc="First bullet point in the description in privacy sandbox notice EEA dialog">
-      Nulla in tortor: a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_2" translateable="false" desc="Second bullet point in the description in privacy sandbox notice EEA dialog">
-      Sed purus vestibulum: velit convallis suscipit. Aenean aliquam ut velit eget dapibus. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_EXPAND_LABEL" translateable="false" desc="Learn more expand label in privacy sandbox notice EEA dialog">
-      Vestibulum orci risus, consectetur
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_DESCRIPTION_2" translateable="false" desc="Second part of description in privacy sandbox notice EEA dialog">
-      Consectetur adipiscing elit duis pretium pulvinar metus non mollis
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_ACK_BUTTON" translateable="false" desc="Acknowledge button label in privacy sandbox notice EEA dialog">
-      Sed
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_SETTINGS_BUTTON" translateable="false" desc="Open settings button label in privacy sandbox notice EEA dialog">
-      Cras id
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_HEADING_1" translateable="false" desc="Learn more first heading in privacy sandbox notice EEA dialog">
-      Esed purus vestibulum velit convalli
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_DESCRIPTION" translateable="false" desc="Learn more description in privacy sandbox notice EEA dialog">
-      Nulla in tortor a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit. Integer et libero id metus egestas consequat non a ipsum.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_HEADING_2" translateable="false" desc="Learn more second heading in privacy sandbox notice EEA dialog">
-      Proin sed purus vestibulum velit velit eget dapibus.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_1" translateable="false" desc="Learn more bullet point 1 in privacy sandbox notice EEA dialog">
-      <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Nulla in tortor:<ph name="END_BOLD">&lt;/b&gt;</ph> a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_2" translateable="false" desc="Learn more bullet point 2 in privacy sandbox notice EEA dialog">
-      <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Consectetur adipiscing elit:<ph name="END_BOLD">&lt;/b&gt;</ph> Duis pretium pulvinar metus non mollis
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_3" translateable="false" desc="Learn more bullet point 3 in privacy sandbox notice EEA dialog">
-      <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Sed purus vestibulum:<ph name="END_BOLD">&lt;/b&gt;</ph> velit convallis suscipit. Aenean aliquam ut velit eget dapibus. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-    </message>
-
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_TITLE" translateable="false" desc="Title of privacy sandbox notice ROW dialog">
-       Lorem ipsum Notice ROW
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_1" translateable="false" desc="First part of description in privacy sandbox notice ROW dialog">
-       Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pretium pulvinar metus non mollis.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_2" translateable="false" desc="Second part of description in privacy sandbox notice ROW dialog">
-      Nulla in tortor a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit. Integer et libero id metus egestas consequat non a ipsum. Quisque placerat eget nisl sit amet facilisis.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_3" translateable="false" desc="Third part of description in privacy sandbox notice ROW dialog">
-      Vestibulum pretium placerat justo vel suscipit. Quisque urna arcu, elementum ut venenatis ornare, consequat ac turpis. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_4" translateable="false" desc="Fourth part of description in privacy sandbox notice ROW dialog">
-      Proin sed purus vestibulum velit convallis suscipit eget dapibus.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_ACK_BUTTON" translateable="false" desc="Acknowledge button label in privacy sandbox notice EEA dialog">
-      Sed
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_SETTINGS_BUTTON" translateable="false" desc="Open settings button label in privacy sandbox notice EEA dialog">
-      Cras id
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_EXPAND_LABEL" translateable="false" desc="Learn more expand label in privacy sandbox notice ROW dialog">
-      Vestibulum orci risus consectetur
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_1" translateable="false" desc="Learn more first heading in privacy sandbox notice ROW dialog">
-      Esed purus vestibulum velit convalli
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_1" translateable="false" desc="First part of learn more description in privacy sandbox notice ROW dialog">
-      Etiam dictum sem et neque molestie lobortis. Morbi quam tellus, tincidunt eget dapibus ac, lobortis et lacus. Integer nec egestas elit. Nulla venenatis facilisis dui eget suscipit.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_2" translateable="false" desc="Learn more second heading in privacy sandbox notice ROW dialog">
-      Class aptent taciti sociosqu ad
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_2" translateable="false" desc="Second part of learn more description in privacy sandbox notice ROW dialog">
-      Vestibulum pretium placerat justo vel suscipit. Quisque urna arcu.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_BULLET_1" translateable="false" desc="Learn more bullet point 1 in privacy sandbox notice ROW dialog">
-      Sed elementum tellus condimentum quam vestibulum lacinia. Ut eu lobortis massa, venenatis sodales lacus. Nulla elementum magna et tortor efficitur, at volutpat metus varius.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_BULLET_2" translateable="false" desc="Learn more bullet point 2 in privacy sandbox notice ROW dialog">
-      Duis tempor nulla nisi, ac bibendum lorem tempus sit amet. Proin non blandit risus. Maecenas facilisis enim nec tristique tristique. Eelementum ut venenatis ornare, consequat ac turpis. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_3" translateable="false" desc="Third part of learn more description in privacy sandbox notice ROW dialog">
-      Etiam hendrerit turpis nibh, ac maximus lectus placerat at. Vivamus ligula quam, posuere luctus felis eu, dictum egestas arcu. per conubia nostra, per inceptos himenaeos. Cras ut metus vel est molestie finibus nec ut orci.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_4" translateable="false" desc="Fourth part of learn more description in privacy sandbox notice ROW dialog">
-      Aliquam euismod scelerisque metus, in aliquet est vehicula ut. Curabitur sit amet ligula quis ante maximus gravida non id magna. Pellentesque interdum venenatis leo, at ultrices felis mollis nec. Integer vulputate velit eget mauris lacinia, ut ullamcorper mauris vehicula.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_3" translateable="false" desc="Learn more third heading in privacy sandbox notice ROW dialog">
-      Orci varius natoque penatibus et
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_5" translateable="false" desc="Fifth part of description in privacy sandbox notice ROW dialog">
-      Suspendisse at dui pulvinar, rhoncus orci at, porttitor nibh. Curabitur lacinia nulla sem, eu euismod dolor vulputate quis. Duis mattis eros et arcu elementum tempor. Duis pharetra eleifend sagittis.
-    </message>
-    <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_6" translateable="false" desc="Sixth part of description in privacy sandbox notice ROW dialog">
-      Cras sed lacus suscipit, efficitur erat nec, semper sapien. Fusce at nunc molestie, elementum augue at, auctor nunc. Sed dui nisi, consectetur sit amet urna vitae, facilisis scelerisque justo.
-    </message>
     <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_BANNER_IMAGE_A11Y_DESCRIPTION" translateable="false" desc="A11y description for the banner image in privacy sandbox notice ROW dialog">
       Ut venenatis magna nec lacus facilisis
     </message>
diff --git a/chrome/app/generated_resources_grd/IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_READING_LIST.png.sha1 b/chrome/app/generated_resources_grd/IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_READING_LIST.png.sha1
new file mode 100644
index 0000000..d13c124
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_READING_LIST.png.sha1
@@ -0,0 +1 @@
+85000668d969131542524a228be15f24a4b51afd
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index 3ed4a33..cd8cbbd 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Hierdie toestel is in ander domein of modus gesluit.</translation>
 <translation id="2255317897038918278">Microsoft-tydstempel</translation>
 <translation id="2256115617011615191">Herbegin nou</translation>
+<translation id="225614027745146050">Welkom</translation>
 <translation id="2257053455312861282">As 'n skoolrekening bygevoeg word, is dit vir 'n student maklik om by webwerwe, uitbreidings en programme aan te meld terwyl hulle steeds onder ouertoesig is.</translation>
 <translation id="2261323523305321874">Jou administrateur het 'n stelselwye verandering gemaak wat sommige ou profiele deaktiveer</translation>
 <translation id="22614517036276112">Hierdie dokument of jou toestel voldoen nie aan sommige van jou organisasie se sekuriteitsbeleide nie. Vind uit by jou admin wat reggestel moet word.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 98925f7..97dbb26 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1409,6 +1409,7 @@
 <translation id="2255077166240162850">ይህ መሣሪያ ከተለየ ጎራ ወይም ሁነታ ጋር ተቆልፏል።</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">አሁን ዳግም አስጀምር</translation>
+<translation id="225614027745146050">እንኳን ደህና መጡ</translation>
 <translation id="2257053455312861282">የትምህርት ቤት መለያን ማከል በወላጅ ቁጥጥሮች ሥር ሆኖ እየሰሩ እንደ ተማሪ ሆኖ በቀላሉ በመለያ ወደ ድር ጣቢያዎች፣ ቅጥያዎች እና መተግበሪያዎች መግባትን ያስችላል።</translation>
 <translation id="2261323523305321874">የእርስዎ አስተዳዳሪ አንዳንድ የቆዩ መገለጫዎችን የሚያሰናክል ሙሉ ስርዓት ለውጦችን አድርገዋል።</translation>
 <translation id="22614517036276112">ይህ ሰነድ ወይም የእርስዎ መሣሪያ አንዳንድ የድርጅትዎን የደህንነት መመሪያዎች አያሟላም። ምን መስተካከል እንዳለበት ለማወቅ አስተዳዳሪዎን ያነጋግሩ።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 94dff0a..eda0bad 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1405,6 +1405,7 @@
 <translation id="2255077166240162850">تم تقييد الجهاز بوضع أو بنطاق آخر.</translation>
 <translation id="2255317897038918278">‏الطابع الزمني لـ Microsoft</translation>
 <translation id="2256115617011615191">إعادة التشغيل الآن</translation>
+<translation id="225614027745146050">مرحبًا</translation>
 <translation id="2257053455312861282">تتيح إضافة حساب مؤسسة تعليمية للطلاب سهولة تسجيل الدخول إلى المواقع الإلكترونية والإضافات والتطبيقات حتى إذا كانت أدوات الرقابة الأبوية مفعَّلة.</translation>
 <translation id="2261323523305321874">أجرى المشرف تغييرًا عبر النظام بأكمله يعمل على إيقاف بعض الملفات الشخصية القديمة.</translation>
 <translation id="22614517036276112">لا يستوفي هذا المستند أو جهازك متطلبات بعض سياسات الأمان لدى مؤسستك. يُرجى التواصل مع المشرف لمعرفة ما يجب تعديله.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 4d42f5d..5f01c3c 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1411,6 +1411,7 @@
 <translation id="2255077166240162850">এই ডিভাইচটো অন্য ড’মেইন বা ম’ডত লক কৰা হৈছে।</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">এতিয়াই ৰিষ্টার্ট কৰক</translation>
+<translation id="225614027745146050">স্বাগতম</translation>
 <translation id="2257053455312861282">এটা বিদ্যালয়ৰ একাউণ্ট যোগ দিয়া কাৰ্যই এগৰাকী শিক্ষাৰ্থী হিচাপে অভিভাৱকীয় নিয়ন্ত্ৰণসমূহৰ অধীনত কাৰ্য সম্পাদন কৰিও ৱেবছাইট আৰু এক্সটেনশ্বনসমূহত তথা এপ্‌সমূহত ছাইন ইন কৰাটো সহজ কৰি তোলে।</translation>
 <translation id="2261323523305321874">আপোনাৰ প্ৰশাসকে কৰা সমগ্ৰ ছিষ্টেমতে প্ৰভাৱ পেলোৱা কোনো সলনি কার্যয়ে কিছুমান পুৰণি প্ৰ'ফাইল অক্ষম কৰিছে।</translation>
 <translation id="22614517036276112">এই নথি অথবা আপোনাৰ ডিভাইচে আপোনাৰ প্ৰতিষ্ঠানৰ কিছুমান সুৰক্ষা নীতি মানি চলা নাই। কি ঠিক কৰিব লাগে সেই বিষয়ে আপোনাৰ প্ৰশাসকৰ পৰা জানক।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 929e8e6..3b8f191f 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1397,6 +1397,7 @@
 <translation id="2255077166240162850">Bu cihaz müxtəlif domen və ya rejimlə kilidləndi.</translation>
 <translation id="2255317897038918278">Microsoft Zaman Möhürləməsi</translation>
 <translation id="2256115617011615191">İndi yenidən başladın</translation>
+<translation id="225614027745146050">Xoş gəlmisiniz</translation>
 <translation id="2257053455312861282">Məktəb hesabının əlavə edilməsi valideyn nəzarəti altında işləyərkən tələbələrin vebsaytlara, artırmalara və tətbiqlərə asan giriş etməsini təmin edir.</translation>
 <translation id="2261323523305321874">Administrator bəzi köhnə profilləri deaktiv edən sistem dəyişikliyi etdi.</translation>
 <translation id="22614517036276112">Bu sənəd və ya cihazınız təşkilatınızın bəzi təhlükəsizlik siyasətlərinə uyğun gəlmir. Nəyin düzəldilməli olduğunu admininizlə dəqiqləşdirin.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index c68548e..2be1219 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1240,6 +1240,7 @@
 <translation id="2104166991923847969">Аўтаматычна выключаць хот-спот</translation>
 <translation id="2105809836724866556">Схавана: <ph name="MODULE_TITLE" /></translation>
 <translation id="2108349519800154983">{COUNT,plural, =1{Нумар тэлефона}one{# нумар тэлефона}few{# нумары тэлефонаў}many{# нумароў тэлефонаў}other{# нумара тэлефона}}</translation>
+<translation id="2110941575868943054">Дазволена шукаць прылады з Bluetooth</translation>
 <translation id="211144231511833662">Скасаваць выбар тыпаў прылад</translation>
 <translation id="2111670510994270194">Новая ўкладка справа</translation>
 <translation id="2112554630428445878">Вітаем, <ph name="USERNAME" /></translation>
@@ -1403,6 +1404,7 @@
 <translation id="2255077166240162850">Гэта прылада прывязана да іншага дамена або зафіксавана ў іншым рэжыме.</translation>
 <translation id="2255317897038918278">Меткі часу Microsoft</translation>
 <translation id="2256115617011615191">Перазапусціць</translation>
+<translation id="225614027745146050">Вітаем</translation>
 <translation id="2257053455312861282">Калі дадаць навучальны ўліковы запіс, карыстальнік зможа лёгка ўваходзіць на вэб-сайты, у пашырэнні і праграмы ў якасці вучня, застаючыся пры гэтым пад бацькоўскім кантролем.</translation>
 <translation id="2261323523305321874">Адміністратар зрабіў агульнасістэмную змену, якая выключае некаторыя старыя профілі.</translation>
 <translation id="22614517036276112">Гэты дакумент або ваша прылада не адпавядаюць некаторым палітыкам бяспекі вашай арганізацыі. Каб вырашыць праблемы, з якімі вы сутыкнуліся, звяжыцеся з адміністратарам.</translation>
@@ -3031,6 +3033,7 @@
 <translation id="3756485814916578707">Экран трансліруецца</translation>
 <translation id="3756578970075173856">Задаць PIN-код</translation>
 <translation id="3756795331760037744">Дазвольце Памочніку Google дапамагаць, выкарыстоўваючы інфармацыю на экране карыстальніка <ph name="SUPERVISED_USER_NAME" /></translation>
+<translation id="3756806135608816820">Сайты могуць запытваць дазвол на пошук прылад з Bluetooth</translation>
 <translation id="3757733214359997190">Сайты не знойдзены</translation>
 <translation id="375841316537350618">Ідзе спампоўванне сцэнарыя проксі-сервера...</translation>
 <translation id="3758842566811519622">Файлы cookie зададзены</translation>
@@ -3801,6 +3804,7 @@
 <translation id="4469762931504673593">Сайт <ph name="ORIGIN" /> можа змяняць файлы ў папцы <ph name="FOLDERNAME" /></translation>
 <translation id="4470957202018033307">Параметры знешняга сховішча</translation>
 <translation id="4471354919263203780">Ідзе спампоўванне файлаў распазнавання маўлення... <ph name="PERCENT" />%</translation>
+<translation id="4472298120638043495">Вы можаце карыстацца сваёй пажаданай мовай для ўліковага запісу Google (<ph name="NEW_LOCALE_FROM_GAIA" />)</translation>
 <translation id="447252321002412580">Дапамажыце палепшыць функцыі і прадукцыйнасць Chrome</translation>
 <translation id="4472575034687746823">Пачаць</translation>
 <translation id="4474155171896946103">Дадаць у закладкі ўсе ўкладкі...</translation>
@@ -5004,6 +5008,7 @@
 <translation id="5600706100022181951">Для спампоўкі абнаўлення спатрэбіцца <ph name="UPDATE_SIZE_MB" /> МБ мабільнага трафіка. Працягнуць?</translation>
 <translation id="5601503069213153581">PIN-код</translation>
 <translation id="5601823921345337195">Не дазволена падключацца да прылад MIDI</translation>
+<translation id="5601833336918638013">Сайтам забаронена шукаць прылады з Bluetooth</translation>
 <translation id="5602765853043467355">Выдаліць закладкі, гісторыю, паролі і іншае з гэтай прылады</translation>
 <translation id="5605758115928394442">Вам на тэлефон для пацвярджэння вашай асобы адпраўлена апавяшчэнне.</translation>
 <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Гэта пашырэнне заблакіравана}one{Гэтыя пашырэнні заблакіраваны}few{Гэтыя пашырэнні заблакіраваны}many{Гэтыя пашырэнні заблакіраваны}other{Гэтыя пашырэнні заблакіраваны}}</translation>
@@ -6467,6 +6472,7 @@
 <translation id="6960507406838246615">Патрабуецца абнаўленне Linux</translation>
 <translation id="6960648667961844909">Не ўдалося спампаваць файлы для распазнавання маўлення на наступнай мове: <ph name="LANGUAGE" />. Спроба спампаваць будзе зроблена пазней. Да завяршэння спампоўвання аўдыяматэрыял адпраўляецца для апрацоўкі ў Google.</translation>
 <translation id="696103774840402661">Усе файлы і лакальныя даныя ўсіх карыстальнікаў прылады <ph name="DEVICE_TYPE" /> выдалены назаўсёды.</translation>
+<translation id="6961327401577924850">Сайты звычайна шукаюць прылады з Bluetooth, каб выкарыстоўваць такія функцыі, як наладжванне ці сінхранізацыя маячкоў, фітнес-трэкераў або разумных лямпачак</translation>
 <translation id="6963872466817251924">Вылучэнне тэкставага курсора</translation>
 <translation id="6964390816189577014">Герой</translation>
 <translation id="6964760285928603117">Выдаліць з групы</translation>
@@ -6743,6 +6749,7 @@
 <translation id="7227458944009118910">Пералічаныя ніжэй праграмы таксама могуць апрацоўваць спасылкі пратаколаў. Іншыя праграмы будуць запытваць дазвол.</translation>
 <translation id="7228056665272655255">Каб наладзіць выкарыстанне адбітка пальца, папрасіце дзіця дакрануцца да сканера адбіткаў пальцаў у правым верхнім вугле клавіятуры. Даныя адбіткаў пальцаў дзіцяці надзейна захоўваюцца на прыладзе <ph name="DEVICE_TYPE" /> і нікуды не перадаюцца.</translation>
 <translation id="7228523857728654909">Блакіроўка экрана і ўваход</translation>
+<translation id="7228854227189381547">Не пераключацца</translation>
 <translation id="7230222852462421043">Аднавіць акно</translation>
 <translation id="7231260028442989757">Праглядайце і закрывайце апавяшчэнні з тэлефона або адказвайце на іх</translation>
 <translation id="7232750842195536390">Не ўдалося перайменаваць</translation>
@@ -7076,6 +7083,7 @@
 <translation id="7545466883021407599">Не ўдалося падключыцца да сервера. Праверце падключэнне да сеткі і паўтарыце спробу. Калі праблема не знікла, паспрабуйце перазапусціць Chromebook. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="7547317915858803630">Увага! Налады <ph name="PRODUCT_NAME" /> захоўваюцца на сеткавым дыску. Гэта можа прывесці да запавольвання працы, збояў і нават страты даных.</translation>
 <translation id="7548856833046333824">Ліманад</translation>
+<translation id="7549434883223124329">Змяніць мову прылады?</translation>
 <translation id="7550830279652415241">закладкі_<ph name="DATESTAMP" />.html</translation>
 <translation id="7551059576287086432">Не ўдалося спампаваць файл "<ph name="FILE_NAME" />"</translation>
 <translation id="7551643184018910560">Замацаваць на паліцы</translation>
@@ -8101,6 +8109,7 @@
 <translation id="8465444703385715657">Убудове "<ph name="PLUGIN_NAME" />" для запуску патрабуецца ваш дазвол</translation>
 <translation id="8466417995783206254">Гэта ўкладка прайграе відэа ў рэжыме "відарыс у відарысе".</translation>
 <translation id="8467326454809944210">Выбраць іншую мову</translation>
+<translation id="8468087214092422866">Забаронена шукаць прылады з Bluetooth</translation>
 <translation id="8470513973197838199">Захаваныя паролі для сайта <ph name="ORIGIN" /></translation>
 <translation id="8471525937465764768">Сайты звычайна падключаюцца да прылад USB для работы такіх функцый, як друкаванне дакументаў або захаванне даных на прыладзе знешняга сховішча</translation>
 <translation id="8471959340398751476">Функцыя пошуку скідак выключана. Уключыць яе можна праз меню наладжвання</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 22185d9..3c51d935 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1409,6 +1409,7 @@
 <translation id="2255077166240162850">Това устройство е заключено в друг домейн или режим.</translation>
 <translation id="2255317897038918278">Поставяне на времево клеймо от Microsoft</translation>
 <translation id="2256115617011615191">Рестартиране сега</translation>
+<translation id="225614027745146050">Добре дошли</translation>
 <translation id="2257053455312861282">С добавянето на училищен профил можете лесно да влизате като ученик в уебсайтове, разширения и приложения, докато функцията за родителски контроли е активна.</translation>
 <translation id="2261323523305321874">Администраторът направи промяна на ниво система, за да деактивира някои стари потребителски профили.</translation>
 <translation id="22614517036276112">Този документ или устройството ви не спазват някои от правилата за сигурност на организацията ви. Попитайте администратора си какво трябва да се коригира.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 67fcec9..5a5d009a 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">এই ডিভাইসটি আলাদা ডোমেন বা মোডে লক করা আছে।</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">এখন আবার চালু করুন</translation>
+<translation id="225614027745146050">স্বাগতম</translation>
 <translation id="2257053455312861282">স্কুল অ্যাকাউন্ট যোগ করলে শিক্ষার্থী হিসেবে ওয়েবসাইট, এক্সটেনশন ও অ্যাপে সহজে সাইন-ইন করা যায়, যদিও তাকে তখনও অভিভাবকীয় নিয়ন্ত্রণের অধীনেই কাজ করতে হয়।</translation>
 <translation id="2261323523305321874">আপনার প্রশাসক সিস্টেম জুড়ে কিছু পরিবর্তন করেছে যার ফলে কিছু পুরনো প্রোফাইল বন্ধ করা হয়েছে।</translation>
 <translation id="22614517036276112">এই ডকুমেন্ট বা আপনার ডিভাইস, সংস্থার কিছু নিরাপত্তা সংক্রান্ত নীতি পূরণ করেনি। সমাধানের জন্য কী করতে হবে তা জানতে আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 2f9a4680..aa61014d 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1412,6 +1412,7 @@
 <translation id="2255077166240162850">Ovaj uređaj je bio zaključan za neku drugu domenu ili način rada.</translation>
 <translation id="2255317897038918278">Microsoft vremensko označavanje</translation>
 <translation id="2256115617011615191">Ponovo pokreni sada</translation>
+<translation id="225614027745146050">Dobro došli</translation>
 <translation id="2257053455312861282">Dodavanje školskog računa omogućava učenicima jednostavnu prijavu na web lokacije, ekstenzije i u aplikacije dok i dalje rade pod roditeljskim nadzorom.</translation>
 <translation id="2261323523305321874">Vaš administrator je izvršio promjenu na sistemu kojom se onemogućavaju neki stari profili.</translation>
 <translation id="22614517036276112">Ovaj dokument ili vaš uređaj nije u skladu s nekim sigurnosnim pravilima vaše organizacije. Provjerite s administratorom šta treba ispraviti.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 3ae68b10..30a29ff2 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">Aquest dispositiu s'ha bloquejat amb un domini o un mode diferents.</translation>
 <translation id="2255317897038918278">Marques de temps de Microsoft</translation>
 <translation id="2256115617011615191">Reinicia ara</translation>
+<translation id="225614027745146050">Et donem la benvinguda</translation>
 <translation id="2257053455312861282">Afegir un compte de centre educatiu permet iniciar fàcilment la sessió en llocs web, extensions i aplicacions com a alumne alhora que els controls parentals es continuen aplicant.</translation>
 <translation id="2261323523305321874">L'administrador ha fet un canvi que desactiva alguns perfils antics en tot el sistema.</translation>
 <translation id="22614517036276112">Aquest document o el dispositiu no compleixen algunes de les polítiques de seguretat de la teva organització. Consulta al teu administrador què cal corregir.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index a0c15863..1730f1d 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1403,6 +1403,7 @@
 <translation id="2255077166240162850">Toto zařízení bylo uzamknuto pro jinou doménu nebo režim.</translation>
 <translation id="2255317897038918278">Časové razítko standardu Microsoft</translation>
 <translation id="2256115617011615191">Restartovat</translation>
+<translation id="225614027745146050">Vítejte</translation>
 <translation id="2257053455312861282">Po přidání školního účtu se dítě bude moci přihlašovat na weby, do rozšíření a do aplikací jako student, přičemž zůstane aktivní rodičovská kontrola.</translation>
 <translation id="2261323523305321874">Administrátor provedl celosystémovou změnu, která zakazuje některé staré profily.</translation>
 <translation id="22614517036276112">Tento dokument nebo vaše zařízení nesplňuje některé zásady zabezpečení vaší organizace. Zeptejte se administrátora, co je potřeba opravit.</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index 659040f..45520daf 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -1416,6 +1416,7 @@
 <translation id="2255077166240162850">Mae'r ddyfais hon wedi'i chloi i barth neu fodd gwahanol.</translation>
 <translation id="2255317897038918278">Stampio Amser Microsoft</translation>
 <translation id="2256115617011615191">Ailgychwyn nawr</translation>
+<translation id="225614027745146050">Croeso</translation>
 <translation id="2257053455312861282">Mae ychwanegu cyfrif ysgol yn galluogi mewngofnodi'n hawdd i wefannau, estyniadau ac apiau fel myfyriwr wrth barhau i weithredu o dan reolaethau rhieni.</translation>
 <translation id="2261323523305321874">Mae eich gweinyddwr wedi gwneud newid ar draws y system sy'n analluogi rhai hen broffiliau.</translation>
 <translation id="22614517036276112">Nid yw'r ddogfen hon neu eich dyfais yn bodloni rhai o bolisïau diogelwch eich sefydliad. Gwiriwch gyda'ch gweinyddwr beth sydd angen ei drwsio.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index ccd01b0..07cab5b 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">Denne enhed blev låst til brug på et andet domæne eller i en anden tilstand.</translation>
 <translation id="2255317897038918278">Microsoft-tidsstempling</translation>
 <translation id="2256115617011615191">Genstart nu</translation>
+<translation id="225614027745146050">Velkommen</translation>
 <translation id="2257053455312861282">Hvis du tilføjer en skolekonto, kan du nemt logge ind på websites, i udvidelser og i apps som elev, mens du stadig er underlagt forældreindstillinger.</translation>
 <translation id="2261323523305321874">Din administrator har foretaget en systemændring, der deaktiverer nogle gamle profiler.</translation>
 <translation id="22614517036276112">Dette dokument eller din enhed overholder ikke alle din organisationens sikkerhedspolitikker. Spørg din administrator, hvad der skal rettes.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 5fb12ef..8c9ad863 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">Dieses Gerät wurde zur ausschließlichen Nutzung in einer anderen Domain oder in einem anderen Modus eingerichtet.</translation>
 <translation id="2255317897038918278">Microsoft-Zeitstempeldienst</translation>
 <translation id="2256115617011615191">Jetzt neu starten</translation>
+<translation id="225614027745146050">Willkommen</translation>
 <translation id="2257053455312861282">Das Hinzufügen eines Kontos einer Bildungseinrichtung ermöglicht Schülern eine einfache Anmeldung bei Websites, Erweiterungen und Apps bei gleichzeitig aktivierten Jugendschutzeinstellungen.</translation>
 <translation id="2261323523305321874">Dein Administrator hat eine systemweite Änderung vorgenommen, durch die einige alte Profile deaktiviert werden.</translation>
 <translation id="22614517036276112">Dieses Dokument oder dein Gerät entspricht nicht allen Sicherheitsrichtlinien deiner Organisation. Frage deinen Administrator, was korrigiert werden muss.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index e5e0258..be95161 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Αυτή η συσκευή κλειδώθηκε σε διαφορετικό τομέα ή λειτουργία.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">Άμεση επανεκκίνηση</translation>
+<translation id="225614027745146050">Καλώς ορίσατε</translation>
 <translation id="2257053455312861282">Η προσθήκη ενός σχολικού λογαριασμού επιτρέπει την εύκολη σύνδεση σε ιστοτόπους, επεκτάσεις και εφαρμογές με την ιδιότητα του μαθητή, ενώ εξακολουθούν να ισχύουν οι γονικοί έλεγχοι.</translation>
 <translation id="2261323523305321874">Ο διαχειριστής σας έκανε μια αλλαγή σε ολόκληρο το σύστημα που απενεργοποιεί ορισμένα παλιά προφίλ.</translation>
 <translation id="22614517036276112">Αυτό το έγγραφο ή η συσκευή σας δεν συμμορφώνεται με ορισμένες από τις πολιτικές ασφαλείας του οργανισμού σας. Επικοινωνήστε με τον διαχειριστή σας σχετικά με το τι πρέπει να διορθωθεί.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 12f58f9..342d900 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">This device was locked to different domain or mode.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">Restart now</translation>
+<translation id="225614027745146050">Welcome</translation>
 <translation id="2257053455312861282">Adding a school account enables easy sign-in to websites, extensions and apps as a student while still operating under parental controls.</translation>
 <translation id="2261323523305321874">Your administrator has made a system-wide change that disables some old profiles.</translation>
 <translation id="22614517036276112">This document or your device doesn’t meet some of your organisation’s security policies. Check with your admin on what needs to be fixed.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 8ded656..966c71c1 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">Se bloqueó este dispositivo para otros dominios o modos.</translation>
 <translation id="2255317897038918278">Impresión de fecha de Microsoft</translation>
 <translation id="2256115617011615191">Reiniciar ahora</translation>
+<translation id="225614027745146050">Bienvenido</translation>
 <translation id="2257053455312861282">Si agregas la cuenta de una institución educativa, el estudiante podrá acceder fácilmente a sitios web, extensiones y apps, mientras se siguen aplicando los controles parentales.</translation>
 <translation id="2261323523305321874">Tu administrador hizo un cambio que afecta todo el sistema e inhabilita algunos perfiles antiguos.</translation>
 <translation id="22614517036276112">Este documento o tu dispositivo no cumplen con algunas de las políticas de seguridad de tu organización. Consulta con el administrador qué tienes que corregir.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 44a9215..7cf59c8 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">Este dispositivo ha sido bloqueado en un dominio o modo diferente.</translation>
 <translation id="2255317897038918278">Impresión de fecha de Microsoft</translation>
 <translation id="2256115617011615191">Reiniciar ahora</translation>
+<translation id="225614027745146050">Te damos la bienvenida</translation>
 <translation id="2257053455312861282">Añadir una cuenta de centro educativo permite iniciar sesión fácilmente en sitios web, extensiones y aplicaciones como alumno a la vez que sigue aplicándose el control parental.</translation>
 <translation id="2261323523305321874">El administrador ha hecho un cambio que afecta a todo el sistema e inhabilita algunos perfiles antiguos.</translation>
 <translation id="22614517036276112">Este documento o tu dispositivo no cumplen algunas de las políticas de seguridad de tu organización. Consulta con tu administrador qué debes corregir.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 2643ba76..a2b235c0 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1404,6 +1404,7 @@
 <translation id="2255077166240162850">Seade on lukustatud muus domeenis või režiimis.</translation>
 <translation id="2255317897038918278">Microsofti ajatembeldus</translation>
 <translation id="2256115617011615191">Taaskäivita kohe</translation>
+<translation id="225614027745146050">Tere tulemast</translation>
 <translation id="2257053455312861282">Kooli konto lisamine võimaldab veebisaitidele, laiendustesse ja rakendustesse õpilasena hõlpsalt sisse logida, kasutades seadet siiski vanemliku järelevalve all.</translation>
 <translation id="2261323523305321874">Teie administraator tegi süsteemiülese muudatuse, mis keelab mõned vanad profiilid.</translation>
 <translation id="22614517036276112">See dokument või teie seade ei vasta teie organisatsiooni teatud turvareeglitele. Pöörduge administraatori poole, et teada saada, mida on vaja parandada.</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 6416b23..9a53ba32f 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">Beste domeinu edo modu batekin blokeatu da gailua.</translation>
 <translation id="2255317897038918278">Microsoft denbora-zigilua</translation>
 <translation id="2256115617011615191">Berrabiarazi</translation>
+<translation id="225614027745146050">Ongi etorri</translation>
 <translation id="2257053455312861282">Ikastetxeko kontu bat gehituz gero, haurrak erraz hasi ahalko du saioa ikasle gisa webgune, luzapen eta aplikazioetan, baina guraso-murriztapenen mende egoteari utzi gabe.</translation>
 <translation id="2261323523305321874">Administratzaileak sistema osoari eragiten dion aldaketa bat egin du; ondorioz, profil zahar batzuk desgaitu dira.</translation>
 <translation id="22614517036276112">Dokumentuak edo gailuak ez ditu gordetzen erakundearen segurtasun-gidalerro batzuk. Galdetu administratzaileari ea zer konpondu behar den.</translation>
@@ -2532,7 +2533,7 @@
 <translation id="328571385944182268">Pasahitzak gorde nahi dituzu?</translation>
 <translation id="3288047731229977326">Garatzaile moduan abiarazten diren luzapenek ordenagailua kalte diezazukete. Ez bazara garatzailea, segurtasunez jokatzeko, luzapen horiek garatzaile moduan exekutatzeko aukera desgaitu beharko zenuke.</translation>
 <translation id="3289668031376215426">Maiuskula automatikoak</translation>
-<translation id="3289856944988573801">Eguneratzeak bilatzeko, erabili Ethernet edo Wi-Fi konexioa.</translation>
+<translation id="3289856944988573801">Eguneratzeak bilatzeko, erabili Ethernet- edo wifi-konexioa.</translation>
 <translation id="3290249595466894471">Gainera, orrien, deskargen, luzapenen jardueren eta sistemaren informazioaren lagin txikiak bidaltzen ditu mehatxu berriak aurkitu ahal izateko.</translation>
 <translation id="3293644607209440645">Bidali orri hau</translation>
 <translation id="32939749466444286">Ez da abiarazi Linux edukiontzia. Saiatu berriro.</translation>
@@ -3582,7 +3583,7 @@
 <translation id="4261429981378979799">Luzapenen baimenak</translation>
 <translation id="4262004481148703251">Baztertu abisua</translation>
 <translation id="4263223596040212967">Egiaztatu teklatuaren diseinua egokia dela eta saiatu berriro.</translation>
-<translation id="426564820080660648">Eguneratzeak bilatzeko, erabili Ethernet, Wi-Fi konexioa edo datu-konexioa.</translation>
+<translation id="426564820080660648">Eguneratzeak bilatzeko, erabili Ethernet-, wifi- edo datu-konexioa.</translation>
 <translation id="4266679478228765574">Karpetak kenduz gero, haiek partekatzeari utziko zaio, baina ez dira ezabatuko fitxategiak.</translation>
 <translation id="4267455501101322486">Hezkuntza-baliabideak atzitzeko kontu bat gehitu nahi baduzu, eskatu gurasoren bati baimena eman diezazula</translation>
 <translation id="4267924571297947682">Eskatu baimena guraso bati</translation>
@@ -7551,7 +7552,7 @@
 <translation id="7968833647796919681">Gaitu errendimenduari buruzko datuak biltzeko aukera</translation>
 <translation id="7968982339740310781">Ikusi xehetasunak</translation>
 <translation id="7969046989155602842">Command</translation>
-<translation id="7970673414865679092">Ethernet sarearen xehetasunak</translation>
+<translation id="7970673414865679092">Ethernet-sarearen xehetasunak</translation>
 <translation id="7970882136539140748">Ezin da gorde txartela une honetan</translation>
 <translation id="7972714317346275248">PKCS #1 SHA-384 RSA enkriptatzearekin</translation>
 <translation id="7973776233567882054">Hauetako zeinek azaltzen du ongien zure sarea?</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 51f14200..7ebcd5d 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1410,6 +1410,7 @@
 <translation id="2255077166240162850">این دستگاه روی دامنه یا حالت دیگری قفل شده است.</translation>
 <translation id="2255317897038918278">‏مهر زمان Microsoft</translation>
 <translation id="2256115617011615191">راه‌اندازی مجدد در این لحظه</translation>
+<translation id="225614027745146050">خوش آمدید</translation>
 <translation id="2257053455312861282">با افزودن حساب محل تحصیل، دانش‌آموز به‌راحتی می‌تواند به سیستم وب‌سایت‌ها، افزونه‌ها، و برنامه‌ها وارد شود و همچنان تحت کنترل‌های والدین عمل کند.</translation>
 <translation id="2261323523305321874">سرپرستتان تغییری در کل سیستم داده است که برخی نمایه‌های قدیمی را غیرفعال کرده است.</translation>
 <translation id="22614517036276112">این سند یا دستگاه شما برخی‌از خط‌مشی‌های امنیتی سازمانتان را رعایت نمی‌کند. مواردی را که باید برطرف شود از سرپرست خود بپرسید.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 7a4aad5..cb6ced8 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1412,6 +1412,7 @@
 <translation id="2255077166240162850">Laite on lukittu toiseen verkkotunnukseen tai tilaan.</translation>
 <translation id="2255317897038918278">Microsoftin aikaleimaus</translation>
 <translation id="2256115617011615191">Käynnistä uudelleen</translation>
+<translation id="225614027745146050">Tervetuloa</translation>
 <translation id="2257053455312861282">Kun oppilaitostili lisätään, kirjautuminen sivustoille, laajennuksiin ja sovelluksiin on helppoa oppilaille lapsilukon asettamissa rajoissa.</translation>
 <translation id="2261323523305321874">Järjestelmänvalvoja on tehnyt koko järjestelmän laajuisen muutoksen, joka poistaa vanhoja profiileja käytöstä.</translation>
 <translation id="22614517036276112">Dokumentti tai laite ei noudata kaikkia organisaatiosi tietoturvakäytäntöjä. Tarkista järjestelmänvalvojalta, mitä on korjattava.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index aa97f339..0bc3736 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">Na-lock ang device na ito sa ibang domain o mode.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">I-restart ngayon</translation>
+<translation id="225614027745146050">Maligayang pagdating</translation>
 <translation id="2257053455312861282">Kapag nagdagdag ng pampaaralang account, magiging madali ang pag-sign in sa mga website, extension, at app bilang mag-aaral habang tumatakbo pa rin sa ilalim ng parental controls.</translation>
 <translation id="2261323523305321874">Gumawa ang iyong administrator ng mga pagbabago sa buong system na nagdi-disable sa ilang lumang profile.</translation>
 <translation id="22614517036276112">Hindi natutugunan ng dokumentong ito o ng iyong device ang ilan sa mga patakarang panseguridad ng organisasyon mo. Itanong sa iyong admin kung ano ang kailangang ayusin.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 4abbe59c..584093e 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1402,6 +1402,7 @@
 <translation id="2255077166240162850">Cet appareil a été verrouillé dans un autre mode ou avec un autre domaine.</translation>
 <translation id="2255317897038918278">Enregistrement des informations de date Microsoft</translation>
 <translation id="2256115617011615191">Redémarrer maintenant</translation>
+<translation id="225614027745146050">Bienvenue</translation>
 <translation id="2257053455312861282">L'ajout d'un compte scolaire permet aux élèves de se connecter aisément aux sites Web et d'utiliser les extensions et les applications, tout en étant régis par les contrôles parentaux.</translation>
 <translation id="2261323523305321874">Votre administrateur a apporté une modification à l'échelle du système qui désactive certains anciens profils.</translation>
 <translation id="22614517036276112">Ce document ou votre appareil ne respecte pas certaines des politiques de sécurité de votre organisation. Vérifiez auprès de votre administrateur ce qui doit être corrigé.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 658b321..dc880f98 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1402,6 +1402,7 @@
 <translation id="2255077166240162850">Cet appareil a été verrouillé dans un autre mode ou avec un autre domaine.</translation>
 <translation id="2255317897038918278">Enregistrement des informations de date Microsoft</translation>
 <translation id="2256115617011615191">Redémarrer maintenant</translation>
+<translation id="225614027745146050">Bienvenue</translation>
 <translation id="2257053455312861282">L'ajout d'un compte scolaire permet de se connecter facilement aux sites Web, aux extensions et aux applications en tant qu'élève. Le contrôle parental n'est pas désactivé.</translation>
 <translation id="2261323523305321874">Votre administrateur a effectué une modification s'appliquant à tout le système qui désactive certains anciens profils.</translation>
 <translation id="22614517036276112">Ce document ou votre appareil ne respecte pas certaines règles de sécurité de votre organisation. Contactez votre administrateur pour savoir ce qui doit être corrigé.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index e18bef4..fc1e2669 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1400,6 +1400,7 @@
 <translation id="2255077166240162850">Este dispositivo estaba bloqueado para un dominio ou modo diferente.</translation>
 <translation id="2255317897038918278">Impresión de data de Microsoft</translation>
 <translation id="2256115617011615191">Reiniciar agora</translation>
+<translation id="225614027745146050">Dámosche a benvida</translation>
 <translation id="2257053455312861282">Se engades unha conta de centro educativo, o usuario poderá iniciar sesión como estudante de forma sinxela en determinados sitios web, extensións e aplicacións sen que deixen de aplicarse os controis parentais.</translation>
 <translation id="2261323523305321874">O teu administrador realizou un cambio que afecta a todo o sistema e que desactiva algúns perfís antigos.</translation>
 <translation id="22614517036276112">Este documento ou o teu dispositivo non cumpre algunhas das políticas de seguranza da túa organización. Consulta o administrador para saber o que debes corrixir.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 4221616..093788b 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">આ ડિવાઇસ ભિન્ન ડોમેન અથવા મોડમાં લૉક કર્યું હતું.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">હવે ફરીથી પ્રારંભ કરો</translation>
+<translation id="225614027745146050">સ્વાગત છે</translation>
 <translation id="2257053455312861282">સ્કૂલનું એકાઉન્ટ ઉમેરવાથી, માતાપિતા યોગ્ય નિયંત્રણો હેઠળ કાર્ય થતું હોવા છતાં, વિદ્યાર્થી તરીકે વેબસાઇટ, એક્સ્ટેન્શન અને ઍપમાં સરળતાથી સાઇન-ઇન કરી શકાય છે.</translation>
 <translation id="2261323523305321874">તમારા વ્યવસ્થાપકે સિસ્ટમ વ્યાપી ફેરફાર કર્યો છે જે અમુક જૂની પ્રોફાઇલને બંધ કરે છે.</translation>
 <translation id="22614517036276112">તમારી સંસ્થાની અમુક સુરક્ષા પૉલિસીઓનું અનુપાલન આ દસ્તાવેજ અથવા તમારા ડિવાઇસ દ્વારા કરવામાં આવ્યું નથી. શું ઠીક કરવું જરૂરી રહેશે, તે વિશે તમારા ઍડમિનનો સંપર્ક કરો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index a96ab326..578bbcf 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">यह डिवाइस अलग डोमेन या मोड में लॉक किया गया था.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">अभी पुनः प्रारंभ करें</translation>
+<translation id="225614027745146050">आपका स्वागत है</translation>
 <translation id="2257053455312861282">स्कूल वाला खाता जोड़ने से वेबसाइटों, एक्सटेंशन, और ऐप्लिकेशन में एक छात्र/छात्रा के तौर पर साइन-इन करने में आसानी होगी. हालांकि, वे अब भी इन्हें 'माता-पिता का कंट्रोल' सुविधा की मदद से ही इस्तेमाल कर सकेंगे.</translation>
 <translation id="2261323523305321874">आपके एडमिन ने पूरे सिस्टम में ऐसा बदलाव किया है जो कुछ पुरानी प्रोफ़ाइल बंद कर देता है.</translation>
 <translation id="22614517036276112">यह दस्तावेज़ या आपका डिवाइस, आपके संगठन की कुछ सुरक्षा नीतियों का पालन नहीं करता. किन समस्याओं को ठीक करना है, इसके बारे में अपने एडमिन से संपर्क करें.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 130a087..2ec9b77 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1403,6 +1403,7 @@
 <translation id="2255077166240162850">Uređaj je zaključan za neku drugu domenu ili način rada.</translation>
 <translation id="2255317897038918278">Microsoftovo vremensko označavanje</translation>
 <translation id="2256115617011615191">Ponovo pokreni sad</translation>
+<translation id="225614027745146050">Dobro došli</translation>
 <translation id="2257053455312861282">Dodavanje školskog računa omogućuje jednostavnu prijavu na web-lokacije, proširenja i aplikacije za učenike uz istodobni roditeljski nadzor.</translation>
 <translation id="2261323523305321874">Vaš je administrator unio promjene na razini sustava čime su onemogućeni neki vaši stari profili.</translation>
 <translation id="22614517036276112">Ovaj dokument ili vaš uređaj ne zadovoljavaju neka sigurnosna pravila vaše organizacije. Provjerite s administratorom što se treba ispraviti.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 87607bfa..c943fea 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1412,6 +1412,7 @@
 <translation id="2255077166240162850">Az eszköz másik domainhez vagy módban van zárolva.</translation>
 <translation id="2255317897038918278">Microsoft - időbélyegzés</translation>
 <translation id="2256115617011615191">Újraindítás most</translation>
+<translation id="225614027745146050">Üdvözöljük</translation>
 <translation id="2257053455312861282">A hozzáadott iskolai fiók egyszerű bejelentkezést tesz lehetővé a webhelyeken, a bővítményekben és az alkalmazásokban tanulóként, és a szülői felügyeleti vezérlők szerint működik.</translation>
 <translation id="2261323523305321874">Az adminisztrátor az egész rendszert érintő módosítást végzett el, amely letilt bizonyos régi profilokat.</translation>
 <translation id="22614517036276112">Ez a dokumentum vagy az Ön eszköze nem felel meg szervezete egyes biztonsági irányelveinek. Érdeklődjön rendszergazdájánál arról, hogy mit kell kijavítani.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 3bd32a4..4f7b58e1 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1403,6 +1403,7 @@
 <translation id="2255077166240162850">Այս սարքն արդեն կողպվել է այլ տիրույթում կամ ռեժիմում։</translation>
 <translation id="2255317897038918278">Microsoft ժամադրոշմ</translation>
 <translation id="2256115617011615191">Վերագործարկել հիմա</translation>
+<translation id="225614027745146050">Ողջույն</translation>
 <translation id="2257053455312861282">Ուսումնական հաշիվ ավելացնելը հնարավորություն է տալիս հեշտությամբ մուտք գործել կայքերում, ընդլայնումներում և հավելվածներում որպես աշակերտ՝ ծնողական վերահսկողության ներքո լինելով հանդերձ։</translation>
 <translation id="2261323523305321874">Ձեր ադմինիստրատորը համակարգի ընդհանուր փոփոխություններ է կատարել, որի հետևանքով որոշ հին պրոֆիլներ անջատվել են:</translation>
 <translation id="22614517036276112">Այս փաստաթուղթը կամ ձեր սարքը չի համապատասխանում կազմակերպության անվտանգության կանոններին։ Խնդրի լուծման համար դիմեք ձեր ադմինիստրատորին։</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 8f38bd3..7bf9334 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Perangkat ini terkunci ke domain atau mode lain.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">Mulai ulang sekarang</translation>
+<translation id="225614027745146050">Selamat Datang</translation>
 <translation id="2257053455312861282">Jika akun sekolah ditambahkan, pengguna dapat login dengan mudah ke situs, ekstensi, dan aplikasi sebagai siswa, dan tetap dalam kontrol orang tua.</translation>
 <translation id="2261323523305321874">Administrator Anda telah melakukan perubahan di seluruh sistem yang menonaktifkan sebagian profil lama.</translation>
 <translation id="22614517036276112">Dokumen ini atau perangkat Anda tidak memenuhi beberapa kebijakan keamanan organisasi Anda. Hubungi admin Anda untuk mengetahui hal yang perlu diperbaiki.</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 497df61..f415bbd 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">Þetta tæki var læst á öðru léni eða í annarri stillingu.</translation>
 <translation id="2255317897038918278">Microsoft-tímastimpill</translation>
 <translation id="2256115617011615191">Endurræsa núna</translation>
+<translation id="225614027745146050">Velkomin(n)</translation>
 <translation id="2257053455312861282">Með skólareikningi getur notandi auðveldlega skráð sig inn á vefsvæði, viðbætur og forrit sem nemandi með barnalæsingar virkar.</translation>
 <translation id="2261323523305321874">Kerfisstjórinn þinn hefur gert kerfislæga breytingu sem gerir suma eldri prófíla óvirka.</translation>
 <translation id="22614517036276112">Þetta skjal eða tækið þitt stenst ekki tilteknar öryggisreglur fyrirtækisins. Hafðu samband við stjórnandann til að fá upplýsingar um hvað þarf að lagfæra.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 1607c69..19c0aa6 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">Questo dispositivo è stato bloccato con un dominio o una modalità diversi.</translation>
 <translation id="2255317897038918278">Timestamp Microsoft</translation>
 <translation id="2256115617011615191">Riavvia adesso</translation>
+<translation id="225614027745146050">Ti diamo il benvenuto</translation>
 <translation id="2257053455312861282">L'aggiunta di un account della scuola consente di accedere facilmente ai siti web, alle estensioni e alle app come studente, applicando al tempo stesso il Controllo genitori.</translation>
 <translation id="2261323523305321874">L'amministratore ha apportato una modifica a livello di sistema che disabilita alcuni vecchi profili.</translation>
 <translation id="22614517036276112">Questo documento o il tuo dispositivo non rispetta alcuni criteri di sicurezza della tua organizzazione. Verifica con il tuo amministratore cosa occorre sistemare.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 04c568a..a31c73f2 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1412,6 +1412,7 @@
 <translation id="2255077166240162850">המכשיר הזה ננעל לצורך שימוש בדומיין או במצב שונה.</translation>
 <translation id="2255317897038918278">‏הטבעת חותמת זמן של Microsoft</translation>
 <translation id="2256115617011615191">יש להפעיל מחדש כעת</translation>
+<translation id="225614027745146050">ברוכים הבאים</translation>
 <translation id="2257053455312861282">הוספת חשבון בית ספרי מאפשרת לתלמיד או לתלמידה להיכנס בנוחות לאתרים, לתוספים ולאפליקציות, ועדיין לפעול במסגרת המגבלות של בקרת ההורים.</translation>
 <translation id="2261323523305321874">מנהל המערכת ביצע שינוי כללי במערכת שמשבית חלק מהפרופילים הישנים.</translation>
 <translation id="22614517036276112">המסמך הזה או המכשיר שלך לא עומדים בחלק מהכללים של מדיניות האבטחה של הארגון. עליך לברר עם האדמין מה צריך לתקן.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 140cacb..e320c77e 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1397,6 +1397,7 @@
 <translation id="2255077166240162850">このデバイスは別のドメインまたはモードにロックされています。</translation>
 <translation id="2255317897038918278">Microsoft タイム スタンプ</translation>
 <translation id="2256115617011615191">今すぐ再起動</translation>
+<translation id="225614027745146050">ようこそ</translation>
 <translation id="2257053455312861282">学校用アカウントを追加すると、保護者による使用制限のもとで、生徒としてウェブサイト、拡張機能、アプリに簡単にログインできるようになります。</translation>
 <translation id="2261323523305321874">管理者がシステム全体に行った変更により、一部の古いプロフィールが無効になりました。</translation>
 <translation id="22614517036276112">このドキュメントまたはお使いのデバイスは、組織のセキュリティ ポリシーの一部に違反しています。修正が必要な箇所を管理者にご確認ください。</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 02ff207..9e4abfc 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">ეს მოწყობილობა მიმაგრებულია სხვა დომენზე ან რეჟიმზე.</translation>
 <translation id="2255317897038918278">Microsoft დროის ნიშნული</translation>
 <translation id="2256115617011615191">ახლავე გადატვირთვა</translation>
+<translation id="225614027745146050">მოგესალმებით!</translation>
 <translation id="2257053455312861282">სასწავლებლის ანგარიშის დამატების შემთხვევაში შესაძლებელი იქნება სხვადასხვა ვებსაიტში, გაფართოებასა და აპში მარტივად შესვლა მოსწავლის სტატუსით, მშობელთა მიერ კონტროლის ფუნქციების შენარჩუნებით.</translation>
 <translation id="2261323523305321874">თქვენმა ადმინისტრატორმა სისტემის მასშტაბით განახორციელა ცვლილება, რომელიც ითვალისწინებს ზოგიერთი ძველი პროფილის გათიშვას.</translation>
 <translation id="22614517036276112">ეს დოკუმენტი ან თქვენი მოწყობილობა არ შეესაბამება თქვენი ორგანიზაციის მიერ უსაფრთხოებასთან დაკავშირებით დაწესებულ ზოგიერთ წესს. მიმართეთ თქვენს ადმინისტრატორს გამოსასწორებელი საკითხების შესახებ.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index b3ae8da8..596486b7 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">Бұл құрылғыны басқа домен немесе режим құлыптаған.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">Қазір қайта іске қосу</translation>
+<translation id="225614027745146050">Қош келдіңіз</translation>
 <translation id="2257053455312861282">Оқу аккаунтын енгізсеңіз, оқушы ретінде веб-сайттарға, кеңейтімдерге, қолданбаларға оңай кіресіз және ата-ана бақылауында боласыз.</translation>
 <translation id="2261323523305321874">Әкімші енгізген бүкіл жүйеге қатысты өзгерістер кейбір ескі профильдерді өшірді.</translation>
 <translation id="22614517036276112">Бұл құжат немесе құрылғыңыз ұйымыңыздың кейбір қауіпсіздік саясаттарына сәйкес келмейді. Нені түзету керек екенін әкімшіңізден біліңіз.</translation>
@@ -3797,6 +3798,7 @@
 <translation id="4469762931504673593"><ph name="ORIGIN" /> <ph name="FOLDERNAME" /> қалтасындағы файлдарды өңдей алады.</translation>
 <translation id="4470957202018033307">Сыртқы жад параметрлері</translation>
 <translation id="4471354919263203780">Айтылған сөзді тану файлдары жүктеп алынуда... <ph name="PERCENT" />%</translation>
+<translation id="4472298120638043495">Сіз Google аккаунтының қалаған тілін (<ph name="NEW_LOCALE_FROM_GAIA" />) пайдалана аласыз</translation>
 <translation id="447252321002412580">Chrome мүмкіндіктері мен жұмысын жақсартуға көмектесу</translation>
 <translation id="4472575034687746823">Іске кірісу</translation>
 <translation id="4474155171896946103">Барлық қойындыларға бетбелгі қою…</translation>
@@ -6732,6 +6734,7 @@
 <translation id="7227458944009118910">Төменде көрсетілген қолданбалар протокол сілтемелерін де өңдей алады. Басқа қолданбаларға рұқсат қажет.</translation>
 <translation id="7228056665272655255">Саусақ ізін реттеу үшін балаңыз пернетақтаның жоғарғы оң жақ бұрышындағы саусақ ізін оқу сканерін түртуі керек. Бала саусағының ізі туралы деректер қауіпсіз сақталған және <ph name="DEVICE_TYPE" /> құрылғысынан басқа ешқайда жіберілмейді.</translation>
 <translation id="7228523857728654909">Экран құлпы және аккаунтқа кіру</translation>
+<translation id="7228854227189381547">Ауыспаңыз</translation>
 <translation id="7230222852462421043">&amp;Терезені қалпына келтіру</translation>
 <translation id="7231260028442989757">Телефон хабарландыруларын көріңіз, жабыңыз және оларға жауап беріңіз.</translation>
 <translation id="7232750842195536390">Аты өзгертілмеді</translation>
@@ -7065,6 +7068,7 @@
 <translation id="7545466883021407599">Серверге қосылмады. Желі байланысын тексеріп, қайталап көріңіз. Егер мәселе шешілмесе, Chromebook-ті өшіріп қосыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="7547317915858803630">Ескерту: <ph name="PRODUCT_NAME" /> параметрлері желілік дискіде сақталады. Бұл баяулауға, бұзылуға немесе деректердің жойылуына себеп болуы мүмкін.</translation>
 <translation id="7548856833046333824">Лимонад</translation>
+<translation id="7549434883223124329">Құрылғы тілін ауыстыру керек пе?</translation>
 <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation>
 <translation id="7551059576287086432"><ph name="FILE_NAME" /> жүктеу сәтсіз аяқталды</translation>
 <translation id="7551643184018910560">Сөреге бекіту</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index f1ae79a..1ce343c5 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">ឧបករណ៍នេះ​ត្រូវបានចាក់សោ​ឱ្យប្រើដែន ឬមុខងារ​ផ្សេងហើយ។</translation>
 <translation id="2255317897038918278">ការបិទតែមពេលវេលា Microsoft</translation>
 <translation id="2256115617011615191">ចាប់ផ្ដើមឡើងវិញឥឡូវនេះ</translation>
+<translation id="225614027745146050">ស្វាគមន៍</translation>
 <translation id="2257053455312861282">ការបញ្ចូល​គណនីសាលារៀន​ធ្វើឱ្យ​មានភាពងាយស្រួល​ក្នុងការ​ចូលគេហទំព័រ កម្មវិធីបន្ថែម និង​កម្មវិធីនានា​ក្នុងនាម​ជាសិស្ស ដោយនៅតែ​ធ្វើប្រតិបត្តិការ​ក្រោមការគ្រប់គ្រង​ដោយមាតាបិតា​ដដែល។</translation>
 <translation id="2261323523305321874">អ្នក​គ្រប់គ្រង​របស់អ្នកបាន​ធ្វើការផ្លាស់ប្តូរកម្រិត​ប្រព័ន្ធ​ ដែល​បិទ​កម្រង​ព័ត៌មាន​ចាស់ៗ​មួយ​ចំនួន។</translation>
 <translation id="22614517036276112">ឯកសារនេះ ឬឧបករណ៍​របស់អ្នក​មិន​បំពេញ​តាម​គោលការណ៍​មួយចំនួន​ក្នុងចំណោម​គោលការណ៍​សុវត្ថិភាព​របស់ស្ថាប័ន​អ្នកទេ។ សូមសាកសួរអ្នកគ្រប់គ្រង​របស់អ្នក​អំពីអ្វី​ដែល​ត្រូវការកែតម្រូវ។</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 8fff5191..7e195104 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1406,6 +1406,7 @@
 <translation id="2255077166240162850">ಈ ಸಾಧನವನ್ನು ಬೇರೊಂದು ಡೊಮೇನ್ ಅಥವಾ ಮೋಡ್‌ಗೆ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">ಈಗ ಮರುಪ್ರಾರಂಭಿಸು</translation>
+<translation id="225614027745146050">ಸ್ವಾಗತ</translation>
 <translation id="2257053455312861282">ಶಾಲಾ ಖಾತೆಯನ್ನು ಸೇರಿಸಿದರೆ ಪೋಷಕರ ನಿಯಂತ್ರಣಗಳ ಅಡಿಯಲ್ಲಿ ಇನ್ನೂ ಕಾರ್ಯಾಚರಿಸುತ್ತಲೇ ವೆಬ್‌ಸೈಟ್‌ಗಳು, ವಿಸ್ತರಣೆಗಳು ಮತ್ತು ಆ್ಯಪ್‌ಗಳಲ್ಲಿ ವಿದ್ಯಾರ್ಥಿಯಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಲು ಸುಲಭವಾಗುತ್ತದೆ.</translation>
 <translation id="2261323523305321874">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸಿಸ್ಟಂನಾದ್ಯಂತ ಒಂದು ಬದಲಾವಣೆಯನ್ನು ಮಾಡಿದ್ದಾರೆ. ಇದರಿಂದಾಗಿ ಕೆಲವು ಹಳೆಯ ಪ್ರೊಫೈಲ್‌ಗಳು ನಿಷ್ಕ್ರಿಯವಾಗುತ್ತವೆ.</translation>
 <translation id="22614517036276112">ಈ ಡಾಕ್ಯುಮೆಂಟ್ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನವು ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ಕೆಲವು ಭದ್ರತಾ ನೀತಿಗಳನ್ನು ಪೂರೈಸುವುದಿಲ್ಲ. ಏನನ್ನು ಸರಿಪಡಿಸಬೇಕು ಎಂಬುದರ ಕುರಿತು ನಿಮ್ಮ ನಿರ್ವಾಹಕರ ಜೊತೆಗೆ ಪರಿಶೀಲಿಸಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 4ecd6e3..c9a5082 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">이 기기가 다른 도메인 또는 모드로 잠겼습니다.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">지금 다시 시작</translation>
+<translation id="225614027745146050">환영합니다.</translation>
 <translation id="2257053455312861282">학교 계정을 추가하면 학생이 계속 자녀 보호 기능으로 감독받으면서 웹사이트, 확장 프로그램, 앱에 간편하게 로그인할 수 있습니다.</translation>
 <translation id="2261323523305321874">관리자가 시스템 전체에 변경사항을 적용하여 기존의 일부 프로필이 비활성화되었습니다.</translation>
 <translation id="22614517036276112">문서 또는 기기가 조직의 보안 정책 중 일부를 준수하지 않습니다. 관리자와 함께 문제 해결을 상의하세요.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 4b5a49b4..b6affd5 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Түзмөк башка доменде же режимде бөгөттөлгөн.</translation>
 <translation id="2255317897038918278">Microsoft Убакыт мөөрү</translation>
 <translation id="2256115617011615191">Азыр өчүрүп күйгүзүү</translation>
+<translation id="225614027745146050">Кош келиңиз</translation>
 <translation id="2257053455312861282">Мектеп аккаунтун кошуп койсоңуз, окуучу балаңыз вебсайттарга, кеңейтүүлөргө жана колдонмолорго оңой кире алат. Аккаунттагы бардык аракеттер көзөмөлүңүздүн астында болот.</translation>
 <translation id="2261323523305321874">Администраторуңуз жалпы тутумдук өзгөртүүлөрдү киргизгендиктен, айрым эски профилдер өчүрүлдү.</translation>
 <translation id="22614517036276112">Бул документ же түзмөгүңүз уюмуңуздун коопсуздукту камсыздоо саясаттарында коюлган талаптарга жооп бербейт. Эмне кылуу керек экенин билүү үчүн администраторуңузга кайрылыңыз.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index badc6512..8bb0cb3 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1411,6 +1411,7 @@
 <translation id="2255077166240162850">ອຸປະກອນນີ້ຖືກລັອກຕໍ່ກັບໂດເມນ ຫຼື ໂໝດຕ່າງກັນ.</translation>
 <translation id="2255317897038918278">ການຕິດສະແຕັມເວລາ Microsoft</translation>
 <translation id="2256115617011615191">ເລີ່ມລະບົບໃໝ່ດຽວນີ້</translation>
+<translation id="225614027745146050">ຍິນດີຕ້ອນຮັບ</translation>
 <translation id="2257053455312861282">ການເພີ່ມບັນຊີໂຮງຮຽນເຮັດໃຫ້ສາມາດເຂົ້າສູ່ລະບົບເວັບໄຊ, ສ່ວນຂະຫຍາຍ ແລະ ແອັບເປັນນັກຮຽນໄດ້ຢ່າງງ່າຍດາຍໃນຂະນະທີ່ນຳໃຊ້ພາຍໃຕ້ການຄວບຄຸມຂອງພໍ່ແມ່.</translation>
 <translation id="2261323523305321874">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານໄດ້ເຮັດການປ່ຽນແປງທົ່ວລະບົບທີ່ປິດນຳໃຊ້ບາງໂປຣໄຟລ໌ເກົ່າ.</translation>
 <translation id="22614517036276112">ເອກະສານນີ້ ຫຼື ອຸປະກອນຂອງທ່ານບໍ່ເປັນໄປຕາມນະໂຍບາຍຄວາມປອດໄພບາງຢ່າງຂອງອົງການທ່ານ. ກະລຸນາກວດສອບກັບຜູ້ເບິ່ງແຍງຂອງທ່ານວ່າຕ້ອງແກ້ໄຂຫຍັງ.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index c118449..58103f8 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1416,6 +1416,7 @@
 <translation id="2255077166240162850">Šis įrenginys užrakintas naudojant kitą domeną ar režimą.</translation>
 <translation id="2255317897038918278">„Microsoft“ laiko žymėjimas</translation>
 <translation id="2256115617011615191">Paleisti iš naujo dabar</translation>
+<translation id="225614027745146050">Sveiki</translation>
 <translation id="2257053455312861282">Pridėjus mokyklos paskyrą bus galima lengvai prisijungti prie svetainių, plėtinių ir programų kaip mokiniui toliau taikant tėvų kontrolę.</translation>
 <translation id="2261323523305321874">Administratorius atliko visos sistemos pakeitimą, dėl kurio buvo išjungti kai kurie seni profiliai.</translation>
 <translation id="22614517036276112">Šis dokumentas arba įrenginys neatitinka tam tikrų organizacijos saugos politikos nuostatų. Susisiekite su administratoriumi ir sužinokite, ką reikia pataisyti.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index d5e81f6..455b72f 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1403,6 +1403,7 @@
 <translation id="2255077166240162850">Šī ierīce ir bloķēta citā domēnā vai režīmā.</translation>
 <translation id="2255317897038918278">Microsoft laikspiedola uzlikšana</translation>
 <translation id="2256115617011615191">Restartēt tūlīt</translation>
+<translation id="225614027745146050">Laipni lūdzam!</translation>
 <translation id="2257053455312861282">Pievienojot mācību iestādes kontu, skolēns var ērti pierakstīties vietnēs, paplašinājumos un lietotnēs, bet vienlaikus tiek lietoti vecāku kontroles iestatījumi.</translation>
 <translation id="2261323523305321874">Jūsu administrators ir veicis izmaiņas visā sistēmā, kuru dēļ ir atspējota noteiktu iepriekšējo profilu darbība.</translation>
 <translation id="22614517036276112">Šis dokuments vai jūsu ierīce neatbilst dažām jūsu organizācijas drošības politikām. Sazinieties ar administratoru, lai noskaidrotu, kādas problēmas jānovērš.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 4a1f6732..fce3d87 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">Уредов беше заклучен за друг домен или режим.</translation>
 <translation id="2255317897038918278">Временско означување на Microsoft</translation>
 <translation id="2256115617011615191">Рестартирај сега</translation>
+<translation id="225614027745146050">Добре дојдовте</translation>
 <translation id="2257053455312861282">Ако додадете училишна сметка, ќе се овозможи лесно најавување на веб-сајтовите, екстензиите и апликациите како ученик додека уште се работи под родителски контроли.</translation>
 <translation id="2261323523305321874">Администраторот направи промена на целиот систем што оневозможува некои стари профили.</translation>
 <translation id="22614517036276112">Документов или вашиот уред не исполнува некои од правилата за безбедност на вашата организација. Проверете со администраторот околу тоа што треба да се коригира.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index aab24af..58e1aeafd 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1400,6 +1400,7 @@
 <translation id="2255077166240162850">മറ്റൊരു ഡൊമെയ്‌‌നോ മോഡോ ഉപയോഗിച്ച് ഈ ഉപകരണം ലോക്ക് ചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">ഇപ്പോൾ വീണ്ടും ആരംഭിക്കുക</translation>
+<translation id="225614027745146050">സ്വാഗതം</translation>
 <translation id="2257053455312861282">ഒരു വിദ്യാർത്ഥി എന്ന നിലയിൽ തുടർന്നും രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾക്ക് കീഴിൽ പ്രവർത്തിക്കുമ്പോൾ, ഒരു സ്‌കൂൾ അക്കൗണ്ട് ചേർക്കുന്നതിലൂടെ വെബ്സൈറ്റുകളിലേക്കും വിപുലീകരണങ്ങളിലേക്കും എളുപ്പത്തിൽ സൈൻ ഇൻ ചെയ്യാനാകും.</translation>
 <translation id="2261323523305321874">ചില പഴയ പ്രൊഫൈലുകളെ പ്രവർത്തനരഹിതമാക്കുന്ന തരത്തിൽ  അഡ്‌മിനിസ്ട്രേറ്റർ നിങ്ങളുടെ സിസ്റ്റത്തിലാകമാനം മാറ്റം വരുത്തിയിരിക്കുന്നു.</translation>
 <translation id="22614517036276112">ഈ ഡോക്യുമെന്റോ നിങ്ങളുടെ ഉപകരണമോ നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ ചില സുരക്ഷാ നയങ്ങൾ പാലിക്കുന്നില്ല. എന്താണ് പരിഹരിക്കേണ്ടതെന്ന് നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെട്ട് പരിശോധിക്കുക.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 570a6576..bd33d56 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1409,6 +1409,7 @@
 <translation id="2255077166240162850">Энэ төхөөрөмжийг өөр домэйн эсвэл горимд түгжсэн байна.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">Одоо дахин эхлүүлнэ үү</translation>
+<translation id="225614027745146050">Тавтай морилно уу</translation>
 <translation id="2257053455312861282">Сургуулийн бүртгэл нэмснээр вебсайт, өргөтгөл, аппуудад сурагчийн хувиар хялбар нэвтрэх боломжтой болох бөгөөд аливаа үйлдэл нь эцэг эхийн хяналтад хэвээр байх болно.</translation>
 <translation id="2261323523305321874">Таны админ зарим хуучин профайлыг идэвхгүй болгох системийн өөрчлөлт хийсэн.</translation>
 <translation id="22614517036276112">Энэ документ эсвэл таны төхөөрөмж байгууллагын тань аюулгүй байдлын зарим бодлогод нийцэхгүй байна. Юуг засах шаардлагатай талаар админаасаа тодруулна уу.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 8b33d2d..5571156a 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1412,6 +1412,7 @@
 <translation id="2255077166240162850">हे डिव्हाइस वेगळ्या डोमेनशी किंवा मोडशी लॉक केले गेले होते.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">आता रीस्टार्ट करा</translation>
+<translation id="225614027745146050">सुस्वागतम</translation>
 <translation id="2257053455312861282">शाळा खाते जोडल्याने, पालकांच्या नियंत्रणाखाली ऑपरेट करत असतानादेखील विद्यार्थी म्हणून वेबसाइट, एक्स्टेंशन आणि अ‍ॅप्समध्ये सहजपणे साइन इन करता येते.</translation>
 <translation id="2261323523305321874">तुमच्या ॲडमिनिस्ट्रेटरने संपूर्ण सिस्टममध्ये बदल केले आहेत, ज्‍यामुळे काही जुन्या प्रोफाइल बंद झाल्या आहेत.</translation>
 <translation id="22614517036276112">हा दस्तऐवज किंवा तुमचे डिव्हाइस हे तुमच्या संस्थेच्या काही सुरक्षा धोरणांची पूर्तता करत नाहीत. कशाचे निराकरण करण्याची आवश्यकता आहे हे तपासण्यासाठी तुमच्या ॲडमिनशी संपर्क साधा.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index de9428d8..8b6aaa8 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Peranti ini telah dikunci pada domain atau mod yang lain.</translation>
 <translation id="2255317897038918278">Pengecopan Waktu Microsoft</translation>
 <translation id="2256115617011615191">Mulakan semula sekarang</translation>
+<translation id="225614027745146050">Selamat datang</translation>
 <translation id="2257053455312861282">Tindakan menambah akaun sekolah membolehkan anda log masuk dengan mudah ke laman web, sambungan dan apl sebagai pelajar dan dalam masa yang sama, masih beroperasi di bawah kawalan ibu bapa.</translation>
 <translation id="2261323523305321874">Pentadbir anda telah membuat perubahan pada seluruh sistem yang melumpuhkan beberapa profil lama.</translation>
 <translation id="22614517036276112">Dokumen ini atau peranti anda tidak memenuhi beberapa dasar keselamatan organisasi anda. Semak dengan pentadbir anda tentang perkara yang perlu dibetulkan.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index bbfad8d..564b4b1 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1411,6 +1411,7 @@
 <translation id="2255077166240162850">ဤစက်ပစ္စည်းကို အခြားသောဒိုမိန်း သို့မဟုတ် မုဒ်တစ်ခုခုသို့ လောခ့်လုပ်ထားသည်။</translation>
 <translation id="2255317897038918278">Microsoft အချိန်တံဆိပ်ထုခြင်း</translation>
 <translation id="2256115617011615191">ယခု ပြန်လည်စပါ</translation>
+<translation id="225614027745146050">ကြိုဆိုပါသည်</translation>
 <translation id="2257053455312861282">ကျောင်းအကောင့်ထည့်ခြင်းဖြင့် မိဘ အထိန်းအချုပ်များအောက်တွင် အသုံးပြုနေရင်း ဝဘ်ဆိုက်များ၊ နောက်ဆက်တွဲများနှင့် အက်ပ်များသို့ ကျောင်းသားအဖြစ် အလွယ်တကူ လက်မှတ်ထိုးဝင်နိုင်သည်။</translation>
 <translation id="2261323523305321874">သင်၏ စီမံခန့်ခွဲသူသည် စနစ်တစ်ခုလုံးအတွက် ပြောင်းလဲမှုပြုလုပ်ထားပြီး ၎င်းသည် အချို့သော ပရိုဖိုင်အဟောင်းများကို ပိတ်လိုက်ပါမည်။</translation>
 <translation id="22614517036276112">ဤမှတ်တမ်း (သို့) သင့်စက်ပစ္စည်းသည် သင့်အဖွဲ့အစည်း၏ လုံခြုံရေးမူဝါဒအချို့နှင့် မကိုက်ညီပါ။ ပြုပြင်ရန်လိုအပ်သည်များကို သင့်စီမံခန့်ခွဲသူနှင့် စစ်ဆေးပါ။</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index a8833ace..5961336 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">यो डिभाइस अर्कै डोमेन वा मोडमा लक गरिएको छ।</translation>
 <translation id="2255317897038918278">Microsoft समय मुद्रांकन</translation>
 <translation id="2256115617011615191">अब फेरि सुरु गर्नुहोस्</translation>
+<translation id="225614027745146050">स्वागत छ</translation>
 <translation id="2257053455312861282">विद्यालयको खाता थप्दा विद्यार्थी सजिलैसँग वेबसाइट, एक्स्टेन्सन र एपहरूमा साइन गर्न सक्छन् भने अभिभावकीय नियन्त्रणहरू पनि लागू भइरहन्छन्।</translation>
 <translation id="2261323523305321874">तपाईंको प्रशासकले गर्नुभएको प्रणालीव्यापी परिवर्तनले केही पुराना प्रोफाइलहरूलाई असक्षम पार्छ।</translation>
 <translation id="22614517036276112">यो डकुमेन्ट वा तपाईंको डिभाइसले तपाईंको सङ्गठनका सुरक्षासम्बन्धी केही नीतिहरूको पालना गरेको छैन। आफ्ना एड्मिनलाई सम्पर्क गरेर कुन कुन समस्या समाधान गर्नु पर्छ भन्ने कुरा थाहा पाउनुहोस्।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 33ce11fa..965f80f 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">Dit apparaat is vergrendeld in een ander domein of een andere modus.</translation>
 <translation id="2255317897038918278">Microsoft-tijdstempel</translation>
 <translation id="2256115617011615191">Nu opnieuw starten</translation>
+<translation id="225614027745146050">Welkom</translation>
 <translation id="2257053455312861282">Door een schoolaccount toe te voegen, kunnen kinderen gemakkelijk als leerling inloggen bij websites, extensies en apps terwijl ze nog steeds onder ouderlijk toezicht staan.</translation>
 <translation id="2261323523305321874">Je beheerder heeft een wijziging in het systeem gemaakt waardoor sommige oude profielen niet meer kunnen worden gebruikt.</translation>
 <translation id="22614517036276112">Dit document of je apparaat voldoet niet aan het beveiligingsbeleid van je organisatie. Neem contact op met je beheerder over wat moet worden opgelost.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index c02c87c4..14742e6 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1407,6 +1407,7 @@
 <translation id="2255077166240162850">Denne enheten er låst til et annet domene eller en annen modus.</translation>
 <translation id="2255317897038918278">Microsoft tidsangivelse</translation>
 <translation id="2256115617011615191">Start på nytt nå</translation>
+<translation id="225614027745146050">Velkommen</translation>
 <translation id="2257053455312861282">Du kan legge til en skolekonto for å gjøre det enkelt å logge på nettsteder, utvidelser og apper som elev mens du er underlagt foreldrekontroll.</translation>
 <translation id="2261323523305321874">Administratoren din har gjort en endring for hele systemet som deaktiverer enkelte gamle profiler.</translation>
 <translation id="22614517036276112">Dette dokumentet eller enheten din oppfyller ikke alle sikkerhetsreglene til organisasjonen din. Snakk med administratoren din om hva som må fikses.</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index a94de0e..2c239fe 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">ଏହି ଡିଭାଇସ୍‌ ବିଭିନ୍ନ ଡୋମେନ୍‌ କିମ୍ବା ମୋଡ୍‌ରେ ଲକ୍‌ କରାଯାଇଥିଲା।</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation>
+<translation id="225614027745146050">ସ୍ଵାଗତ</translation>
 <translation id="2257053455312861282">ଜଣେ ବିଦ୍ୟାର୍ଥୀ ଭାବରେ ଏବେ ବି ବାପାମାଙ୍କ ନିୟନ୍ତ୍ରଣରେ କାମ କରୁଥିବା ସମୟରେ ଏକ ସ୍କୁଲ ଆକାଉଣ୍ଟକୁ ଯୋଗ କରିବା ଦ୍ଵାରା ୱେବସାଇଟ୍, ଏକ୍ସଟେନସନ୍ ଏବଂ ଆପଗୁଡ଼ିକରେ ସହଜରେ ସାଇନ୍-ଇନ୍ କରିବାକୁ ସକ୍ଷମ କରିଥାଏ।</translation>
 <translation id="2261323523305321874">ଆପଣଙ୍କର ବ୍ୟବସ୍ଥାପକ ସମ୍ପୂର୍ଣ୍ଣ ସିଷ୍ଟମ୍‌ରେ ଏକ ପରିବର୍ତ୍ତନ କରିଛନ୍ତି ଯାହା କିଛି ପୁରୁଣା ପ୍ରୋଫାଇଲ୍‍ଗୁଡ଼ିକ ଅକ୍ଷମ କରେ।</translation>
 <translation id="22614517036276112">ଏହି ଡକ୍ୟୁମେଣ୍ଟ କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସ ଆପଣଙ୍କ ସଂସ୍ଥାର କିଛି ସୁରକ୍ଷା ନୀତିକୁ ପୂରଣ କରୁନାହିଁ। କଣ ସମାଧାନ କରାଯିବା ଆବଶ୍ୟକ ସେ ବିଷୟରେ ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯାଞ୍ଚ କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 52406122..2a05e01 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">ਇਹ ਡੀਵਾਈਸ ਕਿਸੇ ਵੱਖਰੇ ਡੋਮੇਨ ਜਾਂ ਮੋਡ ਨਾਲ ਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">ਹੁਣ ਰੀਸਟਾਰਟ ਕਰੋ</translation>
+<translation id="225614027745146050">ਸੁਆਗਤ ਹੈ</translation>
 <translation id="2257053455312861282">ਸਕੂਲੀ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰਨ ਨਾਲ ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ ਅਧੀਨ ਕੰਮ ਕਰਦਿਆਂ ਇੱਕ ਵਿਦਿਆਰਥੀ ਵਜੋਂ ਵੈੱਬਸਾਈਟਾਂ, ਐਕਸਟੈਂਸ਼ਨਾਂ ਅਤੇ ਐਪਾਂ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨਾ ਆਸਾਨ ਹੋ ਜਾਂਦਾ ਹੈ।</translation>
 <translation id="2261323523305321874">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਸਮੁੱਚੇ ਸਿਸਟਮ ਵਿੱਚ ਅਜਿਹਾ ਬਦਲਾਅ ਕੀਤਾ ਹੈ ਜੋ ਕੁਝ ਪੁਰਾਣੇ ਪ੍ਰੋਫਾਈਲਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ।</translation>
 <translation id="22614517036276112">ਇਹ ਦਸਤਾਵੇਜ਼ ਜਾਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਤੁਹਾਡੀ ਸੰਸਥਾ ਦੀਆਂ ਕੁਝ ਸੁਰੱਖਿਆ ਨੀਤੀਆਂ ਦਾ ਪਾਲਣ ਨਹੀਂ ਕਰਦਾ। ਇਹ ਦੇਖਣ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਗੱਲ ਕਰੋ ਕਿ ਕੀ ਠੀਕ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 69327987..6c19330 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1399,6 +1399,7 @@
 <translation id="2255077166240162850">To urządzenie zostało zablokowane w innej domenie lub innym trybie.</translation>
 <translation id="2255317897038918278">Dodawanie sygnatury czasowej firmy Microsoft</translation>
 <translation id="2256115617011615191">Uruchom ponownie teraz</translation>
+<translation id="225614027745146050">Witamy</translation>
 <translation id="2257053455312861282">Po dodaniu konta szkolnego uczeń może łatwo logować się pod kontrolą rodzicielską na stronach oraz w rozszerzeniach i aplikacjach.</translation>
 <translation id="2261323523305321874">Administrator wprowadził zmianę systemową, która wyłączyła niektóre stare profile.</translation>
 <translation id="22614517036276112">Ten dokument lub Twoje urządzenie nie są zgodne z niektórymi zasadami bezpieczeństwa obowiązującymi w Twojej organizacji. Zapytaj administratora, co trzeba poprawić.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 62b642a..17d9d5d1 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1414,6 +1414,7 @@
 <translation id="2255077166240162850">Este dispositivo foi bloqueado para um domínio ou modo diferente.</translation>
 <translation id="2255317897038918278">Carimbo de data/hora da Microsoft</translation>
 <translation id="2256115617011615191">Reiniciar agora</translation>
+<translation id="225614027745146050">Bem-vindo</translation>
 <translation id="2257053455312861282">Adicionar uma conta escolar facilita o login como aluno em sites, extensões e apps sem desativar o controle dos pais.</translation>
 <translation id="2261323523305321874">Seu administrador fez uma alteração no sistema inteiro que desativa alguns perfis antigos.</translation>
 <translation id="22614517036276112">Esse documento ou o dispositivo não atendem a algumas políticas de segurança da sua organização. Verifique com o administrador o que precisa ser corrigido.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 6bdc52e..84a41b81 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">Este dispositivo foi bloqueado para um domínio ou um modo diferente.</translation>
 <translation id="2255317897038918278">Carimbo de data/hora da Microsoft</translation>
 <translation id="2256115617011615191">Reiniciar agora</translation>
+<translation id="225614027745146050">Bem-vindo</translation>
 <translation id="2257053455312861282">Adicionar uma conta escolar permite iniciar sessão facilmente em Websites, extensões e apps como aluno e continuar a trabalhar sob controlo parental.</translation>
 <translation id="2261323523305321874">O administrador efetuou uma alteração ao nível do sistema que desativa alguns perfis antigos.</translation>
 <translation id="22614517036276112">Este documento ou o seu dispositivo não cumpre algumas das políticas de segurança da sua organização. Contacte o seu administrador para saber o que é preciso corrigir.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 16d1b8e8..e1bf788 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1402,6 +1402,7 @@
 <translation id="2255077166240162850">Acest dispozitiv a fost blocat pe un alt domeniu sau mod.</translation>
 <translation id="2255317897038918278">Marcare temporală Microsoft</translation>
 <translation id="2256115617011615191">Repornește acum</translation>
+<translation id="225614027745146050">Bun venit</translation>
 <translation id="2257053455312861282">Dacă adaugi un cont de la școală, te poți conecta ușor la site-uri, extensii și aplicații ca elev, iar opțiunile de control parental vor rămâne active.</translation>
 <translation id="2261323523305321874">Administratorul a făcut o modificare la nivel de sistem care dezactivează unele profiluri vechi.</translation>
 <translation id="22614517036276112">Acest document sau dispozitiv nu respectă unele dintre politicile de securitate ale organizației. Consultă administratorul pentru a afla ce trebuie remediat.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 75c69b7..46f8610 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1403,6 +1403,7 @@
 <translation id="2255077166240162850">Устройство уже заблокировано в другом домене или режиме.</translation>
 <translation id="2255317897038918278">Штамп времени Microsoft</translation>
 <translation id="2256115617011615191">Перезапустить</translation>
+<translation id="225614027745146050">Добро пожаловать!</translation>
 <translation id="2257053455312861282">Чтобы упростить доступ к используемым в учебе сайтам, приложениям и расширениям, можно добавить учебный аккаунт. Родительский контроль будет по-прежнему включен.</translation>
 <translation id="2261323523305321874">Администратор отключил некоторые старые профили.</translation>
 <translation id="22614517036276112">Этот документ или ваше устройство не соответствует некоторым правилам безопасности организации. Обратитесь к администратору.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index e550982..b1d6d1c 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1402,6 +1402,7 @@
 <translation id="2255077166240162850">මෙම උපාංගය වෙනත් වසමට හෝ ප්‍රකාරයට අඟුලු දමා ඇත.</translation>
 <translation id="2255317897038918278">Microsoft වේලාව මුද්‍රා තැබීම</translation>
 <translation id="2256115617011615191">දැන් යළි අාරම්භ කරන්න</translation>
+<translation id="225614027745146050">ආයුබෝවන්</translation>
 <translation id="2257053455312861282">පාසල් ගිණුමක් එක් කිරීම තවම මාපිය පාලන යටතේ ක්‍රියා කරමින් සිටින අතරතුර ශිෂ්‍යයෙක් වශයෙන් වෙබ් අඩවිවලට සහ දිගුවලට පහසු පිරීම සබල කරයි.</translation>
 <translation id="2261323523305321874">ඔබේ පරිපාලකයා සමහර පැරණි පැතිකඩයන් අබල කරන පද්ධතියේ විශාල වෙනසක් සිදු කර ඇත.</translation>
 <translation id="22614517036276112">මෙම ලේඛනය හෝ ඔබේ උපාංගය ඔබේ සංවිධානයේ සමහර ආරක්ෂක ප්‍රතිපත්ති සපුරාලන්නේ නැත. නිරාකරණයට අවශ්‍ය දේ පිළිබඳව ඔබේ පරිපාලක සමග පරීක්ෂා කරන්න.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 4f225f25..c97c1867 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1403,6 +1403,7 @@
 <translation id="2255077166240162850">Toto zariadenie bolo uzamknuté a používa inú doménu či režim.</translation>
 <translation id="2255317897038918278">Časová pečiatka od spoločnosti Microsoft</translation>
 <translation id="2256115617011615191">Reštartovať</translation>
+<translation id="225614027745146050">Vitajte</translation>
 <translation id="2257053455312861282">Pridanie školského účtu uľahčuje prihlásenie v rámci webov, rozšírení a aplikácií študentom, ktorí majú aktívnu rodičovskú kontrolu.</translation>
 <translation id="2261323523305321874">Správca vykonal celosystémovú zmenu, ktorá zakazuje niektoré staré profily.</translation>
 <translation id="22614517036276112">Tento dokument alebo vaše zariadenie nespĺňa niektoré pravidlá zabezpečenia vašej organizácie. Zistite od správcu, čo je treba opraviť.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 3ef79c82..dc783d1 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1416,6 +1416,7 @@
 <translation id="2255077166240162850">Ta naprava je bila zaklenjena na drugo domeno ali način.</translation>
 <translation id="2255317897038918278">Microsoftovo časovno žigosanje</translation>
 <translation id="2256115617011615191">Znova zaženi</translation>
+<translation id="225614027745146050">Pozdravljeni</translation>
 <translation id="2257053455312861282">Če dodate šolski račun, omogočite preprosto prijavo kot učenca na spletnih mestih, v razširitvah in aplikacijah, medtem ko račun še vedno deluje pod starševskim nadzorom.</translation>
 <translation id="2261323523305321874">Skrbnik je naredil sistemsko spremembo, s katero je onemogočil nekatere stare profile.</translation>
 <translation id="22614517036276112">Ta dokument ali naprava ni skladna z nekaterimi varnostnimi pravilniki organizacije. Pri skrbniku preverite, kaj je treba popraviti.</translation>
@@ -1731,7 +1732,7 @@
 <translation id="2514326558286966059">Odklenite hitreje s prstnim odtisom</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="251722524540674480">Potrditev uporabniškega imena</translation>
-<translation id="2517472476991765520">Išči</translation>
+<translation id="2517472476991765520">Optično preberi</translation>
 <translation id="2518024842978892609">Uporaba potrdil odjemalca</translation>
 <translation id="2519517390894391510">Ime profila potrdila</translation>
 <translation id="2520644704042891903">Čakanje na razpoložljivo vtičnico ...</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 2539fde..f0502d95 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1398,6 +1398,7 @@
 <translation id="2255077166240162850">Kjo pajisje është kyçur në një domen ose modalitet tjetër.</translation>
 <translation id="2255317897038918278">Stampimi i orës nga Microsoft</translation>
 <translation id="2256115617011615191">Rinise tani</translation>
+<translation id="225614027745146050">Mirë se erdhe</translation>
 <translation id="2257053455312861282">Shtimi i një llogarie të shkollës bën të mundur identifikimin me lehtësi si student në faqe interneti, shtesa dhe aplikacione ndërkohë që ende vepron në kuadër të kontrolleve prindërore.</translation>
 <translation id="2261323523305321874">Administratori yt ka bërë një ndryshim në të gjithë sistemin që i çaktivizon disa profile të vjetra.</translation>
 <translation id="22614517036276112">Ky dokument ose pajisja jote nuk respekton disa nga politikat e sigurisë të organizatës sate. Kontakto me administratorin për gjërat që duhet të rregullohen.</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 6fb9029f..51d54df7 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1400,6 +1400,7 @@
 <translation id="2255077166240162850">Ovaj uređaj je zaključan na neki drugi domen ili režim.</translation>
 <translation id="2255317897038918278">Microsoft označavanje vremena</translation>
 <translation id="2256115617011615191">Restartuj odmah</translation>
+<translation id="225614027745146050">Dobro došli</translation>
 <translation id="2257053455312861282">Dodavanje školskog naloga omogućava da se dete lako prijavljuje na veb-sajtove, u dodatke i u aplikacije kao učenik, a da i dalje radi pod roditeljskim nadzorom.</translation>
 <translation id="2261323523305321874">Administrator je uneo promenu koja se odnosi na ceo sistem i koja je onemogućila neke stare profile.</translation>
 <translation id="22614517036276112">Ovaj dokument ili uređaj nije u skladu sa nekim bezbednosnim smernicama organizacije. Proverite sa administratorom šta treba da popravite.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 8fb4b1ef..2b1c5807 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1400,6 +1400,7 @@
 <translation id="2255077166240162850">Овај уређај је закључан на неки други домен или режим.</translation>
 <translation id="2255317897038918278">Microsoft означавање времена</translation>
 <translation id="2256115617011615191">Рестартуј одмах</translation>
+<translation id="225614027745146050">Добро дошли</translation>
 <translation id="2257053455312861282">Додавање школског налога омогућава да се дете лако пријављује на веб-сајтове, у додатке и у апликације као ученик, а да и даље ради под родитељским надзором.</translation>
 <translation id="2261323523305321874">Администратор је унео промену која се односи на цео систем и која је онемогућила неке старе профиле.</translation>
 <translation id="22614517036276112">Овај документ или уређај није у складу са неким безбедносним смерницама организације. Проверите са администратором шта треба да поправите.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 9847f34..abc030d 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Enheten är låst till en annan domän eller ett annat läge.</translation>
 <translation id="2255317897038918278">Microsofts tidsstämpling</translation>
 <translation id="2256115617011615191">Starta om nu</translation>
+<translation id="225614027745146050">Välkommen</translation>
 <translation id="2257053455312861282">Om du lägger till ett skolkonto är det enkelt att logga in på webbplatser, i tillägg och i appar som elev medan föräldrakontroller fortfarande används.</translation>
 <translation id="2261323523305321874">Vissa äldre profiler har inaktiverats på grund av en ändring i systemet som administratören gjort.</translation>
 <translation id="22614517036276112">Dokumentet eller enheten efterlever inte vissa av organisationens säkerhetspolicyer. Kontakta administratören om vad som behöver åtgärdas.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index ae20b7d..978ab5f 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1409,6 +1409,7 @@
 <translation id="2255077166240162850">Kifaa hiki kilifungwa kwenye kikoa au hali tofauti.</translation>
 <translation id="2255317897038918278">Uwekaji Saa wa Microsoft</translation>
 <translation id="2256115617011615191">Zima na uwashe sasa</translation>
+<translation id="225614027745146050">Karibu</translation>
 <translation id="2257053455312861282">Hatua ya kuweka akaunti ya shule hurahisisha shughuli za kuingia katika akaunti za tovuti, viendelezi na programu ukiwa mwanafunzi huku ukiendelea kutumia akaunti chini ya vidhibiti vya wazazi.</translation>
 <translation id="2261323523305321874">Msimamizi wako amefanya mabadiliko kwenye mfumo wote. Mabadiliko hayo yanazima baadhi ya wasifu wa awali.</translation>
 <translation id="22614517036276112">Hati hii au kifaa chako hakitimizi baadhi ya sera za usalama za shirika lako. Wasiliana na msimamizi wako ili ufahamu unachotakiwa kurekebisha.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index dc714d5..06f7625 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">இந்தச் சாதனம் ஏற்கனவே வேறொரு டொமைன் அல்லது பயன்முறையில் பூட்டப்பட்டுள்ளது.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">இப்போது மீண்டும் தொடங்கு</translation>
+<translation id="225614027745146050">நல்வரவு</translation>
 <translation id="2257053455312861282">பள்ளிக் கணக்கைச் சேர்ப்பதன் மூலம் மாணவர் என்ற முறையில் இணையதளங்களிலும் நீட்டிப்புகளிலும் ஆப்ஸிலும் எளிதாக உள்நுழைய முடியும், ஆனாலும் இவை பெற்றோர் கட்டுப்பாடுகளின் கீழ் இருக்கும்.</translation>
 <translation id="2261323523305321874">உங்கள் நிர்வாகி, சில பழைய சுயவிவரங்களை முடக்கும்படியான கணினி அளவிலான மாற்றத்தைச் செய்துள்ளார்.</translation>
 <translation id="22614517036276112">இந்த ஆவணம் அல்லது சாதனம் உங்கள் நிறுவனத்தின் சில பாதுகாப்புக் கொள்கைகளைப் பூர்த்தி செய்யவில்லை. இதைச் சரிசெய்ய உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 9d532f1..969e010 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1412,6 +1412,7 @@
 <translation id="2255077166240162850">వేరే డొమైన్ లేదా మోడ్‌కు ఈ పరికరం లాక్ చేయబడింది.</translation>
 <translation id="2255317897038918278">Microsoft Time Stamping</translation>
 <translation id="2256115617011615191">ఇప్పుడే పునఃప్రారంభించు</translation>
+<translation id="225614027745146050">స్వాగతం</translation>
 <translation id="2257053455312861282">పాఠశాల ఖాతాను యాడ్ చేయడం వలన తల్లిదండ్రుల నియంత్రణల కింద ఆపరేట్ చేస్తున్నప్పుడు కూడా విద్యార్థిగా వెబ్‌సైట్‌లు, ఎక్స్‌టెన్షన్‌లు, యాప్‌లకు సులభంగా సైన్-ఇన్ చేయడాన్ని ఎనేబుల్ చేస్తుంది.</translation>
 <translation id="2261323523305321874">మీ నిర్వాహకులు కొన్ని పాత ప్రొఫైళ్లను నిలిపివేసేలా వ్యవస్థాగత మార్పు చేశారు.</translation>
 <translation id="22614517036276112">ఈ డాక్యుమెంట్ లేదా మీ పరికరం మీ సంస్థకు సంబంధించిన కొన్ని సెక్యూరిటీ పాలసీలకు అనుగుణంగా లేదు. ఏమి పరిష్కరించాలి అనే దాని గురించి మీ అడ్మిన్‌ను సంప్రదించండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 82aedd2..39da3eba 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">อุปกรณ์นี้ล็อกอยู่ในโดเมนหรือโหมดอื่น</translation>
 <translation id="2255317897038918278">การระบุเวลาของ Microsoft</translation>
 <translation id="2256115617011615191">รีสตาร์ทเลย</translation>
+<translation id="225614027745146050">ยินดีต้อนรับ</translation>
 <translation id="2257053455312861282">การเพิ่มบัญชีโรงเรียนช่วยให้ผู้ใช้ซึ่งเป็นนักเรียนลงชื่อเข้าใช้เว็บไซต์ ส่วนขยาย และแอปต่างๆ ได้โดยง่ายในขณะที่ยังคงดำเนินการภายใต้การควบคุมโดยผู้ปกครอง</translation>
 <translation id="2261323523305321874">ผู้ดูแลระบบได้ทำการเปลี่ยนแปลงทั้งระบบซึ่งทำให้มีการปิดใช้โปรไฟล์เก่าบางรายการ</translation>
 <translation id="22614517036276112">เอกสารนี้หรืออุปกรณ์ของคุณไม่เป็นไปตามนโยบายความปลอดภัยบางประการขององค์กร โปรดสอบถามผู้ดูแลระบบเกี่ยวกับสิ่งที่ต้องแก้ไข</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 35258dd4..57053bf 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1400,6 +1400,7 @@
 <translation id="2255077166240162850">Bu cihaz farklı bir alan adı veya mod için kilitlendi.</translation>
 <translation id="2255317897038918278">Microsoft Zaman Damgası</translation>
 <translation id="2256115617011615191">Şimdi yeniden başlat</translation>
+<translation id="225614027745146050">Hoş Geldiniz</translation>
 <translation id="2257053455312861282">Okul hesabı eklemek, ebeveyn denetimleri altında çalışırken web sitelerinde, uzantılarda ve uygulamalarda öğrenci olarak kolayca oturum açmayı sağlar.</translation>
 <translation id="2261323523305321874">Yöneticiniz, bazı eski profilleri devre dışı bırakan, sistem çapında bir değişiklik yaptı.</translation>
 <translation id="22614517036276112">Bu doküman veya cihazınız, kuruluşunuzun güvenlik politikalarından bazılarına uymuyor. Neyin düzeltilmesi gerektiğini öğrenmek için yöneticinize danışın.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index c60e74b3c..9abf086 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1416,6 +1416,7 @@
 <translation id="2255077166240162850">Пристрій заблоковано в іншому домені або режимі.</translation>
 <translation id="2255317897038918278">Встановлення позначки часу Microsoft</translation>
 <translation id="2256115617011615191">Перезапустити</translation>
+<translation id="225614027745146050">Вітаємо!</translation>
 <translation id="2257053455312861282">Якщо додати обліковий запис закладу освіти, дитина зможе легко входити на сайтах, у розширеннях і додатках як учень, але на її дії поширюватиметься батьківський контроль.</translation>
 <translation id="2261323523305321874">Ваш адміністратор зробив зміну в системі, тому деякі старі профілі вимкнено.</translation>
 <translation id="22614517036276112">Цей документ або ваш пристрій не відповідає деяким правилам безпеки організації. Зверніться до адміністратора, щоб дізнатися, що потрібно виправити.</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index d9e8328..e54380d91 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1402,6 +1402,7 @@
 <translation id="2255077166240162850">یہ آلہ مختلف ڈومین یا موڈ میں پہلے سے مقفل ہے۔</translation>
 <translation id="2255317897038918278">‏Microsoft ٹائم اسٹامپنگ</translation>
 <translation id="2256115617011615191">ابھی دوبارہ شروع کریں</translation>
+<translation id="225614027745146050">خوش آمدید</translation>
 <translation id="2257053455312861282">پیرنٹل کنٹرولز کے تحت آپریٹ کرتے ہوئے اسکول کے اکاؤنٹ کو بطور طالب علم کے شامل کرنا ویب سائٹس، ایکسٹینشنز اور ایپ میں آسان سائن ان کو فعال کرتا ہے۔</translation>
 <translation id="2261323523305321874">آپ کے منتظم نے پورے سسٹم میں ایک ایسی تبدیلی کی ہے جس سے پرانے کچھ پروفائلز غیر فعال ہو جاتے ہیں۔</translation>
 <translation id="22614517036276112">یہ دستاویز یا آپ کا آلہ آپ کی تنظیم کی سیکیورٹی کی کچھ پالیسیوں کی تعمیل نہیں کرتا ہے۔ اپنے منتظم کے ساتھ چیک کریں کہ کیا ٹھیک کرنے کی ضرورت ہے۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index bd7ed88b..5595da7 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1400,6 +1400,7 @@
 <translation id="2255077166240162850">Bu qurilma allaqachon boshqa domen yoki rejimda qulflangan.</translation>
 <translation id="2255317897038918278">Microsoft vaqt shtampi</translation>
 <translation id="2256115617011615191">Qayta ishga tushirish</translation>
+<translation id="225614027745146050">Xush kelibsiz</translation>
 <translation id="2257053455312861282">Maktab hisobi kiritilsa, ota-ona nazorati ostida sayt, ilova va kengaytmalarga oʻquvchi sifatida oson kirish mumkin.</translation>
 <translation id="2261323523305321874">Administrator ba’zi eski profillarni faolsizlantirdi.</translation>
 <translation id="22614517036276112">Bu hujjat yoki qurilmangiz tashkilotingizning ayrim xavfsizlik siyosatlariga mos kelmaydi. Nimani tuzatish kerakligini administratoringiz bilan tekshiring.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 6a38cbb7..1a41ce16 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Thiết bị này đã bị khóa với miền hoặc chế độ khác.</translation>
 <translation id="2255317897038918278">Dấu Thời gian của Microsoft</translation>
 <translation id="2256115617011615191">Khởi động lại ngay</translation>
+<translation id="225614027745146050">Chào mừng</translation>
 <translation id="2257053455312861282">Việc thêm tài khoản trường học sẽ giúp bạn dễ dàng đăng nhập vào các trang web, tiện ích và ứng dụng của mình trong vai trò học viên, trong khi vẫn hoạt động theo các quyền kiểm soát của cha mẹ.</translation>
 <translation id="2261323523305321874">Quản trị viên của bạn đã thực hiện thay đổi trên toàn bộ hệ thống làm vô hiệu hóa một số hồ sơ cũ.</translation>
 <translation id="22614517036276112">Tài liệu này hoặc thiết bị của bạn không đáp ứng một số chính sách bảo mật của tổ chức. Hãy trao đổi với quản trị viên của bạn để biết những vấn đề cần khắc phục.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index efe3569e..fc08592 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1394,6 +1394,7 @@
 <translation id="2255077166240162850">此设备已锁定到其他网域或模式。</translation>
 <translation id="2255317897038918278">Microsoft 时间戳</translation>
 <translation id="2256115617011615191">立即重新启动</translation>
+<translation id="225614027745146050">欢迎</translation>
 <translation id="2257053455312861282">您只需添加一个学校帐号,便能以学生身份轻松登录网站、扩展程序和应用,同时仍在家长控制下执行操作。</translation>
 <translation id="2261323523305321874">您的管理员做出了一项系统级更改,致使一些旧个人资料遭到停用。</translation>
 <translation id="22614517036276112">此文档或您的设备不符合贵组织的某些安全政策。请与您的管理员联系,了解需要修正哪些方面。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 40652390..84487fb7 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">此裝置已鎖定使用其他網域或模式。</translation>
 <translation id="2255317897038918278">Microsoft 時間戳記</translation>
 <translation id="2256115617011615191">立即重新啟動</translation>
+<translation id="225614027745146050">歡迎使用</translation>
 <translation id="2257053455312861282">只需新增學校帳戶,即可讓您在家長監控設定下以學生身份輕鬆登入網站、擴充程式和應用程式。</translation>
 <translation id="2261323523305321874">管理員實行的全系統變更停用了部分舊設定檔。</translation>
 <translation id="22614517036276112">此文件或您的裝置不符合您機構的部分安全政策規定。請向您的管理員查詢,瞭解需要修正的項目。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index b95c0d0..f575547f 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -590,7 +590,7 @@
 <translation id="1543284117603151572">從 Edge 匯入的書籤</translation>
 <translation id="1544588554445317666">請嘗試使用較短的檔案名稱,或將檔案儲存至其他資料夾</translation>
 <translation id="1545177026077493356">自動 Kiosk 模式</translation>
-<translation id="1545749641540134597">掃描 QR 圖碼</translation>
+<translation id="1545749641540134597">掃描 QR code</translation>
 <translation id="1545775234664667895">已安裝「<ph name="THEME_NAME" />」主題</translation>
 <translation id="1546031833947068368">{COUNT,plural, =1{你的無痕式視窗不會重新開啟。}other{你的 # 個無痕式視窗不會重新開啟。}}</translation>
 <translation id="1546280085599573572">這個擴充功能已變更您點選 [首頁] 按鈕時所顯示的網頁。</translation>
@@ -1401,6 +1401,7 @@
 <translation id="2255077166240162850">這個裝置已鎖定使用其他網域或模式。</translation>
 <translation id="2255317897038918278">Microsoft 時間戳記</translation>
 <translation id="2256115617011615191">立即重新啟動</translation>
+<translation id="225614027745146050">歡迎使用</translation>
 <translation id="2257053455312861282">新增學校帳戶可讓你以學生的身分輕鬆登入網站、擴充功能及應用程式,同時繼續遵守家長監護功能的操作規範。</translation>
 <translation id="2261323523305321874">你的管理員變更了系統設定,部分舊的設定檔因此遭到停用。</translation>
 <translation id="22614517036276112">這份文件或你的裝置不符合貴機構的部分安全性政策規定。請洽詢管理員,瞭解需要修正的項目。</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 07a44d5..873e587 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1413,6 +1413,7 @@
 <translation id="2255077166240162850">Le divayisi ikhiyiwe kusizinda esihlukile noma imodi.</translation>
 <translation id="2255317897038918278">Ukufaka isitembu kwesikhathi kwe-Microsoft</translation>
 <translation id="2256115617011615191">Qala kabusha manje</translation>
+<translation id="225614027745146050">Siyakwamukela</translation>
 <translation id="2257053455312861282">Ukwengeza i-akhawunti yesikole kukuvumela ukuba ungene ngemvume kalula kumawebhusayithi, izandiso, nezinhlelo zokusebenza njengomfundi kuyilapho usasebenza ngaphansi kokulawulwa ngumzali.</translation>
 <translation id="2261323523305321874">Umlawuli wakho wenze ushintsho olubanzi lwesistimu olukhubaza amaphrofayela athile amadala.</translation>
 <translation id="22614517036276112">Le dokhumenti noma idivayisi yakho ayihlangabezani nezinye izinqubomgomo zokuvikeleka zenhlangano yakho. Hlola nomphathi wakho mayelana nalokho okudingeka ukuthi kulungiswe.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index c72d49e..fdb41b7 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1953,6 +1953,12 @@
   <message name="IDS_SETTINGS_FLEDGE_PAGE_CURRENT_SITES_DESCRIPTION_EMPTY" translateable="false" desc="Section description for the current sites list when the sites list is empty in the FLEDGE preferences page.">
     Morbi quis orci in mauris tempus rutrum. Curabitur blandit orci tortor, pellentesque tempor turpis lacinia ac.
   </message>
+  <message name="IDS_SETTINGS_FLEDGE_PAGE_SEE_ALL_SITES_LABEL" translateable="false" desc="Label for the expand button which shows the rest of the sites list in the FLEDGE preferences page.">
+    Donec non mi
+  </message>
+  <message name="IDS_SETTINGS_FLEDGE_PAGE_BLOCK_SITE" translateable="false" desc="String on the button to block a site in the FLEDGE preferences page.">
+    Pellent
+  </message>
   <message name="IDS_SETTINGS_FLEDGE_PAGE_BLOCKED_SITES_HEADING" translateable="false" desc="Section title for the blocked sites list in the FLEDGE preferences page.">
     Curabitur a pharetra
   </message>
@@ -1962,6 +1968,9 @@
   <message name="IDS_SETTINGS_FLEDGE_PAGE_BLOCKED_SITES_DESCRIPTION_EMPTY" translateable="false" desc="Section description for the blocked sites list when there are no blocked sites in the FLEDGE preferences page.">
     Vivamus non urna sit amet turpis euismod semper. Phasellus sodales turpis ipsum.
   </message>
+  <message name="IDS_SETTINGS_FLEDGE_PAGE_ALLOW_SITE" translateable="false" desc="String on the button to re-allow a site in the FLEDGE preferences page.">
+    Aenean
+  </message>
   <message name="IDS_SETTINGS_FLEDGE_PAGE_FOOTER" translateable="false" desc="Footer with more information at the bottom of the FLEDGE preferences page.">
     Pellentesque sollicitudin purus sit amet felis fringilla blandit. Donec a eleifend ligula, <ph name="BEGIN_LINK1">&lt;a href="$1" target="_blank"&gt;</ph>et fringilla nunc<ph name="LINK_END1">&lt;/a&gt;</ph>. Vivamus sit amet cursus quam. <ph name="BEGIN_LINK2">&lt;a href="$2" target="_blank"&gt;</ph>Etiam ultricies rutrum orci<ph name="LINK_END2">&lt;/a&gt;</ph>, eget accumsan purus mattis in.
   </message>
@@ -3898,6 +3907,16 @@
   <message name="IDS_SETTINGS_SITE_SETTINGS_EXTENSION_ID_DESCRIPTION" desc="Description for an extension using its extension id.">
     ID: <ph name="EXTENSION_ID">$1<ex>mhabknllooicelmdboebjilbohdbihln</ex></ph>
   </message>
+  <!-- TODO(crbug.com/1378703): Update to use final strings -->
+  <message name="IDS_SETTINGS_SITE_SETTINGS_SITE_DATA_ALLOWED_SUB_LABEL" translateable="false" desc="The sublabel for the site data link when site data is allowed">
+    Allowed cras in lectus mi ac magna dapibus
+  </message>
+  <message name="IDS_SETTINGS_SITE_SETTINGS_SITE_DATA_BLOCKED_SUB_LABEL" translateable="false" desc="The sublabel for the site data link when site data is blocked">
+    Blocked cras in lectus mi ac magna dapibus
+  </message>
+  <message name="IDS_SETTINGS_SITE_SETTINGS_SITE_DATA_CLEAR_ON_EXIT_SUB_LABEL" translateable="false" desc="The sublabel for the site data link when site data is cleared on exit">
+    Clear on exit cras in lectus mi ac magna dapibus
+  </message>
 
   <message name="IDS_SETTINGS_NO_BLUETOOTH_DEVICES_FOUND" desc="Explanation for not showing Bluetooth devices in site settings.">
     No Bluetooth devices found
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 9bb3491..7fcb702 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -617,6 +617,8 @@
     "k_anonymity_service/k_anonymity_service_factory.h",
     "k_anonymity_service/k_anonymity_service_metrics.cc",
     "k_anonymity_service/k_anonymity_service_metrics.h",
+    "k_anonymity_service/k_anonymity_service_storage.cc",
+    "k_anonymity_service/k_anonymity_service_storage.h",
     "k_anonymity_service/k_anonymity_service_urls.h",
     "k_anonymity_service/k_anonymity_trust_token_getter.cc",
     "k_anonymity_service/k_anonymity_trust_token_getter.h",
@@ -1962,6 +1964,7 @@
     ":buildflags",
     ":dev_ui_browser_resources_grit",
     ":expired_flags_list",
+    ":k_anonymity_storage_proto",
     ":ntp_background_proto",
     ":permissions_proto",
     ":resource_prefetch_predictor_proto",
@@ -7820,6 +7823,10 @@
   }
 }
 
+proto_library("k_anonymity_storage_proto") {
+  sources = [ "k_anonymity_service/proto/k_anonymity_storage.proto" ]
+}
+
 proto_library("resource_prefetch_predictor_proto") {
   sources = [ "predictors/resource_prefetch_predictor.proto" ]
 }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 250c9f3..639be009 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -135,6 +135,7 @@
 #include "components/performance_manager/public/features.h"
 #include "components/permissions/features.h"
 #include "components/policy/core/common/features.h"
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
 #include "components/query_tiles/switches.h"
 #include "components/reading_list/features/reading_list_switches.h"
 #include "components/safe_browsing/core/common/features.h"
@@ -3238,6 +3239,52 @@
 };
 #endif
 
+constexpr FeatureEntry::FeatureParam
+    kPrivacySandboxSettings4ShowSampleDataForTesting[] = {
+        {privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting.name,
+         "true"}};
+constexpr FeatureEntry::FeatureParam kPrivacySandboxSettings4NoticeRequired[] =
+    {{privacy_sandbox::kPrivacySandboxSettings4NoticeRequired.name, "true"}};
+constexpr FeatureEntry::FeatureParam kPrivacySandboxSettings4ConsentRequired[] =
+    {{privacy_sandbox::kPrivacySandboxSettings4ConsentRequired.name, "true"}};
+constexpr FeatureEntry::FeatureParam
+    kPrivacySandboxSettings4ForceShowConsentForTesting[] = {
+        {privacy_sandbox::kPrivacySandboxSettings4ForceShowConsentForTesting
+             .name,
+         "true"}};
+constexpr FeatureEntry::FeatureParam
+    kPrivacySandboxSettings4ForceShowROWNoticeForTesting[] = {
+        {privacy_sandbox::kPrivacySandboxSettings4ForceShowNoticeRowForTesting
+             .name,
+         "true"}};
+constexpr FeatureEntry::FeatureParam
+    kPrivacySandboxSettings4ForceShowEEANoticeForTesting[] = {
+        {privacy_sandbox::kPrivacySandboxSettings4ForceShowNoticeEeaForTesting
+             .name,
+         "true"}};
+
+constexpr FeatureEntry::FeatureVariation kPrivacySandboxSettings4Variations[] =
+    {
+        {"Sample Data", kPrivacySandboxSettings4ShowSampleDataForTesting,
+         std::size(kPrivacySandboxSettings4ShowSampleDataForTesting), nullptr},
+        {"Notice Required", kPrivacySandboxSettings4NoticeRequired,
+         std::size(kPrivacySandboxSettings4NoticeRequired), nullptr},
+        {"Consent Required", kPrivacySandboxSettings4ConsentRequired,
+         std::size(kPrivacySandboxSettings4ConsentRequired), nullptr},
+        {"Force show consent",
+         kPrivacySandboxSettings4ForceShowConsentForTesting,
+         std::size(kPrivacySandboxSettings4ForceShowConsentForTesting),
+         nullptr},
+        {"Force show ROW notice",
+         kPrivacySandboxSettings4ForceShowROWNoticeForTesting,
+         std::size(kPrivacySandboxSettings4ForceShowROWNoticeForTesting),
+         nullptr},
+        {"Force show EEA notice",
+         kPrivacySandboxSettings4ForceShowEEANoticeForTesting,
+         std::size(kPrivacySandboxSettings4ForceShowEEANoticeForTesting),
+         nullptr},
+};
+
 // RECORDING USER METRICS FOR FLAGS:
 // -----------------------------------------------------------------------------
 // The first line of the entry is the internal name.
@@ -3515,6 +3562,9 @@
     {"apn-revamp", flag_descriptions::kApnRevampName,
      flag_descriptions::kApnRevampDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kApnRevamp)},
+    {"audio-flexible-loopback", flag_descriptions::kAudioFlexibleLoopbackName,
+     flag_descriptions::kAudioFlexibleLoopbackDescription, kOsCrOS,
+     PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootAudioFlexibleLoopback")},
     {"audio-hfp-mic-sr", flag_descriptions::kAudioHFPMicSRName,
      flag_descriptions::kAudioHFPMicSRDescription, kOsCrOS,
      PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootAudioHFPMicSR")},
@@ -4881,10 +4931,10 @@
      flag_descriptions::kIgnoreCSPInWebPaymentAPIName,
      flag_descriptions::kIgnoreCSPInWebPaymentAPIDescription, kOsAll,
      FEATURE_VALUE_TYPE(blink::features::kIgnoreCSPInWebPaymentAPI)},
-    {"clear-identity-in-can-make-payment",
-     flag_descriptions::kClearIdentityInCanMakePaymentEventName,
-     flag_descriptions::kClearIdentityInCanMakePaymentEventDescription, kOsAll,
-     FEATURE_VALUE_TYPE(blink::features::kClearIdentityInCanMakePaymentEvent)},
+    {"add-identity-in-can-make-payment",
+     flag_descriptions::kAddIdentityInCanMakePaymentEventName,
+     flag_descriptions::kAddIdentityInCanMakePaymentEventDescription, kOsAll,
+     FEATURE_VALUE_TYPE(blink::features::kAddIdentityInCanMakePaymentEvent)},
     {"enable-debug-for-store-billing",
      flag_descriptions::kAppStoreBillingDebugName,
      flag_descriptions::kAppStoreBillingDebugDescription, kOsAll,
@@ -7578,6 +7628,13 @@
      flag_descriptions::kPrivacySandboxAdsAPIsOverrideDescription, kOsAll,
      SINGLE_VALUE_TYPE(switches::kEnablePrivacySandboxAdsApis)},
 
+    {"privacy-sandbox-settings-4",
+     flag_descriptions::kPrivacySandboxSettings4Name,
+     flag_descriptions::kPrivacySandboxSettings4Description, kOsAll,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(privacy_sandbox::kPrivacySandboxSettings4,
+                                    kPrivacySandboxSettings4Variations,
+                                    "PrivacySandboxSettings4")},
+
 #if BUILDFLAG(IS_ANDROID)
     {"site-data-improvements", flag_descriptions::kSiteDataImprovementsName,
      flag_descriptions::kSiteDataImprovementsDescription, kOsAndroid,
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen.cc b/chrome/browser/ash/login/enrollment/enrollment_screen.cc
index 33bc496..1859288b 100644
--- a/chrome/browser/ash/login/enrollment/enrollment_screen.cc
+++ b/chrome/browser/ash/login/enrollment/enrollment_screen.cc
@@ -507,6 +507,11 @@
     return;
   }
 
+  if (enrollment_helper_ && enrollment_helper_->InProgress()) {
+    // Don't allow cancellation while enrollment is in progress.
+    return;
+  }
+
   // Record cancellation for that one enrollment mode.
   UMA(policy::kMetricEnrollmentCancelled);
 
diff --git a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper.h b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper.h
index 5a62d40..3a21ab5 100644
--- a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper.h
+++ b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper.h
@@ -118,6 +118,9 @@
   // Calls `callback` on completion.
   virtual void ClearAuth(base::OnceClosure callback) = 0;
 
+  // Returns true if enrollment is in progress.
+  virtual bool InProgress() const = 0;
+
  protected:
   // The user of this class is responsible for clearing auth data in some cases
   // (see comment for EnrollUsingProfile()).
diff --git a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
index e907154..2428a89f 100644
--- a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
+++ b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
@@ -217,6 +217,13 @@
   enrollment_handler_->StartEnrollment();
 }
 
+bool EnterpriseEnrollmentHelperImpl::InProgress() const {
+  // `enrollment_handler_` lives from `DoEnroll` till `OnEnrollmentFinished`
+  // which covers the whole enrollment process whether it ends with success or
+  // failure.
+  return enrollment_handler_ != nullptr;
+}
+
 void EnterpriseEnrollmentHelperImpl::GetDeviceAttributeUpdatePermission() {
   policy::BrowserPolicyConnectorAsh* connector =
       g_browser_process->platform_part()->browser_policy_connector_ash();
diff --git a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.h b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.h
index 3146ac23..de40863 100644
--- a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.h
+++ b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.h
@@ -49,6 +49,7 @@
              const policy::EnrollmentConfig& enrollment_config,
              const std::string& enrolling_user_domain,
              policy::LicenseType license_type) override;
+  bool InProgress() const override;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(EnterpriseEnrollmentTest,
diff --git a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_mock.h b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_mock.h
index 3e0e507a..2e61aaa 100644
--- a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_mock.h
+++ b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_mock.h
@@ -36,6 +36,7 @@
   MOCK_METHOD2(UpdateDeviceAttributes,
                void(const std::string& asset_id, const std::string& location));
   MOCK_METHOD1(ClearAuth, void(base::OnceClosure callback));
+  MOCK_METHOD(bool, InProgress, (), (const, override));
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc
index 5175aab..4b9422f 100644
--- a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc
+++ b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc
@@ -120,7 +120,14 @@
   EXPECT_FALSE(Notification().has_value());
 }
 
-TEST_F(InSessionPasswordChangeManagerTest, MaybeShow_WillNotExpire) {
+// TODO(crbug.com/1358349): re-enable this test. Flakily times out on debug
+// Linux and ChromeOS.
+#if !defined(NDEBUG) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
+#define MAYBE_MaybeShow_WillNotExpire DISABLED_MaybeShow_WillNotExpire
+#else
+#define MAYBE_MaybeShow_WillNotExpire MaybeShow_WillNotExpire
+#endif
+TEST_F(InSessionPasswordChangeManagerTest, MAYBE_MaybeShow_WillNotExpire) {
   SamlPasswordAttributes::DeleteFromPrefs(profile_->GetPrefs());
   manager_->MaybeShowExpiryNotification();
 
@@ -174,8 +181,9 @@
   EXPECT_FALSE(Notification().has_value());
 }
 
-// TODO(crbug.com/1358349): re-enable thie test. Flakily times out on Linux.
-#if BUILDFLAG(IS_LINUX)
+// TODO(crbug.com/1358349): re-enable this test. Flakily times out on debug
+// Linux and ChromeOS.
+#if !defined(NDEBUG) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
 #define MAYBE_MaybeShow_PasswordChanged DISABLED_MaybeShow_PasswordChanged
 #else
 #define MAYBE_MaybeShow_PasswordChanged MaybeShow_PasswordChanged
diff --git a/chrome/browser/ash/login/webview_login_browsertest.cc b/chrome/browser/ash/login/webview_login_browsertest.cc
index cfe7b86..32721e4 100644
--- a/chrome/browser/ash/login/webview_login_browsertest.cc
+++ b/chrome/browser/ash/login/webview_login_browsertest.cc
@@ -2132,13 +2132,8 @@
       &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
 };
 
-// TODO(crbug.com/1377241): The test times out on ASAN.
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_ProxyAuthTransfer DISABLED_ProxyAuthTransfer
-#else
-#define MAYBE_ProxyAuthTransfer ProxyAuthTransfer
-#endif
-IN_PROC_BROWSER_TEST_F(WebviewProxyAuthLoginTest, MAYBE_ProxyAuthTransfer) {
+// TODO(crbug.com/1377241): Test is flaky.
+IN_PROC_BROWSER_TEST_F(WebviewProxyAuthLoginTest, DISABLED_ProxyAuthTransfer) {
   WaitForSigninScreen();
 
   LoginHandler* login_handler = WaitForAuthRequested();
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc
index 7820c3a1..cbdc18b 100644
--- a/chrome/browser/ash/preferences.cc
+++ b/chrome/browser/ash/preferences.cc
@@ -842,8 +842,6 @@
     const bool enabled = mouse_reverse_scroll_.GetValue();
     if (user_is_active)
       mouse_settings.SetReverseScroll(enabled);
-    ReportBooleanPrefApplication(reason, "Mouse.ReverseScroll.Changed",
-                                 "Mouse.ReverseScroll.Started", enabled);
   }
 
   if (reason != REASON_PREF_CHANGED ||
@@ -943,8 +941,6 @@
     const bool enabled = mouse_acceleration_.GetValue();
     if (user_is_active)
       mouse_settings.SetAcceleration(enabled);
-    ReportBooleanPrefApplication(reason, "Mouse.Acceleration.Changed",
-                                 "Mouse.Acceleration.Started", enabled);
   }
   if (reason != REASON_PREF_CHANGED ||
       pref_name == ::prefs::kMouseScrollAcceleration) {
@@ -965,8 +961,6 @@
     const bool enabled = touchpad_acceleration_.GetValue();
     if (user_is_active)
       touchpad_settings.SetAcceleration(enabled);
-    ReportBooleanPrefApplication(reason, "Touchpad.Acceleration.Changed",
-                                 "Touchpad.Acceleration.Started", enabled);
   }
   if (reason != REASON_PREF_CHANGED ||
       pref_name == ::prefs::kTouchpadScrollAcceleration) {
diff --git a/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc b/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc
index 4d9691a..5670034 100644
--- a/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc
+++ b/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc
@@ -164,6 +164,70 @@
   ExpectHistogramIncreasedBy(0);
 }
 
+IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest,
+                       PrivateNetworkAccessIgnoredCrossSitePreflightError) {
+  ASSERT_TRUE(content::NavigateToURL(
+      web_contents(),
+      https_server().GetURL(
+          "a.com",
+          "/private_network_access/no-favicon-treat-as-public-address.html")));
+
+  ASSERT_EQ(true, content::EvalJs(
+                      web_contents(),
+                      content::JsReplace(
+                          "fetch($1).then(response => response.ok)",
+                          https_server().GetURL("b.com", "/cors-ok.txt"))));
+
+  CheckCounter(WebFeature::kPrivateNetworkAccessIgnoredPreflightError, 1);
+  CheckCounter(
+      WebFeature::kPrivateNetworkAccessIgnoredCrossOriginPreflightError, 1);
+  CheckCounter(WebFeature::kPrivateNetworkAccessIgnoredCrossSitePreflightError,
+               1);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    ChromeWebPlatformSecurityMetricsBrowserTest,
+    PrivateNetworkAccessIgnoredCrossOriginSameSitePreflightError) {
+  ASSERT_TRUE(content::NavigateToURL(
+      web_contents(),
+      https_server().GetURL(
+          "a.com",
+          "/private_network_access/no-favicon-treat-as-public-address.html")));
+
+  ASSERT_EQ(true, content::EvalJs(web_contents(),
+                                  content::JsReplace(
+                                      "fetch($1).then(response => response.ok)",
+                                      https_server().GetURL("subdomain.a.com",
+                                                            "/cors-ok.txt"))));
+
+  CheckCounter(WebFeature::kPrivateNetworkAccessIgnoredPreflightError, 1);
+  CheckCounter(
+      WebFeature::kPrivateNetworkAccessIgnoredCrossOriginPreflightError, 1);
+  CheckCounter(WebFeature::kPrivateNetworkAccessIgnoredCrossSitePreflightError,
+               0);
+}
+
+IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest,
+                       PrivateNetworkAccessIgnoredSameOriginPreflightError) {
+  ASSERT_TRUE(content::NavigateToURL(
+      web_contents(),
+      https_server().GetURL(
+          "a.com",
+          "/private_network_access/no-favicon-treat-as-public-address.html")));
+
+  ASSERT_EQ(true, content::EvalJs(
+                      web_contents(),
+                      content::JsReplace(
+                          "fetch($1).then(response => response.ok)",
+                          https_server().GetURL("a.com", "/cors-ok.txt"))));
+
+  CheckCounter(WebFeature::kPrivateNetworkAccessIgnoredPreflightError, 1);
+  CheckCounter(
+      WebFeature::kPrivateNetworkAccessIgnoredCrossOriginPreflightError, 0);
+  CheckCounter(WebFeature::kPrivateNetworkAccessIgnoredCrossSitePreflightError,
+               0);
+}
+
 // Check the kCrossOriginOpenerPolicyReporting feature usage. COOP-Report-Only +
 // HTTP => 0 count.
 IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest,
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index b7bfe10..c53dde05 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -834,6 +834,7 @@
     "//components/feedback",
     "//components/gcm_driver",
     "//components/guest_view/browser",
+    "//components/guest_view/common:mojom",
     "//components/history/core/browser",
     "//components/infobars/content",
     "//components/infobars/core",
diff --git a/chrome/browser/extensions/DEPS b/chrome/browser/extensions/DEPS
index 2078f57..c3792f51 100644
--- a/chrome/browser/extensions/DEPS
+++ b/chrome/browser/extensions/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+components/app_constants/constants.h",
   "+components/crash/content/browser/error_reporting",
+  "+components/guest_view/common",
   "+components/live_caption",
   "+extensions/strings/grit/extensions_strings.h",
   "+services/network/public",
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
index 7521c4a..69126850 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -34,6 +34,7 @@
 #include "chrome/common/url_constants.h"
 #include "components/dom_distiller/core/url_constants.h"
 #include "components/download/public/common/quarantine_connection.h"
+#include "components/guest_view/common/guest_view.mojom.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/browser_url_handler.h"
@@ -61,6 +62,7 @@
 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
 #include "extensions/browser/info_map.h"
 #include "extensions/browser/process_map.h"
+#include "extensions/browser/renderer_startup_helper.h"
 #include "extensions/browser/url_loader_factory_manager.h"
 #include "extensions/browser/url_request_util.h"
 #include "extensions/browser/view_type_utils.h"
@@ -70,6 +72,9 @@
 #include "extensions/common/manifest_handlers/app_isolation_info.h"
 #include "extensions/common/manifest_handlers/background_info.h"
 #include "extensions/common/manifest_handlers/web_accessible_resources_info.h"
+#include "extensions/common/mojom/event_router.mojom.h"
+#include "extensions/common/mojom/guest_view.mojom.h"
+#include "extensions/common/mojom/renderer_host.mojom.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/common/switches.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
@@ -772,9 +777,10 @@
   associated_registry->AddInterface<guest_view::mojom::GuestViewHost>(
       base::BindRepeating(&ExtensionsGuestView::CreateForComponents,
                           host->GetID()));
-  associated_registry->AddInterface<extensions::mojom::GuestView>(
-      base::BindRepeating(&ExtensionsGuestView::CreateForExtensions,
-                          host->GetID()));
+  associated_registry->AddInterface<mojom::GuestView>(base::BindRepeating(
+      &ExtensionsGuestView::CreateForExtensions, host->GetID()));
+  associated_registry->AddInterface<mojom::RendererHost>(base::BindRepeating(
+      &RendererStartupHelper::BindForRenderer, host->GetID()));
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index ff14f8f6..9d8345e 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -11,12 +11,17 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
+#include "base/values.h"
 #include "base/version.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/extensions/activity_log/activity_action_constants.h"
+#include "chrome/browser/extensions/activity_log/activity_actions.h"
 #include "chrome/browser/extensions/activity_log/activity_log.h"
 #include "chrome/browser/extensions/api/chrome_extensions_api_client.h"
 #include "chrome/browser/extensions/api/favicon/favicon_util.h"
@@ -65,6 +70,7 @@
 #include "components/sessions/content/session_tab_helper.h"
 #include "components/update_client/update_client.h"
 #include "components/version_info/version_info.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_switches.h"
@@ -81,6 +87,7 @@
 #include "extensions/common/features/feature_channel.h"
 #include "extensions/common/permissions/permission_set.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/constants/ash_switches.h"
@@ -127,6 +134,32 @@
   ScopedProfileKeepAlive profile_keep_alive_;
 };
 
+bool ShouldLogExtensionAction(content::BrowserContext* browser_context,
+                              const std::string& extension_id) {
+  // We only send these IPCs if activity logging is enabled, but due to race
+  // conditions (e.g. logging gets disabled but the renderer sends the message
+  // before it gets updated), we still need this check here.
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  return browser_context &&
+         g_browser_process->profile_manager()->IsValidProfile(
+             browser_context) &&
+         ActivityLog::GetInstance(browser_context) &&
+         ActivityLog::GetInstance(browser_context)->ShouldLog(extension_id);
+}
+
+// Logs an action to the extension activity log for the specified profile.
+void AddActionToExtensionActivityLog(content::BrowserContext* browser_context,
+                                     scoped_refptr<Action> action) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  // If the action included a URL, check whether it is for an incognito profile.
+  // The check is performed here so that it can safely be done from the UI
+  // thread.
+  if (action->page_url().is_valid() || !action->page_title().empty()) {
+    action->set_page_incognito(browser_context->IsOffTheRecord());
+  }
+  ActivityLog::GetInstance(browser_context)->LogAction(action);
+}
+
 }  // namespace
 
 ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() {
@@ -796,4 +829,68 @@
   granted_permissions->SetScriptableHosts(std::move(new_scriptable_hosts));
 }
 
+void ChromeExtensionsBrowserClient::AddAPIActionToActivityLog(
+    content::BrowserContext* browser_context,
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {
+  AddAPIActionOrEventToActivityLog(browser_context, extension_id,
+                                   Action::ACTION_API_CALL, call_name,
+                                   std::move(args), extra);
+}
+
+void ChromeExtensionsBrowserClient::AddEventToActivityLog(
+    content::BrowserContext* browser_context,
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {
+  AddAPIActionOrEventToActivityLog(browser_context, extension_id,
+                                   Action::ACTION_API_EVENT, call_name,
+                                   std::move(args), extra);
+}
+
+void ChromeExtensionsBrowserClient::AddDOMActionToActivityLog(
+    content::BrowserContext* browser_context,
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const GURL& url,
+    const std::u16string& url_title,
+    int call_type) {
+  if (!ShouldLogExtensionAction(browser_context, extension_id)) {
+    return;
+  }
+
+  auto action = base::MakeRefCounted<Action>(
+      extension_id, base::Time::Now(), Action::ACTION_DOM_ACCESS, call_name);
+  action->set_args(std::move(args));
+  action->set_page_url(url);
+  action->set_page_title(base::UTF16ToUTF8(url_title));
+  action->mutable_other().Set(activity_log_constants::kActionDomVerb,
+                              call_type);
+  AddActionToExtensionActivityLog(browser_context, action);
+}
+
+void ChromeExtensionsBrowserClient::AddAPIActionOrEventToActivityLog(
+    content::BrowserContext* browser_context,
+    const ExtensionId& extension_id,
+    Action::ActionType action_type,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {
+  if (!ShouldLogExtensionAction(browser_context, extension_id)) {
+    return;
+  }
+
+  auto action = base::MakeRefCounted<Action>(extension_id, base::Time::Now(),
+                                             action_type, call_name);
+  action->set_args(std::move(args));
+  if (!extra.empty()) {
+    action->mutable_other().Set(activity_log_constants::kActionExtra, extra);
+  }
+  AddActionToExtensionActivityLog(browser_context, action);
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index d33bb1c2..d82cf9e 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -11,11 +11,14 @@
 
 #include "base/lazy_instance.h"
 #include "base/memory/ref_counted.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "chrome/browser/extensions/activity_log/activity_actions.h"
 #include "chrome/browser/extensions/user_script_listener.h"
 #include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/kiosk/kiosk_delegate.h"
+#include "extensions/common/extension_id.h"
 #include "extensions/common/mojom/view_type.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -217,10 +220,35 @@
   void AddAdditionalAllowedHosts(
       const PermissionSet& desired_permissions,
       PermissionSet* granted_permissions) const override;
+  void AddAPIActionToActivityLog(content::BrowserContext* browser_context,
+                                 const ExtensionId& extension_id,
+                                 const std::string& call_name,
+                                 base::Value::List args,
+                                 const std::string& extra) override;
+  void AddEventToActivityLog(content::BrowserContext* browser_context,
+                             const ExtensionId& extension_id,
+                             const std::string& call_name,
+                             base::Value::List args,
+                             const std::string& extra) override;
+  void AddDOMActionToActivityLog(content::BrowserContext* browser_context,
+                                 const ExtensionId& extension_id,
+                                 const std::string& call_name,
+                                 base::Value::List args,
+                                 const GURL& url,
+                                 const std::u16string& url_title,
+                                 int call_type) override;
 
  private:
   friend struct base::LazyInstanceTraitsBase<ChromeExtensionsBrowserClient>;
 
+  void AddAPIActionOrEventToActivityLog(
+      content::BrowserContext* browser_context,
+      const ExtensionId& extension_id,
+      Action::ActionType action_type,
+      const std::string& call_name,
+      base::Value::List args,
+      const std::string& extra);
+
   // Support for ProcessManager.
   std::unique_ptr<ChromeProcessManagerDelegate> process_manager_delegate_;
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 4edb5ed..b08142e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -77,6 +77,11 @@
     "expiry_milestone": 118
   },
   {
+    "name": "add-identity-in-can-make-payment",
+    "owners": [ "rouslan", "chrome-payments-team@google.com" ],
+    "expiry_milestone": 115
+  },
+  {
     "name": "add-to-homescreen-iph",
     "owners": [ "shaktisahu" ],
     "expiry_milestone": 100
@@ -378,6 +383,11 @@
     "expiry_milestone": 117
   },
   {
+    "name": "audio-flexible-loopback",
+    "owners": ["aaronyu", "htcheong", "chromeos-audio@google.com" ],
+    "expiry_milestone": 120
+  },
+  {
     "name": "audio-hfp-mic-sr",
     "owners": [ "paulhsia", "cranelw", "chromeos-audio@google.com" ],
     "expiry_milestone": 120
@@ -987,11 +997,6 @@
     "expiry_milestone": 115
   },
   {
-    "name": "clear-identity-in-can-make-payment",
-    "owners": [ "rouslan", "web-payments-team@google.com" ],
-    "expiry_milestone": 115
-  },
-  {
     "name": "client-storage-access-context-auditing",
     "owners": [
       "sauski",
@@ -5445,7 +5450,7 @@
   {
     "name": "password-edit-dialog-with-details",
     "owners": ["atsvirchkova@google.com", "ioanap"],
-    "expiry_milestone": 109
+    "expiry_milestone": 112
   },
   {
     "name": "password-import",
@@ -5593,6 +5598,14 @@
     "expiry_milestone": 112
   },
   {
+    "name": "privacy-sandbox-settings-4",
+    "owners": [
+      "sauski",
+      "olesiamarukhno",
+      "tommasin"],
+    "expiry_milestone": 115
+  },
+  {
     "name": "private-aggregation-developer-mode",
     "owners": [
       "//content/browser/private_aggregation/OWNERS"
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 34bf3b5..660bf52 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2452,6 +2452,10 @@
     "Fenced Frames, Shared Storage, Private Aggregation, and their associated "
     "features.";
 
+const char kPrivacySandboxSettings4Name[] = "Privacy Sandbox Settings V4";
+const char kPrivacySandboxSettings4Description[] =
+    "Enables updated Privacy Sandbox UI";
+
 const char kPrivateAggregationDeveloperModeName[] =
     "Private Aggregation developer mode";
 const char kPrivateAggregationDeveloperModeDescription[] =
@@ -3176,11 +3180,12 @@
     "directive for Web Payment API when fetching manifest files, app icons, "
     "and service worker JavaScript files.";
 
-const char kClearIdentityInCanMakePaymentEventName[] =
-    "Remove identity from canmakepayment event";
-const char kClearIdentityInCanMakePaymentEventDescription[] =
-    "Do not share the merchant and user identity with the payment app when the "
-    "merchant checks whether the payment app can make payments.";
+const char kAddIdentityInCanMakePaymentEventName[] =
+    "Add identity to canmakepayment event";
+const char kAddIdentityInCanMakePaymentEventDescription[] =
+    "Temporarily re-enable the deprecated feature of sharing the merchant and "
+    "user identity with the payment app when the merchant checks whether the "
+    "payment app can make payments.";
 
 const char kAppStoreBillingDebugName[] =
     "Web Payments App Store Billing Debug Mode";
@@ -4666,6 +4671,11 @@
     "Enable unified desktop mode which allows a window to span multiple "
     "displays.";
 
+const char kAudioFlexibleLoopbackName[] =
+    "ChromeOS flexible loopback API support";
+const char kAudioFlexibleLoopbackDescription[] =
+    "Enable flexible loopback API support in ChromeOS.";
+
 const char kAudioHFPMicSRName[] =
     "Audio super-resolution Bluetooth HFP microphone";
 const char kAudioHFPMicSRDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 741051b..e1c00f3 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1373,6 +1373,9 @@
 extern const char kPrivacySandboxAdsAPIsOverrideName[];
 extern const char kPrivacySandboxAdsAPIsOverrideDescription[];
 
+extern const char kPrivacySandboxSettings4Name[];
+extern const char kPrivacySandboxSettings4Description[];
+
 extern const char kPrivateAggregationDeveloperModeName[];
 extern const char kPrivateAggregationDeveloperModeDescription[];
 
@@ -1806,8 +1809,8 @@
 extern const char kIgnoreCSPInWebPaymentAPIName[];
 extern const char kIgnoreCSPInWebPaymentAPIDescription[];
 
-extern const char kClearIdentityInCanMakePaymentEventName[];
-extern const char kClearIdentityInCanMakePaymentEventDescription[];
+extern const char kAddIdentityInCanMakePaymentEventName[];
+extern const char kAddIdentityInCanMakePaymentEventDescription[];
 
 extern const char kAppStoreBillingDebugName[];
 extern const char kAppStoreBillingDebugDescription[];
@@ -2681,6 +2684,9 @@
 extern const char kAshEnableUnifiedDesktopName[];
 extern const char kAshEnableUnifiedDesktopDescription[];
 
+extern const char kAudioFlexibleLoopbackName[];
+extern const char kAudioFlexibleLoopbackDescription[];
+
 extern const char kAudioHFPMicSRName[];
 extern const char kAudioHFPMicSRDescription[];
 
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
index 1cff66d..c9bcf83 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
@@ -43,6 +43,7 @@
 constexpr size_t kMaxQueueSize = 100;
 
 const char kKAnonType[] = "fledge";
+const char kKAnonymityServiceStoragePath[] = "KAnonymityService";
 
 // TODO(behamilton): Change description once indirect (OHTTP) requests are
 // supported.
@@ -162,13 +163,20 @@
     : url_loader_factory_(profile->GetURLLoaderFactory()),
       enable_ohttp_requests_(base::FeatureList::IsEnabled(
           features::kKAnonymityServiceOHTTPRequests)),
+      storage_((profile && !profile->IsOffTheRecord())
+                   ? CreateKAnonymitySqlStorageForPath(
+                         profile->GetDefaultStoragePartition()
+                             ->GetPath()
+                             .AppendASCII(kKAnonymityServiceStoragePath))
+                   : std::make_unique<KAnonymityServiceMemoryStorage>()),
       // Pass the auth server origin as if it is our "top frame".
       trust_token_answerer_(url::Origin::Create(GURL(
                                 features::kKAnonymityServiceAuthServer.Get())),
                             profile),
       token_getter_(IdentityManagerFactory::GetForProfile(profile),
                     url_loader_factory_,
-                    &trust_token_answerer_),
+                    &trust_token_answerer_,
+                    storage_.get()),
       profile_(profile) {
   // We are currently relying on callers of this service to limit which users
   // are allowed to use this service. No children should use this service
@@ -201,6 +209,18 @@
       std::make_unique<PendingJoinRequest>(std::move(id), std::move(callback)));
   if (join_queue_.size() > 1)
     return;
+
+  storage_->WaitUntilReady(
+      base::BindOnce(&KAnonymityServiceClient::JoinSetOnStorageReady,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void KAnonymityServiceClient::JoinSetOnStorageReady(
+    KAnonymityServiceStorage::InitStatus status) {
+  if (status != KAnonymityServiceStorage::InitStatus::kInitOk) {
+    FailJoinSetRequests();
+    return;
+  }
   JoinSetStartNextQueued();
 }
 
@@ -211,12 +231,16 @@
 
 void KAnonymityServiceClient::JoinSetCheckOHTTPKey() {
   // We need the OHTTP key to send the OHTTP request.
-  if (enable_ohttp_requests_ && joinset_ohttp_key_with_expiration_.expiration <=
-                                    base::Time::Now() + kRequestMargin) {
+  absl::optional<OHTTPKeyAndExpiration> ohttp_key =
+      storage_->GetOHTTPKeyFor(join_origin_);
+  if (enable_ohttp_requests_ &&
+      (!ohttp_key ||
+       ohttp_key->expiration <= base::Time::Now() + kRequestMargin)) {
     RequestJoinSetOHTTPKey();
     return;
   }
-  JoinSetCheckTrustTokens();
+  JoinSetCheckTrustTokens(
+      std::move(ohttp_key).value_or(OHTTPKeyAndExpiration{}));
 }
 
 void KAnonymityServiceClient::RequestJoinSetOHTTPKey() {
@@ -247,20 +271,22 @@
     return;
   }
 
-  joinset_ohttp_key_with_expiration_ =
-      OHTTPKeyAndExpiration{*response, base::Time::Now() + kKeyCacheDuration};
-  JoinSetCheckTrustTokens();
+  OHTTPKeyAndExpiration ohttp_key{*response,
+                                  base::Time::Now() + kKeyCacheDuration};
+  storage_->UpdateOHTTPKeyFor(join_origin_, ohttp_key);
+  JoinSetCheckTrustTokens(std::move(ohttp_key));
 }
 
-void KAnonymityServiceClient::JoinSetCheckTrustTokens() {
+void KAnonymityServiceClient::JoinSetCheckTrustTokens(
+    OHTTPKeyAndExpiration ohttp_key) {
   token_getter_.TryGetTrustTokenAndKey(
       base::BindOnce(&KAnonymityServiceClient::OnMaybeHasTrustTokens,
-                     weak_ptr_factory_.GetWeakPtr()));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(ohttp_key)));
 }
 
 void KAnonymityServiceClient::OnMaybeHasTrustTokens(
-    absl::optional<KAnonymityTrustTokenGetter::KeyAndNonUniqueUserId>
-        maybe_key_and_id) {
+    OHTTPKeyAndExpiration ohttp_key,
+    absl::optional<KeyAndNonUniqueUserId> maybe_key_and_id) {
   if (!maybe_key_and_id) {
     FailJoinSetRequests();
     return;
@@ -272,11 +298,12 @@
   }
   // Once we know we have a trust token and have the OHTTP key we can send the
   // request.
-  JoinSetSendRequest(std::move(*maybe_key_and_id));
+  JoinSetSendRequest(std::move(ohttp_key), std::move(*maybe_key_and_id));
 }
 
 void KAnonymityServiceClient::JoinSetSendRequest(
-    KAnonymityTrustTokenGetter::KeyAndNonUniqueUserId key_and_id) {
+    OHTTPKeyAndExpiration ohttp_key,
+    KeyAndNonUniqueUserId key_and_id) {
   RecordJoinSetAction(KAnonymityServiceJoinSetAction::kSendJoinSetRequest);
   std::string hashed_id = crypto::SHA256HashString(join_queue_.front()->id);
   std::string encoded_id;
@@ -288,7 +315,7 @@
   request->relay_url = GURL(features::kKAnonymityServiceJoinRelayServer.Get());
   request->traffic_annotation = net::MutableNetworkTrafficAnnotationTag(
       kKAnonymityServiceJoinSetTrafficAnnotation);
-  request->key_config = joinset_ohttp_key_with_expiration_.key;
+  request->key_config = ohttp_key.key;
 
   request->resource_url = join_origin_.GetURL().Resolve(
       base::StringPrintf(kJoinSetPathFmt, kKAnonType, encoded_id.c_str(),
@@ -338,7 +365,9 @@
     // this error implies that the server is not overloaded.
     if (error_code == net::ERR_TRUST_TOKEN_OPERATION_FAILED &&
         join_queue_.front()->retries++ < kMaxRetries) {
-      JoinSetCheckTrustTokens();
+      // Retry from checking the OHTTP Key. This will also get a trust token and
+      // send the request again.
+      JoinSetCheckOHTTPKey();
       return;
     }
     RecordJoinSetAction(KAnonymityServiceJoinSetAction::kJoinSetRequestFailed);
@@ -402,16 +431,30 @@
   // We only process one query at a time for simplicity.
   if (query_queue_.size() > 1)
     return;
+
+  storage_->WaitUntilReady(
+      base::BindOnce(&KAnonymityServiceClient::QuerySetsOnStorageReady,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void KAnonymityServiceClient::QuerySetsOnStorageReady(
+    KAnonymityServiceStorage::InitStatus status) {
+  if (status != KAnonymityServiceStorage::InitStatus::kInitOk) {
+    FailQuerySetsRequests();
+    return;
+  }
   QuerySetsCheckOHTTPKey();
 }
 
 void KAnonymityServiceClient::QuerySetsCheckOHTTPKey() {
-  if (queryset_ohttp_key_with_expiration_.expiration <=
-      base::Time::Now() + kRequestMargin) {
+  absl::optional<OHTTPKeyAndExpiration> ohttp_key =
+      storage_->GetOHTTPKeyFor(query_origin_);
+  if (!ohttp_key ||
+      ohttp_key->expiration <= base::Time::Now() + kRequestMargin) {
     RequestQuerySetOHTTPKey();
     return;
   }
-  QuerySetsSendRequest();
+  QuerySetsSendRequest(std::move(ohttp_key.value()));
 }
 
 void KAnonymityServiceClient::RequestQuerySetOHTTPKey() {
@@ -444,13 +487,14 @@
     FailQuerySetsRequests();
     return;
   }
-
-  queryset_ohttp_key_with_expiration_ =
-      OHTTPKeyAndExpiration{*response, base::Time::Now() + kKeyCacheDuration};
-  QuerySetsSendRequest();
+  OHTTPKeyAndExpiration ohttp_key{*response,
+                                  base::Time::Now() + kKeyCacheDuration};
+  storage_->UpdateOHTTPKeyFor(query_origin_, ohttp_key);
+  QuerySetsSendRequest(std::move(ohttp_key));
 }
 
-void KAnonymityServiceClient::QuerySetsSendRequest() {
+void KAnonymityServiceClient::QuerySetsSendRequest(
+    OHTTPKeyAndExpiration ohttp_key) {
   DCHECK(!query_url_loader_);
   RecordQuerySetAction(KAnonymityServiceQuerySetAction::kSendQuerySetRequest);
 
@@ -486,7 +530,7 @@
   request->relay_url = GURL(features::kKAnonymityServiceQueryRelayServer.Get());
   request->traffic_annotation = net::MutableNetworkTrafficAnnotationTag(
       kKAnonymityServiceQuerySetTrafficAnnotation);
-  request->key_config = queryset_ohttp_key_with_expiration_.key;
+  request->key_config = ohttp_key.key;
 
   request->resource_url = query_origin_.GetURL().Resolve(
       base::StrCat({kQuerySetsPath, google_apis::GetAPIKey()}));
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.h b/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
index 10854d7b..609ad21 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
@@ -14,6 +14,7 @@
 #include "base/containers/circular_deque.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/time/time.h"
+#include "chrome/browser/k_anonymity_service/k_anonymity_service_storage.h"
 #include "chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h"
 #include "chrome/browser/k_anonymity_service/remote_trust_token_query_answerer.h"
 #include "chrome/browser/profiles/profile.h"
@@ -96,13 +97,8 @@
     base::OnceCallback<void(std::vector<bool>)> callback;
   };
 
-  struct OHTTPKeyAndExpiration {
-    // The OHTTP key in this struct is formatted as described in
-    // https://www.ietf.org/archive/id/draft-ietf-ohai-ohttp-02.html#name-key-configuration-encoding
-    std::string key;  // OHTTP key
-    base::Time expiration;
-  };
-
+  // Called when storage is ready to for us to make requests.
+  void JoinSetOnStorageReady(KAnonymityServiceStorage::InitStatus status);
   // Starts processing items in the queue by calling JoinSetCheckTrustTokens()
   void JoinSetStartNextQueued();
   // Checks that the cached OHTTP Key is still valid and if not calls
@@ -117,16 +113,16 @@
   void OnGotJoinSetOHTTPKey(std::unique_ptr<std::string> response);
 
   // Calls the token_getter_ to ensure there is a trust token for the request.
-  void JoinSetCheckTrustTokens();
+  void JoinSetCheckTrustTokens(OHTTPKeyAndExpiration ohttp_key);
   // Asynchronous callback from token_getter_ which is passed the key commitment
   // and non-unique client ID that are needed to complete JoinSet. If the
   // provided optional is not empty this triggers the JoinSet request.
   void OnMaybeHasTrustTokens(
-      absl::optional<KAnonymityTrustTokenGetter::KeyAndNonUniqueUserId>
-          maybe_key_and_id);
+      OHTTPKeyAndExpiration ohttp_key,
+      absl::optional<KeyAndNonUniqueUserId> maybe_key_and_id);
   // Starts the OHTTP JoinSet request for the join_queue_.front() request.
-  void JoinSetSendRequest(
-      KAnonymityTrustTokenGetter::KeyAndNonUniqueUserId key_and_id);
+  void JoinSetSendRequest(OHTTPKeyAndExpiration ohttp_key,
+                          KeyAndNonUniqueUserId key_and_id);
   // Handle the response to the JoinSet request and call CompleteJoinSetRequest
   // if successful.
   void JoinSetOnGotResponse(const absl::optional<std::string>& response,
@@ -142,6 +138,8 @@
   // the provided status and removes it from the queue.
   void DoJoinSetCallback(bool status);
 
+  // Called when storage is ready to for us to make requests.
+  void QuerySetsOnStorageReady(KAnonymityServiceStorage::InitStatus status);
   // Checks that the cached OHTTP Key is still valid and if not calls
   // RequestQuerySetOHTTPKey to refresh it.
   void QuerySetsCheckOHTTPKey();
@@ -155,7 +153,7 @@
   // failure for all requests on the query_queue_.
   void FailFetchingQueryOHTTPKey();
   // Starts the OHTTP QuerySet request for the current QueryRequest.
-  void QuerySetsSendRequest();
+  void QuerySetsSendRequest(OHTTPKeyAndExpiration ohttp_key);
   // Called as an asynchronous response to the OHTTP request started by
   // QuerySetsSendRequest. Passes the JSON response received to be decoded and
   // handled in QuerySetsOnParsedResponse.
@@ -179,10 +177,6 @@
   // query_queue_.
   void DoQuerySetsCallback(std::vector<bool> result);
 
-  // cached data
-  OHTTPKeyAndExpiration joinset_ohttp_key_with_expiration_;
-  OHTTPKeyAndExpiration queryset_ohttp_key_with_expiration_;
-
   // queues
   base::circular_deque<std::unique_ptr<PendingJoinRequest>> join_queue_;
   base::circular_deque<std::unique_ptr<PendingQueryRequest>> query_queue_;
@@ -195,6 +189,8 @@
   std::unique_ptr<network::SimpleURLLoader> query_url_loader_;
   bool enable_ohttp_requests_;
   net::IsolationInfo isolation_info_;
+
+  std::unique_ptr<KAnonymityServiceStorage> storage_;
   RemoteTrustTokenQueryAnswerer trust_token_answerer_;
   KAnonymityTrustTokenGetter token_getter_;
 
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
index 5ea9c92..122b3cc 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
@@ -437,7 +437,8 @@
       : KAnonymityServiceClientTest(
             std::make_unique<content::BrowserTaskEnvironment>(
                 content::BrowserTaskEnvironment::IO_MAINLOOP)),
-        network_context_receiver_(&network_context_) {}
+        network_context_receiver_(&network_context_),
+        otr_network_context_receiver_(&network_context_) {}
 
  protected:
   void SetUp() override {
@@ -461,6 +462,15 @@
         network_context_receiver_.BindNewPipeAndPassRemote());
   }
 
+  void CreateOffTheRecordProfile() {
+    TestingProfile::Builder builder;
+    builder.SetSharedURLLoaderFactory(profile_->GetURLLoaderFactory());
+    Profile* otr_profile = builder.BuildOffTheRecord(
+        profile_.get(), Profile::OTRProfileID::PrimaryID());
+    otr_profile->GetDefaultStoragePartition()->SetNetworkContextForTesting(
+        otr_network_context_receiver_.BindNewPipeAndPassRemote());
+  }
+
   void RespondWithJoinKey() {
     SimulateResponseForPendingRequest(
         "https://chromekanonymity-pa.googleapis.com/v1/proxy/keys",
@@ -490,6 +500,7 @@
  private:
   OhttpTestNetworkContext network_context_;
   mojo::Receiver<network::mojom::NetworkContext> network_context_receiver_;
+  mojo::Receiver<network::mojom::NetworkContext> otr_network_context_receiver_;
 };
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryJoinSetGetOHTTPKeyFailed) {
@@ -654,7 +665,6 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetBadResponse) {
-  InitializeIdentity(/*signed_on=*/true);
   base::HistogramTester hist;
   std::vector<std::string> sets;
   sets.push_back("1");
@@ -706,7 +716,10 @@
       }]
     })",                               // hashes should be base64 encoded values
   };
+
+  bool key_initialized = false;
   for (const auto& response : bad_responses) {
+    task_environment_->RunUntilIdle();
     base::RunLoop run_loop;
     KAnonymityServiceClient k_service(profile());
     k_service.QuerySets(sets,
@@ -715,22 +728,23 @@
                               EXPECT_EQ(0u, result.size()) << response;
                               run_loop.Quit();
                             }));
-    RespondWithQueryKey();
+    if (!key_initialized) {
+      key_initialized = true;
+      RespondWithQueryKey();
+    }
     RespondWithQuery(response);
     run_loop.Run();
   }
   CheckQuerySetHistogramActions(
       hist, {{KAnonymityServiceQuerySetAction::kQuerySet, bad_responses.size()},
-             {KAnonymityServiceQuerySetAction::kFetchQuerySetOHTTPKey,
-              bad_responses.size()},
+             {KAnonymityServiceQuerySetAction::kFetchQuerySetOHTTPKey, 1},
              {KAnonymityServiceQuerySetAction::kSendQuerySetRequest,
               bad_responses.size()},
              {KAnonymityServiceQuerySetAction::kQuerySetRequestParseError,
               bad_responses.size()}});
 }
 
-TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetSignedIn) {
-  InitializeIdentity(true);
+TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySet) {
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -761,7 +775,6 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetMultipleSets) {
-  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -812,7 +825,6 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetCoalescesSplitSets) {
-  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -853,7 +865,6 @@
 
 TEST_F(KAnonymityServiceClientJoinQueryTest,
        TryQuerySetSingleFailureDropsAllRequests) {
-  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -888,4 +899,58 @@
        {KAnonymityServiceQuerySetAction::kFetchQuerySetOHTTPKeyFailed, 1}});
 }
 
+TEST_F(KAnonymityServiceClientJoinQueryTest,
+       StorageDoesNotPersistWhenOffTheRecord) {
+  CreateOffTheRecordProfile();
+  std::vector<std::string> sets;
+  sets.push_back("1");
+  Profile* otr_profile =
+      profile()->GetPrimaryOTRProfile(/*create_if_needed=*/false);
+  ASSERT_TRUE(otr_profile);
+  {
+    KAnonymityServiceClient k_service(otr_profile);
+    base::RunLoop run_loop;
+    k_service.QuerySets(
+        sets, base::BindLambdaForTesting([&run_loop](std::vector<bool> result) {
+          ASSERT_EQ(1u, result.size());
+          EXPECT_TRUE(result[0]);
+          run_loop.Quit();
+        }));
+    RespondWithQueryKey();
+    RespondWithQuery(
+        R"({
+        "kAnonymousSets": [{
+          "hashes": [
+            "a4ayc/80/OGda4BO/1o/V0etpOqiLx1JwB5S3beHW0s="
+            ],
+          "type":"fledge"
+        }]
+      })");
+    run_loop.Run();
+  }
+
+  // The OHTTP key should not be stored after the service client is destroyed.
+  {
+    KAnonymityServiceClient k_service(otr_profile);
+    base::RunLoop run_loop;
+    k_service.QuerySets(
+        sets, base::BindLambdaForTesting([&run_loop](std::vector<bool> result) {
+          ASSERT_EQ(1u, result.size());
+          EXPECT_TRUE(result[0]);
+          run_loop.Quit();
+        }));
+    RespondWithQueryKey();  // This will fail if the key was persisted.
+    RespondWithQuery(
+        R"({
+        "kAnonymousSets": [{
+          "hashes": [
+            "a4ayc/80/OGda4BO/1o/V0etpOqiLx1JwB5S3beHW0s="
+            ],
+          "type":"fledge"
+        }]
+      })");
+    run_loop.Run();
+  }
+}
+
 }  // namespace
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_storage.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_storage.cc
new file mode 100644
index 0000000..0a8733d
--- /dev/null
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_storage.cc
@@ -0,0 +1,239 @@
+// 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 "chrome/browser/k_anonymity_service/k_anonymity_service_storage.h"
+
+#include "base/functional/callback_helpers.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/sequence_checker.h"
+#include "base/task/sequenced_task_runner.h"
+#include "base/task/thread_pool.h"
+#include "base/time/time.h"
+#include "chrome/browser/k_anonymity_service/proto/k_anonymity_storage.pb.h"
+#include "components/sqlite_proto/key_value_data.h"
+#include "components/sqlite_proto/key_value_table.h"
+#include "components/sqlite_proto/proto_table_manager.h"
+#include "sql/database.h"
+
+namespace {
+
+namespace proto {
+using k_anonymity::proto::OHTTPKeyAndExpiration;
+using k_anonymity::proto::TrustTokenKeyCommitmentWithExpiration;
+}  // namespace proto
+
+const int kCurrentSchemaVersion = 1;
+const int kMaxOhttpKeys = 2;
+
+const base::TimeDelta kFlushDelay = base::Seconds(1);
+
+const char kOhttpKeyTable[] = "ohttp_keys";
+const char kTrustTokenKeyCommitmentTable[] = "trust_token_key_commitments";
+const char kTrustTokenKeyCommitmentKey[] = "trust_token_key_commitment";
+
+struct OhttpKeyExpirationComparator {
+  bool operator()(const proto::OHTTPKeyAndExpiration& left,
+                  const proto::OHTTPKeyAndExpiration& right) {
+    return left.expiration_us() < right.expiration_us();
+  }
+};
+
+class KAnonymityServiceSqlStorage : public KAnonymityServiceStorage {
+ public:
+  explicit KAnonymityServiceSqlStorage(base::FilePath db_storage_path)
+      : db_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
+            {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+             base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
+        db_(std::make_unique<sql::Database>(sql::DatabaseOptions{})),
+        db_storage_path_(std::move(db_storage_path)),
+        table_manager_(base::MakeRefCounted<sqlite_proto::ProtoTableManager>(
+            db_task_runner_)),
+        ohttp_key_table_(
+            std::make_unique<
+                sqlite_proto::KeyValueTable<proto::OHTTPKeyAndExpiration>>(
+                kOhttpKeyTable)),
+        ohttp_key_data_(
+            std::make_unique<
+                sqlite_proto::KeyValueData<proto::OHTTPKeyAndExpiration,
+                                           OhttpKeyExpirationComparator>>(
+                table_manager_,
+                ohttp_key_table_.get(),
+                /*max_num_entries=*/kMaxOhttpKeys,
+                kFlushDelay)),
+        trust_token_key_commitment_table_(
+            std::make_unique<sqlite_proto::KeyValueTable<
+                proto::TrustTokenKeyCommitmentWithExpiration>>(
+                kTrustTokenKeyCommitmentTable)),
+        trust_token_key_commitment_data_(
+            std::make_unique<sqlite_proto::KeyValueData<
+                proto::TrustTokenKeyCommitmentWithExpiration>>(
+                table_manager_,
+                trust_token_key_commitment_table_.get(),
+                /*max_num_entries=*/absl::nullopt,
+                kFlushDelay)) {}
+
+  ~KAnonymityServiceSqlStorage() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    // Enqueue a flush
+    ohttp_key_data_->FlushDataToDisk();
+    trust_token_key_commitment_data_->FlushDataToDisk();
+
+    // Shutdown `table_manager_`, delete database on db
+    // sequence, then delete the KeyValueTable/KeyValueData on main sequence.
+    // This ensures that the flush occurs before we delete the
+    // KeyValueTable/KeyValueData.
+    db_task_runner_->PostTaskAndReply(
+        FROM_HERE,
+        base::BindOnce(
+            [](scoped_refptr<sqlite_proto::ProtoTableManager> table_manager,
+               std::unique_ptr<sql::Database> db) {
+              table_manager->WillShutdown();
+            },
+            std::move(table_manager_), std::move(db_)),
+        base::DoNothingWithBoundArgs(
+            std::move(ohttp_key_table_), std::move(ohttp_key_data_),
+            std::move(trust_token_key_commitment_table_),
+            std::move(trust_token_key_commitment_data_)));
+  }
+
+  void WaitUntilReady(base::OnceCallback<void(InitStatus)> on_ready) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    if (ready_) {
+      std::move(on_ready).Run(InitStatus::kInitOk);
+      return;
+    }
+    ready_ = true;
+    db_task_runner_->PostTaskAndReplyWithResult(
+        FROM_HERE,
+        base::BindOnce(&KAnonymityServiceSqlStorage::InitializeOnDbSequence,
+                       base::Unretained(this)),
+        std::move(on_ready));
+  }
+
+  InitStatus InitializeOnDbSequence() {
+    if (db_->Open(db_storage_path_) == false) {
+      return InitStatus::kInitError;
+    }
+    table_manager_->InitializeOnDbSequence(
+        db_.get(),
+        std::vector<std::string>{kOhttpKeyTable, kTrustTokenKeyCommitmentTable},
+        kCurrentSchemaVersion);
+    ohttp_key_data_->InitializeOnDBSequence();
+    trust_token_key_commitment_data_->InitializeOnDBSequence();
+    return InitStatus::kInitOk;
+  }
+
+  absl::optional<OHTTPKeyAndExpiration> GetOHTTPKeyFor(
+      const url::Origin& origin) const override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    proto::OHTTPKeyAndExpiration result;
+    if (!ohttp_key_data_->TryGetData(origin.Serialize(), &result)) {
+      return absl::nullopt;
+    }
+    return OHTTPKeyAndExpiration{
+        result.hpke_key(), base::Time::FromDeltaSinceWindowsEpoch(
+                               base::Microseconds(result.expiration_us()))};
+  }
+  void UpdateOHTTPKeyFor(const url::Origin& origin,
+                         const OHTTPKeyAndExpiration& value) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    proto::OHTTPKeyAndExpiration proto_value;
+    proto_value.set_hpke_key(value.key);
+    proto_value.set_expiration_us(
+        value.expiration.ToDeltaSinceWindowsEpoch().InMicroseconds());
+
+    ohttp_key_data_->UpdateData(origin.Serialize(), std::move(proto_value));
+  }
+
+  absl::optional<KeyAndNonUniqueUserIdWithExpiration> GetKeyAndNonUniqueUserId()
+      const override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    proto::TrustTokenKeyCommitmentWithExpiration result;
+    if (!trust_token_key_commitment_data_->TryGetData(
+            kTrustTokenKeyCommitmentKey, &result)) {
+      return absl::nullopt;
+    }
+    return KeyAndNonUniqueUserIdWithExpiration{
+        {result.key_commitment(), result.non_unique_id()},
+        base::Time::FromDeltaSinceWindowsEpoch(
+            base::Microseconds(result.expiration_us()))};
+  }
+  void UpdateKeyAndNonUniqueUserId(
+      const KeyAndNonUniqueUserIdWithExpiration& value) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    proto::TrustTokenKeyCommitmentWithExpiration proto_value;
+    proto_value.set_key_commitment(value.key_and_id.key_commitment);
+    proto_value.set_non_unique_id(value.key_and_id.non_unique_user_id);
+    proto_value.set_expiration_us(
+        value.expiration.ToDeltaSinceWindowsEpoch().InMicroseconds());
+
+    trust_token_key_commitment_data_->UpdateData(kTrustTokenKeyCommitmentKey,
+                                                 std::move(proto_value));
+  }
+
+ private:
+  scoped_refptr<base::SequencedTaskRunner> db_task_runner_;
+  std::unique_ptr<sql::Database> db_;
+  base::FilePath db_storage_path_;
+
+  scoped_refptr<sqlite_proto::ProtoTableManager> table_manager_;
+  std::unique_ptr<sqlite_proto::KeyValueTable<proto::OHTTPKeyAndExpiration>>
+      ohttp_key_table_;
+  std::unique_ptr<sqlite_proto::KeyValueData<proto::OHTTPKeyAndExpiration,
+                                             OhttpKeyExpirationComparator>>
+      ohttp_key_data_;
+
+  std::unique_ptr<
+      sqlite_proto::KeyValueTable<proto::TrustTokenKeyCommitmentWithExpiration>>
+      trust_token_key_commitment_table_;
+  std::unique_ptr<
+      sqlite_proto::KeyValueData<proto::TrustTokenKeyCommitmentWithExpiration>>
+      trust_token_key_commitment_data_;
+  bool ready_ = false;
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace
+
+KAnonymityServiceStorage::~KAnonymityServiceStorage() = default;
+
+KAnonymityServiceMemoryStorage::KAnonymityServiceMemoryStorage() = default;
+
+KAnonymityServiceMemoryStorage::~KAnonymityServiceMemoryStorage() = default;
+
+void KAnonymityServiceMemoryStorage::WaitUntilReady(
+    base::OnceCallback<void(InitStatus)> on_ready) {
+  std::move(on_ready).Run(InitStatus::kInitOk);
+}
+
+absl::optional<OHTTPKeyAndExpiration>
+KAnonymityServiceMemoryStorage::GetOHTTPKeyFor(
+    const url::Origin& origin) const {
+  auto it = ohttp_key_map_.find(origin);
+  if (it == ohttp_key_map_.end()) {
+    return absl::nullopt;
+  }
+  return it->second;
+}
+
+void KAnonymityServiceMemoryStorage::UpdateOHTTPKeyFor(
+    const url::Origin& origin,
+    const OHTTPKeyAndExpiration& key) {
+  ohttp_key_map_[origin] = key;
+}
+
+absl::optional<KeyAndNonUniqueUserIdWithExpiration>
+KAnonymityServiceMemoryStorage::GetKeyAndNonUniqueUserId() const {
+  return key_and_non_unique_user_id_with_expiration_;
+}
+void KAnonymityServiceMemoryStorage::UpdateKeyAndNonUniqueUserId(
+    const KeyAndNonUniqueUserIdWithExpiration& key) {
+  key_and_non_unique_user_id_with_expiration_ = key;
+}
+
+std::unique_ptr<KAnonymityServiceStorage> CreateKAnonymitySqlStorageForPath(
+    base::FilePath db_storage_path) {
+  return std::make_unique<KAnonymityServiceSqlStorage>(
+      std::move(db_storage_path));
+}
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_storage.h b/chrome/browser/k_anonymity_service/k_anonymity_service_storage.h
new file mode 100644
index 0000000..a97b713
--- /dev/null
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_storage.h
@@ -0,0 +1,82 @@
+// 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 CHROME_BROWSER_K_ANONYMITY_SERVICE_K_ANONYMITY_SERVICE_STORAGE_H_
+#define CHROME_BROWSER_K_ANONYMITY_SERVICE_K_ANONYMITY_SERVICE_STORAGE_H_
+
+#include <string>
+
+#include "base/containers/flat_map.h"
+#include "base/files/file_path.h"
+#include "base/functional/callback.h"
+#include "base/time/time.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/origin.h"
+
+struct OHTTPKeyAndExpiration {
+  // The OHTTP key in this struct is formatted as described in
+  // https://www.ietf.org/archive/id/draft-ietf-ohai-ohttp-02.html#name-key-configuration-encoding
+  std::string key;  // OHTTP key
+  base::Time expiration;
+};
+
+struct KeyAndNonUniqueUserId {
+  std::string key_commitment;  // trust token key commitment (specific to
+                               // `non_unique_user_id`)
+  int non_unique_user_id;      // Non-unique ID assigned to this user for k-anon
+                               // reporting
+};
+
+struct KeyAndNonUniqueUserIdWithExpiration {
+  KeyAndNonUniqueUserId key_and_id;
+  base::Time expiration;
+};
+
+class KAnonymityServiceStorage {
+ public:
+  enum InitStatus {
+    kInitOk,
+    kInitError,
+  };
+  virtual ~KAnonymityServiceStorage();
+  virtual void WaitUntilReady(
+      base::OnceCallback<void(InitStatus)> on_ready) = 0;
+
+  virtual absl::optional<OHTTPKeyAndExpiration> GetOHTTPKeyFor(
+      const url::Origin& origin) const = 0;
+  virtual void UpdateOHTTPKeyFor(const url::Origin& origin,
+                                 const OHTTPKeyAndExpiration& key) = 0;
+
+  virtual absl::optional<KeyAndNonUniqueUserIdWithExpiration>
+  GetKeyAndNonUniqueUserId() const = 0;
+  virtual void UpdateKeyAndNonUniqueUserId(
+      const KeyAndNonUniqueUserIdWithExpiration& key) = 0;
+};
+
+class KAnonymityServiceMemoryStorage : public KAnonymityServiceStorage {
+ public:
+  KAnonymityServiceMemoryStorage();
+  ~KAnonymityServiceMemoryStorage() override;
+  void WaitUntilReady(base::OnceCallback<void(InitStatus)> on_ready) override;
+
+  absl::optional<OHTTPKeyAndExpiration> GetOHTTPKeyFor(
+      const url::Origin& origin) const override;
+  void UpdateOHTTPKeyFor(const url::Origin& origin,
+                         const OHTTPKeyAndExpiration& key) override;
+
+  absl::optional<KeyAndNonUniqueUserIdWithExpiration> GetKeyAndNonUniqueUserId()
+      const override;
+  void UpdateKeyAndNonUniqueUserId(
+      const KeyAndNonUniqueUserIdWithExpiration& key) override;
+
+ private:
+  absl::optional<KeyAndNonUniqueUserIdWithExpiration>
+      key_and_non_unique_user_id_with_expiration_;
+  base::flat_map<url::Origin, OHTTPKeyAndExpiration> ohttp_key_map_;
+};
+
+std::unique_ptr<KAnonymityServiceStorage> CreateKAnonymitySqlStorageForPath(
+    base::FilePath db_storage_path);
+
+#endif
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_storage_unittest.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_storage_unittest.cc
new file mode 100644
index 0000000..665d709
--- /dev/null
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_storage_unittest.cc
@@ -0,0 +1,319 @@
+// 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 "chrome/browser/k_anonymity_service/k_anonymity_service_storage.h"
+
+#include "base/files/file_path.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace {
+
+const char kTestOrigin[] = "https://foo.test";
+const char kTestOhttpKey[] = "FooOhttpKey";
+const char kTestKeyCommitment[] = "FooKeyCommitment";
+
+const char kTestOrigin2[] = "https://bar.test";
+const char kTestOhttpKey2[] = "BarOhttpKey";
+
+const char kTestOrigin3[] = "https://baz.test";
+const char kTestOhttpKey3[] = "BazOhttpKey";
+
+class KAnonymityServiceStorageTest : public testing::TestWithParam<bool> {
+ public:
+  base::test::TaskEnvironment& task_environment() { return task_environment_; }
+
+  void SetUp() override { ASSERT_TRUE(temp_directory_.CreateUniqueTempDir()); }
+
+  base::FilePath db_path() {
+    return temp_directory_.GetPath().Append(
+        FILE_PATH_LITERAL("KAnonymityService"));
+  }
+
+  std::unique_ptr<KAnonymityServiceStorage> CreateStorage() {
+    std::unique_ptr<KAnonymityServiceStorage> storage;
+    if (StorageIsPersistent()) {
+      storage = CreateKAnonymitySqlStorageForPath(db_path());
+    } else {
+      storage = std::make_unique<KAnonymityServiceMemoryStorage>();
+    }
+
+    base::RunLoop run_loop;
+    storage->WaitUntilReady(base::BindLambdaForTesting(
+        [&run_loop](KAnonymityServiceStorage::InitStatus status) {
+          EXPECT_EQ(status, KAnonymityServiceStorage::InitStatus::kInitOk);
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+
+    return storage;
+  }
+
+  bool StorageIsPersistent() { return GetParam(); }
+
+ private:
+  base::test::TaskEnvironment task_environment_;
+  base::ScopedTempDir temp_directory_;
+};
+
+TEST_P(KAnonymityServiceStorageTest, InitializeDatabase) {
+  std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+}
+
+TEST_P(KAnonymityServiceStorageTest, SaveAndLoadOHTTPKeys) {
+  url::Origin test_origin = url::Origin::Create(GURL(kTestOrigin));
+  std::string test_ohttp_key(kTestOhttpKey);
+  base::Time expiration = base::Time::Now();
+
+  url::Origin test_origin2 = url::Origin::Create(GURL(kTestOrigin2));
+  std::string test_ohttp_key2(kTestOhttpKey2);
+  base::Time expiration2 = expiration + base::Seconds(1);
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+
+    EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin));
+    EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin2));
+
+    storage->UpdateOHTTPKeyFor(test_origin, {test_ohttp_key, expiration});
+    storage->UpdateOHTTPKeyFor(test_origin2, {test_ohttp_key2, expiration2});
+
+    absl::optional<OHTTPKeyAndExpiration> result;
+    result = storage->GetOHTTPKeyFor(test_origin);
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_ohttp_key, result->key);
+    EXPECT_EQ(expiration, result->expiration);
+
+    result = storage->GetOHTTPKeyFor(test_origin2);
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_ohttp_key2, result->key);
+    EXPECT_EQ(expiration2, result->expiration);
+  }
+
+  task_environment().RunUntilIdle();
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+    absl::optional<OHTTPKeyAndExpiration> result;
+
+    if (StorageIsPersistent()) {
+      // Should be persisted after the storage is closed and re-opened.
+
+      result = storage->GetOHTTPKeyFor(test_origin);
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key, result->key);
+      EXPECT_EQ(expiration, result->expiration);
+
+      result = storage->GetOHTTPKeyFor(test_origin2);
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key2, result->key);
+      EXPECT_EQ(expiration2, result->expiration);
+    } else {
+      // Storage should have been cleared.
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin));
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin2));
+
+      // Set them to the expected values.
+      storage->UpdateOHTTPKeyFor(test_origin, {test_ohttp_key, expiration});
+      storage->UpdateOHTTPKeyFor(test_origin2, {test_ohttp_key2, expiration2});
+    }
+
+    // Modify an existing key.
+    expiration += base::Seconds(4);
+    storage->UpdateOHTTPKeyFor(test_origin, {test_ohttp_key, expiration});
+
+    result = storage->GetOHTTPKeyFor(test_origin);
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_ohttp_key, result->key);
+    EXPECT_EQ(expiration, result->expiration);
+  }
+
+  task_environment().RunUntilIdle();
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+    absl::optional<OHTTPKeyAndExpiration> result;
+
+    if (StorageIsPersistent()) {
+      // Modifications should be persisted after the storage is closed and
+      // re-opened.
+
+      result = storage->GetOHTTPKeyFor(test_origin);
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key, result->key);
+      EXPECT_EQ(expiration, result->expiration);
+
+      result = storage->GetOHTTPKeyFor(test_origin2);
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key2, result->key);
+      EXPECT_EQ(expiration2, result->expiration);
+    } else {
+      // Storage should have been cleared.
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin));
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin2));
+    }
+  }
+}
+
+TEST_P(KAnonymityServiceStorageTest, SaveAndLoadTooManyOHTTPKeys) {
+  url::Origin test_origin = url::Origin::Create(GURL(kTestOrigin));
+  std::string test_ohttp_key(kTestOhttpKey);
+  base::Time expiration = base::Time::Now();
+
+  url::Origin test_origin2 = url::Origin::Create(GURL(kTestOrigin2));
+  std::string test_ohttp_key2(kTestOhttpKey2);
+  base::Time expiration2 = expiration + base::Seconds(1);
+
+  url::Origin test_origin3 = url::Origin::Create(GURL(kTestOrigin3));
+  std::string test_ohttp_key3(kTestOhttpKey3);
+  base::Time expiration3 = expiration2 + base::Seconds(2);
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+
+    EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin));
+    EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin2));
+    EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin3));
+
+    storage->UpdateOHTTPKeyFor(test_origin, {test_ohttp_key, expiration});
+    storage->UpdateOHTTPKeyFor(test_origin2, {test_ohttp_key2, expiration2});
+    storage->UpdateOHTTPKeyFor(test_origin3, {test_ohttp_key3, expiration3});
+
+    absl::optional<OHTTPKeyAndExpiration> result;
+    result = storage->GetOHTTPKeyFor(test_origin);
+    if (StorageIsPersistent()) {
+      // The oldest should be forgotten.
+      result = storage->GetOHTTPKeyFor(test_origin);
+      ASSERT_FALSE(result);
+    } else {
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key, result->key);
+      EXPECT_EQ(expiration, result->expiration);
+    }
+
+    result = storage->GetOHTTPKeyFor(test_origin2);
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_ohttp_key2, result->key);
+    EXPECT_EQ(expiration2, result->expiration);
+
+    result = storage->GetOHTTPKeyFor(test_origin3);
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_ohttp_key3, result->key);
+    EXPECT_EQ(expiration3, result->expiration);
+  }
+
+  task_environment().RunUntilIdle();
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+    absl::optional<OHTTPKeyAndExpiration> result;
+
+    if (StorageIsPersistent()) {
+      // Modifications should be persisted after the storage is closed and
+      // re-opened.
+
+      // The oldest should be forgotten.
+      result = storage->GetOHTTPKeyFor(test_origin);
+      ASSERT_FALSE(result);
+
+      result = storage->GetOHTTPKeyFor(test_origin2);
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key2, result->key);
+      EXPECT_EQ(expiration2, result->expiration);
+
+      result = storage->GetOHTTPKeyFor(test_origin3);
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_ohttp_key3, result->key);
+      EXPECT_EQ(expiration3, result->expiration);
+    } else {
+      // Storage should have been cleared.
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin));
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin2));
+      EXPECT_FALSE(storage->GetOHTTPKeyFor(test_origin3));
+    }
+  }
+}
+
+TEST_P(KAnonymityServiceStorageTest, SaveAndLoadKeyCommitment) {
+  std::string test_key_commitment(kTestKeyCommitment);
+  int non_unique_user_id = 1;
+  base::Time expiration = base::Time::Now();
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+
+    EXPECT_FALSE(storage->GetKeyAndNonUniqueUserId());
+
+    storage->UpdateKeyAndNonUniqueUserId(
+        {{test_key_commitment, non_unique_user_id}, expiration});
+
+    absl::optional<KeyAndNonUniqueUserIdWithExpiration> result;
+    result = storage->GetKeyAndNonUniqueUserId();
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_key_commitment, result->key_and_id.key_commitment);
+    EXPECT_EQ(non_unique_user_id, result->key_and_id.non_unique_user_id);
+    EXPECT_EQ(expiration, result->expiration);
+  }
+
+  task_environment().RunUntilIdle();
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+    absl::optional<KeyAndNonUniqueUserIdWithExpiration> result;
+    if (StorageIsPersistent()) {
+      // Should be persisted after the storage is closed and re-opened.
+
+      result = storage->GetKeyAndNonUniqueUserId();
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_key_commitment, result->key_and_id.key_commitment);
+      EXPECT_EQ(non_unique_user_id, result->key_and_id.non_unique_user_id);
+      EXPECT_EQ(expiration, result->expiration);
+    } else {
+      // Should have been cleared.
+      EXPECT_FALSE(storage->GetKeyAndNonUniqueUserId());
+      storage->UpdateKeyAndNonUniqueUserId(
+          {{test_key_commitment, non_unique_user_id}, expiration});
+    }
+
+    non_unique_user_id += 1;
+    storage->UpdateKeyAndNonUniqueUserId(
+        {{test_key_commitment, non_unique_user_id}, expiration});
+    result = storage->GetKeyAndNonUniqueUserId();
+    ASSERT_TRUE(result);
+    EXPECT_EQ(test_key_commitment, result->key_and_id.key_commitment);
+    EXPECT_EQ(non_unique_user_id, result->key_and_id.non_unique_user_id);
+    EXPECT_EQ(expiration, result->expiration);
+  }
+
+  task_environment().RunUntilIdle();
+
+  {
+    std::unique_ptr<KAnonymityServiceStorage> storage = CreateStorage();
+    absl::optional<KeyAndNonUniqueUserIdWithExpiration> result;
+    if (StorageIsPersistent()) {
+      // Modifications should be persisted after the storage is closed and
+      // re-opened.
+      result = storage->GetKeyAndNonUniqueUserId();
+      ASSERT_TRUE(result);
+      EXPECT_EQ(test_key_commitment, result->key_and_id.key_commitment);
+      EXPECT_EQ(non_unique_user_id, result->key_and_id.non_unique_user_id);
+      EXPECT_EQ(expiration, result->expiration);
+    } else {
+      // Should have been cleared.
+      EXPECT_FALSE(storage->GetKeyAndNonUniqueUserId());
+    }
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    /* no label */,
+    KAnonymityServiceStorageTest,
+    ::testing::Values(false, true));
+
+}  // namespace
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
index 0edfd9d2..fd73138 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
@@ -68,10 +68,12 @@
 KAnonymityTrustTokenGetter::KAnonymityTrustTokenGetter(
     signin::IdentityManager* identity_manager,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    network::mojom::TrustTokenQueryAnswerer* answerer)
+    network::mojom::TrustTokenQueryAnswerer* answerer,
+    KAnonymityServiceStorage* storage)
     : identity_manager_(identity_manager),
       url_loader_factory_(std::move(url_loader_factory)),
-      trust_token_query_answerer_(answerer) {
+      trust_token_query_answerer_(answerer),
+      storage_(storage) {
   auth_origin_ =
       url::Origin::Create(GURL(features::kKAnonymityServiceAuthServer.Get()));
   isolation_info_ = net::IsolationInfo::Create(
@@ -153,8 +155,10 @@
 }
 
 void KAnonymityTrustTokenGetter::CheckTrustTokenKeyCommitment() {
-  if (key_and_non_unique_user_id_with_expiration_.expiration <=
-      base::Time::Now() + kRequestMargin) {
+  absl::optional<KeyAndNonUniqueUserIdWithExpiration> key_commitment =
+      storage_->GetKeyAndNonUniqueUserId();
+  if (!key_commitment ||
+      key_commitment->expiration <= base::Time::Now() + kRequestMargin) {
     FetchNonUniqueUserId();
     return;
   }
@@ -388,10 +392,10 @@
   std::string key_commitment_str;
   base::JSONWriter::Write(outer_commitment, &key_commitment_str);
 
-  key_and_non_unique_user_id_with_expiration_ =
-      KeyAndNonUniqueUserIdWithExpiration{
-          KeyAndNonUniqueUserId{key_commitment_str, non_unique_user_id},
-          base::Time::UnixEpoch() + base::Microseconds(max_expiry)};
+  KeyAndNonUniqueUserIdWithExpiration key_commitment{
+      KeyAndNonUniqueUserId{key_commitment_str, non_unique_user_id},
+      base::Time::UnixEpoch() + base::Microseconds(max_expiry)};
+  storage_->UpdateKeyAndNonUniqueUserId(key_commitment);
 
   CheckTrustTokens();
 }
@@ -420,12 +424,14 @@
 }
 
 void KAnonymityTrustTokenGetter::FetchTrustToken() {
+  auto key_commitment = storage_->GetKeyAndNonUniqueUserId();
+  DCHECK(key_commitment);
+
   RecordTrustTokenGetterAction(
       KAnonymityTrustTokenGetterAction::kFetchTrustToken);
   auto resource_request = std::make_unique<network::ResourceRequest>();
   resource_request->url = auth_origin_.GetURL().Resolve(base::StringPrintf(
-      kIssueTrustTokenPathFmt, key_and_non_unique_user_id_with_expiration_
-                                   .key_and_id.non_unique_user_id));
+      kIssueTrustTokenPathFmt, key_commitment->key_and_id.non_unique_user_id));
   resource_request->method = net::HttpRequestHeaders::kPostMethod;
   resource_request->headers.SetHeader(
       net::HttpRequestHeaders::kAuthorization,
@@ -441,8 +447,7 @@
   network::mojom::TrustTokenParamsPtr params =
       network::mojom::TrustTokenParams::New();
   params->type = network::mojom::TrustTokenOperationType::kIssuance;
-  params->custom_key_commitment =
-      key_and_non_unique_user_id_with_expiration_.key_and_id.key_commitment;
+  params->custom_key_commitment = key_commitment->key_and_id.key_commitment;
   resource_request->trust_token_params = *params;
   url_loader_ = network::SimpleURLLoader::Create(
       std::move(resource_request), kKAnonymityServiceGetTokenTrafficAnnotation);
@@ -492,7 +497,9 @@
 
   absl::optional<KeyAndNonUniqueUserId> result;
   if (status) {
-    result = key_and_non_unique_user_id_with_expiration_.key_and_id;
+    auto key_commitment = storage_->GetKeyAndNonUniqueUserId();
+    DCHECK(key_commitment);
+    result = key_commitment->key_and_id;
   }
 
   // We call the callback *before* removing the current request from the list.
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h
index 777eca22..d617bfb 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h
+++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.h
@@ -12,6 +12,7 @@
 #include "base/containers/circular_deque.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
+#include "chrome/browser/k_anonymity_service/k_anonymity_service_storage.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
 #include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -43,13 +44,6 @@
 // expires.
 class KAnonymityTrustTokenGetter {
  public:
-  struct KeyAndNonUniqueUserId {
-    std::string key_commitment;  // trust token key commitment (specific to
-                                 // `non_unique_user_id`)
-    int non_unique_user_id;  // Non-unique ID assigned to this user for k-anon
-                             // reporting
-  };
-
   // Callback where argument tells if the client has the trust token or not.
   using TryGetTrustTokenAndKeyCallback =
       base::OnceCallback<void(absl::optional<KeyAndNonUniqueUserId>)>;
@@ -58,7 +52,8 @@
   KAnonymityTrustTokenGetter(
       signin::IdentityManager* identity_manager,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      network::mojom::TrustTokenQueryAnswerer* answerer);
+      network::mojom::TrustTokenQueryAnswerer* answerer,
+      KAnonymityServiceStorage* storage);
 
   ~KAnonymityTrustTokenGetter();
 
@@ -76,11 +71,6 @@
   void TryGetTrustTokenAndKey(TryGetTrustTokenAndKeyCallback callback);
 
  private:
-  struct KeyAndNonUniqueUserIdWithExpiration {
-    KeyAndNonUniqueUserId key_and_id;
-    base::Time expiration;
-  };
-
   struct PendingRequest {
     explicit PendingRequest(TryGetTrustTokenAndKeyCallback callback);
     ~PendingRequest();
@@ -141,14 +131,13 @@
   void DoCallback(bool status);
 
   signin::AccessTokenInfo access_token_;
-  KeyAndNonUniqueUserIdWithExpiration
-      key_and_non_unique_user_id_with_expiration_;
   base::circular_deque<PendingRequest> pending_callbacks_;
 
   raw_ptr<signin::IdentityManager> identity_manager_;
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   std::unique_ptr<network::SimpleURLLoader> url_loader_;
   raw_ptr<network::mojom::TrustTokenQueryAnswerer> trust_token_query_answerer_;
+  raw_ptr<KAnonymityServiceStorage> storage_;
   net::IsolationInfo isolation_info_;
   std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher>
       access_token_fetcher_;
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc
index 7d8759f..83e07f2b 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/values_test_util.h"
 #include "chrome/browser/k_anonymity_service/k_anonymity_service_metrics.h"
+#include "chrome/browser/k_anonymity_service/k_anonymity_service_storage.h"
 #include "chrome/browser/k_anonymity_service/k_anonymity_service_urls.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
@@ -35,8 +36,6 @@
 
 const char kAuthServer[] = "https://authserver";
 
-using KeyAndNonUniqueUserId = KAnonymityTrustTokenGetter::KeyAndNonUniqueUserId;
-
 class TestTrustTokenQueryAnswerer
     : public network::mojom::TrustTokenQueryAnswerer {
  public:
@@ -82,7 +81,7 @@
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get());
     getter_ = std::make_unique<KAnonymityTrustTokenGetter>(
         IdentityManagerFactory::GetForProfile(profile_.get()),
-        profile_->GetURLLoaderFactory(), &trust_token_answerer_);
+        profile_->GetURLLoaderFactory(), &trust_token_answerer_, &storage_);
     url::Origin auth_origin = url::Origin::Create(GURL(kAuthServer));
     isolation_info_ = net::IsolationInfo::Create(
         net::IsolationInfo::RequestType::kOther, auth_origin, auth_origin,
@@ -244,6 +243,7 @@
   std::unique_ptr<KAnonymityTrustTokenGetter> getter_;
   TestTrustTokenQueryAnswerer trust_token_answerer_;
   data_decoder::test::InProcessDataDecoder decoder_;
+  KAnonymityServiceMemoryStorage storage_;
 };
 
 TEST_F(KAnonymityTrustTokenGetterTest, TryGetNotSignedIn) {
@@ -848,7 +848,7 @@
 
 // Apparently the IdentityManager is sometimes NULL, so we should handle this.
 TEST_F(KAnonymityTrustTokenGetterTest, HandlesMissingServices) {
-  KAnonymityTrustTokenGetter getter(nullptr, nullptr, nullptr);
+  KAnonymityTrustTokenGetter getter(nullptr, nullptr, nullptr, nullptr);
   getter.TryGetTrustTokenAndKey(base::BindLambdaForTesting(
       [](absl::optional<KeyAndNonUniqueUserId> result) {
         EXPECT_FALSE(result);
diff --git a/chrome/browser/k_anonymity_service/proto/k_anonymity_storage.proto b/chrome/browser/k_anonymity_service/proto/k_anonymity_storage.proto
new file mode 100644
index 0000000..bc0701d
--- /dev/null
+++ b/chrome/browser/k_anonymity_service/proto/k_anonymity_storage.proto
@@ -0,0 +1,26 @@
+// 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.
+
+// Protos for persisting K-Anonymity Service keys and tokens.
+
+syntax = "proto3";
+
+package k_anonymity.proto;
+
+option optimize_for = LITE_RUNTIME;
+
+message OHTTPKeyAndExpiration {
+  bytes hpke_key = 1;
+
+  // Time that the data expires in microseconds since the Windows epoch.
+  int64 expiration_us = 2;
+}
+
+message TrustTokenKeyCommitmentWithExpiration {
+  bytes key_commitment = 1;
+  int32 non_unique_id = 2;
+
+  // Time that the data expires in microseconds since the Windows epoch.
+  int64 expiration_us = 3;
+}
diff --git a/chrome/browser/new_tab_page/new_tab_page_util.cc b/chrome/browser/new_tab_page/new_tab_page_util.cc
index 2878535..215cfa2 100644
--- a/chrome/browser/new_tab_page/new_tab_page_util.cc
+++ b/chrome/browser/new_tab_page/new_tab_page_util.cc
@@ -10,6 +10,19 @@
 #include "components/variations/service/variations_service.h"
 
 namespace {
+// TODO(b/244303302): Have ItemSuggest filter out unsupported languages
+// server-side.
+constexpr const char* kDriveLocales[] = {
+    "af",  "am", "ar",    "az",    "bg",     "bn",    "ca",    "cs",    "da",
+    "de",  "el", "en-GB", "en-US", "es-419", "es",    "et",    "fa",    "fi",
+    "fil", "fr", "gu",    "he",    "hi",     "hr",    "hu",    "hy",    "id",
+    "is",  "it", "ja",    "ka",    "kk",     "km",    "kn",    "ko",    "ky",
+    "lo",  "lt", "lv",    "mk",    "ml",     "mn",    "mr",    "ms",    "my",
+    "ne",  "nl", "no",    "pa",    "pl",     "pt-BR", "pt-PT", "ro",    "ru",
+    "si",  "sk", "sl",    "sq",    "sr",     "sv",    "sw",    "ta",    "te",
+    "th",  "tr", "uk",    "ur",    "uz",     "vi",    "zh-CN", "zh-TW",
+};
+
 bool IsOsSupportedForRecipe() {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   return true;
@@ -48,6 +61,12 @@
   return g_browser_process->GetApplicationLocale() == "en-US" &&
          GetCountryCode() == "us";
 }
+
+bool IsLocaleSupportedForDrive() {
+  return std::find(std::begin(kDriveLocales), std::end(kDriveLocales),
+                   g_browser_process->GetApplicationLocale()) !=
+         std::end(kDriveLocales);
+}
 }  // namespace
 
 // If feature is overridden manually or by finch, read the feature flag value.
@@ -73,14 +92,5 @@
           ntp_features::kNtpDriveModule.name)) {
     return base::FeatureList::IsEnabled(ntp_features::kNtpDriveModule);
   }
-  return IsOsSupportedForDrive() && IsInUS();
-}
-
-bool IsModuleFreEnabled() {
-  if (base::FeatureList::GetInstance()->IsFeatureOverridden(
-          ntp_features::kNtpModulesFirstRunExperience.name)) {
-    return base::FeatureList::IsEnabled(
-        ntp_features::kNtpModulesFirstRunExperience);
-  }
-  return IsInUS();
+  return IsOsSupportedForDrive() && IsLocaleSupportedForDrive();
 }
diff --git a/chrome/browser/new_tab_page/new_tab_page_util.h b/chrome/browser/new_tab_page/new_tab_page_util.h
index 0502759..3ab9711 100644
--- a/chrome/browser/new_tab_page/new_tab_page_util.h
+++ b/chrome/browser/new_tab_page/new_tab_page_util.h
@@ -8,6 +8,5 @@
 bool IsRecipeTasksModuleEnabled();
 bool IsCartModuleEnabled();
 bool IsDriveModuleEnabled();
-bool IsModuleFreEnabled();
 
 #endif  // CHROME_BROWSER_NEW_TAB_PAGE_NEW_TAB_PAGE_UTIL_H_
diff --git a/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc b/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc
index e751951..de3d52b 100644
--- a/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc
+++ b/chrome/browser/new_tab_page/new_tab_page_util_browsertest.cc
@@ -94,8 +94,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, EnableDriveByToT) {
-  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
-  g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
+  auto locale = std::make_unique<ScopedBrowserLocale>("es");
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   EXPECT_TRUE(IsDriveModuleEnabled());
 #else
@@ -104,8 +103,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, DisableDriveByToT) {
-  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
-  g_browser_process->variations_service()->OverrideStoredPermanentCountry("ca");
+  auto locale = std::make_unique<ScopedBrowserLocale>("as");
   EXPECT_FALSE(IsDriveModuleEnabled());
 }
 
@@ -115,29 +113,6 @@
 
 IN_PROC_BROWSER_TEST_F(NewTabPageUtilDisableFlagBrowserTest,
                        DisableDriveByFlag) {
-  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
-  g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
+  auto locale = std::make_unique<ScopedBrowserLocale>("es");
   EXPECT_FALSE(IsDriveModuleEnabled());
 }
-
-IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, EnableFreByToT) {
-  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
-  g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
-  EXPECT_TRUE(IsModuleFreEnabled());
-}
-
-IN_PROC_BROWSER_TEST_F(NewTabPageUtilBrowserTest, DisableFreByToT) {
-  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
-  g_browser_process->variations_service()->OverrideStoredPermanentCountry("ca");
-  EXPECT_FALSE(IsModuleFreEnabled());
-}
-
-IN_PROC_BROWSER_TEST_F(NewTabPageUtilEnableFlagBrowserTest, EnableFreByFlag) {
-  EXPECT_TRUE(IsModuleFreEnabled());
-}
-
-IN_PROC_BROWSER_TEST_F(NewTabPageUtilDisableFlagBrowserTest, DisableFreByFlag) {
-  auto locale = std::make_unique<ScopedBrowserLocale>("en-US");
-  g_browser_process->variations_service()->OverrideStoredPermanentCountry("us");
-  EXPECT_FALSE(IsModuleFreEnabled());
-}
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
index e91af68..c9dba08 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
@@ -263,8 +263,14 @@
                          PredictionManagerBrowserTest,
                          /*use_install_wide_model_store=*/testing::Bool());
 
+// Flaky on ASAN bots and linux-chromeos-dbg, see https://crbug.com/1403389/.
+#if (BUILDFLAG(IS_CHROMEOS) && !defined(NDEBUG)) || defined(ADDRESS_SANITIZER)
+#define MAYBE_ComponentUpdatesPrefDisabled DISABLED_ComponentUpdatesPrefDisabled
+#else
+#define MAYBE_ComponentUpdatesPrefDisabled ComponentUpdatesPrefDisabled
+#endif
 IN_PROC_BROWSER_TEST_P(PredictionManagerBrowserTest,
-                       ComponentUpdatesPrefDisabled) {
+                       MAYBE_ComponentUpdatesPrefDisabled) {
   ModelFileObserver model_file_observer;
   SetResponseType(PredictionModelsFetcherRemoteResponseType::kUnsuccessful);
   g_browser_process->local_state()->SetBoolean(
diff --git a/chrome/browser/payments/can_make_payment_event_fields_browsertest.cc b/chrome/browser/payments/can_make_payment_event_fields_browsertest.cc
index ba8ea8a..7250367 100644
--- a/chrome/browser/payments/can_make_payment_event_fields_browsertest.cc
+++ b/chrome/browser/payments/can_make_payment_event_fields_browsertest.cc
@@ -20,11 +20,11 @@
  public:
   CanMakePaymentEventFieldsTest() {
     if (ClearFieldsInCanMakePaymentEvent()) {
-      features_.InitAndEnableFeature(
-          blink::features::kClearIdentityInCanMakePaymentEvent);
-    } else {
       features_.InitAndDisableFeature(
-          blink::features::kClearIdentityInCanMakePaymentEvent);
+          blink::features::kAddIdentityInCanMakePaymentEvent);
+    } else {
+      features_.InitAndEnableFeature(
+          blink::features::kAddIdentityInCanMakePaymentEvent);
     }
   }
 
@@ -72,13 +72,10 @@
     EXPECT_FALSE(GetValueOf("details.definedMethodData"));
     EXPECT_FALSE(GetValueOf("details.definedModifiers"));
 
-    // Checking `if ('topOrigin' in event)` returns true, because the field
-    // accessors are defined on the CanMakePaymentEvent, even though they return
-    // "undefined" when accessed.
-    EXPECT_TRUE(GetValueOf("details.inTopOrigin"));
-    EXPECT_TRUE(GetValueOf("details.inPaymentRequestOrigin"));
-    EXPECT_TRUE(GetValueOf("details.inMethodData"));
-    EXPECT_TRUE(GetValueOf("details.inModifiers"));
+    EXPECT_FALSE(GetValueOf("details.inTopOrigin"));
+    EXPECT_FALSE(GetValueOf("details.inPaymentRequestOrigin"));
+    EXPECT_FALSE(GetValueOf("details.inMethodData"));
+    EXPECT_FALSE(GetValueOf("details.inModifiers"));
   } else {
     EXPECT_TRUE(GetValueOf("details.ifTopOrigin"));
     EXPECT_TRUE(GetValueOf("details.ifPaymentRequestOrigin"));
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 28307f0..4dcb8ac 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -119,7 +119,6 @@
 #include "components/omnibox/browser/omnibox_prefs.h"
 #include "components/omnibox/browser/zero_suggest_provider.h"
 #include "components/optimization_guide/core/optimization_guide_prefs.h"
-#include "components/origin_trials/browser/prefservice_persistence_provider.h"
 #include "components/password_manager/core/browser/password_manager.h"
 #include "components/payments/core/payment_prefs.h"
 #include "components/performance_manager/public/user_tuning/prefs.h"
@@ -724,6 +723,9 @@
     "extensions.load_cryptotoken_extension";
 #endif
 
+// Deprecated 10/2022.
+const char kOriginTrialPrefKey[] = "origin_trials.persistent_trials";
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // Deprecated 07/2022.
 // The name of a boolean pref that determines whether we can show the folder
@@ -1065,6 +1067,9 @@
   registry->RegisterBooleanPref(kSuggestedContentInfoDismissedInLauncher,
                                 false);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  // Deprecated 10/2022.
+  registry->RegisterDictionaryPref(kOriginTrialPrefKey,
+                                   PrefRegistry::LOSSY_PREF);
 
   // Deprecated 11/2022.
   registry->RegisterBooleanPref(kAutofillAssistantEnabled, true);
@@ -1367,7 +1372,6 @@
   NotifierStateTracker::RegisterProfilePrefs(registry);
   ntp_tiles::MostVisitedSites::RegisterProfilePrefs(registry);
   optimization_guide::prefs::RegisterProfilePrefs(registry);
-  origin_trials::PrefServicePersistenceProvider::RegisterProfilePrefs(registry);
   password_manager::PasswordManager::RegisterProfilePrefs(registry);
   payments::RegisterProfilePrefs(registry);
   performance_manager::user_tuning::prefs::RegisterProfilePrefs(registry);
@@ -2083,7 +2087,7 @@
 #if BUILDFLAG(IS_ANDROID)
   feed::MigrateObsoleteProfilePrefsOct_2022(profile_prefs);
 #endif  // BUILDFLAG(IS_ANDROID)
-  profile_prefs->ClearPref(origin_trials::kOriginTrialPrefKey);
+  profile_prefs->ClearPref(kOriginTrialPrefKey);
 
   // Once this migration is complete, the tracked preference
   // `kGoogleServicesLastAccountIdDeprecated` can be removed.
diff --git a/chrome/browser/printing/printer_manager_dialog_linux.cc b/chrome/browser/printing/printer_manager_dialog_linux.cc
index 52df6f6..d80856b 100644
--- a/chrome/browser/printing/printer_manager_dialog_linux.cc
+++ b/chrome/browser/printing/printer_manager_dialog_linux.cc
@@ -35,6 +35,9 @@
 constexpr const char* kGnomeControlCenterPrintersCommand[] = {
     "gnome-control-center", "printers", nullptr};
 
+// Print manager in Deepin OS named "dde-printer".
+constexpr const char* kDeepinPrinterCommand[] = {"dde-printer", nullptr};
+
 // Returns true if the dialog was opened successfully.
 bool OpenPrinterConfigDialog(const char* const* command) {
   DCHECK(command);
@@ -74,8 +77,10 @@
     case base::nix::DESKTOP_ENVIRONMENT_XFCE:
       opened = OpenPrinterConfigDialog(kSystemConfigPrinterCommand);
       break;
-    case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
     case base::nix::DESKTOP_ENVIRONMENT_DEEPIN:
+      opened = OpenPrinterConfigDialog(kDeepinPrinterCommand);
+      break;
+    case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
     case base::nix::DESKTOP_ENVIRONMENT_GNOME:
     case base::nix::DESKTOP_ENVIRONMENT_UKUI:
     case base::nix::DESKTOP_ENVIRONMENT_LXQT:
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_dropdown_v4.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_dropdown_v4.xml
index d55734b..6d86831 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_dropdown_v4.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_dropdown_v4.xml
@@ -18,7 +18,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_consent_learn_more_heading"
-        style="@style/TextAppearance.TextMediumThick.Primary" />
+        style="@style/TextAppearance.TextMediumThick.Secondary" />
 
     <TextView
         android:id="@+id/privacy_sandbox_m1_consent_learn_more_bullet_one"
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_dropdown_v4.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_dropdown_v4.xml
index df64d22c..4f888326 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_dropdown_v4.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_dropdown_v4.xml
@@ -18,7 +18,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_notice_eea_learn_more_heading_1"
-        style="@style/TextAppearance.TextMediumThick.Primary" />
+        style="@style/TextAppearance.TextMediumThick.Secondary" />
 
     <TextView
         android:layout_marginBottom="@dimen/promo_between_text_margin"
@@ -32,7 +32,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_notice_eea_learn_more_heading_2"
-        style="@style/TextAppearance.TextMediumThick.Primary" />
+        style="@style/TextAppearance.TextMediumThick.Secondary" />
 
     <TextView
         android:id="@+id/privacy_sandbox_m1_notice_eea_learn_more_bullet_one"
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_dropdown_v4.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_dropdown_v4.xml
index 191f04c..b57ed16 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_dropdown_v4.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_dropdown_v4.xml
@@ -18,7 +18,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_notice_row_learn_more_heading_1"
-        style="@style/TextAppearance.TextMediumThick.Primary" />
+        style="@style/TextAppearance.TextMediumThick.Secondary" />
 
     <TextView
         android:layout_marginBottom="@dimen/promo_between_text_margin"
@@ -32,7 +32,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_notice_row_learn_more_heading_2"
-        style="@style/TextAppearance.TextMediumThick.Primary" />
+        style="@style/TextAppearance.TextMediumThick.Secondary" />
 
     <TextView
         android:layout_marginBottom="@dimen/promo_between_text_margin"
@@ -74,9 +74,10 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_notice_row_learn_more_heading_3"
-        style="@style/TextAppearance.TextMediumThick.Primary" />
+        style="@style/TextAppearance.TextMediumThick.Secondary" />
 
     <TextView
+        android:layout_marginBottom="@dimen/promo_between_text_margin"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/privacy_sandbox_m1_notice_row_learn_more_description_5"
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogUtils.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogUtils.java
index a958c4c..93e3913 100644
--- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogUtils.java
+++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogUtils.java
@@ -104,8 +104,8 @@
         TextView view = targetLayout.findViewById(bulletViewId);
         SpannableString spannableString =
                 SpanApplier.applySpans(context.getResources().getString(stringRes),
-                        new SpanApplier.SpanInfo(
-                                "<b>", "</b>", new StyleSpan(android.graphics.Typeface.BOLD)));
+                        new SpanApplier.SpanInfo("<b>", "</b>",
+                                new StyleSpan(R.style.TextAppearance_TextMediumThick_Secondary)));
         spannableString.setSpan(new ChromeBulletSpan(context), 0, spannableString.length(), 0);
         view.setText(spannableString);
     }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
index fb66a84e..931e9c4a 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
@@ -334,8 +334,8 @@
     return;
   }
 
-  interest_group_manager_->GetAllInterestGroupJoiningOrigins(base::BindOnce(
-      &PrivacySandboxService::ConvertFledgeJoiningTopFramesForDisplay,
+  interest_group_manager_->GetAllInterestGroupDataKeys(base::BindOnce(
+      &PrivacySandboxService::ConvertInterestGroupDataKeysForDisplay,
       weak_factory_.GetWeakPtr(), std::move(callback)));
 }
 
@@ -546,11 +546,16 @@
   }
 }
 
-void PrivacySandboxService::ConvertFledgeJoiningTopFramesForDisplay(
+void PrivacySandboxService::ConvertInterestGroupDataKeysForDisplay(
     base::OnceCallback<void(std::vector<std::string>)> callback,
-    std::vector<url::Origin> top_frames) {
+    std::vector<content::InterestGroupManager::InterestGroupDataKey>
+        data_keys) {
   std::set<std::string> display_entries;
-  for (const auto& origin : top_frames) {
+  for (const auto& data_key : data_keys) {
+    // When displaying interest group information in settings, the joining
+    // origin is the relevant origin.
+    const auto& origin = data_key.joining_origin;
+
     // Prefer to display the associated eTLD+1, if there is one.
     auto etld_plus_one = net::registry_controlled_domains::GetDomainAndRegistry(
         origin, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
@@ -578,8 +583,10 @@
 
 std::vector<privacy_sandbox::CanonicalTopic>
 PrivacySandboxService::GetCurrentTopTopics() const {
-  if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get())
+  if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get() ||
+      privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting.Get()) {
     return {fake_current_topics_.begin(), fake_current_topics_.end()};
+  }
 
   if (!browsing_topics_service_)
     return {};
@@ -596,8 +603,10 @@
 
 std::vector<privacy_sandbox::CanonicalTopic>
 PrivacySandboxService::GetBlockedTopics() const {
-  if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get())
+  if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get() ||
+      privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting.Get()) {
     return {fake_blocked_topics_.begin(), fake_blocked_topics_.end()};
+  }
 
   const base::Value::List& pref_value =
       pref_service_->GetList(prefs::kPrivacySandboxBlockedTopics);
@@ -617,7 +626,8 @@
 void PrivacySandboxService::SetTopicAllowed(
     privacy_sandbox::CanonicalTopic topic,
     bool allowed) {
-  if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get()) {
+  if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get() ||
+      privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting.Get()) {
     if (allowed) {
       fake_current_topics_.insert(topic);
       fake_blocked_topics_.erase(topic);
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
index 7e3e552..766bb80 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -15,6 +15,7 @@
 #include "components/privacy_sandbox/canonical_topic.h"
 #include "components/privacy_sandbox/privacy_sandbox_settings.h"
 #include "components/profile_metrics/browser_profile_type.h"
+#include "content/public/browser/interest_group_manager.h"
 #include "net/base/schemeful_site.h"
 
 class Browser;
@@ -25,7 +26,6 @@
 
 namespace content {
 class BrowsingDataRemover;
-class InterestGroupManager;
 }
 
 namespace content_settings {
@@ -407,9 +407,10 @@
 
   // Converts the provided list of |top_frames| into eTLD+1s for display, and
   // provides those to |callback|.
-  void ConvertFledgeJoiningTopFramesForDisplay(
+  void ConvertInterestGroupDataKeysForDisplay(
       base::OnceCallback<void(std::vector<std::string>)> callback,
-      std::vector<url::Origin> top_frames);
+      std::vector<content::InterestGroupManager::InterestGroupDataKey>
+          data_keys);
 
   // Contains the logic which powers GetRequiredPromptType(). Static to allow
   // EXPECT_DCHECK_DEATH testing, which does not work well with many of the
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
index d57ba57..3e8b7a1 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
@@ -78,27 +78,28 @@
 
 class TestInterestGroupManager : public content::InterestGroupManager {
  public:
-  void SetInterestGroupJoiningOrigins(const std::vector<url::Origin>& origins) {
-    origins_ = origins;
+  void SetInterestGroupDataKeys(
+      const std::vector<InterestGroupDataKey>& data_keys) {
+    data_keys_ = data_keys;
   }
 
   // content::InterestGroupManager:
   void GetAllInterestGroupJoiningOrigins(
       base::OnceCallback<void(std::vector<url::Origin>)> callback) override {
-    std::move(callback).Run(origins_);
+    NOTREACHED();
   }
   void GetAllInterestGroupDataKeys(
       base::OnceCallback<void(std::vector<InterestGroupDataKey>)> callback)
       override {
-    std::move(callback).Run({});
+    std::move(callback).Run(data_keys_);
   }
   void RemoveInterestGroupsByDataKey(InterestGroupDataKey data_key,
                                      base::OnceClosure callback) override {
-    std::move(callback).Run();
+    NOTREACHED();
   }
 
  private:
-  std::vector<url::Origin> origins_;
+  std::vector<InterestGroupDataKey> data_keys_;
 };
 
 class MockPrivacySandboxSettings
@@ -852,8 +853,14 @@
                                       test_case_4};
 
   for (const auto& origins_to_expected : test_cases) {
-    test_interest_group_manager()->SetInterestGroupJoiningOrigins(
-        {origins_to_expected.first});
+    std::vector<content::InterestGroupManager::InterestGroupDataKey> data_keys;
+    base::ranges::transform(
+        origins_to_expected.first, std::back_inserter(data_keys),
+        [](const auto& origin) {
+          return content::InterestGroupManager::InterestGroupDataKey{
+              url::Origin::Create(GURL("https://embedded.com")), origin};
+        });
+    test_interest_group_manager()->SetInterestGroupDataKeys(data_keys);
 
     bool callback_called = false;
     auto callback = base::BindLambdaForTesting(
@@ -1471,27 +1478,40 @@
 }
 
 TEST_F(PrivacySandboxServiceTest, TestFakeTopics) {
-  feature_list()->Reset();
-  feature_list()->InitAndEnableFeatureWithParameters(
-      privacy_sandbox::kPrivacySandboxSettings3,
-      {{privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.name,
-        "true"}});
-  CanonicalTopic topic1(Topic(1), CanonicalTopic::AVAILABLE_TAXONOMY);
-  CanonicalTopic topic2(Topic(2), CanonicalTopic::AVAILABLE_TAXONOMY);
-  CanonicalTopic topic3(Topic(3), CanonicalTopic::AVAILABLE_TAXONOMY);
-  CanonicalTopic topic4(Topic(4), CanonicalTopic::AVAILABLE_TAXONOMY);
+  std::vector<base::test::FeatureRefAndParams> test_features = {
+      {privacy_sandbox::kPrivacySandboxSettings3,
+       {{privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.name,
+         "true"}}},
+      {privacy_sandbox::kPrivacySandboxSettings4,
+       {{privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting.name,
+         "true"}}}};
 
-  auto* service = privacy_sandbox_service();
-  EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic1, topic2));
-  EXPECT_THAT(service->GetBlockedTopics(), ElementsAre(topic3, topic4));
+  for (const auto& feature : test_features) {
+    feature_list()->Reset();
+    feature_list()->InitWithFeaturesAndParameters({feature}, {});
+    CanonicalTopic topic1(Topic(1), CanonicalTopic::AVAILABLE_TAXONOMY);
+    CanonicalTopic topic2(Topic(2), CanonicalTopic::AVAILABLE_TAXONOMY);
+    CanonicalTopic topic3(Topic(3), CanonicalTopic::AVAILABLE_TAXONOMY);
+    CanonicalTopic topic4(Topic(4), CanonicalTopic::AVAILABLE_TAXONOMY);
 
-  service->SetTopicAllowed(topic1, false);
-  EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic2));
-  EXPECT_THAT(service->GetBlockedTopics(), ElementsAre(topic1, topic3, topic4));
+    auto* service = privacy_sandbox_service();
+    EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic1, topic2));
+    EXPECT_THAT(service->GetBlockedTopics(), ElementsAre(topic3, topic4));
 
-  service->SetTopicAllowed(topic4, true);
-  EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic2, topic4));
-  EXPECT_THAT(service->GetBlockedTopics(), ElementsAre(topic1, topic3));
+    service->SetTopicAllowed(topic1, false);
+    EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic2));
+    EXPECT_THAT(service->GetBlockedTopics(),
+                ElementsAre(topic1, topic3, topic4));
+
+    service->SetTopicAllowed(topic4, true);
+    EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic2, topic4));
+    EXPECT_THAT(service->GetBlockedTopics(), ElementsAre(topic1, topic3));
+
+    service->SetTopicAllowed(topic1, true);
+    service->SetTopicAllowed(topic4, false);
+    EXPECT_THAT(service->GetCurrentTopTopics(), ElementsAre(topic1, topic2));
+    EXPECT_THAT(service->GetBlockedTopics(), ElementsAre(topic3, topic4));
+  }
 }
 
 TEST_F(PrivacySandboxServiceTest, PrivacySandboxPromptNoticeWaiting) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index cf39c82d..cd8419c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -61,6 +61,7 @@
   "background/braille/liblouis.js",
   "background/braille/pan_strategy.js",
   "background/braille/spans.js",
+  "background/chromevox_range.js",
   "background/chromevox_state.js",
   "background/chromevox.js",
   "background/classic_background.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
index 9db7870..3149717c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -21,6 +21,7 @@
 import {BrailleBackground} from './braille/braille_background.js';
 import {BrailleCommandHandler} from './braille/braille_command_handler.js';
 import {ChromeVox} from './chromevox.js';
+import {ChromeVoxRange} from './chromevox_range.js';
 import {ChromeVoxState} from './chromevox_state.js';
 import {ChromeVoxBackground} from './classic_background.js';
 import {ClipboardHandler} from './clipboard_handler.js';
@@ -194,8 +195,8 @@
     this.previousRange_ = this.currentRange_;
     this.currentRange_ = newRange;
 
-    ChromeVoxState.ready().then(ChromeVoxState.observers.forEach(
-        observer => observer.onCurrentRangeChanged(newRange, opt_fromEditing)));
+    ChromeVoxState.ready().then(
+        ChromeVoxRange.onCurrentRangeChanged(newRange, opt_fromEditing));
 
     if (!this.currentRange_) {
       FocusBounds.set([]);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
index de5622b..3d2110b6 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -23,6 +23,8 @@
         'BrailleCommandHandler',
         '/chromevox/background/braille/braille_command_handler.js');
     await importModule(
+        'ChromeVoxRange', '/chromevox/background/chromevox_range.js');
+    await importModule(
         'ChromeVoxState', '/chromevox/background/chromevox_state.js');
     await importModule(
         'ChromeVoxBackground', '/chromevox/background/classic_background.js');
@@ -2769,7 +2771,7 @@
     </div>
   `;
       const root = await this.runWithLoadedTree(site);
-      ChromeVoxState.addObserver(new class {
+      ChromeVoxRange.addObserver(new class {
         onCurrentRangeChanged(range) {
           if (!range) {
             ChromeVox.tts.speak('range cleared!');
@@ -2880,7 +2882,7 @@
       PointerHandler.MIN_NO_POINTER_ANCHOR_SOUND_DELAY_MS = -1;
       const mockFeedback = this.createMockFeedback();
       const root = await this.runWithLoadedTree('<button>hi</button>');
-      ChromeVoxState.addObserver(new class {
+      ChromeVoxRange.addObserver(new class {
         onCurrentRangeChanged(range) {
           if (!range) {
             ChromeVox.tts.speak('range cleared!');
@@ -3027,7 +3029,7 @@
 AX_TEST_F('ChromeVoxBackgroundTest', 'AlertNoAnnouncement', async function() {
   const mockFeedback = this.createMockFeedback();
   const root = await this.runWithLoadedTree('<button></button>');
-  ChromeVoxState.addObserver(new class {
+  ChromeVoxRange.addObserver(new class {
     onCurrentRangeChanged(range) {
       assertNotReached('Range was changed unexpectedly.');
     }
@@ -3044,7 +3046,7 @@
 AX_TEST_F('ChromeVoxBackgroundTest', 'AlertAnnouncement', async function() {
   const mockFeedback = this.createMockFeedback();
   const root = await this.runWithLoadedTree('<button>hello world</button>');
-  ChromeVoxState.addObserver(new class {
+  ChromeVoxRange.addObserver(new class {
     onCurrentRangeChanged(range) {
       assertNotReached('Range was changed unexpectedly.');
     }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js
new file mode 100644
index 0000000..23a6b79
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js
@@ -0,0 +1,57 @@
+// 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.
+
+/**
+ * @fileoverview Classes that handle the ChromeVox range.
+ */
+import {CursorRange} from '../../common/cursors/range.js';
+
+/**
+ * An interface implemented by objects to observe ChromeVox range changes.
+ * @interface
+ */
+export class ChromeVoxRangeObserver {
+  /**
+   * @param {CursorRange} range The new range.
+   * @param {boolean=} opt_fromEditing
+   */
+  onCurrentRangeChanged(range, opt_fromEditing = undefined) {}
+}
+
+/**
+ * A class that handles tracking and changes to the ChromeVox range.
+ *
+ * ================ THIS CLASS IS MID-MIGRATION ================
+ *
+ * The logic relating to the ChromeVox range is being moved here from
+ * ChromeVoxState in small chunks. During this transition, the logic will be
+ * split between those two locations.
+ */
+export class ChromeVoxRange {
+  /** @param {ChromeVoxRangeObserver} observer */
+  static addObserver(observer) {
+    ChromeVoxRange.observers_.push(observer);
+  }
+
+  /** @param {ChromeVoxRangeObserver} observer */
+  static removeObserver(observer) {
+    const index = ChromeVoxRange.observers_.indexOf(observer);
+    if (index > -1) {
+      ChromeVoxRange.observers_.splice(index, 1);
+    }
+  }
+
+  /**
+   * @param {CursorRange} range The new range.
+   * @param {boolean=} opt_fromEditing
+   */
+  static onCurrentRangeChanged(range, opt_fromEditing = undefined) {
+    for (const observer of ChromeVoxRange.observers_) {
+      observer.onCurrentRangeChanged(range, opt_fromEditing);
+    }
+  }
+}
+
+/** @private {!Array<ChromeVoxRangeObserver>} */
+ChromeVoxRange.observers_ = [];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
index 927258b..a0c2f3be 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
@@ -17,32 +17,7 @@
 
 import {UserActionMonitor} from './user_action_monitor.js';
 
-/**
- * An interface implemented by objects to observe ChromeVox state changes.
- * @interface
- */
-export class ChromeVoxStateObserver {
-  /**
-   * @param {CursorRange} range The new range.
-   * @param {boolean=} opt_fromEditing
-   */
-  onCurrentRangeChanged(range, opt_fromEditing) {}
-}
-
 export class ChromeVoxState {
-  /** @param {ChromeVoxStateObserver} observer */
-  static addObserver(observer) {
-    ChromeVoxState.observers.push(observer);
-  }
-
-  /** @param {ChromeVoxStateObserver} observer */
-  static removeObserver(observer) {
-    const index = ChromeVoxState.observers.indexOf(observer);
-    if (index > -1) {
-      ChromeVoxState.observers.splice(index, 1);
-    }
-  }
-
   /** @return {!Promise} */
   static ready() {
     return ChromeVoxState.readyPromise_;
@@ -129,9 +104,6 @@
 /** @type {ChromeVoxState} */
 ChromeVoxState.instance;
 
-/** @type {!Array<ChromeVoxStateObserver>} */
-ChromeVoxState.observers = [];
-
 /** @type {!Object<string, constants.Point>} */
 ChromeVoxState.position = {};
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
index ccabdec..0662118 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -21,7 +21,8 @@
 import {LibLouis} from '../braille/liblouis.js';
 import {BrailleTextStyleSpan, ValueSelectionSpan, ValueSpan} from '../braille/spans.js';
 import {ChromeVox} from '../chromevox.js';
-import {ChromeVoxState, ChromeVoxStateObserver} from '../chromevox_state.js';
+import {ChromeVoxRange, ChromeVoxRangeObserver} from '../chromevox_range.js';
+import {ChromeVoxState} from '../chromevox_state.js';
 import {Color} from '../color.js';
 import {Output} from '../output/output.js';
 import {OutputCustomEvent, OutputNodeSpan} from '../output/output_types.js';
@@ -999,11 +1000,11 @@
 /**
  * An observer that reacts to ChromeVox range changes that modifies braille
  * table output when over email or url text fields.
- * @implements {ChromeVoxStateObserver}
+ * @implements {ChromeVoxRangeObserver}
  */
-class EditingChromeVoxStateObserver {
+class EditingRangeObserver {
   constructor() {
-    ChromeVoxState.addObserver(this);
+    ChromeVoxRange.addObserver(this);
   }
 
   /**
@@ -1024,7 +1025,5 @@
 }
 
 
-/**
- * @private {ChromeVoxStateObserver}
- */
-EditingChromeVoxStateObserver.instance_ = new EditingChromeVoxStateObserver();
+/** @private {ChromeVoxRangeObserver} */
+EditingRangeObserver.instance_ = new EditingRangeObserver();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_url_watcher.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_url_watcher.js
index 56a9ab3..a98c6db 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_url_watcher.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_url_watcher.js
@@ -6,18 +6,19 @@
  * @fileoverview Watches the currently focused URL to verify if logging should
  * occur.
  */
-import {ChromeVoxState, ChromeVoxStateObserver} from '../chromevox_state.js';
+import {ChromeVoxRange, ChromeVoxRangeObserver} from '../chromevox_range.js';
+import {ChromeVoxState} from '../chromevox_state.js';
 
 import {LogStore} from './log_store.js';
 
-/** @implements {ChromeVoxStateObserver} */
+/** @implements {ChromeVoxRangeObserver} */
 export class LogUrlWatcher {
   static create() {
     if (LogUrlWatcher.instance) {
       return;
     }
     LogUrlWatcher.instance = new LogUrlWatcher();
-    ChromeVoxState.addObserver(LogUrlWatcher.instance);
+    ChromeVoxRange.addObserver(LogUrlWatcher.instance);
     // Initialize using the current range.
     if (ChromeVoxState.instance) {
       LogUrlWatcher.instance.onCurrentRangeChanged(
@@ -29,7 +30,7 @@
     if (!LogUrlWatcher.instance) {
       return;
     }
-    ChromeVoxState.removeObserver(LogUrlWatcher.instance);
+    ChromeVoxRange.removeObserver(LogUrlWatcher.instance);
     LogUrlWatcher.instance = null;
   }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
index 341ddd8b..2599a20d 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
@@ -12,7 +12,7 @@
 
 import {BaseAutomationHandler} from './base_automation_handler.js';
 import {ChromeVox} from './chromevox.js';
-import {ChromeVoxState, ChromeVoxStateObserver} from './chromevox_state.js';
+import {ChromeVoxRange, ChromeVoxRangeObserver} from './chromevox_range.js';
 
 const ActionType = chrome.automation.ActionType;
 const AutomationNode = chrome.automation.AutomationNode;
@@ -21,7 +21,7 @@
 const RoleType = chrome.automation.RoleType;
 const StateType = chrome.automation.StateType;
 
-/** @implements {ChromeVoxStateObserver} */
+/** @implements {ChromeVoxRangeObserver} */
 export class PageLoadSoundHandler extends BaseAutomationHandler {
   /** @private */
   constructor() {
@@ -36,7 +36,7 @@
       this.addListener_(EventType.LOAD_COMPLETE, this.onLoadComplete);
       this.addListener_(EventType.LOAD_START, this.onLoadStart);
 
-      ChromeVoxState.addObserver(this);
+      ChromeVoxRange.addObserver(this);
     });
   }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
index b6483e7c..e6b8bbc4c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -15,7 +15,8 @@
 import {ALL_PANEL_MENU_NODE_DATA} from '../../common/panel_menu_data.js';
 import {QueueMode} from '../../common/tts_types.js';
 import {ChromeVox} from '../chromevox.js';
-import {ChromeVoxState, ChromeVoxStateObserver} from '../chromevox_state.js';
+import {ChromeVoxRange, ChromeVoxRangeObserver} from '../chromevox_range.js';
+import {ChromeVoxState} from '../chromevox_state.js';
 import {Output} from '../output/output.js';
 import {OutputCustomEvent} from '../output/output_types.js';
 
@@ -45,8 +46,8 @@
       throw 'Trying to create two copies of singleton PanelBackground';
     }
     PanelBackground.instance = new PanelBackground();
-    PanelBackground.stateObserver_ = new PanelStateObserver();
-    ChromeVoxState.addObserver(PanelBackground.stateObserver_);
+    PanelBackground.rangeObserver_ = new PanelRangeObserver();
+    ChromeVoxRange.addObserver(PanelBackground.rangeObserver_);
 
     BridgeHelper.registerHandler(
         TARGET, Action.CLEAR_SAVED_NODE,
@@ -314,11 +315,11 @@
 /** @type {PanelBackground} */
 PanelBackground.instance;
 
-/** @private {PanelStateObserver} */
-PanelBackground.stateObserver_;
+/** @private {PanelRangeObserver} */
+PanelBackground.rangeObserver_;
 
-/** @implements {ChromeVoxStateObserver} */
-class PanelStateObserver {
+/** @implements {ChromeVoxRangeObserver} */
+class PanelRangeObserver {
   /** @override */
   onCurrentRangeChanged(range, opt_fromEditing) {
     PanelBridge.onCurrentRangeChanged();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
index 7592172..be58bc4 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
@@ -13,7 +13,8 @@
 import {Msgs} from '../common/msgs.js';
 
 import {BaseAutomationHandler} from './base_automation_handler.js';
-import {ChromeVoxState, ChromeVoxStateObserver} from './chromevox_state.js';
+import {ChromeVoxRange, ChromeVoxRangeObserver} from './chromevox_range.js';
+import {ChromeVoxState} from './chromevox_state.js';
 import {DesktopAutomationHandler} from './desktop_automation_handler.js';
 import {FocusBounds} from './focus_bounds.js';
 import {Output} from './output/output.js';
@@ -26,7 +27,7 @@
 const RoleType = chrome.automation.RoleType;
 const StateType = chrome.automation.StateType;
 
-/** @implements {ChromeVoxStateObserver} */
+/** @implements {ChromeVoxRangeObserver} */
 export class RangeAutomationHandler extends BaseAutomationHandler {
   /** @private */
   constructor() {
@@ -41,7 +42,7 @@
     /** @private {number} */
     this.delayedAttributeOutputId_ = -1;
 
-    ChromeVoxState.addObserver(this);
+    ChromeVoxRange.addObserver(this);
   }
 
   static init() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
index 893a0c6..189cf73 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
@@ -13,11 +13,12 @@
 import {EarconId} from '../common/earcon_id.js';
 
 import {ChromeVox} from './chromevox.js';
-import {ChromeVoxState, ChromeVoxStateObserver} from './chromevox_state.js';
+import {ChromeVoxRange, ChromeVoxRangeObserver} from './chromevox_range.js';
+import {ChromeVoxState} from './chromevox_state.js';
 import {ChromeVoxBackground} from './classic_background.js';
 import {ChromeVoxPrefs} from './prefs.js';
 
-/** @implements {ChromeVoxStateObserver} */
+/** @implements {ChromeVoxRangeObserver} */
 export class SmartStickyMode {
   constructor() {
     /** @private {boolean} */
@@ -32,7 +33,7 @@
     /** @private {chrome.automation.AutomationNode|undefined} */
     this.ignoredNodeSubtree_;
 
-    ChromeVoxState.addObserver(this);
+    ChromeVoxRange.addObserver(this);
   }
 
   static init() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode_test.js
index 047781b2..1df9df0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode_test.js
@@ -15,6 +15,8 @@
 
     // Alphabetical based on file path.
     await importModule(
+        'ChromeVoxRange', '/chromevox/background/chromevox_range.js');
+    await importModule(
         'ChromeVoxState', '/chromevox/background/chromevox_state.js');
     await importModule('ChromeVoxPrefs', '/chromevox/background/prefs.js');
     await importModule(
@@ -23,7 +25,7 @@
     await importModule('CursorRange', '/common/cursors/range.js');
     this.ssm_ = new SmartStickyMode();
     // Deregister from actual range changes.
-    ChromeVoxState.removeObserver(this.ssm_);
+    ChromeVoxRange.removeObserver(this.ssm_);
     assertFalse(this.ssm_.didTurnOffStickyMode_);
   }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
index c577f689d..6d606a1 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
@@ -899,7 +899,7 @@
 <translation id="7140168702531682811">Superior à linha</translation>
 <translation id="7143034430156387447">Alternar entre braille de 6 e 8 pontos</translation>
 <translation id="7143207342074048698">A ligar</translation>
-<translation id="7153618581592392745">Lilás</translation>
+<translation id="7153618581592392745">Lavanda</translation>
 <translation id="7157306005867877619">Resumo</translation>
 <translation id="7161771961008409533">Botão pop-up</translation>
 <translation id="7167657087543110">eco dos carateres</translation>
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index a8d0c0d..072c6d4 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -163,11 +163,13 @@
 export {SettingsPersonalizationOptionsElement} from './privacy_page/personalization_options.js';
 export {PrivacyGuideStep} from './privacy_page/privacy_guide/constants.js';
 export {PrivacyGuideCompletionFragmentElement} from './privacy_page/privacy_guide/privacy_guide_completion_fragment.js';
+export {PrivacyGuideCookiesFragmentElement} from './privacy_page/privacy_guide/privacy_guide_cookies_fragment.js';
 export {PrivacyGuideDescriptionItemElement} from './privacy_page/privacy_guide/privacy_guide_description_item.js';
 export {SettingsPrivacyGuideDialogElement} from './privacy_page/privacy_guide/privacy_guide_dialog.js';
 export {PrivacyGuideHistorySyncFragmentElement} from './privacy_page/privacy_guide/privacy_guide_history_sync_fragment.js';
 export {PrivacyGuideMsbbFragmentElement} from './privacy_page/privacy_guide/privacy_guide_msbb_fragment.js';
 export {SettingsPrivacyGuidePageElement} from './privacy_page/privacy_guide/privacy_guide_page.js';
+export {PrivacyGuideSafeBrowsingFragmentElement} from './privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.js';
 export {PrivacyGuideWelcomeFragmentElement} from './privacy_page/privacy_guide/privacy_guide_welcome_fragment.js';
 export {SettingsPrivacySandboxAdMeasurementSubpageElement} from './privacy_page/privacy_sandbox/privacy_sandbox_ad_measurement_subpage.js';
 export {SettingsPrivacySandboxFledgeSubpageElement} from './privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.js';
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.ts
index ab4397db..23c5449 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.ts
@@ -23,6 +23,12 @@
 
 import {getTemplate} from './privacy_guide_completion_fragment.html.js';
 
+export interface PrivacyGuideCompletionFragmentElement {
+  $: {
+    backButton: HTMLElement,
+  };
+}
+
 const PrivacyGuideCompletionFragmentElementBase =
     WebUiListenerMixin(I18nMixin(PolymerElement));
 
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.ts
index e58d9488..9b41453d 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.ts
@@ -114,5 +114,10 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'privacy-guide-cookies-fragment': PrivacyGuideCookiesFragmentElement;
+  }
+}
 customElements.define(
     PrivacyGuideCookiesFragmentElement.is, PrivacyGuideCookiesFragmentElement);
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.ts
index b1a9a21..d0e2d5bf 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.ts
@@ -90,5 +90,11 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'privacy-guide-msbb-fragment': PrivacyGuideMsbbFragmentElement;
+  }
+}
+
 customElements.define(
     PrivacyGuideMsbbFragmentElement.is, PrivacyGuideMsbbFragmentElement);
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
index 06d2a75..1a314ebb 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
@@ -195,17 +195,6 @@
         },
       ],
       [
-        PrivacyGuideStep.COMPLETION,
-        {
-          onBackwardNavigation: () => {
-            this.metricsBrowserProxy_.recordAction(
-                'Settings.PrivacyGuide.BackClickCompletion');
-          },
-          previousStep: PrivacyGuideStep.COOKIES,
-          isAvailable: () => true,
-        },
-      ],
-      [
         PrivacyGuideStep.MSBB,
         {
           nextStep: PrivacyGuideStep.HISTORY_SYNC,
@@ -283,6 +272,17 @@
           isAvailable: () => this.shouldShowCookiesCard_(),
         },
       ],
+      [
+        PrivacyGuideStep.COMPLETION,
+        {
+          onBackwardNavigation: () => {
+            this.metricsBrowserProxy_.recordAction(
+                'Settings.PrivacyGuide.BackClickCompletion');
+          },
+          previousStep: PrivacyGuideStep.COOKIES,
+          isAvailable: () => true,
+        },
+      ],
     ]);
   }
 
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.ts
index b90b471..6963e2e4 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.ts
@@ -112,6 +112,13 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'privacy-guide-safe-browsing-fragment':
+        PrivacyGuideSafeBrowsingFragmentElement;
+  }
+}
+
 customElements.define(
     PrivacyGuideSafeBrowsingFragmentElement.is,
     PrivacyGuideSafeBrowsingFragmentElement);
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_welcome_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_welcome_fragment.ts
index 8d03074..aa2c045 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_welcome_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_welcome_fragment.ts
@@ -40,5 +40,11 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'privacy-guide-welcome-fragment': PrivacyGuideWelcomeFragmentElement;
+  }
+}
+
 customElements.define(
     PrivacyGuideWelcomeFragmentElement.is, PrivacyGuideWelcomeFragmentElement);
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html
index 2787adca..cf9f17a 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.html
@@ -43,6 +43,10 @@
     padding-block-start: 16px;
   }
 
+  #blockedSitesList {
+    padding: 0 var(--cr-section-padding);
+  }
+
   #footer {
     padding-block-end: 16px;
     padding-block-start: 16px;
@@ -88,7 +92,24 @@
           $i18n{fledgePageCurrentSitesDescriptionLearnMore}
         </button>
       </div>
-      <!-- TODO(b/254411463): Add sites list. -->
+      <template is="dom-repeat" items="[[mainSitesList_]]">
+        <privacy-sandbox-interest-item interest="[[item]]"
+            on-interest-changed="onInterestChanged_">
+        </privacy-sandbox-interest-item>
+      </template>
+      <template is="dom-if" if="[[!isRemainingSitesListEmpty_(
+          remainingSitesList_.length)]]" restamp>
+        <cr-expand-button id="seeAllSites" expanded="{{seeAllSitesExpanded_}}">
+          $i18n{fledgePageSeeAllSitesLabel}
+        </cr-expand-button>
+        <iron-collapse opened="[[seeAllSitesExpanded_]]">
+          <template is="dom-repeat" items="[[remainingSitesList_]]">
+            <privacy-sandbox-interest-item interest="[[item]]"
+                on-interest-changed="onInterestChanged_">
+            </privacy-sandbox-interest-item>
+          </template>
+        </iron-collapse>
+      </template>
       <div id="currentSitesDescriptionEmpty"
           class="no-sites cr-secondary-text"
           hidden="[[!isSitesListEmpty_(sitesList_.length)]]">
@@ -111,7 +132,13 @@
       class="cr-row continuation cr-secondary-text">
     [[computeBlockedSitesDescription_(blockedSitesList_.length)]]
   </div>
-  <!-- TODO(b/254411463): Add blocked sites list. -->
+  <div id="blockedSitesList">
+    <template is="dom-repeat" items="[[blockedSitesList_]]">
+      <privacy-sandbox-interest-item interest="[[item]]"
+          on-interest-changed="onInterestChanged_">
+      </privacy-sandbox-interest-item>
+    </template>
+  </div>
 </iron-collapse>
 <div id="footer" class="cr-secondary-text">
   $i18nRaw{fledgePageFooter}
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.ts b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.ts
index b18d59fd..98c4b27 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_fledge_subpage.ts
@@ -9,8 +9,10 @@
 import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import '../../controls/settings_toggle_button.js';
 import '../../prefs/prefs.js';
+import './privacy_sandbox_interest_item.js';
 
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
 import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SettingsToggleButtonElement} from '../../controls/settings_toggle_button.js';
@@ -26,6 +28,8 @@
   };
 }
 
+const maxFledgeSitesCount: number = 15;
+
 const SettingsPrivacySandboxFledgeSubpageElementBase =
     I18nMixin(PrefsMixin(PolymerElement));
 
@@ -51,6 +55,29 @@
 
       sitesList_: {
         type: Array,
+        observer: 'onSitesListChanged_',
+        value() {
+          return [];
+        },
+      },
+
+      /**
+       * Helper list used to display the main sites in the current sites
+       * section, above the "See all sites" expand button.
+       */
+      mainSitesList_: {
+        type: Array,
+        value() {
+          return [];
+        },
+      },
+
+      /**
+       * Helper list used to display the remaining sites in the current sites
+       * section that are inside the "See all sites" expandable section.
+       */
+      remainingSitesList_: {
+        type: Array,
         value() {
           return [];
         },
@@ -80,6 +107,11 @@
         value: false,
       },
 
+      seeAllSitesExpanded_: {
+        type: Boolean,
+        value: false,
+      },
+
       blockedSitesExpanded_: {
         type: Boolean,
         value: false,
@@ -88,10 +120,17 @@
     };
   }
 
+  static get maxFledgeSites() {
+    return maxFledgeSitesCount;
+  }
+
   private sitesList_: PrivacySandboxInterest[];
+  private mainSitesList_: PrivacySandboxInterest[];
+  private remainingSitesList_: PrivacySandboxInterest[];
   private blockedSitesList_: PrivacySandboxInterest[];
   private isSitesListLoaded_: boolean;
   private isLearnMoreDialogOpen_: boolean;
+  private seeAllSitesExpanded_: boolean;
   private blockedSitesExpanded_: boolean;
   private privacySandboxBrowserProxy_: PrivacySandboxBrowserProxy =
       PrivacySandboxBrowserProxyImpl.getInstance();
@@ -115,6 +154,12 @@
     this.isSitesListLoaded_ = true;
   }
 
+  private onSitesListChanged_() {
+    this.mainSitesList_ = this.sitesList_.slice(0, maxFledgeSitesCount);
+    this.remainingSitesList_ = this.sitesList_.slice(maxFledgeSitesCount);
+  }
+
+
   private isFledgeEnabledAndLoaded_(): boolean {
     return this.getPref('privacy_sandbox.m1.fledge_enabled').value &&
         this.isSitesListLoaded_;
@@ -124,6 +169,10 @@
     return this.sitesList_.length === 0;
   }
 
+  private isRemainingSitesListEmpty_(): boolean {
+    return this.remainingSitesList_.length === 0;
+  }
+
   private computeBlockedSitesDescription_(): string {
     return this.i18n(
         this.blockedSitesList_.length === 0 ?
@@ -153,6 +202,13 @@
     });
   }
 
+  private onInterestChanged_(e: CustomEvent<PrivacySandboxInterest>) {
+    const interest = e.detail;
+    assert(!interest.topic);
+    // TODO(b/254412955): Implement the logic required to correctly move or
+    // remove entries as the user block and unblocks them.
+  }
+
   // TODO(crbug.com/1378703): Record metrics when blocking/unblocking sites.
   // Record a metric when expanding "More sites" section.
 
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.html b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.html
index e989716..b499c9a1 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.html
@@ -10,7 +10,7 @@
   }
 
   site-favicon {
-    margin-inline-end: 12px;
+    margin-inline-end: 16px;
   }
 </style>
 <div class="list-item interest-item" focus-row-container>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.ts b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.ts
index 3d243e4a..e0250d2 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_interest_item.ts
@@ -48,10 +48,17 @@
   }
 
   private getButtonLabel_(): string {
-    // TODO(crbug.com/1378703): Return Fledge string ids for this.interest.site.
-    return this.i18n(
-        this.interest.removed ? 'topicsPageAllowTopic' :
-                                'topicsPageBlockTopic');
+    if (this.interest.topic !== undefined) {
+      assert(!this.interest.site);
+      return this.i18n(
+          this.interest.removed ? 'topicsPageAllowTopic' :
+                                  'topicsPageBlockTopic');
+    } else {
+      assert(!this.interest.topic);
+      return this.i18n(
+          this.interest.removed ? 'fledgePageAllowSite' :
+                                  'fledgePageBlockSite');
+    }
   }
 
   private onInterestChanged_(e: Event) {
diff --git a/chrome/browser/resources/settings/site_settings/site_data.html b/chrome/browser/resources/settings/site_settings/site_data.html
index 08391e2b..921c67e 100644
--- a/chrome/browser/resources/settings/site_settings/site_data.html
+++ b/chrome/browser/resources/settings/site_settings/site_data.html
@@ -34,9 +34,10 @@
 <div class="radio-group">
   <h2>$i18n{privacyPageTitle}</h2>
   <div class="secondary radio-group-sub-heading">$i18n{privacyPageTitle}</div>
-  <settings-radio-group id="defaultGroup"
+  <settings-radio-group id="defaultGroup" no-set-pref
       pref="{{prefs.generated.cookie_default_content_setting}}"
-      selectable-elements="cr-radio-button, settings-collapse-radio-button">
+      selectable-elements="cr-radio-button, settings-collapse-radio-button"
+      on-change="onDefaultRadioChange_">
     <settings-collapse-radio-button id="defaultAllow" no-collapse
         name="[[contentSettingEnum_.ALLOW]]"
         pref="[[prefs.generated.cookie_default_content_setting]]"
@@ -94,3 +95,20 @@
     search-filter="[[searchTerm]]"
     cookies-exception-type="combined">
 </site-list>
+<template is="dom-if" if="[[showDefaultBlockDialog_]]" restamp>
+  <cr-dialog id="defaultBlockDialog" show-on-attach
+      close-text="$i18n{privacyPageTitle}">
+    <div slot="title">$i18n{privacyPageTitle}</div>
+    <div slot="body">$i18n{privacyPageTitle}</div>
+    <div slot="button-container">
+    <cr-button id="defaultBlockDialogCancel" class="cancel-button"
+        on-click="onDefaultBlockDialogCancel_">
+        $i18n{privacyPageTitle}
+    </cr-button>
+    <cr-button id="defaultBlockDialogConfirm" class="action-button"
+        on-click="onDefaultBlockDialogConfirm_">
+        $i18n{privacyPageTitle}
+    </cr-button>
+    </div>
+  </cr-dialog>
+</template>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/site_settings/site_data.ts b/chrome/browser/resources/settings/site_settings/site_data.ts
index 5000046..e8c8cd67 100644
--- a/chrome/browser/resources/settings/site_settings/site_data.ts
+++ b/chrome/browser/resources/settings/site_settings/site_data.ts
@@ -7,11 +7,14 @@
  * 'settings-site-data' is the polymer element for showing the
  * settings for site data under Site Settings.
  */
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import '../controls/settings_radio_group.js';
 import '../prefs/prefs.js';
 import '../privacy_page/collapse_radio_button.js';
 import './site_list.js';
 
+import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SettingsRadioGroupElement} from '../controls/settings_radio_group.js';
@@ -70,6 +73,8 @@
         type: Boolean,
         value: false,
       },
+
+      showDefaultBlockDialog_: Boolean,
     };
   }
 
@@ -81,6 +86,7 @@
   searchTerm: string;
   private cookiesContentSettingType_: ContentSettingsTypes;
   private exceptionListsReadOnly_: boolean;
+  private showDefaultBlockDialog_: boolean;
 
   private onGeneratedPrefsUpdated_() {
     const pref = this.getPref('generated.cookie_default_content_setting');
@@ -90,6 +96,35 @@
     this.exceptionListsReadOnly_ =
         pref.enforcement === chrome.settingsPrivate.Enforcement.ENFORCED;
   }
+
+  private onDefaultRadioChange_() {
+    const selected = this.$.defaultGroup.selected;
+    if (selected === ContentSetting.BLOCK) {
+      this.showDefaultBlockDialog_ = true;
+    } else {
+      this.$.defaultGroup.sendPrefChange();
+    }
+  }
+
+  private onDefaultBlockDialogCancel_() {
+    this.$.defaultGroup.resetToPrefValue();
+
+    this.showDefaultBlockDialog_ = false;
+
+    // Set focus back to the block button regardless of user interaction
+    // with the dialog, as it was the entry point to the dialog.
+    focusWithoutInk(this.$.defaultBlock);
+  }
+
+  private onDefaultBlockDialogConfirm_() {
+    this.$.defaultGroup.sendPrefChange();
+
+    this.showDefaultBlockDialog_ = false;
+
+    // Set focus back to the block button regardless of user interaction
+    // with the dialog, as it was the entry point to the dialog.
+    focusWithoutInk(this.$.defaultBlock);
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
index 1b93dcdf..e6b6dd7 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
@@ -74,10 +74,8 @@
 
   static get observers() {
     return [
-      // The prefs object is only populated for the instance of this element
-      // which contains the notifications link row, avoiding non-actionable
-      // firing of the observer.
       'updateNotificationsLabel_(prefs.generated.notification.*)',
+      'updateSiteDataLabel_(prefs.generated.cookie_default_content_setting.*)',
     ];
   }
 
@@ -222,9 +220,11 @@
     const index = this.categoryList.map(e => e.id).indexOf(
         ContentSettingsTypes.NOTIFICATIONS);
 
-    // updateNotificationsLabel_ should only be called for the
-    // site-settings-list instance which contains notifications.
-    assert(index !== -1);
+    // The notification row might not be part of the current site-settings-list
+    // but the class always observes the preference.
+    if (index === -1) {
+      return;
+    }
 
     let label = 'siteSettingsNotificationsBlocked';
     if (state === NotificationSetting.ASK) {
@@ -235,6 +235,34 @@
     this.set(`categoryList.${index}.subLabel`, this.i18n(label));
   }
 
+  /**
+   * Update the site data link row label when the default cookies content
+   * setting changes.
+   */
+  private updateSiteDataLabel_() {
+    const state =
+        this.getPref('generated.cookie_default_content_setting').value;
+    const index = this.categoryList.map(e => e.id).indexOf(
+        ContentSettingsTypes.SITE_DATA);
+
+    // The site data row might not be part of the current site-settings-list
+    // but the class always observes the preference.
+    if (index === -1) {
+      return;
+    }
+
+    let label;
+    if (state === ContentSetting.ALLOW) {
+      label = 'siteSettingsSiteDataAllowedSubLabel';
+    } else if (state === ContentSetting.SESSION_ONLY) {
+      label = 'siteSettingsSiteDataClearOnExitSubLabel';
+    } else if (state === ContentSetting.BLOCK) {
+      label = 'siteSettingsSiteDataBlockedSubLabel';
+    }
+    assert(!!label);
+    this.set(`categoryList.${index}.subLabel`, this.i18n(label));
+  }
+
   private onClick_(event: DomRepeatEvent<CategoryListItem>) {
     Router.getInstance().navigateTo(this.categoryList[event.model.index].route);
   }
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
index 2a871d9..35a643a 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
@@ -62,7 +62,7 @@
       <div>$i18n{siteSettingsContentMore}</div>
     </cr-expand-button>
     <iron-collapse opened="[[contentExpanded_]]">
-      <settings-site-settings-list id="advancedContentList"
+      <settings-site-settings-list id="advancedContentList" prefs="{{prefs}}"
           category-list="[[lists_.contentAdvanced]]"
           focus-config="[[focusConfig]]">
       </settings-site-settings-list>
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/file_opening_job_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/file_opening_job_unittest.cc
index 92a9fb9..1ef878127 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/file_opening_job_unittest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/file_opening_job_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/scoped_command_line.h"
+#include "build/build_config.h"
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request.h"
 #include "content/public/test/browser_task_environment.h"
@@ -100,7 +101,13 @@
   EXPECT_EQ(100, on_got_file_data_count_);
 }
 
-TEST_F(FileOpeningJobTest, MaxThreadsFlag) {
+// Disabled due to flakiness on Mac https://crbug.com/1403810
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_MaxThreadsFlag DISABLED_MaxThreadsFlag
+#else
+#define MAYBE_MaxThreadsFlag MaxThreadsFlag
+#endif
+TEST_F(FileOpeningJobTest, MAYBE_MaxThreadsFlag) {
   base::test::ScopedCommandLine scoped_command_line;
   base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
   base::RunLoop run_loop;
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc
index bbf5407..97c5312 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.cc
@@ -146,8 +146,6 @@
       kSettingsResetPrompt, "domain_hashes");
   ConfigError error = ParseDomainHashes(domain_hashes_json);
   if (error != CONFIG_ERROR_OK) {
-    UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ConfigError", error,
-                              CONFIG_ERROR_MAX);
     return false;
   }
 
@@ -155,9 +153,6 @@
   int delay_before_prompt_seconds = base::GetFieldTrialParamByFeatureAsInt(
       kSettingsResetPrompt, "delay_before_prompt_seconds", -1);
   if (delay_before_prompt_seconds < 0) {
-    UMA_HISTOGRAM_ENUMERATION(
-        "SettingsResetPrompt.ConfigError",
-        CONFIG_ERROR_BAD_DELAY_BEFORE_PROMPT_SECONDS_PARAM, CONFIG_ERROR_MAX);
     return false;
   }
   delay_before_prompt_ = base::Seconds(delay_before_prompt_seconds);
@@ -166,9 +161,6 @@
   prompt_wave_ = base::GetFieldTrialParamByFeatureAsInt(kSettingsResetPrompt,
                                                         "prompt_wave", 0);
   if (prompt_wave_ <= 0) {
-    UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ConfigError",
-                              CONFIG_ERROR_BAD_PROMPT_WAVE_PARAM,
-                              CONFIG_ERROR_MAX);
     return false;
   }
 
@@ -176,15 +168,10 @@
   int time_between_prompts_seconds = base::GetFieldTrialParamByFeatureAsInt(
       kSettingsResetPrompt, "time_between_prompts_seconds", -1);
   if (time_between_prompts_seconds < 0) {
-    UMA_HISTOGRAM_ENUMERATION(
-        "SettingsResetPrompt.ConfigError",
-        CONFIG_ERROR_BAD_TIME_BETWEEN_PROMPTS_SECONDS_PARAM, CONFIG_ERROR_MAX);
     return false;
   }
   time_between_prompts_ = base::Seconds(time_between_prompts_seconds);
 
-  UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ConfigError", CONFIG_ERROR_OK,
-                            CONFIG_ERROR_MAX);
   return true;
 }
 
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc
index d28b241..580de3a 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc
@@ -105,7 +105,6 @@
   model_->DialogShown();
   time_dialog_shown_ = base::Time::Now();
   base::RecordAction(base::UserMetricsAction("SettingsResetPrompt_Shown"));
-  UMA_HISTOGRAM_BOOLEAN("SettingsResetPrompt.DialogShown", true);
 }
 
 void SettingsResetPromptController::Accept() {
@@ -113,9 +112,6 @@
   DCHECK(default_settings_);
 
   base::RecordAction(base::UserMetricsAction("SettingsResetPrompt_Accepted"));
-  UMA_HISTOGRAM_LONG_TIMES_100("SettingsResetPrompt.TimeUntilAccepted",
-                               base::Time::Now() - time_dialog_shown_);
-  UMA_HISTOGRAM_BOOLEAN("SettingsResetPrompt.PromptAccepted", true);
   model_->PerformReset(
       std::move(default_settings_),
       base::BindOnce(&SettingsResetPromptController::OnInteractionDone,
@@ -125,18 +121,12 @@
 void SettingsResetPromptController::Cancel() {
   DCHECK(!time_dialog_shown_.is_null());
   base::RecordAction(base::UserMetricsAction("SettingsResetPrompt_Canceled"));
-  UMA_HISTOGRAM_LONG_TIMES_100("SettingsResetPrompt.TimeUntilCanceled",
-                               base::Time::Now() - time_dialog_shown_);
-  UMA_HISTOGRAM_BOOLEAN("SettingsResetPrompt.PromptAccepted", false);
   OnInteractionDone();
 }
 
 void SettingsResetPromptController::Close() {
   DCHECK(!time_dialog_shown_.is_null());
   base::RecordAction(base::UserMetricsAction("SettingsResetPrompt_Dismissed"));
-  UMA_HISTOGRAM_LONG_TIMES_100("SettingsResetPrompt.TimeUntilDismissed",
-                               base::Time::Now() - time_dialog_shown_);
-  UMA_HISTOGRAM_BOOLEAN("SettingsResetPrompt.PromptAccepted", false);
   OnInteractionDone();
 }
 
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc
index ae48c02f..2e64ebe5 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc
@@ -131,19 +131,12 @@
   ProfileResetter::ResettableFlags reset_flags = 0;
   if (homepage_reset_state() == RESET_REQUIRED) {
     reset_flags |= ProfileResetter::HOMEPAGE;
-    UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset",
-                              SETTINGS_RESET_HOMEPAGE, SETTINGS_RESET_MAX);
   }
   if (default_search_reset_state() == RESET_REQUIRED) {
     reset_flags |= ProfileResetter::DEFAULT_SEARCH_ENGINE;
-    UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset",
-                              SETTINGS_RESET_DEFAULT_SEARCH,
-                              SETTINGS_RESET_MAX);
   }
   if (startup_urls_reset_state() == RESET_REQUIRED) {
     reset_flags |= ProfileResetter::STARTUP_PAGES;
-    UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset",
-                              SETTINGS_RESET_STARTUP_URLS, SETTINGS_RESET_MAX);
   }
 
   profile_resetter_->Reset(reset_flags, std::move(default_settings),
@@ -199,17 +192,6 @@
   return startup_urls_reset_state_;
 }
 
-void SettingsResetPromptModel::ReportUmaMetrics() const {
-  UMA_HISTOGRAM_BOOLEAN("SettingsResetPrompt.PromptRequired",
-                        ShouldPromptForReset());
-  UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_DefaultSearch",
-                            default_search_reset_state(), RESET_STATE_MAX);
-  UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_StartupUrls",
-                            startup_urls_reset_state(), RESET_STATE_MAX);
-  UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_Homepage",
-                            homepage_reset_state(), RESET_STATE_MAX);
-}
-
 void SettingsResetPromptModel::InitDefaultSearchData() {
   // Default search data must be the first setting type to be initialized.
   DCHECK_EQ(settings_types_initialized_, 0U);
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h
index d060bc6..6d9d8e01 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h
@@ -90,8 +90,6 @@
   virtual const std::vector<GURL>& startup_urls_to_reset() const;
   virtual ResetState startup_urls_reset_state() const;
 
-  void ReportUmaMetrics() const;
-
  private:
   // Functions to be called by the constructor to initialize the model
   // object. These functions should be called in the order in which they are
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_util_win.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_util_win.cc
index 7ee96f2..d57fabe 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_util_win.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_util_win.cc
@@ -73,8 +73,6 @@
   auto model = std::make_unique<SettingsResetPromptModel>(
       profile, std::move(config), std::make_unique<ProfileResetter>(profile));
 
-  model->ReportUmaMetrics();
-
   if (!model->ShouldPromptForReset())
     return;
 
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 3958dbb8..d14a731 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1077,109 +1077,6 @@
         Chrome is finding new ways to reduce tracking and keep you even safer as you browse. Chrome also <ph name="BEGIN_LINK">&lt;link&gt;</ph>estimates your interests<ph name="END_LINK">&lt;/link&gt;</ph> and enables you to manage them. Then, sites you visit can ask Chrome for your interests to show you ads.
       </message>
 
-      <!-- Privacy Sandbox v4 - Notice EEA. -->
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_TITLE" translateable="false" desc="Privacy Sandbox dialog notice EEA: title.">
-        Lorem ipsum Notice EEA
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_DESCRIPTION_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First section of the body, above the bullet points.">
-        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pretium pulvinar metus non mollis. Quisque placerat eget nisl sit amet facilisis.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First bullet point (outside expand).">
-        Nulla in tortor: a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second bullet point (outside expand).">
-        Sed purus vestibulum: velit convallis suscipit. Aenean aliquam ut velit eget dapibus. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_EXPAND_LABEL" translateable="false" desc="Privacy Sandbox dialog notice EEA: Text user clicks to expand the collapsed section.">
-        Vestibulum orci risus, consectetur
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_DESCRIPTION_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second section of text, below the expand label.">
-        Consectetur adipiscing elit duis pretium pulvinar metus non mollis
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_ACK_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice EEA: Got it button.">
-        Sed
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_SETTINGS_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice EEA: Settings button.">
-        Cras id
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_HEADING_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First header in learn more expand.">
-        Esed purus vestibulum velit convalli
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_DESCRIPTION" translateable="false" desc="Privacy Sandbox dialog notice EEA: First description block in expand.">
-        Nulla in tortor a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit. Integer et libero id metus egestas consequat non a ipsum.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_HEADING_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second header in learn more expand.">
-        Proin sed purus vestibulum velit velit eget dapibus.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First bullet point in expand.">
-        <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Nulla in tortor:<ph name="END_BOLD">&lt;/b&gt;</ph> a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second bullet point in expand.">
-        <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Consectetur adipiscing elit:<ph name="END_BOLD">&lt;/b&gt;</ph> Duis pretium pulvinar metus non mollis
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_3" translateable="false" desc="Privacy Sandbox dialog notice EEA: Third bullet point in expand.">
-        <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Sed purus vestibulum: <ph name="END_BOLD">&lt;/b&gt;</ph> velit convallis suscipit. Aenean aliquam ut velit eget dapibus. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-      </message>
-
-      <!-- Privacy Sandbox v4 - Notice ROW. -->
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_TITLE" translateable="false" desc="Privacy Sandbox dialog notice ROW: title.">
-        Lorem ipsum Notice ROW
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First section of the body, above the image.">
-        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pretium pulvinar metus non mollis.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second section of the body, above the image.">
-        Nulla in tortor a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit. Integer et libero id metus egestas consequat non a ipsum. Quisque placerat eget nisl sit amet facilisis.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_3" translateable="false" desc="Privacy Sandbox dialog notice ROW: Third section of the body, below the image.">
-        Vestibulum pretium placerat justo vel suscipit. Quisque urna arcu, elementum ut venenatis ornare, consequat ac turpis. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_4" translateable="false" desc="Privacy Sandbox dialog notice ROW: Fourth section of the body, below the expand label.">
-        Proin sed purus vestibulum velit convallis suscipit eget dapibus.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_ACK_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice ROW: Got it button on notice in eea.">
-        Sed
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_SETTINGS_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice ROW: Settings button in notice.">
-        Cras id
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_EXPAND_LABEL" translateable="false" desc="Privacy Sandbox dialog notice ROW: Expand text.">
-        Vestibulum orci risus consectetur
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First header inside expand section.">
-        Esed purus vestibulum velit convalli
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First description text in body, underneath first header.">
-        Etiam dictum sem et neque molestie lobortis. Morbi quam tellus, tincidunt eget dapibus ac, lobortis et lacus. Integer nec egestas elit. Nulla venenatis facilisis dui eget suscipit.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second heading inside expand section.">
-        Class aptent taciti sociosqu ad
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second description text in body, underneath second header.">
-        Vestibulum pretium placerat justo vel suscipit. Quisque urna arcu.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_BULLET_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First bullet point in ROW notice expand.">
-        Sed elementum tellus condimentum quam vestibulum lacinia. Ut eu lobortis massa, venenatis sodales lacus. Nulla elementum magna et tortor efficitur, at volutpat metus varius.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_BULLET_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second bullet point in ROW notice expand.">
-        Duis tempor nulla nisi, ac bibendum lorem tempus sit amet. Proin non blandit risus. Maecenas facilisis enim nec tristique tristique. Eelementum ut venenatis ornare, consequat ac turpis. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_3" translateable="false" desc="Privacy Sandbox dialog notice ROW: Third section in body, below bullet points.">
-        Etiam hendrerit turpis nibh, ac maximus lectus placerat at. Vivamus ligula quam, posuere luctus felis eu, dictum egestas arcu. per conubia nostra, per inceptos himenaeos. Cras ut metus vel est molestie finibus nec ut orci.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_4" translateable="false" desc="Privacy Sandbox dialog notice ROW: Fourth section in body, immediately below third.">
-        Aliquam euismod scelerisque metus, in aliquet est vehicula ut. Curabitur sit amet ligula quis ante maximus gravida non id magna. Pellentesque interdum venenatis leo, at ultrices felis mollis nec. Integer vulputate velit eget mauris lacinia, ut ullamcorper mauris vehicula.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_3" translateable="false" desc="Privacy Sandbox dialog notice ROW: Third header inside learn more expand.">
-        Orci varius natoque penatibus et
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_5" translateable="false" desc="Privacy Sandbox dialog notice ROW: Fifth section in body below header 3.">
-        Suspendisse at dui pulvinar, rhoncus orci at, porttitor nibh. Curabitur lacinia nulla sem, eu euismod dolor vulputate quis. Duis mattis eros et arcu elementum tempor. Duis pharetra eleifend sagittis.
-      </message>
-      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_6" translateable="false" desc="Privacy Sandbox dialog notice ROW: Sixth section in body, immediately below fifth.">
-        Cras sed lacus suscipit, efficitur erat nec, semper sapien. Fusce at nunc molestie, elementum augue at, auctor nunc. Sed dui nisi, consectetur sit amet urna vitae, facilisis scelerisque justo.
-      </message>
-
       <!-- Privacy Sandbox v4 - Ad Privacy Page -->
       <message name="IDS_AD_PRIVACY_PAGE_TITLE" translateable="false" desc="Title for the Ad Privacy preferences page.">
         Privacy sandbox title
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index a3f960a..d814837a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -263,7 +263,7 @@
 <translation id="250020030759455918">Prikazano bo stanje prijave na spletnem mestu <ph name="SITE_NAME" />, podatki brskanja in podatki spletnega mesta v Chromu.</translation>
 <translation id="2510106555128151389">Nameščanje aplikacije <ph name="WEBAPK_NAME" /> …</translation>
 <translation id="2513403576141822879">Če vas zanima več nastavitev, povezanih z zasebnostjo, varnostjo in zbiranjem podatkov, si oglejte razdelek <ph name="BEGIN_LINK" />Sinhronizacija in Googlove storitve<ph name="END_LINK" /></translation>
-<translation id="2517472476991765520">Išči</translation>
+<translation id="2517472476991765520">Optično preberi</translation>
 <translation id="2523184218357549926">Googlu pošlje URL-je strani, ki jih obiščete</translation>
 <translation id="2527209463677295330">Če vključite več besedila na strani, bodo morda prikazani boljši rezultati.</translation>
 <translation id="2527497042232966453">Preklopljeno na anonimne zavihke</translation>
diff --git a/chrome/browser/ui/tabs/tab_group.cc b/chrome/browser/ui/tabs/tab_group.cc
index 1b4ce33..5798706a7 100644
--- a/chrome/browser/ui/tabs/tab_group.cc
+++ b/chrome/browser/ui/tabs/tab_group.cc
@@ -147,23 +147,22 @@
   std::vector<SavedTabGroupTab> tabs;
   const gfx::Range tab_range = ListTabs();
   const base::GUID saved_group_guid = base::GUID::GenerateRandomV4();
-  SavedTabGroup group(visual_data_->title(), visual_data_->color(), {},
-                      saved_group_guid, absl::nullopt, id_);
-
   for (auto i = tab_range.start(); i < tab_range.end(); ++i) {
     content::WebContents* web_contents = controller_->GetWebContentsAt(i);
     const GURL& url = web_contents->GetVisibleURL();
     const std::u16string& title = web_contents->GetTitle();
-    SavedTabGroupTab tab(url, title, saved_group_guid);
-    tab.SetFavicon(favicon::TabFaviconFromWebContents(web_contents));
-    group.AddTab(tab);
+    tabs.emplace_back(
+        SavedTabGroupTab(url, title, saved_group_guid)
+            .SetFavicon(favicon::TabFaviconFromWebContents(web_contents)));
   }
 
   SavedTabGroupKeyedService* backend =
       SavedTabGroupServiceFactory::GetForProfile(controller_->GetProfile());
   if (!backend || !backend->model())
     return;
-  backend->model()->Add(std::move(group));
+  SavedTabGroup saved_tab_group(visual_data_->title(), visual_data_->color(),
+                                tabs, saved_group_guid, absl::nullopt, id_);
+  backend->model()->Add(saved_tab_group);
 }
 
 void TabGroup::UnsaveGroup() {
diff --git a/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc b/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
index 16c16ad..0173504 100644
--- a/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
@@ -534,12 +534,8 @@
 }
 
 views::View* PaymentRequestSheetController::GetFirstFocusedView() {
-  if (primary_button_ && primary_button_->GetEnabled())
-    return primary_button_;
-
-  if (secondary_button_)
-    return secondary_button_;
-
+  // Do not focus either of the buttons, per guidelines in
+  // docs/security/security-considerations-for-browser-ui.md
   DCHECK(content_view_);
   return content_view_;
 }
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
index a7e0ae7..a13d6ad0 100644
--- a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
@@ -19,19 +19,56 @@
 
 namespace payments {
 
+using PaymentSheetViewControllerTest = PaymentRequestBrowserTestBase;
+
+// The 'Continue' or 'Cancel' buttons should not be auto-focused; see
+// https://crbug.com/1403539
+IN_PROC_BROWSER_TEST_F(PaymentSheetViewControllerTest,
+                       ContinueIsNotAutoFocused) {
+  // Installs two apps so that the Payment Request UI will be shown.
+  std::string a_method_name;
+  InstallPaymentApp("a.com", "/payment_request_success_responder.js",
+                    &a_method_name);
+  std::string b_method_name;
+  InstallPaymentApp("b.com", "/payment_request_success_responder.js",
+                    &b_method_name);
+
+  NavigateTo("/payment_request_no_shipping_test.html");
+  InvokePaymentRequestUIWithJs(content::JsReplace(
+      "buyWithMethods([{supportedMethods:$1}, {supportedMethods:$2}]);",
+      a_method_name, b_method_name));
+
+  EXPECT_TRUE(IsViewVisible(DialogViewID::PAY_BUTTON));
+  EXPECT_TRUE(IsViewVisible(DialogViewID::CANCEL_BUTTON));
+  EXPECT_TRUE(IsPayButtonEnabled());
+
+  // Neither of the actionable buttons should receive default focus.
+  EXPECT_FALSE(dialog_view()
+                   ->GetViewByID(static_cast<int>(DialogViewID::PAY_BUTTON))
+                   ->HasFocus());
+  EXPECT_FALSE(dialog_view()
+                   ->GetViewByID(static_cast<int>(DialogViewID::CANCEL_BUTTON))
+                   ->HasFocus());
+}
+
 using PaymentSheetViewControllerNoShippingTest = PaymentRequestBrowserTestBase;
 
 // If shipping and contact info are not requested, their rows should not be
 // present.
 IN_PROC_BROWSER_TEST_F(PaymentSheetViewControllerNoShippingTest,
                        NoShippingNoContactRows) {
-  std::string payment_method_name;
+  // Installs two apps so that the Payment Request UI will be shown.
+  std::string a_method_name;
   InstallPaymentApp("a.com", "/payment_request_success_responder.js",
-                    &payment_method_name);
+                    &a_method_name);
+  std::string b_method_name;
+  InstallPaymentApp("b.com", "/payment_request_success_responder.js",
+                    &b_method_name);
 
   NavigateTo("/payment_request_no_shipping_test.html");
-  InvokePaymentRequestUIWithJs("buyWithMethods([{supportedMethods:'" +
-                               payment_method_name + "'}]);");
+  InvokePaymentRequestUIWithJs(content::JsReplace(
+      "buyWithMethods([{supportedMethods:$1}, {supportedMethods:$2}]);",
+      a_method_name, b_method_name));
 
   EXPECT_NE(nullptr, dialog_view()->GetViewByID(static_cast<int>(
                          DialogViewID::PAYMENT_SHEET_SUMMARY_SECTION)));
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
index e93358b8..a991ce6 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -30,6 +30,7 @@
 constexpr int kM1DialogWidth = 600;
 constexpr int kDefaultConsentDialogHeight = 569;
 constexpr int kDefaultNoticeDialogHeight = 494;
+constexpr int kMinDialogHeight = 300;
 
 GURL GetDialogURL(PrivacySandboxService::PromptType prompt_type) {
   GURL base_url = GURL(chrome::kChromeUIPrivacySandboxDialogURL);
@@ -164,12 +165,14 @@
 }
 
 void PrivacySandboxDialogView::ResizeNativeView(int height) {
-  int max_height = browser_->window()
-                       ->GetWebContentsModalDialogHost()
-                       ->GetMaximumDialogSize()
-                       .height();
-  web_view_->SetPreferredSize(gfx::Size(web_view_->GetPreferredSize().width(),
-                                        std::min(height, max_height)));
+  const int max_height = browser_->window()
+                             ->GetWebContentsModalDialogHost()
+                             ->GetMaximumDialogSize()
+                             .height();
+  const int target_height = std::min(height, max_height);
+  web_view_->SetPreferredSize(
+      gfx::Size(web_view_->GetPreferredSize().width(),
+                std::max(kMinDialogHeight, target_height)));
   GetWidget()->SetSize(GetWidget()->non_client_view()->GetPreferredSize());
 }
 
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index 90ba137..44dc25f 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -198,7 +198,9 @@
   source->AddBoolean(
       "modulesDragAndDropEnabled",
       base::FeatureList::IsEnabled(ntp_features::kNtpModulesDragAndDrop));
-  source->AddBoolean("modulesFirstRunExperienceEnabled", IsModuleFreEnabled());
+  source->AddBoolean("modulesFirstRunExperienceEnabled",
+                     base::FeatureList::IsEnabled(
+                         ntp_features::kNtpModulesFirstRunExperience));
   source->AddBoolean("modulesLoadEnabled", base::FeatureList::IsEnabled(
                                                ntp_features::kNtpModulesLoad));
   source->AddInteger("modulesLoadTimeout",
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index a4aba00..112d21ef 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -2039,12 +2039,16 @@
        IDS_SETTINGS_FLEDGE_PAGE_CURRENT_SITES_DESCRIPTION_DISABLED},
       {"fledgePageCurrentSitesDescriptionEmpty",
        IDS_SETTINGS_FLEDGE_PAGE_CURRENT_SITES_DESCRIPTION_EMPTY},
+      {"fledgePageSeeAllSitesLabel",
+       IDS_SETTINGS_FLEDGE_PAGE_SEE_ALL_SITES_LABEL},
+      {"fledgePageBlockSite", IDS_SETTINGS_FLEDGE_PAGE_BLOCK_SITE},
       {"fledgePageBlockedSitesHeading",
        IDS_SETTINGS_FLEDGE_PAGE_BLOCKED_SITES_HEADING},
       {"fledgePageBlockedSitesDescription",
        IDS_SETTINGS_FLEDGE_PAGE_BLOCKED_SITES_DESCRIPTION},
       {"fledgePageBlockedSitesDescriptionEmpty",
        IDS_SETTINGS_FLEDGE_PAGE_BLOCKED_SITES_DESCRIPTION_EMPTY},
+      {"fledgePageAllowSite", IDS_SETTINGS_FLEDGE_PAGE_ALLOW_SITE},
       {"fledgePageLearnMoreHeading",
        IDS_SETTINGS_FLEDGE_PAGE_LEARN_MORE_HEADING},
       {"fledgePageLearnMoreBullet1",
@@ -3177,6 +3181,12 @@
      IDS_SETTINGS_SITE_SETTINGS_IDLE_DETECTION_BLOCK},
     {"siteSettingsExtensionIdDescription",
      IDS_SETTINGS_SITE_SETTINGS_EXTENSION_ID_DESCRIPTION},
+    {"siteSettingsSiteDataAllowedSubLabel",
+     IDS_SETTINGS_SITE_SETTINGS_SITE_DATA_ALLOWED_SUB_LABEL},
+    {"siteSettingsSiteDataBlockedSubLabel",
+     IDS_SETTINGS_SITE_SETTINGS_SITE_DATA_BLOCKED_SUB_LABEL},
+    {"siteSettingsSiteDataClearOnExitSubLabel",
+     IDS_SETTINGS_SITE_SETTINGS_SITE_DATA_CLEAR_ON_EXIT_SUB_LABEL},
   };
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
index 59281f5..b111f220 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/containers/enum_set.h"
 #include "base/json/json_writer.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -30,10 +31,13 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/signin_resources.h"
+#include "components/prefs/pref_service.h"
 #include "components/signin/public/base/avatar_icon_util.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/sync/base/sync_prefs.h"
+#include "components/sync/base/user_selectable_type.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
@@ -48,31 +52,64 @@
 namespace {
 const char kSyncBenefitAutofillStringName[] = "syncConfirmationAutofill";
 const char kSyncBenefitBookmarksStringName[] = "syncConfirmationBookmarks";
+const char kSyncBenefitReadingListStringName[] = "syncConfirmationReadingList";
 const char kSyncBenefitExtensionsStringName[] = "syncConfirmationExtensions";
 const char kSyncBenefitHistoryAndMoreStringName[] =
     "syncConfirmationHistoryAndMore";
 const char kSyncBenefitIconNameKey[] = "iconName";
 const char kSyncBenefitTitleKey[] = "title";
 
-std::string GetSyncBenefitsListJSON() {
+bool IsAnyTypeSyncable(PrefService& pref_service,
+                       syncer::UserSelectableTypeSet types) {
+  for (auto type : types) {
+    const char* pref_name = syncer::SyncPrefs::GetPrefNameForType(type);
+    if (!pref_service.IsManagedPreference(pref_name)) {
+      return true;
+    }
+  }
+  return false;
+}
+}  // namespace
+
+// static
+std::string SyncConfirmationUI::GetSyncBenefitsListJSON(
+    PrefService& pref_service) {
+  using syncer::UserSelectableType;
   base::Value::List sync_benefits_list;
 
-  // TODO(crbug.com/1383163): Select available types from SyncTypesListDisabled.
-  base::Value::Dict bookmarks;
-  bookmarks.Set(kSyncBenefitTitleKey, kSyncBenefitBookmarksStringName);
-  bookmarks.Set(kSyncBenefitIconNameKey, "signin:star-outline");
-  sync_benefits_list.Append(std::move(bookmarks));
+  if (IsAnyTypeSyncable(pref_service, {UserSelectableType::kBookmarks,
+                                       UserSelectableType::kReadingList})) {
+    std::string titleKey;
+    if (IsAnyTypeSyncable(pref_service, {UserSelectableType::kBookmarks})) {
+      titleKey = kSyncBenefitBookmarksStringName;
+    } else {
+      titleKey = kSyncBenefitReadingListStringName;
+    }
 
-  base::Value::Dict autofill;
-  autofill.Set(kSyncBenefitTitleKey, kSyncBenefitAutofillStringName);
-  autofill.Set(kSyncBenefitIconNameKey, "signin:assignment-outline");
-  sync_benefits_list.Append(std::move(autofill));
+    base::Value::Dict bookmarks;
+    bookmarks.Set(kSyncBenefitTitleKey, titleKey);
+    bookmarks.Set(kSyncBenefitIconNameKey, "signin:star-outline");
+    sync_benefits_list.Append(std::move(bookmarks));
+  }
 
-  base::Value::Dict extensions;
-  extensions.Set(kSyncBenefitTitleKey, kSyncBenefitExtensionsStringName);
-  extensions.Set(kSyncBenefitIconNameKey, "signin:extension-outline");
-  sync_benefits_list.Append(std::move(extensions));
+  if (IsAnyTypeSyncable(pref_service, {UserSelectableType::kAutofill,
+                                       UserSelectableType::kPasswords})) {
+    base::Value::Dict autofill;
+    autofill.Set(kSyncBenefitTitleKey, kSyncBenefitAutofillStringName);
+    autofill.Set(kSyncBenefitIconNameKey, "signin:assignment-outline");
+    sync_benefits_list.Append(std::move(autofill));
+  }
 
+  if (IsAnyTypeSyncable(pref_service, {UserSelectableType::kExtensions,
+                                       UserSelectableType::kApps})) {
+    base::Value::Dict extensions;
+    extensions.Set(kSyncBenefitTitleKey, kSyncBenefitExtensionsStringName);
+    extensions.Set(kSyncBenefitIconNameKey, "signin:extension-outline");
+    sync_benefits_list.Append(std::move(extensions));
+  }
+
+  // Even if no associated type is syncable, we still deliberately show "History
+  // and more". So no need to check it.
   base::Value::Dict history_and_more;
   history_and_more.Set(kSyncBenefitTitleKey,
                        kSyncBenefitHistoryAndMoreStringName);
@@ -83,7 +120,6 @@
   base::JSONWriter::Write(sync_benefits_list, &json_benefits_list);
   return json_benefits_list;
 }
-}  // namespace
 
 SyncConfirmationUI::SyncConfirmationUI(content::WebUI* web_ui)
     : SigninWebDialogUI(web_ui), profile_(Profile::FromWebUI(web_ui)) {
@@ -174,7 +210,8 @@
   source->AddString("accountPictureUrl",
                     profiles::GetPlaceholderAvatarIconUrl());
 
-  source->AddString("syncBenefitsList", GetSyncBenefitsListJSON());
+  source->AddString("syncBenefitsList",
+                    GetSyncBenefitsListJSON(*profile_->GetPrefs()));
 
   // Default overrides without placeholders
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -265,6 +302,8 @@
                     IDS_SYNC_CONFIRMATION_SETTINGS_INFO);
   AddStringResource(source, kSyncBenefitBookmarksStringName,
                     IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_BOOKMARKS);
+  AddStringResource(source, kSyncBenefitReadingListStringName,
+                    IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_READING_LIST);
   AddStringResource(source, kSyncBenefitAutofillStringName,
                     IDS_SYNC_CONFIRMATION_TANGIBLE_SYNC_AUTOFILL);
   AddStringResource(source, kSyncBenefitExtensionsStringName,
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.h b/chrome/browser/ui/webui/signin/sync_confirmation_ui.h
index 3410d70..da8a12f 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.h
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.h
@@ -11,10 +11,11 @@
 
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/ui/webui/signin/signin_web_dialog_ui.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "components/sync/base/user_selectable_type.h"
 
 class Browser;
 class Profile;
+class PrefService;
 
 namespace content {
 class WebUIDataSource;
@@ -32,6 +33,13 @@
 // the responsability of the caller to pass the correct message handler.
 class SyncConfirmationUI : public SigninWebDialogUI {
  public:
+  // Exposed for testing
+  // Returns JSON data representing sync benefits that should be presented to
+  // the user, based on which `syncer::UserSelectableType`s are available.
+  // The data format is:
+  // `[{"iconName": "${iron_icon_id}", "title": "${grit_string_id}"}, ...]`
+  static std::string GetSyncBenefitsListJSON(PrefService& pref_service);
+
   explicit SyncConfirmationUI(content::WebUI* web_ui);
 
   SyncConfirmationUI(const SyncConfirmationUI&) = delete;
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui_unittest.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui_unittest.cc
new file mode 100644
index 0000000..d671a66
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui_unittest.cc
@@ -0,0 +1,98 @@
+// 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 "chrome/browser/ui/webui/signin/sync_confirmation_ui.h"
+
+#include "components/sync/base/sync_prefs.h"
+#include "components/sync/base/user_selectable_type.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using syncer::UserSelectableType;
+using syncer::UserSelectableTypeSet;
+using testing::HasSubstr;
+using testing::Not;
+using testing::ValuesIn;
+
+struct TestParam {
+  // Syncable data types to disable, simulating effects of policies.
+  const UserSelectableTypeSet disabled_types;
+
+  // Strings expected to be found in the sync benefits JSON data.
+  const std::vector<std::string> expected_benefit_substr;
+
+  // Strings NOT expected to be found in the sync benefits JSON data.
+  const std::vector<std::string> unexpected_benefit_keys;
+};
+
+UserSelectableTypeSet AllUserSelectableTypesExcept(
+    UserSelectableTypeSet excluded_types) {
+  UserSelectableTypeSet selection = UserSelectableTypeSet::All();
+  selection.RemoveAll(excluded_types);
+  return selection;
+}
+
+const TestParam kGetSyncBenefitsListJSONParams[] = {
+    // 0: Default.
+    {.disabled_types = {},
+     .expected_benefit_substr = {"syncConfirmationAutofill",
+                                 "syncConfirmationBookmarks",
+                                 "syncConfirmationExtensions",
+                                 "syncConfirmationHistoryAndMore"},
+     .unexpected_benefit_keys = {"syncConfirmationReadingList"}},
+
+    // 1: Disabling certain types does not affect the benefits list.
+    {.disabled_types = AllUserSelectableTypesExcept(
+         {UserSelectableType::kBookmarks, UserSelectableType::kApps,
+          UserSelectableType::kPasswords}),
+     .expected_benefit_substr = {"syncConfirmationAutofill",
+                                 "syncConfirmationBookmarks",
+                                 "syncConfirmationExtensions",
+                                 "syncConfirmationHistoryAndMore"},
+     .unexpected_benefit_keys = {"syncConfirmationReadingList"}},
+
+    // 2: "Reading List" instead of "Bookmarks", no "Autofill" nor "Extensions"
+    {.disabled_types = {UserSelectableType::kBookmarks,
+                        UserSelectableType::kAutofill,
+                        UserSelectableType::kPasswords,
+                        UserSelectableType::kApps,
+                        UserSelectableType::kExtensions},
+     .expected_benefit_substr = {"syncConfirmationReadingList",
+                                 "syncConfirmationHistoryAndMore"},
+     .unexpected_benefit_keys = {"syncConfirmationBookmarks",
+                                 "syncConfirmationAutofill",
+                                 "syncConfirmationExtensions"}},
+};
+
+void DisableTypes(sync_preferences::TestingPrefServiceSyncable& pref_service,
+                  syncer::UserSelectableTypeSet types) {
+  for (auto type : types) {
+    std::string path = syncer::SyncPrefs::GetPrefNameForType(type);
+    pref_service.SetManagedPref(path, base::Value(false));
+  }
+}
+
+class SyncConfirmationUITest : public testing::TestWithParam<TestParam> {};
+
+TEST_P(SyncConfirmationUITest, GetSyncBenefitsListJSON) {
+  auto pref_service =
+      std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
+  syncer::SyncPrefs::RegisterProfilePrefs(pref_service->registry());
+
+  DisableTypes(*pref_service.get(), GetParam().disabled_types);
+
+  std::string benefits_json =
+      SyncConfirmationUI::GetSyncBenefitsListJSON(*pref_service.get());
+  for (auto expected_key : GetParam().expected_benefit_substr) {
+    EXPECT_THAT(benefits_json, HasSubstr(expected_key));
+  }
+  for (auto unexpected_key : GetParam().unexpected_benefit_keys) {
+    EXPECT_THAT(benefits_json, Not(HasSubstr(unexpected_key)));
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(,
+                         SyncConfirmationUITest,
+                         ValuesIn(kGetSyncBenefitsListJSONParams));
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 79e0ac16..f6355be 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1672790328-d0f218a0dbfdd315a7c4768d830d648a50b0b16c.profdata
+chrome-linux-main-1672833352-8ffd8a72c886fd5dc4fa716a74a07de7d87afb14.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 717da84..f4777c7 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1672811657-c57826f8793da42014c144341f2b40e11c956a5b.profdata
+chrome-mac-arm-main-1672833352-3ff05ad1a9e4d404b451f7184ed215cc8c25ed39.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 7518663c..5ccd362 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1672790328-242ff39a3d24b4789e5db398b7c35acf54533a57.profdata
+chrome-mac-main-1672833352-5a8f92de3662c520849bf29cbf692d6688c5a31d.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 4906c08..abbddffe 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1672801140-3b5d5298b1072bc9ce893820996409e1da8daf42.profdata
+chrome-win32-main-1672833352-6dce63852996e347156649eb006e96a06a2d6d7f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 5fa9ad041..fa881ed21 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1672801140-ff6b40af5d8b7c3e4fd9cbf4a516c16516598ef7.profdata
+chrome-win64-main-1672833352-9a9470a265da7852eb169beea183cb24b6215c90.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 37527c34..689d934 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -5380,6 +5380,7 @@
     "../browser/idle/idle_detection_permission_context_unittest.cc",
     "../browser/internal_auth_unittest.cc",
     "../browser/k_anonymity_service/k_anonymity_service_client_unittest.cc",
+    "../browser/k_anonymity_service/k_anonymity_service_storage_unittest.cc",
     "../browser/k_anonymity_service/k_anonymity_trust_token_getter_unittest.cc",
     "../browser/k_anonymity_service/remote_trust_token_query_answerer_unittest.cc",
     "../browser/language/language_model_manager_factory_unittest.cc",
@@ -7021,6 +7022,7 @@
       "../browser/ui/webui/signin/profile_picker_handler_unittest.cc",
       "../browser/ui/webui/signin/signin_url_utils_unittest.cc",
       "../browser/ui/webui/signin/sync_confirmation_handler_unittest.cc",
+      "../browser/ui/webui/signin/sync_confirmation_ui_unittest.cc",
       "../browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc",
       "../browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc",
       "../browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc",
diff --git a/chrome/test/base/chrome_render_view_test.cc b/chrome/test/base/chrome_render_view_test.cc
index 3d743c0a..d879cf7 100644
--- a/chrome/test/base/chrome_render_view_test.cc
+++ b/chrome/test/base/chrome_render_view_test.cc
@@ -38,7 +38,6 @@
 #endif
 
 using autofill::AutofillAgent;
-using autofill::AutofillAssistantAgent;
 using autofill::PasswordAutofillAgent;
 using autofill::PasswordGenerationAgent;
 using blink::WebFrame;
diff --git a/chrome/test/base/chrome_render_view_test.h b/chrome/test/base/chrome_render_view_test.h
index 2d2e8273..4b39d74 100644
--- a/chrome/test/base/chrome_render_view_test.h
+++ b/chrome/test/base/chrome_render_view_test.h
@@ -18,7 +18,6 @@
 class AutofillAgent;
 class TestPasswordAutofillAgent;
 class PasswordGenerationAgent;
-class AutofillAssistantAgent;
 }  // namespace autofill
 
 // This test fixture emulates a single RenderView within the main test process.
@@ -51,7 +50,6 @@
   raw_ptr<autofill::TestPasswordAutofillAgent> password_autofill_agent_ =
       nullptr;
   raw_ptr<autofill::PasswordGenerationAgent> password_generation_ = nullptr;
-  raw_ptr<autofill::AutofillAssistantAgent> autofill_assistant_agent_ = nullptr;
   raw_ptr<autofill::AutofillAgent> autofill_agent_ = nullptr;
 
   std::unique_ptr<service_manager::BinderRegistry> registry_;
diff --git a/chrome/test/data/webui/access_code_cast/BUILD.gn b/chrome/test/data/webui/access_code_cast/BUILD.gn
index 4585c78..d98b500b 100644
--- a/chrome/test/data/webui/access_code_cast/BUILD.gn
+++ b/chrome/test/data/webui/access_code_cast/BUILD.gn
@@ -2,41 +2,22 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../build_webui_tests.gni")
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  tsconfig_base = "tsconfig_base.json"
-  path_mappings = [
-    "chrome://access-code-cast/*|" +
-        rebase_path(
-            "$root_gen_dir/chrome/browser/resources/access_code_cast/tsc/*",
-            target_gen_dir),
-    "chrome://webui-test/*|" +
-        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                    target_gen_dir),
-  ]
-  in_files = [
+build_webui_tests("build") {
+  resource_path_prefix = "access_code_cast"
+  files = [
     "access_code_cast_app_test.ts",
     "browser_proxy_test.ts",
     "error_message_test.ts",
     "passcode_input_test.ts",
     "test_access_code_cast_browser_proxy.ts",
   ]
-  deps = [
-    "..:build_ts",
-    "//chrome/browser/resources/access_code_cast:build_ts",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "webui_access_code_cast"
-  out_grd = "$target_gen_dir/resources.grdp"
-
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "access_code_cast"
+  ts_path_mappings =
+      [ "chrome://access-code-cast/*|" +
+        rebase_path(
+            "$root_gen_dir/chrome/browser/resources/access_code_cast/tsc/*",
+            target_gen_dir) ]
+  ts_deps = [ "//chrome/browser/resources/access_code_cast:build_ts" ]
 }
diff --git a/chrome/test/data/webui/app_home/BUILD.gn b/chrome/test/data/webui/app_home/BUILD.gn
index 1e41502..76417ad 100644
--- a/chrome/test/data/webui/app_home/BUILD.gn
+++ b/chrome/test/data/webui/app_home/BUILD.gn
@@ -2,40 +2,22 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../build_webui_tests.gni")
 
 assert(is_win || is_mac || is_linux || is_fuchsia)
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  tsconfig_base = "tsconfig_base.json"
-  path_mappings = [
-    "chrome://apps/*|" +
-        rebase_path("$root_gen_dir/chrome/browser/resources/app_home/tsc/*",
-                    target_gen_dir),
-    "chrome://webui-test/*|" +
-        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                    target_gen_dir),
-  ]
-  in_files = [
+build_webui_tests("build") {
+  resource_path_prefix = "app_home"
+
+  files = [
     "app_list_test.ts",
     "test_app_home_browser_proxy.ts",
   ]
-  definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
-  deps = [
-    "..:build_ts",
-    "//chrome/browser/resources/app_home:build_ts",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "webui_app_home"
-  out_grd = "$target_gen_dir/resources.grdp"
-
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "app_home"
+  ts_path_mappings =
+      [ "chrome://apps/*|" +
+        rebase_path("$root_gen_dir/chrome/browser/resources/app_home/tsc/*",
+                    target_gen_dir) ]
+  ts_deps = [ "//chrome/browser/resources/app_home:build_ts" ]
+  ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 }
diff --git a/chrome/test/data/webui/app_settings/BUILD.gn b/chrome/test/data/webui/app_settings/BUILD.gn
index 4c640e86..6312125 100644
--- a/chrome/test/data/webui/app_settings/BUILD.gn
+++ b/chrome/test/data/webui/app_settings/BUILD.gn
@@ -2,40 +2,22 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../build_webui_tests.gni")
 
 assert(is_win || is_mac || is_linux || is_fuchsia)
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  tsconfig_base = "tsconfig_base.json"
-  path_mappings = [
-    "chrome://app-settings/*|" +
-        rebase_path("$root_gen_dir/chrome/browser/resources/app_settings/tsc/*",
-                    target_gen_dir),
-    "chrome://webui-test/*|" +
-        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                    target_gen_dir),
-  ]
-  in_files = [
+build_webui_tests("build") {
+  resource_path_prefix = "app_settings"
+
+  files = [
     "app_test.ts",
     "test_app_management_browser_proxy.ts",
   ]
-  definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
-  deps = [
-    "..:build_ts",
-    "//chrome/browser/resources/app_settings:build_ts",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "webui_app_settings"
-  out_grd = "$target_gen_dir/resources.grdp"
-
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "app_settings"
+  ts_path_mappings =
+      [ "chrome://app-settings/*|" +
+        rebase_path("$root_gen_dir/chrome/browser/resources/app_settings/tsc/*",
+                    target_gen_dir) ]
+  ts_deps = [ "//chrome/browser/resources/app_settings:build_ts" ]
+  ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 }
diff --git a/chrome/test/data/webui/bookmarks/BUILD.gn b/chrome/test/data/webui/bookmarks/BUILD.gn
index 7bfcf50..9691803 100644
--- a/chrome/test/data/webui/bookmarks/BUILD.gn
+++ b/chrome/test/data/webui/bookmarks/BUILD.gn
@@ -2,22 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../build_webui_tests.gni")
 
-ts_library("build_ts") {
-  root_dir = "./"
-  out_dir = "$target_gen_dir/tsc"
-  tsconfig_base = "tsconfig_base.json"
-  path_mappings = [
-    "chrome://bookmarks/bookmarks.js|" + rebase_path(
-            "$root_gen_dir/chrome/browser/resources/bookmarks/tsc/bookmarks.d.ts",
-            target_gen_dir),
-    "chrome://webui-test/*|" +
-        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                    target_gen_dir),
-  ]
-  in_files = [
+build_webui_tests("build") {
+  resource_path_prefix = "bookmarks"
+
+  files = [
     "actions_test.ts",
     "app_test.js",
     "bookmarks_focus_test.js",
@@ -45,25 +35,16 @@
     "toolbar_test.ts",
     "util_test.ts",
   ]
-  deps = [
-    "//chrome/browser/resources/bookmarks:build_ts",
-    "//chrome/test/data/webui:build_ts",
-  ]
-  definitions = [
+
+  ts_path_mappings = [ "chrome://bookmarks/bookmarks.js|" + rebase_path(
+                           "$root_gen_dir/chrome/browser/resources/bookmarks/tsc/bookmarks.d.ts",
+                           target_gen_dir) ]
+  ts_definitions = [
     "//tools/typescript/definitions/bookmarks.d.ts",
     "//tools/typescript/definitions/bookmark_manager_private.d.ts",
     "//tools/typescript/definitions/chrome_event.d.ts",
     "//tools/typescript/definitions/runtime.d.ts",
     "//tools/typescript/definitions/tabs.d.ts",
   ]
-}
-
-generate_grd("build_grdp") {
-  grd_prefix = "webui_bookmarks"
-  out_grd = "$target_gen_dir/resources.grdp"
-
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "bookmarks"
+  ts_deps = [ "//chrome/browser/resources/bookmarks:build_ts" ]
 }
diff --git a/chrome/test/data/webui/commander/BUILD.gn b/chrome/test/data/webui/commander/BUILD.gn
index 38e132e..4505dd723 100644
--- a/chrome/test/data/webui/commander/BUILD.gn
+++ b/chrome/test/data/webui/commander/BUILD.gn
@@ -2,37 +2,19 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../build_webui_tests.gni")
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  tsconfig_base = "../tsconfig_base.json"
-  path_mappings = [
-    "chrome://commander/*|" +
-        rebase_path("$root_gen_dir/chrome/browser/resources/commander/tsc/*",
-                    target_gen_dir),
-    "chrome://webui-test/*|" +
-        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                    target_gen_dir),
-  ]
-  in_files = [
+build_webui_tests("build") {
+  resource_path_prefix = "commander"
+
+  files = [
     "commander_app_test.ts",
     "test_commander_browser_proxy.ts",
   ]
-  deps = [
-    "..:build_ts",
-    "//chrome/browser/resources/commander:build_ts",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "webui_commander"
-  out_grd = "$target_gen_dir/resources.grdp"
-
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "commander"
+  ts_path_mappings =
+      [ "chrome://commander/*|" +
+        rebase_path("$root_gen_dir/chrome/browser/resources/commander/tsc/*",
+                    target_gen_dir) ]
+  ts_deps = [ "//chrome/browser/resources/commander:build_ts" ]
 }
diff --git a/chrome/test/data/webui/commander/tsconfig_base.json b/chrome/test/data/webui/commander/tsconfig_base.json
new file mode 100644
index 0000000..3fcdeaee
--- /dev/null
+++ b/chrome/test/data/webui/commander/tsconfig_base.json
@@ -0,0 +1,9 @@
+{
+  "extends": "../../../../../tools/typescript/tsconfig_base.json",
+  "compilerOptions": {
+    "typeRoots": [
+       "./../../../../../third_party/node/node_modules/@types"
+    ],
+    "types": ["mocha", "trusted-types"]
+  }
+}
diff --git a/chrome/test/data/webui/discards/BUILD.gn b/chrome/test/data/webui/discards/BUILD.gn
index d872dc5..0e62542 100644
--- a/chrome/test/data/webui/discards/BUILD.gn
+++ b/chrome/test/data/webui/discards/BUILD.gn
@@ -2,37 +2,18 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../build_webui_tests.gni")
 
 assert(!is_android)
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  tsconfig_base = "../tsconfig_base.json"
-  path_mappings = [
-    "chrome://discards/*|" +
-        rebase_path("$root_gen_dir/chrome/browser/resources/discards/tsc/*",
-                    target_gen_dir),
-    "chrome://webui-test/*|" +
-        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                    target_gen_dir),
-  ]
-  in_files = [ "discards_test.ts" ]
-
-  deps = [
-    "..:build_ts",
-    "//chrome/browser/resources/discards:build_ts",
-  ]
-}
-
-generate_grd("build_grdp") {
-  grd_prefix = "webui_discards"
-  out_grd = "$target_gen_dir/resources.grdp"
-
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
+build_webui_tests("build") {
   resource_path_prefix = "discards"
+
+  files = [ "discards_test.ts" ]
+
+  ts_path_mappings =
+      [ "chrome://discards/*|" +
+        rebase_path("$root_gen_dir/chrome/browser/resources/discards/tsc/*",
+                    target_gen_dir) ]
+  ts_deps = [ "//chrome/browser/resources/discards:build_ts" ]
 }
diff --git a/chrome/test/data/webui/discards/tsconfig_base.json b/chrome/test/data/webui/discards/tsconfig_base.json
new file mode 100644
index 0000000..6ec0e9db
--- /dev/null
+++ b/chrome/test/data/webui/discards/tsconfig_base.json
@@ -0,0 +1,10 @@
+{
+  "extends": "../../../../../tools/typescript/tsconfig_base.json",
+  "compilerOptions": {
+    "allowJs": true,
+    "typeRoots": [
+       "./../../../../../third_party/node/node_modules/@types"
+    ],
+    "types": ["mocha", "trusted-types"]
+  }
+}
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn
index 4088120..d6a44db 100644
--- a/chrome/test/data/webui/settings/BUILD.gn
+++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -61,6 +61,7 @@
     "prefs_test_cases.ts",
     "prefs_tests.ts",
     "pref_util_tests.ts",
+    "privacy_guide_fragments_test.ts",
     "privacy_guide_page_test.ts",
     "privacy_page_test.ts",
     "privacy_sandbox_page_test.ts",
diff --git a/chrome/test/data/webui/settings/OWNERS b/chrome/test/data/webui/settings/OWNERS
index 73f1a64f..5c39d34 100644
--- a/chrome/test/data/webui/settings/OWNERS
+++ b/chrome/test/data/webui/settings/OWNERS
@@ -8,6 +8,7 @@
 per-file metrics_reporting_tests.ts=sauski@google.com
 per-file personalization_options_test.ts=sauski@google.com
 per-file privacy_page_test.ts=sauski@google.com
+per-file privacy_guide_fragments_test.ts=rainhard@chromium.org,sauski@google.com
 per-file privacy_guide_page_test.ts=rainhard@chromium.org,sauski@google.com
 per-file recent_site_permissions_test.ts=sauski@google.com
 per-file review_notification_permissions_interactive_ui_test.ts=rainhard@chromium.org
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index f282663..6f324747c 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -642,85 +642,17 @@
 });
 
 TEST_F(
+    'CrSettingsPrivacySandboxPageTest', 'FledgeSubpageSeeAllSitesTests',
+    function() {
+      runMochaSuite('PrivacySandboxFledgeSubpageSeeAllSitesTests');
+    });
+
+TEST_F(
     'CrSettingsPrivacySandboxPageTest', 'AdMeasurementSubpageTests',
     function() {
       runMochaSuite('PrivacySandboxAdMeasurementSubpageTests');
     });
 
-var CrSettingsPrivacyGuidePageTest = class extends CrSettingsBrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://settings/test_loader.html?module=settings/privacy_guide_page_test.js';
-  }
-};
-
-TEST_F('CrSettingsPrivacyGuidePageTest', 'PrivacyGuidePageTests', function() {
-  runMochaSuite('PrivacyGuidePageTests');
-});
-
-TEST_F('CrSettingsPrivacyGuidePageTest', 'MsbbFragmentNavigations', function() {
-  runMochaSuite('MsbbFragmentNavigations');
-});
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'HistorySyncFragmentNavigations',
-    function() {
-      runMochaSuite('HistorySyncFragmentNavigations');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'SafeBrowsingFragmentNavigations',
-    function() {
-      runMochaSuite('SafeBrowsingFragmentNavigations');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'CookiesFragmentNavigations', function() {
-      runMochaSuite('CookiesFragmentNavigations');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'MsbbFragmentMetricsTests', function() {
-      runMochaSuite('MsbbFragmentMetricsTests');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'HistorySyncFragmentMetricsTests',
-    function() {
-      runMochaSuite('HistorySyncFragmentMetricsTests');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'SafeBrowsingFragmentMetricsTests',
-    function() {
-      runMochaSuite('SafeBrowsingFragmentMetricsTests');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'CookiesFragmentMetricsTests',
-    function() {
-      runMochaSuite('CookiesFragmentMetricsTests');
-    });
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest', 'HistorySyncFragmentTests', function() {
-      runMochaSuite('HistorySyncFragment');
-    });
-
-TEST_F('CrSettingsPrivacyGuidePageTest', 'CompletionFragmentTests', function() {
-  runMochaSuite('CompletionFragment');
-});
-
-TEST_F(
-    'CrSettingsPrivacyGuidePageTest',
-    'CompletionFragmentPrivacySandboxRestricted', function() {
-      runMochaSuite('CompletionFragmentPrivacySandboxRestricted');
-    });
-
-TEST_F('CrSettingsPrivacyGuidePageTest', 'PrivacyGuideDialogTests', function() {
-  runMochaSuite('PrivacyGuideDialog');
-});
-
 var CrSettingsCookiesPageTest = class extends CrSettingsBrowserTest {
   /** @override */
   get browsePreload() {
@@ -1058,7 +990,31 @@
      'AllSites_DisableFirstPartySets',
    ],
  ],
-
+ [
+   'PrivacyGuidePage',
+   'privacy_guide_page_test.js',
+   [
+     'PrivacyGuidePageTests',
+     'MsbbCardNavigations',
+     'HistorySyncCardNavigations',
+     'SafeBrowsingCardNavigations',
+     'CookiesCardNavigations',
+     'PrivacyGuideDialogTests',
+   ],
+ ],
+ [
+   'PrivacyGuideFragments',
+   'privacy_guide_fragments_test.js',
+   [
+     'WelcomeFragmentTests',
+     'MsbbFragmentTests',
+     'HistorySyncFragmentTests',
+     'SafeBrowsingFragmentTests',
+     'CookiesFragmentTests',
+     'CompletionFragmentTests',
+     'CompletionFragmentPrivacySandboxRestricted',
+   ],
+ ],
 ].forEach(test => registerTestSuites(...test));
 
 // TODO(crbug.com/1403969): SecurityPage_SafeBrowsing suite is flaky on Mac.
diff --git a/chrome/test/data/webui/settings/privacy_guide_fragments_test.ts b/chrome/test/data/webui/settings/privacy_guide_fragments_test.ts
new file mode 100644
index 0000000..d93e12f7
--- /dev/null
+++ b/chrome/test/data/webui/settings/privacy_guide_fragments_test.ts
@@ -0,0 +1,758 @@
+// 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.
+
+// clang-format off
+import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CookiePrimarySetting, PrivacyGuideCompletionFragmentElement, PrivacyGuideCookiesFragmentElement, PrivacyGuideHistorySyncFragmentElement, PrivacyGuideMsbbFragmentElement, PrivacyGuideSafeBrowsingFragmentElement, PrivacyGuideWelcomeFragmentElement, SafeBrowsingSetting, SettingsRadioGroupElement} from 'chrome://settings/lazy_load.js';
+import {CrSettingsPrefs, MetricsBrowserProxyImpl, PrivacyGuideInteractions, PrivacyGuideSettingsStates, Router, routes, SettingsPrefsElement, SyncBrowserProxyImpl, SyncPrefs, syncPrefsIndividualDataTypes} from 'chrome://settings/settings.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {eventToPromise, isChildVisible} from 'chrome://webui-test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
+
+import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
+import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js';
+
+// clang-format on
+
+/** Fire a sign in status change event and flush the UI. */
+function setSignInState(signedIn: boolean) {
+  const event = {
+    signedIn: signedIn,
+  };
+  webUIListenerCallback('update-sync-state', event);
+  flush();
+}
+
+suite('WelcomeFragmentTests', function() {
+  let fragment: PrivacyGuideWelcomeFragmentElement;
+
+  setup(function() {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-welcome-fragment');
+    document.body.appendChild(fragment);
+    return flushTasks();
+  });
+
+  teardown(function() {
+    fragment.remove();
+  });
+
+  test('nextNavigation', async function() {
+    const nextEventPromise = eventToPromise('start-button-click', fragment);
+
+    fragment.$.startButton.click();
+
+    // Ensure the event is sent.
+    return nextEventPromise;
+  });
+});
+
+suite('MsbbFragmentTests', function() {
+  let fragment: PrivacyGuideMsbbFragmentElement;
+  let settingsPrefs: SettingsPrefsElement;
+  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
+
+  suiteSetup(function() {
+    settingsPrefs = document.createElement('settings-prefs');
+    return CrSettingsPrefs.initialized;
+  });
+
+  setup(function() {
+    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
+    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-msbb-fragment');
+    fragment.prefs = settingsPrefs.prefs!;
+    document.body.appendChild(fragment);
+
+    return flushTasks();
+  });
+
+  async function assertMsbbMetrics({
+    msbbStartOn,
+    changeSetting,
+    expectedMetric,
+  }: {
+    msbbStartOn: boolean,
+    changeSetting: boolean,
+    expectedMetric: PrivacyGuideSettingsStates,
+  }) {
+    fragment.set(
+        'prefs.url_keyed_anonymized_data_collection.enabled.value',
+        msbbStartOn);
+
+    // The fragment is informed that it becomes visible by a receiving
+    // a view-enter-start event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-enter-start', {bubbles: true, composed: true}));
+
+    if (changeSetting) {
+      fragment.shadowRoot!.querySelector<HTMLElement>(
+                              '#urlCollectionToggle')!.click();
+      flush();
+      const actionResult =
+          await testMetricsBrowserProxy.whenCalled('recordAction');
+      assertEquals(
+          actionResult,
+          msbbStartOn ? 'Settings.PrivacyGuide.ChangeMSBBOff' :
+                        'Settings.PrivacyGuide.ChangeMSBBOn');
+    }
+
+    // The fragment is informed that it becomes invisible by
+    // receiving a view-enter-finish event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-exit-finish', {bubbles: true, composed: true}));
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideSettingsStatesHistogram');
+    assertEquals(result, expectedMetric);
+  }
+
+  test('msbbMetricsOnToOn', function() {
+    return assertMsbbMetrics({
+      msbbStartOn: true,
+      changeSetting: false,
+      expectedMetric: PrivacyGuideSettingsStates.MSBB_ON_TO_ON,
+    });
+  });
+
+  test('msbbMetricsOnToOff', function() {
+    return assertMsbbMetrics({
+      msbbStartOn: true,
+      changeSetting: true,
+      expectedMetric: PrivacyGuideSettingsStates.MSBB_ON_TO_OFF,
+    });
+  });
+
+  test('msbbMetricsOffToOn', function() {
+    return assertMsbbMetrics({
+      msbbStartOn: false,
+      changeSetting: true,
+      expectedMetric: PrivacyGuideSettingsStates.MSBB_OFF_TO_ON,
+    });
+  });
+
+  test('msbbMetricsOffToOff', function() {
+    return assertMsbbMetrics({
+      msbbStartOn: false,
+      changeSetting: false,
+      expectedMetric: PrivacyGuideSettingsStates.MSBB_OFF_TO_OFF,
+    });
+  });
+});
+
+suite('HistorySyncFragmentTests', function() {
+  let fragment: PrivacyGuideHistorySyncFragmentElement;
+  let syncBrowserProxy: TestSyncBrowserProxy;
+  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
+
+  setup(function() {
+    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
+    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
+    syncBrowserProxy = new TestSyncBrowserProxy();
+    syncBrowserProxy.testSyncStatus = null;
+    SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-history-sync-fragment');
+    document.body.appendChild(fragment);
+
+    return flushTasks();
+  });
+
+  async function assertHistorySyncMetrics({
+    historySyncStartOn,
+    changeSetting,
+    expectedMetric,
+  }: {
+    historySyncStartOn: boolean,
+    changeSetting: boolean,
+    expectedMetric: PrivacyGuideSettingsStates,
+  }) {
+    setSyncStatus({
+      syncAllDataTypes: historySyncStartOn,
+      typedUrlsSynced: historySyncStartOn,
+      passwordsSynced: historySyncStartOn,
+    });
+
+    if (changeSetting) {
+      fragment.shadowRoot!.querySelector<HTMLElement>(
+                              '#historyToggle')!.click();
+      flush();
+      const actionResult =
+          await testMetricsBrowserProxy.whenCalled('recordAction');
+      assertEquals(
+          actionResult,
+          historySyncStartOn ? 'Settings.PrivacyGuide.ChangeHistorySyncOff' :
+                               'Settings.PrivacyGuide.ChangeHistorySyncOn');
+    }
+
+    // The fragment is informed that it becomes invisible by
+    // receiving a view-enter-finish event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-exit-finish', {bubbles: true, composed: true}));
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideSettingsStatesHistogram');
+    assertEquals(result, expectedMetric);
+  }
+
+  function setSyncStatus({
+    syncAllDataTypes,
+    typedUrlsSynced,
+    passwordsSynced,
+  }: {
+    syncAllDataTypes: boolean,
+    typedUrlsSynced: boolean,
+    passwordsSynced: boolean,
+  }) {
+    if (syncAllDataTypes) {
+      assertTrue(typedUrlsSynced);
+      assertTrue(passwordsSynced);
+    }
+    const event: SyncPrefs = {} as unknown as SyncPrefs;
+    for (const datatype of syncPrefsIndividualDataTypes) {
+      (event as unknown as {[key: string]: boolean})[datatype] = true;
+    }
+    // Overwrite datatypes needed in tests.
+    event.syncAllDataTypes = syncAllDataTypes;
+    event.typedUrlsSynced = typedUrlsSynced;
+    event.passwordsSynced = passwordsSynced;
+    webUIListenerCallback('sync-prefs-changed', event);
+  }
+
+  async function assertSyncBrowserProxyCall({
+    syncAllDatatypesExpected,
+    typedUrlsSyncedExpected,
+  }: {
+    syncAllDatatypesExpected: boolean,
+    typedUrlsSyncedExpected: boolean,
+  }) {
+    const syncPrefs = await syncBrowserProxy.whenCalled('setSyncDatatypes');
+    assertEquals(syncAllDatatypesExpected, syncPrefs.syncAllDataTypes);
+    assertEquals(typedUrlsSyncedExpected, syncPrefs.typedUrlsSynced);
+    syncBrowserProxy.resetResolver('setSyncDatatypes');
+  }
+
+  test('historySyncMetricsOnToOn', function() {
+    return assertHistorySyncMetrics({
+      historySyncStartOn: true,
+      changeSetting: false,
+      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON,
+    });
+  });
+
+  test('historySyncMetricsOnToOff', function() {
+    return assertHistorySyncMetrics({
+      historySyncStartOn: true,
+      changeSetting: true,
+      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF,
+    });
+  });
+
+  test('historySyncMetricsOffToOn', function() {
+    return assertHistorySyncMetrics({
+      historySyncStartOn: false,
+      changeSetting: true,
+      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON,
+    });
+  });
+
+  test('historySyncMetricsOffToOff', function() {
+    return assertHistorySyncMetrics({
+      historySyncStartOn: false,
+      changeSetting: false,
+      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF,
+    });
+  });
+
+  test('syncAllOnDisableReenableHistorySync', async function() {
+    setSyncStatus({
+      syncAllDataTypes: true,
+      typedUrlsSynced: true,
+      passwordsSynced: true,
+    });
+    fragment.$.historyToggle.click();
+    await assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: false,
+    });
+
+    // Re-enabling history sync re-enables sync all if sync all was on before
+    // and if all sync datatypes are still enabled.
+    fragment.$.historyToggle.click();
+    return assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: true,
+      typedUrlsSyncedExpected: true,
+    });
+  });
+
+  test('syncAllOnDisableReenableHistorySyncOtherDatatypeOff', async function() {
+    setSyncStatus({
+      syncAllDataTypes: true,
+      typedUrlsSynced: true,
+      passwordsSynced: true,
+    });
+    fragment.$.historyToggle.click();
+    await assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: false,
+    });
+
+    // The user disables another datatype in a different tab.
+    setSyncStatus({
+      syncAllDataTypes: false,
+      typedUrlsSynced: false,
+      passwordsSynced: false,
+    });
+
+    // Re-enabling history sync in the privacy guide doesn't re-enable sync
+    // all.
+    fragment.$.historyToggle.click();
+    return assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: true,
+    });
+  });
+
+  test('syncAllOnDisableReenableHistorySyncWithNavigation', async function() {
+    setSyncStatus({
+      syncAllDataTypes: true,
+      typedUrlsSynced: true,
+      passwordsSynced: true,
+    });
+    fragment.$.historyToggle.click();
+    await assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: false,
+    });
+
+    // The user navigates to another card, then back to the history sync card.
+    Router.getInstance().navigateTo(
+        routes.PRIVACY_GUIDE,
+        /* opt_dynamicParameters */ new URLSearchParams('step=msbb'));
+    Router.getInstance().navigateTo(
+        routes.PRIVACY_GUIDE,
+        /* opt_dynamicParameters */ new URLSearchParams('step=historySync'));
+
+    // Re-enabling history sync in the privacy guide doesn't re-enable sync
+    // all.
+    fragment.$.historyToggle.click();
+    return assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: true,
+    });
+  });
+
+  test('syncAllOffDisableReenableHistorySync', async function() {
+    setSyncStatus({
+      syncAllDataTypes: false,
+      typedUrlsSynced: true,
+      passwordsSynced: true,
+    });
+    fragment.$.historyToggle.click();
+    await assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: false,
+    });
+
+    // Re-enabling history sync doesn't re-enable sync all if sync all wasn't on
+    // originally.
+    fragment.$.historyToggle.click();
+    return assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: true,
+    });
+  });
+
+  test('syncAllOffEnableHistorySync', function() {
+    setSyncStatus({
+      syncAllDataTypes: false,
+      typedUrlsSynced: false,
+      passwordsSynced: true,
+    });
+    fragment.$.historyToggle.click();
+    return assertSyncBrowserProxyCall({
+      syncAllDatatypesExpected: false,
+      typedUrlsSyncedExpected: true,
+    });
+  });
+});
+
+suite('SafeBrowsingFragmentTests', function() {
+  let fragment: PrivacyGuideSafeBrowsingFragmentElement;
+  let settingsPrefs: SettingsPrefsElement;
+  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
+
+  suiteSetup(function() {
+    settingsPrefs = document.createElement('settings-prefs');
+    return CrSettingsPrefs.initialized;
+  });
+
+  setup(function() {
+    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
+    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-safe-browsing-fragment');
+    fragment.prefs = settingsPrefs.prefs!;
+    document.body.appendChild(fragment);
+
+    return flushTasks();
+  });
+
+  async function assertSafeBrowsingMetrics({
+    safeBrowsingStartsEnhanced,
+    changeSetting,
+    expectedMetric,
+  }: {
+    safeBrowsingStartsEnhanced: boolean,
+    changeSetting: boolean,
+    expectedMetric: PrivacyGuideSettingsStates,
+  }) {
+    const safeBrowsingStartState = safeBrowsingStartsEnhanced ?
+        SafeBrowsingSetting.ENHANCED :
+        SafeBrowsingSetting.STANDARD;
+    fragment.set('prefs.generated.safe_browsing.value', safeBrowsingStartState);
+
+    // The fragment is informed that it becomes visible by a receiving
+    // a view-enter-start event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-enter-start', {bubbles: true, composed: true}));
+
+    if (changeSetting) {
+      fragment.shadowRoot!
+          .querySelector<HTMLElement>(
+              safeBrowsingStartsEnhanced ?
+                  '#safeBrowsingRadioStandard' :
+                  '#safeBrowsingRadioEnhanced')!.click();
+      flush();
+      const actionResult =
+          await testMetricsBrowserProxy.whenCalled('recordAction');
+      assertEquals(
+          actionResult,
+          safeBrowsingStartsEnhanced ?
+              'Settings.PrivacyGuide.ChangeSafeBrowsingStandard' :
+              'Settings.PrivacyGuide.ChangeSafeBrowsingEnhanced');
+    }
+
+    // The fragment is informed that it becomes invisible by
+    // receiving a view-enter-finish event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-exit-finish', {bubbles: true, composed: true}));
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideSettingsStatesHistogram');
+    assertEquals(result, expectedMetric);
+  }
+
+  test('safeBrowsingMetricsEnhancedToStandard', function() {
+    return assertSafeBrowsingMetrics({
+      safeBrowsingStartsEnhanced: true,
+      changeSetting: true,
+      expectedMetric:
+          PrivacyGuideSettingsStates.SAFE_BROWSING_ENHANCED_TO_STANDARD,
+    });
+  });
+
+  test('safeBrowsingMetricsStandardToEnhanced', function() {
+    return assertSafeBrowsingMetrics({
+      safeBrowsingStartsEnhanced: false,
+      changeSetting: true,
+      expectedMetric:
+          PrivacyGuideSettingsStates.SAFE_BROWSING_STANDARD_TO_ENHANCED,
+    });
+  });
+
+  test('safeBrowsingMetricsStandardToStandard', function() {
+    return assertSafeBrowsingMetrics({
+      safeBrowsingStartsEnhanced: false,
+      changeSetting: false,
+      expectedMetric:
+          PrivacyGuideSettingsStates.SAFE_BROWSING_STANDARD_TO_STANDARD,
+    });
+  });
+
+  test('safeBrowsingMetricsEnhancedToEnhanced', function() {
+    return assertSafeBrowsingMetrics({
+      safeBrowsingStartsEnhanced: true,
+      changeSetting: false,
+      expectedMetric:
+          PrivacyGuideSettingsStates.SAFE_BROWSING_ENHANCED_TO_ENHANCED,
+    });
+  });
+
+  test('fragmentUpdatesFromSafeBrowsingChanges', async function() {
+    const radioButtonGroup =
+        fragment.shadowRoot!.querySelector<SettingsRadioGroupElement>(
+            '#safeBrowsingRadioGroup');
+    assertTrue(!!radioButtonGroup);
+
+    fragment.set(
+        'prefs.generated.safe_browsing.value', SafeBrowsingSetting.ENHANCED);
+    assertEquals(
+        Number(radioButtonGroup.selected), SafeBrowsingSetting.ENHANCED);
+
+    fragment.set(
+        'prefs.generated.safe_browsing.value', SafeBrowsingSetting.STANDARD);
+    assertEquals(
+        Number(radioButtonGroup.selected), SafeBrowsingSetting.STANDARD);
+  });
+});
+
+suite('CookiesFragmentTests', function() {
+  let fragment: PrivacyGuideCookiesFragmentElement;
+  let settingsPrefs: SettingsPrefsElement;
+  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
+
+  suiteSetup(function() {
+    settingsPrefs = document.createElement('settings-prefs');
+    return CrSettingsPrefs.initialized;
+  });
+
+  setup(function() {
+    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
+    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-cookies-fragment');
+    fragment.prefs = settingsPrefs.prefs!;
+    document.body.appendChild(fragment);
+
+    return flushTasks();
+  });
+
+  async function assertCookieMetrics({
+    cookieStartsBlock3PIncognito,
+    changeSetting,
+    expectedMetric,
+  }: {
+    cookieStartsBlock3PIncognito: boolean,
+    changeSetting: boolean,
+    expectedMetric: PrivacyGuideSettingsStates,
+  }) {
+    const cookieStartState = cookieStartsBlock3PIncognito ?
+        CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO :
+        CookiePrimarySetting.BLOCK_THIRD_PARTY;
+    fragment.set(
+        'prefs.generated.cookie_primary_setting.value', cookieStartState);
+
+    // The fragment is informed that it becomes visible by a receiving
+    // a view-enter-start event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-enter-start', {bubbles: true, composed: true}));
+
+    if (changeSetting) {
+      fragment.shadowRoot!
+          .querySelector<HTMLElement>(
+              cookieStartsBlock3PIncognito ? '#block3P' :
+                                             '#block3PIncognito')!.click();
+      flush();
+      const actionResult =
+          await testMetricsBrowserProxy.whenCalled('recordAction');
+      assertEquals(
+          actionResult,
+          cookieStartsBlock3PIncognito ?
+              'Settings.PrivacyGuide.ChangeCookiesBlock3P' :
+              'Settings.PrivacyGuide.ChangeCookiesBlock3PIncognito');
+    }
+
+    // The fragment is informed that it becomes invisible by
+    // receiving a view-enter-finish event.
+    fragment.dispatchEvent(
+        new CustomEvent('view-exit-finish', {bubbles: true, composed: true}));
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideSettingsStatesHistogram');
+    assertEquals(result, expectedMetric);
+  }
+
+  test('cookiesMetrics3PIncognitoTo3PIncognito', function() {
+    return assertCookieMetrics({
+      cookieStartsBlock3PIncognito: true,
+      changeSetting: false,
+      expectedMetric:
+          PrivacyGuideSettingsStates.BLOCK_3P_INCOGNITO_TO_3P_INCOGNITO,
+    });
+  });
+
+  test('cookiesMetrics3PIncognitoTo3P', function() {
+    return assertCookieMetrics({
+      cookieStartsBlock3PIncognito: true,
+      changeSetting: true,
+      expectedMetric: PrivacyGuideSettingsStates.BLOCK_3P_INCOGNITO_TO_3P,
+    });
+  });
+
+  test('cookiesMetrics3PTo3PIncognito', function() {
+    return assertCookieMetrics({
+      cookieStartsBlock3PIncognito: false,
+      changeSetting: true,
+      expectedMetric: PrivacyGuideSettingsStates.BLOCK_3P_TO_3P_INCOGNITO,
+    });
+  });
+
+  test('cookiesMetrics3PTo3P', function() {
+    return assertCookieMetrics({
+      cookieStartsBlock3PIncognito: false,
+      changeSetting: false,
+      expectedMetric: PrivacyGuideSettingsStates.BLOCK_3P_TO_3P,
+    });
+  });
+
+  test('fragmentUpdatesFromCookieChanges', async function() {
+    const radioButtonGroup =
+        fragment.shadowRoot!.querySelector<SettingsRadioGroupElement>(
+            '#cookiesRadioGroup')!;
+
+    fragment.set(
+        'prefs.generated.cookie_primary_setting.value',
+        CookiePrimarySetting.BLOCK_THIRD_PARTY);
+    assertEquals(
+        Number(radioButtonGroup.selected),
+        CookiePrimarySetting.BLOCK_THIRD_PARTY);
+
+    fragment.set(
+        'prefs.generated.cookie_primary_setting.value',
+        CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO);
+    assertEquals(
+        Number(radioButtonGroup.selected),
+        CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO);
+  });
+});
+
+suite('CompletionFragmentTests', function() {
+  let fragment: PrivacyGuideCompletionFragmentElement;
+  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
+
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      isPrivacySandboxRestricted: false,
+    });
+  });
+
+  setup(function() {
+    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
+    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-completion-fragment');
+    document.body.appendChild(fragment);
+
+    return flushTasks();
+  });
+
+  teardown(function() {
+    fragment.remove();
+    // The browser instance is shared among the tests, hence the route needs to
+    // be reset between tests.
+    Router.getInstance().navigateTo(routes.BASIC);
+  });
+
+  test('backNavigation', async function() {
+    const nextEventPromise = eventToPromise('back-button-click', fragment);
+
+    fragment.$.backButton.click();
+
+    // Ensure the event is sent.
+    return nextEventPromise;
+  });
+
+  test('backToSettingsNavigation', async function() {
+    const closeEventPromise = eventToPromise('close', fragment);
+
+    fragment.shadowRoot!.querySelector<HTMLElement>('#leaveButton')!.click();
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideNextNavigationHistogram');
+    assertEquals(PrivacyGuideInteractions.COMPLETION_NEXT_BUTTON, result);
+
+    const actionResult =
+        await testMetricsBrowserProxy.whenCalled('recordAction');
+    assertEquals(actionResult, 'Settings.PrivacyGuide.NextClickCompletion');
+
+    // Ensure the |close| event has been sent.
+    return closeEventPromise;
+  });
+
+  test('SWAALinkClick', async function() {
+    setSignInState(true);
+
+    assertTrue(isChildVisible(fragment, '#waaRow'));
+    fragment.shadowRoot!.querySelector<HTMLElement>('#waaRow')!.click();
+    flush();
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideEntryExitHistogram');
+    assertEquals(PrivacyGuideInteractions.SWAA_COMPLETION_LINK, result);
+  });
+
+  test('privacySandboxLinkClick', async function() {
+    fragment.shadowRoot!.querySelector<HTMLElement>(
+                            '#privacySandboxRow')!.click();
+    flush();
+
+    const result = await testMetricsBrowserProxy.whenCalled(
+        'recordPrivacyGuideEntryExitHistogram');
+    assertEquals(
+        PrivacyGuideInteractions.PRIVACY_SANDBOX_COMPLETION_LINK, result);
+  });
+
+  test('updateFragmentFromSignIn', function() {
+    setSignInState(true);
+    assertTrue(isChildVisible(fragment, '#privacySandboxRow'));
+    assertTrue(isChildVisible(fragment, '#waaRow'));
+
+    // Sign the user out and expect the waa row to no longer be visible.
+    setSignInState(false);
+    assertTrue(isChildVisible(fragment, '#privacySandboxRow'));
+    assertFalse(isChildVisible(fragment, '#waaRow'));
+  });
+});
+
+suite('CompletionFragmentPrivacySandboxRestricted', function() {
+  let fragment: PrivacyGuideCompletionFragmentElement;
+
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      isPrivacySandboxRestricted: true,
+    });
+  });
+
+  setup(function() {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    fragment = document.createElement('privacy-guide-completion-fragment');
+    document.body.appendChild(fragment);
+
+    return flushTasks();
+  });
+
+  teardown(function() {
+    fragment.remove();
+    // The browser instance is shared among the tests, hence the route needs to
+    // be reset between tests.
+    Router.getInstance().navigateTo(routes.BASIC);
+  });
+
+  test('updateFragmentFromSignIn', function() {
+    setSignInState(true);
+    assertFalse(isChildVisible(fragment, '#privacySandboxRow'));
+    assertTrue(isChildVisible(fragment, '#waaRow'));
+    const subheader =
+        fragment.shadowRoot!.querySelector<HTMLElement>('.cr-secondary-text')!;
+    assertEquals(
+        fragment.i18n('privacyGuideCompletionCardSubHeader'),
+        subheader.innerText);
+
+    setSignInState(false);
+    assertFalse(isChildVisible(fragment, '#privacySandboxRow'));
+    assertFalse(isChildVisible(fragment, '#waaRow'));
+    assertEquals(
+        fragment.i18n('privacyGuideCompletionCardSubHeaderNoLinks'),
+        subheader.innerText);
+  });
+});
diff --git a/chrome/test/data/webui/settings/privacy_guide_page_test.ts b/chrome/test/data/webui/settings/privacy_guide_page_test.ts
index b0f4a5e..3289d8b 100644
--- a/chrome/test/data/webui/settings/privacy_guide_page_test.ts
+++ b/chrome/test/data/webui/settings/privacy_guide_page_test.ts
@@ -6,10 +6,10 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CookiePrimarySetting, PrivacyGuideCompletionFragmentElement, PrivacyGuideHistorySyncFragmentElement, PrivacyGuideStep, PrivacyGuideWelcomeFragmentElement, SafeBrowsingSetting, SettingsPrivacyGuideDialogElement, SettingsPrivacyGuidePageElement, SettingsRadioGroupElement} from 'chrome://settings/lazy_load.js';
-import {HatsBrowserProxyImpl, TrustSafetyInteraction, CrSettingsPrefs, MetricsBrowserProxyImpl, PrivacyGuideInteractions, PrivacyGuideSettingsStates, Router, routes, SettingsPrefsElement, StatusAction, SyncBrowserProxyImpl, SyncPrefs, syncPrefsIndividualDataTypes, SyncStatus} from 'chrome://settings/settings.js';
+import {CookiePrimarySetting, PrivacyGuideStep, SafeBrowsingSetting, SettingsPrivacyGuideDialogElement, SettingsPrivacyGuidePageElement} from 'chrome://settings/lazy_load.js';
+import {HatsBrowserProxyImpl, TrustSafetyInteraction, CrSettingsPrefs, MetricsBrowserProxyImpl, PrivacyGuideInteractions, Router, routes, SettingsPrefsElement, StatusAction, SyncBrowserProxyImpl, SyncStatus} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
-import {eventToPromise, isChildVisible} from 'chrome://webui-test/test_util.js';
+import {isChildVisible} from 'chrome://webui-test/test_util.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
 import {getSyncAllPrefs} from './sync_test_util.js';
@@ -46,17 +46,6 @@
 }
 
 /**
- * Fire a sign in status change event and flush the UI.
- */
-function setSignInState(signedIn: boolean) {
-  const event = {
-    signedIn: signedIn,
-  };
-  webUIListenerCallback('update-sync-state', event);
-  flush();
-}
-
-/**
  * Set all relevant sync status and fire a changed event and flush the UI.
  */
 function setupSync({
@@ -348,28 +337,30 @@
     Router.getInstance().navigateTo(routes.BASIC);
   });
 
-  test('welcomeForwardNavigation', async function() {
+  test('welcomeCardForwardNavigation', async function() {
     assertFalse(page.getPref('privacy_guide.viewed').value);
 
     // Navigating to the privacy guide without a step parameter navigates to
     // the welcome card.
     Router.getInstance().navigateTo(routes.PRIVACY_GUIDE);
     await flushTasks();
-    assertWelcomeCardVisible(page);
 
+    assertWelcomeCardVisible(page);
     assertTrue(page.getPref('privacy_guide.viewed').value);
 
-    const welcomeFragment =
-        page.shadowRoot!.querySelector<PrivacyGuideWelcomeFragmentElement>(
-            '#' + PrivacyGuideStep.WELCOME)!;
-    welcomeFragment.$.startButton.click();
+    // The welcome fragment fires a |start-button-click| event to navigate
+    // forward.
+    const welcomeFragment = page.shadowRoot!.querySelector<HTMLElement>(
+        '#' + PrivacyGuideStep.WELCOME);
+    assertTrue(!!welcomeFragment);
+    welcomeFragment.dispatchEvent(
+        new CustomEvent('start-button-click', {bubbles: true, composed: true}));
     flush();
-    assertMsbbCardVisible(page, syncBrowserProxy);
 
+    assertMsbbCardVisible(page, syncBrowserProxy);
     const result = await testMetricsBrowserProxy.whenCalled(
         'recordPrivacyGuideNextNavigationHistogram');
     assertEquals(PrivacyGuideInteractions.WELCOME_NEXT_BUTTON, result);
-
     const actionResult =
         await testMetricsBrowserProxy.whenCalled('recordAction');
     assertEquals(actionResult, 'Settings.PrivacyGuide.NextClickWelcome');
@@ -387,13 +378,16 @@
     await navigateToStep(PrivacyGuideStep.COMPLETION);
     assertCompletionCardVisible(page);
 
+    // The completion fragment fires a |back-button-click| event to navigate
+    // back.
     const completionFragment =
-        page.shadowRoot!.querySelector('#' + PrivacyGuideStep.COMPLETION)!;
-    completionFragment.shadowRoot!.querySelector<HTMLElement>(
-                                      '#backButton')!.click();
+        page.shadowRoot!.querySelector('#' + PrivacyGuideStep.COMPLETION);
+    assertTrue(!!completionFragment);
+    completionFragment.dispatchEvent(
+        new CustomEvent('back-button-click', {bubbles: true, composed: true}));
     flush();
-    assertCookiesCardVisible(page, syncBrowserProxy);
 
+    assertCookiesCardVisible(page, syncBrowserProxy);
     const actionResult =
         await testMetricsBrowserProxy.whenCalled('recordAction');
     assertEquals(actionResult, 'Settings.PrivacyGuide.BackClickCompletion');
@@ -517,7 +511,7 @@
   });
 });
 
-suite('MsbbFragmentNavigations', function() {
+suite('MsbbCardNavigations', function() {
   let page: SettingsPrivacyGuidePageElement;
   let settingsPrefs: SettingsPrefsElement;
   let syncBrowserProxy: TestSyncBrowserProxy;
@@ -592,7 +586,7 @@
   });
 });
 
-suite('HistorySyncFragmentNavigations', function() {
+suite('HistorySyncCardNavigations', function() {
   let page: SettingsPrivacyGuidePageElement;
   let settingsPrefs: SettingsPrefsElement;
   let syncBrowserProxy: TestSyncBrowserProxy;
@@ -691,7 +685,7 @@
       });
 });
 
-suite('SafeBrowsingFragmentNavigations', function() {
+suite('SafeBrowsingCardNavigations', function() {
   let page: SettingsPrivacyGuidePageElement;
   let settingsPrefs: SettingsPrefsElement;
   let syncBrowserProxy: TestSyncBrowserProxy;
@@ -748,28 +742,6 @@
     assertMsbbCardVisible(page, syncBrowserProxy);
   });
 
-  test('safeBrowsingCardGetsUpdated', async function() {
-    await navigateToStep(PrivacyGuideStep.SAFE_BROWSING);
-    assertSafeBrowsingCardVisible(page, syncBrowserProxy);
-    const radioButtonGroup =
-        page.shadowRoot!.querySelector('#' + PrivacyGuideStep.SAFE_BROWSING)!
-            .shadowRoot!.querySelector<SettingsRadioGroupElement>(
-                '#safeBrowsingRadioGroup')!;
-    assertEquals(
-        Number(radioButtonGroup.selected), SafeBrowsingSetting.STANDARD);
-
-    // Changing the safe browsing setting should automatically change the
-    // selected radio button.
-    setSafeBrowsingSetting(page, SafeBrowsingSetting.ENHANCED);
-    assertEquals(
-        Number(radioButtonGroup.selected), SafeBrowsingSetting.ENHANCED);
-
-    // Changing the safe browsing setting to a disabled state while shown should
-    // navigate away from the safe browsing card.
-    setSafeBrowsingSetting(page, SafeBrowsingSetting.DISABLED);
-    assertCookiesCardVisible(page, syncBrowserProxy);
-  });
-
   test(
       'safeBrowsingCardForwardNavigationShouldShowCookiesCard',
       async function() {
@@ -802,9 +774,19 @@
         flush();
         assertCompletionCardVisible(page);
       });
+
+  test('safeBrowsingOffNavigatesAway', async function() {
+    await navigateToStep(PrivacyGuideStep.SAFE_BROWSING);
+    assertSafeBrowsingCardVisible(page, syncBrowserProxy);
+
+    // Changing the safe browsing setting to a disabled state while shown should
+    // navigate away from the safe browsing card.
+    setSafeBrowsingSetting(page, SafeBrowsingSetting.DISABLED);
+    assertCookiesCardVisible(page, syncBrowserProxy);
+  });
 });
 
-suite('CookiesFragmentNavigations', function() {
+suite('CookiesCardNavigations', function() {
   let page: SettingsPrivacyGuidePageElement;
   let settingsPrefs: SettingsPrefsElement;
   let syncBrowserProxy: TestSyncBrowserProxy;
@@ -879,23 +861,9 @@
     assertEquals(actionResult, 'Settings.PrivacyGuide.NextClickCookies');
   });
 
-  test('cookiesCardGetsUpdated', async function() {
+  test('cookiesAllowAllNavigatesAway', async function() {
     await navigateToStep(PrivacyGuideStep.COOKIES);
     assertCookiesCardVisible(page, syncBrowserProxy);
-    const radioButtonGroup =
-        page.shadowRoot!.querySelector('#' + PrivacyGuideStep.COOKIES)!
-            .shadowRoot!.querySelector<SettingsRadioGroupElement>(
-                '#cookiesRadioGroup')!;
-    assertEquals(
-        Number(radioButtonGroup.selected),
-        CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO);
-
-    // Changing the cookie setting should automatically change the selected
-    // radio button.
-    setCookieSetting(page, CookiePrimarySetting.BLOCK_THIRD_PARTY);
-    assertEquals(
-        Number(radioButtonGroup.selected),
-        CookiePrimarySetting.BLOCK_THIRD_PARTY);
 
     // Changing the cookie setting to a non-third-party state while shown should
     // navigate away from the cookies card.
@@ -904,6 +872,17 @@
     assertCompletionCardVisible(page);
   });
 
+  test('cookiesBlockAllNavigatesAway', async function() {
+    await navigateToStep(PrivacyGuideStep.COOKIES);
+    assertCookiesCardVisible(page, syncBrowserProxy);
+
+    // Changing the cookie setting to a non-third-party state while shown should
+    // navigate away from the cookies card.
+    setCookieSetting(page, CookiePrimarySetting.BLOCK_ALL);
+    await flushTasks();
+    assertCompletionCardVisible(page);
+  });
+
   test('hatsInformedOnFinish', async function() {
     await navigateToStep(PrivacyGuideStep.COOKIES);
 
@@ -916,697 +895,7 @@
   });
 });
 
-suite('MsbbFragmentMetricsTests', function() {
-  let page: SettingsPrivacyGuidePageElement;
-  let settingsPrefs: SettingsPrefsElement;
-  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
-
-  suiteSetup(function() {
-    settingsPrefs = document.createElement('settings-prefs');
-    return CrSettingsPrefs.initialized;
-  });
-
-  setup(function() {
-    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
-    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
-
-    page = createPrivacyGuidePageForTest(settingsPrefs);
-
-    return flushTasks();
-  });
-
-  teardown(function() {
-    page.remove();
-    // The browser instance is shared among the tests, hence the route needs to
-    // be reset between tests.
-    Router.getInstance().navigateTo(routes.BASIC);
-  });
-
-  async function assertMsbbMetrics({
-    msbbStartOn,
-    changeSetting,
-    expectedMetric,
-  }: {
-    msbbStartOn: boolean,
-    changeSetting: boolean,
-    expectedMetric: PrivacyGuideSettingsStates,
-  }) {
-    page.setPrefValue(
-        'url_keyed_anonymized_data_collection.enabled', msbbStartOn);
-    await navigateToStep(PrivacyGuideStep.MSBB);
-
-    if (changeSetting) {
-      page.shadowRoot!.querySelector('#' + PrivacyGuideStep.MSBB)!.shadowRoot!
-          .querySelector<HTMLElement>('#urlCollectionToggle')!.click();
-      flush();
-      const actionResult =
-          await testMetricsBrowserProxy.whenCalled('recordAction');
-      assertEquals(
-          actionResult,
-          msbbStartOn ? 'Settings.PrivacyGuide.ChangeMSBBOff' :
-                        'Settings.PrivacyGuide.ChangeMSBBOn');
-    }
-
-    // Go back instead of forward to not need sync state in the test.
-    page.shadowRoot!.querySelector<HTMLElement>('#backButton')!.click();
-    flush();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideSettingsStatesHistogram');
-    assertEquals(result, expectedMetric);
-  }
-
-  test('msbbMetricsOnToOn', function() {
-    return assertMsbbMetrics({
-      msbbStartOn: true,
-      changeSetting: false,
-      expectedMetric: PrivacyGuideSettingsStates.MSBB_ON_TO_ON,
-    });
-  });
-
-  test('msbbMetricsOnToOff', function() {
-    return assertMsbbMetrics({
-      msbbStartOn: true,
-      changeSetting: true,
-      expectedMetric: PrivacyGuideSettingsStates.MSBB_ON_TO_OFF,
-    });
-  });
-
-  test('msbbMetricsOffToOn', function() {
-    return assertMsbbMetrics({
-      msbbStartOn: false,
-      changeSetting: true,
-      expectedMetric: PrivacyGuideSettingsStates.MSBB_OFF_TO_ON,
-    });
-  });
-
-  test('msbbMetricsOffToOff', function() {
-    return assertMsbbMetrics({
-      msbbStartOn: false,
-      changeSetting: false,
-      expectedMetric: PrivacyGuideSettingsStates.MSBB_OFF_TO_OFF,
-    });
-  });
-});
-
-suite('HistorySyncFragmentMetricsTests', function() {
-  let page: SettingsPrivacyGuidePageElement;
-  let settingsPrefs: SettingsPrefsElement;
-  let syncBrowserProxy: TestSyncBrowserProxy;
-  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
-
-  suiteSetup(function() {
-    settingsPrefs = document.createElement('settings-prefs');
-    return CrSettingsPrefs.initialized;
-  });
-
-  setup(function() {
-    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
-    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
-    syncBrowserProxy = new TestSyncBrowserProxy();
-    syncBrowserProxy.testSyncStatus = null;
-    SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
-
-    page = createPrivacyGuidePageForTest(settingsPrefs);
-
-    return flushTasks();
-  });
-
-  teardown(function() {
-    page.remove();
-    // The browser instance is shared among the tests, hence the route needs to
-    // be reset between tests.
-    Router.getInstance().navigateTo(routes.BASIC);
-  });
-
-  async function assertHistorySyncMetrics({
-    historySyncStartOn,
-    changeSetting,
-    expectedMetric,
-  }: {
-    historySyncStartOn: boolean,
-    changeSetting: boolean,
-    expectedMetric: PrivacyGuideSettingsStates,
-  }) {
-    setupSync({
-      syncBrowserProxy: syncBrowserProxy,
-      syncOn: true,
-      syncAllDataTypes: historySyncStartOn,
-      typedUrlsSynced: historySyncStartOn,
-    });
-    await navigateToStep(PrivacyGuideStep.HISTORY_SYNC);
-
-    if (changeSetting) {
-      page.shadowRoot!.querySelector('#' + PrivacyGuideStep.HISTORY_SYNC)!
-          .shadowRoot!.querySelector<HTMLElement>('#historyToggle')!.click();
-      flush();
-      const actionResult =
-          await testMetricsBrowserProxy.whenCalled('recordAction');
-      assertEquals(
-          actionResult,
-          historySyncStartOn ? 'Settings.PrivacyGuide.ChangeHistorySyncOff' :
-                               'Settings.PrivacyGuide.ChangeHistorySyncOn');
-    }
-
-    page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
-    flush();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideSettingsStatesHistogram');
-    assertEquals(result, expectedMetric);
-  }
-
-  test('historySyncOnToOn', function() {
-    return assertHistorySyncMetrics({
-      historySyncStartOn: true,
-      changeSetting: false,
-      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON,
-    });
-  });
-
-  test('historySyncOnToOff', function() {
-    return assertHistorySyncMetrics({
-      historySyncStartOn: true,
-      changeSetting: true,
-      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF,
-    });
-  });
-
-  test('historySyncOffToOn', function() {
-    return assertHistorySyncMetrics({
-      historySyncStartOn: false,
-      changeSetting: true,
-      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON,
-    });
-  });
-
-  test('historySyncOffToOff', function() {
-    return assertHistorySyncMetrics({
-      historySyncStartOn: false,
-      changeSetting: false,
-      expectedMetric: PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF,
-    });
-  });
-});
-
-suite('SafeBrowsingFragmentMetricsTests', function() {
-  let page: SettingsPrivacyGuidePageElement;
-  let settingsPrefs: SettingsPrefsElement;
-  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
-
-  suiteSetup(function() {
-    settingsPrefs = document.createElement('settings-prefs');
-    return CrSettingsPrefs.initialized;
-  });
-
-  setup(function() {
-    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
-    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
-
-    page = createPrivacyGuidePageForTest(settingsPrefs);
-
-    return flushTasks();
-  });
-
-  teardown(function() {
-    page.remove();
-    // The browser instance is shared among the tests, hence the route needs to
-    // be reset between tests.
-    Router.getInstance().navigateTo(routes.BASIC);
-  });
-
-  async function assertSafeBrowsingMetrics({
-    safeBrowsingStartsEnhanced,
-    changeSetting,
-    expectedMetric,
-  }: {
-    safeBrowsingStartsEnhanced: boolean,
-    changeSetting: boolean,
-    expectedMetric: PrivacyGuideSettingsStates,
-  }) {
-    const safeBrowsingStartState = safeBrowsingStartsEnhanced ?
-        SafeBrowsingSetting.ENHANCED :
-        SafeBrowsingSetting.STANDARD;
-    page.setPrefValue('generated.safe_browsing', safeBrowsingStartState);
-    await navigateToStep(PrivacyGuideStep.SAFE_BROWSING);
-
-    if (changeSetting) {
-      page.shadowRoot!.querySelector(
-                          '#' + PrivacyGuideStep.SAFE_BROWSING)!.shadowRoot!
-          .querySelector<HTMLElement>(
-              safeBrowsingStartsEnhanced ?
-                  '#safeBrowsingRadioStandard' :
-                  '#safeBrowsingRadioEnhanced')!.click();
-      flush();
-      const actionResult =
-          await testMetricsBrowserProxy.whenCalled('recordAction');
-      assertEquals(
-          actionResult,
-          safeBrowsingStartsEnhanced ?
-              'Settings.PrivacyGuide.ChangeSafeBrowsingStandard' :
-              'Settings.PrivacyGuide.ChangeSafeBrowsingEnhanced');
-    }
-
-    page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
-    flush();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideSettingsStatesHistogram');
-    assertEquals(result, expectedMetric);
-  }
-
-  test('safeBrowsingMetricsEnhancedToStandard', function() {
-    return assertSafeBrowsingMetrics({
-      safeBrowsingStartsEnhanced: true,
-      changeSetting: true,
-      expectedMetric:
-          PrivacyGuideSettingsStates.SAFE_BROWSING_ENHANCED_TO_STANDARD,
-    });
-  });
-
-  test('safeBrowsingMetricsStandardToEnhanced', function() {
-    return assertSafeBrowsingMetrics({
-      safeBrowsingStartsEnhanced: false,
-      changeSetting: true,
-      expectedMetric:
-          PrivacyGuideSettingsStates.SAFE_BROWSING_STANDARD_TO_ENHANCED,
-    });
-  });
-
-  test('safeBrowsingMetricsStandardToStandard', function() {
-    return assertSafeBrowsingMetrics({
-      safeBrowsingStartsEnhanced: false,
-      changeSetting: false,
-      expectedMetric:
-          PrivacyGuideSettingsStates.SAFE_BROWSING_STANDARD_TO_STANDARD,
-    });
-  });
-
-  test('safeBrowsingMetricsEnhancedToEnhanced', function() {
-    return assertSafeBrowsingMetrics({
-      safeBrowsingStartsEnhanced: true,
-      changeSetting: false,
-      expectedMetric:
-          PrivacyGuideSettingsStates.SAFE_BROWSING_ENHANCED_TO_ENHANCED,
-    });
-  });
-});
-
-suite('CookiesFragmentMetricsTests', function() {
-  let page: SettingsPrivacyGuidePageElement;
-  let settingsPrefs: SettingsPrefsElement;
-  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
-
-  suiteSetup(function() {
-    settingsPrefs = document.createElement('settings-prefs');
-    return CrSettingsPrefs.initialized;
-  });
-
-  setup(function() {
-    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
-    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
-
-    page = createPrivacyGuidePageForTest(settingsPrefs);
-
-    return flushTasks();
-  });
-
-  teardown(function() {
-    page.remove();
-    // The browser instance is shared among the tests, hence the route needs to
-    // be reset between tests.
-    Router.getInstance().navigateTo(routes.BASIC);
-  });
-
-  async function assertCookieMetrics({
-    cookieStartsBlock3PIncognito,
-    changeSetting,
-    expectedMetric,
-  }: {
-    cookieStartsBlock3PIncognito: boolean,
-    changeSetting: boolean,
-    expectedMetric: PrivacyGuideSettingsStates,
-  }) {
-    const cookieStartState = cookieStartsBlock3PIncognito ?
-        CookiePrimarySetting.BLOCK_THIRD_PARTY_INCOGNITO :
-        CookiePrimarySetting.BLOCK_THIRD_PARTY;
-    page.setPrefValue('generated.cookie_primary_setting', cookieStartState);
-    await navigateToStep(PrivacyGuideStep.COOKIES);
-
-    if (changeSetting) {
-      page.shadowRoot!.querySelector(
-                          '#' + PrivacyGuideStep.COOKIES)!.shadowRoot!
-          .querySelector<HTMLElement>(
-              cookieStartsBlock3PIncognito ? '#block3P' :
-                                             '#block3PIncognito')!.click();
-      flush();
-      const actionResult =
-          await testMetricsBrowserProxy.whenCalled('recordAction');
-      assertEquals(
-          actionResult,
-          cookieStartsBlock3PIncognito ?
-              'Settings.PrivacyGuide.ChangeCookiesBlock3P' :
-              'Settings.PrivacyGuide.ChangeCookiesBlock3PIncognito');
-    }
-
-    page.shadowRoot!.querySelector<HTMLElement>('#nextButton')!.click();
-    flush();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideSettingsStatesHistogram');
-    assertEquals(result, expectedMetric);
-  }
-
-  test('cookiesMetrics3PIncognitoTo3PIncognito', function() {
-    return assertCookieMetrics({
-      cookieStartsBlock3PIncognito: true,
-      changeSetting: false,
-      expectedMetric:
-          PrivacyGuideSettingsStates.BLOCK_3P_INCOGNITO_TO_3P_INCOGNITO,
-    });
-  });
-
-  test('cookiesMetrics3PIncognitoTo3P', function() {
-    return assertCookieMetrics({
-      cookieStartsBlock3PIncognito: true,
-      changeSetting: true,
-      expectedMetric: PrivacyGuideSettingsStates.BLOCK_3P_INCOGNITO_TO_3P,
-    });
-  });
-
-  test('cookiesMetrics3PTo3PIncognito', function() {
-    return assertCookieMetrics({
-      cookieStartsBlock3PIncognito: false,
-      changeSetting: true,
-      expectedMetric: PrivacyGuideSettingsStates.BLOCK_3P_TO_3P_INCOGNITO,
-    });
-  });
-
-  test('cookiesMetrics3PTo3P', function() {
-    return assertCookieMetrics({
-      cookieStartsBlock3PIncognito: false,
-      changeSetting: false,
-      expectedMetric: PrivacyGuideSettingsStates.BLOCK_3P_TO_3P,
-    });
-  });
-});
-
-suite('HistorySyncFragment', function() {
-  let page: PrivacyGuideHistorySyncFragmentElement;
-  let syncBrowserProxy: TestSyncBrowserProxy;
-
-  setup(function() {
-    syncBrowserProxy = new TestSyncBrowserProxy();
-    SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
-
-    document.body.innerHTML = window.trustedTypes!.emptyHTML;
-    page = document.createElement('privacy-guide-history-sync-fragment');
-    document.body.appendChild(page);
-    return flushTasks();
-  });
-
-  teardown(function() {
-    page.remove();
-  });
-
-  function setSyncStatus({
-    syncAllDataTypes,
-    typedUrlsSynced,
-    passwordsSynced,
-  }: {
-    syncAllDataTypes: boolean,
-    typedUrlsSynced: boolean,
-    passwordsSynced: boolean,
-  }) {
-    if (syncAllDataTypes) {
-      assertTrue(typedUrlsSynced);
-      assertTrue(passwordsSynced);
-    }
-    const event: SyncPrefs = {} as unknown as SyncPrefs;
-    for (const datatype of syncPrefsIndividualDataTypes) {
-      (event as unknown as {[key: string]: boolean})[datatype] = true;
-    }
-    // Overwrite datatypes needed in tests.
-    event.syncAllDataTypes = syncAllDataTypes;
-    event.typedUrlsSynced = typedUrlsSynced;
-    event.passwordsSynced = passwordsSynced;
-    webUIListenerCallback('sync-prefs-changed', event);
-  }
-
-  async function assertBrowserProxyCall({
-    syncAllDatatypesExpected,
-    typedUrlsSyncedExpected,
-  }: {
-    syncAllDatatypesExpected: boolean,
-    typedUrlsSyncedExpected: boolean,
-  }) {
-    const syncPrefs = await syncBrowserProxy.whenCalled('setSyncDatatypes');
-    assertEquals(syncAllDatatypesExpected, syncPrefs.syncAllDataTypes);
-    assertEquals(typedUrlsSyncedExpected, syncPrefs.typedUrlsSynced);
-    syncBrowserProxy.resetResolver('setSyncDatatypes');
-  }
-
-  test('syncAllOnDisableReenableHistorySync', async function() {
-    setSyncStatus({
-      syncAllDataTypes: true,
-      typedUrlsSynced: true,
-      passwordsSynced: true,
-    });
-    page.$.historyToggle.click();
-    await assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: false,
-    });
-
-    // Re-enabling history sync re-enables sync all if sync all was on before
-    // and if all sync datatypes are still enabled.
-    page.$.historyToggle.click();
-    return assertBrowserProxyCall({
-      syncAllDatatypesExpected: true,
-      typedUrlsSyncedExpected: true,
-    });
-  });
-
-  test('syncAllOnDisableReenableHistorySyncOtherDatatypeOff', async function() {
-    setSyncStatus({
-      syncAllDataTypes: true,
-      typedUrlsSynced: true,
-      passwordsSynced: true,
-    });
-    page.$.historyToggle.click();
-    await assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: false,
-    });
-
-    // The user disables another datatype in a different tab.
-    setSyncStatus({
-      syncAllDataTypes: false,
-      typedUrlsSynced: false,
-      passwordsSynced: false,
-    });
-
-    // Re-enabling history sync in the privacy guide doesn't re-enable sync
-    // all.
-    page.$.historyToggle.click();
-    return assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: true,
-    });
-  });
-
-  test('syncAllOnDisableReenableHistorySyncWithNavigation', async function() {
-    setSyncStatus({
-      syncAllDataTypes: true,
-      typedUrlsSynced: true,
-      passwordsSynced: true,
-    });
-    page.$.historyToggle.click();
-    await assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: false,
-    });
-
-    // The user navigates to another card, then back to the history sync card.
-    Router.getInstance().navigateTo(
-        routes.PRIVACY_GUIDE,
-        /* opt_dynamicParameters */ new URLSearchParams('step=msbb'));
-    Router.getInstance().navigateTo(
-        routes.PRIVACY_GUIDE,
-        /* opt_dynamicParameters */ new URLSearchParams('step=historySync'));
-
-    // Re-enabling history sync in the privacy guide doesn't re-enable sync
-    // all.
-    page.$.historyToggle.click();
-    return assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: true,
-    });
-  });
-
-  test('syncAllOffDisableReenableHistorySync', async function() {
-    setSyncStatus({
-      syncAllDataTypes: false,
-      typedUrlsSynced: true,
-      passwordsSynced: true,
-    });
-    page.$.historyToggle.click();
-    await assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: false,
-    });
-
-    // Re-enabling history sync doesn't re-enable sync all if sync all wasn't on
-    // originally.
-    page.$.historyToggle.click();
-    return assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: true,
-    });
-  });
-
-  test('syncAllOffEnableHistorySync', function() {
-    setSyncStatus({
-      syncAllDataTypes: false,
-      typedUrlsSynced: false,
-      passwordsSynced: true,
-    });
-    page.$.historyToggle.click();
-    return assertBrowserProxyCall({
-      syncAllDatatypesExpected: false,
-      typedUrlsSyncedExpected: true,
-    });
-  });
-});
-
-suite('CompletionFragment', function() {
-  let page: PrivacyGuideCompletionFragmentElement;
-  let testMetricsBrowserProxy: TestMetricsBrowserProxy;
-
-  suiteSetup(function() {
-    loadTimeData.overrideValues({
-      isPrivacySandboxRestricted: false,
-    });
-  });
-
-  setup(function() {
-    testMetricsBrowserProxy = new TestMetricsBrowserProxy();
-    MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy);
-
-    document.body.innerHTML = window.trustedTypes!.emptyHTML;
-    page = document.createElement('privacy-guide-completion-fragment');
-    document.body.appendChild(page);
-
-    setupPrivacyRouteForTest();
-    // The user navigates to the completion step.
-    return navigateToStep(PrivacyGuideStep.COMPLETION);
-  });
-
-  teardown(function() {
-    page.remove();
-    // The browser instance is shared among the tests, hence the route needs to
-    // be reset between tests.
-    Router.getInstance().navigateTo(routes.BASIC);
-  });
-
-  test('backToSettingsNavigation', async function() {
-    const closeEventPromise = eventToPromise('close', page);
-
-    page.shadowRoot!.querySelector<HTMLElement>('#leaveButton')!.click();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideNextNavigationHistogram');
-    assertEquals(PrivacyGuideInteractions.COMPLETION_NEXT_BUTTON, result);
-
-    const actionResult =
-        await testMetricsBrowserProxy.whenCalled('recordAction');
-    assertEquals(actionResult, 'Settings.PrivacyGuide.NextClickCompletion');
-
-    // Ensure the |close| event has been sent.
-    return closeEventPromise;
-  });
-
-  test('SWAALinkClick', async function() {
-    setSignInState(true);
-
-    assertTrue(isChildVisible(page, '#waaRow'));
-    page.shadowRoot!.querySelector<HTMLElement>('#waaRow')!.click();
-    flush();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideEntryExitHistogram');
-    assertEquals(PrivacyGuideInteractions.SWAA_COMPLETION_LINK, result);
-  });
-
-  test('privacySandboxLinkClick', async function() {
-    page.shadowRoot!.querySelector<HTMLElement>('#privacySandboxRow')!.click();
-    flush();
-
-    const result = await testMetricsBrowserProxy.whenCalled(
-        'recordPrivacyGuideEntryExitHistogram');
-    assertEquals(
-        PrivacyGuideInteractions.PRIVACY_SANDBOX_COMPLETION_LINK, result);
-  });
-
-  test('updateFragmentFromSignIn', function() {
-    setSignInState(true);
-    assertTrue(isChildVisible(page, '#privacySandboxRow'));
-    assertTrue(isChildVisible(page, '#waaRow'));
-
-    // Sign the user out and expect the waa row to no longer be visible.
-    setSignInState(false);
-    assertTrue(isChildVisible(page, '#privacySandboxRow'));
-    assertFalse(isChildVisible(page, '#waaRow'));
-  });
-});
-
-suite('CompletionFragmentPrivacySandboxRestricted', function() {
-  let page: PrivacyGuideCompletionFragmentElement;
-
-  suiteSetup(function() {
-    loadTimeData.overrideValues({
-      isPrivacySandboxRestricted: true,
-    });
-  });
-
-  setup(function() {
-    document.body.innerHTML = window.trustedTypes!.emptyHTML;
-    page = document.createElement('privacy-guide-completion-fragment');
-    document.body.appendChild(page);
-
-    setupPrivacyRouteForTest();
-    // The user navigates to the completion step.
-    navigateToStep(PrivacyGuideStep.COMPLETION);
-
-    return flushTasks();
-  });
-
-  teardown(function() {
-    page.remove();
-    // The browser instance is shared among the tests, hence the route needs to
-    // be reset between tests.
-    Router.getInstance().navigateTo(routes.BASIC);
-  });
-
-  test('updateFragmentFromSignIn', function() {
-    setSignInState(true);
-    assertFalse(isChildVisible(page, '#privacySandboxRow'));
-    assertTrue(isChildVisible(page, '#waaRow'));
-    const subheader =
-        page.shadowRoot!.querySelector<HTMLElement>('.cr-secondary-text')!;
-    assertEquals(
-        page.i18n('privacyGuideCompletionCardSubHeader'), subheader.innerText);
-
-    setSignInState(false);
-    assertFalse(isChildVisible(page, '#privacySandboxRow'));
-    assertFalse(isChildVisible(page, '#waaRow'));
-    assertEquals(
-        page.i18n('privacyGuideCompletionCardSubHeaderNoLinks'),
-        subheader.innerText);
-  });
-});
-
-suite('PrivacyGuideDialog', function() {
+suite('PrivacyGuideDialogTests', function() {
   let page: SettingsPrivacyGuideDialogElement;
 
   setup(function() {
diff --git a/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts b/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
index 7f4342e9..1cda5095 100644
--- a/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
+++ b/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
@@ -580,6 +580,31 @@
         blockedSitesDescription.innerText);
   });
 
+  test('sitesList', async function() {
+    page.setPrefValue('privacy_sandbox.m1.fledge_enabled', true);
+    await flushTasks();
+    // Check for current sites.
+    const currentSitesSection =
+        page.shadowRoot!.querySelector<HTMLElement>('#currentSitesSection')!;
+    const currentSites = currentSitesSection.querySelector('dom-repeat');
+    assertTrue(!!currentSites);
+    assertEquals(1, currentSites.items!.length);
+    assertFalse(isVisible(
+        currentSitesSection.querySelector('#currentSitesDescriptionEmpty')));
+    assertEquals('test-site-one.com', currentSites.items![0].site!);
+    assertFalse(isVisible(currentSitesSection.querySelector('#seeAllSites')));
+
+    // Check for blocked sites.
+    page.shadowRoot!.querySelector<HTMLElement>('#blockedSitesRow')!.click();
+    await flushTasks();
+    const blockedSitesList =
+        page.shadowRoot!.querySelector('#blockedSitesList')!;
+    const blockedSites = blockedSitesList.querySelector('dom-repeat');
+    assertTrue(!!blockedSites);
+    assertEquals(1, blockedSites.items!.length);
+    assertEquals('test-site-two.com', blockedSites.items![0].site!);
+  });
+
   test('footerLinks', async function() {
     assertTrue(isChildVisible(page, '#footer'));
     const links =
@@ -592,6 +617,76 @@
   });
 });
 
+suite('PrivacySandboxFledgeSubpageSeeAllSitesTests', function() {
+  let page: SettingsPrivacySandboxFledgeSubpageElement;
+  let testPrivacySandboxBrowserProxy: TestPrivacySandboxBrowserProxy;
+  let settingsPrefs: SettingsPrefsElement;
+
+  const sitesList: string[] = [];
+  const remainingSitesCount: number = 5;
+  const sitesCount: number = remainingSitesCount +
+      SettingsPrivacySandboxFledgeSubpageElement.maxFledgeSites;
+
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      isPrivacySandboxRestricted: false,
+    });
+    settingsPrefs = document.createElement('settings-prefs');
+    return CrSettingsPrefs.initialized;
+  });
+
+  setup(async function() {
+    testPrivacySandboxBrowserProxy = new TestPrivacySandboxBrowserProxy();
+    // Setup long list of sites.
+    for (let i = 0; i < sitesCount; i++) {
+      sitesList.push('site-' + i + '.com');
+    }
+    testPrivacySandboxBrowserProxy.setFledgeState({
+      joiningSites: sitesList,
+      blockedSites: [],
+    });
+    PrivacySandboxBrowserProxyImpl.setInstance(testPrivacySandboxBrowserProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    document.body.appendChild(settingsPrefs);
+    page = document.createElement('settings-privacy-sandbox-fledge-subpage');
+    page.prefs = settingsPrefs.prefs!;
+    document.body.appendChild(page);
+    await testPrivacySandboxBrowserProxy.whenCalled('getFledgeState');
+    return flushTasks();
+  });
+
+  teardown(function() {
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('sitesList', async function() {
+    page.setPrefValue('privacy_sandbox.m1.fledge_enabled', true);
+    await flushTasks();
+    // Check for current sites.
+    const currentSitesSection =
+        page.shadowRoot!.querySelector<HTMLElement>('#currentSitesSection')!;
+    const currentSites = currentSitesSection.querySelector('dom-repeat');
+    assertTrue(!!currentSites);
+    assertEquals(
+        SettingsPrivacySandboxFledgeSubpageElement.maxFledgeSites,
+        currentSites.items!.length);
+    assertFalse(isVisible(
+        currentSitesSection.querySelector('#currentSitesDescriptionEmpty')));
+
+    // Check for "See all sites" button.
+    const seeAllSites =
+        currentSitesSection.querySelector<HTMLElement>('#seeAllSites');
+    assertTrue(isVisible(seeAllSites));
+    seeAllSites!.click();
+    await flushTasks();
+    const allCurrentSites = currentSitesSection.querySelectorAll('dom-repeat');
+    assertTrue(!!currentSites);
+    assertEquals(2, allCurrentSites.length);
+    assertEquals(remainingSitesCount, allCurrentSites[1]!.items!.length);
+  });
+});
+
 suite('PrivacySandboxAdMeasurementSubpageTests', function() {
   let page: SettingsPrivacySandboxAdMeasurementSubpageElement;
   let settingsPrefs: SettingsPrefsElement;
diff --git a/chrome/test/data/webui/settings/site_data_test.ts b/chrome/test/data/webui/settings/site_data_test.ts
index 7c2f1c0..711ca29 100644
--- a/chrome/test/data/webui/settings/site_data_test.ts
+++ b/chrome/test/data/webui/settings/site_data_test.ts
@@ -35,6 +35,7 @@
     document.body.innerHTML = window.trustedTypes!.emptyHTML;
     page = document.createElement('settings-site-data');
     page.prefs = settingsPrefs.prefs!;
+    page.set('prefs.' + PREF_NAME + '.value', ContentSetting.ALLOW);
     document.body.appendChild(page);
     flush();
   });
@@ -43,19 +44,77 @@
     page.remove();
   });
 
-  test('DefaultSettingChangesUpdatePref', function() {
+  function getDefaultBlockDialog() {
+    return page.shadowRoot!.querySelector('#defaultBlockDialog');
+  }
+
+  test('DefaultSettingAllowUpdatesPref', async function() {
+    // Start from a different state than 'allow'.
+    page.$.defaultSessionOnly.click();
+    assertEquals(
+        page.getPref(PREF_NAME + '.value'), ContentSetting.SESSION_ONLY);
+
+    page.$.defaultAllow.click();
+    assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.ALLOW);
+  });
+
+  test('DefaultSettingSessionOnlyUpdatesPref', async function() {
     // Default is 'allow'.
     assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.ALLOW);
 
     page.$.defaultSessionOnly.click();
     assertEquals(
         page.getPref(PREF_NAME + '.value'), ContentSetting.SESSION_ONLY);
+  });
+
+  test('DefaultSettingBlockUpdatesPref', async function() {
+    // Default is 'allow'.
+    assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.ALLOW);
 
     page.$.defaultBlock.click();
-    assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.BLOCK);
+    flush();
+    // Changing to block requires confirmation in the dialog to take effect.
+    assertTrue(!!getDefaultBlockDialog());
+    page.shadowRoot!.querySelector<HTMLElement>(
+                        '#defaultBlockDialogConfirm')!.click();
+    await flushTasks();
 
-    page.$.defaultAllow.click();
+    assertFalse(!!getDefaultBlockDialog());
+    assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.BLOCK);
+  });
+
+  test('BlockSiteDataFromAllowDontConfirmDialog', async function() {
+    // Default is 'allow'.
     assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.ALLOW);
+
+    page.$.defaultBlock.click();
+    flush();
+    assertTrue(!!getDefaultBlockDialog());
+    page.shadowRoot!.querySelector<HTMLElement>(
+                        '#defaultBlockDialogCancel')!.click();
+    await flushTasks();
+
+    assertFalse(!!getDefaultBlockDialog());
+    assertEquals(page.getPref(PREF_NAME + '.value'), ContentSetting.ALLOW);
+    assertEquals(page.$.defaultGroup.selected, ContentSetting.ALLOW);
+  });
+
+  test('BlockSiteDataFromSessionOnlyDontConfirmDialog', async function() {
+    page.$.defaultSessionOnly.click();
+    assertEquals(
+        page.getPref(PREF_NAME + '.value'), ContentSetting.SESSION_ONLY);
+
+    page.$.defaultBlock.click();
+    flush();
+    assertTrue(!!getDefaultBlockDialog());
+    page.shadowRoot!.querySelector<HTMLElement>(
+                        '#defaultBlockDialogCancel')!.click();
+    await flushTasks();
+
+    assertFalse(!!getDefaultBlockDialog());
+    assertEquals(
+        page.getPref(PREF_NAME + '.value'), ContentSetting.SESSION_ONLY);
+    assertEquals(page.$.defaultGroup.selected, ContentSetting.SESSION_ONLY);
   });
 
   test('PrefChangesUpdateDefaultSetting', function() {
diff --git a/chrome/test/data/webui/settings/site_settings_page_test.ts b/chrome/test/data/webui/settings/site_settings_page_test.ts
index b2763f0..2214542 100644
--- a/chrome/test/data/webui/settings/site_settings_page_test.ts
+++ b/chrome/test/data/webui/settings/site_settings_page_test.ts
@@ -35,6 +35,10 @@
           type: chrome.settingsPrivate.PrefType.NUMBER,
           value: NotificationSetting.ASK,
         },
+        cookie_default_content_setting: {
+          type: chrome.settingsPrivate.PrefType.STRING,
+          value: ContentSetting.ALLOW,
+        },
       },
     };
     document.body.appendChild(page);
@@ -119,6 +123,40 @@
     assertTrue(isChildVisible(
         page.shadowRoot!.querySelector('#advancedContentList')!, '#site-data'));
   });
+
+  test('SiteDataLinkRowSublabel', async function() {
+    setupPage();
+    page.shadowRoot!.querySelector<HTMLElement>('#expandContent')!.click();
+    flush();
+
+    const siteDataLinkRow =
+        page.shadowRoot!.querySelector('#advancedContentList')!.shadowRoot!
+            .querySelector<CrLinkRowElement>('#site-data')!;
+
+    page.set(
+        'prefs.generated.cookie_default_content_setting.value',
+        ContentSetting.BLOCK);
+    await flushTasks();
+    assertEquals(
+        loadTimeData.getString('siteSettingsSiteDataBlockedSubLabel'),
+        siteDataLinkRow.subLabel);
+
+    page.set(
+        'prefs.generated.cookie_default_content_setting.value',
+        ContentSetting.SESSION_ONLY);
+    await flushTasks();
+    assertEquals(
+        loadTimeData.getString('siteSettingsSiteDataClearOnExitSubLabel'),
+        siteDataLinkRow.subLabel);
+
+    page.set(
+        'prefs.generated.cookie_default_content_setting.value',
+        ContentSetting.ALLOW);
+    await flushTasks();
+    assertEquals(
+        loadTimeData.getString('siteSettingsSiteDataAllowedSubLabel'),
+        siteDataLinkRow.subLabel);
+  });
 });
 
 // TODO(crbug/1378703): Remove after crbug/1378703 launched.
diff --git a/chrome/test/data/webui/settings/test_privacy_sandbox_browser_proxy.ts b/chrome/test/data/webui/settings/test_privacy_sandbox_browser_proxy.ts
index 06b1d2c..12ab57e 100644
--- a/chrome/test/data/webui/settings/test_privacy_sandbox_browser_proxy.ts
+++ b/chrome/test/data/webui/settings/test_privacy_sandbox_browser_proxy.ts
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CanonicalTopic, PrivacySandboxBrowserProxy} from 'chrome://settings/settings.js';
+import {CanonicalTopic, FledgeState, PrivacySandboxBrowserProxy} from 'chrome://settings/settings.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 export class TestPrivacySandboxBrowserProxy extends TestBrowserProxy implements
     PrivacySandboxBrowserProxy {
+  private fledgeState_: FledgeState;
+
   constructor() {
     super([
       'getFledgeState',
@@ -14,14 +16,20 @@
       'getTopicsState',
       'setTopicAllowed',
     ]);
+
+    this.fledgeState_ = {
+      joiningSites: ['test-site-one.com'],
+      blockedSites: ['test-site-two.com'],
+    };
+  }
+
+  setFledgeState(fledgeState: FledgeState) {
+    this.fledgeState_ = fledgeState;
   }
 
   getFledgeState() {
     this.methodCalled('getFledgeState');
-    return Promise.resolve({
-      joiningSites: ['test-site-one.com'],
-      blockedSites: ['test-site-two.com'],
-    });
+    return Promise.resolve(this.fledgeState_);
   }
 
   setFledgeJoiningAllowed(site: string, allowed: boolean) {
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index d533244..40fb852f 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-110-5414.7-1669632342-benchmark-110.0.5447.0-r1.orderfile.xz
+chromeos-chrome-orderfile-field-110-5447.0-1670842982-benchmark-110.0.5464.0-r2.orderfile.xz
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index 6099c2f..e7f4cab 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -179,7 +179,7 @@
 <translation id="2498950423397131220">Plavajoči gumb</translation>
 <translation id="2505327257735685095">Osveži trenutno sliko zaslonskega ozadja</translation>
 <translation id="2513396635448525189">Slika za prijavo</translation>
-<translation id="2517472476991765520">Išči</translation>
+<translation id="2517472476991765520">Optično preberi</translation>
 <translation id="2526590354069164005">Namizje</translation>
 <translation id="253029298928638905">Vnovičen zagon …</translation>
 <translation id="2533048460510040082">Predlagana vsebina s pomočjo</translation>
diff --git a/components/autofill/OWNERS b/components/autofill/OWNERS
index be2829f..e789d4b 100644
--- a/components/autofill/OWNERS
+++ b/components/autofill/OWNERS
@@ -1,5 +1,4 @@
 battre@chromium.org
-cfroussios@chromium.org
 koerber@google.com
 schwering@google.com
 kolos@chromium.org
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl.cc b/components/autofill/core/browser/touch_to_fill_delegate_impl.cc
index feac6b0..57478a12 100644
--- a/components/autofill/core/browser/touch_to_fill_delegate_impl.cc
+++ b/components/autofill/core/browser/touch_to_fill_delegate_impl.cc
@@ -56,10 +56,11 @@
   std::vector<CreditCard*> cards_to_suggest = pdm->GetCreditCardsToSuggest(
       manager_->client()->AreServerCardsSupported());
 
-  base::EraseIf(cards_to_suggest,
-                base::not_fn(&CreditCard::IsCompleteValidCard));
-  if (cards_to_suggest.empty())
+  // Not showing the sheet if all the cards are incomplete or invalid.
+  if (base::ranges::none_of(cards_to_suggest,
+                            &CreditCard::IsCompleteValidCard)) {
     return false;
+  }
   // Trigger only if the UI is available.
   if (!manager_->driver()->CanShowAutofillUi())
     return false;
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc b/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc
index 4dde5cd5..dca236f 100644
--- a/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc
+++ b/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc
@@ -291,7 +291,7 @@
 }
 
 TEST_F(TouchToFillDelegateImplUnitTest,
-       TryToShowTouchToFillFailsIfCardIsExpired) {
+       TryToShowTouchToFillFailsIfTheOnlyCardIsExpired) {
   ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill());
   autofill_client_.GetPersonalDataManager()->ClearCreditCards();
   autofill_client_.GetPersonalDataManager()->AddCreditCard(
@@ -333,6 +333,35 @@
   TryToShowTouchToFill(/*expected_success=*/false);
 }
 
+TEST_F(TouchToFillDelegateImplUnitTest,
+       TryToShowTouchToFillSucceedsIfAtLestOneCardIsValid) {
+  autofill_client_.GetPersonalDataManager()->ClearCreditCards();
+  CreditCard credit_card = autofill::test::GetCreditCard();
+  CreditCard expired_card = test::GetExpiredCreditCard();
+  autofill_client_.GetPersonalDataManager()->AddCreditCard(credit_card);
+  autofill_client_.GetPersonalDataManager()->AddCreditCard(expired_card);
+  ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill());
+  EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard)
+      .WillOnce(Return(true));
+
+  TryToShowTouchToFill(/*expected_success=*/true);
+}
+
+TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillShowsExpiredCards) {
+  autofill_client_.GetPersonalDataManager()->ClearCreditCards();
+  CreditCard credit_card = autofill::test::GetCreditCard();
+  CreditCard expired_card = test::GetExpiredCreditCard();
+  autofill_client_.GetPersonalDataManager()->AddCreditCard(credit_card);
+  autofill_client_.GetPersonalDataManager()->AddCreditCard(expired_card);
+  std::vector<autofill::CreditCard*> credit_cards =
+      autofill_client_.GetPersonalDataManager()->GetCreditCardsToSuggest(false);
+  ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill());
+  EXPECT_CALL(autofill_client_,
+              ShowTouchToFillCreditCard(_, ElementsAreArray(credit_cards)));
+
+  TryToShowTouchToFill(/*expected_success=*/true);
+}
+
 TEST_F(TouchToFillDelegateImplUnitTest, HideTouchToFillDoesNothingIfNotShown) {
   ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill());
 
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java
index 572b81f6..7f48c341 100644
--- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java
+++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java
@@ -140,7 +140,9 @@
         if (isCancelled()) return null;
 
         // TODO(finnur): Apply try-with-resources to MediaMetadataRetriever once Chrome no longer
-        //               supports versions below Build.VERSION_CODES.N.
+        //               supports versions below Build.VERSION_CODES.Q. API 29 is when it started
+        //               to implement AutoCloseable:
+        //               https://developer.android.com/sdk/api_diff/29/changes/android.media.MediaMetadataRetriever
         MediaMetadataRetriever retriever = null;
         try (AssetFileDescriptor afd = mContentResolver.openAssetFileDescriptor(mUri, "r")) {
             retriever = new MediaMetadataRetriever();
@@ -173,8 +175,7 @@
         } finally {
             try {
                 if (retriever != null) retriever.release();
-                // TODO(crbug.com/1285047): Update to IOException after it go to public.
-            } catch (Exception exception) {
+            } catch (IOException exception) {
             }
         }
     }
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java
index bb502e0..552e9376 100644
--- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java
+++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java
@@ -34,7 +34,6 @@
  * Tests for the DecoderServiceHost.
  */
 @RunWith(BaseJUnit4ClassRunner.class)
-@MinAndroidSdkLevel(Build.VERSION_CODES.N)
 public class DecoderServiceHostTest implements DecoderServiceHost.DecoderStatusCallback,
                                                DecoderServiceHost.ImagesDecodedCallback {
     // The timeout (in milliseconds) to wait for the decoding.
diff --git a/components/browsing_data/content/browsing_data_helper.cc b/components/browsing_data/content/browsing_data_helper.cc
index 14437ac..baba791c 100644
--- a/components/browsing_data/content/browsing_data_helper.cc
+++ b/components/browsing_data/content/browsing_data_helper.cc
@@ -13,7 +13,6 @@
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/origin_trials/browser/prefservice_persistence_provider.h"
 #include "components/origin_trials/common/features.h"
 #include "components/prefs/pref_service.h"
 #include "components/site_isolation/pref_names.h"
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index e5a6c88..43e3449 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "17.33",
-  "log_list_timestamp": "2023-01-03T12:55:16Z",
+  "version": "17.34",
+  "log_list_timestamp": "2023-01-04T12:54:59Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/content_settings/core/browser/BUILD.gn b/components/content_settings/core/browser/BUILD.gn
index 815fabf..e6b576fc 100644
--- a/components/content_settings/core/browser/BUILD.gn
+++ b/components/content_settings/core/browser/BUILD.gn
@@ -119,6 +119,7 @@
     deps += [
       "//components/policy:generated",
       "//components/policy/core/browser:test_support",
+      "//components/privacy_sandbox:features",
       "//components/privacy_sandbox:privacy_sandbox_prefs",
       "//third_party/blink/public/common:headers",
     ]
diff --git a/components/content_settings/core/browser/cookie_settings_unittest.cc b/components/content_settings/core/browser/cookie_settings_unittest.cc
index 2d3bf60..08aff7a 100644
--- a/components/content_settings/core/browser/cookie_settings_unittest.cc
+++ b/components/content_settings/core/browser/cookie_settings_unittest.cc
@@ -24,7 +24,6 @@
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "extensions/buildflags/buildflags.h"
 #include "net/base/features.h"
-#include "net/base/schemeful_site.h"
 #include "net/cookies/cookie_constants.h"
 #include "net/cookies/cookie_setting_override.h"
 #include "net/cookies/cookie_util.h"
@@ -34,7 +33,8 @@
 #if BUILDFLAG(IS_IOS)
 #include "components/content_settings/core/common/features.h"
 #else
-#include "third_party/blink/public/common/features.h"
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
+
 namespace {
 constexpr char kAllowedRequestsHistogram[] =
     "API.StorageAccess.AllowedRequests2";
@@ -122,6 +122,10 @@
   ~CookieSettingsTest() override { settings_map_->ShutdownOnUIThread(); }
 
   void SetUp() override {
+#if !BUILDFLAG(IS_IOS)
+    is_privacy_sandbox_v4_enabled_ =
+        base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4);
+#endif
     ContentSettingsRegistry::GetInstance()->ResetForTest();
     CookieSettings::RegisterProfilePrefs(prefs_.registry());
     HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry());
@@ -215,6 +219,7 @@
   const net::SiteForCookies kHttpSiteForCookies;
   const net::SiteForCookies kHttpsSiteForCookies;
   ContentSettingsPattern kAllHttpsSitesPattern;
+  bool is_privacy_sandbox_v4_enabled_ = false;
 
  private:
   base::test::ScopedFeatureList feature_list_;
@@ -421,6 +426,34 @@
                                                     QueryReason::kCookies));
 }
 
+TEST_P(CookieSettingsTest, ThirdPartyExceptionSessionOnly) {
+  cookie_settings_->SetThirdPartyCookieSetting(kBlockedSite,
+                                               CONTENT_SETTING_SESSION_ONLY);
+  EXPECT_EQ(cookie_settings_->IsCookieSessionOnly(kBlockedSite,
+                                                  QueryReason::kCookies),
+            !is_privacy_sandbox_v4_enabled_);
+}
+
+#if !BUILDFLAG(IS_IOS)
+class CookieSettingsTestSandboxV4Enabled : public CookieSettingsTest {
+ public:
+  CookieSettingsTestSandboxV4Enabled() {
+    feature_list_.InitAndEnableFeature(
+        privacy_sandbox::kPrivacySandboxSettings4);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+TEST_P(CookieSettingsTestSandboxV4Enabled, ThirdPartyExceptionSessionOnly) {
+  cookie_settings_->SetThirdPartyCookieSetting(kBlockedSite,
+                                               CONTENT_SETTING_SESSION_ONLY);
+  EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kBlockedSite,
+                                                     QueryReason::kCookies));
+}
+#endif
+
 TEST_P(CookieSettingsTest, KeepBlocked) {
   // Keep blocked cookies.
   cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW);
@@ -530,6 +563,24 @@
   EXPECT_TRUE(ShouldDeleteCookieOnExit(kSubDomain, true));
 }
 
+TEST_P(CookieSettingsTest, DeleteCookiesWithThirdPartyException) {
+  cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW);
+  cookie_settings_->SetThirdPartyCookieSetting(kHttpsSite,
+                                               CONTENT_SETTING_SESSION_ONLY);
+  EXPECT_EQ(ShouldDeleteCookieOnExit(kDomain, true),
+            !is_privacy_sandbox_v4_enabled_);
+}
+
+#if !BUILDFLAG(IS_IOS)
+TEST_P(CookieSettingsTestSandboxV4Enabled,
+       DeleteCookiesWithThirdPartyException) {
+  cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW);
+  cookie_settings_->SetThirdPartyCookieSetting(kHttpsSite,
+                                               CONTENT_SETTING_SESSION_ONLY);
+  EXPECT_FALSE(ShouldDeleteCookieOnExit(kDomain, true));
+}
+#endif
+
 TEST_P(CookieSettingsTest, CookiesThirdPartyBlockedExplicitAllow) {
   cookie_settings_->SetCookieSetting(kAllowedSite, CONTENT_SETTING_ALLOW);
   prefs_.SetInteger(prefs::kCookieControlsMode,
@@ -575,13 +626,15 @@
   EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite,
                                                      QueryReason::kCookies));
 
-  // HTTP sites should be allowed, but session-only.
+  // HTTP sites should be allowed, session_only attributes are ignored for
+  // exceptions with secondary pattern.
   EXPECT_TRUE(cookie_settings_->IsFullCookieAccessAllowed(
       kFirstPartySite, kFirstPartySiteForCookies,
       /*top_frame_origin=*/absl::nullopt, cookie_setting_overrides,
       QueryReason::kCookies));
-  EXPECT_TRUE(cookie_settings_->IsCookieSessionOnly(kFirstPartySite,
-                                                    QueryReason::kCookies));
+  EXPECT_EQ(cookie_settings_->IsCookieSessionOnly(kFirstPartySite,
+                                                  QueryReason::kCookies),
+            !is_privacy_sandbox_v4_enabled_);
 
   // Third-party cookies should be blocked.
   EXPECT_EQ(cookie_setting_overrides.Has(
@@ -1005,6 +1058,20 @@
       return info.param.test_name;
     });
 
+#if !BUILDFLAG(IS_IOS)
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    CookieSettingsTestSandboxV4Enabled,
+    testing::ValuesIn<TestCase>({
+        {"disable_SAA", false, false},
+        {"enable_SAA", true, false},
+        {"disable_SAA_force_3PCs", false, true},
+        {"enable_SAA_force_3PCs", true, true},
+    }),
+    [](const testing::TestParamInfo<CookieSettingsTest::ParamType>& info) {
+      return info.param.test_name;
+    });
+#endif
 }  // namespace
 
 }  // namespace content_settings
diff --git a/components/content_settings/core/common/BUILD.gn b/components/content_settings/core/common/BUILD.gn
index 53c74ab..54060e44 100644
--- a/components/content_settings/core/common/BUILD.gn
+++ b/components/content_settings/core/common/BUILD.gn
@@ -42,6 +42,10 @@
     "//net",
     "//url",
   ]
+
+  if (!is_ios) {
+    deps += [ "//components/privacy_sandbox:features" ]
+  }
 }
 
 source_set("unit_tests") {
diff --git a/components/content_settings/core/common/DEPS b/components/content_settings/core/common/DEPS
index b9d01de8..138a879 100644
--- a/components/content_settings/core/common/DEPS
+++ b/components/content_settings/core/common/DEPS
@@ -11,4 +11,5 @@
   "+testing",
   "+third_party/icu/fuzzers/fuzzer_utils.h",
   "+url",
+  "+components/privacy_sandbox/privacy_sandbox_features.h",
 ]
diff --git a/components/content_settings/core/common/cookie_settings_base.cc b/components/content_settings/core/common/cookie_settings_base.cc
index 74656156..ad43ec3 100644
--- a/components/content_settings/core/common/cookie_settings_base.cc
+++ b/components/content_settings/core/common/cookie_settings_base.cc
@@ -5,13 +5,10 @@
 #include "components/content_settings/core/common/cookie_settings_base.h"
 
 #include "base/check.h"
-#include "base/debug/stack_trace.h"
-#include "base/debug/task_trace.h"
 #include "base/feature_list.h"
 #include "base/notreached.h"
 #include "base/types/optional_util.h"
 #include "build/build_config.h"
-#include "components/content_settings/core/common/features.h"
 #include "net/base/features.h"
 #include "net/base/net_errors.h"
 #include "net/cookies/cookie_setting_override.h"
@@ -20,6 +17,10 @@
 #include "net/cookies/static_cookie_policy.h"
 #include "url/gurl.h"
 
+#if !BUILDFLAG(IS_IOS)
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
+#endif
+
 namespace content_settings {
 
 CookieSettingsBase::CookieSettingsBase()
@@ -28,7 +29,16 @@
       storage_access_api_grants_unpartitioned_storage_(
           net::features::kStorageAccessAPIGrantsUnpartitionedStorage.Get()),
       is_storage_partitioned_(base::FeatureList::IsEnabled(
-          net::features::kThirdPartyStoragePartitioning)) {}
+          net::features::kThirdPartyStoragePartitioning)),
+      is_privacy_sandbox_v4_enabled_(
+#if BUILDFLAG(IS_IOS)
+          false
+#else
+          base::FeatureList::IsEnabled(
+              privacy_sandbox::kPrivacySandboxSettings4)
+#endif
+      ) {
+}
 
 // static
 bool CookieSettingsBase::IsThirdPartyRequest(
@@ -52,8 +62,11 @@
     const std::string& domain,
     bool is_https) const {
   GURL origin = net::cookie_util::CookieOriginToURL(domain, is_https);
+  // Pass GURL() as first_party_url since we don't know the context and
+  // don't want to match against (*, exception) pattern.
   ContentSetting setting =
-      GetCookieSetting(origin, origin, nullptr, QueryReason::kCookies);
+      GetCookieSetting(origin, is_privacy_sandbox_v4_enabled_ ? GURL() : origin,
+                       nullptr, QueryReason::kCookies);
   DCHECK(IsValidSetting(setting));
   if (setting == CONTENT_SETTING_ALLOW)
     return false;
@@ -110,8 +123,11 @@
 
 bool CookieSettingsBase::IsCookieSessionOnly(const GURL& origin,
                                              QueryReason query_reason) const {
+  // Pass GURL() as first_party_url since we don't know the context and
+  // don't want to match against (*, exception) pattern.
   ContentSetting setting =
-      GetCookieSetting(origin, origin, nullptr, query_reason);
+      GetCookieSetting(origin, is_privacy_sandbox_v4_enabled_ ? GURL() : origin,
+                       nullptr, query_reason);
   DCHECK(IsValidSetting(setting));
   return setting == CONTENT_SETTING_SESSION_ONLY;
 }
diff --git a/components/content_settings/core/common/cookie_settings_base.h b/components/content_settings/core/common/cookie_settings_base.h
index 49ae627..5078539b 100644
--- a/components/content_settings/core/common/cookie_settings_base.h
+++ b/components/content_settings/core/common/cookie_settings_base.h
@@ -47,7 +47,7 @@
 //      </html>
 //    </iframe>
 //  </body>
-//</html>
+// </html>
 //
 // When each of these resources get fetched, |top_frame_origin| will always be
 // "https://a.com" and |site_for_cookies| is set the following:
@@ -243,9 +243,10 @@
       content_settings::SettingSource* source,
       QueryReason query_reason) const = 0;
 
-  bool storage_access_api_enabled_;
-  bool storage_access_api_grants_unpartitioned_storage_;
-  bool is_storage_partitioned_;
+  const bool storage_access_api_enabled_;
+  const bool storage_access_api_grants_unpartitioned_storage_;
+  const bool is_storage_partitioned_;
+  const bool is_privacy_sandbox_v4_enabled_;
 };
 
 }  // namespace content_settings
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java b/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java
index b86a49c5..adbc84c 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java
@@ -61,7 +61,9 @@
         final int threadPriority =
                 builder.threadPriority(THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE);
         this.mUserAgent = builder.getUserAgent();
-        this.mExecutorService = new ThreadPoolExecutor(10, 20, 50, TimeUnit.SECONDS,
+        // For unbounded work queues, the effective maximum pool size is
+        // equivalent to the core pool size.
+        this.mExecutorService = new ThreadPoolExecutor(10, 10, 50, TimeUnit.SECONDS,
                 new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
                     @Override
                     public Thread newThread(final Runnable r) {
diff --git a/components/cronet/tools/cr_cronet.py b/components/cronet/tools/cr_cronet.py
index 7d35154..c823a41 100755
--- a/components/cronet/tools/cr_cronet.py
+++ b/components/cronet/tools/cr_cronet.py
@@ -137,9 +137,8 @@
 def get_android_gn_args(is_release):
   return (get_mobile_gn_args('android', is_release) +
           # Keep in sync with //tools/mb/mb_config.pyl cronet_android config.
-          'default_min_sdk_version = 19 ' +
-          'use_errorprone_java_compiler=true ' +
-          'enable_reporting=true ' +
+          'is_cronet_build=true ' + 'default_min_sdk_version = 19 ' +
+          'use_errorprone_java_compiler=true ' + 'enable_reporting=true ' +
           'use_hashed_jni_names=true ')
 
 
diff --git a/components/omnibox/browser/history_quick_provider.cc b/components/omnibox/browser/history_quick_provider.cc
index 0edeb47..2f12999 100644
--- a/components/omnibox/browser/history_quick_provider.cc
+++ b/components/omnibox/browser/history_quick_provider.cc
@@ -31,6 +31,7 @@
 #include "components/omnibox/browser/in_memory_url_index.h"
 #include "components/omnibox/browser/keyword_provider.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
+#include "components/omnibox/browser/omnibox_triggered_feature_service.h"
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
@@ -128,8 +129,12 @@
 
   static const size_t domain_suggestions_min_char =
       OmniboxFieldTrial::kDomainSuggestionsMinInputLength.Get();
-  if (autocomplete_input_.text().length() < domain_suggestions_min_char)
+  static const int max_host_matches =
+      OmniboxFieldTrial::kDomainSuggestionsMaxMatchesPerDomain.Get();
+  if (autocomplete_input_.text().length() < domain_suggestions_min_char ||
+      max_host_matches == 0) {
     return;
+  }
 
   // Append suggestions for each of the user's highly visited domains. To
   // determine these domains, the user's visits are aggregated by URL host and
@@ -146,17 +151,20 @@
     //  those are not as big of a concern. If performance metrics regress, we
     //  should extract matching and scoring history items from
     //  `HistoryItemsForTerms()` so it can be done just once.
-    static const int max_host_matches =
-        OmniboxFieldTrial::kDomainSuggestionsMaxMatchesPerDomain.Get();
     ScoredHistoryMatches host_matches =
         in_memory_url_index_->HistoryItemsForTerms(
             autocomplete_input_.text(), autocomplete_input_.cursor_position(),
             host, max_host_matches);
     // TODO(manukh): Consider using a new `AutocompleteMatchType` for domain
-    //  suggestions to distinguish them in metrics. Would also help with CF
-    //  logging.
-    if (!host_matches.empty())
-      add_matches(host_matches);
+    //  suggestions to distinguish them in metrics.
+    if (!host_matches.empty()) {
+      client()->GetOmniboxTriggeredFeatureService()->FeatureTriggered(
+          OmniboxTriggeredFeatureService::Feature::kDomainSuggestions);
+      static const bool counterfactual =
+          OmniboxFieldTrial::kDomainSuggestionsCounterfactual.Get();
+      if (!counterfactual)
+        add_matches(host_matches);
+    }
   }
 }
 
@@ -363,6 +371,14 @@
   match.RecordAdditionalInfo("typed count", info.typed_count());
   match.RecordAdditionalInfo("visit count", info.visit_count());
   match.RecordAdditionalInfo("last visit", info.last_visit());
-
+  match.RecordAdditionalInfo("raw score before domain boosting",
+                             history_match.raw_score_before_domain_boosting);
+  match.RecordAdditionalInfo("raw score after domain boosting",
+                             history_match.raw_score_after_domain_boosting);
+  if (history_match.raw_score_before_domain_boosting <
+      history_match.raw_score_after_domain_boosting) {
+    client()->GetOmniboxTriggeredFeatureService()->FeatureTriggered(
+        OmniboxTriggeredFeatureService::Feature::kDomainSuggestions);
+  }
   return match;
 }
diff --git a/components/omnibox/browser/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc
index c2c2060..a0be720 100644
--- a/components/omnibox/browser/history_quick_provider_unittest.cc
+++ b/components/omnibox/browser/history_quick_provider_unittest.cc
@@ -30,6 +30,7 @@
 #include "components/omnibox/browser/fake_autocomplete_provider_client.h"
 #include "components/omnibox/browser/history_test_util.h"
 #include "components/omnibox/browser/history_url_provider.h"
+#include "components/omnibox/browser/omnibox_triggered_feature_service.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/search_engines/template_url_starter_pack_data.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -1047,7 +1048,11 @@
 
 TEST_F(HQPDomainSuggestionsTest, DomainSuggestions) {
   const auto test = [&](const std::u16string& input_text, bool input_keyword,
-                        std::vector<std::u16string> expected_matches) {
+                        std::vector<std::u16string> expected_matches,
+                        bool expected_triggered) {
+    SCOPED_TRACE("input_text: " + base::UTF16ToUTF8(input_text) +
+                 ", input_keyword: " + (input_keyword ? "true" : "false"));
+
     AutocompleteInput input(input_text, metrics::OmniboxEventProto::OTHER,
                             TestSchemeClassifier());
     input.set_keyword_mode_entry_method(
@@ -1056,14 +1061,21 @@
             : metrics::OmniboxEventProto_KeywordModeEntryMethod_INVALID);
     input.set_prefer_keyword(input_keyword);
 
+    client().GetOmniboxTriggeredFeatureService()->ResetSession();
     provider().Start(input, false);
     auto matches = provider().matches();
     std::vector<std::u16string> match_titles;
     base::ranges::transform(
         matches, std::back_inserter(match_titles),
         [](const auto& match) { return match.description; });
-    EXPECT_THAT(match_titles, testing::ElementsAreArray(expected_matches))
-        << "input_text: " << input_text << ", input_keyword: " << input_keyword;
+    EXPECT_THAT(match_titles, testing::ElementsAreArray(expected_matches));
+
+    OmniboxTriggeredFeatureService::Features triggered_features;
+    client().GetOmniboxTriggeredFeatureService()->RecordToLogs(
+        &triggered_features);
+    bool was_triggered = triggered_features.count(
+        OmniboxTriggeredFeatureService::Feature::kDomainSuggestions);
+    EXPECT_EQ(was_triggered, expected_triggered);
   };
 
   // When matching a popular domain, its top 3 suggestions should be suggested
@@ -1072,40 +1084,45 @@
   // Duplicates aren't necessary behavior, just a harmless side effect. The
   // domain algorithm may change in the future to not add duplicates.
   test(u"Dilijan", false,
-       {u"Dilijan 1", u"Dilijan 2", u"Dilijan 3", u"Dilijan 1", u"Dilijan 2"});
+       {u"Dilijan 1", u"Dilijan 2", u"Dilijan 3", u"Dilijan 1", u"Dilijan 2"},
+       true);
 
   // Like above, but when only some of its suggestions match, only those should
   // be suggested by both the overall and domain passes.
-  test(u"Dilijan 1", false, {u"Dilijan 1", u"Dilijan 1"});
+  test(u"Dilijan 1", false, {u"Dilijan 1", u"Dilijan 1"}, true);
 
   // Domains with more than 4 typed visits should be considered popular.
   test(u"Geghard", false,
-       {u"Geghard 1", u"Geghard 2", u"Geghard 3", u"Geghard 1", u"Geghard 2"});
+       {u"Geghard 1", u"Geghard 2", u"Geghard 3", u"Geghard 1", u"Geghard 2"},
+       true);
 
   // Domains with more than 4 typed visits but less than 4 capped typed visits
   // should not be considered popular.
-  test(u"Tatev", false, {u"Tatev 1", u"Tatev 2", u"Tatev 3"});
+  test(u"Tatev", false, {u"Tatev 1", u"Tatev 2", u"Tatev 3"}, false);
 
   // Domains with more than 7 visits, but less than 7 1-typed visits should not
   // be considered popular.
-  test(u"Gyumri", false, {u"Gyumri 1", u"Gyumri 2", u"Gyumri 3"});
+  test(u"Gyumri", false, {u"Gyumri 1", u"Gyumri 2", u"Gyumri 3"}, false);
 
   // When matching multiple domains, the overall pass should suggest the top
   // suggestion, even if some of them aren't from a popular domain, then each
   // domain's suggestions should be appended, each individually limited to 2.
   test(u"www.", false,
        {u"Gyumri 1", u"Tatev 1", u"Gyumri 2", u"Geghard 1", u"Geghard 2",
-        u"Dilijan 1", u"Dilijan 2"});
+        u"Dilijan 1", u"Dilijan 2"},
+       true);
 
-  // Short inputs should not have domain suggestions.
-  test(u"Dil", false, {u"Dilijan 1", u"Dilijan 2", u"Dilijan 3"});
+  // Short inputs should not have domain suggestions. They should still log the
+  // feature as triggered since their scores may potentially be boosted.
+  test(u"Dil", false, {u"Dilijan 1", u"Dilijan 2", u"Dilijan 3"}, false);
 
   // Keyword inputs should not have domain suggestions, so we shouldn't see
   // duplicates. But keyword inputs have a higher provider limit, so we should
   // see all 7 matching suggestions.
   test(u"Dilijan", true,
        {u"Dilijan 1", u"Dilijan 2", u"Dilijan 3", u"Dilijan 4", u"Dilijan 5",
-        u"Dilijan 6", u"Dilijan 7"});
+        u"Dilijan 6", u"Dilijan 7"},
+       false);
 }
 
 // HQPOrderingTest -------------------------------------------------------------
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc
index afc35c5..8f94f86 100644
--- a/components/omnibox/browser/omnibox_field_trial.cc
+++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -965,6 +965,11 @@
     "DocumentProviderMaxLowQualitySuggestions",
     100);
 
+const base::FeatureParam<bool> kDomainSuggestionsCounterfactual(
+    &omnibox::kDomainSuggestions,
+    "DomainSuggestionsCounterfactual",
+    false);
+
 const base::FeatureParam<int> kDomainSuggestionsTypedUrlsThreshold(
     &omnibox::kDomainSuggestions,
     "DomainSuggestionsTypedUrlsThreshold",
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h
index b69fd749..4f518a7 100644
--- a/components/omnibox/browser/omnibox_field_trial.h
+++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -582,6 +582,9 @@
 extern const base::FeatureParam<int> kDocumentProviderMaxLowQualitySuggestions;
 
 // Domain suggestions.
+// Whether enabled for counterfactual logging; i.e. shouldn't use domain
+// suggestions/scores.
+extern const base::FeatureParam<bool> kDomainSuggestionsCounterfactual;
 // The minimum number of unique URLs a domain needs to be considered highly
 // visited.
 extern const base::FeatureParam<int> kDomainSuggestionsTypedUrlsThreshold;
diff --git a/components/omnibox/browser/omnibox_triggered_feature_service.h b/components/omnibox/browser/omnibox_triggered_feature_service.h
index f9ced10..b540999 100644
--- a/components/omnibox/browser/omnibox_triggered_feature_service.h
+++ b/components/omnibox/browser/omnibox_triggered_feature_service.h
@@ -23,7 +23,8 @@
     kShortBookmarkSuggestionsByTotalInputLength = 2,
     kFuzzyUrlSuggestions = 3,
     kHistoryClusterSuggestion = 4,
-    kMaxValue = kHistoryClusterSuggestion,
+    kDomainSuggestions = 5,
+    kMaxValue = kDomainSuggestions,
   };
   using Features = std::set<Feature>;
 
diff --git a/components/omnibox/browser/scored_history_match.cc b/components/omnibox/browser/scored_history_match.cc
index 72e164ef..6adff1ef 100644
--- a/components/omnibox/browser/scored_history_match.cc
+++ b/components/omnibox/browser/scored_history_match.cc
@@ -289,8 +289,28 @@
   const float domain_score =
       is_highly_visited_host ? domain_suggestions_score_factor : 1;
 
-  raw_score = base::saturated_cast<int>(GetFinalRelevancyScore(
-      topicality_score, frequency_score, specificity_score, domain_score));
+  raw_score_before_domain_boosting =
+      base::saturated_cast<int>(GetFinalRelevancyScore(
+          topicality_score, frequency_score, specificity_score, 1));
+  // Short-circuit the redundant 2nd computations if domain boosting is
+  // disabled.
+  raw_score_after_domain_boosting =
+      domain_score > 1 ? base::saturated_cast<int>(GetFinalRelevancyScore(
+                             topicality_score, frequency_score,
+                             specificity_score, domain_score))
+                       : raw_score_before_domain_boosting;
+  DCHECK(domain_score > 1 ? raw_score_before_domain_boosting <=
+                                raw_score_after_domain_boosting
+                          : raw_score_before_domain_boosting ==
+                                raw_score_after_domain_boosting);
+
+  // If the feature is cf enabled, use the un-boosted score; If enabled, use the
+  // boosted score; and if disabled, it doesn't matter as the scores are equal.
+  static const bool domain_suggestions_counterfactual =
+      OmniboxFieldTrial::kDomainSuggestionsCounterfactual.Get();
+  raw_score = domain_suggestions_counterfactual
+                  ? raw_score_before_domain_boosting
+                  : raw_score_after_domain_boosting;
 
   if (also_do_hup_like_scoring_ && likely_can_inline) {
     // HistoryURL-provider-like scoring gives any match that is
diff --git a/components/omnibox/browser/scored_history_match.h b/components/omnibox/browser/scored_history_match.h
index 196b2a2..4926606a 100644
--- a/components/omnibox/browser/scored_history_match.h
+++ b/components/omnibox/browser/scored_history_match.h
@@ -95,6 +95,11 @@
   // of the match.
   int raw_score;
 
+  // `kDomainSuggestions` may boost the score. These record the original and
+  // boosted scores for logging.
+  int raw_score_before_domain_boosting;
+  int raw_score_after_domain_boosting;
+
   // Both these TermMatches contain the set of matches that are considered
   // important.  At this time, that means they exclude mid-word matches
   // except in the hostname of the URL.  (Technically, during early
diff --git a/components/origin_trials/BUILD.gn b/components/origin_trials/BUILD.gn
index 80a109b..889627d 100644
--- a/components/origin_trials/BUILD.gn
+++ b/components/origin_trials/BUILD.gn
@@ -10,8 +10,6 @@
     "browser/leveldb_persistence_provider.h",
     "browser/origin_trials.cc",
     "browser/origin_trials.h",
-    "browser/prefservice_persistence_provider.cc",
-    "browser/prefservice_persistence_provider.h",
   ]
   deps = [
     ":common",
@@ -67,7 +65,6 @@
   sources = [
     "browser/leveldb_persistence_provider_unittest.cc",
     "browser/origin_trials_unittest.cc",
-    "browser/prefservice_persistence_provider_unittest.cc",
     "common/persisted_trial_token_unittest.cc",
   ]
   deps = [
diff --git a/components/origin_trials/browser/prefservice_persistence_provider.cc b/components/origin_trials/browser/prefservice_persistence_provider.cc
deleted file mode 100644
index e3be106..0000000
--- a/components/origin_trials/browser/prefservice_persistence_provider.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/origin_trials/browser/prefservice_persistence_provider.h"
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/task/task_traits.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/values.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/pref_service.h"
-#include "components/user_prefs/user_prefs.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
-
-namespace origin_trials {
-
-const char kOriginTrialPrefKey[] = "origin_trials.persistent_trials";
-
-namespace {
-
-// This flag allows tests to disable the scheduled cleanup.
-// Outside tests, it is expected to always be true.
-bool g_cleanup_expired_tokens = true;
-
-// Check that |token_val| represents a valid persisted origin trial token.
-bool IsValidTokenVal(const base::Value& token_val,
-                     const base::Time& current_time) {
-  if (!token_val.is_dict())
-    return false;
-
-  absl::optional<PersistedTrialToken> token_opt =
-      PersistedTrialToken::FromDict(token_val.GetDict());
-  if (!token_opt)
-    return false;
-
-  blink::TrialTokenValidator validator;
-  return validator.RevalidateTokenAndTrial(
-      token_opt->trial_name, token_opt->token_expiry,
-      token_opt->usage_restriction, token_opt->token_signature, current_time);
-}
-
-}  // namespace
-
-PrefServicePersistenceProvider::PrefServicePersistenceProvider(
-    content::BrowserContext* browser_context)
-    : browser_context_(browser_context) {
-  DCHECK(browser_context_);
-  if (g_cleanup_expired_tokens) {
-    content::GetUIThreadTaskRunner({base::TaskPriority::BEST_EFFORT})
-        ->PostTask(
-            FROM_HERE,
-            base::BindOnce(&PrefServicePersistenceProvider::DeleteExpiredTokens,
-                           weak_ptr_factory_.GetWeakPtr(), base::Time::Now()));
-  }
-}
-
-PrefServicePersistenceProvider::~PrefServicePersistenceProvider() = default;
-
-// static
-void PrefServicePersistenceProvider::RegisterProfilePrefs(
-    PrefRegistrySimple* registry) {
-  // Registering as a lossy pref lessen the requirement on the PrefService to
-  // potentially persist changes after every single navigation.
-  registry->RegisterDictionaryPref(kOriginTrialPrefKey,
-                                   PrefRegistry::LOSSY_PREF);
-}
-
-void PrefServicePersistenceProvider::DeleteExpiredTokens(
-    base::Time current_time) {
-  PrefService* service = pref_service();
-  DCHECK(service);
-  ScopedDictPrefUpdate update(service, kOriginTrialPrefKey);
-
-  base::Value::Dict& storage_dict = update.Get();
-
-  // Get the map keys to iterate over, so we avoid modifying the map while
-  // iterating.
-  std::vector<std::string> origins;
-  for (const auto entry : storage_dict) {
-    origins.push_back(entry.first);
-  }
-
-  // For each stored origin, collect the tokens that are still valid.
-  for (const std::string& origin : origins) {
-    base::Value::List* tokens = storage_dict.FindList(origin);
-    DCHECK(tokens);  // We just got the key from the same map
-
-    base::Value::List valid_tokens;
-    for (base::Value& token_val : *tokens) {
-      if (IsValidTokenVal(token_val, current_time))
-        valid_tokens.Append(std::move(token_val));
-    }
-    if (valid_tokens.empty()) {
-      storage_dict.Remove(origin);
-    } else {
-      storage_dict.Set(origin, std::move(valid_tokens));
-    }
-  }
-}
-
-base::flat_set<PersistedTrialToken>
-PrefServicePersistenceProvider::GetPersistentTrialTokens(
-    const url::Origin& origin) {
-  DCHECK(!origin.opaque());
-
-  PrefService* service = pref_service();
-  DCHECK(service);
-
-  const base::Value::Dict& storage_dict = service->GetDict(kOriginTrialPrefKey);
-  if (storage_dict.empty())
-    return {};
-
-  std::string origin_key = origin.Serialize();
-
-  base::flat_set<PersistedTrialToken> tokens;
-
-  const base::Value::List* stored_value = storage_dict.FindList(origin_key);
-
-  if (stored_value) {
-    for (const base::Value& stored_dict : *stored_value) {
-      if (!stored_dict.is_dict()) {
-        continue;
-      }
-      absl::optional<PersistedTrialToken> token =
-          PersistedTrialToken::FromDict(stored_dict.GetDict());
-      if (token) {
-        tokens.insert(*std::move(token));
-      }
-    }
-  }
-  return tokens;
-}
-
-void PrefServicePersistenceProvider::SavePersistentTrialTokens(
-    const url::Origin& origin,
-    const base::flat_set<PersistedTrialToken>& tokens) {
-  DCHECK(!origin.opaque());
-  PrefService* service = pref_service();
-  DCHECK(service);
-  ScopedDictPrefUpdate update(service, kOriginTrialPrefKey);
-
-  base::Value::Dict& storage_dict = update.Get();
-  std::string origin_key = origin.Serialize();
-  if (tokens.empty()) {
-    if (storage_dict.contains(origin_key)) {
-      storage_dict.Remove(origin_key);
-    }
-  } else {
-    base::Value::List token_dicts;
-    for (const PersistedTrialToken& token : tokens) {
-      token_dicts.Append(token.AsDict());
-    }
-    storage_dict.Set(origin_key, std::move(token_dicts));
-  }
-}
-
-void PrefServicePersistenceProvider::ClearPersistedTokens() {
-  pref_service()->ClearPref(kOriginTrialPrefKey);
-}
-
-PrefService* PrefServicePersistenceProvider::pref_service() const {
-  return user_prefs::UserPrefs::Get(browser_context_);
-}
-
-// static
-std::unique_ptr<base::AutoReset<bool>>
-PrefServicePersistenceProvider::DisableCleanupExpiredTokensForTesting() {
-  return std::make_unique<base::AutoReset<bool>>(&g_cleanup_expired_tokens,
-                                                 false);
-}
-
-}  // namespace origin_trials
diff --git a/components/origin_trials/browser/prefservice_persistence_provider.h b/components/origin_trials/browser/prefservice_persistence_provider.h
deleted file mode 100644
index de9ac18..0000000
--- a/components/origin_trials/browser/prefservice_persistence_provider.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_ORIGIN_TRIALS_BROWSER_PREFSERVICE_PERSISTENCE_PROVIDER_H_
-#define COMPONENTS_ORIGIN_TRIALS_BROWSER_PREFSERVICE_PERSISTENCE_PROVIDER_H_
-
-#include <memory>
-
-#include "base/auto_reset.h"
-#include "base/containers/flat_set.h"
-#include "base/memory/raw_ptr.h"
-#include "base/values.h"
-#include "components/origin_trials/common/origin_trials_persistence_provider.h"
-#include "components/prefs/scoped_user_pref_update.h"
-#include "url/origin.h"
-
-class PrefRegistrySimple;
-class PrefService;
-
-namespace content {
-class BrowserContext;
-}  // namespace content
-
-namespace origin_trials {
-
-extern const char kOriginTrialPrefKey[];
-
-class PrefServicePersistenceProvider : public OriginTrialsPersistenceProvider {
- public:
-  // The persistence provider does not own the |browser_context|
-  explicit PrefServicePersistenceProvider(
-      content::BrowserContext* browser_context);
-  PrefServicePersistenceProvider(PrefServicePersistenceProvider&) = delete;
-  PrefServicePersistenceProvider& operator=(PrefServicePersistenceProvider&) =
-      delete;
-
-  ~PrefServicePersistenceProvider() override;
-
-  // Register the preference key used by the PersistenceProvider.
-  // This call should _not_ be guarded by the
-  // |features::kPersistentOriginTrialsEnabled| feature flag, as it happens
-  // before feature flags are parsed in certain cases.
-  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
-
-  void DeleteExpiredTokens(base::Time current_time);
-
-  // OriginTrialPersistenceProvider implementation
-  base::flat_set<PersistedTrialToken> GetPersistentTrialTokens(
-      const url::Origin& origin) override;
-  void SavePersistentTrialTokens(
-      const url::Origin& origin,
-      const base::flat_set<PersistedTrialToken>& tokens) override;
-  void ClearPersistedTokens() override;
-
-  // For testing. Will automatically re-enable once the returned unique_ptr is
-  // destroyed
-  [[nodiscard]] static std::unique_ptr<base::AutoReset<bool>>
-  DisableCleanupExpiredTokensForTesting();
-
- private:
-  // This object is owned by another object whose lifetime is bound to that of
-  // |browser_context_|, so raw_ptr is safe.
-  raw_ptr<content::BrowserContext> browser_context_;
-  base::WeakPtrFactory<PrefServicePersistenceProvider> weak_ptr_factory_{this};
-
-  PrefService* pref_service() const;
-};
-
-}  // namespace origin_trials
-
-#endif  // COMPONENTS_ORIGIN_TRIALS_BROWSER_PREFSERVICE_PERSISTENCE_PROVIDER_H_
diff --git a/components/origin_trials/browser/prefservice_persistence_provider_unittest.cc b/components/origin_trials/browser/prefservice_persistence_provider_unittest.cc
deleted file mode 100644
index 0b7919b..0000000
--- a/components/origin_trials/browser/prefservice_persistence_provider_unittest.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/origin_trials/browser/prefservice_persistence_provider.h"
-
-#include <memory>
-
-#include "base/auto_reset.h"
-#include "base/containers/flat_set.h"
-#include "base/test/task_environment.h"
-#include "base/time/clock.h"
-#include "base/time/time.h"
-#include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "components/user_prefs/user_prefs.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/test/test_renderer_host.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/origin_trials/scoped_test_origin_trial_policy.h"
-#include "url/gurl.h"
-#include "url/origin.h"
-
-namespace origin_trials {
-namespace {
-
-const char kPersistentTrialName[] = "FrobulatePersistent";
-
-const char kDummySignature[] = "dummy signature";
-
-class PrefServicePersistenceProviderUnitTest
-    : public content::RenderViewHostTestHarness {
- public:
-  PrefServicePersistenceProviderUnitTest()
-      : content::RenderViewHostTestHarness(
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME),
-        trial_enabled_origin_(
-            url::Origin::Create(GURL("https://enabled.example.com"))) {}
-
-  PrefServicePersistenceProviderUnitTest(
-      const PrefServicePersistenceProviderUnitTest&) = delete;
-  PrefServicePersistenceProviderUnitTest& operator=(
-      const PrefServicePersistenceProviderUnitTest&) = delete;
-
-  ~PrefServicePersistenceProviderUnitTest() override = default;
-
-  void SetUp() override {
-    RenderViewHostTestHarness::SetUp();
-    user_prefs::UserPrefs::Set(browser_context(), &prefs_);
-    disable_cleanup_expired_tokens_ =
-        PrefServicePersistenceProvider::DisableCleanupExpiredTokensForTesting();
-    PrefServicePersistenceProvider::RegisterProfilePrefs(prefs_.registry());
-    persistence_provider_ =
-        std::make_unique<PrefServicePersistenceProvider>(browser_context());
-  }
-
-  void TearDown() override {
-    persistence_provider_ = nullptr;
-    RenderViewHostTestHarness::TearDown();
-  }
-
-  const base::Value::List* GetPrefListForOrigin(const url::Origin& origin) {
-    const base::Value::Dict& stored_prefs = prefs_.GetDict(kOriginTrialPrefKey);
-    return stored_prefs.FindList(origin.Serialize());
-  }
-
- protected:
-  std::unique_ptr<base::AutoReset<bool>> disable_cleanup_expired_tokens_;
-  sync_preferences::TestingPrefServiceSyncable prefs_;
-  std::unique_ptr<PrefServicePersistenceProvider> persistence_provider_;
-  url::Origin trial_enabled_origin_;
-  blink::ScopedTestOriginTrialPolicy origin_trial_policy_;
-};
-
-TEST_F(PrefServicePersistenceProviderUnitTest, NewProviderHasNoStoredTrials) {
-  EXPECT_TRUE(
-      persistence_provider_->GetPersistentTrialTokens(trial_enabled_origin_)
-          .empty());
-}
-
-TEST_F(PrefServicePersistenceProviderUnitTest, StoredTrialsCanBeRetrieved) {
-  base::Time expiry = base::Time::Now() + base::Days(1);
-  base::flat_set<PersistedTrialToken> tokens = {
-      {kPersistentTrialName, expiry, blink::TrialToken::UsageRestriction::kNone,
-       kDummySignature}};
-  persistence_provider_->SavePersistentTrialTokens(trial_enabled_origin_,
-                                                   tokens);
-
-  base::flat_set<PersistedTrialToken> persisted_trials =
-      persistence_provider_->GetPersistentTrialTokens(trial_enabled_origin_);
-  EXPECT_EQ(tokens, persisted_trials);
-}
-
-TEST_F(PrefServicePersistenceProviderUnitTest, CleanupRemovesExpiredTokens) {
-  // Create points in time 1 day apart
-  base::Time expiry_1 = base::Time::Now() + base::Days(1);
-  base::Time expiry_2 = base::Time::Now() + base::Days(2);
-  base::Time expiry_3 = base::Time::Now() + base::Days(3);
-  base::Time expiry_4 = base::Time::Now() + base::Days(4);
-
-  // Persist tokens that expire 1 and 3 days from now
-  PersistedTrialToken token_1(kPersistentTrialName, expiry_1,
-                              blink::TrialToken::UsageRestriction::kNone,
-                              kDummySignature);
-  PersistedTrialToken token_3(kPersistentTrialName, expiry_3,
-                              blink::TrialToken::UsageRestriction::kNone,
-                              kDummySignature);
-  base::flat_set<PersistedTrialToken> tokens = {token_1, token_3};
-  persistence_provider_->SavePersistentTrialTokens(trial_enabled_origin_,
-                                                   tokens);
-
-  // Confirm that there are two stored prefs
-  const base::Value::List* origin_prefs =
-      GetPrefListForOrigin(trial_enabled_origin_);
-  ASSERT_TRUE(origin_prefs);
-  EXPECT_EQ(2UL, origin_prefs->size());
-
-  // Clean up tokens that expire before day 2
-  persistence_provider_->DeleteExpiredTokens(expiry_2);
-  // There should now only be one pref stored
-  origin_prefs = GetPrefListForOrigin(trial_enabled_origin_);
-  ASSERT_TRUE(origin_prefs);
-  EXPECT_EQ(1UL, origin_prefs->size());
-  absl::optional<PersistedTrialToken> remainingToken =
-      PersistedTrialToken::FromDict(origin_prefs->begin()->GetDict());
-  ASSERT_TRUE(remainingToken);
-  EXPECT_EQ(expiry_3, (*remainingToken).token_expiry);
-
-  // Clean up tokens that expire before day 4
-  persistence_provider_->DeleteExpiredTokens(expiry_4);
-  origin_prefs = GetPrefListForOrigin(trial_enabled_origin_);
-  // The origin key has been removed when there are no more tokens
-  EXPECT_FALSE(origin_prefs);
-}
-TEST_F(PrefServicePersistenceProviderUnitTest, ClearTokens) {
-  base::Time expiry = base::Time::Now() + base::Days(1);
-  base::flat_set<PersistedTrialToken> tokens = {
-      {kPersistentTrialName, expiry, blink::TrialToken::UsageRestriction::kNone,
-       kDummySignature}};
-  persistence_provider_->SavePersistentTrialTokens(trial_enabled_origin_,
-                                                   tokens);
-
-  EXPECT_TRUE(prefs_.HasPrefPath(kOriginTrialPrefKey));
-  persistence_provider_->ClearPersistedTokens();
-
-  EXPECT_FALSE(prefs_.HasPrefPath(kOriginTrialPrefKey));
-}
-
-}  // namespace
-
-}  // namespace origin_trials
diff --git a/components/origin_trials/common/persisted_trial_token.cc b/components/origin_trials/common/persisted_trial_token.cc
index c9fff21..f878aa1 100644
--- a/components/origin_trials/common/persisted_trial_token.cc
+++ b/components/origin_trials/common/persisted_trial_token.cc
@@ -15,20 +15,6 @@
 
 namespace {
 
-const char kExpiryTimeKey[] = "expiry";
-const char kSignatureKey[] = "signature";
-const char kTrialNameKey[] = "trial";
-const char kUsageKey[] = "usage";
-
-absl::optional<base::Time> TimeFromDict(const base::Value::Dict& dict,
-                                        const char* key) {
-  const base::Value* time_val = dict.Find(key);
-  if (!time_val) {
-    return absl::nullopt;
-  }
-  return base::ValueToTime(time_val);
-}
-
 auto to_tuple(const PersistedTrialToken& token) {
   return std::tie(token.trial_name, token.token_expiry, token.usage_restriction,
                   token.token_signature);
@@ -44,58 +30,16 @@
   return to_tuple(a) == to_tuple(b);
 }
 
-// static
-absl::optional<PersistedTrialToken> PersistedTrialToken::FromDict(
-    const base::Value::Dict& dict) {
-  const std::string* name = dict.FindString(kTrialNameKey);
-  if (!name) {
-    return absl::nullopt;
-  }
-
-  absl::optional<base::Time> expiry = TimeFromDict(dict, kExpiryTimeKey);
-  if (!expiry) {
-    return absl::nullopt;
-  }
-
-  absl::optional<int> usage = dict.FindInt(kUsageKey);
-  if (!usage) {
-    return absl::nullopt;
-  }
-
-  const std::string* signature_blob = dict.FindString(kSignatureKey);
-  if (!signature_blob) {
-    return absl::nullopt;
-  }
-
-  std::string signature_string;
-  if (!base::Base64Decode(*signature_blob, &signature_string)) {
-    return absl::nullopt;
-  }
-
-  return absl::make_optional<PersistedTrialToken>(
-      *name, *expiry, static_cast<blink::TrialToken::UsageRestriction>(*usage),
-      std::move(signature_string));
-}
-
-base::Value::Dict PersistedTrialToken::AsDict() const {
-  base::Value::Dict token_dict;
-
-  token_dict.Set(kTrialNameKey, trial_name);
-  token_dict.Set(kExpiryTimeKey, base::TimeToValue(token_expiry));
-  token_dict.Set(kUsageKey, static_cast<int>(usage_restriction));
-
-  // The signature is a binary blob, but the json writer used is not allowed to
-  // emit binary blobs, so saving it as base64.
-  // Simply saving it as a string will not work, as it may not be valid utf-8.
-  std::string signature_blob;
-  base::Base64Encode(token_signature, &signature_blob);
-  token_dict.Set(kSignatureKey, signature_blob);
-
-  return token_dict;
-}
-
 std::ostream& operator<<(std::ostream& out, const PersistedTrialToken& token) {
-  return out << token.AsDict();  // Dict already has a streaming operator.
+  out << "{";
+  out << "trial: " << token.trial_name << ", ";
+  out << "expiry: " << base::TimeToValue(token.token_expiry) << ", ";
+  out << "usage: " << static_cast<int>(token.usage_restriction) << ", ";
+  std::string signature_blob;
+  base::Base64Encode(token.token_signature, &signature_blob);
+  out << "signature: " << signature_blob;
+  out << "}";
+  return out;
 }
 
 }  // namespace origin_trials
diff --git a/components/origin_trials/common/persisted_trial_token.h b/components/origin_trials/common/persisted_trial_token.h
index cd30e86..214f7de 100644
--- a/components/origin_trials/common/persisted_trial_token.h
+++ b/components/origin_trials/common/persisted_trial_token.h
@@ -8,8 +8,6 @@
 #include <string>
 
 #include "base/time/time.h"
-#include "base/values.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/origin_trials/trial_token.h"
 
 namespace origin_trials {
@@ -29,14 +27,6 @@
         token_expiry(expiry),
         usage_restriction(usage),
         token_signature(std::move(signature)) {}
-
-  // Create a PersistedToken from a |Dict| previously created by
-  // |PersistedToken::AsDict|
-  static absl::optional<PersistedTrialToken> FromDict(
-      const base::Value::Dict& dict);
-
-  // Convert the |PersistedToken| to a dict
-  base::Value::Dict AsDict() const;
 };
 
 // Comparison operator to let us store PersistedTokens in a flat_set
diff --git a/components/origin_trials/common/persisted_trial_token_unittest.cc b/components/origin_trials/common/persisted_trial_token_unittest.cc
index e725e29..6b32e6a 100644
--- a/components/origin_trials/common/persisted_trial_token_unittest.cc
+++ b/components/origin_trials/common/persisted_trial_token_unittest.cc
@@ -92,58 +92,6 @@
       PersistedTrialToken("a", expiry, restriction_none, higher_signature));
 }
 
-TEST(PersistedTrialTokenTest, TokenToDictRoundTrip) {
-  PersistedTrialToken token("a", base::Time::Now(),
-                            blink::TrialToken::UsageRestriction::kNone,
-                            "signature");
-  EXPECT_EQ(token, PersistedTrialToken::FromDict(token.AsDict()));
-
-  token = PersistedTrialToken("a", base::Time::Now(),
-                              blink::TrialToken::UsageRestriction::kSubset,
-                              "signature");
-  EXPECT_EQ(token, PersistedTrialToken::FromDict(token.AsDict()));
-}
-
-TEST(PersistedTrialTokenTest, InvalidDictParsing) {
-  // Do not expect an empty dict to parse
-  EXPECT_FALSE(PersistedTrialToken::FromDict(base::Value::Dict()));
-
-  // Test that parsing fails if we remove one of the keys in a valid dict
-  PersistedTrialToken token("a", base::Time::Now(),
-                            blink::TrialToken::UsageRestriction::kNone,
-                            "token_signature");
-  const base::Value::Dict token_dict = token.AsDict();
-  for (const auto entry : token_dict) {
-    base::Value::Dict faulty_dict = token_dict.Clone();
-    faulty_dict.Remove(entry.first);
-    EXPECT_FALSE(PersistedTrialToken::FromDict(faulty_dict))
-        << "Did not expect dict to parse with key " << entry.first
-        << " missing.";
-  }
-
-  // Test that parsing fails if the signature cannot be base-64 decoded
-  base::Value::Dict faulty_dict = token_dict.Clone();
-  faulty_dict.Set("signature", "This is not valid Base64 data!");
-  EXPECT_FALSE(PersistedTrialToken::FromDict(faulty_dict));
-}
-
-TEST(PersistedTrialTokenTest, StreamOperatorTest) {
-  // Ensure that streaming the token produces the same result as converting
-  // to a dict and streaming that.
-  PersistedTrialToken token("a", base::Time::Now(),
-                            blink::TrialToken::UsageRestriction::kSubset,
-                            "signature");
-  std::ostringstream token_stream;
-  token_stream << token;
-  std::string token_str = token_stream.str();
-
-  std::ostringstream dict_stream;
-  dict_stream << token.AsDict();
-  std::string dict_str = dict_stream.str();
-
-  EXPECT_EQ(token_str, dict_str);
-}
-
 }  // namespace
 
 }  // namespace origin_trials
diff --git a/components/password_manager/core/browser/sync_credentials_filter_unittest.cc b/components/password_manager/core/browser/sync_credentials_filter_unittest.cc
index b2fa98bab..8af693d 100644
--- a/components/password_manager/core/browser/sync_credentials_filter_unittest.cc
+++ b/components/password_manager/core/browser/sync_credentials_filter_unittest.cc
@@ -164,7 +164,16 @@
   std::unique_ptr<SyncCredentialsFilter> filter_;
 };
 
-TEST_P(CredentialsFilterTest, ReportFormLoginSuccess_ExistingSyncCredentials) {
+// TODO(crbug.com/1404890): This test fails on iOS devices.
+#if BUILDFLAG(IS_IOS) && !TARGET_OS_SIMULATOR
+#define MAYBE_ReportFormLoginSuccess_ExistingSyncCredentials \
+  DISABLED_ReportFormLoginSuccess_ExistingSyncCredentials
+#else
+#define MAYBE_ReportFormLoginSuccess_ExistingSyncCredentials \
+  ReportFormLoginSuccess_ExistingSyncCredentials
+#endif
+TEST_P(CredentialsFilterTest,
+       MAYBE_ReportFormLoginSuccess_ExistingSyncCredentials) {
   FakeSigninAs("user@gmail.com");
   SetSyncingPasswords(true);
 
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
index 5e438a01..ae2fb4b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
@@ -262,8 +262,8 @@
                 removeUrlScheme(origin), removeUrlScheme(iframeOrigin), certificateChain,
                 WebPaymentIntentHelperTypeConverter.fromMojoPaymentMethodDataMap(methodDataMap),
                 /*clearIdFields=*/
-                PaymentFeatureList.isEnabled(
-                        PaymentFeatureList.CLEAR_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT));
+                !PaymentFeatureList.isEnabled(
+                        PaymentFeatureList.ADD_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT));
         if (mBypassIsReadyToPayServiceInTest) {
             respondToIsReadyToPayQuery(true);
             return;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
index 13b8b81..1b43956 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
@@ -18,7 +18,11 @@
 @JNINamespace("payments::android")
 public class PaymentFeatureList {
     /** Alphabetical: */
+    public static final String ADD_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT =
+            "AddIdentityInCanMakePaymentEvent";
     public static final String ANDROID_APP_PAYMENT_UPDATE_EVENTS = "AndroidAppPaymentUpdateEvents";
+    // TODO(crbug.com/1290492): Remove when all call sites switch to
+    // AddIdentityInCanMakePaymentEvent.
     public static final String CLEAR_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT =
             "ClearIdentityInCanMakePaymentEvent";
     public static final String ENFORCE_FULL_DELEGATION = "EnforceFullDelegation";
diff --git a/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java b/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java
index 5288bfd..df5c096 100644
--- a/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java
+++ b/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java
@@ -36,6 +36,10 @@
         ShadowPaymentFeatureList.setFeatureEnabled(
                 PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION, true);
         ShadowPaymentFeatureList.setFeatureEnabled(
+                PaymentFeatureList.ADD_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT, false);
+        // TODO(crbug.com/1290492): Remove when all call sites switch to
+        // AddIdentityInCanMakePaymentEvent.
+        ShadowPaymentFeatureList.setFeatureEnabled(
                 PaymentFeatureList.CLEAR_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT, false);
     }
 
diff --git a/components/payments/content/android/payment_feature_list.cc b/components/payments/content/android/payment_feature_list.cc
index 48f56d2..947d9d6 100644
--- a/components/payments/content/android/payment_feature_list.cc
+++ b/components/payments/content/android/payment_feature_list.cc
@@ -23,6 +23,9 @@
 // third_party/blink/public/common/features_generated.h, or the .h file (for
 // Android only features).
 const base::Feature* const kFeaturesExposedToJava[] = {
+    &::blink::features::kAddIdentityInCanMakePaymentEvent,
+    // TODO(crbug.com/1290492): Remove when all call sites switch to
+    // AddIdentityInCanMakePaymentEvent.
     &::blink::features::kClearIdentityInCanMakePaymentEvent,
     &::features::kSecurePaymentConfirmation,
     &::features::kServiceWorkerPaymentApps,
@@ -41,8 +44,9 @@
 
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
   for (const base::Feature* feature : kFeaturesExposedToJava) {
-    if (feature->name == feature_name)
+    if (feature->name == feature_name) {
       return feature;
+    }
   }
   NOTREACHED() << "Queried feature cannot be found in PaymentsFeatureList: "
                << feature_name;
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 15979919..33581f9 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1330,6 +1330,9 @@
       Diese Richtlinie überschreibt <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> und die Nutzereinstellungen.
 
       Sie wirkt sich nur auf den Zugriff auf USB-Geräte über die Web Serial API aus. Sieh dir für die Gewährung des Zugriffs auf USB-Geräte über die WebUSB API die Richtlinie <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> an.</translation>
+<translation id="2246011554082893079">Steuert die Verfügbarkeit von <ph name="BOREALIS_NAME" /> für dieses Gerät.
+
+      Wenn die Richtlinie auf „false“ gesetzt ist, steht <ph name="BOREALIS_NAME" /> Nutzern dieses Geräts nicht zur Verfügung. Wenn die Richtlinie nicht konfiguriert oder auf „true“ gesetzt ist, ist <ph name="BOREALIS_NAME" /> verfügbar, sofern die Richtlinie nicht durch eine andere Richtlinie oder Einstellung außer Kraft gesetzt wird.</translation>
 <translation id="2246621891161157804">Chrome erlauben, das Aufrufen externer Protokolle in einem Sandbox-iFrame zu blockieren</translation>
 <translation id="224750967938323855">Einwilligung zur Synchronisierung während der Anmeldung nicht anzeigen</translation>
 <translation id="2252400912879027343">WebSQL bleibt in nicht sicheren Kontexten bis M109 verfügbar und ist dann ab M110 nicht mehr verfügbar.</translation>
@@ -2621,11 +2624,6 @@
 <translation id="3412937883532015092">Wenn für die Richtlinie eine Zahl festgelegt ist, zeigt <ph name="PRODUCT_NAME" /> für genau diese Anzahl von Millisekunden eine Nachricht an und öffnet dann den alternativen Browser.
 
       Ist die Richtlinie nicht konfiguriert oder auf 0 gesetzt, wird eine bestimmte aufgerufene URL sofort in einem alternativen Browser geöffnet.</translation>
-<translation id="3413763534078822244">Diese Richtlinie wurde eingestellt. Bitte verwende stattdessen die Richtlinie „<ph name="USER_BOREALIS_ALLOWED_NAME" />“.
-
-      Steuert die Verfügbarkeit von <ph name="BOREALIS_NAME" /> für dieses Gerät.
-
-      Wenn die Richtlinie auf „false“ gesetzt ist, steht <ph name="BOREALIS_NAME" /> Nutzern dieses Geräts nicht zur Verfügung. Wenn die Richtlinie nicht konfiguriert oder auf „true“ gesetzt ist, ist <ph name="BOREALIS_NAME" /> verfügbar, sofern die Richtlinie nicht durch eine andere Richtlinie oder Einstellung außer Kraft gesetzt wird.</translation>
 <translation id="3415954062311826850">Diese Richtlinie wird in ARC nicht unterstützt.</translation>
 <translation id="34160070798637152">Legt die Netzwerkkonfiguration für das gesamte Gerät fest.</translation>
 <translation id="3417130629744653218">Websites erlauben, verfügbare Zahlungsmethoden abzufragen.</translation>
@@ -4341,6 +4339,17 @@
 <translation id="519247340330463721">Hiermit werden die Safe Browsing-Richtlinien konfiguriert.</translation>
 <translation id="5194683382395300627">Verwendung von <ph name="ASSISTANT_PRODUCT_NAME" /> im Web zulassen, z. B. um das automatische Ändern von Passwörtern zu ermöglichen</translation>
 <translation id="5196630732055960309">File Handling API bei diesen Webanwendungen erlauben</translation>
+<translation id="5198660575318473544">Mit dieser Richtlinie kann festgelegt werden, ob Manifest V2-Erweiterungen auf dem <ph name="PRODUCT_OS_NAME" />-Anmeldebildschirm verwendet werden können.
+
+Die Unterstützung für Manifest V2-Erweiterungen wird eingestellt. Alle Erweiterungen müssen dann zu V3 migriert werden. Weitere Informationen und den Zeitplan für die Migration findest du unter https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
+
+Wenn die Richtlinie auf „<ph name="DEFAULT" />“ (0) gesetzt oder nicht konfiguriert ist, werden V2-Erweiterungen abhängig vom Gerät und gemäß dem obigen Zeitplan geladen.
+Ist die Richtlinie auf „<ph name="DISABLE" />“ (1) gesetzt, wird das Installieren von V2-Erweiterungen blockiert und vorhandene V2-Erweiterungen werden deaktiviert. Nachdem die V2-Unterstützung standardmäßig deaktiviert wurde, wird die Option so behandelt, als wäre die Richtlinie nicht konfiguriert.
+Ist die Richtlinie auf „<ph name="ENABLE" />“ (2) gesetzt, sind V2-Erweiterungen zulässig. Bevor die V2-Unterstützung standardmäßig deaktiviert wird, wird die Option so behandelt, als wäre die Richtlinie nicht konfiguriert.
+Wenn die Richtlinie auf „<ph name="ENABLE_FOR_FORCED_EXTENSIONS" />“ (3) gesetzt ist, sind V2-Erweiterungen mit erzwungener Installation zulässig. Dazu gehören Erweiterungen, die in „<ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />“ oder „<ph name="EXTENSION_SETTINGS_POLICY_NAME" />“ mit „<ph name="INSTALLATION_MODE" />“ auf „force_installed“ oder „normal_installed“ aufgeführt sind. Alle anderen V2-Erweiterungen werden deaktiviert. Bevor die V2-Unterstützung standardmäßig deaktiviert wird, wird die Option so behandelt, als wäre die Richtlinie nicht konfiguriert.
+
+
+Die Verfügbarkeit von Erweiterungen wird weiterhin über andere Richtlinien festgelegt.</translation>
 <translation id="5206454085187851382">Wenn <ph name="PRINTERS_ALLOWLIST" /> für <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> ausgewählt ist, wird durch Festlegen von <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> angegeben, welche Drucker die Nutzer verwenden können. Den Nutzern stehen nur die Drucker zur Verfügung, deren IDs mit den Werten in dieser Richtlinie übereinstimmen. Die IDs müssen dem Feld <ph name="ID_FIELD" /> oder dem Feld <ph name="GUID_FIELD" /> in der Datei entsprechen, die in <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> angegeben ist.</translation>
 <translation id="5207543664699568887">Mit der Richtlinie wird konfiguriert, ob <ph name="PRODUCT_NAME" /> unter Linux Systembenachrichtigungen verwendet.
 
@@ -4787,6 +4796,7 @@
 <translation id="5599461642204007579"><ph name="MS_AD_NAME" />-Verwaltungseinstellungen</translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5607021831414604820">Melden des Speicherstatus auf Geräten aktivieren</translation>
+<translation id="5608114828230655271">Standardverhalten des Geräts</translation>
 <translation id="5614865701790130558">Ereignisse für richtlinienbasierte Erweiterungsinstallationen protokollieren</translation>
 <translation id="5618398258385745432">Die entsprechende Einstellung wurde verwendet, bevor die erneute Authentifizierung bei der Ansicht von Passwörtern aktiviert wurde. Seither haben die Einstellung und folglich auch diese Richtlinie keinen Einfluss auf das Verhalten von Chrome. Aktuell werden Passwörter auf der Einstellungsseite des Passwortmanagers nicht als Klartext angezeigt. Dies bedeutet, dass die Einstellungsseite nur einen Platzhalter enthält und das Passwort in Chrome nur dann angezeigt wird, wenn der Nutzer auf "Anzeigen" klickt und sich gegebenenfalls noch einmal authentifiziert. Die ursprüngliche Beschreibung der Richtlinie findest du unten.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index ef22ffe..98df9ee 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1008,6 +1008,11 @@
 <translation id="1962864958436828230">Establecer el límite de tamaño mínimo para los datos del portapapeles mediante la restricción destinada a evitar la filtración de datos</translation>
 <translation id="1964634611280150550">Modo incógnito inhabilitado</translation>
 <translation id="1964802606569741174">Esta política no tiene efecto en la app de YouTube de Android. Si se debe aplicar el modo de seguridad en YouTube, se debe inhabilitar la instalación de la app de YouTube de Android.</translation>
+<translation id="1964985353230379667">Especifica la configuración sugerida de <ph name="KRB5_CONFIG" /> para los nuevos tickets creados manualmente.
+
+      Si habilitas la política "KerberosUseCustomPrefilledConfig", su valor se aplicará como la configuración sugerida y se mostrará en la sección "Configuración avanzada" del diálogo de autenticación de Kerberos. Si estableces esta política como una string vacía o no la estableces, se borrará la configuración recomendada de <ph name="PRODUCT_OS_NAME" />.
+
+      Si inhabilitas la política "KerberosUseCustomPrefilledConfig", no se usará su valor.</translation>
 <translation id="1969212217917526199">Anula las políticas en compilaciones de depuración del host de acceso remoto.
 
           El valor se analiza como un diccionario JSON de asignaciones de nombre de política a valor de política.</translation>
@@ -1336,6 +1341,9 @@
       Esta política anula las políticas <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" /> y <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />, y las preferencias del usuario.
 
       Esta política solo afecta el acceso a dispositivos USB a través de la API de Web Serial. Para otorgar el acceso a dispositivos USB a través de la API de WebUSB, consulta la política <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Controla la disponibilidad de <ph name="BOREALIS_NAME" /> para este dispositivo.
+
+      Si estableces la política como falsa, <ph name="BOREALIS_NAME" /> no estará disponible para todos los usuarios del dispositivo. De lo contrario, si no estableces la política o la estableces como verdadera, <ph name="BOREALIS_NAME" /> estará disponible únicamente si no hay otra política o configuración que la inhabilite.</translation>
 <translation id="2246621891161157804">Permitir que Chrome bloquee la navegación a protocolos externos dentro de iframes de la zona de pruebas</translation>
 <translation id="224750967938323855">No mostrar el consentimiento de sincronización durante el acceso</translation>
 <translation id="2252400912879027343">WebSQL en contextos no seguros permanecerá disponible hasta M109 y, luego, no estará disponible a partir de M110.</translation>
@@ -2633,11 +2641,6 @@
 <translation id="3412937883532015092">Si asignas un número a la política, <ph name="PRODUCT_NAME" /> mostrará un mensaje durante esa cantidad de milisegundos y, luego, abrirá un navegador alternativo.
 
       Si no estableces la política o la estableces con el valor "0", la navegación a una URL desginada la abrirá de inmediato en un navegador alternativo.</translation>
-<translation id="3413763534078822244">Esta política dejó de estar disponible; usa <ph name="USER_BOREALIS_ALLOWED_NAME" /> en su lugar.
-
-      Controla la disponibilidad de <ph name="BOREALIS_NAME" /> para este dispositivo.
-
-      Si estableces la política como falsa, <ph name="BOREALIS_NAME" /> no estará disponible para todos los usuarios del dispositivo. De lo contrario, si no estableces la política o la estableces como verdadera, <ph name="BOREALIS_NAME" /> estará disponible únicamente si no hay otra política o configuración que la inhabilite.</translation>
 <translation id="3415954062311826850">No se admite esta política en ARC.</translation>
 <translation id="34160070798637152">Controla la configuración de red en todo el dispositivo.</translation>
 <translation id="3417130629744653218">Permite que los sitios web consulten las formas de pago disponibles.</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index cbd4773..e2d5405f1 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -1005,6 +1005,11 @@
 <translation id="1962864958436828230">Establecer un límite de tamaño mínimo para la restricción del portapapeles que previene la filtración de datos</translation>
 <translation id="1964634611280150550">Modo Incógnito inhabilitado</translation>
 <translation id="1964802606569741174">Esta política no influye en la aplicación YouTube para Android. Si se debe aplicar el modo Seguro en YouTube, deberás inhabilitar la descarga de la aplicación YouTube para Android.</translation>
+<translation id="1964985353230379667">Especifica la configuración sugerida de <ph name="KRB5_CONFIG" /> para los nuevos tickets creados manualmente.
+
+      Si se habilita la política KerberosUseCustomPrefilledConfig, se aplicará el valor de esta política como configuración sugerida y se mostrará en la sección Configuración avanzada del cuadro de diálogo de autenticación de Kerberos. Si no se define esta política o se le asigna una cadena vacía, se eliminará la configuración recomendada de <ph name="PRODUCT_OS_NAME" />.
+
+      Si se inhabilita la política KerberosUseCustomPrefilledConfig, no se usará el valor de esta política.</translation>
 <translation id="1969212217917526199">Anula las políticas de compilaciones de depuración del host de acceso remoto.
 
           El valor se analiza como un diccionario JSON del nombre de política para las asignaciones de valores de la política.</translation>
@@ -1265,7 +1270,7 @@
 <translation id="2197625019569762163">Si se asigna el valor "true" a esta política, se mostrará un teclado numérico por defecto para introducir la contraseña en la pantalla de inicio de sesión. Si quieren, los usuarios pueden cambiar al teclado normal.
 
       Si se configura la política, los usuarios no podrán cambiarla. Si no se le asigna ningún valor o se le asigna el valor "false", no tiene ningún efecto.</translation>
-<translation id="2200698565850397198">Configurar la lista de bloqueados de mensajes nativos</translation>
+<translation id="2200698565850397198">Configurar la lista de bloqueados de mensajería nativa</translation>
 <translation id="220157212534775145">Volver a habilitar la interfaz asíncrona obsoleta para <ph name="FILE_SYSTEM_SYNC_ACCESS_HANDLE" /> en la API File System Access</translation>
 <translation id="2202787915587511214">Activar NTLMv2</translation>
 <translation id="2204379573346866896">Minutos transcurridos en la hora actual.</translation>
@@ -1333,6 +1338,9 @@
       Esta política anula las políticas <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" /> y <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />, así como las preferencias del usuario.
 
       Esta política solo afecta al acceso a los dispositivos USB a través de la API Web Serial. Para conceder acceso a dispositivos USB a través de la API WebUSB, consulta la política <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Controla la disponibilidad de <ph name="BOREALIS_NAME" /> en este dispositivo.
+
+      Si se le asigna el valor false, <ph name="BOREALIS_NAME" /> no estará disponible para ningún usuario del dispositivo. Si, por el contrario, se le asigna el valor true o no se le asigna ningún valor, <ph name="BOREALIS_NAME" /> estará disponible únicamente si no lo desactiva otra política o ajuste.</translation>
 <translation id="2246621891161157804">Permitir que Chrome bloquee el acceso a protocolos externos dentro de iframes en entornos aislados</translation>
 <translation id="224750967938323855">No mostrar Sync Consent durante el inicio de sesión</translation>
 <translation id="2252400912879027343">WebSQL en contextos no seguros seguirá disponible hasta la versión M109 y, a partir de la M110, dejará de admitirse</translation>
@@ -1437,7 +1445,7 @@
 
       A partir de la versión 91, ya no se le pueden asignar los valores "tls1" o "tls1.1" a esta política. Ya no es posible ocultar la advertencia TLS 1.0/1.1.</translation>
 <translation id="2364639863953745682">Modo de la experiencia de incorporación del Asistente</translation>
-<translation id="2366301887862414321">Permitir hosts de mensajes nativos a nivel de sistema y a nivel de usuario</translation>
+<translation id="2366301887862414321">Permitir hosts de mensajería nativa a nivel de sistema y a nivel de usuario</translation>
 <translation id="2373014700224092497">Permitir que los usuarios añadan cuentas de Kerberos</translation>
 <translation id="2376134474855349829">Inhabilitar el teclado en pantalla en la pantalla de inicio de sesión y permitir que el usuario lo habilite temporalmente</translation>
 <translation id="2382672620906337383">setTimeout() de JavaScript no se restringirá hasta alcanzar un umbral de anidación superior.</translation>
@@ -1567,7 +1575,7 @@
       Si estableces esta política, los usuarios no podrán cambiarla ni anularla.
 
       Si no se establece esta política, la función Clic de llamada se habilitará de forma predeterminada.</translation>
-<translation id="2482676533225429905">Mensajes nativos</translation>
+<translation id="2482676533225429905">Mensajería nativa</translation>
 <translation id="2483146640187052324">Predecir las acciones de red en cualquier conexión de red</translation>
 <translation id="2489558694350871332">Permitir que el dispositivo ejecute máquinas virtuales</translation>
 <translation id="2492240920793040106">Habilitar los informes sobre datos del sistema y contenido de páginas para ayudar a mejorar la función Navegación segura</translation>
@@ -1827,7 +1835,7 @@
 <translation id="274769314493317695">Si se utiliza <ph name="PRINTERS_WHITELIST" /> para la política <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME" />, al establecer la política <ph name="NATIVE_PRINTERS_BULK_WHITELIST_POLICY_NAME" />, esta especifica qué impresoras pueden utilizar los usuarios. Solo las impresoras cuyos ID coincidan con los valores incluidos en la política estarán disponibles para el usuario. Los ID deben coincidir con los campos <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del archivo definido en la política <ph name="NATIVE_PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.
 
       Esta política está obsoleta. Usa <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> en su lugar.</translation>
-<translation id="2752046642026416564">Si se habilita esta política o no se le asigna ningún valor, <ph name="PRODUCT_NAME" /> puede usar los hosts de mensajes nativos instalados a nivel de usuario.
+<translation id="2752046642026416564">Si se habilita esta política o no se le asigna ningún valor, <ph name="PRODUCT_NAME" /> puede usar los hosts de mensajería nativa instalados a nivel de usuario.
 
       Si se inhabilita, <ph name="PRODUCT_NAME" /> solo podrá usar estos hosts si han sido instalados a nivel de sistema.</translation>
 <translation id="2753637905605932878">Restringe el intervalo de puertos UDP locales utilizado por WebRTC</translation>
@@ -2397,9 +2405,9 @@
       Si se habilita esta política, a los usuarios se les ofrecerá la opción de seleccionar dispositivos de emisión mediante un código de acceso o un código QR.
       Si se inhabilita esta política o no se establece, a los usuarios no se les ofrecerá la opción de seleccionar dispositivos de emisión mediante un código de acceso o un código QR.</translation>
 <translation id="3208615748170745525">Días desde que se descubrió la actualización.</translation>
-<translation id="3210408472559816322">Si se establece esta política, se especificará qué hosts de mensajes nativos no se deben cargar. Un valor de lista de bloqueados de <ph name="WILDCARD_VALUE" /> significa que todos los hosts de mensajes nativos han sido denegados, excepto los que estén permitidos explícitamente.
+<translation id="3210408472559816322">Si se establece esta política, se especificará qué hosts de mensajería nativa no se deben cargar. Un valor de lista de bloqueados de <ph name="WILDCARD_VALUE" /> significa que todos los hosts de mensajería nativa han sido denegados, excepto los que estén permitidos explícitamente.
 
-      Si no se le asigna un valor a la política, <ph name="PRODUCT_NAME" /> cargará todos los hosts de mensajes nativos instalados.</translation>
+      Si no se le asigna un valor a la política, <ph name="PRODUCT_NAME" /> cargará todos los hosts de mensajería nativa instalados.</translation>
 <translation id="3211426942294667684">Configuración de inicio de sesión en el navegador</translation>
 <translation id="3217774577897351942">La API <ph name="OFFSET_PARENT" /> se va a modificar en <ph name="PRODUCT_NAME" /> para ajustarse a los cambios que se han hecho en <ph name="FIREFOX_PRODUCT_NAME" /> y <ph name="SAFARI_PRODUCT_NAME" />. Esta política revierte el comportamiento anterior hasta la versión M120.
 
@@ -2627,11 +2635,6 @@
 <translation id="3412937883532015092">Si a esta política se le asigna un número como valor, <ph name="PRODUCT_NAME" /> mostrará un mensaje durante ese número de milisegundos y después abrirá un navegador alternativo.
 
       Si no se le asigna ningún valor o el valor es 0 (cero), al ir a una URL designada se abrirá inmediatamente en un navegador alternativo.</translation>
-<translation id="3413763534078822244">Esta política está obsoleta. Usa <ph name="USER_BOREALIS_ALLOWED_NAME" /> en su lugar.
-
-      Controla la disponibilidad de <ph name="BOREALIS_NAME" /> en este dispositivo.
-
-      Si se asigna el valor false a esta política, <ph name="BOREALIS_NAME" /> no estará disponible para ningún usuario del dispositivo. Si se asigna el valor true a esta política o no se define, <ph name="BOREALIS_NAME" /> estará disponible únicamente si ninguna otra política o ajuste lo inhabilita.</translation>
 <translation id="3415954062311826850">Esta política no se admite en ARC.</translation>
 <translation id="34160070798637152">Controla la configuración de red de todo el dispositivo.</translation>
 <translation id="3417130629744653218">Permite a los sitios web consultar los métodos de pago disponibles.</translation>
@@ -2694,7 +2697,7 @@
 <translation id="3483585138745445814">Permitir que los usuarios habiliten Compartir con Nearby</translation>
 <translation id="348495353354674884">Habilitar teclado virtual</translation>
 <translation id="3485200437120267231">Inhabilitar interceptación de inicio de sesión</translation>
-<translation id="3487651201232258606">Mensajes nativos</translation>
+<translation id="3487651201232258606">Mensajería nativa</translation>
 <translation id="3492351353716550742">No usar una política de referente predeterminada de no-referrer-when-downgrade.</translation>
 <translation id="3492834335089638487">Esta política controla el uso de aplicaciones Android de fuentes que no son de confianza (distintas a Google Play Store) en un dispositivo.
 
@@ -5634,7 +5637,7 @@
 <translation id="6404360891305375004">Permitir sistemas de archivos compartidos en red</translation>
 <translation id="6407093060083181305">Configurar lista de bloqueados de instalación de extensiones</translation>
 <translation id="640827304541402854">Inhabilitar cruce de cortafuegos desde un host de acceso remoto</translation>
-<translation id="6412352702230183710">Permitir solo hosts de mensajes nativos a nivel de sistema</translation>
+<translation id="6412352702230183710">Permitir solo hosts de mensajería nativa a nivel de sistema</translation>
 <translation id="6417265370957905582">Asistente de Google</translation>
 <translation id="6422575351619065453">En modo Kiosco, permite controlar si se muestra el menú de accesibilidad flotante.
 
@@ -5672,7 +5675,7 @@
 <translation id="6458361632497500815">Si se habilita la política o no se establece, los usuarios podrán usar <ph name="PRODUCT_CROSTINI_NAME" /> siempre y cuando estén habilitadas las 3 políticas <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" />, <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> y <ph name="DEVICE_UNAFFILIATED_CROSTINI_ALLOWED_POLICY_NAME" />. Si se inhabilita la política, los usuarios no afiliados no podrán usar <ph name="PRODUCT_CROSTINI_NAME" />. En caso de inhabilitar la política, esto se aplicará a los nuevos contenedores de <ph name="PRODUCT_CROSTINI_NAME" /> que se empiecen a usar, pero no a los que ya estén ejecutándose.</translation>
 <translation id="6462604655173570082">Si esta política se habilita o no se establece, los usuarios podrán ver y usar el botón <ph name="GOOGLE_LENS_PRODUCT_NAME" /> en el cuadro de búsqueda de la página Nueva pestaña. Si esta política se inhabilita, los usuarios no verán el botón <ph name="GOOGLE_LENS_PRODUCT_NAME" /> en el cuadro de búsqueda de la página Nueva pestaña.</translation>
 <translation id="6464074037294098618">Habilitar la función Autocompletar para direcciones</translation>
-<translation id="6467613372414922590">Permitir hosts de mensajes nativos en el nivel de usuario (instalados sin permisos de administrador)</translation>
+<translation id="6467613372414922590">Permitir hosts de mensajería nativa en el nivel de usuario (instalados sin permisos de administrador)</translation>
 <translation id="6473623140202114570">Configura la lista de dominios en los que la Navegación segura no activará advertencias.</translation>
 <translation id="6474194795370862403">Se usará el comportamiento anterior de offsetParent.</translation>
 <translation id="647645276885673708">Habilitar <ph name="LACROS_NAME" /> y convertirlo en el navegador principal</translation>
@@ -6517,7 +6520,7 @@
 
       Si la política no se configura o no se le asigna ningún valor, el usuario puede establecer cualquier cuenta de Google como la cuenta principal de navegador en <ph name="PRODUCT_NAME" />.</translation>
 <translation id="723103540848640830">Configurar la longitud mínima del PIN para la pantalla de bloqueo</translation>
-<translation id="7234280155140786597">Nombres de hosts de mensajes nativos no permitidos (o * para todos)</translation>
+<translation id="7234280155140786597">Nombres de hosts de mensajería nativa no permitidos (o * para todos)</translation>
 <translation id="723621412149834592">Si se le asigna el valor <ph name="BLOCK_WINDOW_PLACEMENT_POLICY_NAME" /> (valor 2) a esta política, se niega automáticamente el permiso de colocación de ventanas en los sitios de forma predeterminada. Esto limitará la habilidad de los sitios de ver información sobre las pantallas de los dispositivos y usarla para abrir y colocar ventanas, o solicitar la pantalla completa en pantallas específicas.
 
       Si se le asigna el valor <ph name="ASK_WINDOW_PLACEMENT_POLICY_NAME" /> (valor 3), se avisará al usuario cuando el permiso de colocación de ventanas se pida de forma predeterminada. Si los usuarios dan permiso, se extenderá la habilidad de los sitios para ver información sobre las pantallas de los dispositivos y usarla para abrir y colocar ventanas, o solicitar la pantalla completa en pantallas específicas.
@@ -6595,7 +6598,7 @@
       Si se asigna el valor False a esta política o no se define, <ph name="PRODUCT_NAME" /> usará la configuración que se esté aplicando en ese momento para comprobar la revocación online.
 
       En <ph name="MAC_OS_NAME" />, esta política no tendrá efecto si se asigna el valor False a la política <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" />.</translation>
-<translation id="7278854311116092134">Nombres de hosts de mensajes nativos que se deben excluir de la lista de bloqueados</translation>
+<translation id="7278854311116092134">Nombres de hosts de mensajería nativa que se deben excluir de la lista de bloqueados</translation>
 <translation id="7291084543582732020">Si habilitas esta opción, los usuarios podrán utilizar Smart Lock siempre que se cumplan los requisitos establecidos para la función.
 
       Si inhabilitas esta opción, los usuarios no podrán utilizar Smart Lock.
@@ -7290,7 +7293,7 @@
 <translation id="8006921530139404577">Si se inhabilita esta política, no se mostrará la UI relacionada con la conexión (por ejemplo, la ventana de desconexión) para las conexiones de acceso remoto que no estén en el modo de cortina. Las sesiones de acceso remoto en modo de cortina y las sesiones de asistencia remotas no se ven afectadas por esta política.
 
           Esta política no tendrá efecto si se le asigna el valor "True", se deja vacía o no se le asigna ningún valor.</translation>
-<translation id="8008421342605619236">Configura las políticas de los mensajes nativos. No se permitirán los hosts de mensajes nativos bloqueados si no se incluyen en la lista de permitidos.</translation>
+<translation id="8008421342605619236">Configura las políticas de mensajería nativa. No se permitirán los hosts de mensajería nativa bloqueados si no se incluyen en la lista de permitidos.</translation>
 <translation id="8011935490612940798">Controlar la función <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8013646845541206453">Usar cualquier verificador de certificados</translation>
 <translation id="8013739405949922317">Esta opción ya no está disponible. Usa <ph name="LACROS_AVAILABILITY_POLICY_NAME" /> en su lugar.
@@ -7491,7 +7494,7 @@
 <translation id="8217664958939773083">Si a esta política se le asigna el valor <ph name="ENABLED" /> o no se le asigna ninguno, se podrá utilizar el modo sin interfaz gráfica. Si se le asigna el valor <ph name="DISABLED" />, no se podrá utilizar el modo sin interfaz gráfica.</translation>
 <translation id="8219813789911069300">Bloquea las descargas maliciosas. Recomendado.</translation>
 <translation id="8220023426952118761">Velocidad de descarga deseada en kilobits por segundo.</translation>
-<translation id="8220156281401380422">Configurar la lista de permitidos de mensajes nativos</translation>
+<translation id="8220156281401380422">Configurar la lista de permitidos de mensajería nativa</translation>
 <translation id="822055204938220476">Lista de URLs que pueden permanecer en modo de pantalla completa sin que se muestre una notificación</translation>
 <translation id="8222103851860031829">Controla el teclado en pantalla y actúa como política complementaria a la política <ph name="VIRTUAL_KEYBOARD_ENABLED_POLICY_NAME" />.
 
@@ -8126,9 +8129,9 @@
 
       Si se le asigna un valor a esta política, los usuarios no podrán cambiarlo en <ph name="PRODUCT_NAME" />. Si no se le asigna ningún valor, los usuarios podrán decidir si quieren que se muestre el botón de página principal.</translation>
 <translation id="8767749141825412133">Esta política está obsoleta y no se admite. Usa la política <ph name="AUTH_SERVER_ALLOWLIST_POLICY_NAME" /> en su lugar.</translation>
-<translation id="8768528324886802059">Si se establece esta política, se especificará qué hosts de mensajes nativos no están sujetos a la lista de bloqueados. Un valor de lista de bloqueados de <ph name="WILDCARD_VALUE" /> significa que todos los hosts de mensajes nativos han sido denegados, excepto los que estén permitidos explícitamente.
+<translation id="8768528324886802059">Si se establece esta política, se especificará qué hosts de mensajería nativa no están sujetos a la lista de bloqueados. Un valor de lista de bloqueados de <ph name="WILDCARD_VALUE" /> significa que todos los hosts de mensajería nativa han sido denegados, excepto los que estén permitidos explícitamente.
 
-      Todos los hosts de mensajes nativos están permitidos de forma predeterminada. Sin embargo, si la política deniega todos los hosts de mensajes nativos, el administrador podrá usar la lista de permitidos para anular dicha política.</translation>
+      Todos los hosts de mensajería nativa están permitidos de forma predeterminada. Sin embargo, si la política deniega todos los hosts de mensajería nativa, el administrador podrá usar la lista de permitidos para anular dicha política.</translation>
 <translation id="877557628527387598">Inicio de sesión con contraseña</translation>
 <translation id="8777369558049831576">Permite mostrar la casilla Siempre abierto en el cuadro de diálogo de un protocolo externo.</translation>
 <translation id="8778320022586618010">Habilitar los informes sobre el estado de los gráficos del dispositivo</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 889ca3bb..581ceec2 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1007,6 +1007,11 @@
 <translation id="1962864958436828230">Définir la taille minimale liée à la restriction du presse-papiers pour prévenir les fuites de données</translation>
 <translation id="1964634611280150550">Mode navigation privée désactivé</translation>
 <translation id="1964802606569741174">Cette règle n'a aucun effet sur l'application YouTube pour Android. Vous ne devez pas autoriser son installation si le mode sécurisé de YouTube doit être appliqué.</translation>
+<translation id="1964985353230379667">Indique la configuration suggérée de <ph name="KRB5_CONFIG" /> pour les nouvelles demandes créées manuellement.
+
+      Si la règle "KerberosUseCustomPrefilledConfig" est activée, la valeur de la règle est appliquée en tant que configuration suggérée et figure dans la section "Paramètres avancés" de la boîte de dialogue d'authentification Kerberos. Si cette règle est définie sur une chaîne vide ou si elle n'est pas configurée, la configuration <ph name="PRODUCT_OS_NAME" /> recommandée sera supprimée.
+
+      Si la règle "KerberosUseCustomPrefilledConfig" est désactivée, la valeur de la règle n'est pas utilisée.</translation>
 <translation id="1969212217917526199">Remplace des règles sur les versions de débogage de l'hôte d'accès à distance.
 
           La valeur est analysée sous la forme d'un dictionnaire JSON de correspondances nom de règle/valeur de règle.</translation>
@@ -1333,6 +1338,9 @@
       Elle remplace <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> et les préférences de l'utilisateur.
 
       Cette règle ne concerne que l'accès aux appareils USB via l'API Web Serial. Pour autoriser l'accès aux appareils USB via l'API WebUSB, consultez la règle <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Contrôle la disponibilité de <ph name="BOREALIS_NAME" /> pour cet appareil.
+
+      Si cette règle est définie sur "False", <ph name="BOREALIS_NAME" /> sera indisponible pour tous les utilisateurs de l'appareil. Si la règle est définie sur "True" ou n'est pas définie, <ph name="BOREALIS_NAME" /> sera disponible si et seulement si aucune autre règle ni aucun autre paramètre ne le désactivent.</translation>
 <translation id="2246621891161157804">Autoriser Chrome à bloquer les navigations vers des protocoles externes dans des cadres iFrame en bac à sable</translation>
 <translation id="224750967938323855">Ne pas afficher l'autorisation de synchronisation lors de la procédure de connexion</translation>
 <translation id="2252400912879027343">WebSQL restera disponible dans des contextes non sécurisés jusqu'à M109, puis sera indisponible à partir de M110.</translation>
@@ -2618,11 +2626,6 @@
 <translation id="3412937883532015092">Si cette règle est définie sur un nombre, <ph name="PRODUCT_NAME" /> affiche un message pendant le nombre de millisecondes défini, puis ouvre un navigateur secondaire.
 
       Si cette règle n'est pas configurée ou qu'elle est définie sur 0, l'URL sélectionnée s'ouvre automatiquement dans un navigateur secondaire.</translation>
-<translation id="3413763534078822244">Cette règle étant obsolète, veuillez utiliser <ph name="USER_BOREALIS_ALLOWED_NAME" /> à la place.
-
-      Contrôle la disponibilité de <ph name="BOREALIS_NAME" /> pour cet appareil.
-
-      Si cette règle est définie sur "False", <ph name="BOREALIS_NAME" /> sera indisponible pour tous les utilisateurs de l'appareil. Si la règle est définie sur "True" ou n'est pas définie, <ph name="BOREALIS_NAME" /> sera disponible si et seulement si aucune autre règle ni aucun autre paramètre ne le désactivent.</translation>
 <translation id="3415954062311826850">Cette règle n'est pas disponible dans ARC.</translation>
 <translation id="34160070798637152">Contrôle la configuration réseau au niveau de l'appareil.</translation>
 <translation id="3417130629744653218">Autoriser les sites Web à vérifier si des modes de paiement sont disponibles.</translation>
@@ -4346,6 +4349,17 @@
 <translation id="519247340330463721">Configurez les règles associées à la navigation sécurisée.</translation>
 <translation id="5194683382395300627">Autoriser l'utilisation de l'<ph name="ASSISTANT_PRODUCT_NAME" /> sur le Web (par ex. : pour activer la modification automatique des mots de passe)</translation>
 <translation id="5196630732055960309">Autoriser l'API File Handling pour ces applis Web</translation>
+<translation id="5198660575318473544">Contrôler si les extensions Manifest V2 peuvent être utilisées sur l'écran de connexion <ph name="PRODUCT_OS_NAME" />.
+
+Les extensions Manifest V2 seront obsolètes et toutes les extensions devront être migrées vers V3 à l'avenir. Vous trouverez plus d'informations et le calendrier de la migration sur https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
+
+Si la règle est définie sur <ph name="DEFAULT" /> (0) ou n'est pas configurée, le chargement des extensions V2 est déterminé par l'appareil, selon le calendrier ci-dessus.
+Si la règle est définie sur <ph name="DISABLE" /> (1), l'installation des extensions V2 est bloquée et les extensions existantes sont désactivées. L'option sera traitée de la même manière que si la règle n'était pas définie après la désactivation par défaut de V2.
+Si la règle est définie sur <ph name="ENABLE" /> (2), les extensions V2 sont autorisées. L'option sera traitée de la même manière que si la règle n'était pas définie avant la désactivation par défaut de V2.
+Si cette règle est définie sur <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), les extensions V2 installées d'office sont autorisées. Cela inclut les extensions listées par <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> ou <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> avec <ph name="INSTALLATION_MODE" /> "force_installed" ou "normal_installed". Toutes les autres extensions V2 sont désactivées. L'option sera traitée de la même manière que si la règle n'était pas définie avant la désactivation par défaut de V2.
+
+
+La disponibilité des extensions est toujours contrôlée par d'autres règles.</translation>
 <translation id="5206454085187851382">Si <ph name="PRINTERS_ALLOWLIST" /> est sélectionné pour la règle <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, la définition de <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> indique les imprimantes accessibles aux utilisateurs. Seules les imprimantes dont les ID correspondent aux valeurs définies dans cette règle sont proposées aux utilisateurs. Ces ID doivent correspondre à ceux indiqués dans les champs <ph name="ID_FIELD" /> ou <ph name="GUID_FIELD" /> du fichier spécifié dans la règle <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
 <translation id="5207543664699568887">Cette règle détermine si <ph name="PRODUCT_NAME" /> utilise les notifications système sur Linux.
 
@@ -4795,6 +4809,7 @@
 <translation id="5599461642204007579">Paramètres de gestion de <ph name="MS_AD_NAME" /></translation>
 <translation id="5601503069213153581">Code</translation>
 <translation id="5607021831414604820">Activer les rapports sur l'état de stockage de l'appareil</translation>
+<translation id="5608114828230655271">Comportement par défaut de l'appareil</translation>
 <translation id="5614865701790130558">Enregistrer des événements pour les installations d'extensions basées sur des règles</translation>
 <translation id="5618398258385745432">Ce paramètre était utilisé avant la mise en œuvre de la règle impliquant une nouvelle authentification après consultation du mot de passe. Depuis lors, le paramètre et la règle correspondante sont sans effet sur le fonctionnement de Chrome. Chrome fonctionne actuellement comme si cette règle était définie sur la désactivation de l'affichage des mots de passe en texte clair dans la page des paramètres du gestionnaire de mots de passe. Cela signifie que la page des paramètres contient seulement un espace réservé, et que l'utilisateur doit cliquer sur "Afficher" (et saisir une nouvelle fois son mot de passe, si nécessaire) pour que Chrome affiche le mot de passe. La description initiale de la règle figure ci-dessous.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 6eead00..88c3c86a 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -1009,6 +1009,11 @@
 <translation id="1962864958436828230">Menyetel batas ukuran minimal untuk batasan papan klip pencegahan kebocoran data</translation>
 <translation id="1964634611280150550">Mode samaran dinonaktifkan</translation>
 <translation id="1964802606569741174">Kebijakan ini tidak memengaruhi aplikasi YouTube Android. Jika Mode Perlindungan di YouTube harus diterapkan, pemasangan aplikasi YouTube Android harus dilarang.</translation>
+<translation id="1964985353230379667">Menentukan konfigurasi <ph name="KRB5_CONFIG" /> yang disarankan untuk tiket baru yang dibuat secara manual.
+
+      Jika kebijakan 'KerberosUseCustomPrefilledConfig' disetel ke aktif, nilai kebijakan akan diterapkan sebagai konfigurasi yang disarankan dan akan ditampilkan di bagian "Lanjutan" pada dialog autentikasi Kerberos. Jika kebijakan ini disetel ke string kosong atau tidak disetel, konfigurasi <ph name="PRODUCT_OS_NAME" /> yang direkomendasikan akan dihapus.
+
+      Jika kebijakan 'KerberosUseCustomPrefilledConfig' disetel ke nonaktif, nilai kebijakan ini tidak akan digunakan.</translation>
 <translation id="1969212217917526199">Menggantikan kebijakan pada versi Debug untuk host akses jarak jauh.
 
           Nilainya diuraikan dalam bentuk kamus nama kebijakan JSON untuk pemetaan nilai kebijakan.</translation>
@@ -1337,6 +1342,9 @@
       Kebijakan ini menggantikan <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />, dan preferensi pengguna.
 
       Kebijakan ini hanya memengaruhi akses ke perangkat USB melalui Web Serial API. Untuk memberikan akses ke perangkat USB melalui WebUSB API, lihat kebijakan <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Mengontrol ketersediaan <ph name="BOREALIS_NAME" /> untuk perangkat ini.
+
+      Jika kebijakan disetel ke salah (false), <ph name="BOREALIS_NAME" /> tidak akan tersedia untuk semua pengguna perangkat. Sebaliknya (jika kebijakan tidak disetel atau disetel ke benar (true)), <ph name="BOREALIS_NAME" /> akan tersedia jika dan hanya jika tidak ada kebijakan atau setelan lain yang menonaktifkannya.</translation>
 <translation id="2246621891161157804">Mengizinkan Chrome memblokir navigasi ke protokol eksternal di iframe sandbox</translation>
 <translation id="224750967938323855">Jangan tampilkan Izin Sinkronisasi selama login</translation>
 <translation id="2252400912879027343">WebSQL dalam konteks yang tidak aman akan tetap tersedia hingga M109, lalu tidak tersedia mulai M110.</translation>
@@ -2636,11 +2644,6 @@
 <translation id="3412937883532015092">Jika kebijakan disetel ke angka, <ph name="PRODUCT_NAME" /> akan menampilkan pesan untuk angka milidetik tersebut, kemudian membuka browser alternatif.
 
       Jika kebijakan tidak disetel atau disetel ke 0, navigasi ke URL yang ditetapkan akan segera membuka kebijakan tersebut di browser alternatif.</translation>
-<translation id="3413763534078822244">Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="USER_BOREALIS_ALLOWED_NAME" />.
-
-      Mengontrol ketersediaan <ph name="BOREALIS_NAME" /> untuk perangkat ini.
-
-      Jika kebijakan disetel ke salah (false), <ph name="BOREALIS_NAME" /> tidak akan tersedia untuk semua pengguna perangkat. Sebaliknya (jika kebijakan disetel ke benar (true) atau tidak disetel), <ph name="BOREALIS_NAME" /> akan tersedia jika dan hanya jika tidak ada kebijakan atau setelan lain yang menonaktifkannya.</translation>
 <translation id="3415954062311826850">Kebijakan ini tidak didukung dalam ARC.</translation>
 <translation id="34160070798637152">Mengontrol konfigurasi jaringan tingkat perangkat.</translation>
 <translation id="3417130629744653218">Izinkan situs membuat kueri untuk metode pembayaran yang tersedia.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 1e024ba..48dcefe 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -1326,6 +1326,9 @@
       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.
 
       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>
+<translation id="2246011554082893079">Consente di gestire la disponibilità di <ph name="BOREALIS_NAME" /> per questo dispositivo.
+
+      Se il criterio viene impostato su falso, <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 vero) <ph name="BOREALIS_NAME" /> sarà disponibile soltanto se non viene disattivato da altri criteri o impostazioni.</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>
 <translation id="2252400912879027343">WebSQL in contesti non sicuri rimarrà disponibile fino alla versione M109, dopodiché non sarà disponibile a partire dalla versione M110.</translation>
@@ -2588,11 +2591,6 @@
 <translation id="3412937883532015092">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.
 
       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>
-<translation id="3413763534078822244">Questo criterio è deprecato. Usa il criterio <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>
 <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>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index aa48ba0..4348f0b 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -979,6 +979,11 @@
 <translation id="1962864958436828230">データ漏洩防止のクリップボード制限の最小サイズを設定する</translation>
 <translation id="1964634611280150550">シークレット モードを無効にする</translation>
 <translation id="1964802606569741174">このポリシーは Android YouTube アプリには適用されません。YouTube でセーフモードを有効にする場合は、Android YouTube アプリのインストールを禁止する必要があります。</translation>
+<translation id="1964985353230379667">手動で作成された新しいチケットの <ph name="KRB5_CONFIG" /> 推奨構成を指定します。
+
+      「KerberosUseCustomPrefilledConfig」ポリシーが有効になっている場合は、ポリシーの値が推奨設定として適用され、Kerberos 認証ダイアログの [詳細設定] セクションに表示されます。このポリシーを空の文字列に設定するか未設定のままにした場合、<ph name="PRODUCT_OS_NAME" /> 推奨設定は削除されます。
+
+      「KerberosUseCustomPrefilledConfig」ポリシーが無効になっている場合、このポリシーの値は使用されません。</translation>
 <translation id="1969212217917526199">リモート アクセス ホストの Debug ビルドでポリシーをオーバーライドします。
 
           この値は、ポリシー値のマッピングに対するポリシー名の JSON 辞書として解析されます。</translation>
@@ -1283,6 +1288,9 @@
 
       このポリシーが false の場合、おすすめのページは取得されず、表示されません。</translation>
 <translation id="2244674148015569802">このポリシーでは、ベンダー ID と製品 ID が <ph name="VENDOR_ID_FIELD_NAME" /> および <ph name="PRODUCT_ID_FIELD_NAME" /> フィールドに一致する USB シリアル デバイスへのアクセスを自動的に許可するサイトのリストを指定できます。<ph name="PRODUCT_ID_FIELD_NAME" /> フィールドを省略すると、<ph name="VENDOR_ID_FIELD_NAME" /> フィールドに一致するベンダー ID と任意の製品 ID を持つデバイスへのアクセスをサイトに許可することになります。必ず有効な URL を指定してください。無効な URL を指定した場合、このポリシーは無視されます。URL のオリジン(スキーム、ホストとポート)のみが考慮されます。Chrome OS 上で、このポリシーは関連のあるユーザーにのみ適用されます。このポリシーは、<ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />、<ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />、<ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />、ユーザーの設定をオーバーライドします。このポリシーは、Web Serial API 経由での USB デバイスへのアクセスのみに影響を与えます。WebUSB API 経由での USB デバイスへのアクセスを許可するには、<ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> ポリシーを参照してください。</translation>
+<translation id="2246011554082893079">このデバイスで <ph name="BOREALIS_NAME" /> を使用できるかどうかを制御します。
+
+      このポリシーを false に設定した場合、デバイスのユーザーは誰も <ph name="BOREALIS_NAME" /> を使用できません。それ以外の場合(ポリシーが未設定のままか、true に設定した場合)、他のポリシーや設定で無効となっていなければ、<ph name="BOREALIS_NAME" /> を使用できます。</translation>
 <translation id="2246621891161157804">サンドボックス化された iframe 内で外部プロトコルへの移動を Chrome がブロックできるようにする</translation>
 <translation id="224750967938323855">ログイン時に同期の同意メッセージを表示しない</translation>
 <translation id="2252400912879027343">セキュアでないコンテキストの WebSQL を M109 まで使用可能にして、M110 以降は使用できないようにする。</translation>
@@ -2477,9 +2485,6 @@
 <translation id="3412937883532015092">このポリシーに数字を設定した場合、<ph name="PRODUCT_NAME" /> はその数字で指定した間隔(ミリ秒単位)だけメッセージを表示してから、代替ブラウザを開きます。
 
       このポリシーを設定しないか、0 に設定した場合、指定された URL にアクセスすると、すぐに代替ブラウザが開きます。</translation>
-<translation id="3413763534078822244">このポリシーはサポートが終了しています。代わりに <ph name="USER_BOREALIS_ALLOWED_NAME" /> を使用してください。このデバイスで <ph name="BOREALIS_NAME" /> を使用できるかどうかを管理します。
-
-      このポリシーを false に設定した場合、デバイスのユーザーは誰も <ph name="BOREALIS_NAME" /> を使用できません。それ以外の場合(ポリシーを未設定のままにした場合や true に設定した場合)、他のポリシーや設定で無効となっていなければ、<ph name="BOREALIS_NAME" /> を使用できます。</translation>
 <translation id="3415954062311826850">このポリシーは ARC でサポートされていません。</translation>
 <translation id="34160070798637152">デバイス共通のネットワーク設定を制御します。</translation>
 <translation id="3417130629744653218">利用可能なお支払い方法の問い合わせをウェブサイトに許可します。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index e9c2bee4..77e1b2d 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1005,6 +1005,11 @@
 <translation id="1962864958436828230">데이터 유출 방지를 위한 클립보드 제한용 최소 크기 한도 설정</translation>
 <translation id="1964634611280150550">시크릿 모드 사용이 중지됨</translation>
 <translation id="1964802606569741174">이 정책은 Android YouTube 앱에 아무런 영향도 미치지 않습니다. YouTube의 안전 모드를 실행해야 하는 경우 Android YouTube 앱 설치를 허용하지 않아야 합니다.</translation>
+<translation id="1964985353230379667">수동으로 생성된 새 티켓의 <ph name="KRB5_CONFIG" /> 추천 구성을 지정합니다.
+
+      'KerberosUseCustomPrefilledConfig' 정책을 사용 설정하면 정책 값에 추천 구성이 적용되고 정책 값이 Kerberos 인증 대화상자의 '고급' 섹션에 표시됩니다. 정책을 빈 문자열로 설정하거나 설정하지 않으면 <ph name="PRODUCT_OS_NAME" /> 추천 구성이 삭제됩니다.
+
+      'KerberosUseCustomPrefilledConfig' 정책을 사용 중지하는 경우 이 정책의 값이 사용되지 않습니다.</translation>
 <translation id="1969212217917526199">원격 액세스 호스트의 디버그 빌드 관련 정책을 재정의합니다.
 
           정책 값을 매핑하기 위해 값이 정책 이름의 JSON 사전으로 파싱됩니다.</translation>
@@ -1331,6 +1336,9 @@
       이 정책은 <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" />, 사용자의 환경설정에 우선하여 적용됩니다.
 
       이 정책은 Web Serial API를 통한 USB 기기의 액세스에만 영향을 미칩니다. WebUSB API를 통하여 USB 기기에 액세스를 부여하려면 <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> 정책을 확인하세요.</translation>
+<translation id="2246011554082893079">기기에서 <ph name="BOREALIS_NAME" />를 사용하도록 허용할지 선택합니다.
+
+      정책이 False로 설정되면 기기의 모든 사용자가 <ph name="BOREALIS_NAME" />를 사용할 수 없습니다. 그렇지 않은 경우(정책이 설정되지 않거나 True로 설정됨) 다른 정책 또는 설정에서 사용 중지하지 않는 이상 <ph name="BOREALIS_NAME" />를 사용할 수 있습니다.</translation>
 <translation id="2246621891161157804">Chrome이 샌드박스 처리된 iframe에서 외부 프로토콜로 이동을 차단하도록 허용</translation>
 <translation id="224750967938323855">로그인 중 동기화 동의 표시 안함</translation>
 <translation id="2252400912879027343">비보안 컨텍스트의 WebSQL은 M109까지 사용할 수 있으며 이후 M110부터는 사용할 수 없습니다.</translation>
@@ -2617,11 +2625,6 @@
 <translation id="3412937883532015092">이 정책을 숫자로 설정하면 <ph name="PRODUCT_NAME" />에 숫자만큼의 밀리초 동안 메시지가 표시된 후 대체 브라우저가 실행됩니다.
 
       정책을 설정하지 않거나 0으로 설정하면 지정된 URL로 이동하는 즉시 대체 브라우저가 실행됩니다.</translation>
-<translation id="3413763534078822244">이 정책은 지원이 중단됩니다. <ph name="USER_BOREALIS_ALLOWED_NAME" /> 정책을 대신 사용하세요.
-
-      기기에서 <ph name="BOREALIS_NAME" />를 사용하도록 허용할지 설정합니다.
-
-      정책을 False로 설정하면 기기의 모든 사용자가 <ph name="BOREALIS_NAME" />를 사용할 수 없습니다. 그러지 않는 경우(정책을 설정하지 않거나 True로 설정) 다른 정책이나 설정으로 사용 중지하지 않는 이상 <ph name="BOREALIS_NAME" />를 사용할 수 있습니다.</translation>
 <translation id="3415954062311826850">ARC 내에서 지원되지 않는 정책입니다.</translation>
 <translation id="34160070798637152">기기 전체 네트워크 구성을 제어합니다.</translation>
 <translation id="3417130629744653218">웹사이트가 사용 가능한 결제 수단을 쿼리하도록 허용</translation>
@@ -4374,6 +4377,17 @@
 <translation id="519247340330463721">세이프 브라우징 관련 정책을 설정합니다.</translation>
 <translation id="5194683382395300627">웹에서 자동 비밀번호 변경 등을 위해 <ph name="ASSISTANT_PRODUCT_NAME" /> 사용을 허용합니다.</translation>
 <translation id="5196630732055960309">웹 앱에서 File Handling API 허용</translation>
+<translation id="5198660575318473544"><ph name="PRODUCT_OS_NAME" /> 로그인 화면에서 Manifest V2 확장 프로그램의 사용 가능 여부를 제어합니다.
+
+Manifest V2 확장 프로그램 지원이 중단되며 향후 모든 확장 프로그램을 V3로 이전해야 합니다. 이전에 관한 자세한 내용과 타임라인은 https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/에서 확인할 수 있습니다.
+
+정책을 <ph name="DEFAULT" />(0)으로 설정하거나 설정하지 않으면 위 타임라인에 따라 기기에서 V2 확장 프로그램 로드를 결정합니다.
+정책을 <ph name="DISABLE" />(1)로 설정하면 V2 확장 프로그램 설치가 차단되고 기존 확장 프로그램은 사용 중지됩니다. 이 옵션은 기본적으로 V2 지원이 사용 중지된 후에 정책이 설정되지 않은 경우와 동일하게 처리됩니다.
+정책을 <ph name="ENABLE" />(2)으로 설정하면 V2 확장 프로그램이 허용됩니다. 이 옵션은 기본적으로 V2 지원이 사용 중지되기 전에 정책이 설정되지 않은 경우와 동일하게 처리됩니다.
+정책을 <ph name="ENABLE_FOR_FORCED_EXTENSIONS" />(3)로 설정하면 강제 설치된 V2 확장 프로그램이 허용됩니다. 여기에는 <ph name="INSTALLATION_MODE" />가 'force_installed' 또는 'normal_installed'이며 <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> 또는 <ph name="EXTENSION_SETTINGS_POLICY_NAME" />에 의해 나열된 확장 프로그램이 포함됩니다. 다른 모든 V2 확장 프로그램은 사용 중지됩니다. 이 옵션은 기본적으로 V2 지원이 사용 중지되기 전에 정책이 설정되지 않은 경우와 동일하게 처리됩니다.
+
+
+확장 프로그램 사용 가능 여부는 다른 정책에 의해 계속 제어됩니다.</translation>
 <translation id="5206454085187851382"><ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_ALLOWLIST" />를 선택할 경우 <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 있는 프린터가 지정됩니다. ID가 이 정책의 값과 일치하는 프린터만 사용자에게 제공됩니다. ID는 <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다.</translation>
 <translation id="5207543664699568887">Linux용 <ph name="PRODUCT_NAME" />에서 시스템 알림을 사용할지 선택합니다.
 
@@ -4820,6 +4834,7 @@
 <translation id="5599461642204007579"><ph name="MS_AD_NAME" /> 관리 설정</translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5607021831414604820">기기 저장용량 상태 보고 사용 설정</translation>
+<translation id="5608114828230655271">기본 기기 동작</translation>
 <translation id="5614865701790130558">정책 기반 확장 프로그램 설치 이벤트 로그</translation>
 <translation id="5618398258385745432">비밀번호 조회를 위한 재인증 시작 전에 관련 설정을 사용했습니다. 그 이후에는 설정한 사항과 이 정책이 Chrome의 작동에 영향을 주지 않았습니다. 현재 Chrome은 비밀번호 관리자 설정 페이지에서 일반 텍스트로 비밀번호를 표시하는 것을 사용 중지하도록 정책을 설정했을 때와 동일하게 작동합니다. 따라서 설정 페이지에는 자리표시자만 포함되어 있으며, 사용자가 '표시'를 클릭하는 경우(해당하는 경우 다시 인증해야 함)에만 Chrome에서 비밀번호를 표시합니다. 정책의 원본 설명은 아래와 같습니다.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 7454ccc..8b5acee9 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1335,6 +1335,9 @@
       Dit beleid overschrijft <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> en de voorkeuren van de gebruiker.
 
       Dit beleid heeft alleen effect op USB-apparaten via de Web Serial API. Zie het beleid <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> als je USB-apparaten toegang wilt geven via de WebUSB API.</translation>
+<translation id="2246011554082893079">Beheert de beschikbaarheid van <ph name="BOREALIS_NAME" /> voor dit apparaat.
+
+      Als je het beleid instelt op False, is <ph name="BOREALIS_NAME" /> niet beschikbaar voor gebruikers van het apparaat. Als je het beleid niet instelt of instelt op True, is <ph name="BOREALIS_NAME" /> beschikbaar als deze functie niet uitstaat op basis van een andere beleidsregel of instelling.</translation>
 <translation id="2246621891161157804">Toestaan dat Chrome navigatie naar externe protocollen in iframes in sandboxes blokkeert</translation>
 <translation id="224750967938323855">Geen synchronisatietoestemming weergeven tijdens het inloggen</translation>
 <translation id="2252400912879027343">WebSQL in niet-beveiligde contexten blijft beschikbaar tot M109 en is niet meer beschikbaar vanaf M110.</translation>
@@ -2592,11 +2595,6 @@
 <translation id="3412937883532015092">Als je het beleid instelt op een getal, toont <ph name="PRODUCT_NAME" /> gedurende dat aantal milliseconden een melding en wordt vervolgens de alternatieve browser geopend.
 
       Als je dit beleid niet instelt of instelt op '0', wordt de URL onmiddellijk in een alternatieve browser geopend als je naar de URL navigeert.</translation>
-<translation id="3413763534078822244">Dit beleid is verouderd. Gebruik in plaats daarvan <ph name="USER_BOREALIS_ALLOWED_NAME" />.
-
-      Beheert de beschikbaarheid van <ph name="BOREALIS_NAME" /> voor dit apparaat.
-
-      Als je het beleid instelt op False, is <ph name="BOREALIS_NAME" /> niet beschikbaar voor gebruikers van het apparaat. Als je het beleid niet instelt of instelt op True, is <ph name="BOREALIS_NAME" /> beschikbaar als deze functie niet uitstaat op basis van een andere beleidsregel of instelling.</translation>
 <translation id="3415954062311826850">Dit beleid wordt niet ondersteund binnen ARC.</translation>
 <translation id="34160070798637152">Beheert apparaatbrede netwerkconfiguratie.</translation>
 <translation id="3417130629744653218">Websites toestaan beschikbare betaalmethoden op te vragen</translation>
@@ -4311,6 +4309,17 @@
 <translation id="519247340330463721">Beleid met betrekking tot Safe Browsing configureren.</translation>
 <translation id="5194683382395300627">Toestaan dat <ph name="ASSISTANT_PRODUCT_NAME" /> wordt gebruikt op internet, bijvoorbeeld om wachtwoorden automatisch te wijzigen</translation>
 <translation id="5196630732055960309">De File Handling API toestaan voor deze web-apps</translation>
+<translation id="5198660575318473544">Bepaal of Manifest v2-extensies kunnen worden gebruikt op het <ph name="PRODUCT_OS_NAME" />-inlogscherm.
+
+Ondersteuning voor Manifest v2-extensies wordt beëindigd en alle extensies moeten in de toekomst worden overgezet naar v3. Je kunt meer informatie en een tijdlijn van de migratie vinden op https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
+
+Als je het beleid instelt op <ph name="DEFAULT" /> (0) of niet instelt, wordt het laden van v2-extensies bepaald door het apparaat op basis van de bovenstaande tijdlijn.
+Als je het beleid instelt op <ph name="DISABLE" /> (1), wordt de installatie van v2-extensies geblokkeerd. Bestaande extensies worden uitgezet. De optie wordt op dezelfde manier behandeld als wanneer het beleid niet is ingesteld nadat de v2-ondersteuning standaard is uitgezet.
+Als je het beleid instelt op <ph name="ENABLE" /> (2), zijn v2-extensies toegestaan. De optie wordt op dezelfde manier behandeld als wanneer het beleid niet is ingesteld voordat de v2-ondersteuning standaard wordt uitgezet.
+Als je het beleid instelt op <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), zijn afgedwongen geïnstalleerde v2-extensies toegestaan. Dit omvat extensies die worden vermeld in <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> of <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> met <ph name="INSTALLATION_MODE" /> force_installed of normal_installed. Alle andere v2-extensies staan uit. De optie wordt op dezelfde manier behandeld als wanneer het beleid niet is ingesteld voordat de v2-ondersteuning standaard wordt uitgezet.
+
+
+De beschikbaarheid van extensies wordt nog steeds beheerd door andere beleidsregels.</translation>
 <translation id="5206454085187851382">Als <ph name="PRINTERS_ALLOWLIST" /> wordt gekozen voor <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> in te stellen aangeven welke printers gebruikers kunnen gebruiken. Alleen printers waarvan de ID's overeenkomen met de waarden in dit beleid, zijn beschikbaar voor de gebruiker. De ID's moeten overeenkomen met het veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> in het bestand dat is opgegeven in <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
 <translation id="5207543664699568887">Bepaalt of <ph name="PRODUCT_NAME" /> op Linux systeemmeldingen gebruikt.
 
@@ -4758,6 +4767,7 @@
 <translation id="5599461642204007579">Beheerinstellingen voor <ph name="MS_AD_NAME" /></translation>
 <translation id="5601503069213153581">Pincode</translation>
 <translation id="5607021831414604820">Rapportage van opslagstatus van apparaat aanzetten</translation>
+<translation id="5608114828230655271">Standaard apparaatgedrag</translation>
 <translation id="5614865701790130558">Gebeurtenissen voor op beleid gebaseerde installaties van extensies registreren</translation>
 <translation id="5618398258385745432">De bijbehorende instelling werd gebruikt voordat hernieuwde verificatie voor de weergave van wachtwoorden is geïntroduceerd. Sindsdien hebben de instelling en dit beleid geen invloed gehad op het gedrag van Chrome. Het huidige gedrag van Chrome is nu hetzelfde alsof het beleid was ingesteld om wachtwoorden niet als leesbare tekst te tonen op de pagina met instellingen voor Wachtwoordmanager. Dat betekent dat de pagina met instellingen alleen een tijdelijke aanduiding bevat. Chrome laat het wachtwoord alleen zien als de gebruiker op Tonen klikt (en zo nodig de hernieuwde verificatie uitvoert). De oorspronkelijke beschrijving van het beleid volgt hieronder.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 13f563ef..5ddd72e 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1339,6 +1339,9 @@
       Esta política substitui <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 as preferências do usuário.
 
       Ela afeta apenas o acesso aos dispositivos USB pela API Web Serial. Para conceder acesso a dispositivos USB pela API WebUSB, consulte a política <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Controla a disponibilidade da <ph name="BOREALIS_NAME" /> neste dispositivo.
+
+      Se a política for definida como falsa, a <ph name="BOREALIS_NAME" /> ficará indisponível para todos os usuários do dispositivo. Caso contrário, quando a política for definida como verdadeira ou deixada sem definição, a <ph name="BOREALIS_NAME" /> ficará disponível se, e apenas se, nenhuma outra política ou configuração a desativar.</translation>
 <translation id="2246621891161157804">Permitir que o Chrome bloqueie a navegação para protocolos externos no iframe dentro do sandbox</translation>
 <translation id="224750967938323855">Não mostrar o consentimento de sincronização durante o login</translation>
 <translation id="2252400912879027343">O WebSQL em contextos não seguros continuará disponível até a versão M109 e ficará indisponível da M110 em diante.</translation>
@@ -2635,11 +2638,6 @@
 <translation id="3412937883532015092">Se a política for definida como um número, o <ph name="PRODUCT_NAME" /> exibirá uma mensagem de milésimos de segundo para o número e abrirá um navegador alternativo.
 
       Se ela não for definida ou for definida como 0, a navegação para um URL designado o abrirá imediatamente em um navegador alternativo.</translation>
-<translation id="3413763534078822244">Esta política foi descontinuada. Use a <ph name="USER_BOREALIS_ALLOWED_NAME" />.
-
-      Controla a disponibilidade da <ph name="BOREALIS_NAME" /> neste dispositivo.
-
-      Se a política for definida como falsa, a <ph name="BOREALIS_NAME" /> vai ficar indisponível para todos os usuários do dispositivo. Quando ela for definida como verdadeira ou deixada sem definição, a <ph name="BOREALIS_NAME" /> ficará disponível apenas se nenhuma outra política ou configuração a desativar.</translation>
 <translation id="3415954062311826850">Esta política não é compatível com o ARC.</translation>
 <translation id="34160070798637152">Controla a configuração de rede em todo o dispositivo.</translation>
 <translation id="3417130629744653218">Permitir que sites consultem formas de pagamento disponíveis.</translation>
@@ -4415,6 +4413,19 @@
 <translation id="519247340330463721">Configura as políticas relacionadas ao Safe Browsing.</translation>
 <translation id="5194683382395300627">Permitir o uso do <ph name="ASSISTANT_PRODUCT_NAME" /> na Web, por exemplo, para autorizar a mudança automática de senhas</translation>
 <translation id="5196630732055960309">Permitir a API File Handling nesses apps da Web</translation>
+<translation id="5198660575318473544">Controle se as extensões do Manifest v2 podem ser usadas na tela de login do <ph name="PRODUCT_OS_NAME" />.
+
+O suporte a elas vai ser descontinuado, e todas as extensões precisarão
+ser migradas para a v3. Confira outras informações e o cronograma da
+migração em https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
+
+Se a política for definida como <ph name="DEFAULT" /> (0) ou for deixada sem definição, o carregamento das extensões da v2 vai ser decidido pelo dispositivo, seguindo o cronograma acima.
+Se definida como <ph name="DISABLE" /> (1), a instalação de extensões da v2 será bloqueada, e as atuais, desativadas. A opção vai ser tratada da mesma forma que seria se a política não fosse definida após a desativação do suporte à v2 por padrão.
+Se a política for definida como <ph name="ENABLE" /> (2), as extensões da v2 serão permitidas. A opção vai ser tratada da mesma forma que seria se a política não fosse definida antes da desativação do suporte à v2 por padrão.
+Se a política for definida como <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), as extensões da v2 instaladas serão permitidas. Isso inclui extensões listadas pela <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> ou <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> com <ph name="INSTALLATION_MODE" /> "force_installed" ou "normal_installed". Todas as outras extensões v2 são desativadas. A opção vai ser tratada da mesma forma que seria se a política não fosse definida antes da desativação do suporte à v2 por padrão.
+
+
+A disponibilidade das extensões ainda é controlada por outras políticas.</translation>
 <translation id="5206454085187851382">Se <ph name="PRINTERS_ALLOWLIST" /> for escolhida para <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, a definição de <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> especificará quais impressoras os usuários não podem usar. Apenas as impressoras com IDs correspondentes aos valores desta política estão disponíveis para o usuário. Os IDs precisam corresponder aos campos <ph name="ID_FIELD" /> ou <ph name="GUID_FIELD" /> no arquivo especificado na <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
 <translation id="5207543664699568887">Configura se o <ph name="PRODUCT_NAME" /> no Linux usará notificações do sistema.
 
@@ -4861,6 +4872,7 @@
 <translation id="5599461642204007579">Configurações de gerenciamento do <ph name="MS_AD_NAME" /></translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5607021831414604820">Ativar relatórios de status do armazenamento do dispositivo</translation>
+<translation id="5608114828230655271">Comportamento padrão do dispositivo</translation>
 <translation id="5614865701790130558">Registros de eventos para instalações de extensão com base em políticas</translation>
 <translation id="5618398258385745432">A configuração associada foi usada antes de a reautenticação na visualização de senhas ter sido introduzida. Desde então, a configuração e, consequentemente, esta política não têm efeito no comportamento do Chrome. O comportamento atual do Chrome agora é o mesmo que seria se a política tivesse sido definida para desativar a visualização de senhas em texto não criptografado na página de configurações do gerenciador de senhas. Isso quer dizer que a página de configurações contém apenas um marcador, e o Chrome só mostrará a senha depois que o usuário clicar em "Mostrar" (e reautenticar, se aplicável). A descrição original da política é a mostrada a seguir.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index e9f04a2..0e615a8b 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1336,6 +1336,9 @@
       Правило переопределяет правила <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> и пользовательские настройки.
 
       Оно влияет только на доступ к USB-устройствам через Web Serial API. Чтобы предоставить доступ к USB-устройствам через WebUSB API, понадобится правило <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Правило контролирует использование <ph name="BOREALIS_NAME" /> на этом устройстве.
+
+      Если установлено значение False, <ph name="BOREALIS_NAME" /> будет недоступно для всех пользователей на этом устройстве. Если правило не настроено или установлено значение True, <ph name="BOREALIS_NAME" /> будет доступно, только если другие правила и настройки не запрещают это.</translation>
 <translation id="2246621891161157804">Разрешать Chrome блокировать переходы на внешние протоколы в изолированных окнах iframe</translation>
 <translation id="224750967938323855">Не запрашивать согласие на синхронизацию при входе в аккаунт</translation>
 <translation id="2252400912879027343">WebSQL в небезопасных контекстах будет доступен в версиях до M109. Начиная с версии M110 он станет недоступен.</translation>
@@ -2624,11 +2627,6 @@
 <translation id="3412937883532015092">Заданное в этом правиле число соответствует интервалу в миллисекундах, в течение которого <ph name="PRODUCT_NAME" /> показывает специальное сообщение перед запуском альтернативного браузера.
 
       Если правило не настроено или задано значение "0", страница из назначенного списка открывается в альтернативном браузере немедленно.</translation>
-<translation id="3413763534078822244">Это правило больше не поддерживается. Используйте вместо него <ph name="USER_BOREALIS_ALLOWED_NAME" />.
-
-      Правило контролирует использование <ph name="BOREALIS_NAME" /> на этом устройстве.
-
-      Если установлено значение False, контейнер <ph name="BOREALIS_NAME" /> будет недоступен для всех пользователей на этом устройстве. Если правило не настроено или установлено значение True, то <ph name="BOREALIS_NAME" /> можно будет использовать при условии, что этот контейнер не отключен другим правилом или параметром.</translation>
 <translation id="3415954062311826850">Это правило не поддерживается при использовании технологии ARC.</translation>
 <translation id="34160070798637152">Определяет конфигурацию сети для устройства.</translation>
 <translation id="3417130629744653218">Разрешить сайтам запрашивать доступные способы оплаты</translation>
@@ -4370,6 +4368,17 @@
 <translation id="519247340330463721">Настройка правил, связанных с Безопасным просмотром.</translation>
 <translation id="5194683382395300627">Разрешить использование сервиса "<ph name="ASSISTANT_PRODUCT_NAME" />" в интернете, например для автоматической смены паролей</translation>
 <translation id="5196630732055960309">Разрешить использование File Handling API для этих веб-приложений</translation>
+<translation id="5198660575318473544">Правило позволяет контролировать использование расширений с манифестом версии 2 на экране входа <ph name="PRODUCT_OS_NAME" />.
+
+В будущем поддержка таких расширений будет прекращена. Разрешено будет использовать только расширения с манифестом версии 3. Подробнее о сроках прекращения поддержки: https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
+
+Если правило не настроено или для него задано значение <ph name="DEFAULT" /> (0), можно будет загружать расширения с манифестом версии 2, пока не истечет их срок поддержки.
+Если для правила указано значение <ph name="DISABLE" /> (1), новые расширения с манифестом версии 2 будут недоступны для загрузки, а загруженные ранее – отключены. Такую ситуацию система будет распознавать как правило, не настроенное для работы после того, как поддержка версии 2 прекратится по умолчанию.
+Если выбрано значение <ph name="ENABLE" /> (2), загрузка расширений с манифестом версии 2 будет разрешена. Такую ситуацию система будет распознавать как правило, не настроенное для работы до того, как поддержка версии 2 прекратится по умолчанию.
+Если для правила задано значение <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), будет разрешено использовать расширения с манифестом версии 2, установленные принудительно. Это относится к расширениям, перечисленным в правилах <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> или <ph name="EXTENSION_SETTINGS_POLICY_NAME" />, если в качестве значения параметра <ph name="INSTALLATION_MODE" /> указано force_installed или normal_installed. Остальные расширения с манифестом версии 2 будут отключены. Такую ситуацию система будет распознавать как правило, не настроенное для работы до того, как поддержка версии 2 прекратится по умолчанию.
+
+
+Доступность расширений по-прежнему определяется и другими правилами.</translation>
 <translation id="5206454085187851382">Если в правиле <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_ALLOWLIST" />, правило <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> определяет принтеры, с которыми может работать пользователь. Пользователь может работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
 <translation id="5207543664699568887">Позволяет разрешить или запретить <ph name="PRODUCT_NAME" /> использовать нативные уведомления в Linux.
 
@@ -4815,6 +4824,7 @@
 <translation id="5599461642204007579">Настройки управления <ph name="MS_AD_NAME" /></translation>
 <translation id="5601503069213153581">PIN-код</translation>
 <translation id="5607021831414604820">Включить отправку данных о статусе хранилища устройства</translation>
+<translation id="5608114828230655271">Настройка устройства по умолчанию</translation>
 <translation id="5614865701790130558">Ведение журнала событий, связанных с установкой расширений на основе правил</translation>
 <translation id="5618398258385745432">В Chrome была добавлена повторная аутентификация для доступа к паролям, и связанная настройка перестала действовать. Соответственно, это правило также больше не действует. Теперь Chrome работает так, как если бы правило запрещало просмотр паролей в незашифрованном виде в диспетчере. При этом пароль на странице настроек скрыт, но пользователь может нажать кнопку "Показать", ввести учетные данные аккаунта, если потребуется, и посмотреть пароль. Исходное описание правила приведено ниже.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index dcb40b1f..a1529477 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1330,6 +1330,9 @@
       นโยบายนี้จะลบล้าง <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> และค่ากำหนดของผู้ใช้
 
       รวมถึงจะมีผลเฉพาะกับสิทธิ์เข้าถึงอุปกรณ์ USB ผ่าน Web Serial API เท่านั้น หากต้องการให้สิทธิ์เข้าถึงอุปกรณ์ USB ผ่าน WebUSB API ให้ดูนโยบาย <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /></translation>
+<translation id="2246011554082893079">ควบคุมความพร้อมใช้งานของ <ph name="BOREALIS_NAME" /> สำหรับอุปกรณ์นี้
+
+      หากตั้งค่านโยบายเป็น "เท็จ" ผู้ใช้อุปกรณ์ทุกคนจะใช้ <ph name="BOREALIS_NAME" /> ไม่ได้ ไม่เช่นนั้น (เมื่อไม่ได้ตั้งค่านโยบายหรือตั้งค่าเป็น "จริง") <ph name="BOREALIS_NAME" /> จะพร้อมใช้งานเฉพาะในกรณีที่ไม่มีนโยบายหรือการตั้งค่าอื่นมาปิดใช้</translation>
 <translation id="2246621891161157804">อนุญาตให้ Chrome บล็อกการเรียกออกไปยังโปรโตคอลนอก iframe ที่ทำแซนด์บ็อกซ์</translation>
 <translation id="224750967938323855">ไม่แสดงความยินยอมในการซิงค์ระหว่างการลงชื่อเข้าใช้</translation>
 <translation id="2252400912879027343">WebSQL ในบริบทที่ไม่ปลอดภัยจะยังคงใช้งานได้จนถึงเวอร์ชัน M109 จากนั้นจะใช้งานไม่ได้เริ่มตั้งแต่เวอร์ชัน M110</translation>
@@ -2589,11 +2592,6 @@
 <translation id="3412937883532015092">การตั้งค่านโยบายนี้เป็นตัวเลขจะทำให้ <ph name="PRODUCT_NAME" /> แสดงข้อความเป็นมิลลิวินาทีตามจำนวนดังกล่าว จากนั้นจึงเปิดเบราว์เซอร์สำรอง
 
       การไม่ตั้งค่านโยบายนี้หรือตั้งค่าเป็น 0 หมายความว่าการไปยัง URL ที่กำหนดจะเป็นการเปิด URL ในเบราว์เซอร์สำรองทันที</translation>
-<translation id="3413763534078822244">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="USER_BOREALIS_ALLOWED_NAME" /> แทน
-
-      ควบคุมความพร้อมใช้งานของ <ph name="BOREALIS_NAME" /> สำหรับอุปกรณ์นี้
-
-      หากตั้งค่านโยบายเป็น "เท็จ" ผู้ใช้อุปกรณ์ทุกคนจะใช้ <ph name="BOREALIS_NAME" /> ไม่ได้ มิเช่นนั้น (เมื่อไม่ได้ตั้งค่านโยบายหรือตั้งค่าเป็น "จริง") <ph name="BOREALIS_NAME" /> จะพร้อมใช้งานเฉพาะในกรณีที่ไม่มีนโยบายหรือการตั้งค่าอื่นมาปิดใช้</translation>
 <translation id="3415954062311826850">นโยบายนี้ไม่รองรับใน ARC</translation>
 <translation id="34160070798637152">ควบคุมการกำหนดค่าเครือข่ายของทั้งอุปกรณ์</translation>
 <translation id="3417130629744653218">อนุญาตให้เว็บไซต์ถามหาวิธีการชำระเงินที่พร้อมใช้งาน</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 0c5e3103..30614e24 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -1335,6 +1335,9 @@
       Bu politika <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> ve kullanıcının tercihlerini geçersiz kılar.
 
       Bu politika, yalnızca Web Serial API üzerinden USB cihazlarına erişimi etkiler. WebUSB API üzerinden USB cihazlarına erişim izni vermek için <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> politikasını inceleyin.</translation>
+<translation id="2246011554082893079"><ph name="BOREALIS_NAME" /> politikasının bu cihaz için kullanılabilirliğini kontrol eder.
+
+      Politika yanlış değerine ayarlanırsa <ph name="BOREALIS_NAME" /> bu cihazdaki kullanıcıların hiçbiri için kullanılamaz. Diğer hallerde (politika ayarlanmadığında veya doğru değerine ayarlandığında) <ph name="BOREALIS_NAME" />, yalnızca başka bir politika ya da ayar tarafından devre dışı bırakılmamışsa kullanılabilir.</translation>
 <translation id="2246621891161157804">Chrome'un, korumalı alana alınmış iframe'lerdeki harici protokollere yönelik gezinmeyi engellemesine izin ver</translation>
 <translation id="224750967938323855">Oturum açma sırasında senkronizasyon izin istemini gösterme</translation>
 <translation id="2252400912879027343">Güvenli olmayan bağlamlarda WebSQL, M109'a kadar kullanılabilir ancak M110'dan itibaren kullanılamaz.</translation>
@@ -2612,11 +2615,6 @@
 <translation id="3412937883532015092">Bu politika bir sayıya ayarlanırsa <ph name="PRODUCT_NAME" />, ayarlanan milisaniye süresince bir mesaj görüntüler, ardından alternatif tarayıcıyı açar.
 
       Bu politika ayarlanmadan bırakılırsa veya 0 değerine ayarlanırsa tanımlanan bir URL'ye gidildiğinde URL hemen alternatif tarayıcıda açılır.</translation>
-<translation id="3413763534078822244">Bu politika kullanımdan kaldırıldı, lütfen bunun yerine <ph name="USER_BOREALIS_ALLOWED_NAME" /> politikasını kullanın.
-
-      <ph name="BOREALIS_NAME" /> politikasının bu cihaz için kullanılabilirliğini kontrol eder.
-
-      Politika, Yanlış değerine ayarlanırsa <ph name="BOREALIS_NAME" /> bu cihazdaki kullanıcıların hiçbiri için kullanılamaz. Diğer hallerde (politika ayarlanmadığında veya Doğru değerine ayarlandığında) <ph name="BOREALIS_NAME" />, yalnızca başka bir politika ya da ayar tarafından devre dışı bırakılmamışsa kullanılabilir.</translation>
 <translation id="3415954062311826850">Bu politika Arc dahilinde desteklenmemektedir.</translation>
 <translation id="34160070798637152">Cihaz genelindeki ağ yapılandırmasını kontrol eder.</translation>
 <translation id="3417130629744653218">Web sitelerinin kullanılabilir ödeme yöntemlerini sorgulamalarına izin ver.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index b5e1d39..19319627 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1337,6 +1337,9 @@
       Це правило замінює правила <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> і налаштування користувача.
 
       Воно впливає лише на доступ до пристроїв USB через Web Serial API. Щоб надати доступ через WebUSB API, перегляньте правило <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Керує доступністю правила <ph name="BOREALIS_NAME" /> для цього пристрою.
+
+      Якщо вибрати значення false, правило <ph name="BOREALIS_NAME" /> буде недоступне для всіх користувачів пристрою. Якщо ж не налаштовувати правило або вибрати для нього значення true, правило <ph name="BOREALIS_NAME" /> буде доступне, лише якщо інше правило чи налаштування не вимикатиме його.</translation>
 <translation id="2246621891161157804">Дозволити Chrome блокувати перехід на зовнішні протоколи в ізольованому програмному середовищі iframe</translation>
 <translation id="224750967938323855">Не показувати запит на згоду на синхронізацію під час входу</translation>
 <translation id="2252400912879027343">WebSQL API у незахищених контекстах буде й надалі доступним у версіях до M109 і стане недоступним, починаючи з версії M110.</translation>
@@ -2626,11 +2629,6 @@
 <translation id="3412937883532015092">Якщо для правила вказано числове значення, <ph name="PRODUCT_NAME" /> показує повідомлення протягом зазначеної кількості мілісекунд, а тоді відкриває альтернативний веб-переглядач.
 
       Якщо це правило не налаштовано або для нього вибрано значення 0, визначена URL-адреса одразу ж відкриватиметься в альтернативному веб-переглядачі.</translation>
-<translation id="3413763534078822244">Це правило більше не підтримується. Натомість використовуйте <ph name="USER_BOREALIS_ALLOWED_NAME" />.
-
-      Керує доступністю правила <ph name="BOREALIS_NAME" /> для цього пристрою.
-
-      Якщо вибрати значення false, правило <ph name="BOREALIS_NAME" /> буде недоступне для всіх користувачів пристрою. Якщо ж не налаштовувати правило або вибрати для нього значення true, правило <ph name="BOREALIS_NAME" /> буде доступне за умови, що інше правило чи налаштування не вимикатиме його.</translation>
 <translation id="3415954062311826850">Це правило не підтримується в середовищі ARC.</translation>
 <translation id="34160070798637152">Керує конфігурацією мережі на рівні пристрою.</translation>
 <translation id="3417130629744653218">Дозволити веб-сайтам надсилати запит щодо доступних способів оплати.</translation>
@@ -4371,6 +4369,17 @@
 <translation id="519247340330463721">Налаштовує правила, пов’язані з Безпечним переглядом.</translation>
 <translation id="5194683382395300627">Дозволити використовувати <ph name="ASSISTANT_PRODUCT_NAME" /> під час роботи в Інтернеті, наприклад, щоб автоматично змінювати паролі</translation>
 <translation id="5196630732055960309">Дозволити File Handling API у цих веб-додатках</translation>
+<translation id="5198660575318473544">Це правило визначає, чи можуть розширення з маніфестом версії 2 використовуватися на екрані входу в <ph name="PRODUCT_OS_NAME" />.
+
+У майбутньому підтримку цієї версії буде припинено й усі розширення мають перейти на маніфест версії 3. Докладніше про графік перенесення можна дізнатися на сторінці https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/.
+
+Якщо для цього правила вибрати значення <ph name="DEFAULT" /> (0) або не налаштувати його, пристрій завантажуватиме (чи не завантажуватиме) розширення з маніфестом версії 2 відповідно до згаданого вище графіку.
+Якщо для правила вибрати значення <ph name="DISABLE" /> (1), встановлення таких розширень блокуватиметься, а наявні розширення буде вимкнено. Ця поведінка відповідає сценарію, коли правило не налаштовано, а підтримку маніфесту версії 2 припинено за умовчанням.
+Якщо для правила вибрати значення <ph name="ENABLE" /> (2), використання розширень із маніфестом версії 2 буде дозволено. Ця поведінка відповідає сценарію, коли правило не налаштовано, а підтримку маніфесту версії 2 ще не припинено за умовчанням.
+Якщо для правила вибрати значення <ph name="ENABLE_FOR_FORCED_EXTENSIONS" /> (3), дозволятиметься лише використання розширень із маніфестом версії 2, установлених примусово. Це стосується розширень, перелічених у правилі <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> або <ph name="EXTENSION_SETTINGS_POLICY_NAME" />, у яких для параметра <ph name="INSTALLATION_MODE" /> вибрано значення force_installed чи normal_installed. Усі інші розширення з маніфестом версії 2 буде вимкнено. Ця поведінка відповідає сценарію, коли правило не налаштовано, а підтримку маніфесту версії 2 ще не припинено за умовчанням.
+
+
+Доступність розширень усе ще контролюється іншими правилами.</translation>
 <translation id="5206454085187851382">Якщо для правила <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> вибрано параметр <ph name="PRINTERS_ALLOWLIST" />, тоді налаштування <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> визначає, які принтери можна використовувати. Користувачам доступні лише принтери з переліченими в правилі ідентифікаторами. Ідентифікатори мають відповідати полю <ph name="ID_FIELD" /> або <ph name="GUID_FIELD" /> у файлі, указаному в правилі <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation>
 <translation id="5207543664699568887">Визначає, чи <ph name="PRODUCT_NAME" /> у Linux надсилатиме системні сповіщення.
 
@@ -4817,6 +4826,7 @@
 <translation id="5599461642204007579">Параметри керування <ph name="MS_AD_NAME" /></translation>
 <translation id="5601503069213153581">PIN-код</translation>
 <translation id="5607021831414604820">Увімкнути звітування про стан пам’яті пристрою</translation>
+<translation id="5608114828230655271">Поведінка за умовчанням для пристрою</translation>
 <translation id="5614865701790130558">Реєструвати в журналі події під час встановлень розширень, які активовано правилом</translation>
 <translation id="5618398258385745432">Пов’язане налаштування використовувалося, перш ніж ми запровадили повторну автентифікацію для перегляду паролів. Відтоді це налаштування, а отже й правило, не впливають на роботу Chrome. Зараз Chrome працює так, ніби це правило вимикає показ паролів як відкритого тексту на сторінці налаштувань диспетчера паролів. Це означає, що на сторінці налаштувань є тільки заповнювач, а Chrome показує пароль, лише коли користувач натискає "Показати" (і проходить повторну автентифікацію, якщо потрібно). Нижче наведено початковий опис правила.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index e360baa..b83d17e 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -1337,6 +1337,9 @@
       Chính sách này ghi đè <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />, <ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />, <ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> và các lựa chọn ưu tiên của người dùng.
 
       Chính sách này chỉ có ảnh hưởng đến quyền truy cập vào thiết bị USB thông qua API Web Serial. Để cấp quyền truy cập vào thiết bị USB thông qua WebUSB API, hãy xem chính sách <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
+<translation id="2246011554082893079">Kiểm soát khả năng sử dụng <ph name="BOREALIS_NAME" /> trên thiết bị này.
+
+      Nếu bạn tắt chính sách này, tất cả người dùng của thiết bị sẽ không sử dụng được <ph name="BOREALIS_NAME" />. Khi bạn bật hoặc không đặt chính sách này, <ph name="BOREALIS_NAME" /> sẽ chỉ sử dụng được nếu không bị chế độ cài đặt hoặc chính sách khác vô hiệu hóa.</translation>
 <translation id="2246621891161157804">Cho phép Chrome chặn các thao tác di chuyển đến những giao thức bên ngoài trong iframe hộp cát</translation>
 <translation id="224750967938323855">Không hiển thị màn hình Đồng ý đồng bộ hoá trong khi đăng nhập</translation>
 <translation id="2252400912879027343">WebSQL trong ngữ cảnh không an toàn sẽ vẫn hoạt động cho đến M109, sau đó sẽ ngừng hoạt động kể từ M110.</translation>
@@ -2628,11 +2631,6 @@
 <translation id="3412937883532015092">Nếu bạn đặt chính sách này thành một số, thì <ph name="PRODUCT_NAME" /> sẽ hiển thị một thông báo trong khoảng thời gian tính bằng mili giây đó rồi mới mở trình duyệt thay thế.
 
       Nếu bạn đặt chính sách này thành 0 hoặc không đặt, thì URL đã chỉ định sẽ mở trong trình duyệt thay thế ngay khi người dùng truy cập vào URL đó.</translation>
-<translation id="3413763534078822244">Chính sách này không còn dùng nữa, vui lòng sử dụng <ph name="USER_BOREALIS_ALLOWED_NAME" />.
-
-      Kiểm soát khả năng sử dụng <ph name="BOREALIS_NAME" /> trên thiết bị này.
-
-      Nếu bạn tắt chính sách này, tất cả người dùng của thiết bị sẽ không sử dụng được <ph name="BOREALIS_NAME" />. Khi bạn bật hoặc không đặt chính sách này, <ph name="BOREALIS_NAME" /> sẽ chỉ sử dụng được nếu không bị chế độ cài đặt hoặc chính sách khác vô hiệu hoá.</translation>
 <translation id="3415954062311826850">Chính sách này không được hỗ trợ trong Arc.</translation>
 <translation id="34160070798637152">Kiểm soát cấu hình mạng cho toàn bộ thiết bị.</translation>
 <translation id="3417130629744653218">Cho phép các trang web truy vấn phương thức thanh toán có sẵn.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 832c4641..c406b10f 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1326,6 +1326,9 @@
       此政策会覆盖 <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />、<ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />、<ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> 和用户的偏好设置。
 
       此政策仅会对通过 Web Serial API 访问 USB 设备这一操作产生影响。若要通过 WebUSB API 授权访问 USB 设备,请参见 <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> 政策。</translation>
+<translation id="2246011554082893079">控制该设备能否使用 <ph name="BOREALIS_NAME" />。
+
+      如果此政策设为 false,该设备的所有用户都将无法使用 <ph name="BOREALIS_NAME" />。否则(如果此政策未设置或设为 true),仅当未被任何其他政策或设置停用时,<ph name="BOREALIS_NAME" /> 才可用。</translation>
 <translation id="2246621891161157804">允许 Chrome 阻止导航到沙盒化 iframe 中的外部协议</translation>
 <translation id="224750967938323855">在登录期间不显示同步同意声明</translation>
 <translation id="2252400912879027343">不安全情境中的 WebSQL 在 M109 之前将一直可用,然后从 M110 起将不再可用。</translation>
@@ -2587,11 +2590,6 @@
 <translation id="3412937883532015092">如果此政策设为一个数字,则意味着在打开备用浏览器之前,<ph name="PRODUCT_NAME" /> 会先按照与该数字等同的毫秒数显示一条消息。
 
       如果此政策未设置或设为 0,当用户要前往指定的网址时,系统会立即在备用浏览器中打开相应网页。</translation>
-<translation id="3413763534078822244">此政策已被弃用,请改用 <ph name="USER_BOREALIS_ALLOWED_NAME" />。
-
-      控制该设备能否使用 <ph name="BOREALIS_NAME" />。
-
-      如果此政策设为 false,该设备的所有用户都将无法使用 <ph name="BOREALIS_NAME" />。否则(如果此政策未设置或设为 true),仅当未被任何其他政策/设置停用时,<ph name="BOREALIS_NAME" /> 才可用。</translation>
 <translation id="3415954062311826850">此政策在 Arc 中不受支持。</translation>
 <translation id="34160070798637152">控制设备级网络配置。</translation>
 <translation id="3417130629744653218">允许网站查询可用的付款方式。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 8a1495c9..9f61322 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1324,6 +1324,9 @@
       這項政策會覆寫 <ph name="DEFAULT_SERIAL_GUARD_SETTING_POLICY_NAME" />、<ph name="SERIAL_ASK_FOR_URLS_POLICY_NAME" />、<ph name="SERIAL_BLOCKED_FOR_URLS_POLICY_NAME" /> 和使用者的偏好設定。
 
       這項政策只會影響透過 Web Serial API 存取 USB 裝置的權限。如要授予透過 WebUSB API 存取 USB 裝置的權限,請參閱 <ph name="WEB_USB_ALLOW_DEVICES_FOR_URLS_POLICY_NAME" /> 政策。</translation>
+<translation id="2246011554082893079">這項政策可控管 <ph name="BOREALIS_NAME" /> 是否適用於這部裝置。
+
+      如果將這項政策設為 False,<ph name="BOREALIS_NAME" /> 就不適用於此裝置的所有使用者。如果不設定這項政策或設為 True,<ph name="BOREALIS_NAME" /> 只要未遭到其他政策或設定所停用,便適用於這部裝置。</translation>
 <translation id="2246621891161157804">允許 Chrome 封鎖在沙箱 iframe 中瀏覽外部通訊協定的作業</translation>
 <translation id="224750967938323855">不要在登入時顯示同步同意聲明</translation>
 <translation id="2252400912879027343">在 M109 以前,仍可在不安全的環境中使用 WebSQL,自 M110 起則無法使用</translation>
@@ -2577,11 +2580,6 @@
 <translation id="3412937883532015092">如果將這項政策設為數值,<ph name="PRODUCT_NAME" /> 在開啟替代瀏覽器前會先顯示一則等待訊息,並依據該數值 (以毫秒為單位) 來設定這則訊息要顯示多久的時間。
 
       如果未設定這項政策或設為 0,當使用者前往指定網址時,系統會立即在替代瀏覽器中開啟該網址。</translation>
-<translation id="3413763534078822244">這項政策已淘汰,請改用 <ph name="USER_BOREALIS_ALLOWED_NAME" />。
-
-      這項政策會控管是否可在這部裝置上使用 <ph name="BOREALIS_NAME" />。
-
-      如果將這項政策設為 False,這部裝置的所有使用者都將無法使用 <ph name="BOREALIS_NAME" />。如果將政策設為 True 或未設定,只要其他政策或設定未停用 <ph name="BOREALIS_NAME" />,就能在這部裝置上使用這個容器。</translation>
 <translation id="3415954062311826850">ARC 不支援這項政策。</translation>
 <translation id="34160070798637152">控管裝置通用的網路設定。</translation>
 <translation id="3417130629744653218">允許網站查詢可用的付款方式。</translation>
diff --git a/components/prefs/json_pref_store_unittest.cc b/components/prefs/json_pref_store_unittest.cc
index b3984f5..2f54fd46 100644
--- a/components/prefs/json_pref_store_unittest.cc
+++ b/components/prefs/json_pref_store_unittest.cc
@@ -401,9 +401,9 @@
   // Check values.
   const Value* result = nullptr;
   EXPECT_TRUE(pref_store->GetValue("list", &result));
-  EXPECT_EQ(ListValue(), *result);
+  EXPECT_EQ(Value::List(), *result);
   EXPECT_TRUE(pref_store->GetValue("dict", &result));
-  EXPECT_EQ(DictionaryValue(), *result);
+  EXPECT_EQ(Value::Dict(), *result);
 }
 
 // This test is just documenting some potentially non-obvious behavior. It
diff --git a/components/privacy_sandbox/BUILD.gn b/components/privacy_sandbox/BUILD.gn
index 5779932..0a9004ea 100644
--- a/components/privacy_sandbox/BUILD.gn
+++ b/components/privacy_sandbox/BUILD.gn
@@ -16,12 +16,19 @@
   public_deps = [ "//base" ]
 }
 
+static_library("features") {
+  sources = [
+    "privacy_sandbox_features.cc",
+    "privacy_sandbox_features.h",
+  ]
+
+  public_deps = [ "//base" ]
+}
+
 source_set("privacy_sandbox") {
   sources = [
     "canonical_topic.cc",
     "canonical_topic.h",
-    "privacy_sandbox_features.cc",
-    "privacy_sandbox_features.h",
     "privacy_sandbox_settings.cc",
     "privacy_sandbox_settings.h",
   ]
@@ -41,7 +48,10 @@
     "//url:url",
   ]
 
-  public_deps = [ "//base" ]
+  public_deps = [
+    ":features",
+    "//base",
+  ]
 }
 
 source_set("unit_tests") {
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc
index 18b7815c..bc788180 100644
--- a/components/privacy_sandbox/privacy_sandbox_features.cc
+++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -9,20 +9,6 @@
 BASE_FEATURE(kPrivacySandboxSettings4,
              "PrivacySandboxSettings4",
              base::FEATURE_DISABLED_BY_DEFAULT);
-const base::FeatureParam<bool> kPrivacySandboxSettings4ConsentRequired{
-    &kPrivacySandboxSettings4, "consent-required", false};
-const base::FeatureParam<bool> kPrivacySandboxSettings4NoticeRequired{
-    &kPrivacySandboxSettings4, "notice-required", false};
-
-const base::FeatureParam<bool>
-    kPrivacySandboxSettings4ForceShowConsentForTesting{
-        &kPrivacySandboxSettings4, "force-show-consent-for-testing", false};
-const base::FeatureParam<bool>
-    kPrivacySandboxSettings4ForceShowNoticeRowForTesting{
-        &kPrivacySandboxSettings4, "force-show-notice-row-for-testing", false};
-const base::FeatureParam<bool>
-    kPrivacySandboxSettings4ForceShowNoticeEeaForTesting{
-        &kPrivacySandboxSettings4, "force-show-notice-eea-for-testing", false};
 
 BASE_FEATURE(kPrivacySandboxSettings3,
              "PrivacySandboxSettings3",
diff --git a/components/privacy_sandbox/privacy_sandbox_features.h b/components/privacy_sandbox/privacy_sandbox_features.h
index 7723b64..f522190a 100644
--- a/components/privacy_sandbox/privacy_sandbox_features.h
+++ b/components/privacy_sandbox/privacy_sandbox_features.h
@@ -15,22 +15,30 @@
 // When true, the user will be shown a consent to enable the Privacy Sandbox
 // release 4, if they accept the APIs will become active. Only one of this and
 // the below notice feature should be enabled at any one time.
-extern const base::FeatureParam<bool> kPrivacySandboxSettings4ConsentRequired;
+constexpr base::FeatureParam<bool> kPrivacySandboxSettings4ConsentRequired{
+    &kPrivacySandboxSettings4, "consent-required", false};
 // When true, the user will be shown a notice, after which the Privacy Sandbox
 // 4 APIs will become active. Only one of this and the above consent feature
 // should be enabled at any one time.
-extern const base::FeatureParam<bool> kPrivacySandboxSettings4NoticeRequired;
+constexpr base::FeatureParam<bool> kPrivacySandboxSettings4NoticeRequired{
+    &kPrivacySandboxSettings4, "notice-required", false};
 
 // Feature parameters which should exclusively be used for testing purposes.
 // Enabling any of these parameters may result in the Privacy Sandbox prefs
 // (unsynced) entering an unexpected state, requiring profile deletion to
 // resolve.
-extern const base::FeatureParam<bool>
-    kPrivacySandboxSettings4ForceShowConsentForTesting;
-extern const base::FeatureParam<bool>
-    kPrivacySandboxSettings4ForceShowNoticeRowForTesting;
-extern const base::FeatureParam<bool>
-    kPrivacySandboxSettings4ForceShowNoticeEeaForTesting;
+constexpr base::FeatureParam<bool>
+    kPrivacySandboxSettings4ForceShowConsentForTesting{
+        &kPrivacySandboxSettings4, "force-show-consent-for-testing", false};
+constexpr base::FeatureParam<bool>
+    kPrivacySandboxSettings4ForceShowNoticeRowForTesting{
+        &kPrivacySandboxSettings4, "force-show-notice-row-for-testing", false};
+constexpr base::FeatureParam<bool>
+    kPrivacySandboxSettings4ForceShowNoticeEeaForTesting{
+        &kPrivacySandboxSettings4, "force-show-notice-eea-for-testing", false};
+constexpr base::FeatureParam<bool>
+    kPrivacySandboxSettings4ShowSampleDataForTesting{&kPrivacySandboxSettings4,
+                                                     "show-sample-data", false};
 
 // Enables the third release of the Privacy Sandbox settings.
 BASE_DECLARE_FEATURE(kPrivacySandboxSettings3);
diff --git a/components/privacy_sandbox_strings.grdp b/components/privacy_sandbox_strings.grdp
index 686f63a..df40cea 100644
--- a/components/privacy_sandbox_strings.grdp
+++ b/components/privacy_sandbox_strings.grdp
@@ -78,6 +78,109 @@
     Esed purus vestibulum velit convalli
   </message>
 
+  <!-- Privacy Sandbox v4 - Notice EEA. -->
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_TITLE" translateable="false" desc="Privacy Sandbox dialog notice EEA: title." formatter_data="android_java">
+    Lorem ipsum Notice EEA
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_DESCRIPTION_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First section of the body, above the bullet points." formatter_data="android_java">
+    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pretium pulvinar metus non mollis. Quisque placerat eget nisl sit amet facilisis.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First bullet point (outside expand)." formatter_data="android_java">
+    Nulla in tortor: a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second bullet point (outside expand)." formatter_data="android_java">
+    Sed purus vestibulum: velit convallis suscipit. Aenean aliquam ut velit eget dapibus. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_EXPAND_LABEL" translateable="false" desc="Privacy Sandbox dialog notice EEA: Text user clicks to expand the collapsed section." formatter_data="android_java">
+    Vestibulum orci risus, consectetur
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_DESCRIPTION_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second section of text, below the expand label." formatter_data="android_java">
+    Consectetur adipiscing elit duis pretium pulvinar metus non mollis
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_ACK_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice EEA: Got it button." formatter_data="android_java">
+    Sed
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_SETTINGS_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice EEA: Settings button." formatter_data="android_java">
+    Cras id
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_HEADING_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First header in learn more expand." formatter_data="android_java">
+    Esed purus vestibulum velit convalli
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_DESCRIPTION" translateable="false" desc="Privacy Sandbox dialog notice EEA: First description block in expand." formatter_data="android_java">
+    Nulla in tortor a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit. Integer et libero id metus egestas consequat non a ipsum.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_HEADING_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second header in learn more expand." formatter_data="android_java">
+    Proin sed purus vestibulum velit velit eget dapibus.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_1" translateable="false" desc="Privacy Sandbox dialog notice EEA: First bullet point in expand." formatter_data="android_java">
+    <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Nulla in tortor:<ph name="END_BOLD">&lt;/b&gt;</ph> a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_2" translateable="false" desc="Privacy Sandbox dialog notice EEA: Second bullet point in expand." formatter_data="android_java">
+    <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Consectetur adipiscing elit:<ph name="END_BOLD">&lt;/b&gt;</ph> Duis pretium pulvinar metus non mollis
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_BULLET_3" translateable="false" desc="Privacy Sandbox dialog notice EEA: Third bullet point in expand." formatter_data="android_java">
+    <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Sed purus vestibulum: <ph name="END_BOLD">&lt;/b&gt;</ph> velit convallis suscipit. Aenean aliquam ut velit eget dapibus. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
+  </message>
+
+  <!-- Privacy Sandbox v4 - Notice ROW. -->
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_TITLE" translateable="false" desc="Privacy Sandbox dialog notice ROW: title." formatter_data="android_java">
+    Lorem ipsum Notice ROW
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First section of the body, above the image." formatter_data="android_java">
+    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pretium pulvinar metus non mollis.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second section of the body, above the image." formatter_data="android_java">
+    Nulla in tortor a ligula scelerisque laoreet. Sed sem velit, varius non purus vitae, imperdiet porttitor elit. Integer et libero id metus egestas consequat non a ipsum. Quisque placerat eget nisl sit amet facilisis.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_3" translateable="false" desc="Privacy Sandbox dialog notice ROW: Third section of the body, below the image." formatter_data="android_java">
+    Vestibulum pretium placerat justo vel suscipit. Quisque urna arcu, elementum ut venenatis ornare, consequat ac turpis. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_4" translateable="false" desc="Privacy Sandbox dialog notice ROW: Fourth section of the body, below the expand label." formatter_data="android_java">
+    Proin sed purus vestibulum velit convallis suscipit eget dapibus.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_ACK_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice ROW: Got it button on notice in eea." formatter_data="android_java">
+    Sed
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_SETTINGS_BUTTON" translateable="false" desc="Privacy Sandbox dialog notice ROW: Settings button in notice." formatter_data="android_java">
+    Cras id
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_EXPAND_LABEL" translateable="false" desc="Privacy Sandbox dialog notice ROW: Expand text." formatter_data="android_java">
+    Vestibulum orci risus consectetur
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First header inside expand section." formatter_data="android_java">
+    Esed purus vestibulum velit convalli
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First description text in body, underneath first header." formatter_data="android_java">
+    Etiam dictum sem et neque molestie lobortis. Morbi quam tellus, tincidunt eget dapibus ac, lobortis et lacus. Integer nec egestas elit. Nulla venenatis facilisis dui eget suscipit.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second heading inside expand section." formatter_data="android_java">
+    Class aptent taciti sociosqu ad
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second description text in body, underneath second header." formatter_data="android_java">
+    Vestibulum pretium placerat justo vel suscipit. Quisque urna arcu.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_BULLET_1" translateable="false" desc="Privacy Sandbox dialog notice ROW: First bullet point in ROW notice expand." formatter_data="android_java">
+    Sed elementum tellus condimentum quam vestibulum lacinia. Ut eu lobortis massa, venenatis sodales lacus. Nulla elementum magna et tortor efficitur, at volutpat metus varius.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_BULLET_2" translateable="false" desc="Privacy Sandbox dialog notice ROW: Second bullet point in ROW notice expand." formatter_data="android_java">
+    Duis tempor nulla nisi, ac bibendum lorem tempus sit amet. Proin non blandit risus. Maecenas facilisis enim nec tristique tristique. Eelementum ut venenatis ornare, consequat ac turpis. Vestibulum orci risus, consectetur non odio vulputate, mattis dignissim purus. Cras id tempor mi.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_3" translateable="false" desc="Privacy Sandbox dialog notice ROW: Third section in body, below bullet points." formatter_data="android_java">
+    Etiam hendrerit turpis nibh, ac maximus lectus placerat at. Vivamus ligula quam, posuere luctus felis eu, dictum egestas arcu. per conubia nostra, per inceptos himenaeos. Cras ut metus vel est molestie finibus nec ut orci.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_4" translateable="false" desc="Privacy Sandbox dialog notice ROW: Fourth section in body, immediately below third." formatter_data="android_java">
+    Aliquam euismod scelerisque metus, in aliquet est vehicula ut. Curabitur sit amet ligula quis ante maximus gravida non id magna. Pellentesque interdum venenatis leo, at ultrices felis mollis nec. Integer vulputate velit eget mauris lacinia, ut ullamcorper mauris vehicula.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_HEADING_3" translateable="false" desc="Privacy Sandbox dialog notice ROW: Third header inside learn more expand." formatter_data="android_java">
+    Orci varius natoque penatibus et
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_5" translateable="false" desc="Privacy Sandbox dialog notice ROW: Fifth section in body below header 3." formatter_data="android_java">
+    Suspendisse at dui pulvinar, rhoncus orci at, porttitor nibh. Curabitur lacinia nulla sem, eu euismod dolor vulputate quis. Duis mattis eros et arcu elementum tempor. Duis pharetra eleifend sagittis.
+  </message>
+  <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LEARN_MORE_DESCRIPTION_6" translateable="false" desc="Privacy Sandbox dialog notice ROW: Sixth section in body, immediately below fifth." formatter_data="android_java">
+    Cras sed lacus suscipit, efficitur erat nec, semper sapien. Fusce at nunc molestie, elementum augue at, auctor nunc. Sed dui nisi, consectetur sit amet urna vitae, facilisis scelerisque justo.
+  </message>
+
   <!-- Privacy Sandbox v4 - Shared dialog strings. -->
   <message name="IDS_PRIVACY_SANDBOX_M1_DIALOG_MORE_BUTTON" translateable="false" desc="Privacy Sandbox dialog more button: Clicking on it makes the dialog scrolling to the bottom to show all the content." formatter_data="android_java">
     More
diff --git a/components/saved_tab_groups/saved_tab_group.cc b/components/saved_tab_groups/saved_tab_group.cc
index 9a1e333..9ac8a2e 100644
--- a/components/saved_tab_groups/saved_tab_group.cc
+++ b/components/saved_tab_groups/saved_tab_group.cc
@@ -122,36 +122,21 @@
   return *this;
 }
 
-SavedTabGroup& SavedTabGroup::AddTab(SavedTabGroupTab tab,
-                                     bool update_tab_positions) {
+SavedTabGroup& SavedTabGroup::AddTab(size_t index, SavedTabGroupTab tab) {
+  CHECK_GE(index, 0u);
+  CHECK_LE(index, saved_tabs_.size());
   CHECK(!ContainsTab(tab.saved_tab_guid()));
-
-  if (tab.position() == SavedTabGroupTab::kUnsetPosition) {
-    tab.SetPosition(saved_tabs_.size());
-  }
-
-  InsertTabImpl(tab);
-
-  if (update_tab_positions) {
-    UpdateTabPositionsImpl();
-  }
-
+  saved_tabs_.emplace(saved_tabs_.begin() + index, std::move(tab));
   SetUpdateTimeWindowsEpochMicros(base::Time::Now());
   return *this;
 }
 
-SavedTabGroup& SavedTabGroup::RemoveTab(const base::GUID& saved_tab_guid,
-                                        bool update_tab_positions) {
+SavedTabGroup& SavedTabGroup::RemoveTab(const base::GUID& saved_tab_guid) {
   absl::optional<size_t> index = GetIndexOfTab(saved_tab_guid);
   CHECK(index.has_value());
   CHECK_GE(index.value(), 0u);
   CHECK_LT(index.value(), saved_tabs_.size());
   saved_tabs_.erase(saved_tabs_.begin() + index.value());
-
-  if (update_tab_positions) {
-    UpdateTabPositionsImpl();
-  }
-
   SetUpdateTimeWindowsEpochMicros(base::Time::Now());
   return *this;
 }
@@ -176,7 +161,6 @@
   CHECK(!ContainsTab(tab.saved_tab_guid()));
   saved_tabs_.erase(saved_tabs_.begin() + index.value());
   saved_tabs_.insert(saved_tabs_.begin() + index.value(), std::move(tab));
-  UpdateTabPositionsImpl();
   SetUpdateTimeWindowsEpochMicros(base::Time::Now());
   return *this;
 }
@@ -201,52 +185,10 @@
         saved_tabs_.rbegin() + ((saved_tabs_.size() - 1) - curr_index.value()) +
             1);
   }
-  UpdateTabPositionsImpl();
   SetUpdateTimeWindowsEpochMicros(base::Time::Now());
   return *this;
 }
 
-void SavedTabGroup::UpdateTabPositionsImpl() {
-  for (size_t i = 0; i < saved_tabs_.size(); ++i) {
-    saved_tabs_[i].SetPosition(i);
-  }
-}
-
-void SavedTabGroup::InsertTabImpl(const SavedTabGroupTab& tab) {
-  // We can always safely insert the first tab at the end. We can also safely
-  // insert `tab` if its position is larger than the position at the end of
-  // `saved_tabs_`.
-  if (saved_tabs_.empty() ||
-      saved_tabs_[saved_tabs_.size() - 1].position() < tab.position()) {
-    saved_tabs_.emplace_back(std::move(tab));
-    return;
-  }
-
-  // Insert `tab` in front of an element if one of these criteria
-  // are met:
-  // 1. The current index is larger than `tab`.
-  // 2. The current index has the same position as `tab` and is not
-  // the most recently updated position.
-  for (size_t index = 0; index < saved_tabs_.size(); ++index) {
-    const SavedTabGroupTab& curr_tab = saved_tabs_[index];
-    bool curr_position_larger = curr_tab.position() > tab.position();
-    bool curr_position_same = curr_tab.position() == tab.position();
-    bool curr_position_least_recently_updated =
-        curr_tab.update_time_windows_epoch_micros() <=
-        tab.update_time_windows_epoch_micros();
-
-    if (curr_position_larger ||
-        (curr_position_same && curr_position_least_recently_updated)) {
-      saved_tabs_.insert(saved_tabs_.begin() + index, std::move(tab));
-      return;
-    }
-  }
-
-  // This can happen when the last element of the vector has the same position
-  // as `group` and was more recently updated.
-  saved_tabs_.push_back(std::move(tab));
-}
-
 bool SavedTabGroup::ShouldMergeGroup(
     const sync_pb::SavedTabGroupSpecifics& sync_specific) {
   bool sync_update_is_latest =
diff --git a/components/saved_tab_groups/saved_tab_group.h b/components/saved_tab_groups/saved_tab_group.h
index ce50577..dc03c74c3 100644
--- a/components/saved_tab_groups/saved_tab_group.h
+++ b/components/saved_tab_groups/saved_tab_group.h
@@ -24,7 +24,6 @@
 // tab_group_editor_bubble_view.
 class SavedTabGroup {
  public:
-  // Used to denote groups that have not been given a position.
   static constexpr int kUnsetPosition = -1;
 
   SavedTabGroup(
@@ -84,22 +83,15 @@
   SavedTabGroup& SetPosition(int position);
 
   // Tab mutators.
-  // Add `tab` into its position in `saved_tabs_` if it is set. Otherwise add it
-  // to the end. If the tab already exists, CHECK. If `update_tab_positions` is
-  // true, update the positions of all tabs in the group.
-  SavedTabGroup& AddTab(SavedTabGroupTab tab,
-                        bool update_tab_positions = false);
-
+  // Adds `tab` to `saved_tabs_` at the specified `index` unless the added tab
+  // already exists. In this case we CHECK.
+  SavedTabGroup& AddTab(size_t index, SavedTabGroupTab tab);
+  // Removes the tab denoted by `tab_id` from `saved_tabs_`. This function will
+  // remove the last tab: crbug/1371959.
+  SavedTabGroup& RemoveTab(const base::GUID& tab_id);
   // Updates the tab with with `tab_id` tab.guid() with a value of `tab`. If
   // there is no tab, this function will CHECK.
   SavedTabGroup& UpdateTab(SavedTabGroupTab tab);
-
-  // Removes a tab from `saved_tabs_` denoted by `saved_tab_guid` even if that
-  // was the last tab in the group: crbug/1371959. If `update_tab_positions` is
-  // true, update the positions of all tabs in the group.
-  SavedTabGroup& RemoveTab(const base::GUID& saved_tab_guid,
-                           bool update_tab_positions = false);
-
   // Replaces that tab denoted by `tab_id` with value of `tab` unless the
   // replacement tab already exists. In this case we CHECK.
   SavedTabGroup& ReplaceTabAt(const base::GUID& saved_tab_guid,
@@ -118,17 +110,6 @@
   // 2. The `sync_specific` has the oldest (smallest) creation time.
   bool ShouldMergeGroup(const sync_pb::SavedTabGroupSpecifics& sync_specific);
 
-  // Insert `tab` into sorted order based on its position compared to already
-  // stored tabs in its group. It should be noted that the list of tabs in each
-  // group must already be in sorted order for this function to work as
-  // intended. To do this, UpdateTabPositionsImpl() can be called before calling
-  // this method.
-  void InsertTabImpl(const SavedTabGroupTab& tab);
-
-  // Updates all tab positions to match the index they are currently stored at
-  // in the group at `group_index`. Does not call observers.
-  void UpdateTabPositionsImpl();
-
   // Converts a `SavedTabGroupSpecifics` retrieved from sync into a
   // `SavedTabGroupTab`.
   static SavedTabGroup FromSpecifics(
@@ -165,8 +146,8 @@
   std::vector<SavedTabGroupTab> saved_tabs_;
 
   // The current position of the group in relation to all other saved groups.
-  // A value of kUnsetPosition means that the group was not assigned a position
-  // and will be assigned one when it is added into the SavedTabGroupModel.
+  // A value of -1 means that the group was not assigned a position and will be
+  // assigned one when it is added into the SavedTabGroupModel.
   int position_;
 
   // Timestamp for when the tab was created using windows epoch microseconds.
diff --git a/components/saved_tab_groups/saved_tab_group_model.cc b/components/saved_tab_groups/saved_tab_group_model.cc
index 6694210..eadf818d 100644
--- a/components/saved_tab_groups/saved_tab_group_model.cc
+++ b/components/saved_tab_groups/saved_tab_group_model.cc
@@ -88,9 +88,8 @@
 
   InsertGroupImpl(std::move(saved_group));
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupAddedLocally(Get(group_guid)->saved_guid());
-  }
 }
 
 void SavedTabGroupModel::Remove(const tab_groups::TabGroupId tab_group_id) {
@@ -100,10 +99,9 @@
   const int index = GetIndexOf(tab_group_id).value();
   base::GUID removed_guid = Get(tab_group_id)->saved_guid();
   std::unique_ptr<SavedTabGroup> removed_group = RemoveImpl(index);
-  UpdateGroupPositionsImpl();
-  for (auto& observer : observers_) {
+  UpdatePositionsImpl();
+  for (auto& observer : observers_)
     observer.SavedTabGroupRemovedLocally(removed_group.get());
-  }
 }
 
 void SavedTabGroupModel::Remove(const base::GUID& id) {
@@ -113,10 +111,9 @@
   const int index = GetIndexOf(id).value();
   base::GUID removed_guid = Get(id)->saved_guid();
   std::unique_ptr<SavedTabGroup> removed_group = RemoveImpl(index);
-  UpdateGroupPositionsImpl();
-  for (auto& observer : observers_) {
+  UpdatePositionsImpl();
+  for (auto& observer : observers_)
     observer.SavedTabGroupRemovedLocally(removed_group.get());
-  }
 }
 
 void SavedTabGroupModel::UpdateVisualData(
@@ -128,9 +125,8 @@
   const absl::optional<int> index = GetIndexOf(tab_group_id);
   UpdateVisualDataImpl(index.value(), visual_data);
   base::GUID updated_guid = Get(tab_group_id)->saved_guid();
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedLocally(updated_guid);
-  }
 }
 
 void SavedTabGroupModel::UpdateVisualData(
@@ -141,9 +137,8 @@
 
   const absl::optional<int> index = GetIndexOf(id);
   UpdateVisualDataImpl(index.value(), visual_data);
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedLocally(id);
-  }
 }
 
 void SavedTabGroupModel::AddedFromSync(SavedTabGroup saved_group) {
@@ -153,9 +148,8 @@
 
   InsertGroupImpl(std::move(saved_group));
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupAddedFromSync(Get(group_guid)->saved_guid());
-  }
 }
 
 void SavedTabGroupModel::RemovedFromSync(
@@ -166,9 +160,8 @@
   const absl::optional<int> index = GetIndexOf(tab_group_id);
   base::GUID removed_guid = Get(tab_group_id)->saved_guid();
   std::unique_ptr<SavedTabGroup> removed_group = RemoveImpl(index.value());
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupRemovedFromSync(removed_group.get());
-  }
 }
 
 void SavedTabGroupModel::RemovedFromSync(const base::GUID& id) {
@@ -178,9 +171,8 @@
   const absl::optional<int> index = GetIndexOf(id);
   base::GUID removed_guid = Get(id)->saved_guid();
   std::unique_ptr<SavedTabGroup> removed_group = RemoveImpl(index.value());
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupRemovedFromSync(removed_group.get());
-  }
 }
 
 void SavedTabGroupModel::UpdatedVisualDataFromSync(
@@ -192,9 +184,8 @@
   const absl::optional<int> index = GetIndexOf(tab_group_id);
   UpdateVisualDataImpl(index.value(), visual_data);
   base::GUID updated_guid = Get(tab_group_id)->saved_guid();
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedFromSync(updated_guid);
-  }
 }
 
 void SavedTabGroupModel::UpdatedVisualDataFromSync(
@@ -205,9 +196,8 @@
 
   const absl::optional<int> index = GetIndexOf(id);
   UpdateVisualDataImpl(index.value(), visual_data);
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedFromSync(id);
-  }
 }
 
 SavedTabGroup* SavedTabGroupModel::GetGroupContainingTab(
@@ -232,23 +222,16 @@
 
 void SavedTabGroupModel::AddTabToGroup(const base::GUID& group_id,
                                        SavedTabGroupTab tab,
-                                       bool update_tab_positions) {
+                                       int index) {
   if (!Contains(group_id))
     return;
 
   const base::GUID tab_id = tab.saved_tab_guid();
   absl::optional<int> group_index = GetIndexOf(group_id);
-  saved_tab_groups_[group_index.value()].AddTab(tab, update_tab_positions);
+  saved_tab_groups_[group_index.value()].AddTab(index, tab);
 
-  if (!update_tab_positions) {
-    for (auto& observer : observers_) {
-      observer.SavedTabGroupUpdatedFromSync(group_id);
-    }
-  } else {
-    for (auto& observer : observers_) {
-      observer.SavedTabGroupUpdatedLocally(group_id, tab_id);
-    }
-  }
+  for (auto& observer : observers_)
+    observer.SavedTabGroupUpdatedLocally(group_id, tab_id);
 }
 
 void SavedTabGroupModel::UpdateTabInGroup(const base::GUID& group_id,
@@ -263,8 +246,7 @@
 }
 
 void SavedTabGroupModel::RemoveTabFromGroup(const base::GUID& group_id,
-                                            const base::GUID& tab_id,
-                                            bool update_tab_positions) {
+                                            const base::GUID& tab_id) {
   if (!Contains(group_id))
     return;
 
@@ -282,20 +264,11 @@
   }
 
   // Copy `tab_id` to prevent uaf when ungrouping a saved tab: crbug/1401965.
-  const base::GUID copy_tab_id = tab_id;
-  saved_tab_groups_[index.value()].RemoveTab(tab_id, update_tab_positions);
+  base::GUID copy_tab_id = tab_id;
+  saved_tab_groups_[index.value()].RemoveTab(tab_id);
 
-  // TODO(dljames): Update to use SavedTabGroupRemoveLocally and update the API
-  // to pass a group_id and an optional tab_id.
-  if (!update_tab_positions) {
-    for (auto& observer : observers_) {
-      observer.SavedTabGroupUpdatedFromSync(group_id);
-    }
-  } else {
-    for (auto& observer : observers_) {
-      observer.SavedTabGroupUpdatedLocally(group_id, copy_tab_id);
-    }
-  }
+  for (auto& observer : observers_)
+    observer.SavedTabGroupUpdatedLocally(group_id, copy_tab_id);
 }
 
 void SavedTabGroupModel::ReplaceTabInGroupAt(const base::GUID& group_id,
@@ -304,10 +277,10 @@
   if (!Contains(group_id))
     return;
 
-  // Copy `tab_id` to prevent uaf when ungrouping a saved tab: crbug/1401965.
-  const base::GUID copy_tab_id = tab_id;
   const base::GUID guid = new_tab.saved_tab_guid();
   absl::optional<int> index = GetIndexOf(group_id);
+  // Copy `tab_id` to prevent uaf when ungrouping a saved tab: crbug/1401965.
+  base::GUID copy_tab_id = tab_id;
   saved_tab_groups_[index.value()].ReplaceTabAt(tab_id, new_tab);
 
   for (auto& observer : observers_) {
@@ -322,14 +295,13 @@
   if (!Contains(group_id))
     return;
 
-  // Copy `tab_id` to prevent uaf when ungrouping a saved tab: crbug/1401965.
-  const base::GUID copy_tab_id = tab_id;
   absl::optional<int> index = GetIndexOf(group_id);
+  // Copy `tab_id` to prevent uaf when ungrouping a saved tab: crbug/1401965.
+  base::GUID copy_tab_id = tab_id;
   saved_tab_groups_[index.value()].MoveTab(tab_id, new_index);
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedLocally(group_id, copy_tab_id);
-  }
 }
 
 std::unique_ptr<sync_pb::SavedTabGroupSpecifics> SavedTabGroupModel::MergeGroup(
@@ -346,9 +318,8 @@
     Reorder(group_id, preferred_index);
   }
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedFromSync(group_id);
-  }
 
   return Get(group_id)->ToSpecifics();
 }
@@ -366,9 +337,8 @@
 
   tab->MergeTab(std::move(sync_specific));
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedFromSync(group_id, tab->saved_group_guid());
-  }
 
   return tab->ToSpecifics();
 }
@@ -387,14 +357,13 @@
   saved_tab_groups_.emplace(saved_tab_groups_.begin() + new_index,
                             std::move(group));
 
-  UpdateGroupPositionsImpl();
+  UpdatePositionsImpl();
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupReorderedLocally();
-  }
 }
 
-void SavedTabGroupModel::UpdateGroupPositionsImpl() {
+void SavedTabGroupModel::UpdatePositionsImpl() {
   for (size_t i = 0; i < saved_tab_groups_.size(); ++i)
     saved_tab_groups_[i].SetPosition(i);
 }
@@ -457,7 +426,7 @@
       tabs.emplace_back(SavedTabGroupTab::FromSpecifics(proto));
   }
 
-  UpdateGroupPositionsImpl();
+  UpdatePositionsImpl();
 
   for (const SavedTabGroupTab& tab : tabs) {
     absl::optional<int> index = GetIndexOf(tab.saved_group_guid());
@@ -465,7 +434,7 @@
       tabs_missing_groups.emplace_back(std::move(*tab.ToSpecifics()));
     } else {
       base::GUID group_id = tab.saved_group_guid();
-      AddTabToGroup(group_id, std::move(tab), /*update_tab_positions=*/false);
+      AddTabToGroup(group_id, std::move(tab), 0);
     }
   }
 
@@ -481,9 +450,8 @@
   SavedTabGroup& saved_group = saved_tab_groups_[index.value()];
   saved_group.SetLocalGroupId(absl::nullopt);
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedLocally(saved_group.saved_guid());
-  }
 }
 
 void SavedTabGroupModel::OnGroupOpenedInTabStrip(
@@ -496,9 +464,8 @@
   SavedTabGroup& saved_group = saved_tab_groups_[index.value()];
   saved_group.SetLocalGroupId(tab_group_id);
 
-  for (auto& observer : observers_) {
+  for (auto& observer : observers_)
     observer.SavedTabGroupUpdatedLocally(saved_group.saved_guid());
-  }
 }
 
 std::unique_ptr<SavedTabGroup> SavedTabGroupModel::RemoveImpl(int index) {
diff --git a/components/saved_tab_groups/saved_tab_group_model.h b/components/saved_tab_groups/saved_tab_group_model.h
index 78f736e2..46936393 100644
--- a/components/saved_tab_groups/saved_tab_group_model.h
+++ b/components/saved_tab_groups/saved_tab_group_model.h
@@ -90,23 +90,18 @@
   SavedTabGroup* GetGroupContainingTab(const base::Token& local_tab_id);
 
   // Adds a saved tab to `index` in the specified group denoted by `group_id` if
-  // it exists. If `update_tab_positions` is true, update the positions of all
-  // tabs in the group.
+  // it exists.
   void AddTabToGroup(const base::GUID& group_id,
                      SavedTabGroupTab tab,
-                     bool update_tab_positions = false);
+                     int index);
 
   // Calls the UpdateTab method on a group found by group id in the model.
   // Calls the observer function SavedTabGroupUpdatedLocally.
   void UpdateTabInGroup(const base::GUID& group_id, SavedTabGroupTab tab);
 
-  // Removes saved tab `tab_id` in the specified group denoted by
-  // `group_id` if it exists. We delete the group instead if the last tab is
-  // removed from it. If `update_tab_positions` is true, update the positions of
-  // all tabs in the group.
-  void RemoveTabFromGroup(const base::GUID& group_id,
-                          const base::GUID& tab_id,
-                          bool update_tab_positions = false);
+  // Removes a saved tab from `index` in the specified group denoted by
+  // `group_id` if it exists.
+  void RemoveTabFromGroup(const base::GUID& group_id, const base::GUID& tab_id);
 
   // Replaces a saved tab `tab_id` in the specified group denoted by
   // `group_id` if it exists with `new_tab`.
@@ -152,7 +147,7 @@
  private:
   // Updates all group positions to match the index they are currently stored
   // at.
-  void UpdateGroupPositionsImpl();
+  void UpdatePositionsImpl();
 
   // Insert `group` into sorted order based on its position compared to already
   // stored groups in `saved_tab_groups_`. It should be noted that
diff --git a/components/saved_tab_groups/saved_tab_group_model_unittest.cc b/components/saved_tab_groups/saved_tab_group_model_unittest.cc
index 2ddc09b..8b28dc4 100644
--- a/components/saved_tab_groups/saved_tab_group_model_unittest.cc
+++ b/components/saved_tab_groups/saved_tab_group_model_unittest.cc
@@ -78,10 +78,8 @@
 
 SavedTabGroupTab CreateSavedTabGroupTab(const std::string& url,
                                         const std::u16string& title,
-                                        const base::GUID& group_guid,
-                                        absl::optional<int> position) {
-  SavedTabGroupTab tab(GURL(url), title, group_guid, nullptr, absl::nullopt,
-                       absl::nullopt, position);
+                                        const base::GUID& group_guid) {
+  SavedTabGroupTab tab(GURL(url), title, group_guid);
   tab.SetFavicon(gfx::Image());
   return tab;
 }
@@ -92,9 +90,9 @@
   const tab_groups::TabGroupColorId& color = tab_groups::TabGroupColorId::kBlue;
 
   SavedTabGroupTab tab1 =
-      CreateSavedTabGroupTab("www.google.com", u"Google", id, absl::nullopt);
+      CreateSavedTabGroupTab("www.google.com", u"Google", id);
   SavedTabGroupTab tab2 =
-      CreateSavedTabGroupTab("chrome://newtab", u"new tab", id, absl::nullopt);
+      CreateSavedTabGroupTab("chrome://newtab", u"new tab", id);
 
   tab1.SetFavicon(gfx::Image());
   tab2.SetFavicon(gfx::Image());
@@ -211,14 +209,14 @@
         tab_groups::TabGroupColorId::kGreen;
 
     std::vector<SavedTabGroupTab> group_1_tabs = {
-        CreateSavedTabGroupTab("A_Link", u"Only Tab", id_1_, 0)};
+        CreateSavedTabGroupTab("A_Link", u"Only Tab", id_1_)};
     std::vector<SavedTabGroupTab> group_2_tabs = {
-        CreateSavedTabGroupTab("One_Link", u"One Of Two", id_2_, 0),
-        CreateSavedTabGroupTab("Two_Link", u"Second", id_2_, 1)};
+        CreateSavedTabGroupTab("One_Link", u"One Of Two", id_2_),
+        CreateSavedTabGroupTab("Two_Link", u"Second", id_2_)};
     std::vector<SavedTabGroupTab> group_3_tabs = {
-        CreateSavedTabGroupTab("Athos", u"All For One", id_3_, 0),
-        CreateSavedTabGroupTab("Porthos", u"And", id_3_, 1),
-        CreateSavedTabGroupTab("Aramis", u"One For All", id_3_, 2)};
+        CreateSavedTabGroupTab("Athos", u"All For One", id_3_),
+        CreateSavedTabGroupTab("Porthos", u"And", id_3_),
+        CreateSavedTabGroupTab("Aramis", u"One For All", id_3_)};
 
     saved_tab_group_model_->Add(
         CreateSavedTabGroup(title_1, color_1, group_1_tabs, id_1_));
@@ -306,9 +304,9 @@
       tab_groups::TabGroupColorId::kBlue;
 
   SavedTabGroupTab tab1 =
-      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_4, 0);
+      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_4);
   SavedTabGroupTab tab2 =
-      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_4, 1);
+      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_4);
 
   std::vector<SavedTabGroupTab> group_4_tabs = {tab1, tab2};
   SavedTabGroup group_4(title_4, color_4, group_4_tabs, id_4);
@@ -380,23 +378,21 @@
 // Tests that the correct tabs are added to the correct position in group 1.
 TEST_F(SavedTabGroupModelTest, AddTabToGroup) {
   SavedTabGroupTab tab1 =
-      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_1_, 0);
+      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_1_);
   SavedTabGroupTab tab2 =
-      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_1_, 2);
+      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_1_);
 
   SavedTabGroup* group = saved_tab_group_model_->Get(id_1_);
   ASSERT_EQ(group->saved_tabs().size(), size_t(1));
 
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1,
-                                        /*update_tab_positions=*/true);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1, 0);
   EXPECT_EQ(group->saved_tabs().size(), size_t(2));
   EXPECT_EQ(0, group->GetIndexOfTab(tab1.saved_tab_guid()));
   EXPECT_TRUE(group->ContainsTab(tab1.saved_tab_guid()));
   ASSERT_TRUE(group->GetTab(tab1.saved_tab_guid()));
   CompareSavedTabGroupTabs({*group->GetTab(tab1.saved_tab_guid())}, {tab1});
 
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2,
-                                        /*update_tab_positions=*/true);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2, 2);
   EXPECT_EQ(group->saved_tabs().size(), size_t(3));
   EXPECT_EQ(2, group->GetIndexOfTab(tab2.saved_tab_guid()));
   EXPECT_TRUE(group->ContainsTab(tab2.saved_tab_guid()));
@@ -409,28 +405,24 @@
 // Tests that the correct tabs are removed from the correct position in group 1.
 TEST_F(SavedTabGroupModelTest, RemoveTabFromGroup) {
   SavedTabGroupTab tab1 =
-      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_1_, 0);
+      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_1_);
   SavedTabGroupTab tab2 =
-      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_1_, 2);
+      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_1_);
 
   SavedTabGroup* group = saved_tab_group_model_->Get(id_1_);
   ASSERT_EQ(group->saved_tabs().size(), size_t(1));
 
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1,
-                                        /*update_tab_positions=*/true);
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2,
-                                        /*update_tab_positions=*/true);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1, 0);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2, 2);
   EXPECT_EQ(group->saved_tabs().size(), size_t(3));
 
   saved_tab_group_model_->RemoveTabFromGroup(group->saved_guid(),
-                                             tab1.saved_tab_guid(),
-                                             /*update_tab_positions=*/true);
+                                             tab1.saved_tab_guid());
   EXPECT_EQ(group->saved_tabs().size(), size_t(2));
   CompareSavedTabGroupTabs(group->saved_tabs(), {group->saved_tabs()[0], tab2});
 
   saved_tab_group_model_->RemoveTabFromGroup(group->saved_guid(),
-                                             tab2.saved_tab_guid(),
-                                             /*update_tab_positions=*/true);
+                                             tab2.saved_tab_guid());
   EXPECT_EQ(group->saved_tabs().size(), size_t(1));
   CompareSavedTabGroupTabs(group->saved_tabs(), {group->saved_tabs()[0]});
 }
@@ -442,28 +434,23 @@
   ASSERT_EQ(group->saved_tabs().size(), size_t(1));
 
   saved_tab_group_model_->RemoveTabFromGroup(
-      group->saved_guid(), group->saved_tabs()[0].saved_tab_guid(),
-      /*update_tab_positions=*/true);
+      group->saved_guid(), group->saved_tabs()[0].saved_tab_guid());
 
   EXPECT_FALSE(saved_tab_group_model_->Contains(id_1_));
 }
 
 // Tests that the correct tabs are replaced in group 1.
 TEST_F(SavedTabGroupModelTest, ReplaceTabInGroup) {
-  SavedTabGroupTab tab1 =
-      CreateSavedTabGroupTab("first", u"First Tab", id_1_, 0);
+  SavedTabGroupTab tab1 = CreateSavedTabGroupTab("first", u"First Tab", id_1_);
   SavedTabGroupTab tab2 =
-      CreateSavedTabGroupTab("second", u"Second Tab", id_1_, 2);
-  SavedTabGroupTab tab3 =
-      CreateSavedTabGroupTab("third", u"Third Tab", id_1_, absl::nullopt);
+      CreateSavedTabGroupTab("second", u"Second Tab", id_1_);
+  SavedTabGroupTab tab3 = CreateSavedTabGroupTab("third", u"Third Tab", id_1_);
 
   SavedTabGroup* group = saved_tab_group_model_->Get(id_1_);
   ASSERT_EQ(group->saved_tabs().size(), size_t(1));
 
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1,
-                                        /*update_tab_positions=*/true);
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2,
-                                        /*update_tab_positions=*/true);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1, 0);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2, 2);
   EXPECT_EQ(group->saved_tabs().size(), size_t(3));
 
   saved_tab_group_model_->ReplaceTabInGroupAt(group->saved_guid(),
@@ -484,17 +471,15 @@
 // Tests that the correct tabs are moved in group 1.
 TEST_F(SavedTabGroupModelTest, MoveTabInGroup) {
   SavedTabGroupTab tab1 =
-      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_1_, 0);
+      CreateSavedTabGroupTab("4th group", u"First Tab 4th Group", id_1_);
   SavedTabGroupTab tab2 =
-      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_1_, 2);
+      CreateSavedTabGroupTab("2nd link", u"Second Tab 4th Group", id_1_);
 
   SavedTabGroup* group = saved_tab_group_model_->Get(id_1_);
   ASSERT_EQ(group->saved_tabs().size(), size_t(1));
 
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1,
-                                        /*update_tab_positions=*/true);
-  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2,
-                                        /*update_tab_positions=*/true);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab1, 0);
+  saved_tab_group_model_->AddTabToGroup(group->saved_guid(), tab2, 2);
   EXPECT_EQ(group->saved_tabs().size(), size_t(3));
 
   saved_tab_group_model_->MoveTabInGroupTo(group->saved_guid(),
@@ -539,9 +524,8 @@
   EXPECT_EQ(saved_group->saved_guid(), id_3_);
   EXPECT_EQ(saved_group->title(), group->title());
   EXPECT_EQ(saved_group->color(), group->color());
-
-  // We can not use CompareSavedTabGroupTabs because the favicons are not loaded
-  // until the tab is opened through the saved group button.
+  // TODO(dljames): Use CompareSavedTabGroupTabs when we can ensure the order of
+  // tabs and groups are maintained.
   EXPECT_EQ(saved_group->saved_tabs().size(), group->saved_tabs().size());
 }
 
@@ -1005,7 +989,7 @@
   SavedTabGroupTab tab(GURL(url::kAboutBlankURL), std::u16string(u"title"),
                        matching_group.saved_guid(), &matching_group,
                        matching_tab_guid, matching_local_tab_id);
-  matching_group.AddTab(std::move(tab));
+  matching_group.AddTab(0, std::move(tab));
   saved_tab_group_model_->Add(std::move(matching_group));
 
   // Add another non matching SavedTabGroup.
diff --git a/components/saved_tab_groups/saved_tab_group_proto_conversion_unittest.cc b/components/saved_tab_groups/saved_tab_group_proto_conversion_unittest.cc
index 55306fc..25411b2 100644
--- a/components/saved_tab_groups/saved_tab_group_proto_conversion_unittest.cc
+++ b/components/saved_tab_groups/saved_tab_group_proto_conversion_unittest.cc
@@ -95,8 +95,8 @@
   // Create a tab.
   SavedTabGroupTab tab(GURL("chrome://hidden_link"), u"Hidden Title",
                        base::GUID::GenerateRandomV4(), nullptr,
-                       base::GUID::GenerateRandomV4(), absl::nullopt,
-                       absl::nullopt, time_, time_);
+                       base::GUID::GenerateRandomV4(), absl::nullopt, time_,
+                       time_);
 
   // Create a STGSpecific using `tab`.
   std::unique_ptr<sync_pb::SavedTabGroupSpecifics> specific = tab.ToSpecifics();
diff --git a/components/saved_tab_groups/saved_tab_group_sync_bridge.cc b/components/saved_tab_groups/saved_tab_group_sync_bridge.cc
index ab59865b..4e0447a 100644
--- a/components/saved_tab_groups/saved_tab_group_sync_bridge.cc
+++ b/components/saved_tab_groups/saved_tab_group_sync_bridge.cc
@@ -32,6 +32,8 @@
 #include "components/sync/protocol/entity_data.h"
 #include "components/sync/protocol/saved_tab_group_specifics.pb.h"
 
+#include "base/logging.h"
+
 namespace {
 constexpr base::TimeDelta discard_orphaned_tabs_threshold =
     base::Microseconds(base::Time::kMicrosecondsPerDay * 90);
@@ -354,8 +356,7 @@
     if (existing_group) {
       // We do not have this tab. Add the tab from sync into local storage.
       model_->AddTabToGroup(existing_group->saved_guid(),
-                            SavedTabGroupTab::FromSpecifics(specifics),
-                            /*update_tab_positions=*/false);
+                            SavedTabGroupTab::FromSpecifics(specifics), 0);
     } else {
       // We reach this case if we were unable to find a group for this tab. This
       // can happen when sync sends the tab data before the group data. In this
@@ -382,8 +383,7 @@
     if (!group.ContainsTab(guid))
       continue;
 
-    model_->RemoveTabFromGroup(group.saved_guid(), guid,
-                               /*update_tab_positions=*/false);
+    model_->RemoveTabFromGroup(group.saved_guid(), guid);
     return;
   }
 }
@@ -411,8 +411,7 @@
       write_batch->WriteData(tab_iterator->guid(),
                              tab_iterator->SerializeAsString());
       model_->AddTabToGroup(group->saved_guid(),
-                            SavedTabGroupTab::FromSpecifics(*tab_iterator),
-                            /*update_tab_positions=*/false);
+                            SavedTabGroupTab::FromSpecifics(*tab_iterator), 0);
       tab_iterator = tabs_missing_groups_.erase(tab_iterator);
     }
   }
diff --git a/components/saved_tab_groups/saved_tab_group_sync_bridge_unittest.cc b/components/saved_tab_groups/saved_tab_group_sync_bridge_unittest.cc
index 777664e..88ff2ee 100644
--- a/components/saved_tab_groups/saved_tab_group_sync_bridge_unittest.cc
+++ b/components/saved_tab_groups/saved_tab_group_sync_bridge_unittest.cc
@@ -158,7 +158,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
   group.SetPosition(0);
 
   // Note: Here the change type does not matter. The initial merge will add
@@ -196,7 +196,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
@@ -216,8 +216,8 @@
                               group_creation_time);
   SavedTabGroupTab updated_tab_1(GURL("https://support.google.com"), u"Support",
                                  group_guid, nullptr, tab_1_guid, absl::nullopt,
-                                 absl::nullopt, tab_1_creation_time);
-  updated_group.AddTab(updated_tab_1);
+                                 tab_1_creation_time);
+  updated_group.AddTab(0, updated_tab_1);
   updated_group.SetPosition(0);
 
   syncer::EntityChangeList entity_change_list = CreateEntityChangeListFromGroup(
@@ -240,7 +240,7 @@
   // Ensure tab_2 was left untouched.
   SavedTabGroupTab tab_2_replica(GURL("https://google.com"), u"Google",
                                  group_guid, nullptr, tab_2_guid, absl::nullopt,
-                                 absl::nullopt, tab_2_creation_time);
+                                 tab_2_creation_time);
   EXPECT_TRUE(AreTabSpecificsEqual(
       *tab_2_replica.ToSpecifics(),
       *group_from_model->GetTab(tab_2_guid)->ToSpecifics()));
@@ -404,7 +404,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
   group.SetPosition(0);
 
   bridge_->ApplySyncChanges(
@@ -470,7 +470,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
   group.SetPosition(0);
 
   bridge_->ApplySyncChanges(
@@ -512,7 +512,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   EXPECT_EQ(group.saved_tabs().size(), 2u);
 
@@ -562,7 +562,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
@@ -584,7 +584,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
@@ -607,7 +607,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Google",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
@@ -634,7 +634,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_3(GURL("https://youtube.com"), u"Youtube",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
@@ -651,8 +651,7 @@
   // `tab_2` will have its position updated. Once tab ordering is implemented,
   // only the affected tabs will need to be updated. In that case, the Put()
   // call for tab_1 can be removed.
-  saved_tab_group_model_.AddTabToGroup(group_guid, tab_3,
-                                       /*update_tab_positions=*/true);
+  saved_tab_group_model_.AddTabToGroup(group_guid, tab_3, 1);
 }
 
 // Verify that locally removed tabs remove the correct tabs from the processor.
@@ -664,7 +663,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_2(GURL("https://google.com"), u"Goole",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
@@ -675,8 +674,7 @@
   EXPECT_CALL(processor_, Put(tab_2_guid.AsLowercaseString(), _, _)).Times(0);
   EXPECT_CALL(processor_, Put(group_guid.AsLowercaseString(), _, _)).Times(0);
 
-  saved_tab_group_model_.RemoveTabFromGroup(group_guid, tab_1_guid,
-                                            /*update_tab_positions=*/true);
+  saved_tab_group_model_.RemoveTabFromGroup(group_guid, tab_1_guid);
 }
 
 // Verify that locally updated tabs update the correct tabs in the processor.
@@ -690,7 +688,7 @@
                          group.saved_guid());
   SavedTabGroupTab tab_3(GURL("https://youtube.com"), u"Youtube",
                          group.saved_guid());
-  group.AddTab(tab_1).AddTab(tab_2);
+  group.AddTab(0, tab_1).AddTab(1, tab_2);
 
   base::GUID group_guid = group.saved_guid();
   base::GUID tab_1_guid = tab_1.saved_tab_guid();
diff --git a/components/saved_tab_groups/saved_tab_group_tab.cc b/components/saved_tab_groups/saved_tab_group_tab.cc
index 94b0e0f5..f48d5bc 100644
--- a/components/saved_tab_groups/saved_tab_group_tab.cc
+++ b/components/saved_tab_groups/saved_tab_group_tab.cc
@@ -14,7 +14,6 @@
     SavedTabGroup* group,
     absl::optional<base::GUID> saved_tab_guid,
     absl::optional<base::Token> local_tab_id,
-    absl::optional<int> position,
     absl::optional<base::Time> creation_time_windows_epoch_micros,
     absl::optional<base::Time> update_time_windows_epoch_micros,
     absl::optional<gfx::Image> favicon)
@@ -23,7 +22,6 @@
                           : base::GUID::GenerateRandomV4()),
       saved_group_guid_(group_guid),
       local_tab_id_(local_tab_id),
-      position_(position.value_or(kUnsetPosition)),
       saved_tab_group_(group),
       url_(url),
       title_(title),
@@ -68,7 +66,6 @@
       base::GUID::ParseLowercase(specific.tab().group_guid());
   const GURL& url = GURL(specific.tab().url());
   const std::u16string title = base::UTF8ToUTF16(specific.tab().title());
-  int position = specific.tab().position();
 
   base::GUID guid = base::GUID::ParseLowercase(specific.guid());
   base::Time creation_time = base::Time::FromDeltaSinceWindowsEpoch(
@@ -77,7 +74,7 @@
       base::Microseconds(specific.update_time_windows_epoch_micros()));
 
   return SavedTabGroupTab(url, title, group_guid, nullptr, guid, absl::nullopt,
-                          position, creation_time, update_time);
+                          creation_time, update_time);
 }
 
 std::unique_ptr<sync_pb::SavedTabGroupSpecifics> SavedTabGroupTab::ToSpecifics()
@@ -98,7 +95,6 @@
   pb_tab->set_url(url().spec());
   pb_tab->set_group_guid(saved_group_guid().AsLowercaseString());
   pb_tab->set_title(base::UTF16ToUTF8(title()));
-  pb_tab->set_position(position());
 
   return pb_specific;
 }
diff --git a/components/saved_tab_groups/saved_tab_group_tab.h b/components/saved_tab_groups/saved_tab_group_tab.h
index 4b8461a..2ec9c53b 100644
--- a/components/saved_tab_groups/saved_tab_group_tab.h
+++ b/components/saved_tab_groups/saved_tab_group_tab.h
@@ -23,16 +23,12 @@
 // A SavedTabGroupTab stores the url, title, and favicon of a tab.
 class SavedTabGroupTab {
  public:
-  // Used to denote groups that have not been given a position.
-  static constexpr int kUnsetPosition = -1;
-
   SavedTabGroupTab(const GURL& url,
                    const std::u16string& title,
                    const base::GUID& group_guid,
                    SavedTabGroup* group = nullptr,
                    absl::optional<base::GUID> saved_tab_guid = absl::nullopt,
                    absl::optional<base::Token> local_tab_id = absl::nullopt,
-                   absl::optional<int> position = absl::nullopt,
                    absl::optional<base::Time>
                        creation_time_windows_epoch_micros = absl::nullopt,
                    absl::optional<base::Time> update_time_windows_epoch_micros =
@@ -47,7 +43,6 @@
   const absl::optional<base::Token> local_tab_id() const {
     return local_tab_id_;
   }
-  int position() const { return position_; }
   SavedTabGroup* saved_tab_group() const { return saved_tab_group_; }
   const GURL& url() const { return url_; }
   const std::u16string& title() const { return title_; }
@@ -85,11 +80,6 @@
     SetUpdateTimeWindowsEpochMicros(base::Time::Now());
     return *this;
   }
-  SavedTabGroupTab& SetPosition(int position) {
-    position_ = position;
-    SetUpdateTimeWindowsEpochMicros(base::Time::Now());
-    return *this;
-  }
   SavedTabGroupTab& SetUpdateTimeWindowsEpochMicros(
       base::Time update_time_windows_epoch_micros) {
     update_time_windows_epoch_micros_ = update_time_windows_epoch_micros;
@@ -124,11 +114,6 @@
   // The ID used to represent the tab in reference to the web_contents locally.
   absl::optional<base::Token> local_tab_id_;
 
-  // The current position of the tab in relation to all other tabs in the group.
-  // A value of kUnsetPosition means that the group was not assigned a position
-  // and will be assigned one when it is added into its saved group.
-  int position_;
-
   // The Group which owns this tab, this can be null if sync hasn't sent the
   // group over yet.
   raw_ptr<SavedTabGroup> saved_tab_group_;
diff --git a/components/saved_tab_groups/saved_tab_group_unittest.cc b/components/saved_tab_groups/saved_tab_group_unittest.cc
index ce7d024..29d6d77 100644
--- a/components/saved_tab_groups/saved_tab_group_unittest.cc
+++ b/components/saved_tab_groups/saved_tab_group_unittest.cc
@@ -29,21 +29,18 @@
                        tab_groups::TabGroupColorId::kGrey, {});
 }
 
-SavedTabGroupTab CreateDefaultSavedTabGroupTab(const base::GUID& group_guid) {
-  return SavedTabGroupTab(GURL("www.google.com"), u"Default Title", group_guid);
-}
-
 void AddTabToEndOfGroup(
     SavedTabGroup& group,
     absl::optional<base::GUID> saved_guid = absl::nullopt,
     absl::optional<base::Token> local_tab_id = absl::nullopt) {
-  group.AddTab(SavedTabGroupTab(
-      GURL(url::kAboutBlankURL), std::u16string(u"default_title"),
-      group.saved_guid(), &group, saved_guid, local_tab_id));
+  group.AddTab(group.saved_tabs().size(),
+               SavedTabGroupTab(
+                   GURL(url::kAboutBlankURL), std::u16string(u"default_title"),
+                   group.saved_guid(), &group, saved_guid, local_tab_id));
 }
 }  // namespace
 
-TEST(SavedTabGroupTest, GetTabByGUID) {
+TEST(SavedTabGroup, GetTabByGUID) {
   base::GUID tab_1_saved_guid = MakeUniqueGUID();
   base::GUID tab_2_saved_guid = MakeUniqueGUID();
 
@@ -60,7 +57,7 @@
   EXPECT_EQ(&group.saved_tabs()[1], tab_2);
 }
 
-TEST(SavedTabGroupTest, GetTabByToken) {
+TEST(SavedTabGroup, GetTabByToken) {
   base::Token tab_1_local_id = MakeUniqueToken();
   base::Token tab_2_local_id = MakeUniqueToken();
 
@@ -76,138 +73,3 @@
   SavedTabGroupTab* tab_2 = group.GetTab(tab_2_local_id);
   EXPECT_EQ(&group.saved_tabs()[1], tab_2);
 }
-
-TEST(SavedTabGroupTest, AddTabLocallyDisrespectsPositions) {
-  // Create a group and 2 tabs
-  SavedTabGroup group = CreateDefaultEmptySavedTabGroup();
-  SavedTabGroupTab tab_1 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-  SavedTabGroupTab tab_2 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-
-  base::GUID tab_1_saved_guid = tab_1.saved_tab_guid();
-  base::GUID tab_2_saved_guid = tab_2.saved_tab_guid();
-
-  // Set the positions on the tabs and expect the group to ignore them.
-  tab_1.SetPosition(1);
-  tab_2.SetPosition(0);
-
-  // Add both tabs to the group.
-  group.AddTab(std::move(tab_1), /*update_tab_positions=*/true);
-  group.AddTab(std::move(tab_2), /*update_tab_positions=*/true);
-  ASSERT_EQ(2u, group.saved_tabs().size());
-
-  // Locally added groups will be added into their preferred positions if
-  // possible. If not, they will be added as close to the preferred position as
-  // possible, and have their position updated to reflect this.
-  SavedTabGroupTab* first_tab = group.GetTab(tab_1_saved_guid);
-  EXPECT_EQ(&group.saved_tabs()[0], first_tab);
-  EXPECT_EQ(first_tab->position(), 0);
-
-  // Expect tab_2 to be at the front of the group.
-  SavedTabGroupTab* second_tab = group.GetTab(tab_2_saved_guid);
-  EXPECT_EQ(&group.saved_tabs()[1], second_tab);
-  EXPECT_EQ(second_tab->position(), 1);
-}
-
-TEST(SavedTabGroupTest, RemoveTabLocallyReordersPositions) {
-  // Create a group and 2 tabs
-  SavedTabGroup group = CreateDefaultEmptySavedTabGroup();
-  SavedTabGroupTab tab_1 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-  SavedTabGroupTab tab_2 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-
-  base::GUID tab_1_saved_guid = tab_1.saved_tab_guid();
-  base::GUID tab_2_saved_guid = tab_2.saved_tab_guid();
-
-  // Add both tabs to the group.
-  group.AddTab(std::move(tab_1));
-  group.AddTab(std::move(tab_2));
-  ASSERT_EQ(2u, group.saved_tabs().size());
-
-  // Verify tab_2 has a position of 1.
-  {
-    SavedTabGroupTab* second_tab = group.GetTab(tab_2_saved_guid);
-    EXPECT_EQ(&group.saved_tabs()[1], second_tab);
-    EXPECT_EQ(second_tab->position(), 1);
-  }
-
-  // Remove tab_1 from the group.
-  group.RemoveTab(tab_1_saved_guid, /*update_tab_positions=*/true);
-
-  // Verify only tab_2 is in the group.
-  EXPECT_EQ(group.saved_tabs().size(), 1u);
-  EXPECT_FALSE(group.ContainsTab(tab_1_saved_guid));
-  EXPECT_TRUE(group.ContainsTab(tab_2_saved_guid));
-
-  // Verify tab_2 has a position of 0 now.
-  {
-    // Expect tab two to be at the front of the group.
-    SavedTabGroupTab* second_tab = group.GetTab(tab_2_saved_guid);
-    EXPECT_EQ(&group.saved_tabs()[0], second_tab);
-    EXPECT_EQ(second_tab->position(), 0);
-  }
-}
-
-TEST(SavedTabGroupTest, AddTabFromSyncRespectsPositions) {
-  // Create a group and 2 tabs
-  SavedTabGroup group = CreateDefaultEmptySavedTabGroup();
-  SavedTabGroupTab tab_1 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-  SavedTabGroupTab tab_2 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-
-  base::GUID tab_1_saved_guid = tab_1.saved_tab_guid();
-  base::GUID tab_2_saved_guid = tab_2.saved_tab_guid();
-
-  // Set the positions on the tabs and expect the group to respect them.
-  tab_1.SetPosition(1);
-  tab_2.SetPosition(0);
-
-  group.AddTab(std::move(tab_1), /*update_tab_positions=*/false);
-  group.AddTab(std::move(tab_2), /*update_tab_positions=*/false);
-  ASSERT_EQ(2u, group.saved_tabs().size());
-
-  // Expect tab one to be at the end of the group.
-  SavedTabGroupTab* first_tab = group.GetTab(tab_1_saved_guid);
-  EXPECT_EQ(&group.saved_tabs()[1], first_tab);
-  EXPECT_EQ(first_tab->position(), 1);
-
-  // Expect tab two to be at the front of the group.
-  SavedTabGroupTab* second_tab = group.GetTab(tab_2_saved_guid);
-  EXPECT_EQ(&group.saved_tabs()[0], second_tab);
-  EXPECT_EQ(second_tab->position(), 0);
-}
-
-TEST(SavedTabGroupTest, RemoveTabFromSyncMaintainsPositions) {
-  // Create a group and 2 tabs
-  SavedTabGroup group = CreateDefaultEmptySavedTabGroup();
-  SavedTabGroupTab tab_1 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-  SavedTabGroupTab tab_2 = CreateDefaultSavedTabGroupTab(group.saved_guid());
-
-  base::GUID tab_1_saved_guid = tab_1.saved_tab_guid();
-  base::GUID tab_2_saved_guid = tab_2.saved_tab_guid();
-
-  // Add both tabs to the group.
-  group.AddTab(std::move(tab_1));
-  group.AddTab(std::move(tab_2));
-  ASSERT_EQ(2u, group.saved_tabs().size());
-
-  // Verify tab_2 has a position of 1.
-  {
-    SavedTabGroupTab* second_tab = group.GetTab(tab_2_saved_guid);
-    EXPECT_EQ(&group.saved_tabs()[1], second_tab);
-    EXPECT_EQ(second_tab->position(), 1);
-  }
-
-  // Remove tab_1 from the group.
-  group.RemoveTab(tab_1_saved_guid, /*update_tab_positions=*/false);
-
-  // Verify only tab_2 is in the group.
-  EXPECT_EQ(group.saved_tabs().size(), 1u);
-  EXPECT_FALSE(group.ContainsTab(tab_1_saved_guid));
-  EXPECT_TRUE(group.ContainsTab(tab_2_saved_guid));
-
-  // Verify tab_2 keeps its position of 1.
-  {
-    // Expect tab two to be at the front of the group.
-    SavedTabGroupTab* second_tab = group.GetTab(tab_2_saved_guid);
-    EXPECT_EQ(&group.saved_tabs()[0], second_tab);
-    EXPECT_EQ(second_tab->position(), 1);
-  }
-}
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index d66c87d..c6461c65 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -2873,7 +2873,7 @@
 <translation id="8241707690549784388">Siden, du søger, benyttede oplysninger, du har indtastet. Vender du tilbage til denne side kan det betyde, at enhver handling, du har foretaget, skal gentages. Vil du fortsætte?</translation>
 <translation id="8241712895048303527">Bloker på dette website</translation>
 <translation id="8242426110754782860">Fortsæt</translation>
-<translation id="8245703462678310750">Hold fingeren nede på |<ph name="ACCELERATOR" />| for at afslutte visningen i fuld skærm og se downloadfilen.</translation>
+<translation id="8245703462678310750">Hold fingeren på |<ph name="ACCELERATOR" />| for at afslutte visningen i fuld skærm og se downloadfilen.</translation>
 <translation id="8249296373107784235">Annuller</translation>
 <translation id="8249463483885748674">Standardiserede prøver og adgangsprøver</translation>
 <translation id="8252991034201168845">Knappen Administrer indstillinger for hjælpefunktioner – tryk på Enter for at tilpasse dine hjælpefunktioner i ChromeOS-indstillingerne</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index ac9fdd7..53fcce00 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -2421,7 +2421,7 @@
 <translation id="714064300541049402">Turno X da imagem 2 lateral</translation>
 <translation id="7143682719845053166">PRC 32K</translation>
 <translation id="7153549335910886479">{PAYMENT_METHOD,plural, =0{<ph name="PAYMENT_METHOD_PREVIEW" />}=1{<ph name="PAYMENT_METHOD_PREVIEW" /> e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" /> e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</translation>
-<translation id="7153618581592392745">Lilás</translation>
+<translation id="7153618581592392745">Lavanda</translation>
 <translation id="7156870133441232244">É necessário atualizar o servidor para a versão TLS 1.2 ou posterior.</translation>
 <translation id="7163295244162773898">{0,plural, =1{Copiar o ficheiro confidencial?}other{Copiar os ficheiros confidenciais?}}</translation>
 <translation id="717330890047184534">ID Gaia:</translation>
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto
index a0aabef..ca00a21 100644
--- a/components/sync/protocol/autofill_specifics.proto
+++ b/components/sync/protocol/autofill_specifics.proto
@@ -175,9 +175,10 @@
   // name/value or credit_card) should be present.
   optional AutofillProfileSpecifics profile = 4;
 
-  // Obsolete credit card fields.
-  // optional bytes deprecated_encrypted_credit_card = 5;
-  // optional AutofillCreditCardSpecifics deprecated_credit_card = 6;
+  reserved 5;
+  reserved "encrypted_credit_card";
+  reserved 6;
+  reserved "credit_card";
 }
 
 // TODO(crbug.com/1020740): Deprecated, remove this once dependent change is
diff --git a/components/sync/protocol/search_engine_specifics.proto b/components/sync/protocol/search_engine_specifics.proto
index db3a998..cbdd10b 100644
--- a/components/sync/protocol/search_engine_specifics.proto
+++ b/components/sync/protocol/search_engine_specifics.proto
@@ -51,11 +51,6 @@
   // can read the field in order to migrate existing data that sets this bit.
   optional bool autogenerate_keyword = 12 [deprecated = true];
   // ID 13 reserved - previously used by |logo_id|, now deprecated.
-  // Obsolete field. This used to represent whether or not this search engine
-  // entry was created automatically by an administrator via group policy. This
-  // notion no longer exists amongst synced search engines as we do not want to
-  // sync managed search engines.
-  // optional bool deprecated_created_by_policy = 14;
   optional string instant_url = 15 [deprecated = true];
   // ID 16 reserved - previously used by |id|, now deprecated.
   // The last time this entry was modified by a user. A UTC timestamp with units
@@ -95,4 +90,7 @@
   // The ID associated with the starter pack engine.  This is set to 0 if not a
   // starter pack engine.
   optional int32 starter_pack_id = 28;
+
+  reserved 14;
+  reserved "created_by_policy";
 }
diff --git a/components/sync/protocol/session_specifics.proto b/components/sync/protocol/session_specifics.proto
index 66ea0a2..8a70ec4 100644
--- a/components/sync/protocol/session_specifics.proto
+++ b/components/sync/protocol/session_specifics.proto
@@ -87,9 +87,6 @@
 }
 
 message TabNavigation {
-  // The index in the NavigationController. If this is -1, it means this
-  // TabNavigation is bogus.
-  // optional int32 index = 1 [default = -1];  // obsolete.
   // The virtual URL, when nonempty, will override the actual URL of the page
   // when we display it to the user.
   optional string virtual_url = 2;
@@ -97,10 +94,6 @@
   optional string referrer = 3;
   // The title of the page.
   optional string title = 4;
-  // Content state is an opaque blob created by WebKit that represents the
-  // state of the page. This includes form entries and scroll position for each
-  // frame.
-  // optional string state = 5;  // obsolete.
   // The core transition type.
   optional SyncEnums.PageTransition page_transition = 6 [default = LINK];
   // If this transition was triggered by a redirect, the redirect type.
@@ -177,6 +170,11 @@
   // The page language as determined by its textual content. An ISO 639 language
   // code (two letters, except for Chinese where a localization is necessary).
   optional string page_language = 30;
+
+  reserved 1;
+  reserved "index";
+  reserved 5;
+  reserved "state";
 }
 
 // Navigation information for a single redirection within a single navigation.
diff --git a/components/sync/protocol/typed_url_specifics.proto b/components/sync/protocol/typed_url_specifics.proto
index bc37a6e..544ba49 100644
--- a/components/sync/protocol/typed_url_specifics.proto
+++ b/components/sync/protocol/typed_url_specifics.proto
@@ -23,21 +23,18 @@
   optional string url = 1;
   // Title of the page corresponding to this URL.
   optional string title = 2;
-  // The number of times this URL was typed. Deprecated since we no longer sync
-  // this information (it's inferred by the history code from the transition
-  // type for each visit).
-  // optional int32 typed_count = 3; (deprecated)
   // True if the URL should NOT be used for auto-complete.
   optional bool hidden = 4;
-  // The number of visits (includes page reloads).
-  // repeated int64 visit = 5; (deprecated)
-  // The number of explicit navigations to this URL (excludes page reloads) -
-  // deprecated as we no longer sync this (history code infers this from the
-  // |visits| array).
-  // optional int32 visited_count = 6; (deprecated)
   // Timestamps for all visits to this URL.
   repeated int64 visits = 7 [packed = true];
   // The PageTransition::Type for each of the visits in the |visit| array. Both
   // arrays must be the same length.
   repeated int32 visit_transitions = 8 [packed = true];
+
+  reserved 3;
+  reserved "typed_count";
+  reserved 5;
+  reserved "visit";
+  reserved 6;
+  reserved "visited_count";
 }
diff --git a/content/browser/attribution_reporting/aggregatable_attribution_utils.cc b/content/browser/attribution_reporting/aggregatable_attribution_utils.cc
index 85870895..3a89db0 100644
--- a/content/browser/attribution_reporting/aggregatable_attribution_utils.cc
+++ b/content/browser/attribution_reporting/aggregatable_attribution_utils.cc
@@ -72,8 +72,9 @@
 
     for (const auto& source_key : data.source_keys()) {
       auto bucket = buckets.find(source_key);
-      if (bucket == buckets.end())
+      if (bucket == buckets.end()) {
         continue;
+      }
 
       bucket->second |= data.key_piece();
     }
@@ -85,8 +86,9 @@
   std::vector<AggregatableHistogramContribution> contributions;
   for (const auto& [key_id, key] : buckets) {
     auto value = values.find(key_id);
-    if (value == values.end())
+    if (value == values.end()) {
       continue;
+    }
 
     contributions.emplace_back(key, value->second);
   }
diff --git a/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc b/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc
index 8b7a9da..b2d11d9 100644
--- a/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc
@@ -291,8 +291,9 @@
       const std::string& shared_info) {
     absl::optional<std::vector<uint8_t>> encrypted_payload =
         base::Base64Decode(base64_encoded_encrypted_payload);
-    if (!encrypted_payload)
+    if (!encrypted_payload) {
       return {};
+    }
 
     return aggregation_service::DecryptPayloadWithHpke(
         *encrypted_payload, *full_hpke_key_.get(), shared_info);
@@ -411,8 +412,9 @@
                          base::FileEnumerator::DIRECTORIES);
 
   for (base::FilePath name = e.Next(); !name.empty(); name = e.Next()) {
-    if (name.BaseName() == base::FilePath(FILE_PATH_LITERAL("latest")))
+    if (name.BaseName() == base::FilePath(FILE_PATH_LITERAL("latest"))) {
       continue;
+    }
 
     input_paths.push_back(std::move(name));
   }
@@ -442,21 +444,24 @@
 
   for (base::FilePath name = e.Next(); !name.empty(); name = e.Next()) {
     base::Value value = ParseJsonFromFile(name);
-    if (!value.is_dict())
+    if (!value.is_dict()) {
       continue;
+    }
 
     const base::Value::Dict& dict = value.GetDict();
     if (const std::string* shared_info = dict.FindString("shared_info")) {
       base::Value shared_info_value = base::test::ParseJson(*shared_info);
       EXPECT_TRUE(shared_info_value.is_dict()) << name;
-      if (!shared_info_value.is_dict())
+      if (!shared_info_value.is_dict()) {
         continue;
+      }
 
       const std::string* version =
           shared_info_value.GetDict().FindString("version");
       EXPECT_TRUE(version) << name;
-      if (!version)
+      if (!version) {
         continue;
+      }
 
       EXPECT_EQ(*version, expected_version) << name;
     }
diff --git a/content/browser/attribution_reporting/attribution_config.cc b/content/browser/attribution_reporting/attribution_config.cc
index 5e20a48e..6fb6ab84 100644
--- a/content/browser/attribution_reporting/attribution_config.cc
+++ b/content/browser/attribution_reporting/attribution_config.cc
@@ -9,58 +9,73 @@
 namespace content {
 
 bool AttributionConfig::Validate() const {
-  if (max_sources_per_origin <= 0)
+  if (max_sources_per_origin <= 0) {
     return false;
+  }
 
-  if (source_event_id_cardinality && *source_event_id_cardinality == 0u)
+  if (source_event_id_cardinality && *source_event_id_cardinality == 0u) {
     return false;
+  }
 
-  if (max_destinations_per_source_site_reporting_origin <= 0)
+  if (max_destinations_per_source_site_reporting_origin <= 0) {
     return false;
+  }
 
-  if (!rate_limit.Validate())
+  if (!rate_limit.Validate()) {
     return false;
+  }
 
-  if (!event_level_limit.Validate())
+  if (!event_level_limit.Validate()) {
     return false;
+  }
 
-  if (!aggregate_limit.Validate())
+  if (!aggregate_limit.Validate()) {
     return false;
+  }
 
   return true;
 }
 
 bool AttributionConfig::RateLimitConfig::Validate() const {
-  if (time_window <= base::TimeDelta())
+  if (time_window <= base::TimeDelta()) {
     return false;
+  }
 
-  if (max_source_registration_reporting_origins <= 0)
+  if (max_source_registration_reporting_origins <= 0) {
     return false;
+  }
 
-  if (max_attribution_reporting_origins <= 0)
+  if (max_attribution_reporting_origins <= 0) {
     return false;
+  }
 
-  if (max_attributions <= 0)
+  if (max_attributions <= 0) {
     return false;
+  }
 
   return true;
 }
 
 bool AttributionConfig::EventLevelLimit::Validate() const {
-  if (navigation_source_trigger_data_cardinality == 0u)
+  if (navigation_source_trigger_data_cardinality == 0u) {
     return false;
+  }
 
-  if (event_source_trigger_data_cardinality == 0u)
+  if (event_source_trigger_data_cardinality == 0u) {
     return false;
+  }
 
-  if (max_reports_per_destination <= 0)
+  if (max_reports_per_destination <= 0) {
     return false;
+  }
 
-  if (max_attributions_per_navigation_source <= 0)
+  if (max_attributions_per_navigation_source <= 0) {
     return false;
+  }
 
-  if (max_attributions_per_event_source <= 0)
+  if (max_attributions_per_event_source <= 0) {
     return false;
+  }
 
   if (navigation_source_randomized_response_rate < 0 ||
       navigation_source_randomized_response_rate > 1) {
@@ -76,17 +91,21 @@
 }
 
 bool AttributionConfig::AggregateLimit::Validate() const {
-  if (max_reports_per_destination <= 0)
+  if (max_reports_per_destination <= 0) {
     return false;
+  }
 
-  if (aggregatable_budget_per_source <= 0)
+  if (aggregatable_budget_per_source <= 0) {
     return false;
+  }
 
-  if (min_delay < base::TimeDelta())
+  if (min_delay < base::TimeDelta()) {
     return false;
+  }
 
-  if (delay_span < base::TimeDelta())
+  if (delay_span < base::TimeDelta()) {
     return false;
+  }
 
   return true;
 }
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
index 7f4bc0df..3c20746 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -261,8 +261,9 @@
                          .input_event = input_event,
                          .nav_type = nav_type});
   // Should only be possible with a misbehaving renderer.
-  if (!inserted)
+  if (!inserted) {
     return false;
+  }
 
   data_hosts_in_source_mode_++;
 
@@ -296,8 +297,9 @@
 
   // Treat ongoing redirect registrations within a chain as a data host for the
   // purpose of trigger queuing.
-  if (inserted)
+  if (inserted) {
     data_hosts_in_source_mode_++;
+  }
 
   it->second.pending_source_data++;
 
@@ -331,8 +333,9 @@
   }
 
   auto redirect_it = redirect_registrations_.find(attribution_src_token);
-  if (redirect_it == redirect_registrations_.end())
+  if (redirect_it == redirect_registrations_.end()) {
     return;
+  }
 
   NavigationRedirectSourceRegistrations& registrations = redirect_it->second;
 
@@ -469,8 +472,9 @@
   });
   RecordTriggerQueueEvent(TriggerQueueEvent::kEnqueued);
 
-  if (!trigger_timer_.IsRunning())
+  if (!trigger_timer_.IsRunning()) {
     SetTriggerTimer(delay);
+  }
 }
 
 void AttributionDataHostManagerImpl::SetTriggerTimer(base::TimeDelta delay) {
@@ -514,8 +518,9 @@
       break;
   }
 
-  if (size_t num = context.num_data_registered())
+  if (size_t num = context.num_data_registered()) {
     base::UmaHistogramExactLinear(histogram_name, num, 101);
+  }
 }
 
 void AttributionDataHostManagerImpl::OnSourceEligibleDataHostFinished(
@@ -535,8 +540,9 @@
 
   DCHECK_GT(data_hosts_in_source_mode_, 0u);
   data_hosts_in_source_mode_--;
-  if (data_hosts_in_source_mode_ > 0)
+  if (data_hosts_in_source_mode_ > 0) {
     return;
+  }
 
   trigger_timer_.Stop();
 
@@ -567,8 +573,9 @@
 
   // The registration may no longer be tracked in the event the navigation
   // failed.
-  if (it == redirect_registrations_.end())
+  if (it == redirect_registrations_.end()) {
     return;
+  }
 
   DCHECK_GT(it->second.pending_source_data, 0u);
   NavigationRedirectSourceRegistrations& registrations = it->second;
diff --git a/content/browser/attribution_reporting/attribution_debug_report.cc b/content/browser/attribution_reporting/attribution_debug_report.cc
index 819f3e9..5e32a7fa 100644
--- a/content/browser/attribution_reporting/attribution_debug_report.cc
+++ b/content/browser/attribution_reporting/attribution_debug_report.cc
@@ -288,11 +288,13 @@
   base::Value::Dict data_body;
   data_body.Set(kAttributionDestination,
                 net::SchemefulSite(trigger.destination_origin()).Serialize());
-  if (absl::optional<uint64_t> debug_key = trigger.registration().debug_key)
+  if (absl::optional<uint64_t> debug_key = trigger.registration().debug_key) {
     data_body.Set("trigger_debug_key", base::NumberToString(*debug_key));
+  }
 
-  if (result.source())
+  if (result.source()) {
     SetSourceData(data_body, result.source()->common_info());
+  }
 
   switch (data_type) {
     case DebugDataType::kTriggerNoMatchingSource:
@@ -353,13 +355,15 @@
     const StorableSource& source,
     bool is_debug_cookie_set,
     const AttributionStorage::StoreSourceResult& result) {
-  if (!source.debug_reporting() || source.is_within_fenced_frame())
+  if (!source.debug_reporting() || source.is_within_fenced_frame()) {
     return absl::nullopt;
+  }
 
   absl::optional<DebugDataType> data_type =
       GetReportDataType(result.status, is_debug_cookie_set);
-  if (!data_type)
+  if (!data_type) {
     return absl::nullopt;
+  }
 
   base::Value::List report_body;
   report_body.Append(
diff --git a/content/browser/attribution_reporting/attribution_header_utils.cc b/content/browser/attribution_reporting/attribution_header_utils.cc
index 6298e26..67ff1e47 100644
--- a/content/browser/attribution_reporting/attribution_header_utils.cc
+++ b/content/browser/attribution_reporting/attribution_header_utils.cc
@@ -29,8 +29,9 @@
                  attribution_reporting::mojom::SourceRegistrationError>
       reg = attribution_reporting::SourceRegistration::Parse(
           std::move(registration));
-  if (!reg.has_value())
+  if (!reg.has_value()) {
     return base::unexpected(reg.error());
+  }
 
   return StorableSource(std::move(reporting_origin), std::move(*reg),
                         source_time, std::move(source_origin), source_type,
diff --git a/content/browser/attribution_reporting/attribution_host.cc b/content/browser/attribution_reporting/attribution_host.cc
index 47921fa..da840c9 100644
--- a/content/browser/attribution_reporting/attribution_host.cc
+++ b/content/browser/attribution_reporting/attribution_host.cc
@@ -57,8 +57,9 @@
   ScopedMapDeleter(Map* map, const typename Map::key_type& key)
       : map_(map), it_(map_->find(key)) {}
   ~ScopedMapDeleter() {
-    if (*this)
+    if (*this) {
       map_->erase(it_);
+    }
   }
 
   typename Map::iterator* get() { return &it_; }
@@ -101,8 +102,9 @@
     const {
   AttributionInputEvent input;
 #if BUILDFLAG(IS_ANDROID)
-  if (input_event_tracker_android_)
+  if (input_event_tracker_android_) {
     input.input_event = input_event_tracker_android_->GetMostRecentEvent();
+  }
 #endif
   return input;
 }
@@ -127,8 +129,9 @@
   UMA_HISTOGRAM_BOOLEAN("Conversions.ImpressionNavigationHasDeadInitiator",
                         initiator_frame_host == nullptr);
 
-  if (!initiator_frame_host)
+  if (!initiator_frame_host) {
     return;
+  }
 
   // Look up the initiator root's origin which will be used as the impression
   // origin. This works because we won't update the origin for the initiator RFH
@@ -143,8 +146,9 @@
                                  .root()
                                  ->current_origin());
 
-  if (!initiator_root_frame_origin)
+  if (!initiator_root_frame_origin) {
     return;
+  }
 
   navigation_info_map_.emplace(
       navigation_handle->GetNavigationId(),
@@ -158,8 +162,9 @@
 void AttributionHost::DidRedirectNavigation(
     NavigationHandle* navigation_handle) {
   auto it = navigation_info_map_.find(navigation_handle->GetNavigationId());
-  if (it == navigation_info_map_.end())
+  if (it == navigation_info_map_.end()) {
     return;
+  }
 
   DCHECK(navigation_handle->GetImpression());
 
@@ -171,18 +176,21 @@
 
   AttributionManager* attribution_manager =
       AttributionManager::FromWebContents(web_contents());
-  if (!attribution_manager)
+  if (!attribution_manager) {
     return;
+  }
 
   auto* data_host_manager = attribution_manager->GetDataHostManager();
-  if (!data_host_manager)
+  if (!data_host_manager) {
     return;
+  }
 
   const std::vector<GURL>& redirect_chain =
       navigation_handle->GetRedirectChain();
 
-  if (redirect_chain.size() < 2)
+  if (redirect_chain.size() < 2) {
     return;
+  }
 
   // The reporting origin should be the origin of the request responsible for
   // initiating this redirect. At this point, the navigation handle reflects the
@@ -191,8 +199,9 @@
   absl::optional<SuitableOrigin> reporting_origin =
       SuitableOrigin::Create(redirect_chain[redirect_chain.size() - 2]);
 
-  if (!reporting_origin)
+  if (!reporting_origin) {
     return;
+  }
 
   auto impression = navigation_handle->GetImpression();
   data_host_manager->NotifyNavigationRedirectRegistration(
@@ -215,8 +224,9 @@
       AttributionManager::FromWebContents(web_contents());
   if (!attribution_manager) {
     DCHECK(navigation_info_map_.empty());
-    if (navigation_handle->GetImpression())
+    if (navigation_handle->GetImpression()) {
       RecordRegisterImpressionAllowed(false);
+    }
     return;
   }
 
@@ -249,8 +259,9 @@
   const blink::Impression& impression = *(navigation_handle->GetImpression());
 
   auto* data_host_manager = attribution_manager->GetDataHostManager();
-  if (!data_host_manager)
+  if (!data_host_manager) {
     return;
+  }
 
   data_host_manager->NotifyNavigationForDataHost(
       impression.attribution_src_token, source_origin, impression.nav_type);
@@ -260,17 +271,20 @@
     NavigationHandle* navigation_handle) {
   auto* attribution_manager =
       AttributionManager::FromWebContents(web_contents());
-  if (!attribution_manager)
+  if (!attribution_manager) {
     return;
+  }
 
   auto* data_host_manager = attribution_manager->GetDataHostManager();
-  if (!data_host_manager)
+  if (!data_host_manager) {
     return;
+  }
 
   absl::optional<blink::Impression> impression =
       navigation_handle->GetImpression();
-  if (!impression)
+  if (!impression) {
     return;
+  }
 
   data_host_manager->NotifyNavigationFailure(impression->attribution_src_token);
 }
@@ -327,18 +341,21 @@
   // If there is no attribution manager available, ignore any registrations.
   AttributionManager* attribution_manager =
       AttributionManager::FromWebContents(web_contents());
-  if (!attribution_manager)
+  if (!attribution_manager) {
     return;
+  }
 
   AttributionDataHostManager* data_host_manager =
       attribution_manager->GetDataHostManager();
-  if (!data_host_manager)
+  if (!data_host_manager) {
     return;
+  }
 
   absl::optional<SuitableOrigin> top_frame_origin =
       TopFrameOriginForSecureContext();
-  if (!top_frame_origin)
+  if (!top_frame_origin) {
     return;
+  }
 
   data_host_manager->RegisterDataHost(
       std::move(data_host), std::move(*top_frame_origin),
@@ -353,16 +370,19 @@
   // If there is no attribution manager available, ignore any registrations.
   AttributionManager* attribution_manager =
       AttributionManager::FromWebContents(web_contents());
-  if (!attribution_manager)
+  if (!attribution_manager) {
     return;
+  }
 
   AttributionDataHostManager* data_host_manager =
       attribution_manager->GetDataHostManager();
-  if (!data_host_manager)
+  if (!data_host_manager) {
     return;
+  }
 
-  if (!TopFrameOriginForSecureContext())
+  if (!TopFrameOriginForSecureContext()) {
     return;
+  }
 
   if (!data_host_manager->RegisterNavigationDataHost(
           std::move(data_host), attribution_src_token,
@@ -379,11 +399,13 @@
     mojo::PendingAssociatedReceiver<blink::mojom::ConversionHost> receiver,
     RenderFrameHost* rfh) {
   auto* web_contents = WebContents::FromRenderFrameHost(rfh);
-  if (!web_contents)
+  if (!web_contents) {
     return;
+  }
   auto* conversion_host = AttributionHost::FromWebContents(web_contents);
-  if (!conversion_host)
+  if (!conversion_host) {
     return;
+  }
   conversion_host->receivers_.Bind(rfh, std::move(receiver));
 }
 
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
index 50955ba8..b6bb331 100644
--- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
+++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -278,8 +278,9 @@
           AttributionManager::FromWebContents(web_ui_->GetWebContents())) {
     observers_.Add(std::move(observer));
 
-    if (!manager_observation_.IsObservingSource(manager))
+    if (!manager_observation_.IsObservingSource(manager)) {
       manager_observation_.Observe(manager);
+    }
 
     std::move(callback).Run(true);
   } else {
@@ -288,14 +289,16 @@
 }
 
 void AttributionInternalsHandlerImpl::OnSourcesChanged() {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer->OnSourcesChanged();
+  }
 }
 
 void AttributionInternalsHandlerImpl::OnReportsChanged(
     AttributionReport::Type report_type) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer->OnReportsChanged(report_type);
+  }
 }
 
 void AttributionInternalsHandlerImpl::OnSourceHandled(
@@ -371,8 +374,9 @@
     const AttributionDebugReport& report,
     int status,
     base::Time time) {
-  if (observers_.empty())
+  if (observers_.empty()) {
     return;
+  }
 
   auto web_report = WebUIDebugReport::New();
   web_report->url = report.ReportURL();
@@ -387,8 +391,9 @@
           : attribution_internals::mojom::DebugReportStatus::NewNetworkError(
                 net::ErrorToShortString(status));
 
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer->OnDebugReportSent(web_report.Clone());
+  }
 }
 
 // TODO(crbug/1351843): Consider surfacing this error in devtools instead of
diff --git a/content/browser/attribution_reporting/attribution_interop_parser.cc b/content/browser/attribution_reporting/attribution_interop_parser.cc
index f23854a..7f3b2b8 100644
--- a/content/browser/attribution_reporting/attribution_interop_parser.cc
+++ b/content/browser/attribution_reporting/attribution_interop_parser.cc
@@ -97,8 +97,9 @@
     return absl::nullopt;
   }
 
-  if (std::string* str = value->GetIfString())
+  if (std::string* str = value->GetIfString()) {
     return std::move(*str);
+  }
 
   *Error() << "must be a string";
   return absl::nullopt;
@@ -140,8 +141,9 @@
   auto context = PushContext(kKey);
 
   base::Value* request = in.Find(kKey);
-  if (!EnsureDictionary(request))
+  if (!EnsureDictionary(request)) {
     return absl::nullopt;
+  }
 
   absl::optional<std::string> str =
       ExtractString(request->GetDict(), "attribution_src_url");
@@ -160,8 +162,9 @@
   auto context = PushContext(kKey);
 
   ParseList(in.Find(kKey), base::BindLambdaForTesting([&](base::Value value) {
-              if (!EnsureDictionary(&value))
+              if (!EnsureDictionary(&value)) {
                 return;
+              }
 
               static constexpr char kKeyUrl[] = "url";
               if (absl::optional<std::string> url =
@@ -174,8 +177,9 @@
               static constexpr char kKeyResponse[] = "response";
               auto inner_context = PushContext(kKeyResponse);
               base::Value* response = value.FindKey(kKeyResponse);
-              if (!EnsureDictionary(response))
+              if (!EnsureDictionary(response)) {
                 return;
+              }
 
               MoveDictValues(response->GetDict(), out);
             }),
@@ -189,8 +193,9 @@
   base::Value::List results;
 
   ParseList(dict.Find(key), base::BindLambdaForTesting([&](base::Value value) {
-              if (!EnsureDictionary(&value))
+              if (!EnsureDictionary(&value)) {
                 return;
+              }
 
               static constexpr char kKeyReportingOrigin[] = "reporting_origin";
 
@@ -204,15 +209,17 @@
               absl::optional<std::string> attribution_src_url =
                   ParseRequest(value.GetDict(), dict);
 
-              if (has_error())
+              if (has_error()) {
                 return;
+              }
 
               DCHECK(attribution_src_url);
 
               ParseResponse(value.GetDict(), dict, *attribution_src_url);
 
-              if (has_error())
+              if (has_error()) {
                 return;
+              }
 
               dict.Set(
                   kKeyReportingOrigin,
@@ -235,14 +242,16 @@
   auto context = PushContext(kKey);
 
   base::Value* dict = input.Find(kKey);
-  if (!EnsureDictionary(dict))
+  if (!EnsureDictionary(dict)) {
     return absl::nullopt;
+  }
 
   base::Value::List sources = ParseEvents(dict->GetDict(), "sources");
   base::Value::List triggers = ParseEvents(dict->GetDict(), "triggers");
 
-  if (has_error())
+  if (has_error()) {
     return absl::nullopt;
+  }
 
   base::Value::Dict result;
   result.Set("sources", std::move(sources));
@@ -257,28 +266,30 @@
   base::Value::List event_level_results;
 
   base::Value* value = output.Find(kKey);
-  if (!value)
+  if (!value) {
     return event_level_results;
+  }
 
   auto context = PushContext(kKey);
-  ParseList(output.Find(kKey),
-            base::BindLambdaForTesting([&](base::Value value) {
-              if (!EnsureDictionary(&value))
-                return;
+  ParseList(
+      output.Find(kKey), base::BindLambdaForTesting([&](base::Value value) {
+        if (!EnsureDictionary(&value)) {
+          return;
+        }
 
-              base::Value::Dict result;
+        base::Value::Dict result;
 
-              base::Value::Dict& value_dict = value.GetDict();
-              MoveValue(value_dict, "report", result, "payload");
-              MoveValue(value_dict, "report_url", result);
-              MoveValue(value_dict, "intended_report_time", result,
-                        "report_time");
+        base::Value::Dict& value_dict = value.GetDict();
+        MoveValue(value_dict, "report", result, "payload");
+        MoveValue(value_dict, "report_url", result);
+        MoveValue(value_dict, "intended_report_time", result, "report_time");
 
-              if (has_error())
-                return;
+        if (has_error()) {
+          return;
+        }
 
-              event_level_results.Append(std::move(result));
-            }));
+        event_level_results.Append(std::move(result));
+      }));
 
   return event_level_results;
 }
@@ -290,48 +301,52 @@
   base::Value::List aggregatable_results;
 
   base::Value* value = output.Find(kKey);
-  if (!value)
+  if (!value) {
     return aggregatable_results;
+  }
 
   auto context = PushContext(kKey);
-  ParseList(output.Find(kKey),
-            base::BindLambdaForTesting([&](base::Value value) {
-              if (!EnsureDictionary(&value))
-                return;
+  ParseList(
+      output.Find(kKey), base::BindLambdaForTesting([&](base::Value value) {
+        if (!EnsureDictionary(&value)) {
+          return;
+        }
 
-              base::Value::Dict result;
+        base::Value::Dict result;
 
-              base::Value::Dict& value_dict = value.GetDict();
-              MoveValue(value_dict, "report_url", result);
-              MoveValue(value_dict, "intended_report_time", result,
-                        "report_time");
+        base::Value::Dict& value_dict = value.GetDict();
+        MoveValue(value_dict, "report_url", result);
+        MoveValue(value_dict, "intended_report_time", result, "report_time");
 
-              static constexpr char kKeyTestInfo[] = "test_info";
-              base::Value* test_info;
-              {
-                auto test_info_context = PushContext(kKeyTestInfo);
-                test_info = value_dict.Find(kKeyTestInfo);
-                if (!EnsureDictionary(test_info))
-                  return;
-              }
+        static constexpr char kKeyTestInfo[] = "test_info";
+        base::Value* test_info;
+        {
+          auto test_info_context = PushContext(kKeyTestInfo);
+          test_info = value_dict.Find(kKeyTestInfo);
+          if (!EnsureDictionary(test_info)) {
+            return;
+          }
+        }
 
-              static constexpr char kKeyReport[] = "report";
-              {
-                auto report_context = PushContext(kKeyReport);
-                base::Value* report = value_dict.Find(kKeyReport);
-                if (!EnsureDictionary(report))
-                  return;
+        static constexpr char kKeyReport[] = "report";
+        {
+          auto report_context = PushContext(kKeyReport);
+          base::Value* report = value_dict.Find(kKeyReport);
+          if (!EnsureDictionary(report)) {
+            return;
+          }
 
-                MoveDictValues(test_info->GetDict(), report->GetDict());
-              }
+          MoveDictValues(test_info->GetDict(), report->GetDict());
+        }
 
-              MoveValue(value_dict, "report", result, "payload");
+        MoveValue(value_dict, "report", result, "payload");
 
-              if (has_error())
-                return;
+        if (has_error()) {
+          return;
+        }
 
-              aggregatable_results.Append(std::move(result));
-            }));
+        aggregatable_results.Append(std::move(result));
+      }));
 
   return aggregatable_results;
 }
@@ -340,8 +355,9 @@
 AttributionInteropParser::InteropOutputFromSimulatorOutput(base::Value output) {
   error_manager_.ResetErrorState();
 
-  if (!EnsureDictionary(&output))
+  if (!EnsureDictionary(&output)) {
     return absl::nullopt;
+  }
 
   base::Value::List event_level_results =
       ParseEventLevelReports(output.GetDict());
@@ -349,15 +365,18 @@
   base::Value::List aggregatable_results =
       ParseAggregatableReports(output.GetDict());
 
-  if (has_error())
+  if (has_error()) {
     return absl::nullopt;
+  }
 
   base::Value::Dict dict;
-  if (!event_level_results.empty())
+  if (!event_level_results.empty()) {
     dict.Set("event_level_results", std::move(event_level_results));
+  }
 
-  if (!aggregatable_results.empty())
+  if (!aggregatable_results.empty()) {
     dict.Set("aggregatable_results", std::move(aggregatable_results));
+  }
 
   return base::Value(std::move(dict));
 }
@@ -418,11 +437,13 @@
   error_manager_.ResetErrorState();
 
   std::unique_ptr<AttributionParserErrorManager::ScopedContext> context;
-  if (!key.empty())
+  if (!key.empty()) {
     context = PushContext(key);
+  }
 
-  if (!EnsureDictionary(&value))
+  if (!EnsureDictionary(&value)) {
     return false;
+  }
 
   const base::Value::Dict& dict = value.GetDict();
 
diff --git a/content/browser/attribution_reporting/attribution_interop_unittest.cc b/content/browser/attribution_reporting/attribution_interop_unittest.cc
index 04b454c..44fc01a7 100644
--- a/content/browser/attribution_reporting/attribution_interop_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_interop_unittest.cc
@@ -53,8 +53,9 @@
                          FILE_PATH_LITERAL("*.json"));
 
   for (base::FilePath name = e.Next(); !name.empty(); name = e.Next()) {
-    if (name.BaseName().MaybeAsASCII() == kDefaultConfigFileName)
+    if (name.BaseName().MaybeAsASCII() == kDefaultConfigFileName) {
       continue;
+    }
 
     input_paths.push_back(std::move(name));
   }
@@ -125,8 +126,9 @@
       parser.InteropOutputFromSimulatorOutput(std::move(simulator_output));
   EXPECT_TRUE(actual_output) << error_stream.str();
 
-  if (expected_output)
+  if (expected_output) {
     EXPECT_THAT(actual_output, Optional(base::test::IsJson(*expected_output)));
+  }
 }
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index c8786dc..88213767 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -149,11 +149,13 @@
   // partition clear data logic uses storage key keyed deletion, while the
   // storage policy uses GURLs. Ideally these would be coalesced.
   const GURL& url = storage_key.origin().GetURL();
-  if (storage_policy->IsStorageProtected(url))
+  if (storage_policy->IsStorageProtected(url)) {
     return false;
+  }
 
-  if (storage_policy->IsStorageSessionOnly(url))
+  if (storage_policy->IsStorageSessionOnly(url)) {
     return true;
+  }
   return false;
 }
 
@@ -331,8 +333,9 @@
   const base::TimeDelta kInitialReportDelay = base::Minutes(5);
   const int kDelayFactor = 3;
 
-  if (failed_send_attempts > kMaxFailedSendAttempts)
+  if (failed_send_attempts > kMaxFailedSendAttempts) {
     return absl::nullopt;
+  }
 
   return kInitialReportDelay * std::pow(kDelayFactor, failed_send_attempts - 1);
 }
@@ -368,8 +371,9 @@
     scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy) {
   {
     base::ScopedAllowBlockingForTesting allow_blocking;
-    if (!AttributionStorageSql::DeleteStorageForTesting(user_data_directory))
+    if (!AttributionStorageSql::DeleteStorageForTesting(user_data_directory)) {
       return nullptr;
+    }
   }
 
   return std::make_unique<AttributionManagerImpl>(
@@ -526,8 +530,9 @@
     AttributionStorage::StoreSourceResult result) {
   RecordStoreSourceStatus(result);
 
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnSourceHandled(source, cleared_debug_key, result.status);
+  }
 
   scheduler_timer_.MaybeSet(result.min_fake_report_time);
 
@@ -557,15 +562,17 @@
   // Avoid unbounded memory growth with adversarial input.
   bool allowed = size_before_push < max_pending_events_;
   base::UmaHistogramBoolean("Conversions.EnqueueEventAllowed", allowed);
-  if (!allowed)
+  if (!allowed) {
     return;
+  }
 
   pending_events_.push_back(std::move(event));
 
   // Only process the new event if it is the only one in the queue. Otherwise,
   // there's already an async cookie-check in progress.
-  if (size_before_push == 0)
+  if (size_before_push == 0) {
     ProcessEvents();
+  }
 }
 
 void AttributionManagerImpl::ProcessEvents() {
@@ -717,8 +724,9 @@
     NotifyReportsChanged(AttributionReport::Type::kAggregatableAttribution);
   }
 
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnTriggerHandled(trigger, cleared_debug_key, result);
+  }
 
   MaybeSendVerboseDebugReport(trigger, is_debug_cookie_set, result);
 }
@@ -790,8 +798,9 @@
   --num_pending_clear_data_tasks_;
 
   // No more clear data tasks, so we can reset the priority.
-  if (num_pending_clear_data_tasks_ == 0)
+  if (num_pending_clear_data_tasks_ == 0) {
     storage_task_runner_->UpdatePriority(base::TaskPriority::BEST_EFFORT);
+  }
 
   NotifySourcesChanged();
   NotifyReportsChanged(AttributionReport::Type::kEventLevel);
@@ -848,8 +857,9 @@
 
     bool inserted = reports_being_sent_.emplace(report.ReportId()).second;
     if (!inserted) {
-      if (web_ui_callback)
+      if (web_ui_callback) {
         web_ui_callback.Run();
+      }
 
       continue;
     }
@@ -864,8 +874,9 @@
       continue;
     }
 
-    if (!web_ui_callback)
+    if (!web_ui_callback) {
       LogMetricsOnReportSend(report, now);
+    }
 
     PrepareToSendReport(
         std::move(report), /*is_debug_report=*/false,
@@ -914,8 +925,9 @@
       [](base::OnceClosure done, base::WeakPtr<AttributionManagerImpl> manager,
          AttributionReport::Id report_id,
          absl::optional<base::Time> new_report_time, bool success) {
-        if (done)
+        if (done) {
           std::move(done).Run();
+        }
 
         if (manager && success) {
           manager->MarkReportCompleted(report_id);
@@ -944,8 +956,9 @@
 
   LogMetricsOnReportCompleted(report, info.status);
 
-  if (info.status == SendResult::Status::kSent)
+  if (info.status == SendResult::Status::kSent) {
     LogMetricsOnReportSent(report);
+  }
 
   NotifyReportSent(/*is_debug_report=*/false, report, info);
 }
@@ -953,8 +966,9 @@
 void AttributionManagerImpl::NotifyReportSent(bool is_debug_report,
                                               const AttributionReport& report,
                                               SendResult info) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnReportSent(report, /*is_debug_report=*/is_debug_report, info);
+  }
 }
 
 void AttributionManagerImpl::NotifyDebugReportSent(
@@ -962,8 +976,9 @@
     const int status) {
   // Use the same time for all observers.
   const base::Time time = base::Time::Now();
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnDebugReportSent(report, status, time);
+  }
 }
 
 void AttributionManagerImpl::AssembleAggregatableReport(
@@ -1024,14 +1039,16 @@
 }
 
 void AttributionManagerImpl::NotifySourcesChanged() {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnSourcesChanged();
+  }
 }
 
 void AttributionManagerImpl::NotifyReportsChanged(
     AttributionReport::Type report_type) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnReportsChanged(report_type);
+  }
 }
 
 void AttributionManagerImpl::NotifyFailedSourceRegistration(
@@ -1050,8 +1067,9 @@
     const StorableSource& source,
     bool is_debug_cookie_set,
     const AttributionStorage::StoreSourceResult& result) {
-  if (!base::FeatureList::IsEnabled(kAttributionVerboseDebugReporting))
+  if (!base::FeatureList::IsEnabled(kAttributionVerboseDebugReporting)) {
     return;
+  }
 
   if (!IsOperationAllowed(storage_partition_.get(),
                           ContentBrowserClient::AttributionReportingOperation::
@@ -1075,8 +1093,9 @@
     const AttributionTrigger& trigger,
     bool is_debug_cookie_set,
     const CreateReportResult& result) {
-  if (!base::FeatureList::IsEnabled(kAttributionVerboseDebugReporting))
+  if (!base::FeatureList::IsEnabled(kAttributionVerboseDebugReporting)) {
     return;
+  }
 
   if (!IsOperationAllowed(storage_partition_.get(),
                           ContentBrowserClient::AttributionReportingOperation::
diff --git a/content/browser/attribution_reporting/attribution_parser_test_utils.cc b/content/browser/attribution_reporting/attribution_parser_test_utils.cc
index 14e45f7..3e20b7d 100644
--- a/content/browser/attribution_reporting/attribution_parser_test_utils.cc
+++ b/content/browser/attribution_reporting/attribution_parser_test_utils.cc
@@ -56,8 +56,9 @@
 AttributionParserErrorManager::Error() {
   has_error_ = true;
 
-  if (context_path_.empty())
+  if (context_path_.empty()) {
     *error_stream_ << "input root";
+  }
 
   ErrorWriter writer(*error_stream_);
   for (Context context : context_path_) {
diff --git a/content/browser/attribution_reporting/attribution_report.cc b/content/browser/attribution_reporting/attribution_report.cc
index c3c20f2..af6d04a 100644
--- a/content/browser/attribution_reporting/attribution_report.cc
+++ b/content/browser/attribution_reporting/attribution_report.cc
@@ -169,8 +169,9 @@
             dict.Set("randomized_trigger_rate", data.randomized_trigger_rate);
 
             if (absl::optional<uint64_t> debug_key =
-                    common_source_info.debug_key())
+                    common_source_info.debug_key()) {
               dict.Set("source_debug_key", base::NumberToString(*debug_key));
+            }
 
             if (absl::optional<uint64_t> debug_key =
                     this->attribution_info().debug_key) {
@@ -196,8 +197,9 @@
             const CommonSourceInfo& common_info =
                 this->attribution_info().source.common_info();
 
-            if (absl::optional<uint64_t> debug_key = common_info.debug_key())
+            if (absl::optional<uint64_t> debug_key = common_info.debug_key()) {
               dict.Set("source_debug_key", base::NumberToString(*debug_key));
+            }
 
             if (absl::optional<uint64_t> debug_key =
                     this->attribution_info().debug_key) {
@@ -228,11 +230,13 @@
 absl::optional<base::Time> AttributionReport::MinReportTime(
     absl::optional<base::Time> a,
     absl::optional<base::Time> b) {
-  if (!a.has_value())
+  if (!a.has_value()) {
     return b;
+  }
 
-  if (!b.has_value())
+  if (!b.has_value()) {
     return a;
+  }
 
   return std::min(*a, *b);
 }
diff --git a/content/browser/attribution_reporting/attribution_report_network_sender.cc b/content/browser/attribution_reporting/attribution_report_network_sender.cc
index c0d0304e..fff34ee 100644
--- a/content/browser/attribution_reporting/attribution_report_network_sender.cc
+++ b/content/browser/attribution_reporting/attribution_report_network_sender.cc
@@ -159,10 +159,9 @@
 
   int response_code = headers ? headers->response_code() : -1;
   bool external_ok = response_code >= 200 && response_code <= 299;
-  Status status =
-      internal_ok && external_ok
-          ? Status::kOk
-          : !internal_ok ? Status::kInternalError : Status::kExternalError;
+  Status status = internal_ok && external_ok ? Status::kOk
+                  : !internal_ok             ? Status::kInternalError
+                                             : Status::kExternalError;
 
   const char* status_metric;
   const char* http_response_or_net_error_code_metric;
diff --git a/content/browser/attribution_reporting/attribution_src_browsertest.cc b/content/browser/attribution_reporting/attribution_src_browsertest.cc
index 9a08689d9..e6966488 100644
--- a/content/browser/attribution_reporting/attribution_src_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_src_browsertest.cc
@@ -124,8 +124,9 @@
 
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createAttributionSrcImg($1);", register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForSourceData(/*num_source_data=*/1);
   const auto& source_data = data_host->source_data();
 
@@ -169,8 +170,9 @@
 
     EXPECT_TRUE(
         ExecJs(web_contents(), JsReplace(registration_js, register_url)));
-    if (!data_host)
+    if (!data_host) {
       loop.Run();
+    }
     data_host->WaitForSourceData(/*num_source_data=*/1);
     const auto& source_data = data_host->source_data();
     // Regression test for crbug.com/1336797. This will timeout flakily if the
@@ -223,12 +225,14 @@
   EXPECT_TRUE(
       ExecJs(web_contents(),
              JsReplace("createAttributionEligibleImgSrc($1);", register_url)));
-  if (!source_data_host)
+  if (!source_data_host) {
     source_loop.Run();
+  }
   source_data_host->WaitForSourceData(/*num_source_data=*/1);
 
-  if (!trigger_data_host)
+  if (!trigger_data_host) {
     trigger_loop.Run();
+  }
   trigger_data_host->WaitForTriggerData(/*num_trigger_data=*/1);
 }
 
@@ -503,8 +507,9 @@
 
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createAttributionSrcImg($1);", register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForSourceData(/*num_source_data=*/2);
   const auto& source_data = data_host->source_data();
 
@@ -538,8 +543,9 @@
 
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createAttributionSrcImg($1);", register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForSourceData(/*num_source_data=*/1);
   const auto& source_data = data_host->source_data();
 
@@ -600,8 +606,9 @@
   register_response->Send(http_response->ToResponseString());
   register_response->Done();
 
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForSourceData(/*num_source_data=*/1);
   const auto& source_data = data_host->source_data();
 
@@ -831,8 +838,9 @@
 
   const std::string& js_template = GetParam().second;
   EXPECT_TRUE(ExecJs(web_contents(), JsReplace(js_template, register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForTriggerData(/*num_trigger_data=*/1);
 
   EXPECT_THAT(
@@ -893,8 +901,9 @@
 
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createAttributionSrcImg($1);", register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForTriggerData(/*num_trigger_data=*/1);
 
   EXPECT_THAT(
@@ -956,8 +965,9 @@
 
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createAttributionSrcImg($1);", register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForTriggerData(/*num_trigger_data=*/1);
   const auto& trigger_data = data_host->trigger_data();
 
@@ -987,8 +997,9 @@
 
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createAttributionSrcImg($1);", register_url)));
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForTriggerData(/*num_trigger_data=*/2);
   const auto& trigger_data = data_host->trigger_data();
 
@@ -1077,8 +1088,9 @@
   prerender_helper_.NavigatePrimaryPage(page_url);
   ASSERT_EQ(page_url, web_contents()->GetLastCommittedURL());
 
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForSourceData(/*num_source_data=*/1);
   const auto& source_data = data_host->source_data();
 
@@ -1156,8 +1168,9 @@
   ASSERT_EQ(page_url, web_contents()->GetLastCommittedURL());
   ASSERT_TRUE(host_observer.was_activated());
 
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
   data_host->WaitForTriggerData(/*num_trigger_data=*/1);
   const auto& trigger_data = data_host->trigger_data();
 
@@ -1241,8 +1254,9 @@
           "createAttributionSrcImg($1);",
           https_server()->GetURL("c.test", "/register_source_headers.html"))));
 
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
 
   data_host->WaitForSourceData(/*num_source_data=*/1);
   EXPECT_EQ(data_host->source_data().size(), 1u);
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.cc b/content/browser/attribution_reporting/attribution_storage_delegate.cc
index 3b4dce4..fc98a7fb 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate.cc
@@ -84,8 +84,9 @@
     uint64_t source_event_id) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!config_.source_event_id_cardinality)
+  if (!config_.source_event_id_cardinality) {
     return source_event_id;
+  }
 
   return source_event_id % *config_.source_event_id_cardinality;
 }
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
index 621567b..288205a 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
@@ -208,8 +208,9 @@
   // c = the maximum number of reports for a source
   // d = the trigger data cardinality for a source
   for (int num_bars : bars_preceding_each_star) {
-    if (num_bars == 0)
+    if (num_bars == 0) {
       continue;
+    }
 
     auto result = std::div(num_bars - 1, trigger_data_cardinality);
 
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index c1acba9..a8181213 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -893,9 +893,9 @@
   absl::optional<StoredSource::Id> source_id_to_attribute;
   std::vector<StoredSource::Id> source_ids_to_delete;
   std::vector<StoredSource::Id> source_ids_to_deactivate;
-  if (!FindMatchingSourceForTrigger(trigger, source_id_to_attribute,
-                                    source_ids_to_delete,
-                                    source_ids_to_deactivate)) {
+  if (!FindMatchingSourceForTrigger(
+          trigger, trigger_time, source_id_to_attribute, source_ids_to_delete,
+          source_ids_to_deactivate)) {
     return assemble_report_result(EventLevelResult::kInternalError,
                                   AggregatableResult::kInternalError);
   }
@@ -1075,6 +1075,7 @@
 
 bool AttributionStorageSql::FindMatchingSourceForTrigger(
     const AttributionTrigger& trigger,
+    base::Time trigger_time,
     absl::optional<StoredSource::Id>& source_id_to_attribute,
     std::vector<StoredSource::Id>& source_ids_to_delete,
     std::vector<StoredSource::Id>& source_ids_to_deactivate) {
@@ -1099,7 +1100,7 @@
       db_->GetCachedStatement(SQL_FROM_HERE, kGetMatchingSourcesSql));
   statement.BindString(0, net::SchemefulSite(destination_origin).Serialize());
   statement.BindString(1, reporting_origin.Serialize());
-  statement.BindTime(2, base::Time::Now());
+  statement.BindTime(2, trigger_time);
 
   // If there are no matching sources, return early.
   if (!statement.Step()) {
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h
index 1dfc60bb..8cdcb3e 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.h
+++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -242,6 +242,7 @@
   // matching sources were found.
   bool FindMatchingSourceForTrigger(
       const AttributionTrigger& trigger,
+      base::Time trigger_time,
       absl::optional<StoredSource::Id>& source_id_to_attribute,
       std::vector<StoredSource::Id>& source_ids_to_delete,
       std::vector<StoredSource::Id>& source_ids_to_deactivate)
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
index 1d874b6..0a6954c2 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
@@ -28,8 +28,9 @@
   // transactions make it more likely that we'll make forward progress each time
   // Chrome stops.
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   // Create the new aggregatable_report_metadata table with initial_report_time.
   // This follows the steps documented at
@@ -46,8 +47,9 @@
       "report_time INTEGER NOT NULL,"
       "failed_send_attempts INTEGER NOT NULL,"
       "initial_report_time INTEGER NOT NULL)";
-  if (!db->Execute(kNewAggregatableReportMetadataTableSql))
+  if (!db->Execute(kNewAggregatableReportMetadataTableSql)) {
     return false;
+  }
 
   // Transfer the existing aggregatable_report_metadata rows to the new table,
   // using the report_time value for initial_report_time.
@@ -56,19 +58,22 @@
       "aggregation_id,source_id,trigger_time,debug_key,external_report_id,"
       "report_time,failed_send_attempts,report_time "
       "FROM aggregatable_report_metadata";
-  if (!db->Execute(kPopulateNewAggregatableReportMetadataSql))
+  if (!db->Execute(kPopulateNewAggregatableReportMetadataSql)) {
     return false;
+  }
 
   static constexpr char kDropOldAggregatableReportMetadataTableSql[] =
       "DROP TABLE aggregatable_report_metadata";
-  if (!db->Execute(kDropOldAggregatableReportMetadataTableSql))
+  if (!db->Execute(kDropOldAggregatableReportMetadataTableSql)) {
     return false;
+  }
 
   static constexpr char kRenameAggregatableReportMetadataTableSql[] =
       "ALTER TABLE new_aggregatable_report_metadata "
       "RENAME TO aggregatable_report_metadata";
-  if (!db->Execute(kRenameAggregatableReportMetadataTableSql))
+  if (!db->Execute(kRenameAggregatableReportMetadataTableSql)) {
     return false;
+  }
 
   // Create the pre-existing aggregatable_report_metadata table indices on the
   // new table.
@@ -76,20 +81,23 @@
   static constexpr char kAggregateSourceIdIndexSql[] =
       "CREATE INDEX aggregate_source_id_idx "
       "ON aggregatable_report_metadata(source_id)";
-  if (!db->Execute(kAggregateSourceIdIndexSql))
+  if (!db->Execute(kAggregateSourceIdIndexSql)) {
     return false;
+  }
 
   static constexpr char kAggregateTriggerTimeIndexSql[] =
       "CREATE INDEX aggregate_trigger_time_idx "
       "ON aggregatable_report_metadata(trigger_time)";
-  if (!db->Execute(kAggregateTriggerTimeIndexSql))
+  if (!db->Execute(kAggregateTriggerTimeIndexSql)) {
     return false;
+  }
 
   static constexpr char kAggregateReportTimeIndexSql[] =
       "CREATE INDEX aggregate_report_time_idx "
       "ON aggregatable_report_metadata(report_time)";
-  if (!db->Execute(kAggregateReportTimeIndexSql))
+  if (!db->Execute(kAggregateReportTimeIndexSql)) {
     return false;
+  }
 
   meta_table->SetVersionNumber(34);
   return transaction.Commit();
@@ -99,8 +107,9 @@
   // Wrap each migration in its own transaction. See comment in
   // `MigrateToVersion34`.
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   static constexpr char kNewRateLimitsTableSql[] =
       "CREATE TABLE new_rate_limits("
@@ -114,8 +123,9 @@
       "reporting_origin TEXT NOT NULL,"
       "time INTEGER NOT NULL,"
       "expiry_time INTEGER NOT NULL)";
-  if (!db->Execute(kNewRateLimitsTableSql))
+  if (!db->Execute(kNewRateLimitsTableSql)) {
     return false;
+  }
 
   // Transfer the existing rows to the new table, inserting `base::Time()`
   // as default values for the expiry_time column.
@@ -124,17 +134,20 @@
       "id,scope,source_id,source_site,source_origin,destination_site,"
       "destination_origin,reporting_origin,time,0 "
       "FROM rate_limits";
-  if (!db->Execute(kPopulateNewRateLimitsTableSql))
+  if (!db->Execute(kPopulateNewRateLimitsTableSql)) {
     return false;
+  }
 
   static constexpr char kDropOldRateLimitsTableSql[] = "DROP TABLE rate_limits";
-  if (!db->Execute(kDropOldRateLimitsTableSql))
+  if (!db->Execute(kDropOldRateLimitsTableSql)) {
     return false;
+  }
 
   static constexpr char kRenameRateLimitsTableSql[] =
       "ALTER TABLE new_rate_limits RENAME TO rate_limits";
-  if (!db->Execute(kRenameRateLimitsTableSql))
+  if (!db->Execute(kRenameRateLimitsTableSql)) {
     return false;
+  }
 
   // Update the expiry_time column for the existing source rows.
   static constexpr char kUpdateSourceExpiryTimeSql[] =
@@ -168,37 +181,43 @@
     update_source_expiry_time_statement.BindTime(0, source_expiry_time);
     update_source_expiry_time_statement.BindInt64(
         1, get_rate_limits_statement.ColumnInt64(0));
-    if (!update_source_expiry_time_statement.Run())
+    if (!update_source_expiry_time_statement.Run()) {
       return false;
+    }
   }
 
-  if (!get_rate_limits_statement.Succeeded())
+  if (!get_rate_limits_statement.Succeeded()) {
     return false;
+  }
 
   // Create the rate_limits table indices on the new table.
   static constexpr char kRateLimitSourceSiteReportingOriginIndexSql[] =
       "CREATE INDEX rate_limit_source_site_reporting_origin_idx "
       "ON rate_limits"
       "(scope,source_site,reporting_origin)";
-  if (!db->Execute(kRateLimitSourceSiteReportingOriginIndexSql))
+  if (!db->Execute(kRateLimitSourceSiteReportingOriginIndexSql)) {
     return false;
+  }
 
   static constexpr char kRateLimitReportingOriginIndexSql[] =
       "CREATE INDEX rate_limit_reporting_origin_idx "
       "ON rate_limits(scope,destination_site,source_site)";
-  if (!db->Execute(kRateLimitReportingOriginIndexSql))
+  if (!db->Execute(kRateLimitReportingOriginIndexSql)) {
     return false;
+  }
 
   static constexpr char kRateLimitTimeIndexSql[] =
       "CREATE INDEX rate_limit_time_idx ON rate_limits(time)";
-  if (!db->Execute(kRateLimitTimeIndexSql))
+  if (!db->Execute(kRateLimitTimeIndexSql)) {
     return false;
+  }
 
   static constexpr char kRateLimitImpressionIdIndexSql[] =
       "CREATE INDEX rate_limit_source_id_idx "
       "ON rate_limits(source_id)";
-  if (!db->Execute(kRateLimitImpressionIdIndexSql))
+  if (!db->Execute(kRateLimitImpressionIdIndexSql)) {
     return false;
+  }
 
   meta_table->SetVersionNumber(35);
   return transaction.Commit();
@@ -208,19 +227,22 @@
   // Wrap each migration in its own transaction. See comment in
   // `MigrateToVersion34`.
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   static constexpr char kDropOldIndexSql[] = "DROP INDEX sources_by_origin";
-  if (!db->Execute(kDropOldIndexSql))
+  if (!db->Execute(kDropOldIndexSql)) {
     return false;
+  }
 
   static constexpr char kCreateNewIndexSql[] =
       "CREATE INDEX active_sources_by_source_origin "
       "ON sources(source_origin)"
       "WHERE event_level_active=1 OR aggregatable_active=1";
-  if (!db->Execute(kCreateNewIndexSql))
+  if (!db->Execute(kCreateNewIndexSql)) {
     return false;
+  }
 
   meta_table->SetVersionNumber(36);
   return transaction.Commit();
@@ -230,8 +252,9 @@
   // Wrap each migration in its own transaction. See comment in
   // `MigrateToVersion34`.
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   static constexpr char kNewDedupKeyTableSql[] =
       "CREATE TABLE new_dedup_keys("
@@ -239,8 +262,9 @@
       "report_type INTEGER NOT NULL,"
       "dedup_key INTEGER NOT NULL,"
       "PRIMARY KEY(source_id,report_type,dedup_key))WITHOUT ROWID";
-  if (!db->Execute(kNewDedupKeyTableSql))
+  if (!db->Execute(kNewDedupKeyTableSql)) {
     return false;
+  }
 
   static_assert(static_cast<int>(AttributionReport::Type::kEventLevel) == 0,
                 "update the report type value `0` below");
@@ -252,17 +276,20 @@
       "INSERT INTO new_dedup_keys SELECT "
       "source_id,0,dedup_key "
       "FROM dedup_keys";
-  if (!db->Execute(kPopulateNewDedupKeyTableSql))
+  if (!db->Execute(kPopulateNewDedupKeyTableSql)) {
     return false;
+  }
 
   static constexpr char kDropOldDedupKeyTableSql[] = "DROP TABLE dedup_keys";
-  if (!db->Execute(kDropOldDedupKeyTableSql))
+  if (!db->Execute(kDropOldDedupKeyTableSql)) {
     return false;
+  }
 
   static constexpr char kRenameDedupKeyTableSql[] =
       "ALTER TABLE new_dedup_keys RENAME TO dedup_keys";
-  if (!db->Execute(kRenameDedupKeyTableSql))
+  if (!db->Execute(kRenameDedupKeyTableSql)) {
     return false;
+  }
 
   meta_table->SetVersionNumber(37);
   return transaction.Commit();
@@ -272,8 +299,9 @@
   // Wrap each migration in its own transaction. See comment in
   // `MigrateToVersion34`.
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   static constexpr char kNewSourceTableSql[] =
       "CREATE TABLE new_sources("
@@ -298,8 +326,9 @@
       "aggregatable_budget_consumed INTEGER NOT NULL,"
       "aggregatable_source BLOB NOT NULL,"
       "filter_data BLOB NOT NULL)";
-  if (!db->Execute(kNewSourceTableSql))
+  if (!db->Execute(kNewSourceTableSql)) {
     return false;
+  }
 
   // Transfer the existing rows to the new table, inserting
   // `expiry_time` as default values for the event_report_window_time
@@ -313,17 +342,20 @@
       "source_site,debug_key,aggregatable_budget_consumed,"
       "aggregatable_source,filter_data "
       "FROM sources";
-  if (!db->Execute(kPopulateNewSourceTableSql))
+  if (!db->Execute(kPopulateNewSourceTableSql)) {
     return false;
+  }
 
   static constexpr char kDropOldSourceTableSql[] = "DROP TABLE sources";
-  if (!db->Execute(kDropOldSourceTableSql))
+  if (!db->Execute(kDropOldSourceTableSql)) {
     return false;
+  }
 
   static constexpr char kRenameSourceTableSql[] =
       "ALTER TABLE new_sources RENAME TO sources";
-  if (!db->Execute(kRenameSourceTableSql))
+  if (!db->Execute(kRenameSourceTableSql)) {
     return false;
+  }
 
   // Create the sources table indices on the new table.
   static constexpr char kConversionDestinationIndexSql[] =
@@ -331,29 +363,33 @@
       "ON sources"
       "(event_level_active,aggregatable_active,destination_site,"
       "reporting_origin)";
-  if (!db->Execute(kConversionDestinationIndexSql))
+  if (!db->Execute(kConversionDestinationIndexSql)) {
     return false;
+  }
 
   static constexpr char kImpressionExpiryIndexSql[] =
       "CREATE INDEX sources_by_expiry_time "
       "ON sources(expiry_time)";
-  if (!db->Execute(kImpressionExpiryIndexSql))
+  if (!db->Execute(kImpressionExpiryIndexSql)) {
     return false;
+  }
 
   static constexpr char kImpressionOriginIndexSql[] =
       "CREATE INDEX active_sources_by_source_origin "
       "ON sources(source_origin)"
       "WHERE event_level_active=1 OR aggregatable_active=1";
-  if (!db->Execute(kImpressionOriginIndexSql))
+  if (!db->Execute(kImpressionOriginIndexSql)) {
     return false;
+  }
 
   static constexpr char kImpressionSiteReportingOriginIndexSql[] =
       "CREATE INDEX active_unattributed_sources_by_site_reporting_origin "
       "ON sources(source_site,reporting_origin)"
       "WHERE event_level_active=1 AND num_attributions=0 AND "
       "aggregatable_active=1 AND aggregatable_budget_consumed=0";
-  if (!db->Execute(kImpressionSiteReportingOriginIndexSql))
+  if (!db->Execute(kImpressionSiteReportingOriginIndexSql)) {
     return false;
+  }
 
   meta_table->SetVersionNumber(38);
   return transaction.Commit();
@@ -363,8 +399,9 @@
   // Wrap each migration in its own transaction. See comment in
   // `MigrateToVersion34`.
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   // Create the new aggregatable_report_metadata table with
   // aggregation_coordinator. This follows the steps documented at
@@ -382,8 +419,9 @@
       "failed_send_attempts INTEGER NOT NULL,"
       "initial_report_time INTEGER NOT NULL,"
       "aggregation_coordinator INTEGER NOT NULL)";
-  if (!db->Execute(kNewAggregatableReportMetadataTableSql))
+  if (!db->Execute(kNewAggregatableReportMetadataTableSql)) {
     return false;
+  }
 
   // Transfer the existing aggregatable_report_metadata rows to the new table,
   // using
@@ -399,19 +437,22 @@
       "aggregation_id,source_id,trigger_time,debug_key,external_report_id,"
       "report_time,failed_send_attempts,initial_report_time,0 "
       "FROM aggregatable_report_metadata";
-  if (!db->Execute(kPopulateNewAggregatableReportMetadataSql))
+  if (!db->Execute(kPopulateNewAggregatableReportMetadataSql)) {
     return false;
+  }
 
   static constexpr char kDropOldAggregatableReportMetadataTableSql[] =
       "DROP TABLE aggregatable_report_metadata";
-  if (!db->Execute(kDropOldAggregatableReportMetadataTableSql))
+  if (!db->Execute(kDropOldAggregatableReportMetadataTableSql)) {
     return false;
+  }
 
   static constexpr char kRenameAggregatableReportMetadataTableSql[] =
       "ALTER TABLE new_aggregatable_report_metadata "
       "RENAME TO aggregatable_report_metadata";
-  if (!db->Execute(kRenameAggregatableReportMetadataTableSql))
+  if (!db->Execute(kRenameAggregatableReportMetadataTableSql)) {
     return false;
+  }
 
   // Create the pre-existing aggregatable_report_metadata table indices on the
   // new table.
@@ -419,20 +460,23 @@
   static constexpr char kAggregateSourceIdIndexSql[] =
       "CREATE INDEX aggregate_source_id_idx "
       "ON aggregatable_report_metadata(source_id)";
-  if (!db->Execute(kAggregateSourceIdIndexSql))
+  if (!db->Execute(kAggregateSourceIdIndexSql)) {
     return false;
+  }
 
   static constexpr char kAggregateTriggerTimeIndexSql[] =
       "CREATE INDEX aggregate_trigger_time_idx "
       "ON aggregatable_report_metadata(trigger_time)";
-  if (!db->Execute(kAggregateTriggerTimeIndexSql))
+  if (!db->Execute(kAggregateTriggerTimeIndexSql)) {
     return false;
+  }
 
   static constexpr char kAggregateReportTimeIndexSql[] =
       "CREATE INDEX aggregate_report_time_idx "
       "ON aggregatable_report_metadata(report_time)";
-  if (!db->Execute(kAggregateReportTimeIndexSql))
+  if (!db->Execute(kAggregateReportTimeIndexSql)) {
     return false;
+  }
 
   meta_table->SetVersionNumber(39);
   return transaction.Commit();
@@ -446,32 +490,39 @@
   DCHECK(meta_table);
 
   base::ThreadTicks start_timestamp;
-  if (base::ThreadTicks::IsSupported())
+  if (base::ThreadTicks::IsSupported()) {
     start_timestamp = base::ThreadTicks::Now();
+  }
 
   if (meta_table->GetVersionNumber() == 33) {
-    if (!MigrateToVersion34(db, meta_table))
+    if (!MigrateToVersion34(db, meta_table)) {
       return false;
+    }
   }
   if (meta_table->GetVersionNumber() == 34) {
-    if (!MigrateToVersion35(db, meta_table))
+    if (!MigrateToVersion35(db, meta_table)) {
       return false;
+    }
   }
   if (meta_table->GetVersionNumber() == 35) {
-    if (!MigrateToVersion36(db, meta_table))
+    if (!MigrateToVersion36(db, meta_table)) {
       return false;
+    }
   }
   if (meta_table->GetVersionNumber() == 36) {
-    if (!MigrateToVersion37(db, meta_table))
+    if (!MigrateToVersion37(db, meta_table)) {
       return false;
+    }
   }
   if (meta_table->GetVersionNumber() == 37) {
-    if (!MigrateToVersion38(db, meta_table))
+    if (!MigrateToVersion38(db, meta_table)) {
       return false;
+    }
   }
   if (meta_table->GetVersionNumber() == 38) {
-    if (!MigrateToVersion39(db, meta_table))
+    if (!MigrateToVersion39(db, meta_table)) {
       return false;
+    }
   }
   // Add similar if () blocks for new versions here.
 
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
index d957baa..313f6d8 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
@@ -90,8 +90,9 @@
     // Get version.
     sql::Statement s(
         db->GetUniqueStatement("SELECT value FROM meta WHERE key='version'"));
-    if (!s.Step())
+    if (!s.Step()) {
       return 0;
+    }
     return s.ColumnInt(0);
   }
 
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc
index f150e25..d495ae9f 100644
--- a/content/browser/attribution_reporting/attribution_storage_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -1256,7 +1256,8 @@
                         *SuitableOrigin::Deserialize("https://d1.test"))
                     .Build()));
 
-  // Allowed by pending, dropped by unexpired (therefore dropped and not stored).
+  // Allowed by pending, dropped by unexpired (therefore dropped and not
+  // stored).
   EXPECT_EQ(
       store_source("https://s.test", "https://a.r.test", "https://d2.test"),
       StorableSource::Result::kInsufficientUniqueDestinationCapacity);
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc
index aed4ca3..5c258ee 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.cc
+++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -226,8 +226,9 @@
 void ConfigurableStorageDelegate::ShuffleReports(
     std::vector<AttributionReport>& reports) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (reverse_reports_on_shuffle_)
+  if (reverse_reports_on_shuffle_) {
     base::ranges::reverse(reports);
+  }
 }
 
 AttributionStorageDelegate::RandomizedResponse
@@ -362,29 +363,33 @@
 }
 
 void MockAttributionManager::NotifySourcesChanged() {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnSourcesChanged();
+  }
 }
 
 void MockAttributionManager::NotifyReportsChanged(
     AttributionReport::Type report_type) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnReportsChanged(report_type);
+  }
 }
 
 void MockAttributionManager::NotifySourceHandled(
     const StorableSource& source,
     StorableSource::Result result,
     absl::optional<uint64_t> cleared_debug_key) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnSourceHandled(source, cleared_debug_key, result);
+  }
 }
 
 void MockAttributionManager::NotifyReportSent(const AttributionReport& report,
                                               bool is_debug_report,
                                               const SendResult& info) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnReportSent(report, is_debug_report, info);
+  }
 }
 
 void MockAttributionManager::NotifySourceRegistrationFailure(
@@ -403,16 +408,18 @@
     const AttributionTrigger& trigger,
     const CreateReportResult& result,
     absl::optional<uint64_t> cleared_debug_key) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnTriggerHandled(trigger, cleared_debug_key, result);
+  }
 }
 
 void MockAttributionManager::NotifyDebugReportSent(
     const AttributionDebugReport& report,
     const int status,
     const base::Time time) {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnDebugReportSent(report, status, time);
+  }
 }
 
 void MockAttributionManager::SetDataHostManager(
@@ -429,8 +436,9 @@
 void SourceObserver::OnDidFinishNavigation(
     NavigationHandle* navigation_handle) {
   if (!navigation_handle->GetImpression()) {
-    if (waiting_for_null_impression_)
+    if (waiting_for_null_impression_) {
       impression_loop_.Quit();
+    }
     return;
   }
 
@@ -446,8 +454,9 @@
 // Waits for |expected_num_impressions_| navigations with impressions, and
 // returns the last impression.
 const blink::Impression& SourceObserver::Wait() {
-  if (num_impressions_ >= expected_num_impressions_)
+  if (num_impressions_ >= expected_num_impressions_) {
     return *last_impression_;
+  }
   impression_loop_.Run();
   return last_impression();
 }
diff --git a/content/browser/attribution_reporting/attribution_utils.cc b/content/browser/attribution_reporting/attribution_utils.cc
index fbb80e17..15f76f5 100644
--- a/content/browser/attribution_reporting/attribution_utils.cc
+++ b/content/browser/attribution_reporting/attribution_utils.cc
@@ -144,15 +144,17 @@
         }
 
         auto source_filter = source.filter_values().find(trigger_filter.first);
-        if (source_filter == source.filter_values().end())
+        if (source_filter == source.filter_values().end()) {
           return true;
+        }
 
         // Desired behavior is to treat any empty set of values as a single
         // unique value itself. This means:
         //  - x:[] match x:[] is false when negated, and true otherwise.
         //  - x:[1,2,3] match x:[] is true when negated, and false otherwise.
-        if (trigger_filter.second.empty())
+        if (trigger_filter.second.empty()) {
           return negated != source_filter->second.empty();
+        }
 
         bool has_intersection = base::ranges::any_of(
             trigger_filter.second, [&](const std::string& value) {
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc
index 7fc4cef9..a2fd811 100644
--- a/content/browser/attribution_reporting/attributions_browsertest.cc
+++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -152,8 +152,9 @@
   // Waits for a report to be received matching the report url. Verifies that
   // the report url and report body were set correctly.
   void WaitForReport() {
-    if (!response->http_request())
+    if (!response->http_request()) {
       response->WaitForRequest();
+    }
 
     // The embedded test server resolves all urls to 127.0.0.1, so get the real
     // request host from the request headers.
@@ -222,8 +223,9 @@
   // Waits for a report to be received matching the report url. Verifies that
   // the report url and report body were set correctly.
   void WaitForReport() {
-    if (!response->http_request())
+    if (!response->http_request()) {
       response->WaitForRequest();
+    }
 
     // The embedded test server resolves all urls to 127.0.0.1, so get the real
     // request host from the request headers.
@@ -1314,8 +1316,9 @@
   int count = 0;
   EXPECT_CALL(observer, OnTriggerHandled).WillRepeatedly([&]() {
     count++;
-    if (count < 2)
+    if (count < 2) {
       return;
+    }
     loop.Quit();
   });
 
@@ -1333,11 +1336,13 @@
              JsReplace("createAttributionEligibleImgSrc($1);", register_url)));
 
   // Ensure we don't error out processing the redirect chain.
-  if (count < 2)
+  if (count < 2) {
     loop.Run();
+  }
 
-  if (!received_source)
+  if (!received_source) {
     source_loop.Run();
+  }
 }
 class AttributionsPrerenderBrowserTest : public AttributionsBrowserTest {
  public:
diff --git a/content/browser/attribution_reporting/combinatorics.cc b/content/browser/attribution_reporting/combinatorics.cc
index 240a347..b952bff 100644
--- a/content/browser/attribution_reporting/combinatorics.cc
+++ b/content/browser/attribution_reporting/combinatorics.cc
@@ -16,17 +16,20 @@
   DCHECK_GE(n, 0);
   DCHECK_GE(k, 0);
 
-  if (k > n)
+  if (k > n) {
     return 0;
+  }
 
   // Speed up some trivial cases.
-  if (k == n || n == 0)
+  if (k == n || n == 0) {
     return 1;
+  }
 
   // BinomialCoefficient(n, k) == BinomialCoefficient(n, n - k),
   // So simplify if possible.
-  if (k > n - k)
+  if (k > n - k) {
     k = n - k;
+  }
 
   // (n choose k) = n (n -1) ... (n - (k - 1)) / k!
   // = mul((n + i - i) / i), i from 1 -> k.
@@ -68,8 +71,9 @@
 
   std::vector<int> output_k_combination;
   output_k_combination.reserve(k);
-  if (k == 0)
+  if (k == 0) {
     return output_k_combination;
+  }
 
   // To find a_k, iterate candidates upwards from 0 until we've found the
   // maximum a such that (a choose k) <= `combination_index`. Let a_k = a. Use
diff --git a/content/browser/attribution_reporting/common_source_info.cc b/content/browser/attribution_reporting/common_source_info.cc
index 397f41c6..47f7a20 100644
--- a/content/browser/attribution_reporting/common_source_info.cc
+++ b/content/browser/attribution_reporting/common_source_info.cc
@@ -50,8 +50,9 @@
       declared_expiry.value_or(kDefaultAttributionSourceExpiry);
 
   // Expiry time for event sources must be a whole number of days.
-  if (source_type == AttributionSourceType::kEvent)
+  if (source_type == AttributionSourceType::kEvent) {
     expiry = expiry.RoundToMultiple(base::Days(1));
+  }
 
   // If the impression specified its own expiry, clamp it to the minimum and
   // maximum.
diff --git a/content/browser/attribution_reporting/privacy_sandbox_ads_apis_browsertest.cc b/content/browser/attribution_reporting/privacy_sandbox_ads_apis_browsertest.cc
index 133f101..66ee178 100644
--- a/content/browser/attribution_reporting/privacy_sandbox_ads_apis_browsertest.cc
+++ b/content/browser/attribution_reporting/privacy_sandbox_ads_apis_browsertest.cc
@@ -62,7 +62,7 @@
     return true;
   }
 };
-}
+}  // namespace
 
 class PrivacySandboxAdsAPIsBrowserTestBase : public ContentBrowserTest {
  public:
diff --git a/content/browser/attribution_reporting/rate_limit_table.cc b/content/browser/attribution_reporting/rate_limit_table.cc
index 7176bac..300776f 100644
--- a/content/browser/attribution_reporting/rate_limit_table.cc
+++ b/content/browser/attribution_reporting/rate_limit_table.cc
@@ -64,8 +64,9 @@
       "reporting_origin TEXT NOT NULL,"
       "time INTEGER NOT NULL,"
       "expiry_time INTEGER NOT NULL)";
-  if (!db->Execute(kRateLimitTableSql))
+  if (!db->Execute(kRateLimitTableSql)) {
     return false;
+  }
 
   static_assert(static_cast<int>(Scope::kAttribution) == 1,
                 "update `scope=1` clause below");
@@ -74,23 +75,26 @@
   static constexpr char kRateLimitSourceSiteReportingOriginIndexSql[] =
       "CREATE INDEX rate_limit_source_site_reporting_origin_idx "
       "ON rate_limits(scope,source_site,reporting_origin)";
-  if (!db->Execute(kRateLimitSourceSiteReportingOriginIndexSql))
+  if (!db->Execute(kRateLimitSourceSiteReportingOriginIndexSql)) {
     return false;
+  }
 
   // Optimizes calls to `AllowedForReportingOriginLimit()` and
   // `AttributionAllowedForAttributionLimit()`.
   static constexpr char kRateLimitReportingOriginIndexSql[] =
       "CREATE INDEX rate_limit_reporting_origin_idx "
       "ON rate_limits(scope,destination_site,source_site)";
-  if (!db->Execute(kRateLimitReportingOriginIndexSql))
+  if (!db->Execute(kRateLimitReportingOriginIndexSql)) {
     return false;
+  }
 
   // Optimizes calls to |DeleteExpiredRateLimits()|, |ClearAllDataInRange()|,
   // |ClearDataForOriginsInRange()|.
   static constexpr char kRateLimitTimeIndexSql[] =
       "CREATE INDEX rate_limit_time_idx ON rate_limits(time)";
-  if (!db->Execute(kRateLimitTimeIndexSql))
+  if (!db->Execute(kRateLimitTimeIndexSql)) {
     return false;
+  }
 
   // Optimizes calls to |ClearDataForSourceIds()|.
   static constexpr char kRateLimitImpressionIdIndexSql[] =
@@ -127,8 +131,9 @@
   DCHECK_GE(delete_frequency, base::TimeDelta());
   const base::Time now = base::Time::Now();
   if (now - last_cleared_ >= delete_frequency) {
-    if (!DeleteExpiredRateLimits(db))
+    if (!DeleteExpiredRateLimits(db)) {
       return false;
+    }
     last_cleared_ = now;
   }
 
@@ -194,8 +199,9 @@
   statement.BindString(2, common_info.reporting_origin().Serialize());
   statement.BindTime(3, min_timestamp);
 
-  if (!statement.Step())
+  if (!statement.Step()) {
     return RateLimitResult::kError;
+  }
 
   int64_t count = statement.ColumnInt64(0);
 
@@ -252,13 +258,15 @@
     // TODO(linnan): Consider adding an early exit query which first checks for
     // the existence of `destination_site` for (source_site, reporting_origin),
     // to avoid querying all of the rows in the case of multiple sources.
-    if (destination_site == serialized_destination_site)
+    if (destination_site == serialized_destination_site) {
       return RateLimitResult::kAllowed;
+    }
 
     destination_sites.insert(std::move(destination_site));
 
-    if (destination_sites.size() == static_cast<size_t>(limit))
+    if (destination_sites.size() == static_cast<size_t>(limit)) {
       return RateLimitResult::kNotAllowed;
+    }
   }
 
   return statement.Succeeded() ? RateLimitResult::kAllowed
@@ -317,13 +325,15 @@
     std::string reporting_origin = statement.ColumnString(0);
 
     // The origin isn't new, so it doesn't change the count.
-    if (reporting_origin == serialized_reporting_origin)
+    if (reporting_origin == serialized_reporting_origin) {
       return RateLimitResult::kAllowed;
+    }
 
     reporting_origins.insert(std::move(reporting_origin));
 
-    if (reporting_origins.size() == static_cast<size_t>(max))
+    if (reporting_origins.size() == static_cast<size_t>(max)) {
       return RateLimitResult::kNotAllowed;
+    }
   }
 
   return statement.Succeeded() ? RateLimitResult::kAllowed
@@ -363,16 +373,18 @@
     base::Time delete_end,
     StoragePartition::StorageKeyMatcherFunction filter) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (filter.is_null())
+  if (filter.is_null()) {
     return ClearAllDataInRange(db, delete_begin, delete_end);
+  }
 
   static constexpr char kDeleteSql[] = "DELETE FROM rate_limits WHERE id=?";
   sql::Statement delete_statement(
       db->GetCachedStatement(SQL_FROM_HERE, kDeleteSql));
 
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   static constexpr char kSelectSql[] =
       // clang-format off
@@ -398,13 +410,15 @@
       // DELETE to be interleaved in the surrounding SELECT.
       delete_statement.Reset(/*clear_bound_vars=*/false);
       delete_statement.BindInt64(0, rate_limit_id);
-      if (!delete_statement.Run())
+      if (!delete_statement.Run()) {
         return false;
+      }
     }
   }
 
-    if (!select_statement.Succeeded())
-      return false;
+  if (!select_statement.Succeeded()) {
+    return false;
+  }
 
   return transaction.Commit();
 }
@@ -438,8 +452,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   sql::Transaction transaction(db);
-  if (!transaction.Begin())
+  if (!transaction.Begin()) {
     return false;
+  }
 
   static constexpr char kDeleteRateLimitSql[] =
       "DELETE FROM rate_limits WHERE source_id=?";
@@ -449,8 +464,9 @@
   for (StoredSource::Id id : source_ids) {
     statement.Reset(/*clear_bound_vars=*/true);
     statement.BindInt64(0, *id);
-    if (!statement.Run())
+    if (!statement.Run()) {
       return false;
+    }
   }
 
   return transaction.Commit();
diff --git a/content/browser/attribution_reporting/trigger_registration_browsertest.cc b/content/browser/attribution_reporting/trigger_registration_browsertest.cc
index fcaa6c99..61b91de 100644
--- a/content/browser/attribution_reporting/trigger_registration_browsertest.cc
+++ b/content/browser/attribution_reporting/trigger_registration_browsertest.cc
@@ -101,8 +101,9 @@
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createTrackingPixel($1);", register_url)));
 
-  if (!data_host)
+  if (!data_host) {
     loop.Run();
+  }
 
   data_host->WaitForTriggerData(/*num_trigger_data=*/1);
   const auto& trigger_data = data_host->trigger_data();
@@ -130,8 +131,9 @@
           [&](mojo::PendingReceiver<blink::mojom::AttributionDataHost> host,
               RegistrationType) {
             data_hosts.push_back(GetRegisteredDataHost(std::move(host)));
-            if (data_hosts.size() == 2)
+            if (data_hosts.size() == 2) {
               loop.Quit();
+            }
           });
 
   GURL register_url = https_server()->GetURL(
@@ -140,8 +142,9 @@
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createTrackingPixel($1);", register_url)));
 
-  if (data_hosts.size() != 2)
+  if (data_hosts.size() != 2) {
     loop.Run();
+  }
 
   data_hosts.front()->WaitForTriggerData(/*num_trigger_data=*/1);
   const auto& trigger_data1 = data_hosts.front()->trigger_data();
diff --git a/content/browser/devtools/network_service_devtools_observer.cc b/content/browser/devtools/network_service_devtools_observer.cc
index 9fadded9..c6fff3e 100644
--- a/content/browser/devtools/network_service_devtools_observer.cc
+++ b/content/browser/devtools/network_service_devtools_observer.cc
@@ -209,6 +209,21 @@
     GetContentClient()->browser()->LogWebFeatureForCurrentPage(
         rfhi,
         blink::mojom::WebFeature::kPrivateNetworkAccessIgnoredPreflightError);
+
+    if (!initiator_origin.has_value() ||
+        !initiator_origin->IsSameOriginWith(url)) {
+      GetContentClient()->browser()->LogWebFeatureForCurrentPage(
+          rfhi, blink::mojom::WebFeature::
+                    kPrivateNetworkAccessIgnoredCrossOriginPreflightError);
+    }
+
+    if (!initiator_origin.has_value() ||
+        net::SchemefulSite(initiator_origin.value()) !=
+            net::SchemefulSite(url)) {
+      GetContentClient()->browser()->LogWebFeatureForCurrentPage(
+          rfhi, blink::mojom::WebFeature::
+                    kPrivateNetworkAccessIgnoredCrossSitePreflightError);
+    }
   }
 
   std::unique_ptr<protocol::Audits::AffectedRequest> affected_request =
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index 8204d957..6d15580 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -4542,6 +4542,10 @@
     // (This should always be false when `!is_embedder_initiated`.
     bool is_opaque = false;
 
+    struct Event {
+      std::string type;
+      std::string reporting_destination;
+    };
     struct Destination {
       // The origin for the navigation.
       std::string origin;
@@ -4549,6 +4553,9 @@
       std::string path;
     };
 
+    // Specifies the reporting destination and event type for reportEvent.
+    Event event{"click", "buyer"};
+
     // The initial navigation destination (may be redirected).
     Destination destination;
     // A list of redirects that the navigation should take. The last redirect
@@ -4580,13 +4587,13 @@
         return "This frame did not register reporting metadata.";
       case Step::Result::kNoDestination:
         return "This frame did not register reporting metadata for "
-               "destination*";
+               "destination *";
       case Step::Result::kNoReportingURL:
-        return "This frame did not register reporting url for destination (.*) "
-               "and event_type (.*)";
+        return "This frame did not register reporting url for destination * "
+               "and event_type *";
       case Step::Result::kInvalidReportingURL:
-        return "This frame registered invalid reporting url for destination "
-               "(.*) and event_type (.*)";
+        return "This frame registered invalid reporting url for destination * "
+               "and event_type *";
       default:
         return "";
     }
@@ -4657,13 +4664,17 @@
     EXPECT_TRUE(fenced_frame_root_node->IsFencedFrameRoot());
     EXPECT_TRUE(fenced_frame_root_node->IsInFencedFrameTree());
 
-    // Create reporting metadata.
+    // Create valid reporting metadata for buyer.
     ReportingMetadata fenced_frame_reporting;
     GURL reporting_url(
         https_server()->GetURL("c.test", "/_report_event_server.html"));
     fenced_frame_reporting
         .metadata[blink::FencedFrame::ReportingDestination::kBuyer]["click"] =
         reporting_url;
+    // Create reporting metadata with an empty reporting url for seller.
+    fenced_frame_reporting
+        .metadata[blink::FencedFrame::ReportingDestination::kSeller]["click"] =
+        GURL();
     // Get the urn mapping object.
     FencedFrameURLMapping& url_mapping =
         root->current_frame_host()->GetPage().fenced_frame_urls_map();
@@ -4745,7 +4756,7 @@
       auto filter =
           [](const content::WebContentsConsoleObserver::Message& message) {
             return message.log_level ==
-                   blink::mojom::ConsoleMessageLevel::kWarning;
+                   blink::mojom::ConsoleMessageLevel::kError;
           };
       console_observer.SetFilter(base::BindRepeating(filter));
       if (step.report_event_result != Step::Result::kSuccess) {
@@ -4756,23 +4767,27 @@
       // Perform the reportEvent call, with a unique body.
       const char report_event_script[] = R"(
         window.fence.reportEvent({
-          eventType: 'click',
-          eventData: 'click $1',
-          destination: ['buyer'],
+          eventType: $2,
+          eventData: $2 + ' $1',
+          destination: [$3],
         });
       )";
-      EXPECT_TRUE(ExecJs(navigation_target_node,
-                         JsReplace(report_event_script, navigation_index)));
+      EXPECT_TRUE(
+          ExecJs(navigation_target_node,
+                 JsReplace(report_event_script, navigation_index,
+                           step.event.type, step.event.reporting_destination)));
 
       // If relevant, check that the event report succeeded.
       if (step.report_event_result == Step::Result::kSuccess) {
         auto& response = *responses[response_index];
         response.WaitForRequest();
-        EXPECT_EQ(response.http_request()->content,
-                  JsReplace("click $1", navigation_index));
+        EXPECT_EQ(
+            response.http_request()->content,
+            step.event.type + " " + base::NumberToString(navigation_index));
         response.Done();
         response_index++;
       } else {
+        ASSERT_TRUE(console_observer.Wait());
         EXPECT_FALSE(console_observer.messages().empty());
         EXPECT_EQ(console_observer.messages().size(), 1u);
       }
@@ -4793,6 +4808,58 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+// Fenced frame not in opaque-ads mode should fail reportEvent().
+IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest,
+                       FencedFrameReportEventNonOpaqueAdsMode) {
+  net::test_server::ControllableHttpResponse response(
+      https_server(), "/_report_event_server.html");
+  ASSERT_TRUE(https_server()->Start());
+
+  // Set up the embedder and a default mode fenced frame.
+  GURL main_url = https_server()->GetURL("a.test", "/hello.html");
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+  EXPECT_TRUE(ExecJs(root,
+                     "var f = document.createElement('fencedframe');"
+                     "f.mode = 'default';"
+                     "document.body.appendChild(f);"));
+
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* fenced_frame_root_node =
+      GetFencedFrameRootNode(root->child_at(0));
+  EXPECT_TRUE(fenced_frame_root_node->IsFencedFrameRoot());
+  EXPECT_TRUE(fenced_frame_root_node->IsInFencedFrameTree());
+
+  WebContentsConsoleObserver console_observer(web_contents());
+  auto filter =
+      [](const content::WebContentsConsoleObserver::Message& message) {
+        return message.log_level == blink::mojom::ConsoleMessageLevel::kError;
+      };
+  console_observer.SetFilter(base::BindRepeating(filter));
+  console_observer.SetPattern(
+      GetConsoleWarningPattern(Step::Result::kModeNotOpaque));
+
+  // Perform the reportEvent call, with a unique body.
+  const char report_event_script[] = R"(
+        window.fence.reportEvent({
+          eventType: 'click',
+          eventData: 'click 0',
+          destination: ['buyer'],
+        });
+      )";
+  EXPECT_TRUE(ExecJs(fenced_frame_root_node, JsReplace(report_event_script)));
+
+  // Check console warning.
+  ASSERT_TRUE(console_observer.Wait());
+  EXPECT_FALSE(console_observer.messages().empty());
+  EXPECT_EQ(console_observer.messages().size(), 1u);
+
+  // Check that the reporting beacon is not sent.
+  EXPECT_FALSE(response.has_received_request());
+}
+
 // The simplest test case: URN navigation into reportEvent.
 IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest,
                        FencedFrameReportEventEmbedderURNNavigation) {
@@ -4807,6 +4874,54 @@
   RunTest(config);
 }
 
+// reportEvent shouldn't work if there is no associated reporting metadata with
+// the reporting destination.
+IN_PROC_BROWSER_TEST_F(
+    FencedFrameReportEventBrowserTest,
+    FencedFrameReportEventNoMetadataForReportingDestination) {
+  std::vector<Step> config = {
+      {
+          .is_embedder_initiated = true,
+          .is_opaque = true,
+          .event = {"click", "component-seller"},
+          .destination = {"a.test", "/fenced_frames/title1.html"},
+          .report_event_result = Step::Result::kNoDestination,
+      },
+  };
+  RunTest(config);
+}
+
+// reportEvent shouldn't work if there is no associated reporting url with
+// the event type and the reporting destination.
+IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest,
+                       FencedFrameReportEventNoReportingURLForEventType) {
+  std::vector<Step> config = {
+      {
+          .is_embedder_initiated = true,
+          .is_opaque = true,
+          .event = {"invalid-event", "buyer"},
+          .destination = {"a.test", "/fenced_frames/title1.html"},
+          .report_event_result = Step::Result::kNoReportingURL,
+      },
+  };
+  RunTest(config);
+}
+
+// reportEvent shouldn't work if the reporting url is invalid.
+IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest,
+                       FencedFrameReportEventInvalidReportingURL) {
+  std::vector<Step> config = {
+      {
+          .is_embedder_initiated = true,
+          .is_opaque = true,
+          .event = {"click", "seller"},
+          .destination = {"a.test", "/fenced_frames/title1.html"},
+          .report_event_result = Step::Result::kInvalidReportingURL,
+      },
+  };
+  RunTest(config);
+}
+
 // reportEvent should work in same-origin subframes.
 IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest,
                        FencedFrameReportEventNestedIframeSameOriginNavigation) {
diff --git a/content/browser/fenced_frame/fenced_frame_config.cc b/content/browser/fenced_frame/fenced_frame_config.cc
index c745586..a169b544 100644
--- a/content/browser/fenced_frame/fenced_frame_config.cc
+++ b/content/browser/fenced_frame/fenced_frame_config.cc
@@ -90,13 +90,10 @@
                                       shared_storage_budget_metadata,
                                       VisibilityToEmbedder::kOpaque,
                                       VisibilityToContent::kOpaque),
-      // TODO(crbug.com/1381158): Give the reporting metadata
-      // `VisibilityToContent::kOpaque` once it is no longer needed in the
-      // renderer.
       reporting_metadata_(absl::in_place,
                           reporting_metadata,
                           VisibilityToEmbedder::kOpaque,
-                          VisibilityToContent::kTransparent) {}
+                          VisibilityToContent::kOpaque) {}
 
 FencedFrameConfig::FencedFrameConfig(const FencedFrameConfig&) = default;
 FencedFrameConfig::FencedFrameConfig(FencedFrameConfig&&) = default;
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
index 07785262..33631a1 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -105,7 +105,7 @@
 
   config.reporting_metadata_.emplace(reporting_metadata,
                                      VisibilityToEmbedder::kOpaque,
-                                     VisibilityToContent::kTransparent);
+                                     VisibilityToContent::kOpaque);
   return urn;
 }
 
diff --git a/content/browser/payments/payment_app_browsertest.cc b/content/browser/payments/payment_app_browsertest.cc
index 574b51d..d45acc0 100644
--- a/content/browser/payments/payment_app_browsertest.cc
+++ b/content/browser/payments/payment_app_browsertest.cc
@@ -320,17 +320,10 @@
       registrationIds[0], GetTestServerOrigin(), "id", "basic-card");
   ASSERT_TRUE(can_make_payment);
 
-  EXPECT_EQ("https://example.test/", PopConsoleString() /* topOrigin */);
-  EXPECT_EQ("https://example.test/",
-            PopConsoleString() /* paymentRequestOrigin */);
-  EXPECT_EQ("[{\"supportedMethods\":\"basic-card\"}]",
-            PopConsoleString() /* methodData */);
-  EXPECT_EQ(
-      "[{\"additionalDisplayItems\":[],\"supportedMethods\":\"basic-card\","
-      "\"total\":{\"amount\":{\"currency\":\"USD\","
-      "\"value\":\"55\"},\"label\":\"\",\"pending\":false}}"
-      "]",
-      PopConsoleString() /* modifiers */);
+  EXPECT_EQ("undefined", PopConsoleString() /* topOrigin */);
+  EXPECT_EQ("undefined", PopConsoleString() /* paymentRequestOrigin */);
+  EXPECT_EQ("undefined", PopConsoleString() /* methodData */);
+  EXPECT_EQ("undefined", PopConsoleString() /* modifiers */);
 
   ClearStoragePartitionData();
 }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 298581c..a00f476 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -214,6 +214,7 @@
 #include "services/network/public/cpp/is_potentially_trustworthy.h"
 #include "services/network/public/cpp/network_service_buildflags.h"
 #include "services/network/public/cpp/not_implemented_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/cpp/trust_token_operation_authorization.h"
 #include "services/network/public/cpp/web_sandbox_flags.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
@@ -386,6 +387,53 @@
 
 namespace {
 
+constexpr net::NetworkTrafficAnnotationTag kReportingBeaconNetworkTag =
+    net::DefineNetworkTrafficAnnotation("fenced_frame_reporting_beacon",
+                                        R"(
+        semantics {
+          sender: "Fenced frame reportEvent API"
+          description:
+            "This request sends out reporting beacon data in an HTTP POST "
+            "request. This is initiated by window.fence.reportEvent API."
+          trigger:
+            "When there are events such as impressions, user interactions and "
+            "clicks, fenced frames can invoke window.fence.reportEvent API. It "
+            "tells the browser to send a beacon with event data to a URL "
+            "registered by the worklet in registerAdBeacon. Please see "
+            "https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md#reportevent"
+          data:
+            "Event data given by fenced frame reportEvent API. Please see "
+            "https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md#parameters"
+          destination: OTHER
+          destination_other: "The reporting destination given by FLEDGE's "
+                             "registerAdBeacon API or selectURL's inputs."
+        }
+        policy {
+          cookies_allowed: NO
+          setting: "To use reportEvent API, users need to enable selectURL, "
+          "FLEDGE and FencedFrames features by enabling the Privacy Sandbox "
+          "Ads APIs experiment flag at "
+          "chrome://flags/#privacy-sandbox-ads-apis "
+          policy_exception_justification: "This beacon is sent by fenced frame "
+          "calling window.fence.reportEvent when there are events like user "
+          "interactions."
+        }
+      )");
+
+base::StringPiece ReportingDestinationAsString(
+    const blink::FencedFrame::ReportingDestination& destination) {
+  switch (destination) {
+    case blink::FencedFrame::ReportingDestination::kBuyer:
+      return "Buyer";
+    case blink::FencedFrame::ReportingDestination::kSeller:
+      return "Seller";
+    case blink::FencedFrame::ReportingDestination::kComponentSeller:
+      return "ComponentSeller";
+    case blink::FencedFrame::ReportingDestination::kSharedStorageSelectUrl:
+      return "SharedStorageSelectUrl";
+  }
+}
+
 constexpr int kSubframeProcessShutdownDelayInMSec = 2 * 1000;
 static_assert(kSubframeProcessShutdownDelayInMSec +
                       RenderViewHostImpl::kUnloadTimeoutInMSec <
@@ -7497,6 +7545,101 @@
   new_main_rfh->render_view_host()->RenderViewCreated(new_main_rfh);
 }
 
+// TODO(crbug.com/1400992): Move SendFencedFrameReportingBeacon into a separate
+// refcounted class.
+void RenderFrameHostImpl::SendFencedFrameReportingBeacon(
+    const std::string& event_data,
+    const std::string& event_type,
+    blink::FencedFrame::ReportingDestination destination) {
+  // Get the reporting metadata associated with the fenced frame.
+  const absl::optional<FencedFrameProperties>& fenced_frame_properties =
+      frame_tree_node_->GetFencedFrameProperties();
+  if (!fenced_frame_properties.has_value() ||
+      !fenced_frame_properties->reporting_metadata_.has_value() ||
+      fenced_frame_properties->reporting_metadata_->GetValueIgnoringVisibility()
+          .metadata.empty()) {
+    // No associated reporting metadata or empty reporting metadata associated
+    // with the fenced frame.
+    // For no associated reporting metadata case, it should have been captured
+    // in the renderer process at `Fence::reportEvent`.
+    // Both cases imply there is an inconsistency between the browser and the
+    // renderer.
+    mojo::ReportBadMessage(
+        "This frame had reporting metadata registered in its renderer process "
+        "but not in its browser process. The reporting metadata should be "
+        "consistent between the two.");
+    return;
+  }
+
+  const blink::FencedFrame::FencedFrameReporting& fenced_frame_reporting =
+      fenced_frame_properties->reporting_metadata_
+          ->GetValueIgnoringVisibility();
+
+  // Check metadata registration for given destination.
+  const auto metadata_iter = fenced_frame_reporting.metadata.find(destination);
+  if (metadata_iter == fenced_frame_reporting.metadata.end()) {
+    AddMessageToConsole(
+        blink::mojom::ConsoleMessageLevel::kError,
+        base::StrCat(
+            {"This frame did not register reporting metadata for destination '",
+             ReportingDestinationAsString(destination), "'."}));
+    return;
+  }
+
+  // Check reporting url registration for given destination and event type.
+  const auto url_iter = metadata_iter->second.find(event_type);
+  if (url_iter == metadata_iter->second.end()) {
+    AddMessageToConsole(
+        blink::mojom::ConsoleMessageLevel::kError,
+        base::StrCat(
+            {"This frame did not register reporting url for destination '",
+             ReportingDestinationAsString(destination), "' and event_type '",
+             event_type, "'."}));
+    return;
+  }
+
+  // Validate the reporting url.
+  GURL url = url_iter->second;
+  if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) {
+    AddMessageToConsole(
+        blink::mojom::ConsoleMessageLevel::kError,
+        base::StrCat(
+            {"This frame registered invalid reporting url for destination '",
+             ReportingDestinationAsString(destination), "' and event_type '",
+             event_type, "'."}));
+    return;
+  }
+
+  // Construct the resource request.
+  auto request = std::make_unique<network::ResourceRequest>();
+
+  request->url = url;
+  request->mode = network::mojom::RequestMode::kCors;
+  request->request_initiator = GetLastCommittedOrigin();
+  request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+  request->method = net::HttpRequestHeaders::kPostMethod;
+  request->headers.SetHeader(net::HttpRequestHeaders::kContentType,
+                             "text/plain;charset=UTF-8");
+  request->trusted_params = network::ResourceRequest::TrustedParams();
+  request->trusted_params->isolation_info =
+      net::IsolationInfo::CreateTransient();
+
+  // Obtain the `SimpleURLLoader` instance.
+  std::unique_ptr<network::SimpleURLLoader> simple_url_loader =
+      network::SimpleURLLoader::Create(std::move(request),
+                                       kReportingBeaconNetworkTag);
+  simple_url_loader->AttachStringForUpload(event_data);
+
+  network::SimpleURLLoader* simple_url_loader_ptr = simple_url_loader.get();
+  auto* shared_url_loader_factory =
+      GetStoragePartition()->GetURLLoaderFactoryForBrowserProcess().get();
+
+  // Send out the reporting beacon.
+  simple_url_loader_ptr->DownloadHeadersOnly(
+      shared_url_loader_factory,
+      base::DoNothingWithBoundArgs(std::move(simple_url_loader)));
+}
+
 void RenderFrameHostImpl::CreatePortal(
     mojo::PendingAssociatedReceiver<blink::mojom::Portal> pending_receiver,
     mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client,
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index a19e9306..ad89c4e 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -2310,6 +2310,10 @@
   void DidChangeBaseURL(const GURL& base_url) override;
   void ReceivedDelegatedCapability(
       blink::mojom::DelegatedCapability delegated_capability) override;
+  void SendFencedFrameReportingBeacon(
+      const std::string& event_data,
+      const std::string& event_type,
+      blink::FencedFrame::ReportingDestination destination) override;
   void CreatePortal(
       mojo::PendingAssociatedReceiver<blink::mojom::Portal> pending_receiver,
       mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client,
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index 908dc6e..36196a24 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -915,10 +915,10 @@
     std::set<blink::mojom::WebFeature> used_features(data.used_features.begin(),
                                                      data.used_features.end());
     version->set_used_features(std::move(used_features));
-    version->set_cross_origin_embedder_policy(
-        data.policy_container_policies->cross_origin_embedder_policy);
     // policy_container_host could be null for registration restored from old DB
     if (data.policy_container_policies) {
+      version->set_cross_origin_embedder_policy(
+          data.policy_container_policies->cross_origin_embedder_policy);
       version->set_policy_container_host(
           base::MakeRefCounted<PolicyContainerHost>(
               PolicyContainerPolicies(*data.policy_container_policies)));
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index dc268c22..b3bf4ff1 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -1269,21 +1269,6 @@
              "WebAssemblyBaseline",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enable memory protection for code JITed for WebAssembly.
-BASE_FEATURE(kWebAssemblyCodeProtection,
-             "WebAssemblyCodeProtection",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
-// Use memory protection keys in userspace (PKU) (if available) to protect code
-// JITed for WebAssembly. Fall back to traditional memory protection if
-// WebAssemblyCodeProtection is also enabled.
-BASE_FEATURE(kWebAssemblyCodeProtectionPku,
-             "WebAssemblyCodeProtectionPku",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-#endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) &&
-        // defined(ARCH_CPU_X86_64)
-
 // Enable WebAssembly stack switching.
 #if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64)
 BASE_FEATURE(kEnableExperimentalWebAssemblyStackSwitching,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index c9ae4fa..5915dcd 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -283,11 +283,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kVideoPlaybackQuality);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kV8VmFuture);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyBaseline);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyCodeProtection);
-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyCodeProtectionPku);
-#endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) &&
-        // defined(ARCH_CPU_X86_64)
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyDynamicTiering);
 #if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64)
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 1d59106..413a4e3b 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1059,12 +1059,8 @@
         navigation_params->ad_auction_components->push_back(blink::WebURL(urn));
       }
     }
-
-    if (commit_params.fenced_frame_properties->reporting_metadata()) {
-      navigation_params->fenced_frame_reporting =
-          commit_params.fenced_frame_properties->reporting_metadata()
-              ->potentially_opaque_value;
-    }
+    navigation_params->has_fenced_frame_reporting =
+        commit_params.fenced_frame_properties->reporting_metadata().has_value();
   }
 
   navigation_params->ancestor_or_self_has_cspee =
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index 07a0e9c4..7772443 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -149,19 +149,6 @@
   SetV8FlagIfFeature(features::kWebAssemblyBaseline, "--liftoff");
   SetV8FlagIfNotFeature(features::kWebAssemblyBaseline, "--no-liftoff");
 
-  SetV8FlagIfFeature(features::kWebAssemblyCodeProtection,
-                     "--wasm-write-protect-code-memory");
-  SetV8FlagIfNotFeature(features::kWebAssemblyCodeProtection,
-                        "--no-wasm-write-protect-code-memory");
-
-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
-  SetV8FlagIfFeature(features::kWebAssemblyCodeProtectionPku,
-                     "--wasm-memory-protection-keys");
-  SetV8FlagIfNotFeature(features::kWebAssemblyCodeProtectionPku,
-                        "--no-wasm-memory-protection-keys");
-#endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) &&
-        // defined(ARCH_CPU_X86_64)
-
 #if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64)
   SetV8FlagIfFeature(features::kEnableExperimentalWebAssemblyStackSwitching,
                      "--experimental-wasm-stack-switching");
diff --git a/content/test/data/payments/payment_app.js b/content/test/data/payments/payment_app.js
index bce2d3dc..49bc5c2 100644
--- a/content/test/data/payments/payment_app.js
+++ b/content/test/data/payments/payment_app.js
@@ -22,14 +22,7 @@
     });
   }));
 
-  e.respondWith(new Promise(resolve => {
-    e.methodData.forEach(methodData => {
-      if (methodData.supportedMethods == 'basic-card') {
-        resolve(true);
-        return;
-      }
-    });
-  }));
+  e.respondWith(true);
 });
 
 self.addEventListener('paymentrequest', e => {
diff --git a/content/test/gpu/gather_power_measurement_results.py b/content/test/gpu/gather_power_measurement_results.py
index 88d14bb..4abea38 100755
--- a/content/test/gpu/gather_power_measurement_results.py
+++ b/content/test/gpu/gather_power_measurement_results.py
@@ -271,10 +271,9 @@
       action='store_true',
       default=False,
       help='Enable verbose output')
-  parser.add_argument(
-      '--bot',
-      default='Win10 FYI x64 Release (Intel HD 630)',
-      help='Which bot to examine.')
+  parser.add_argument('--bot',
+                      default='Win10 FYI x64 Release (Intel)',
+                      help='Which bot to examine.')
   parser.add_argument(
       '--last-build',
       type=int,
diff --git a/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
index 66b6ec2..f919aa1 100644
--- a/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
@@ -81,19 +81,6 @@
 ###################
 # Non-"Skip" expectations go here to suppress regular flakes/failures.
 
-# These tests fail consistently on Win10 FYI x64 Exp Release (Intel HD 630).
-crbug.com/1074402 [ win10 intel-0x5912 ] Basic [ Failure ]
-crbug.com/1074402 [ win10 intel-0x5912 ] Video_720_MP4 [ Failure ]
-crbug.com/1074402 [ win10 intel-0x5912 ] Video_720_MP4_Underlay [ Failure ]
-crbug.com/1074402 [ win10 intel-0x5912 ] Video_720_MP4_Fullscreen [ Failure ]
-crbug.com/1074402 [ win10 intel-0x5912 ] Video_720_MP4_Underlay_Fullscreen [ Failure ]
-# These tests were previously flaky, due to crbug.com/941163, so when the above
-# consistent failures are fixed, these expectations may need to be restored.
-#crbug.com/941163 [ win10 intel-0x5912 ] Video_720_MP4 [ RetryOnFailure ]
-#crbug.com/941163 [ win10 intel-0x5912 ] Video_720_MP4_Underlay [ RetryOnFailure ]
-#crbug.com/941163 [ win10 intel-0x5912 ] Video_720_MP4_Fullscreen [ RetryOnFailure ]
-#crbug.com/941163 [ win10 intel-0x5912 ] Video_720_MP4_Underlay_Fullscreen [ RetryOnFailure ]
-
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
 #######################################################################
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 78ec3f49..b679a6d 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -256,10 +256,6 @@
 # New validation was not implemented on the validating command decoder.
 crbug.com/angleproject/6358 [ no-passthrough ] conformance/programs/program-test.html [ Failure ]
 
-# TODO(crbug.com/1382796) uncomment Pixel 4 expectation when this one is removed
-crbug.com/1404705 conformance/context/context-release-upon-reload.html [ RetryOnFailure ]
-crbug.com/1404705 conformance/context/context-release-with-workers.html [ RetryOnFailure ]
-
 ####################
 # Win failures     #
 ####################
@@ -626,8 +622,7 @@
 crbug.com/angleproject/3686 [ android angle-opengles ] deqp/functional/gles3/multisample/fbo_max_samples.html [ Failure ]
 # finder:group-start crbug.com/1382796 failures happen in many tests, so can be classified as stale for one specific test
 crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] conformance/canvas/rapid-resizing.html [ RetryOnFailure ]
-# TODO(crbug.com/1404705) uncomment when the expectation for all platforms is removed
-# crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] conformance/context/context-release-with-workers.html [ RetryOnFailure ]
+crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] conformance/context/context-release-with-workers.html [ RetryOnFailure ]
 crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] conformance/textures/misc/texture-corner-case-videos.html [ RetryOnFailure ]
 crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] conformance2/sync/sync-webgl-specific.html [ RetryOnFailure ]
 crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] deqp/data/gles3/shaders/declarations.html [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 28d25c8..04d3b4d04 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -316,7 +316,6 @@
 # New validation was not implemented on the validating command decoder.
 crbug.com/angleproject/6358 [ no-passthrough ] conformance/programs/program-test.html [ Failure ]
 
-
 # Win / Intel / Vulkan / Passthrough command decoder
 # Technically flaky, but flake rate is too high for RetryOnFailure.
 # TODO(crbug.com/1276153) uncomment after fix for updated part of test applies
diff --git a/device/bluetooth/bluetooth_adapter_factory.cc b/device/bluetooth/bluetooth_adapter_factory.cc
index 7822621..617bfe76d 100644
--- a/device/bluetooth/bluetooth_adapter_factory.cc
+++ b/device/bluetooth/bluetooth_adapter_factory.cc
@@ -4,6 +4,7 @@
 
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -20,7 +21,6 @@
 #include "base/mac/mac_util.h"
 #endif
 #if BUILDFLAG(IS_WIN)
-#include "base/win/windows_version.h"
 #include "device/bluetooth/bluetooth_adapter_win.h"
 #endif
 
@@ -56,13 +56,8 @@
   }
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_MAC)
+    BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
   return true;
-#elif BUILDFLAG(IS_WIN)
-  // Windows 8 supports Low Energy GATT operations but it does not support
-  // scanning, initiating connections and GATT Server. To keep the API
-  // consistent we consider Windows 8 as lacking Low Energy support.
-  return base::win::GetVersion() >= base::win::Version::WIN10;
 #else
   return false;
 #endif
@@ -93,12 +88,6 @@
 #if BUILDFLAG(IS_WIN)
   DCHECK(IsBluetoothSupported());
 
-  if (base::win::GetVersion() < base::win::Version::WIN10) {
-    // Prior to Win10, the default adapter will support Bluetooth classic.
-    GetAdapter(std::move(callback));
-    return;
-  }
-
   if (!classic_adapter_) {
     classic_adapter_callbacks_.push_back(std::move(callback));
 
diff --git a/device/bluetooth/bluetooth_adapter_win.cc b/device/bluetooth/bluetooth_adapter_win.cc
index 60570d02..11fc7133 100644
--- a/device/bluetooth/bluetooth_adapter_win.cc
+++ b/device/bluetooth/bluetooth_adapter_win.cc
@@ -17,7 +17,6 @@
 #include "base/stl_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
-#include "base/win/windows_version.h"
 #include "device/base/features.h"
 #include "device/bluetooth/bluetooth_adapter_winrt.h"
 #include "device/bluetooth/bluetooth_classic_win.h"
@@ -51,16 +50,10 @@
 
 // static
 bool BluetoothAdapterWin::UseNewBLEWinImplementation() {
-  return base::FeatureList::IsEnabled(kNewBLEWinImplementation) &&
-         base::win::GetVersion() >= base::win::Version::WIN10;
+  return base::FeatureList::IsEnabled(kNewBLEWinImplementation);
 }
 
-BluetoothAdapterWin::BluetoothAdapterWin()
-    : BluetoothAdapter(),
-      initialized_(false),
-      powered_(false),
-      discovery_status_(NOT_DISCOVERING),
-      force_update_device_for_test_(false) {}
+BluetoothAdapterWin::BluetoothAdapterWin() = default;
 
 BluetoothAdapterWin::~BluetoothAdapterWin() {
   if (task_manager_.get())
diff --git a/device/bluetooth/bluetooth_adapter_win.h b/device/bluetooth/bluetooth_adapter_win.h
index a7d7b93..9757ad9 100644
--- a/device/bluetooth/bluetooth_adapter_win.h
+++ b/device/bluetooth/bluetooth_adapter_win.h
@@ -136,9 +136,9 @@
   base::OnceClosure init_callback_;
   std::string address_;
   std::string name_;
-  bool initialized_;
-  bool powered_;
-  DiscoveryStatus discovery_status_;
+  bool initialized_ = false;
+  bool powered_ = false;
+  DiscoveryStatus discovery_status_ = NOT_DISCOVERING;
   std::unordered_set<std::string> discovered_devices_;
 
   DiscoverySessionResultCallback discovery_changed_callback_;
@@ -149,7 +149,7 @@
   base::ThreadChecker thread_checker_;
 
   // Flag indicating a device update must be forced in DevicesPolled.
-  bool force_update_device_for_test_;
+  bool force_update_device_for_test_ = false;
 
   // NOTE: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
diff --git a/device/bluetooth/bluetooth_low_energy_win.cc b/device/bluetooth/bluetooth_low_energy_win.cc
index 7a54a228..fb640e4 100644
--- a/device/bluetooth/bluetooth_low_energy_win.cc
+++ b/device/bluetooth/bluetooth_low_energy_win.cc
@@ -5,6 +5,7 @@
 #include "device/bluetooth/bluetooth_low_energy_win.h"
 
 #include <memory>
+#include <string>
 #include <utility>
 
 #include "base/files/file.h"
@@ -14,7 +15,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
 #include "third_party/re2/src/re2/re2.h"
 
 namespace {
@@ -24,8 +24,6 @@
 using device::win::BluetoothLowEnergyDeviceInfo;
 using device::win::BluetoothLowEnergyServiceInfo;
 
-const char kPlatformNotSupported[] =
-    "Bluetooth Low energy is only supported on Windows 8 and later.";
 const char kDeviceEnumError[] = "Error enumerating Bluetooth LE devices.";
 const char kDeviceInfoError[] =
     "Error retrieving Bluetooth LE device information.";
@@ -619,8 +617,7 @@
       value_(std::move(value)),
       value_size_(value_size) {}
 
-DevicePropertyValue::~DevicePropertyValue() {
-}
+DevicePropertyValue::~DevicePropertyValue() = default;
 
 uint32_t DevicePropertyValue::AsUint32() const {
   CHECK_EQ(property_type_, static_cast<DEVPROPTYPE>(DEVPROP_TYPE_UINT32));
@@ -628,14 +625,11 @@
   return *reinterpret_cast<uint32_t*>(value_.get());
 }
 
-BluetoothLowEnergyServiceInfo::BluetoothLowEnergyServiceInfo() {
-}
+BluetoothLowEnergyServiceInfo::BluetoothLowEnergyServiceInfo() = default;
 
-BluetoothLowEnergyServiceInfo::~BluetoothLowEnergyServiceInfo() {
-}
+BluetoothLowEnergyServiceInfo::~BluetoothLowEnergyServiceInfo() = default;
 
-BluetoothLowEnergyDeviceInfo::BluetoothLowEnergyDeviceInfo()
-    : visible(false), authenticated(false), connected(false) {
+BluetoothLowEnergyDeviceInfo::BluetoothLowEnergyDeviceInfo() {
   address.ullLong = BLUETOOTH_NULL_ADDRESS;
 }
 
@@ -649,21 +643,12 @@
   return ExtractBluetoothAddressFromDeviceInstanceId(instance_id, btha, error);
 }
 
-BluetoothLowEnergyWrapper::BluetoothLowEnergyWrapper() {}
-BluetoothLowEnergyWrapper::~BluetoothLowEnergyWrapper() {}
-
-bool BluetoothLowEnergyWrapper::IsBluetoothLowEnergySupported() {
-  return base::win::GetVersion() >= base::win::Version::WIN8;
-}
+BluetoothLowEnergyWrapper::BluetoothLowEnergyWrapper() = default;
+BluetoothLowEnergyWrapper::~BluetoothLowEnergyWrapper() = default;
 
 bool BluetoothLowEnergyWrapper::EnumerateKnownBluetoothLowEnergyDevices(
     std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
     std::string* error) {
-  if (!IsBluetoothLowEnergySupported()) {
-    *error = kPlatformNotSupported;
-    return false;
-  }
-
   return EnumerateKnownBLEOrBLEGattServiceDevices(
       GUID_BLUETOOTHLE_DEVICE_INTERFACE, devices, error);
 }
@@ -672,11 +657,6 @@
     EnumerateKnownBluetoothLowEnergyGattServiceDevices(
         std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
         std::string* error) {
-  if (!IsBluetoothLowEnergySupported()) {
-    *error = kPlatformNotSupported;
-    return false;
-  }
-
   return EnumerateKnownBLEOrBLEGattServiceDevices(
       GUID_BLUETOOTH_GATT_SERVICE_DEVICE_INTERFACE, devices, error);
 }
@@ -685,11 +665,6 @@
     const base::FilePath& device_path,
     std::vector<std::unique_ptr<BluetoothLowEnergyServiceInfo>>* services,
     std::string* error) {
-  if (!IsBluetoothLowEnergySupported()) {
-    *error = kPlatformNotSupported;
-    return false;
-  }
-
   return CollectBluetoothLowEnergyDeviceServices(device_path, services, error);
 }
 
diff --git a/device/bluetooth/bluetooth_low_energy_win.h b/device/bluetooth/bluetooth_low_energy_win.h
index 74d9449..f9280a6 100644
--- a/device/bluetooth/bluetooth_low_energy_win.h
+++ b/device/bluetooth/bluetooth_low_energy_win.h
@@ -110,9 +110,9 @@
   std::string id;
   absl::optional<std::string> friendly_name;
   BLUETOOTH_ADDRESS address;
-  bool visible;
-  bool authenticated;
-  bool connected;
+  bool visible = false;
+  bool authenticated = false;
+  bool connected = false;
 };
 
 bool DEVICE_BLUETOOTH_EXPORT
@@ -128,9 +128,6 @@
   BluetoothLowEnergyWrapper();
   virtual ~BluetoothLowEnergyWrapper();
 
-  // Returns true only on Windows platforms supporting Bluetooth Low Energy.
-  virtual bool IsBluetoothLowEnergySupported();
-
   // Enumerates the list of known (i.e. already paired) Bluetooth LE devices on
   // this machine. In case of error, returns false and sets |error| with an
   // error message describing the problem.
diff --git a/device/bluetooth/bluetooth_low_energy_win_fake.cc b/device/bluetooth/bluetooth_low_energy_win_fake.cc
index b3b50e5..1ebdf30 100644
--- a/device/bluetooth/bluetooth_low_energy_win_fake.cc
+++ b/device/bluetooth/bluetooth_low_energy_win_fake.cc
@@ -5,18 +5,15 @@
 #include "device/bluetooth/bluetooth_low_energy_win_fake.h"
 
 #include <memory>
+#include <string>
+#include <utility>
+#include <vector>
 
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "device/bluetooth/bluetooth_low_energy_defs_win.h"
 
-namespace {
-const char kPlatformNotSupported[] =
-    "Bluetooth Low energy is only supported on Windows 8 and later.";
-}  // namespace
-
-namespace device {
-namespace win {
+namespace device::win {
 
 BLEDevice::BLEDevice() {}
 BLEDevice::~BLEDevice() {}
@@ -37,18 +34,9 @@
     : observer_(nullptr) {}
 BluetoothLowEnergyWrapperFake::~BluetoothLowEnergyWrapperFake() {}
 
-bool BluetoothLowEnergyWrapperFake::IsBluetoothLowEnergySupported() {
-  return true;
-}
-
 bool BluetoothLowEnergyWrapperFake::EnumerateKnownBluetoothLowEnergyDevices(
     std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
     std::string* error) {
-  if (!IsBluetoothLowEnergySupported()) {
-    *error = kPlatformNotSupported;
-    return false;
-  }
-
   for (auto& device : simulated_devices_) {
     if (device.second->marked_as_deleted)
       continue;
@@ -63,11 +51,6 @@
     EnumerateKnownBluetoothLowEnergyGattServiceDevices(
         std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
         std::string* error) {
-  if (!IsBluetoothLowEnergySupported()) {
-    *error = kPlatformNotSupported;
-    return false;
-  }
-
   for (auto& device : simulated_devices_) {
     for (auto& service : device.second->primary_services) {
       auto device_info = std::make_unique<BluetoothLowEnergyDeviceInfo>();
@@ -86,11 +69,6 @@
     const base::FilePath& device_path,
     std::vector<std::unique_ptr<BluetoothLowEnergyServiceInfo>>* services,
     std::string* error) {
-  if (!IsBluetoothLowEnergySupported()) {
-    *error = kPlatformNotSupported;
-    return false;
-  }
-
   std::wstring device_address =
       ExtractDeviceAddressFromDevicePath(device_path.value());
   std::vector<std::string> service_attribute_handles =
@@ -644,5 +622,4 @@
   return result;
 }
 
-}  // namespace win
-}  // namespace device
+}  // namespace device::win
diff --git a/device/bluetooth/bluetooth_low_energy_win_fake.h b/device/bluetooth/bluetooth_low_energy_win_fake.h
index ec515e5..072fa7a 100644
--- a/device/bluetooth/bluetooth_low_energy_win_fake.h
+++ b/device/bluetooth/bluetooth_low_energy_win_fake.h
@@ -103,7 +103,6 @@
   BluetoothLowEnergyWrapperFake();
   ~BluetoothLowEnergyWrapperFake() override;
 
-  bool IsBluetoothLowEnergySupported() override;
   bool EnumerateKnownBluetoothLowEnergyDevices(
       std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
       std::string* error) override;
diff --git a/device/bluetooth/bluetooth_task_manager_win.cc b/device/bluetooth/bluetooth_task_manager_win.cc
index 9c570e5..7f7e24b 100644
--- a/device/bluetooth/bluetooth_task_manager_win.cc
+++ b/device/bluetooth/bluetooth_task_manager_win.cc
@@ -562,10 +562,6 @@
 
 bool BluetoothTaskManagerWin::SearchLowEnergyDevices(
     std::vector<std::unique_ptr<DeviceState>>* device_list) {
-  if (!le_wrapper_->IsBluetoothLowEnergySupported()) {
-    return true;  // Bluetooth LE not supported is not an error.
-  }
-
   std::vector<std::unique_ptr<win::BluetoothLowEnergyDeviceInfo>> btle_devices;
   std::string error;
   bool success = le_wrapper_->EnumerateKnownBluetoothLowEnergyDevices(
@@ -722,10 +718,6 @@
 bool BluetoothTaskManagerWin::DiscoverLowEnergyDeviceServices(
     const base::FilePath& device_path,
     std::vector<std::unique_ptr<ServiceRecordState>>* service_record_states) {
-  if (!le_wrapper_->IsBluetoothLowEnergySupported()) {
-    return true;  // Bluetooth LE not supported is not an error.
-  }
-
   std::string error;
   std::vector<std::unique_ptr<win::BluetoothLowEnergyServiceInfo>> services;
   bool success = le_wrapper_->EnumerateKnownBluetoothLowEnergyServices(
diff --git a/device/bluetooth/test/bluetooth_test_win.cc b/device/bluetooth/test/bluetooth_test_win.cc
index 0614e5f..c206d18 100644
--- a/device/bluetooth/test/bluetooth_test_win.cc
+++ b/device/bluetooth/test/bluetooth_test_win.cc
@@ -55,10 +55,7 @@
 // Note: As UWP does not provide int specializations for IObservableVector and
 // VectorChangedEventHandler we need to supply our own. UUIDs were generated
 // using `uuidgen`.
-namespace ABI {
-namespace Windows {
-namespace Foundation {
-namespace Collections {
+namespace ABI::Windows::Foundation::Collections {
 
 template <>
 struct __declspec(uuid("2736c37e-4218-496f-a46a-92d5d9e610a9"))
@@ -68,10 +65,7 @@
 struct __declspec(uuid("94844fba-ddf9-475c-be6e-ebb87039cef6"))
     VectorChangedEventHandler<GUID> : VectorChangedEventHandler_impl<GUID> {};
 
-}  // namespace Collections
-}  // namespace Foundation
-}  // namespace Windows
-}  // namespace ABI
+}  // namespace ABI::Windows::Foundation::Collections
 
 namespace device {
 
@@ -262,8 +256,6 @@
 BluetoothTestWin::~BluetoothTestWin() {}
 
 bool BluetoothTestWin::PlatformSupportsLowEnergy() {
-  if (fake_bt_le_wrapper_)
-    return fake_bt_le_wrapper_->IsBluetoothLowEnergySupported();
   return true;
 }
 
@@ -693,9 +685,7 @@
   std::vector<base::test::FeatureRef> disabled;
   if (GetParam().new_ble_implementation_enabled) {
     enabled.push_back(kNewBLEWinImplementation);
-    if (base::win::GetVersion() >= base::win::Version::WIN10) {
-      scoped_winrt_initializer_.emplace();
-    }
+    scoped_winrt_initializer_.emplace();
   } else {
     disabled.push_back(kNewBLEWinImplementation);
   }
@@ -716,12 +706,6 @@
   notify_sessions_.clear();
 }
 
-bool BluetoothTestWinrt::PlatformSupportsLowEnergy() {
-  return UsesNewBleImplementation()
-             ? base::win::GetVersion() >= base::win::Version::WIN10
-             : BluetoothTestWin::PlatformSupportsLowEnergy();
-}
-
 bool BluetoothTestWinrt::UsesNewBleImplementation() const {
   return GetParam().new_ble_implementation_enabled;
 }
@@ -848,8 +832,9 @@
 
 BluetoothDevice* BluetoothTestWinrt::SimulateLowEnergyDevice(
     int device_ordinal) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateLowEnergyDevice(device_ordinal);
+  }
 
   LowEnergyDeviceData data = GetLowEnergyDeviceData(device_ordinal);
   static_cast<TestBluetoothAdapterWinrt*>(adapter_.get())
@@ -926,8 +911,9 @@
 }
 
 void BluetoothTestWinrt::SimulateGattConnection(BluetoothDevice* device) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattConnection(device);
+  }
 
   // Spin the message loop to make sure a device instance was obtained.
   base::RunLoop().RunUntilIdle();
@@ -948,8 +934,9 @@
 
 void BluetoothTestWinrt::SimulateGattNameChange(BluetoothDevice* device,
                                                 const std::string& new_name) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattNameChange(device, new_name);
+  }
 
   auto* const ble_device =
       static_cast<TestBluetoothDeviceWinrt*>(device)->ble_device();
@@ -959,8 +946,9 @@
 
 void BluetoothTestWinrt::SimulateStatusChangeToDisconnect(
     BluetoothDevice* device) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateStatusChangeToDisconnect(device);
+  }
   // Spin the message loop to make sure a device instance was obtained.
   base::RunLoop().RunUntilIdle();
   auto* const ble_device =
@@ -1012,9 +1000,10 @@
     BluetoothDevice* device,
     const std::vector<std::string>& uuids,
     const std::vector<std::string>& blocked_uuids) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattServicesDiscovered(device, uuids,
                                                             blocked_uuids);
+  }
 
   auto* const ble_device =
       static_cast<TestBluetoothDeviceWinrt*>(device)->ble_device();
@@ -1023,8 +1012,9 @@
 }
 
 void BluetoothTestWinrt::SimulateGattServicesChanged(BluetoothDevice* device) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattServicesChanged(device);
+  }
 
   auto* const ble_device =
       static_cast<TestBluetoothDeviceWinrt*>(device)->ble_device();
@@ -1034,8 +1024,9 @@
 
 void BluetoothTestWinrt::SimulateGattServiceRemoved(
     BluetoothRemoteGattService* service) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattServiceRemoved(service);
+  }
 
   auto* const ble_device =
       static_cast<TestBluetoothDeviceWinrt*>(service->GetDevice())
@@ -1046,8 +1037,9 @@
 
 void BluetoothTestWinrt::SimulateGattServicesDiscoveryError(
     BluetoothDevice* device) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattServicesDiscoveryError(device);
+  }
 
   auto* const ble_device =
       static_cast<TestBluetoothDeviceWinrt*>(device)->ble_device();
@@ -1059,9 +1051,10 @@
     BluetoothRemoteGattService* service,
     const std::string& uuid,
     int properties) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattCharacteristic(service, uuid,
                                                         properties);
+  }
 
   auto* const ble_device =
       static_cast<TestBluetoothDeviceWinrt*>(service->GetDevice())
@@ -1072,8 +1065,9 @@
 
 void BluetoothTestWinrt::SimulateGattNotifySessionStarted(
     BluetoothRemoteGattCharacteristic* characteristic) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattNotifySessionStarted(characteristic);
+  }
 
   static_cast<FakeGattCharacteristicWinrt*>(
       static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
@@ -1084,7 +1078,7 @@
 void BluetoothTestWinrt::SimulateGattNotifySessionStartError(
     BluetoothRemoteGattCharacteristic* characteristic,
     BluetoothGattService::GattErrorCode error_code) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy()) {
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattNotifySessionStartError(characteristic,
                                                                  error_code);
   }
@@ -1115,7 +1109,7 @@
 void BluetoothTestWinrt::SimulateGattCharacteristicChanged(
     BluetoothRemoteGattCharacteristic* characteristic,
     const std::vector<uint8_t>& value) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy()) {
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattCharacteristicChanged(characteristic,
                                                                value);
   }
@@ -1129,7 +1123,7 @@
 void BluetoothTestWinrt::SimulateGattCharacteristicRead(
     BluetoothRemoteGattCharacteristic* characteristic,
     const std::vector<uint8_t>& value) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy()) {
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattCharacteristicRead(characteristic,
                                                             value);
   }
@@ -1143,7 +1137,7 @@
 void BluetoothTestWinrt::SimulateGattCharacteristicReadError(
     BluetoothRemoteGattCharacteristic* characteristic,
     BluetoothGattService::GattErrorCode error_code) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy()) {
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattCharacteristicReadError(characteristic,
                                                                  error_code);
   }
@@ -1156,8 +1150,9 @@
 
 void BluetoothTestWinrt::SimulateGattCharacteristicWrite(
     BluetoothRemoteGattCharacteristic* characteristic) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattCharacteristicWrite(characteristic);
+  }
 
   static_cast<FakeGattCharacteristicWinrt*>(
       static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
@@ -1168,7 +1163,7 @@
 void BluetoothTestWinrt::SimulateGattCharacteristicWriteError(
     BluetoothRemoteGattCharacteristic* characteristic,
     BluetoothGattService::GattErrorCode error_code) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy()) {
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattCharacteristicWriteError(
         characteristic, error_code);
   }
@@ -1182,8 +1177,9 @@
 void BluetoothTestWinrt::SimulateGattDescriptor(
     BluetoothRemoteGattCharacteristic* characteristic,
     const std::string& uuid) {
-  if (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
+  if (!UsesNewBleImplementation()) {
     return BluetoothTestWin::SimulateGattDescriptor(characteristic, uuid);
+  }
 
   auto* const ble_device = static_cast<TestBluetoothDeviceWinrt*>(
                                characteristic->GetService()->GetDevice())
@@ -1228,9 +1224,8 @@
 }
 
 void BluetoothTestWinrt::DeleteDevice(BluetoothDevice* device) {
-  (!UsesNewBleImplementation() || !PlatformSupportsLowEnergy())
-      ? BluetoothTestWin::DeleteDevice(device)
-      : BluetoothTestBase::DeleteDevice(device);
+  (!UsesNewBleImplementation()) ? BluetoothTestWin::DeleteDevice(device)
+                                : BluetoothTestBase::DeleteDevice(device);
 }
 
 void BluetoothTestWinrt::OnFakeBluetoothDeviceConnectGattAttempt() {
diff --git a/device/bluetooth/test/bluetooth_test_win.h b/device/bluetooth/test/bluetooth_test_win.h
index 72f14b57..18b8649e 100644
--- a/device/bluetooth/test/bluetooth_test_win.h
+++ b/device/bluetooth/test/bluetooth_test_win.h
@@ -180,7 +180,6 @@
   void SimulateSpuriousRadioStateChangedEvent();
 
   // BluetoothTestBase:
-  bool PlatformSupportsLowEnergy() override;
   void InitWithDefaultAdapter() override;
   void InitWithoutDefaultAdapter() override;
   void InitWithFakeAdapter() override;
diff --git a/device/gamepad/gamepad_platform_data_fetcher.h b/device/gamepad/gamepad_platform_data_fetcher.h
index fc38188..45fd194 100644
--- a/device/gamepad/gamepad_platform_data_fetcher.h
+++ b/device/gamepad/gamepad_platform_data_fetcher.h
@@ -18,7 +18,6 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "device/gamepad/gamepad_platform_data_fetcher_android.h"
 #elif BUILDFLAG(IS_WIN)
-#include "base/win/windows_version.h"
 #include "device/gamepad/nintendo_data_fetcher.h"
 #include "device/gamepad/raw_input_data_fetcher_win.h"
 #include "device/gamepad/wgi_data_fetcher_win.h"
@@ -44,8 +43,7 @@
 
   // Windows.Gaming.Input is available in Windows 10.0.10240.0 and later.
   if (base::FeatureList::IsEnabled(
-          features::kEnableWindowsGamingInputDataFetcher) &&
-      base::win::GetVersion() >= base::win::Version::WIN10) {
+          features::kEnableWindowsGamingInputDataFetcher)) {
     manager->AddFactory(new WgiDataFetcherWin::Factory());
   } else {
     manager->AddFactory(new XInputDataFetcherWin::Factory());
diff --git a/device/gamepad/wgi_data_fetcher_win_unittest.cc b/device/gamepad/wgi_data_fetcher_win_unittest.cc
index 05106027..7049f87 100644
--- a/device/gamepad/wgi_data_fetcher_win_unittest.cc
+++ b/device/gamepad/wgi_data_fetcher_win_unittest.cc
@@ -23,7 +23,6 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "base/win/scoped_hstring.h"
-#include "base/win/windows_version.h"
 #include "device/gamepad/gamepad_id_list.h"
 #include "device/gamepad/gamepad_pad_state_provider.h"
 #include "device/gamepad/gamepad_provider.h"
@@ -159,13 +158,6 @@
   WgiDataFetcherWinTest() = default;
   ~WgiDataFetcherWinTest() override = default;
 
-  void SetUp() override {
-    // Windows.Gaming.Input is available in Windows 10.0.10240.0 and later.
-    if (base::win::GetVersion() < base::win::Version::WIN10)
-      GTEST_SKIP();
-    DeviceServiceTestBase::SetUp();
-  }
-
   void SetUpXInputEnv(WgiTestErrorCode error_code) {
     // Resetting MockXInputGetStateExFunc static variable state.
     MockXInputGetStateExFunc(XUSER_MAX_COUNT + 1, nullptr);
diff --git a/device/gamepad/xinput_data_fetcher_win.cc b/device/gamepad/xinput_data_fetcher_win.cc
index c8ffae86..2dfa993 100644
--- a/device/gamepad/xinput_data_fetcher_win.cc
+++ b/device/gamepad/xinput_data_fetcher_win.cc
@@ -7,13 +7,14 @@
 #include <stddef.h>
 #include <string.h>
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
-#include "base/win/windows_version.h"
 
 namespace device {
 
@@ -41,6 +42,9 @@
 // Bitmask for the Guide button in XInputGamepadEx.wButtons.
 static const int kXInputGamepadGuide = 0x0400;
 
+constexpr base::FilePath::CharType kXInputDllFileName[] =
+    FILE_PATH_LITERAL("xinput1_4.dll");
+
 float NormalizeXInputAxis(SHORT value) {
   return ((value + 32768.f) / 32767.5f) - 1.f;
 }
@@ -72,17 +76,6 @@
   }
 }
 
-const base::FilePath::CharType* XInputDllFileName() {
-  // Xinput.h defines filename (XINPUT_DLL) on different Windows versions, but
-  // Xinput.h specifies it in build time. Approach here uses the same values
-  // and it is resolving dll filename based on Windows version it is running on.
-  if (base::win::GetVersion() >= base::win::Version::WIN8) {
-    // For Windows 8+, XINPUT_DLL is xinput1_4.dll.
-    return FILE_PATH_LITERAL("xinput1_4.dll");
-  }
-  return FILE_PATH_LITERAL("xinput9_1_0.dll");
-}
-
 }  // namespace
 
 XInputDataFetcherWin::XInputDataFetcherWin() : xinput_available_(false) {}
@@ -99,7 +92,7 @@
 }
 
 void XInputDataFetcherWin::OnAddedToProvider() {
-  xinput_dll_ = base::ScopedNativeLibrary(base::FilePath(XInputDllFileName()));
+  xinput_dll_ = base::ScopedNativeLibrary(base::FilePath(kXInputDllFileName));
   xinput_available_ = GetXInputDllFunctions();
 }
 
@@ -409,7 +402,7 @@
 }
 
 void XInputDataFetcherWin::InitializeForWgiDataFetcher() {
-  xinput_dll_ = base::ScopedNativeLibrary(base::FilePath(XInputDllFileName()));
+  xinput_dll_ = base::ScopedNativeLibrary(base::FilePath(kXInputDllFileName));
   xinput_available_ = GetXInputDllFunctionsForWgiDataFetcher();
 }
 
diff --git a/docs/images/webui_build_cr_component.png b/docs/images/webui_build_cr_component.png
new file mode 100644
index 0000000..d9ee7f75
--- /dev/null
+++ b/docs/images/webui_build_cr_component.png
Binary files differ
diff --git a/docs/webui_build_configuration.md b/docs/webui_build_configuration.md
index bcde8f52..472df65e 100644
--- a/docs/webui_build_configuration.md
+++ b/docs/webui_build_configuration.md
@@ -597,6 +597,101 @@
 
 ```
 
+### **build_cr_component**
+
+The flow diagram below shows a high level view of how a typical modern
+cr_component is built
+
+![cr_component build pipeline flow diagram](images/webui_build_cr_component.png)
+
+```
+This umbrella rule captures the most common build pipeline
+configuration for building WebUI cr_components and aims to hide the complexity
+of having to define multiple other targets directly. Using build_cr_component()
+is the recommended approach for any code that resides under
+ui/webui/resources/cr_components/.
+
+Under the cover, build_cr_component() defines the following targets
+
+preprocess_if_expr("preprocess")
+html_to_wrapper("html_wrapper_files")
+css_to_wrapper("css_wrapper_files")
+copy("copy_mojo")
+ts_library("build_ts")
+generate_grd("build_grd")
+
+Some targets are only conditionally defined based on build_cr_component() input
+parameters.
+
+Only the ":build_ts" and ":generate_grd" targets are public and can be referred
+to from other parts of the build.
+```
+
+#### **Arguments**
+```
+
+List of files params:
+static_files: Same as build_webui()
+web_component_files: Same as build_webui()
+non_web_component_files: Same as build_webui()
+icons_html_files: Same as build_webui()
+css_files: Same as build_webui()
+mojo_files: Same as build_webui()
+mojo_files_deps: Same as build_webui()
+
+TypeScript (ts_library()) related params:
+tsc_dir: See |output_dir| in ts_library()
+ts_definitions: Same as build_webui()
+ts_deps: Same as build_webui()
+ts_extra_deps: Same as build_webui()
+ts_path_mappings: Same as build_webui()
+ts_use_local_config: Same as build_webui()
+
+Other params:
+grd_prefix: See |grd_prefix| in generate_grd(). Required parameter.
+resource_path_prefix: See |resource_path_prefix| in generate_grd(). Required
+                      parameter.
+optimize: Optional parameter, defaults to false. If specified it is passed as
+          the |minify| parameter to the underlying html_to_wrapper() and
+          css_to_wrapper() targets.
+```
+
+#### **Example**
+```
+import("//ui/webui/resources/cr_components/build_cr_component.gni")
+
+build_cr_component("build") {
+  grd_prefix = "cr_components_history_clusters"
+
+  web_component_files = [
+    "cluster.ts",
+    "url_visit.ts",
+  ]
+
+  non_web_component_files = [
+    "browser_proxy.ts",
+    "utils.ts",
+  ]
+
+  css_files = [
+    "shared_vars.css",
+  ]
+
+  mojo_files_deps = [ ":mojo_bindings_ts__generator" ]
+  mojo_files = [ "$root_gen_dir/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom-webui.ts" ]
+
+  tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/history_clusters"
+  ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
+  ts_deps = [
+    "//third_party/polymer/v3_0:library",
+    "//ui/webui/resources:library",
+    "//ui/webui/resources/mojo:library",
+  ]
+
+  optimize = optimize_webui
+}
+```
+
 ## Example build configurations
 
 ### **Simple UI with no web components**
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index ef9ce47..3e5de9b 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -603,7 +603,6 @@
     "//extensions/browser/updater:keepalive",
     "//extensions/buildflags",
     "//extensions/common",
-    "//extensions/common:mojom",
     "//extensions/common/api",
     "//extensions/strings",
     "//google_apis",
@@ -638,7 +637,9 @@
     "//extensions/browser/api/declarative_net_request/flat:extension_ruleset",
     "//extensions/browser/install",
     "//extensions/browser/kiosk",
+    "//extensions/common:mojom",
     "//ipc",
+    "//mojo/public/cpp/bindings",
     "//services/device/public/cpp/usb:usb",
     "//third_party/re2",
   ]
diff --git a/extensions/browser/extensions_browser_client.cc b/extensions/browser/extensions_browser_client.cc
index 2600965..8c58a95 100644
--- a/extensions/browser/extensions_browser_client.cc
+++ b/extensions/browser/extensions_browser_client.cc
@@ -174,4 +174,27 @@
     const PermissionSet& desired_permissions,
     PermissionSet* granted_permissions) const {}
 
+void ExtensionsBrowserClient::AddAPIActionToActivityLog(
+    content::BrowserContext* browser_context,
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {}
+
+void ExtensionsBrowserClient::AddEventToActivityLog(
+    content::BrowserContext* context,
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {}
+
+void ExtensionsBrowserClient::AddDOMActionToActivityLog(
+    content::BrowserContext* browser_context,
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const GURL& url,
+    const std::u16string& url_title,
+    int call_type) {}
+
 }  // namespace extensions
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index 028d6b1f..55d5420 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -473,6 +473,26 @@
       const PermissionSet& desired_permissions,
       PermissionSet* granted_permissions) const;
 
+  virtual void AddAPIActionToActivityLog(
+      content::BrowserContext* browser_context,
+      const ExtensionId& extension_id,
+      const std::string& call_name,
+      base::Value::List args,
+      const std::string& extra);
+  virtual void AddEventToActivityLog(content::BrowserContext* context,
+                                     const ExtensionId& extension_id,
+                                     const std::string& call_name,
+                                     base::Value::List args,
+                                     const std::string& extra);
+  virtual void AddDOMActionToActivityLog(
+      content::BrowserContext* browser_context,
+      const ExtensionId& extension_id,
+      const std::string& call_name,
+      base::Value::List args,
+      const GURL& url,
+      const std::u16string& url_title,
+      int call_type);
+
  private:
   std::vector<std::unique_ptr<ExtensionsBrowserAPIProvider>> providers_;
 };
diff --git a/extensions/browser/renderer_startup_helper.cc b/extensions/browser/renderer_startup_helper.cc
index c39f195..612fd570 100644
--- a/extensions/browser/renderer_startup_helper.cc
+++ b/extensions/browser/renderer_startup_helper.cc
@@ -4,6 +4,7 @@
 
 #include "extensions/browser/renderer_startup_helper.h"
 
+#include <string>
 #include <utility>
 #include <vector>
 
@@ -37,12 +38,12 @@
 #include "ui/base/webui/web_ui_util.h"
 #include "url/origin.h"
 
-using content::BrowserContext;
-
 namespace extensions {
 
 namespace {
 
+using ::content::BrowserContext;
+
 // Returns the current ActivationSequence of |extension| if the extension is
 // Service Worker-based, otherwise returns absl::nullopt.
 absl::optional<ActivationSequence> GetWorkerActivationSequence(
@@ -86,6 +87,7 @@
       GetWorkerActivationSequence(browser_context, extension),
       extension.creation_flags(), extension.guid());
 }
+
 }  // namespace
 
 RendererStartupHelper::RendererStartupHelper(BrowserContext* browser_context)
@@ -355,6 +357,79 @@
     return nullptr;
   return it->second.get();
 }
+
+BrowserContext* RendererStartupHelper::GetRendererBrowserContext() {
+  // `browser_context_` is redirected to remove incognito mode. This method
+  // returns the original browser context associated with the renderer.
+  auto* host = content::RenderProcessHost::FromID(receivers_.current_context());
+  if (!host) {
+    return nullptr;
+  }
+
+  return host->GetBrowserContext();
+}
+
+void RendererStartupHelper::AddAPIActionToActivityLog(
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {
+  auto* browser_context = GetRendererBrowserContext();
+  if (!browser_context) {
+    return;
+  }
+
+  ExtensionsBrowserClient::Get()->AddAPIActionToActivityLog(
+      browser_context, extension_id, call_name, std::move(args), extra);
+}
+
+void RendererStartupHelper::AddEventToActivityLog(
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const std::string& extra) {
+  auto* browser_context = GetRendererBrowserContext();
+  if (!browser_context) {
+    return;
+  }
+
+  ExtensionsBrowserClient::Get()->AddEventToActivityLog(
+      browser_context, extension_id, call_name, std::move(args), extra);
+}
+
+void RendererStartupHelper::AddDOMActionToActivityLog(
+    const ExtensionId& extension_id,
+    const std::string& call_name,
+    base::Value::List args,
+    const GURL& url,
+    const std::u16string& url_title,
+    int32_t call_type) {
+  auto* browser_context = GetRendererBrowserContext();
+  if (!browser_context) {
+    return;
+  }
+
+  ExtensionsBrowserClient::Get()->AddDOMActionToActivityLog(
+      browser_context, extension_id, call_name, std::move(args), url, url_title,
+      call_type);
+}
+
+// static
+void RendererStartupHelper::BindForRenderer(
+    int process_id,
+    mojo::PendingAssociatedReceiver<mojom::RendererHost> receiver) {
+  auto* host = content::RenderProcessHost::FromID(process_id);
+  if (!host) {
+    return;
+  }
+
+  auto* renderer_startup_helper =
+      RendererStartupHelperFactory::GetForBrowserContext(
+          host->GetBrowserContext());
+  renderer_startup_helper->receivers_.Add(renderer_startup_helper,
+                                          std::move(receiver), process_id);
+}
+
 //////////////////////////////////////////////////////////////////////////////
 
 // static
@@ -379,7 +454,7 @@
 RendererStartupHelperFactory::~RendererStartupHelperFactory() {}
 
 KeyedService* RendererStartupHelperFactory::BuildServiceInstanceFor(
-    content::BrowserContext* context) const {
+    BrowserContext* context) const {
   return new RendererStartupHelper(context);
 }
 
diff --git a/extensions/browser/renderer_startup_helper.h b/extensions/browser/renderer_startup_helper.h
index c49c764..6452164f 100644
--- a/extensions/browser/renderer_startup_helper.h
+++ b/extensions/browser/renderer_startup_helper.h
@@ -17,13 +17,16 @@
 #include "content/public/browser/render_process_host_observer.h"
 #include "extensions/common/extension_id.h"
 #include "extensions/common/mojom/renderer.mojom.h"
+#include "extensions/common/mojom/renderer_host.mojom.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 
 namespace content {
 class BrowserContext;
 class RenderProcessHost;
-}
+}  // namespace content
 
 namespace extensions {
 class Extension;
@@ -39,7 +42,8 @@
 // behavior of this class.
 class RendererStartupHelper : public KeyedService,
                               public content::RenderProcessHostCreationObserver,
-                              public content::RenderProcessHostObserver {
+                              public content::RenderProcessHostObserver,
+                              public mojom::RendererHost {
  public:
   // This class sends messages to all renderers started for |browser_context|.
   explicit RendererStartupHelper(content::BrowserContext* browser_context);
@@ -59,6 +63,22 @@
       const content::ChildProcessTerminationInfo& info) override;
   void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
 
+  // mojom::RendererHost:
+  void AddAPIActionToActivityLog(const ExtensionId& extension_id,
+                                 const std::string& call_name,
+                                 base::Value::List args,
+                                 const std::string& extra) override;
+  void AddEventToActivityLog(const ExtensionId& extension_id,
+                             const std::string& call_name,
+                             base::Value::List args,
+                             const std::string& extra) override;
+  void AddDOMActionToActivityLog(const ExtensionId& extension_id,
+                                 const std::string& call_name,
+                                 base::Value::List args,
+                                 const GURL& url,
+                                 const std::u16string& url_title,
+                                 int32_t call_type) override;
+
   // Sends a message to the specified |process| activating the given extension
   // once the process is initialized. OnExtensionLoaded should have already been
   // called for the extension.
@@ -84,6 +104,10 @@
   // pass a valid content::RenderProcessHost*.
   mojom::Renderer* GetRenderer(content::RenderProcessHost* process);
 
+  static void BindForRenderer(
+      int process_id,
+      mojo::PendingAssociatedReceiver<mojom::RendererHost> receiver);
+
  protected:
   // Provide ability for tests to override.
   virtual mojo::PendingAssociatedRemote<mojom::Renderer> BindNewRendererRemote(
@@ -100,6 +124,10 @@
   // Untracks the given process.
   void UntrackProcess(content::RenderProcessHost* process);
 
+  // Return the browser context associated with the renderer.
+  content::BrowserContext* GetRendererBrowserContext();
+
+  // TODO(hferreiro): can be nullptr as in ChromeExtensionMessageFilter?
   raw_ptr<content::BrowserContext> browser_context_;  // Not owned.
 
   // Tracks the set of loaded extensions and the processes they are loaded in.
@@ -119,6 +147,9 @@
   // happens.
   std::map<content::RenderProcessHost*, mojo::AssociatedRemote<mojom::Renderer>>
       process_mojo_map_;
+
+  // Associate each renderer with the RenderProcessHost id.
+  mojo::AssociatedReceiverSet<mojom::RendererHost, int> receivers_;
 };
 
 // Factory for RendererStartupHelpers. Declared here because this header is
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn
index 96b760e..09181e8 100644
--- a/extensions/common/BUILD.gn
+++ b/extensions/common/BUILD.gn
@@ -89,6 +89,7 @@
     "mojom/manifest.mojom",
     "mojom/permission_set.mojom",
     "mojom/renderer.mojom",
+    "mojom/renderer_host.mojom",
     "mojom/run_location.mojom",
     "mojom/stack_frame.mojom",
     "mojom/url_pattern_set.mojom",
diff --git a/extensions/common/mojom/renderer_host.mojom b/extensions/common/mojom/renderer_host.mojom
new file mode 100644
index 0000000..ac52732
--- /dev/null
+++ b/extensions/common/mojom/renderer_host.mojom
@@ -0,0 +1,36 @@
+// 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.
+
+module extensions.mojom;
+
+import "mojo/public/mojom/base/values.mojom";
+import "mojo/public/mojom/base/string16.mojom";
+import "url/mojom/url.mojom";
+
+// Channel-associated interface implemented by the browser process. It should be
+// used for implementing renderer-to-browser messages which need to retain FIFO
+// with respect to other mojo interfaces like content.mojom.RendererHost.
+interface RendererHost {
+  // Log an API action to the extension activity log.
+  // `extra` holds extra logging information.
+  AddAPIActionToActivityLog(string extension_id,
+                            string call_name,
+                            mojo_base.mojom.ListValue args,
+                            string extra);
+
+  // Log an event to the extension activity log.
+  // `extra` holds extra logging information.
+  AddEventToActivityLog(string extension_id,
+                        string call_name,
+                        mojo_base.mojom.ListValue args,
+                        string extra);
+
+  // Log a DOM action to the extension activity log.
+  AddDOMActionToActivityLog(string extension_id,
+                            string call_name,
+                            mojo_base.mojom.ListValue args,
+                            url.mojom.Url url,
+                            mojo_base.mojom.String16 url_title,
+                            int32 call_type);
+};
diff --git a/extensions/renderer/api_activity_logger.cc b/extensions/renderer/api_activity_logger.cc
index aa703c8..3cc1dc1 100644
--- a/extensions/renderer/api_activity_logger.cc
+++ b/extensions/renderer/api_activity_logger.cc
@@ -7,11 +7,10 @@
 #include <stddef.h>
 
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
-#include "content/public/renderer/render_thread.h"
 #include "content/public/renderer/v8_value_converter.h"
-#include "extensions/common/extension_messages.h"
 #include "extensions/renderer/activity_log_converter_strategy.h"
 #include "extensions/renderer/dispatcher.h"
 #include "extensions/renderer/extensions_renderer_client.h"
@@ -27,6 +26,7 @@
 namespace extensions {
 
 namespace {
+
 bool g_log_for_testing = false;
 
 ScriptContext* GetContextByV8Context(v8::Local<v8::Context> context) {
@@ -98,9 +98,10 @@
         base::Value::FromUniquePtrValue(std::move(converted_arg)));
   }
 
-  LogInternal(ipc_sender, IPCMessageSender::ActivityLogCallType::APICALL,
-              script_context->GetExtensionID(), call_name,
-              std::move(value_args), std::string());
+  ipc_sender->SendActivityLogIPC(script_context->GetExtensionID(),
+                                 IPCMessageSender::ActivityLogCallType::APICALL,
+                                 call_name, std::move(value_args),
+                                 /*extra=*/std::string());
 }
 
 void APIActivityLogger::LogEvent(IPCMessageSender* ipc_sender,
@@ -110,9 +111,10 @@
   if (!IsLoggingEnabled())
     return;
 
-  LogInternal(ipc_sender, IPCMessageSender::ActivityLogCallType::EVENT,
-              script_context->GetExtensionID(), event_name,
-              std::move(arguments), std::string());
+  ipc_sender->SendActivityLogIPC(script_context->GetExtensionID(),
+                                 IPCMessageSender::ActivityLogCallType::EVENT,
+                                 event_name, std::move(arguments),
+                                 /*extra=*/std::string());
 }
 
 void APIActivityLogger::set_log_for_testing(bool log) {
@@ -164,24 +166,8 @@
     }
   }
 
-  LogInternal(ipc_sender_, call_type, extension_id, call_name,
-              std::move(arguments), extra);
-}
-
-// static
-void APIActivityLogger::LogInternal(
-    IPCMessageSender* ipc_sender,
-    const IPCMessageSender::ActivityLogCallType call_type,
-    const std::string& extension_id,
-    const std::string& call_name,
-    base::Value::List arguments,
-    const std::string& extra) {
-  DCHECK(IsLoggingEnabled());
-  ExtensionHostMsg_APIActionOrEvent_Params params;
-  params.api_call = call_name;
-  params.arguments = std::move(arguments);
-  params.extra = extra;
-  ipc_sender->SendActivityLogIPC(extension_id, call_type, params);
+  ipc_sender_->SendActivityLogIPC(extension_id, call_type, call_name,
+                                  std::move(arguments), extra);
 }
 
 }  // namespace extensions
diff --git a/extensions/renderer/api_activity_logger.h b/extensions/renderer/api_activity_logger.h
index f6f4ff7..5f029fe 100644
--- a/extensions/renderer/api_activity_logger.h
+++ b/extensions/renderer/api_activity_logger.h
@@ -60,14 +60,6 @@
   void LogForJS(const IPCMessageSender::ActivityLogCallType call_type,
                 const v8::FunctionCallbackInfo<v8::Value>& args);
 
-  // Common implementation method for sending a logging IPC.
-  static void LogInternal(IPCMessageSender* ipc_sender,
-                          const IPCMessageSender::ActivityLogCallType call_type,
-                          const std::string& extension_id,
-                          const std::string& call_name,
-                          base::Value::List arguments,
-                          const std::string& extra);
-
   // Not owned by |this|.
   // This is owned by NativeExtensionBindingsSystem.
   //
diff --git a/extensions/renderer/api_activity_logger_unittest.cc b/extensions/renderer/api_activity_logger_unittest.cc
index c9d3b08..3b399a49 100644
--- a/extensions/renderer/api_activity_logger_unittest.cc
+++ b/extensions/renderer/api_activity_logger_unittest.cc
@@ -4,12 +4,16 @@
 
 #include "extensions/renderer/api_activity_logger.h"
 
+#include <string>
+
 #include "base/run_loop.h"
+#include "base/values.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/extension_messages.h"
 #include "extensions/common/features/feature.h"
 #include "extensions/renderer/bindings/api_binding_test.h"
 #include "extensions/renderer/bindings/api_binding_test_util.h"
+#include "extensions/renderer/ipc_message_sender.h"
 #include "extensions/renderer/native_extension_bindings_system_test_base.h"
 #include "extensions/renderer/script_context.h"
 #include "extensions/renderer/script_context_set.h"
@@ -63,12 +67,13 @@
       std::make_unique<testing::StrictMock<TestIPCMessageSender>>();
   EXPECT_CALL(*ipc_sender,
               SendActivityLogIPC(extension->id(), ActivityLogCallType::APICALL,
-                                 testing::_))
-      .WillOnce([&](const ExtensionId& extension_id, const ActivityLogCallType,
-                    const ExtensionHostMsg_APIActionOrEvent_Params& params) {
-        EXPECT_EQ("someApiMethod", params.api_call);
-        ASSERT_EQ(1u, params.arguments.size());
-        EXPECT_EQ(base::Value::Type::NONE, params.arguments[0].type());
+                                 testing::_, testing::_, testing::_))
+      .WillOnce([&](const ExtensionId& extension_id,
+                    ActivityLogCallType call_type, const std::string& call_name,
+                    base::Value::List args, const std::string& extra) {
+        EXPECT_EQ("someApiMethod", call_name);
+        ASSERT_EQ(1u, args.size());
+        EXPECT_EQ(base::Value::Type::NONE, args[0].type());
       });
 
   APIActivityLogger::LogAPICall(ipc_sender.get(), context, "someApiMethod",
diff --git a/extensions/renderer/dom_activity_logger.cc b/extensions/renderer/dom_activity_logger.cc
index 67035b5..99088b8 100644
--- a/extensions/renderer/dom_activity_logger.cc
+++ b/extensions/renderer/dom_activity_logger.cc
@@ -10,8 +10,8 @@
 #include "content/public/renderer/render_thread.h"
 #include "content/public/renderer/v8_value_converter.h"
 #include "extensions/common/dom_action_types.h"
-#include "extensions/common/extension_messages.h"
 #include "extensions/renderer/activity_log_converter_strategy.h"
+#include "ipc/ipc_sync_channel.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_url.h"
 #include "v8/include/v8-isolate.h"
@@ -43,10 +43,9 @@
 }  // namespace
 
 DOMActivityLogger::DOMActivityLogger(const std::string& extension_id)
-    : extension_id_(extension_id) {
-}
+    : extension_id_(extension_id) {}
 
-DOMActivityLogger::~DOMActivityLogger() {}
+DOMActivityLogger::~DOMActivityLogger() = default;
 
 void DOMActivityLogger::AttachToWorld(int32_t world_id,
                                       const std::string& extension_id) {
@@ -63,8 +62,9 @@
 void DOMActivityLogger::LogGetter(const WebString& api_name,
                                   const WebURL& url,
                                   const WebString& title) {
-  SendDomActionMessage(api_name.Utf8(), url, title.Utf16(),
-                       DomActionType::GETTER, base::Value::List());
+  GetRendererHost()->AddDOMActionToActivityLog(
+      extension_id_, api_name.Utf8(), base::Value::List(), url, title.Utf16(),
+      DomActionType::GETTER);
 }
 
 void DOMActivityLogger::LogSetter(const WebString& api_name,
@@ -84,8 +84,9 @@
   AppendV8Value(api_name_utf8, new_value, args);
   if (!old_value.IsEmpty())
     AppendV8Value(api_name_utf8, old_value, args);
-  SendDomActionMessage(api_name_utf8, url, title.Utf16(), DomActionType::SETTER,
-                       std::move(args));
+  GetRendererHost()->AddDOMActionToActivityLog(
+      extension_id_, api_name_utf8, std::move(args), url, title.Utf16(),
+      DomActionType::SETTER);
 }
 
 void DOMActivityLogger::LogMethod(const WebString& api_name,
@@ -97,8 +98,9 @@
   std::string api_name_utf8 = api_name.Utf8();
   for (int i = 0; i < argc; ++i)
     AppendV8Value(api_name_utf8, argv[i], args);
-  SendDomActionMessage(api_name_utf8, url, title.Utf16(), DomActionType::METHOD,
-                       std::move(args));
+  GetRendererHost()->AddDOMActionToActivityLog(
+      extension_id_, api_name_utf8, std::move(args), url, title.Utf16(),
+      DomActionType::METHOD);
 }
 
 void DOMActivityLogger::LogEvent(const WebString& event_name,
@@ -110,23 +112,17 @@
   std::string event_name_utf8 = event_name.Utf8();
   for (int i = 0; i < argc; ++i)
     args.Append(argv[i].Utf8());
-  SendDomActionMessage(event_name_utf8, url, title.Utf16(),
-                       DomActionType::METHOD, std::move(args));
+  GetRendererHost()->AddDOMActionToActivityLog(
+      extension_id_, event_name_utf8, std::move(args), url, title.Utf16(),
+      DomActionType::METHOD);
 }
 
-void DOMActivityLogger::SendDomActionMessage(const std::string& api_call,
-                                             const GURL& url,
-                                             const std::u16string& url_title,
-                                             DomActionType::Type call_type,
-                                             base::Value::List args) {
-  ExtensionHostMsg_DOMAction_Params params;
-  params.api_call = api_call;
-  params.url = url;
-  params.url_title = url_title;
-  params.call_type = call_type;
-  params.arguments = std::move(args);
-  content::RenderThread::Get()->Send(
-      new ExtensionHostMsg_AddDOMActionToActivityLog(extension_id_, params));
+mojom::RendererHost* DOMActivityLogger::GetRendererHost() {
+  if (!renderer_host_.is_bound()) {
+    content::RenderThread::Get()->GetChannel()->GetRemoteAssociatedInterface(
+        &renderer_host_);
+  }
+  return renderer_host_.get();
 }
 
 }  // namespace extensions
diff --git a/extensions/renderer/dom_activity_logger.h b/extensions/renderer/dom_activity_logger.h
index f53b089..a8b9072e 100644
--- a/extensions/renderer/dom_activity_logger.h
+++ b/extensions/renderer/dom_activity_logger.h
@@ -10,6 +10,8 @@
 
 #include "base/values.h"
 #include "extensions/common/dom_action_types.h"
+#include "extensions/common/mojom/renderer_host.mojom.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "third_party/blink/public/web/web_dom_activity_logger.h"
 #include "v8/include/v8-forward.h"
 
@@ -67,15 +69,12 @@
                 const blink::WebURL& url,
                 const blink::WebString& title) override;
 
-  // Helper function to actually send the message across IPC.
-  void SendDomActionMessage(const std::string& api_call,
-                            const GURL& url,
-                            const std::u16string& url_title,
-                            DomActionType::Type call_type,
-                            base::Value::List args);
+  mojom::RendererHost* GetRendererHost();
 
   // The id of the extension with which this logger is associated.
   std::string extension_id_;
+
+  mojo::AssociatedRemote<mojom::RendererHost> renderer_host_;
 };
 
 }  // namespace extensions
diff --git a/extensions/renderer/ipc_message_sender.cc b/extensions/renderer/ipc_message_sender.cc
index dde39ee37..2c4ae03 100644
--- a/extensions/renderer/ipc_message_sender.cc
+++ b/extensions/renderer/ipc_message_sender.cc
@@ -5,6 +5,7 @@
 #include "extensions/renderer/ipc_message_sender.h"
 
 #include <map>
+#include <utility>
 
 #include "base/guid.h"
 #include "base/memory/weak_ptr.h"
@@ -18,6 +19,7 @@
 #include "extensions/common/features/feature.h"
 #include "extensions/common/mojom/event_router.mojom.h"
 #include "extensions/common/mojom/frame.mojom.h"
+#include "extensions/common/mojom/renderer_host.mojom.h"
 #include "extensions/common/trace_util.h"
 #include "extensions/renderer/api/messaging/message_target.h"
 #include "extensions/renderer/dispatcher.h"
@@ -205,18 +207,19 @@
         PortContext::ForFrame(routing_id), port_id));
   }
 
-  void SendActivityLogIPC(
-      const ExtensionId& extension_id,
-      ActivityLogCallType call_type,
-      const ExtensionHostMsg_APIActionOrEvent_Params& params) override {
+  void SendActivityLogIPC(const ExtensionId& extension_id,
+                          ActivityLogCallType call_type,
+                          const std::string& call_name,
+                          base::Value::List args,
+                          const std::string& extra) override {
     switch (call_type) {
       case ActivityLogCallType::APICALL:
-        render_thread_->Send(new ExtensionHostMsg_AddAPIActionToActivityLog(
-            extension_id, params));
+        GetRendererHost()->AddAPIActionToActivityLog(extension_id, call_name,
+                                                     std::move(args), extra);
         break;
       case ActivityLogCallType::EVENT:
-        render_thread_->Send(
-            new ExtensionHostMsg_AddEventToActivityLog(extension_id, params));
+        GetRendererHost()->AddEventToActivityLog(extension_id, call_name,
+                                                 std::move(args), extra);
         break;
     }
   }
@@ -242,8 +245,17 @@
     return event_router_remote_.get();
   }
 
+  mojom::RendererHost* GetRendererHost() {
+    if (!renderer_host_.is_bound()) {
+      render_thread_->GetChannel()->GetRemoteAssociatedInterface(
+          &renderer_host_);
+    }
+    return renderer_host_.get();
+  }
+
   content::RenderThread* const render_thread_;
   mojo::AssociatedRemote<mojom::EventRouter> event_router_remote_;
+  mojo::AssociatedRemote<mojom::RendererHost> renderer_host_;
 
   base::WeakPtrFactory<MainThreadIPCMessageSender> weak_ptr_factory_{this};
 };
@@ -435,10 +447,15 @@
         PortContextForCurrentWorker(), port_id));
   }
 
-  void SendActivityLogIPC(
-      const ExtensionId& extension_id,
-      ActivityLogCallType call_type,
-      const ExtensionHostMsg_APIActionOrEvent_Params& params) override {
+  void SendActivityLogIPC(const ExtensionId& extension_id,
+                          ActivityLogCallType call_type,
+                          const std::string& call_name,
+                          base::Value::List args,
+                          const std::string& extra) override {
+    ExtensionHostMsg_APIActionOrEvent_Params params;
+    params.api_call = call_name;
+    params.arguments = std::move(args);
+    params.extra = extra;
     switch (call_type) {
       case ActivityLogCallType::APICALL:
         dispatcher_->Send(new ExtensionHostMsg_AddAPIActionToActivityLog(
@@ -473,7 +490,8 @@
 
 }  // namespace
 
-IPCMessageSender::IPCMessageSender() {}
+IPCMessageSender::IPCMessageSender() = default;
+
 IPCMessageSender::~IPCMessageSender() = default;
 
 // static
diff --git a/extensions/renderer/ipc_message_sender.h b/extensions/renderer/ipc_message_sender.h
index aead625c4..7a65a2f8 100644
--- a/extensions/renderer/ipc_message_sender.h
+++ b/extensions/renderer/ipc_message_sender.h
@@ -13,9 +13,8 @@
 #include "extensions/common/mojom/frame.mojom-forward.h"
 #include "extensions/renderer/bindings/api_binding_types.h"
 
-struct ExtensionHostMsg_APIActionOrEvent_Params;
-
 namespace extensions {
+
 class ScriptContext;
 class WorkerThreadDispatcher;
 struct Message;
@@ -90,10 +89,11 @@
                                           const PortId& port_id) = 0;
 
   // Sends activityLog IPC to the browser process.
-  virtual void SendActivityLogIPC(
-      const ExtensionId& extension_id,
-      ActivityLogCallType call_type,
-      const ExtensionHostMsg_APIActionOrEvent_Params& params) = 0;
+  virtual void SendActivityLogIPC(const ExtensionId& extension_id,
+                                  ActivityLogCallType call_type,
+                                  const std::string& call_name,
+                                  base::Value::List args,
+                                  const std::string& extra) = 0;
 
   // Creates an IPCMessageSender for use on the main thread.
   static std::unique_ptr<IPCMessageSender> CreateMainThreadIPCMessageSender();
diff --git a/extensions/renderer/native_extension_bindings_system_test_base.h b/extensions/renderer/native_extension_bindings_system_test_base.h
index ea02577..dec8246 100644
--- a/extensions/renderer/native_extension_bindings_system_test_base.h
+++ b/extensions/renderer/native_extension_bindings_system_test_base.h
@@ -25,8 +25,6 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "v8/include/v8-forward.h"
 
-struct ExtensionHostMsg_APIActionOrEvent_Params;
-
 namespace content {
 class MockRenderThread;
 }
@@ -36,6 +34,7 @@
 }
 
 namespace extensions {
+
 class NativeExtensionBindingsSystem;
 class ScriptContext;
 class ScriptContextSet;
@@ -92,10 +91,12 @@
                void(const PortId& port_id, const Message& message));
   MOCK_METHOD2(SendMessageResponsePending,
                void(int routing_id, const PortId& port_id));
-  MOCK_METHOD3(SendActivityLogIPC,
+  MOCK_METHOD5(SendActivityLogIPC,
                void(const ExtensionId& extension_id,
                     IPCMessageSender::ActivityLogCallType call_type,
-                    const ExtensionHostMsg_APIActionOrEvent_Params& params));
+                    const std::string& call_name,
+                    base::Value::List args,
+                    const std::string& extra));
 
   const mojom::RequestParams* last_params() const { return last_params_.get(); }
 
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index ce8c490..d55e230 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -42,6 +42,7 @@
     "//components/feedback",
     "//components/feedback/content:factory",
     "//components/guest_view/browser",
+    "//components/guest_view/common:mojom",
     "//components/guest_view/renderer",
     "//components/keep_alive_registry",
     "//components/keyed_service/content:content",
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc
index f885d2f..4ffa5e8 100644
--- a/extensions/shell/browser/shell_content_browser_client.cc
+++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -9,6 +9,8 @@
 #include <utility>
 
 #include "base/command_line.h"
+#include "base/functional/bind.h"
+#include "components/guest_view/common/guest_view.mojom.h"
 #include "components/nacl/common/buildflags.h"
 #include "content/public/browser/browser_main_runner.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -36,9 +38,13 @@
 #include "extensions/browser/guest_view/extensions_guest_view.h"
 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
 #include "extensions/browser/process_map.h"
+#include "extensions/browser/renderer_startup_helper.h"
 #include "extensions/browser/url_loader_factory_manager.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/mojom/event_router.mojom.h"
+#include "extensions/common/mojom/guest_view.mojom.h"
+#include "extensions/common/mojom/renderer_host.mojom.h"
 #include "extensions/common/switches.h"
 #include "extensions/shell/browser/shell_browser_context.h"
 #include "extensions/shell/browser/shell_browser_main_parts.h"
@@ -233,9 +239,10 @@
   associated_registry->AddInterface<guest_view::mojom::GuestViewHost>(
       base::BindRepeating(&ExtensionsGuestView::CreateForComponents,
                           render_process_host->GetID()));
-  associated_registry->AddInterface<extensions::mojom::GuestView>(
-      base::BindRepeating(&ExtensionsGuestView::CreateForExtensions,
-                          render_process_host->GetID()));
+  associated_registry->AddInterface<mojom::GuestView>(base::BindRepeating(
+      &ExtensionsGuestView::CreateForExtensions, render_process_host->GetID()));
+  associated_registry->AddInterface<mojom::RendererHost>(base::BindRepeating(
+      &RendererStartupHelper::BindForRenderer, render_process_host->GetID()));
 }
 
 void ShellContentBrowserClient::
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index 15117f9b..c2025281 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -582,13 +582,28 @@
 }
 #endif
 
+#if BUILDFLAG(IS_ANDROID)
 void TexturePassthrough::BindToServiceId(GLuint service_id) {
   if (service_id != 0 && service_id != service_id_) {
     service_id_ = service_id;
   }
-  // TODO(blundell): Inline the body of this method here.
-  UpdateStreamTextureServiceId(target(), /*level=*/0);
+
+  if (gl::g_current_gl_driver->ext.b_GL_ANGLE_texture_external_update) {
+    // Notify the texture that its size has changed.
+    LevelInfo* level_0_info = GetLevelInfo(target_, 0);
+    GLint prev_texture = 0;
+    glGetIntegerv(GetTextureBindingQuery(target_), &prev_texture);
+    glBindTexture(target_, service_id_);
+
+    glTexImage2DExternalANGLE(
+        target_, /*level=*/0, level_0_info->internal_format,
+        level_0_info->width, level_0_info->height, level_0_info->border,
+        level_0_info->format, level_0_info->type);
+
+    glBindTexture(target_, prev_texture);
+  }
 }
+#endif
 
 void TexturePassthrough::SetEstimatedSize(size_t size) {
   estimated_size_ = size;
@@ -630,24 +645,6 @@
 }
 #endif
 
-void TexturePassthrough::UpdateStreamTextureServiceId(GLenum target,
-                                                      GLint level) {
-  if (gl::g_current_gl_driver->ext.b_GL_ANGLE_texture_external_update) {
-    LevelInfo* level_info = GetLevelInfo(target, level);
-    // Notify the texture that its size has changed
-    GLint prev_texture = 0;
-    glGetIntegerv(GetTextureBindingQuery(target_), &prev_texture);
-    glBindTexture(target_, service_id_);
-
-    glTexImage2DExternalANGLE(target_, level, level_info->internal_format,
-                              level_info->width, level_info->height,
-                              level_info->border, level_info->format,
-                              level_info->type);
-
-    glBindTexture(target_, prev_texture);
-  }
-}
-
 TexturePassthrough::LevelInfo* TexturePassthrough::GetLevelInfo(GLenum target,
                                                                 GLint level) {
   size_t face_idx = GLES2Util::GLTargetToFaceIndex(target);
@@ -1910,10 +1907,7 @@
 #if BUILDFLAG(IS_ANDROID)
 void Texture::BindToServiceId(GLuint service_id) {
   SetStreamTextureServiceId(service_id);
-  // TODO(crbug.com/1310020): Confirm that this method call is a no-op
-  // and eliminate it.
-  SetLevelImageInternal(target(), /*level=*/0, /*image=*/nullptr,
-                        /*state=*/ImageState::UNBOUND);
+  UpdateCanRenderCondition();
 }
 #endif
 
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h
index fe399a81..a0a0ba3a 100644
--- a/gpu/command_buffer/service/texture_manager.h
+++ b/gpu/command_buffer/service/texture_manager.h
@@ -84,7 +84,9 @@
   gl::GLImage* GetLevelImage(GLenum target, GLint level) const;
 #endif
 
+#if BUILDFLAG(IS_ANDROID)
   void BindToServiceId(GLuint service_id);
+#endif
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
   // Return true if and only if the decoder should BindTexImage / CopyTexImage
@@ -109,7 +111,6 @@
                              gl::GLImage* image,
                              GLuint service_id);
 #endif
-  void UpdateStreamTextureServiceId(GLenum target, GLint level);
 
   friend class base::RefCounted<TexturePassthrough>;
 
diff --git a/infra/config/generated/builders/ci/Dawn Win10 x64 Builder/properties.json b/infra/config/generated/builders/ci/Dawn Win10 x64 Builder/properties.json
index 27aa26e..a1a7628e 100644
--- a/infra/config/generated/builders/ci/Dawn Win10 x64 Builder/properties.json
+++ b/infra/config/generated/builders/ci/Dawn Win10 x64 Builder/properties.json
@@ -64,7 +64,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x64 Release (Intel HD 630)",
+              "builder": "Dawn Win10 x64 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -138,7 +138,7 @@
         },
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x64 Release (Intel HD 630)",
+          "builder": "Dawn Win10 x64 Release (Intel)",
           "project": "chromium"
         },
         {
diff --git a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Builder/properties.json b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Builder/properties.json
index 5825713b..523804a 100644
--- a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Builder/properties.json
+++ b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Builder/properties.json
@@ -31,7 +31,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+              "builder": "Dawn Win10 x64 DEPS Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -100,7 +100,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+          "builder": "Dawn Win10 x64 DEPS Release (Intel)",
           "project": "chromium"
         },
         {
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel HD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json"
similarity index 94%
rename from "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel HD 630\051/properties.json"
rename to "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json"
index 306d060b..2d409c3 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel HD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release \050Intel\051/properties.json"
@@ -31,7 +31,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+              "builder": "Dawn Win10 x64 DEPS Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -63,7 +63,7 @@
       "builder_ids": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+          "builder": "Dawn Win10 x64 DEPS Release (Intel)",
           "project": "chromium"
         }
       ],
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel HD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json"
similarity index 94%
rename from "infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel HD 630\051/properties.json"
rename to "infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json"
index 5be91fc..b45688d9 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel HD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x64 Release \050Intel\051/properties.json"
@@ -34,7 +34,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x64 Release (Intel HD 630)",
+              "builder": "Dawn Win10 x64 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -66,7 +66,7 @@
       "builder_ids": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x64 Release (Intel HD 630)",
+          "builder": "Dawn Win10 x64 Release (Intel)",
           "project": "chromium"
         }
       ],
diff --git a/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/properties.json b/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/properties.json
index 31caa57c..48d54a2 100644
--- a/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/properties.json
+++ b/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/properties.json
@@ -64,7 +64,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x86 Release (Intel HD 630)",
+              "builder": "Dawn Win10 x86 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -138,7 +138,7 @@
         },
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x86 Release (Intel HD 630)",
+          "builder": "Dawn Win10 x86 Release (Intel)",
           "project": "chromium"
         },
         {
diff --git a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Builder/properties.json b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Builder/properties.json
index 7801ada4..d0d9ac3 100644
--- a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Builder/properties.json
+++ b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Builder/properties.json
@@ -31,7 +31,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+              "builder": "Dawn Win10 x86 DEPS Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -100,7 +100,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+          "builder": "Dawn Win10 x86 DEPS Release (Intel)",
           "project": "chromium"
         },
         {
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel HD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json"
similarity index 94%
rename from "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel HD 630\051/properties.json"
rename to "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json"
index e76a377..6cee733c 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel HD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release \050Intel\051/properties.json"
@@ -31,7 +31,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+              "builder": "Dawn Win10 x86 DEPS Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -63,7 +63,7 @@
       "builder_ids": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+          "builder": "Dawn Win10 x86 DEPS Release (Intel)",
           "project": "chromium"
         }
       ],
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel HD 630\051/properties.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json"
similarity index 94%
rename from "infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel HD 630\051/properties.json"
rename to "infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json"
index dc95707..104c4f31 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel HD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050Intel\051/properties.json"
@@ -34,7 +34,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x86 Release (Intel HD 630)",
+              "builder": "Dawn Win10 x86 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -66,7 +66,7 @@
       "builder_ids": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x86 Release (Intel HD 630)",
+          "builder": "Dawn Win10 x86 Release (Intel)",
           "project": "chromium"
         }
       ],
diff --git a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/properties.json b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/properties.json
index 2d6c4d5..16dbe86 100644
--- a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/properties.json
+++ b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/properties.json
@@ -28,7 +28,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Exp Release (Intel HD 630)",
+              "builder": "Win10 FYI x64 Exp Release (NVIDIA)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -56,7 +56,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Exp Release (NVIDIA)",
+              "builder": "Win10 FYI x64 Experimental Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -112,7 +112,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Release (Intel HD 630)",
+              "builder": "Win10 FYI x64 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -177,12 +177,12 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Exp Release (Intel HD 630)",
+          "builder": "Win10 FYI x64 Exp Release (NVIDIA)",
           "project": "chromium"
         },
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Exp Release (NVIDIA)",
+          "builder": "Win10 FYI x64 Experimental Release (Intel)",
           "project": "chromium"
         },
         {
@@ -192,7 +192,7 @@
         },
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Release (Intel HD 630)",
+          "builder": "Win10 FYI x64 Release (Intel)",
           "project": "chromium"
         },
         {
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050Intel HD 630\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json"
similarity index 93%
rename from "infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050Intel HD 630\051/properties.json"
rename to "infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json"
index c44dcde..a228ca2 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050Intel HD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release \050Intel\051/properties.json"
@@ -28,7 +28,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Exp Release (Intel HD 630)",
+              "builder": "Win10 FYI x64 Experimental Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -58,7 +58,7 @@
       "builder_ids": [
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Exp Release (Intel HD 630)",
+          "builder": "Win10 FYI x64 Experimental Release (Intel)",
           "project": "chromium"
         }
       ],
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel HD 630\051/properties.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json"
similarity index 94%
rename from "infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel HD 630\051/properties.json"
rename to "infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json"
index 0663dee6..5342158 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel HD 630\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/properties.json"
@@ -28,7 +28,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Release (Intel HD 630)",
+              "builder": "Win10 FYI x64 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -58,7 +58,7 @@
       "builder_ids": [
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Release (Intel HD 630)",
+          "builder": "Win10 FYI x64 Release (Intel)",
           "project": "chromium"
         }
       ],
diff --git a/infra/config/generated/builders/try/dawn-try-win10-x86-rel/properties.json b/infra/config/generated/builders/try/dawn-try-win10-x86-rel/properties.json
index 691fa54a..1b13f085 100644
--- a/infra/config/generated/builders/try/dawn-try-win10-x86-rel/properties.json
+++ b/infra/config/generated/builders/try/dawn-try-win10-x86-rel/properties.json
@@ -34,7 +34,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x86 Release (Intel HD 630)",
+              "builder": "Dawn Win10 x86 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -103,7 +103,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x86 Release (Intel HD 630)",
+          "builder": "Dawn Win10 x86 Release (Intel)",
           "project": "chromium"
         },
         {
diff --git a/infra/config/generated/builders/try/dawn-win10-x64-deps-rel/properties.json b/infra/config/generated/builders/try/dawn-win10-x64-deps-rel/properties.json
index a6ebaae1..f9667a13 100644
--- a/infra/config/generated/builders/try/dawn-win10-x64-deps-rel/properties.json
+++ b/infra/config/generated/builders/try/dawn-win10-x64-deps-rel/properties.json
@@ -31,7 +31,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+              "builder": "Dawn Win10 x64 DEPS Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -100,7 +100,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+          "builder": "Dawn Win10 x64 DEPS Release (Intel)",
           "project": "chromium"
         },
         {
diff --git a/infra/config/generated/builders/try/dawn-win10-x86-deps-rel/properties.json b/infra/config/generated/builders/try/dawn-win10-x86-deps-rel/properties.json
index 9b2e511..2212218a 100644
--- a/infra/config/generated/builders/try/dawn-win10-x86-deps-rel/properties.json
+++ b/infra/config/generated/builders/try/dawn-win10-x86-deps-rel/properties.json
@@ -31,7 +31,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+              "builder": "Dawn Win10 x86 DEPS Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -100,7 +100,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+          "builder": "Dawn Win10 x86 DEPS Release (Intel)",
           "project": "chromium"
         },
         {
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-exp-64/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-exp-64/properties.json
index 00b3399..04953e1 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-exp-64/properties.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-exp-64/properties.json
@@ -28,7 +28,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Exp Release (Intel HD 630)",
+              "builder": "Win10 FYI x64 Experimental Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -65,7 +65,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Exp Release (Intel HD 630)",
+          "builder": "Win10 FYI x64 Experimental Release (Intel)",
           "project": "chromium"
         }
       ]
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/properties.json
index 555c54c..72b7be2 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/properties.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/properties.json
@@ -28,7 +28,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 FYI x64 Release (Intel HD 630)",
+              "builder": "Win10 FYI x64 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -65,7 +65,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Win10 FYI x64 Release (Intel HD 630)",
+          "builder": "Win10 FYI x64 Release (Intel)",
           "project": "chromium"
         }
       ]
diff --git a/infra/config/generated/builders/try/win-dawn-rel/properties.json b/infra/config/generated/builders/try/win-dawn-rel/properties.json
index 0bb1d91f..e220dd3 100644
--- a/infra/config/generated/builders/try/win-dawn-rel/properties.json
+++ b/infra/config/generated/builders/try/win-dawn-rel/properties.json
@@ -34,7 +34,7 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Dawn Win10 x64 Release (Intel HD 630)",
+              "builder": "Dawn Win10 x64 Release (Intel)",
               "project": "chromium"
             },
             "builder_spec": {
@@ -103,7 +103,7 @@
       "builder_ids_in_scope_for_testing": [
         {
           "bucket": "ci",
-          "builder": "Dawn Win10 x64 Release (Intel HD 630)",
+          "builder": "Dawn Win10 x64 Release (Intel)",
           "project": "chromium"
         },
         {
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 45d5b323..04083e0d 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -6955,7 +6955,7 @@
       }
     }
     builders {
-      name: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+      name: "Dawn Win10 x64 DEPS Release (Intel)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -6981,7 +6981,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release (Intel HD 630)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 DEPS Release (Intel)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7219,7 +7219,7 @@
       }
     }
     builders {
-      name: "Dawn Win10 x64 Release (Intel HD 630)"
+      name: "Dawn Win10 x64 Release (Intel)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -7245,7 +7245,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Release (Intel HD 630)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x64 Release (Intel)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7571,7 +7571,7 @@
       }
     }
     builders {
-      name: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+      name: "Dawn Win10 x86 DEPS Release (Intel)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -7597,7 +7597,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release (Intel HD 630)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 DEPS Release (Intel)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -7835,7 +7835,7 @@
       }
     }
     builders {
-      name: "Dawn Win10 x86 Release (Intel HD 630)"
+      name: "Dawn Win10 x86 Release (Intel)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -7861,7 +7861,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Release (Intel HD 630)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Dawn Win10 x86 Release (Intel)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -23627,7 +23627,7 @@
       }
     }
     builders {
-      name: "Win10 FYI x64 Exp Release (Intel HD 630)"
+      name: "Win10 FYI x64 Exp Release (NVIDIA)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -23653,7 +23653,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Exp Release (Intel HD 630)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Exp Release (NVIDIA)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -23718,7 +23718,7 @@
       }
     }
     builders {
-      name: "Win10 FYI x64 Exp Release (NVIDIA)"
+      name: "Win10 FYI x64 Experimental Release (Intel)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -23744,7 +23744,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Exp Release (NVIDIA)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Experimental Release (Intel)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
@@ -23900,7 +23900,7 @@
       }
     }
     builders {
-      name: "Win10 FYI x64 Release (Intel HD 630)"
+      name: "Win10 FYI x64 Release (Intel)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cores:2"
@@ -23926,7 +23926,7 @@
         '    }'
         '  },'
         '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (Intel HD 630)/properties.json",'
+        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 Release (Intel)/properties.json",'
         '    "top_level_project": {'
         '      "ref": "refs/heads/main",'
         '      "repo": {'
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 70048b1..7ae3fd3 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -1302,12 +1302,12 @@
     short_name: "x64"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 DEPS Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 DEPS Release (Intel)"
     category: "chromium.dawn|DEPS|Windows|Intel"
     short_name: "x86"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 DEPS Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 DEPS Release (Intel)"
     category: "chromium.dawn|DEPS|Windows|Intel"
     short_name: "x64"
   }
@@ -7039,22 +7039,12 @@
     short_name: "x64"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 Release (Intel)"
     category: "ToT|Windows|Intel"
     short_name: "x86"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 Experimental Release (Intel)"
-    category: "ToT|Windows|Intel"
-    short_name: "ex64"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 Experimental Release (Intel)"
-    category: "ToT|Windows|Intel"
-    short_name: "ex86"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 Release (Intel)"
     category: "ToT|Windows|Intel"
     short_name: "x64"
   }
@@ -7114,12 +7104,12 @@
     short_name: "x64"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 DEPS Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 DEPS Release (Intel)"
     category: "DEPS|Windows|Intel"
     short_name: "x86"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 DEPS Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 DEPS Release (Intel)"
     category: "DEPS|Windows|Intel"
     short_name: "x64"
   }
@@ -10802,6 +10792,12 @@
     name: "buildbucket/luci.chromium.ci/Dawn Mac x64 Experimental Release (Intel)"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x64 Experimental Release (Intel)"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Dawn Win10 x86 Experimental Release (Intel)"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/Linux FYI Experimental Release (Intel UHD 630)"
   }
   builders {
@@ -10820,10 +10816,10 @@
     name: "buildbucket/luci.chromium.ci/Mac FYI Experimental Retina Release (NVIDIA)"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (NVIDIA)"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (NVIDIA)"
+    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Experimental Release (Intel)"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/gpu-fyi-chromeos-jacuzzi-exp"
@@ -10882,16 +10878,11 @@
     short_name: "rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (Intel HD 630)"
+    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (Intel)"
     category: "Windows|10|x64|Intel"
     short_name: "rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (Intel HD 630)"
-    category: "Windows|10|x64|Intel"
-    short_name: "exp"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (NVIDIA)"
     category: "Windows|10|x64|Nvidia"
     short_name: "rel"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 5d7a81a..62e1a0c 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -951,12 +951,12 @@
   }
 }
 job {
-  id: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+  id: "Dawn Win10 x64 DEPS Release (Intel)"
   realm: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "ci"
-    builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+    builder: "Dawn Win10 x64 DEPS Release (Intel)"
   }
 }
 job {
@@ -978,12 +978,12 @@
   }
 }
 job {
-  id: "Dawn Win10 x64 Release (Intel HD 630)"
+  id: "Dawn Win10 x64 Release (Intel)"
   realm: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "ci"
-    builder: "Dawn Win10 x64 Release (Intel HD 630)"
+    builder: "Dawn Win10 x64 Release (Intel)"
   }
 }
 job {
@@ -1014,12 +1014,12 @@
   }
 }
 job {
-  id: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+  id: "Dawn Win10 x86 DEPS Release (Intel)"
   realm: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "ci"
-    builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+    builder: "Dawn Win10 x86 DEPS Release (Intel)"
   }
 }
 job {
@@ -1041,12 +1041,12 @@
   }
 }
 job {
-  id: "Dawn Win10 x86 Release (Intel HD 630)"
+  id: "Dawn Win10 x86 Release (Intel)"
   realm: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "ci"
-    builder: "Dawn Win10 x86 Release (Intel HD 630)"
+    builder: "Dawn Win10 x86 Release (Intel)"
   }
 }
 job {
@@ -3214,15 +3214,6 @@
   }
 }
 job {
-  id: "Win10 FYI x64 Exp Release (Intel HD 630)"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Win10 FYI x64 Exp Release (Intel HD 630)"
-  }
-}
-job {
   id: "Win10 FYI x64 Exp Release (NVIDIA)"
   realm: "ci"
   buildbucket {
@@ -3232,6 +3223,15 @@
   }
 }
 job {
+  id: "Win10 FYI x64 Experimental Release (Intel)"
+  realm: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "Win10 FYI x64 Experimental Release (Intel)"
+  }
+}
+job {
   id: "Win10 FYI x64 Release (AMD RX 5500 XT)"
   realm: "ci"
   buildbucket {
@@ -3241,12 +3241,12 @@
   }
 }
 job {
-  id: "Win10 FYI x64 Release (Intel HD 630)"
+  id: "Win10 FYI x64 Release (Intel)"
   realm: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "ci"
-    builder: "Win10 FYI x64 Release (Intel HD 630)"
+    builder: "Win10 FYI x64 Release (Intel)"
   }
 }
 job {
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index 48883096..506bbfc9 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -208,15 +208,15 @@
         values: "Dawn Mac x64 Experimental Release (Intel)"
         values: "Dawn Mac x64 Release (AMD)"
         values: "Dawn Mac x64 Release (Intel)"
-        values: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+        values: "Dawn Win10 x64 DEPS Release (Intel)"
         values: "Dawn Win10 x64 DEPS Release (NVIDIA)"
         values: "Dawn Win10 x64 Experimental Release (Intel)"
-        values: "Dawn Win10 x64 Release (Intel HD 630)"
+        values: "Dawn Win10 x64 Release (Intel)"
         values: "Dawn Win10 x64 Release (NVIDIA)"
-        values: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+        values: "Dawn Win10 x86 DEPS Release (Intel)"
         values: "Dawn Win10 x86 DEPS Release (NVIDIA)"
         values: "Dawn Win10 x86 Experimental Release (Intel)"
-        values: "Dawn Win10 x86 Release (Intel HD 630)"
+        values: "Dawn Win10 x86 Release (Intel)"
         values: "Dawn Win10 x86 Release (NVIDIA)"
         values: "Lacros FYI x64 Release (AMD)"
         values: "Lacros FYI x64 Release (Intel)"
@@ -242,10 +242,10 @@
         values: "Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)"
         values: "Win10 FYI x64 DX12 Vulkan Release (NVIDIA)"
         values: "Win10 FYI x64 Debug (NVIDIA)"
-        values: "Win10 FYI x64 Exp Release (Intel HD 630)"
         values: "Win10 FYI x64 Exp Release (NVIDIA)"
+        values: "Win10 FYI x64 Experimental Release (Intel)"
         values: "Win10 FYI x64 Release (AMD RX 5500 XT)"
-        values: "Win10 FYI x64 Release (Intel HD 630)"
+        values: "Win10 FYI x64 Release (Intel)"
         values: "Win10 FYI x64 Release (NVIDIA)"
         values: "Win10 FYI x64 Release XR Perf (NVIDIA)"
         values: "Win10 FYI x86 Release (NVIDIA)"
diff --git a/infra/config/generated/sheriff-rotations/chromium.gpu.txt b/infra/config/generated/sheriff-rotations/chromium.gpu.txt
index 2a3007d..1502c81 100644
--- a/infra/config/generated/sheriff-rotations/chromium.gpu.txt
+++ b/infra/config/generated/sheriff-rotations/chromium.gpu.txt
@@ -57,10 +57,10 @@
 ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)
 ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)
 ci/Win10 FYI x64 Debug (NVIDIA)
-ci/Win10 FYI x64 Exp Release (Intel HD 630)
 ci/Win10 FYI x64 Exp Release (NVIDIA)
+ci/Win10 FYI x64 Experimental Release (Intel)
 ci/Win10 FYI x64 Release (AMD RX 5500 XT)
-ci/Win10 FYI x64 Release (Intel HD 630)
+ci/Win10 FYI x64 Release (Intel)
 ci/Win10 FYI x64 Release (NVIDIA)
 ci/Win10 FYI x64 Release XR Perf (NVIDIA)
 ci/Win10 FYI x86 Release (NVIDIA)
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star
index c1f7792f..2eb422e 100644
--- a/infra/config/subprojects/chromium/ci/chromium.dawn.star
+++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -563,7 +563,7 @@
 # Note that the Win testers are all thin Linux VMs, triggering jobs on the
 # physical Win hardware in the Swarming pool, which is why they run on linux
 ci.thin_tester(
-    name = "Dawn Win10 x64 DEPS Release (Intel HD 630)",
+    name = "Dawn Win10 x64 DEPS Release (Intel)",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
     builder_spec = builder_config.builder_spec(
         execution_mode = builder_config.execution_mode.TEST,
@@ -638,14 +638,16 @@
         run_tests_serially = True,
     ),
     triggered_by = ["Dawn Win10 x64 Builder"],
-    console_view_entry = consoles.console_view_entry(
-        category = "ToT|Windows|Intel",
-        short_name = "ex64",
-    ),
+    # Uncomment this entry when this experimental tester is actually in use.
+    # console_view_entry = consoles.console_view_entry(
+    #     category = "ToT|Windows|Intel",
+    #     short_name = "ex64",
+    # ),
+    list_view = "chromium.gpu.experimental",
 )
 
 ci.thin_tester(
-    name = "Dawn Win10 x64 Release (Intel HD 630)",
+    name = "Dawn Win10 x64 Release (Intel)",
     builder_spec = builder_config.builder_spec(
         execution_mode = builder_config.execution_mode.TEST,
         gclient_config = builder_config.gclient_config(
@@ -754,7 +756,7 @@
 # Note that the Win testers are all thin Linux VMs, triggering jobs on the
 # physical Win hardware in the Swarming pool, which is why they run on linux
 ci.thin_tester(
-    name = "Dawn Win10 x86 DEPS Release (Intel HD 630)",
+    name = "Dawn Win10 x86 DEPS Release (Intel)",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
     builder_spec = builder_config.builder_spec(
         execution_mode = builder_config.execution_mode.TEST,
@@ -829,14 +831,16 @@
         run_tests_serially = True,
     ),
     triggered_by = ["Dawn Win10 x86 Builder"],
-    console_view_entry = consoles.console_view_entry(
-        category = "ToT|Windows|Intel",
-        short_name = "ex86",
-    ),
+    # Uncomment this entry when this experimental tester is actually in use.
+    # console_view_entry = consoles.console_view_entry(
+    #     category = "ToT|Windows|Intel",
+    #     short_name = "ex86",
+    # ),
+    list_view = "chromium.gpu.experimental",
 )
 
 ci.thin_tester(
-    name = "Dawn Win10 x86 Release (Intel HD 630)",
+    name = "Dawn Win10 x86 Release (Intel)",
     builder_spec = builder_config.builder_spec(
         execution_mode = builder_config.execution_mode.TEST,
         gclient_config = builder_config.gclient_config(
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
index d3c1353..d093a816 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -1306,7 +1306,7 @@
 )
 
 ci.thin_tester(
-    name = "Win10 FYI x64 Exp Release (Intel HD 630)",
+    name = "Win10 FYI x64 Experimental Release (Intel)",
     builder_spec = builder_config.builder_spec(
         execution_mode = builder_config.execution_mode.TEST,
         gclient_config = builder_config.gclient_config(
@@ -1324,10 +1324,10 @@
     ),
     triggered_by = ["GPU FYI Win x64 Builder"],
     # Uncomment this entry when this experimental tester is actually in use.
-    console_view_entry = consoles.console_view_entry(
-        category = "Windows|10|x64|Intel",
-        short_name = "exp",
-    ),
+    # console_view_entry = consoles.console_view_entry(
+    #     category = "Windows|10|x64|Intel",
+    #     short_name = "exp",
+    # ),
     list_view = "chromium.gpu.experimental",
 )
 
@@ -1382,7 +1382,7 @@
 )
 
 ci.thin_tester(
-    name = "Win10 FYI x64 Release (Intel HD 630)",
+    name = "Win10 FYI x64 Release (Intel)",
     builder_spec = builder_config.builder_spec(
         execution_mode = builder_config.execution_mode.TEST,
         gclient_config = builder_config.gclient_config(
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star
index 51f3f108..f21174f 100644
--- a/infra/config/subprojects/chromium/gpu.try.star
+++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -456,7 +456,7 @@
     name = "gpu-fyi-try-win10-intel-exp-64",
     mirrors = [
         "ci/GPU FYI Win x64 Builder",
-        "ci/Win10 FYI x64 Exp Release (Intel HD 630)",
+        "ci/Win10 FYI x64 Experimental Release (Intel)",
     ],
     pool = "luci.chromium.gpu.win10.intel.try",
     goma_backend = None,
@@ -466,7 +466,7 @@
     name = "gpu-fyi-try-win10-intel-rel-64",
     mirrors = [
         "ci/GPU FYI Win x64 Builder",
-        "ci/Win10 FYI x64 Release (Intel HD 630)",
+        "ci/Win10 FYI x64 Release (Intel)",
     ],
     pool = "luci.chromium.gpu.win10.intel.try",
     goma_backend = None,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
index 7e28a54..d52a7d49 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
@@ -119,7 +119,7 @@
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
     mirrors = [
         "ci/Dawn Win10 x64 DEPS Builder",
-        "ci/Dawn Win10 x64 DEPS Release (Intel HD 630)",
+        "ci/Dawn Win10 x64 DEPS Release (Intel)",
         "ci/Dawn Win10 x64 DEPS Release (NVIDIA)",
     ],
     os = os.WINDOWS_ANY,
@@ -150,7 +150,7 @@
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
     mirrors = [
         "ci/Dawn Win10 x86 DEPS Builder",
-        "ci/Dawn Win10 x86 DEPS Release (Intel HD 630)",
+        "ci/Dawn Win10 x86 DEPS Release (Intel)",
         "ci/Dawn Win10 x86 DEPS Release (NVIDIA)",
     ],
     os = os.WINDOWS_ANY,
@@ -275,7 +275,7 @@
     name = "win-dawn-rel",
     mirrors = [
         "ci/Dawn Win10 x64 Builder",
-        "ci/Dawn Win10 x64 Release (Intel HD 630)",
+        "ci/Dawn Win10 x64 Release (Intel)",
         "ci/Dawn Win10 x64 Release (NVIDIA)",
     ],
     os = os.WINDOWS_ANY,
@@ -289,7 +289,7 @@
     name = "dawn-try-win10-x86-rel",
     mirrors = [
         "ci/Dawn Win10 x86 Builder",
-        "ci/Dawn Win10 x86 Release (Intel HD 630)",
+        "ci/Dawn Win10 x86 Release (Intel)",
         "ci/Dawn Win10 x86 Release (NVIDIA)",
     ],
     os = os.WINDOWS_ANY,
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb
index 46c28714c..0fb7f872 100644
--- a/ios/chrome/app/strings/resources/ios_strings_af.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Opstellingprofiel is beskikbaar</translation>
 <translation id="3670030362669914947">Nommer</translation>
 <translation id="3691593122358196899">Geboekmerk in <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Bied aan om wagwoorde te stoor</translation>
 <translation id="3709582977625132201">Merk as ongelees</translation>
 <translation id="371230970611282515">Voorspel en waarsku jou teen gevaarlike gevalle voordat hulle plaasvind.</translation>
 <translation id="37207012422556617">Soektogneigings</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index 4dfd1b8..ccdd840a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">የውቅረት መገለጫ ይገኛል</translation>
 <translation id="3670030362669914947">ቁጥር</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ላይ ዕልባት ተደርጓል</translation>
-<translation id="369349502275246497">የይለፍ ቃላትን ለማስቀመጥ ጠይቅ</translation>
 <translation id="3709582977625132201">እንዳልተነበበ ምልክት አድርግ</translation>
 <translation id="371230970611282515">አደገኛ ክስተቶች ከመፈጠራቸው በፊት ይገምት እና እርስዎን ያስጠነቅቀዎታል።</translation>
 <translation id="37207012422556617">በመታየት ላይ ያሉ ፍለጋዎች</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 4c0731e8..0df6ee5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -367,7 +367,6 @@
 <translation id="3661160521073045932">يتوفّر ملف شخصي يتضمّن إعدادات</translation>
 <translation id="3670030362669914947">رقم</translation>
 <translation id="3691593122358196899">أُضيفَت إشارة مرجعية إلى <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">اقتراح حفظ كلمات المرور</translation>
 <translation id="3709582977625132201">وضع علامة "غير مقروءة"</translation>
 <translation id="371230970611282515">توقّع الأحداث الخطيرة قبل حدوثها والتحذير منها</translation>
 <translation id="37207012422556617">طلبات البحث الرائجة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index 79e82bf..fcd242f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">কনফিগাৰেশ্বনৰ প্ৰ'ফাইল উপলব্ধ</translation>
 <translation id="3670030362669914947">নম্বৰ</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />ত বুকমার্ক কৰা হৈছে</translation>
-<translation id="369349502275246497">পাছৱৰ্ডসমূহ ছেভ কৰাৰ সুবিধা প্ৰদান কৰক</translation>
 <translation id="3709582977625132201">নপঢ়া হিচাপে চিহ্নিত কৰক</translation>
 <translation id="371230970611282515">বিপজ্জনক ঘটনাবোৰৰ সম্পর্কে অনুমান কৰে আৰু সেইবোৰ ঘটাৰ পূর্বে আপোনাক সকীয়নি দিয়ে।</translation>
 <translation id="37207012422556617">ট্ৰেণ্ডিং সন্ধানসমূহ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 259171f..2020eb6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Konfiqurasiya Profili Əlçatandır</translation>
 <translation id="3670030362669914947">Nömrə</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> qovluğuna əlfəcinləndi</translation>
-<translation id="369349502275246497">Parolların yadda saxlanılmasını təklif edilsin</translation>
 <translation id="3709582977625132201">Oxunmamış kimi qeyd edin</translation>
 <translation id="371230970611282515">Təhlükəli hadisələr baş vermədən əvvəl onları proqnozlaşdırır və sizə xəbərdarlıq edir.</translation>
 <translation id="37207012422556617">Aktual Axtarışlar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb
index 81dc0a33..072e2370 100644
--- a/ios/chrome/app/strings/resources/ios_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Даступны профіль канфігурацыі</translation>
 <translation id="3670030362669914947">Нумар</translation>
 <translation id="3691593122358196899">Закладка дададзена ў папку "<ph name="FOLDER_TITLE" />"</translation>
-<translation id="369349502275246497">Паказваць прапанову захаваць паролі</translation>
 <translation id="3709582977625132201">Пазначыць як непрачытанае</translation>
 <translation id="371230970611282515">Прадказвае небяспечныя падзеі і папярэджвае пра іх да таго, як яны здараюцца.</translation>
 <translation id="37207012422556617">Папулярныя пошукавыя запыты</translation>
@@ -754,6 +753,7 @@
 <translation id="6476800141292307438">Старонка перакладаецца на мову "<ph name="LANGUAGE" />". Параметры знаходзяцца ў ніжняй частцы экрана.</translation>
 <translation id="648164694371393720">Памылка аўтэнтыфікацыі</translation>
 <translation id="6482629121755362506">Выдалена элементаў: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation>
+<translation id="6495429111159337775">Захоўваць паролі ва Уліковы запіс Google</translation>
 <translation id="6497772452874122664">Калі вы давяраеце сайту <ph name="TIME" />, можаце выкарыстаць захаваны пароль з іншага сайта.
 
 Паспрабуйце выкарыстоўваць унікальны пароль для кожнага сайта.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 8922a3c6..ee1cad35 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Налице е конфигурационен профил</translation>
 <translation id="3670030362669914947">Номер</translation>
 <translation id="3691593122358196899">Отметката бе запазена в/ъв „<ph name="FOLDER_TITLE" />“</translation>
-<translation id="369349502275246497">Показване на предложение за запазване на паролите</translation>
 <translation id="3709582977625132201">Означав. като непрочетено</translation>
 <translation id="371230970611282515">Предвижда и ви предупреждава за опасни събития, преди да се случат.</translation>
 <translation id="37207012422556617">Набиращи популярност търсения</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index abc0aef..6ea8962 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">কনফিগারেশন প্রোফাইল উপলভ্য আছে</translation>
 <translation id="3670030362669914947">নম্বর</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> এ বুকমার্ক করা হয়েছে</translation>
-<translation id="369349502275246497">পাসওয়ার্ড সেভ করার প্রস্তাব</translation>
 <translation id="3709582977625132201">'পড়া হয়নি' হিসেবে চিহ্নিত করুন</translation>
 <translation id="371230970611282515">কোনও ঝুঁকিপূর্ণ ঘটনা ঘটলে সেটি অনুমান করে আপনাকে সতর্ক করা হয়।</translation>
 <translation id="37207012422556617">জনপ্রিয় সার্চ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index f510c84..0a4c7d59 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Dostupan je profil konfiguracije</translation>
 <translation id="3670030362669914947">Broj</translation>
 <translation id="3691593122358196899">Oznaka je pohranjena u folderu <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ponuda pohranjivanja lozinki</translation>
 <translation id="3709582977625132201">Označi kao nepročitano</translation>
 <translation id="371230970611282515">Predviđa opasne događaje i upozorava vas na njih prije nego što nastupe.</translation>
 <translation id="37207012422556617">Popularna pretraživanja</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 60b5022..2e38acc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Perfil de configuració disponible</translation>
 <translation id="3670030362669914947">Número</translation>
 <translation id="3691593122358196899">Adreça d'interès afegida a <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ofereix desar contrasenyes</translation>
 <translation id="3709582977625132201">Marca com a no llegit</translation>
 <translation id="371230970611282515">Prediu esdeveniments perillosos abans que es produeixin i t'hi avisa.</translation>
 <translation id="37207012422556617">Tendències</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 68030b0..bf9b3ed 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Je k dispozici profil konfigurace</translation>
 <translation id="3670030362669914947">Číslo</translation>
 <translation id="3691593122358196899">Záložka přidána do složky <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Nabízet uložení hesel</translation>
 <translation id="3709582977625132201">Označit jako nepřečtené</translation>
 <translation id="371230970611282515">Předvídá nebezpečné události a upozorňuje vás na ně ještě předtím, než k nim dojde.</translation>
 <translation id="37207012422556617">Populární vyhledávání</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
index 85e6003b..a017085 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Mae Proffil Ffurfweddiad Ar Gael</translation>
 <translation id="3670030362669914947">Rhif</translation>
 <translation id="3691593122358196899">Wedi creu nod tudalen yn <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Cynnig Cadw Cyfrineiriau</translation>
 <translation id="3709582977625132201">Marcio ei fod Heb ei Ddarllen</translation>
 <translation id="371230970611282515">Mae'n rhagfynegi digwyddiadau peryglus ac yn eich rhybuddio amdanynt cyn iddynt ddigwydd.</translation>
 <translation id="37207012422556617">Chwiliadau Poblogaidd</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index e1a9141..144e9be 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Der er en tilgængelig konfigurationsprofil</translation>
 <translation id="3670030362669914947">Nummer</translation>
 <translation id="3691593122358196899">Bogmærket er gemt i <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Få tilbudt at gemme adgangskoder</translation>
 <translation id="3709582977625132201">Markér som ulæst</translation>
 <translation id="371230970611282515">Forudser og advarer dig om skadelige hændelser, før de opstår.</translation>
 <translation id="37207012422556617">Populære søgninger</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 1d6988d5..8a60c60 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Konfigurationsprofil verfügbar</translation>
 <translation id="3670030362669914947">Nummer</translation>
 <translation id="3691593122358196899">Als Lesezeichen in "<ph name="FOLDER_TITLE" />" gespeichert</translation>
-<translation id="369349502275246497">Speichern von Passwörtern anbieten</translation>
 <translation id="3709582977625132201">Als ungelesen markieren</translation>
 <translation id="371230970611282515">Erkennt schädliche Ereignisse im Voraus und warnt dich, bevor diese eintreten.</translation>
 <translation id="37207012422556617">Trends bei Suchanfragen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index a56d688..be092e10 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Διαθέσιμο προφίλ διαμόρφωσης</translation>
 <translation id="3670030362669914947">Αριθμός</translation>
 <translation id="3691593122358196899">Ο σελιδοδείκτης είναι στο "<ph name="FOLDER_TITLE" />"</translation>
-<translation id="369349502275246497">Πρόταση αποθ. κωδ. πρόσβ.</translation>
 <translation id="3709582977625132201">Επισήμανση ως μη αναγνωσμένη</translation>
 <translation id="371230970611282515">Προβλέπει και σας προειδοποιεί για επικίνδυνα συμβάντα προτού αυτά συμβούν.</translation>
 <translation id="37207012422556617">Ανερχόμενες αναζητήσεις</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 6a0ebd5f..64f73c9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Configuration profile available</translation>
 <translation id="3670030362669914947">Number</translation>
 <translation id="3691593122358196899">Bookmarked to <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Offer to save passwords</translation>
 <translation id="3709582977625132201">Mark as unread</translation>
 <translation id="371230970611282515">Predicts and warns you about dangerous events before they happen.</translation>
 <translation id="37207012422556617">Trending searches</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
index c518328..785f0ab6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Perfil de configuración disponible</translation>
 <translation id="3670030362669914947">Número</translation>
 <translation id="3691593122358196899">Se agregó a favoritos en <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Sugerir guardar contraseñas</translation>
 <translation id="3709582977625132201">Marcar como no leído</translation>
 <translation id="371230970611282515">Predice y te advierte sobre eventos peligrosos antes de que ocurran.</translation>
 <translation id="37207012422556617">Tendencias de búsquedas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index d908746..a04e24b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Perfil de configuración disponible</translation>
 <translation id="3670030362669914947">Número</translation>
 <translation id="3691593122358196899">Marcador añadido a <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Preguntar si quiero guardar contraseñas</translation>
 <translation id="3709582977625132201">Marcar como no leído</translation>
 <translation id="371230970611282515">Predice y te advierte de eventos peligrosos antes de que se produzcan.</translation>
 <translation id="37207012422556617">Tendencias de búsqueda</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 9720f54..071dc52 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Seadistusprofiil on saadaval</translation>
 <translation id="3670030362669914947">Number</translation>
 <translation id="3691593122358196899">Lisatud järjehoidjana kausta <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Paku paroolide salvestamist</translation>
 <translation id="3709582977625132201">Märgi mitteloetuks</translation>
 <translation id="371230970611282515">Ennustab ohtlikke sündmusi ette ja hoiatab teid.</translation>
 <translation id="37207012422556617">Populaarsust koguvad otsingud</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index e2ff6ac..70ab98b0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Konfigurazio-profila erabilgarri dago</translation>
 <translation id="3670030362669914947">Zenbakia</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> karpetan gehitu da laster-marka</translation>
-<translation id="369349502275246497">Eskaini pasahitzak gordetzeko aukera</translation>
 <translation id="3709582977625132201">Markatu irakurri gabeko gisa</translation>
 <translation id="371230970611282515">Gertaera arriskutsuak iragartzen ditu eta haien berri ematen dizu gertatu aurretik.</translation>
 <translation id="37207012422556617">Pil-pilean dauden bilaketak</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 586f309..30bf77f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">پیکربندی نمایه دردسترس است</translation>
 <translation id="3670030362669914947">عدد</translation>
 <translation id="3691593122358196899">نشانک به <ph name="FOLDER_TITLE" /> اضافه شد</translation>
-<translation id="369349502275246497">پیشنهاد ذخیره شدن گذرواژه‌ها</translation>
 <translation id="3709582977625132201">علامت‌گذاری به‌عنوان خوانده‌نشده</translation>
 <translation id="371230970611282515">رویدادهای خطرناک را پیش از اینکه اتفاق بیفتند پیش‌بینی می‌کند و درباره آن‌ها به شما هشدار می‌دهد.</translation>
 <translation id="37207012422556617">جستجوهای پرطرفدار</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 0cea425e5..213d17a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Määritysprofiili saatavilla</translation>
 <translation id="3670030362669914947">Numero</translation>
 <translation id="3691593122358196899">Lisätty kirjanmerkiksi kansioon <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Tarjoa salasanojen tallentamista</translation>
 <translation id="3709582977625132201">Merkitse lukemattomaksi</translation>
 <translation id="371230970611282515">Ennustaa vaarallisia tapahtumia ja varoittaa niistä etukäteen.</translation>
 <translation id="37207012422556617">Trendaavat haut</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index e35dc8b..2ebf67b2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Available ang Profile ng Configuration</translation>
 <translation id="3670030362669914947">Numero</translation>
 <translation id="3691593122358196899">Na-bookmark sa <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Mag-alok na Mag-save ng Mga Password</translation>
 <translation id="3709582977625132201">Markahan Bilang Hindi pa Nababasa</translation>
 <translation id="371230970611282515">Hinuhulaan ang mga mapanganib na event at binibigyan ka ng babala tungkol sa mga ito bago mangyari ang mga ito.</translation>
 <translation id="37207012422556617">Mga Trending na Paghahanap</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 e83e107..1b35baf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profil de configuration proposé</translation>
 <translation id="3670030362669914947">Numéro</translation>
 <translation id="3691593122358196899">Marqué comme favori dans <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Proposer l'enregistrement des mots de passe</translation>
 <translation id="3709582977625132201">Marquer comme non lu</translation>
 <translation id="371230970611282515">Il prédit les événements dangereux et vous en informe avant qu'ils ne surviennent.</translation>
 <translation id="37207012422556617">Recherches tendances</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index e60f1ec..3b1447d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profil de configuration disponible</translation>
 <translation id="3670030362669914947">Numéro</translation>
 <translation id="3691593122358196899">Ajouté aux favoris dans "<ph name="FOLDER_TITLE" />"</translation>
-<translation id="369349502275246497">Proposer d'enregistrer les mots de passe</translation>
 <translation id="3709582977625132201">Marquer comme non lu</translation>
 <translation id="371230970611282515">Il prédit les événements dangereux et vous en informe avant qu'ils ne surviennent.</translation>
 <translation id="37207012422556617">Recherches populaires</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 88d1c354..24661c5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Hai un perfil de configuración dispoñible</translation>
 <translation id="3670030362669914947">Número</translation>
 <translation id="3691593122358196899">Marcador engadido a <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ofrecer posibilidade de gardar contrasinais</translation>
 <translation id="3709582977625132201">Marcar como non lido</translation>
 <translation id="371230970611282515">Predí eventos perigosos antes de que se produzan e móstrache unha advertencia.</translation>
 <translation id="37207012422556617">Buscas populares</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 08d480c..a955ced 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">કન્ફિગ્યુરેશન પ્રોફાઇલ ઉપલબ્ધ છે</translation>
 <translation id="3670030362669914947">નંબર</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> પર બુકમાર્ક કર્યું</translation>
-<translation id="369349502275246497">પાસવર્ડ સાચવવાની સુવિધા ઑફર કરો</translation>
 <translation id="3709582977625132201">વાંચ્યા વગરનું તરીકે માર્ક કરો</translation>
 <translation id="371230970611282515">જોખમકારક ઇવેન્ટ થાય તે પહેલાં તેનું અનુમાન લગાવીને તેના વિશે તમને ચેતવણી આપે છે.</translation>
 <translation id="37207012422556617">વલણમાં છે એવી શોધો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index e440cda8..c34a308 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">कॉन्फ़िगरेशन प्रोफ़ाइल उपलब्ध है</translation>
 <translation id="3670030362669914947">कार्ड नंबर</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> में बुकमार्क किया गया</translation>
-<translation id="369349502275246497">पासवर्ड सेव करने का विकल्प दें</translation>
 <translation id="3709582977625132201">'नहीं पढ़ा गया' का निशान लगाएं</translation>
 <translation id="371230970611282515">नुकसान पहुंचाने वाली घटनाओं का पहले से अंदाज़ा लगाता है. साथ ही, उनके बारे में आपको चेतावनी देता है.</translation>
 <translation id="37207012422556617">रुझान में चल रही खोजें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 1c896aa..485efbd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Dostupan je profil za konfiguraciju</translation>
 <translation id="3670030362669914947">Broj</translation>
 <translation id="3691593122358196899">Oznaka dodana u mapu <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ponudi spremanje zaporki</translation>
 <translation id="3709582977625132201">Označi kao nepročitano</translation>
 <translation id="371230970611282515">Predviđa opasne događaje i upozorava vas na njih prije nego što se dogode.</translation>
 <translation id="37207012422556617">Pretraživanje u trendu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 4208876..ca98ec5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Rendelkezésre áll egy konfigurációs profil</translation>
 <translation id="3670030362669914947">Szám</translation>
 <translation id="3691593122358196899">Könyvjelzők közé téve itt: <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Jelszavak mentésének felajánlása</translation>
 <translation id="3709582977625132201">Megjelölés olvasatlanként</translation>
 <translation id="371230970611282515">Előrejelzi a veszélyes eseményeket, és figyelmezteti Önt rájuk még a bekövetkezésük előtt.</translation>
 <translation id="37207012422556617">Felkapott keresések</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index 9b1cbc7..b50fd5d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Կազմաձևման պրոֆիլ է հասանելի</translation>
 <translation id="3670030362669914947">Քարտի համարը</translation>
 <translation id="3691593122358196899">Էջանիշը պահվել է <ph name="FOLDER_TITLE" />-ում</translation>
-<translation id="369349502275246497">Առաջարկել պահել գաղտնաբառերը</translation>
 <translation id="3709582977625132201">Նշել որպես չկարդացված</translation>
 <translation id="371230970611282515">Հայտնաբերում է վտանգավոր իրադարձություններն ու զգուշացնում դրանց մասին։</translation>
 <translation id="37207012422556617">Թրենդային որոնումներ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 0b70b00d..c900257 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profil Konfigurasi Tersedia</translation>
 <translation id="3670030362669914947">Nomor</translation>
 <translation id="3691593122358196899">Dibookmark ke <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Tawarkan Penyimpanan Sandi</translation>
 <translation id="3709582977625132201">Tandai sebagai Belum Dibaca</translation>
 <translation id="371230970611282515">Memperkirakan dan memberikan peringatan terkait peristiwa berbahaya sebelum terjadi.</translation>
 <translation id="37207012422556617">Penelusuran Trending</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index b59af710..c693093f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Stillingasnið er í boði</translation>
 <translation id="3670030362669914947">Númer</translation>
 <translation id="3691593122358196899">Bókamerki var búið til í <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Bjóðast til að vista aðgangsorð</translation>
 <translation id="3709582977625132201">Merkja sem ólesið</translation>
 <translation id="371230970611282515">Spáir fyrir um og varar þig við hættulegum viðburðum áður en þeir gerast.</translation>
 <translation id="37207012422556617">Vinsælar leitir</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 04946f9..b726ed1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profilo di configurazione disponibile</translation>
 <translation id="3670030362669914947">Numero</translation>
 <translation id="3691593122358196899">Preferito aggiunto in: <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Chiedi di salvare le password</translation>
 <translation id="3709582977625132201">Contrassegna come da leggere</translation>
 <translation id="371230970611282515">Prevede e ti avvisa quando stanno per verificarsi eventi pericolosi.</translation>
 <translation id="37207012422556617">Ricerche di tendenza</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index c08eff1a..c03a1c5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">יש פרופיל של הגדרות אישיות</translation>
 <translation id="3670030362669914947">מספר</translation>
 <translation id="3691593122358196899">התווסף לסימניות ב-<ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">הצגת הצעות לשמירת הסיסמאות</translation>
 <translation id="3709582977625132201">סימון כפריט שלא נקרא</translation>
 <translation id="371230970611282515">המערכת חוזה אירועים מסוכנים ומזהירה אותך לגביהם לפני שהם מתרחשים.</translation>
 <translation id="37207012422556617">שאילתות חיפוש פופולריות</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index f1778303..d9cef320 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">設定プロファイルを使用できます</translation>
 <translation id="3670030362669914947">番号</translation>
 <translation id="3691593122358196899">「<ph name="FOLDER_TITLE" />」にブックマークしました</translation>
-<translation id="369349502275246497">パスワードを保存できるようにする</translation>
 <translation id="3709582977625132201">未読にする</translation>
 <translation id="371230970611282515">危険なイベントの発生を予測して警告します。</translation>
 <translation id="37207012422556617">急上昇ワード</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index f2ed72da..2188eec 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">ხელმისაწვდომია კონფიგურაციის პროფილი</translation>
 <translation id="3670030362669914947">ნომერი</translation>
 <translation id="3691593122358196899">სანიშნე შენახულია „<ph name="FOLDER_TITLE" />“-ში</translation>
-<translation id="369349502275246497">პაროლების შენახვის შემოთავაზება</translation>
 <translation id="3709582977625132201">წაუკითხავად მონიშვნა</translation>
 <translation id="371230970611282515">პროგნოზირებს სახიფათო მოვლენებს და გაგაფრთხილებთ მათ შესახებ.</translation>
 <translation id="37207012422556617">პოპულარული ძიებები</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index fa09422a..e0ba639b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Конфигурация профилі қолжетімді</translation>
 <translation id="3670030362669914947">Нөмір</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> бетбелгісі жасалды</translation>
-<translation id="369349502275246497">Құпия сөздерді сақтауды ұсыну</translation>
 <translation id="3709582977625132201">Оқылмаған деп белгілеу</translation>
 <translation id="371230970611282515">Қауіпті іс-шараларды болжайды және хабарлайды.</translation>
 <translation id="37207012422556617">Танымал іздеу сұраулары</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index e1b5099..c0b38d5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">មាន​កម្រងព័ត៌មាន​នៃការកំណត់រចនាសម្ព័ន្ធ</translation>
 <translation id="3670030362669914947">លេខ</translation>
 <translation id="3691593122358196899">បានបន្ថែមចំណាំទៅ <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">ស្នើ​ឱ្យ​រក្សាទុក​ពាក្យ​សម្ងាត់</translation>
 <translation id="3709582977625132201">សម្គាល់​ថា​មិន​ទាន់​​​អាន</translation>
 <translation id="371230970611282515">ព្យាករ និងព្រមានអ្នកអំពី​ព្រឹត្តិការណ៍គ្រោះថ្នាក់ មុនពេលព្រឹត្តិការណ៍ទាំងនោះកើតឡើង។</translation>
 <translation id="37207012422556617">ការស្វែងរកដែលកំពុងពេញនិយម</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 8fa6a67..b7062513 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">ಕಾನ್ಫಿಗರೇಶನ್ ಪ್ರೊಫೈಲ್ ಲಭ್ಯವಿದೆ</translation>
 <translation id="3670030362669914947">ಸಂಖ್ಯೆ</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ಗೆ ಬುಕ್‌ಮಾರ್ಕ್ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="369349502275246497">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಉಳಿಸಲು ಸೂಚಿಸಿ</translation>
 <translation id="3709582977625132201">ಓದದಿರುವುದು ಎಂದು ಗುರುತಿಸು</translation>
 <translation id="371230970611282515">ಅಪಾಯಕಾರಿ ಘಟನೆಗಳು ಸಂಭವಿಸುವ ಮೊದಲೇ, ಅವುಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುತ್ತದೆ ಮತ್ತು ನಿಮಗೆ ಎಚ್ಚರಿಕೆ ನೀಡುತ್ತದೆ.</translation>
 <translation id="37207012422556617">ಟ್ರೆಂಡಿಂಗ್ ಹುಡುಕಾಟಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index eca6a677..cb12dd0f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">구성 프로필 이용 가능</translation>
 <translation id="3670030362669914947">번호</translation>
 <translation id="3691593122358196899">북마크를 <ph name="FOLDER_TITLE" />에 추가함</translation>
-<translation id="369349502275246497">비밀번호 저장 여부 확인</translation>
 <translation id="3709582977625132201">읽지않음으로 표시</translation>
 <translation id="371230970611282515">위험한 이벤트가 발생하기 전에 이를 예측하여 알립니다.</translation>
 <translation id="37207012422556617">인기 검색어</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index bb3de12..400fb0b2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Профилдин конфигурациясы жеткиликтүү</translation>
 <translation id="3670030362669914947">Сан</translation>
 <translation id="3691593122358196899">Кыстарма <ph name="FOLDER_TITLE" /> куржунуна кошулду</translation>
-<translation id="369349502275246497">Сырсөздөрдү сактоону сунуштоо</translation>
 <translation id="3709582977625132201">Окула элек деп белгилөө</translation>
 <translation id="371230970611282515">Кооптуу нерселер орун алганга чейин аларды аныктап, сизге кабарлап турат.</translation>
 <translation id="37207012422556617">Көп изделген нерселер</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index 8e13b554..1b68ae9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">ມີໂປຣໄຟລ໌ການຕັ້ງຄ່າທີ່ສາມາດໃຊ້ໄດ້</translation>
 <translation id="3670030362669914947">ໝາຍເລກ</translation>
 <translation id="3691593122358196899">ເພີ່ມບຸກມາກໃສ່ <ph name="FOLDER_TITLE" /> ແລ້ວ</translation>
-<translation id="369349502275246497">ສະເໜີໃຫ້ບັນທຶກລະຫັດຜ່ານ</translation>
 <translation id="3709582977625132201">ໝາຍວ່າຍັງບໍ່ໄດ້ອ່ານ</translation>
 <translation id="371230970611282515">ຄາດເດົາ ແລະ ເຕືອນທ່ານກ່ຽວກັບເຫດການອັນຕະລາຍກ່ອນທີ່ພວກມັນຈະເກີດຂຶ້ນ.</translation>
 <translation id="37207012422556617">ການຊອກຫາມາແຮງ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 7426d6f..65b13e3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Pasiekiamas konfigūracijos profilis</translation>
 <translation id="3670030362669914947">Numeris</translation>
 <translation id="3691593122358196899">Sukurta „<ph name="FOLDER_TITLE" />“ žymė</translation>
-<translation id="369349502275246497">Siūlyti išsaugoti slaptažodžius</translation>
 <translation id="3709582977625132201">Pažymėti kaip neskaitytą</translation>
 <translation id="371230970611282515">Numato ir įspėja jus apie pavojingus įvykius, prieš jiems nutinkant.</translation>
 <translation id="37207012422556617">Populiarios paieškos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index ee38c1d..f56149df 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Pieejams konfigurācijas profils</translation>
 <translation id="3670030362669914947">Numurs</translation>
 <translation id="3691593122358196899">Grāmatzīme saglabāta mapē <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Piedāvāt saglabāt paroles</translation>
 <translation id="3709582977625132201">Atzīmēt kā nelasītu</translation>
 <translation id="371230970611282515">Bīstami notikumi tiek prognozēti, un jūs jau iepriekš saņemat brīdinājumus.</translation>
 <translation id="37207012422556617">Populārākie meklēšanas vaicājumi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
index cffa4b9..7743961f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Достапен е профил за конфигурација</translation>
 <translation id="3670030362669914947">Број</translation>
 <translation id="3691593122358196899">Додаден е обележувач во <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Понудувај зачувување лозинки</translation>
 <translation id="3709582977625132201">Обележи како непрочитано</translation>
 <translation id="371230970611282515">Предвидува опасни настани и ве предупредува пред да се случат.</translation>
 <translation id="37207012422556617">Пребарувања во тренд</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index b7eff59..342d178 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">കോൺഫിഗറേഷൻ പ്രൊഫൈൽ ലഭ്യമാണ്</translation>
 <translation id="3670030362669914947">നമ്പർ</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ഫോൾഡറിലേക്ക് ബുക്ക്മാർക്ക് ചെയ്‌തു</translation>
-<translation id="369349502275246497">പാസ്‌വേഡുകൾ സംരക്ഷിക്കുന്നതിനുള്ള നിർദ്ദേശം</translation>
 <translation id="3709582977625132201">വായിച്ചില്ലെന്ന് അടയാളപ്പെടുത്തുക</translation>
 <translation id="371230970611282515">അപകടകരമായ ഇവന്റുകൾ നടക്കുന്നതിന് മുമ്പ് അവ പ്രവചിക്കുകയും നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുകയും ചെയ്യുന്നു.</translation>
 <translation id="37207012422556617">ട്രെൻഡിംഗ് തിരയലുകൾ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index ee06505..458aa85 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Тохируулгын профайл боломжтой</translation>
 <translation id="3670030362669914947">Тоо</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />-д хавчуулсан</translation>
-<translation id="369349502275246497">Нууц үг хадгалахыг санал болгох</translation>
 <translation id="3709582977625132201">Уншаагүй болгож тэмдэглэх</translation>
 <translation id="371230970611282515">Аюултай үйл явдлын тухай урьдчилан таамаглаж, тохиолдохоос нь өмнө танд анхааруулга өгдөг.</translation>
 <translation id="37207012422556617">Тренд болж буй хайлт</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 08b2c9c0..be419c55 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">प्रोफाइल कॉंफिगरेशन उपलब्ध आहे</translation>
 <translation id="3670030362669914947">नंबर</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> मध्ये बुकमार्क केले</translation>
-<translation id="369349502275246497">पासवर्ड सेव्ह करायचे आहेत का हे विचारा</translation>
 <translation id="3709582977625132201">न वाचलेले म्हणून मार्क करा</translation>
 <translation id="371230970611282515">धोकादायक घटना घडण्याआधी त्यांचे पूर्वानुमान करतो आणि त्यांबद्दल तुम्हाला चेतावणी देतो.</translation>
 <translation id="37207012422556617">ट्रेंडिंग शोध</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 76225e5..f7e61032 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profil Konfigurasi Tersedia</translation>
 <translation id="3670030362669914947">Nombor</translation>
 <translation id="3691593122358196899">Ditandai halaman ke <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Tawarkan Untuk Menyimpan Kata Laluan</translation>
 <translation id="3709582977625132201">Tandakan Sebagai Belum Dibaca</translation>
 <translation id="371230970611282515">Meramalkan dan memberi anda amaran tentang acara berbahaya sebelum acara itu berlaku.</translation>
 <translation id="37207012422556617">Carian Sohor Kini</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index 446f5c48..b5609f0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">စီစဉ်သတ်မှတ်ချက် ပရိုဖိုင် ရနိုင်သည်</translation>
 <translation id="3670030362669914947">နံပါတ်</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />သို့ စာညှပ်ကို ထည့်ထားပါသည်</translation>
-<translation id="369349502275246497">စကားဝှက်သိမ်းရန် ကမ်းလှမ်းချက်</translation>
 <translation id="3709582977625132201">မဖတ်ရသေးအဖြစ် မှတ်သားရန်</translation>
 <translation id="371230970611282515">အန္တရာယ်ရှိသည့် ဖြစ်ရပ်များ မဖြစ်ပွားမီ ခန့်မှန်းပြီး သင့်အား သတိပေးသည်။</translation>
 <translation id="37207012422556617">ခေတ်စားနေသည့် ရှာဖွေမှုများ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
index b4f92ac..83a5599 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">कन्फिगुरेसन प्रोफाइल उपलब्ध छ</translation>
 <translation id="3670030362669914947">अङ्क</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> मा पुस्तक चिन्ह लगाइयो</translation>
-<translation id="369349502275246497">पासवर्ड सेभ गर्ने वा नगर्ने भनी सोधियोस्</translation>
 <translation id="3709582977625132201">'नपढिएको' सामग्रीका रूपमा चिन्ह लगाउनुहोस्</translation>
 <translation id="371230970611282515">खतरनाक घटनाहरू घट्नुअघि नै तिनको पूर्वानुमान गर्छ र तपाईंलाई सोबारे चेतावनी दिन्छ।</translation>
 <translation id="37207012422556617">ट्रेन्डिङमा रहेका खोज</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 45b20dc93..81293bbc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Configuratieprofiel beschikbaar</translation>
 <translation id="3670030362669914947">Nummer</translation>
 <translation id="3691593122358196899">Bookmark gemaakt in <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Aanbieden wachtwoorden op te slaan</translation>
 <translation id="3709582977625132201">Markeren als ongelezen</translation>
 <translation id="371230970611282515">Voorspelt en waarschuwt je voor gevaarlijke gebeurtenissen voordat deze plaatsvinden.</translation>
 <translation id="37207012422556617">Trending zoekopdrachten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 971fe7ab..32bcaf76 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">En konfigurasjonsprofil er tilgjengelig</translation>
 <translation id="3670030362669914947">Nummer</translation>
 <translation id="3691593122358196899">Satt som bokmerke i <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Tilby å lagre passord</translation>
 <translation id="3709582977625132201">Merk som ulest</translation>
 <translation id="371230970611282515">Forutser og advarer deg om farlige hendelser før de inntreffer.</translation>
 <translation id="37207012422556617">Søk på vei opp</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index 757f1df..0dbb9da 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">କନଫିଗରେସନ୍ ପ୍ରୋଫାଇଲ୍ ଉପଲବ୍ଧ ଅଛି</translation>
 <translation id="3670030362669914947">ନମ୍ବର</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />ରେ ବୁକ୍‍ମାର୍କ କରାଯାଇଛି</translation>
-<translation id="369349502275246497">ପାସୱାର୍ଡ ସେଭ କରିବାକୁ ସୁବିଧା ଅଫର କରନ୍ତୁ</translation>
 <translation id="3709582977625132201">ଅପଠିତ ଭାବେ ଚିହ୍ନଟ କରନ୍ତୁ</translation>
 <translation id="371230970611282515">ବିପଦଜନକ ଘଟଣାଗୁଡ଼ିକ ଘଟିବା ପୂର୍ବରୁ ସେଗୁଡ଼ିକର ପୂର୍ବାନୁମାନ କରି ଆପଣଙ୍କୁ ଚେତାବନୀ ଦିଏ।</translation>
 <translation id="37207012422556617">ଟ୍ରେଣ୍ଡିଂ ସନ୍ଧାନଗୁଡ଼ିକ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
index a841b5e..e56af61b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">ਸੰਰੂਪਣ ਪ੍ਰੋਫਾਈਲ ਉਪਲਬਧ ਹੈ</translation>
 <translation id="3670030362669914947">ਨੰਬਰ</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ਵਿੱਚ ਬੁੱਕਮਾਰਕ ਕੀਤਾ ਗਿਆ</translation>
-<translation id="369349502275246497">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰੋ</translation>
 <translation id="3709582977625132201">ਨਹੀਂ ਪੜ੍ਹੀ ਵਜੋਂ ਨਿਸ਼ਾਨਦੇਹੀ ਕਰੋ</translation>
 <translation id="371230970611282515">ਖਤਰਨਾਕ ਘਟਨਾਵਾਂ ਦਾ ਪਤਾ ਕਰਕੇ ਉਹਨਾਂ ਦੇ ਵਾਪਰਨ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਚਿਤਾਵਨੀ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ।</translation>
 <translation id="37207012422556617">ਪ੍ਰਚਲਿਤ ਖੋਜਾਂ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 875b92cf..9528cc18 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Dostępny jest profil konfiguracji</translation>
 <translation id="3670030362669914947">Numer</translation>
 <translation id="3691593122358196899">Utworzono zakładkę w folderze <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Proponuj zapisywanie haseł</translation>
 <translation id="3709582977625132201">Oznacz jako nieprzeczytane</translation>
 <translation id="371230970611282515">Przewiduje niebezpieczne zdarzenia i ostrzega Cię przed nimi, zanim nastąpią.</translation>
 <translation id="37207012422556617">Wyszukiwania zyskujące popularność</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index e5e96e77..e2692d12 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Perfil de configuração disponível</translation>
 <translation id="3670030362669914947">Número</translation>
 <translation id="3691593122358196899">Adicionado como favorito em <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Oferecer para salvar senhas</translation>
 <translation id="3709582977625132201">Marcar como não lido</translation>
 <translation id="371230970611282515">Prevê e avisa sobre eventos perigosos antes que eles aconteçam.</translation>
 <translation id="37207012422556617">Pesquisas em alta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index 02c0385..b2c3d7b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Perfil de configuração disponível</translation>
 <translation id="3670030362669914947">Número</translation>
 <translation id="3691593122358196899">Adicionado aos marcadores em <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Propor guardar palavras-passe</translation>
 <translation id="3709582977625132201">Marcar como não lido</translation>
 <translation id="371230970611282515">Prevê e envia-lhe avisos sobre eventos perigosos antes da sua ocorrência.</translation>
 <translation id="37207012422556617">Pesquisas populares</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 08561cb9..0b5b29c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Este disponibil un profil de configurare</translation>
 <translation id="3670030362669914947">Număr</translation>
 <translation id="3691593122358196899">Marcaj adăugat în <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Oferă salvarea parolelor</translation>
 <translation id="3709582977625132201">Marchează ca necitit</translation>
 <translation id="371230970611282515">Anticipează și te avertizează cu privire la evenimente periculoase înainte să aibă loc.</translation>
 <translation id="37207012422556617">Căutări populare</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 9fa1e75..edffa5a3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Доступен профиль конфигурации</translation>
 <translation id="3670030362669914947">Номер</translation>
 <translation id="3691593122358196899">Закладка добавлена в папку "<ph name="FOLDER_TITLE" />"</translation>
-<translation id="369349502275246497">Предлагать сохранение паролей</translation>
 <translation id="3709582977625132201">Отметить как непрочитанное</translation>
 <translation id="371230970611282515">Предсказывает опасные события и предупреждает вас до того, как они происходят.</translation>
 <translation id="37207012422556617">Популярные запросы</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index fb3e751..5821256 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">වින්‍යාසකරණ පැතිකඩක් ලබා ගත හැකිය</translation>
 <translation id="3670030362669914947">අංකය</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> වෙත පිටුසන් යොදන ලදී</translation>
-<translation id="369349502275246497">මුරපද සුරැකීමට පිරිනමන්න</translation>
 <translation id="3709582977625132201">නොකියවූ ලෙස ලකුණු කරන්න</translation>
 <translation id="371230970611282515">අනතුරුදායක සිදුවීම් සිදු වීමට පෙර ඒවා පුරෝකථන කර ඔබට අවවාද කරයි.</translation>
 <translation id="37207012422556617">නැගී එන සෙවීම්</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index f802246..af830967 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">K dispozícii je profil konfigurácie</translation>
 <translation id="3670030362669914947">Číslo</translation>
 <translation id="3691593122358196899">Uložené ako záložka v priečinku <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ponúkať ukladanie hesiel</translation>
 <translation id="3709582977625132201">Označiť ako neprečítané</translation>
 <translation id="371230970611282515">Predpovedá nebezpečné udalosti a upozorní vás, než k nim dôjde.</translation>
 <translation id="37207012422556617">Populárne vyhľadávania</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index a4726529..8ccf2d3b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profil konfiguracije je na voljo</translation>
 <translation id="3670030362669914947">Številka</translation>
 <translation id="3691593122358196899">Zaznamek ustvarjen v mapi <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ponudi shranjevanje gesel</translation>
 <translation id="3709582977625132201">Označi kot neprebrano</translation>
 <translation id="371230970611282515">Predvideva nevarne dogodke, preden se zgodijo, in vas opozarja nanje.</translation>
 <translation id="37207012422556617">Iskanja v trendu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index b0a1931..521ae7b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Ofrohet profili i konfigurimit</translation>
 <translation id="3670030362669914947">Numri</translation>
 <translation id="3691593122358196899">Faqeshënuesi u shtua te <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ofro të ruhen fjalëkalimet</translation>
 <translation id="3709582977625132201">Shëno si të palexuar</translation>
 <translation id="371230970611282515">Parashikon dhe të paralajmëron rreth ngjarjeve të rrezikshme përpara se ato të ndodhin.</translation>
 <translation id="37207012422556617">Kërkimet në tendencë</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index 8af7445..e8b7a843 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Dostupan profil konfiguracije</translation>
 <translation id="3670030362669914947">Broj</translation>
 <translation id="3691593122358196899">Obeleživač je dodat u <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Ponudi da sačuvaš lozinke</translation>
 <translation id="3709582977625132201">Označi kao nepročitano</translation>
 <translation id="371230970611282515">Otkriva opasne događaje pre nego što se dogode i upozorava vas na njih.</translation>
 <translation id="37207012422556617">Pretrage u trendu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 4b416fc..6910576 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Доступан профил конфигурације</translation>
 <translation id="3670030362669914947">Број</translation>
 <translation id="3691593122358196899">Обележивач је додат у <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Понуди да сачуваш лозинке</translation>
 <translation id="3709582977625132201">Означи као непрочитано</translation>
 <translation id="371230970611282515">Открива опасне догађаје пре него што се догоде и упозорава вас на њих.</translation>
 <translation id="37207012422556617">Претраге у тренду</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 713368a..13d2cc2e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Tillgänglig konfigurationsprofil</translation>
 <translation id="3670030362669914947">Nummer</translation>
 <translation id="3691593122358196899">Bokmärkt i <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Erbjud att spara lösenord</translation>
 <translation id="3709582977625132201">Markera som oläst</translation>
 <translation id="371230970611282515">Förutser och varnar dig om farliga händelser innan de inträffar.</translation>
 <translation id="37207012422556617">Populära sökningar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 2ad9c3a7..3fa65fb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Wasifu wa Mipangilio Unapatikana</translation>
 <translation id="3670030362669914947">Nambari</translation>
 <translation id="3691593122358196899">Imetiwa alamisho kwenye <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Niulize Kama Ningependa Manenosiri Yahifadhiwe</translation>
 <translation id="3709582977625132201">Tia Alama Kuwa Hujasoma</translation>
 <translation id="371230970611282515">Hutabiri na kukuonya kuhusu matukio hatari yanapotendeka.</translation>
 <translation id="37207012422556617">Hoja za Utafutaji zinazovuma</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index 148f335f..74a6c81 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">உள்ளமைவுச் சுயவிவரம் உள்ளது</translation>
 <translation id="3670030362669914947">எண்</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> இல் புத்தகக்குறியைச் சேர்த்தது</translation>
-<translation id="369349502275246497">கடவுச்சொற்களைச் சேமிப்பதற்குக் கேள்</translation>
 <translation id="3709582977625132201">படிக்காததாகக் குறி</translation>
 <translation id="371230970611282515">ஆபத்தான நிகழ்வுகள் ஏற்படுவதற்கு முன்பு அவற்றைக் கணித்து உங்களுக்கு எச்சரிக்கை அனுப்பும்.</translation>
 <translation id="37207012422556617">பிரபலமான தேடல்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 837c3481..5df04176 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">కాన్ఫిగరేషన్ ప్రొఫైల్ అందుబాటులో ఉంది</translation>
 <translation id="3670030362669914947">నంబర్</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />కి బుక్‌మార్క్ చేయబడింది</translation>
-<translation id="369349502275246497">పాస్‌వర్డ్‌లను సేవ్ చేయమని అడగండి</translation>
 <translation id="3709582977625132201">చదవనిదిగా గుర్తు పెట్టు</translation>
 <translation id="371230970611282515">ప్రమాదకరమైన సంఘటనలు జరగడానికి ముందే, వాటిని గుర్తించి, మిమ్మల్ని హెచ్చరిస్తుంది.</translation>
 <translation id="37207012422556617">ట్రెండింగ్ సెర్చ్‌లు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index bdb73e1..d7cd888 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">มีโปรไฟล์การกำหนดค่า</translation>
 <translation id="3670030362669914947">หมายเลข</translation>
 <translation id="3691593122358196899">เพิ่มบุ๊กมาร์กไปยัง <ph name="FOLDER_TITLE" /> แล้ว</translation>
-<translation id="369349502275246497">เสนอให้บันทึกรหัสผ่าน</translation>
 <translation id="3709582977625132201">ทำเครื่องหมายว่ายังไม่อ่าน</translation>
 <translation id="371230970611282515">คาดการณ์และเตือนคุณก่อนเกิดเหตุการณ์อันตราย</translation>
 <translation id="37207012422556617">การค้นหาที่มาแรง</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 93cebae8..07a0b51 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Yapılandırma Profili Mevcut</translation>
 <translation id="3670030362669914947">Numara</translation>
 <translation id="3691593122358196899">Yer işareti <ph name="FOLDER_TITLE" /> klasörüne eklendi</translation>
-<translation id="369349502275246497">Şifreleri kaydetmeyi öner</translation>
 <translation id="3709582977625132201">Okunmadı Olarak İşaretle</translation>
 <translation id="371230970611282515">Tehlikeli etkinlikleri meydana gelmeden önce tahmin ederek sizi uyarır.</translation>
 <translation id="37207012422556617">Trend Olan Aramalar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 03f8f36..f77911c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Доступний профіль конфігурації</translation>
 <translation id="3670030362669914947">Номер</translation>
 <translation id="3691593122358196899">Закладку збережено в папці "<ph name="FOLDER_TITLE" />"</translation>
-<translation id="369349502275246497">Пропонувати зберігати паролі</translation>
 <translation id="3709582977625132201">Позначити як непрочитане</translation>
 <translation id="371230970611282515">Передбачає небезпечні події та повідомляє про них ще до того, як вони відбудуться.</translation>
 <translation id="37207012422556617">Популярні запити</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index 1e7db35..5bba83f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">کنفیگریشن پروفائل دستیاب ہے</translation>
 <translation id="3670030362669914947">نمبر</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> میں بُک مارک کردہ</translation>
-<translation id="369349502275246497">پاس ورڈز محفوظ کرنے کی پیشکش</translation>
 <translation id="3709582977625132201">بغیر پڑھا ہوا کے بطور نشان زد کریں</translation>
 <translation id="371230970611282515">خطرناک ایونٹس ہونے سے پہلے ان کی پیشین گوئی کرتا ہے اور آپ کو ان کے بارے میں متنبہ کرتا ہے۔</translation>
 <translation id="37207012422556617">رجحان ساز تلاشیں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index 2186f44..dce02b73 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Profil konfiguratsiyasi mavjud</translation>
 <translation id="3670030362669914947">Raqam</translation>
 <translation id="3691593122358196899">Xatcho‘p “<ph name="FOLDER_TITLE" />” jildiga saqlandi</translation>
-<translation id="369349502275246497">Parollarni saqlashni taklif qilish</translation>
 <translation id="3709582977625132201">Oʻqilmagan deb belgilash</translation>
 <translation id="371230970611282515">Xavfli tahdidlarni aniqlaydi va sizni ulardan himoya qiladi.</translation>
 <translation id="37207012422556617">Qidiruv trendlari</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index c2d99e4..54df91b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Hồ sơ cấu hình có sẵn</translation>
 <translation id="3670030362669914947">Số</translation>
 <translation id="3691593122358196899">Đã đánh dấu trang vào <ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Đề xuất lưu mật khẩu</translation>
 <translation id="3709582977625132201">Đánh dấu là chưa đọc</translation>
 <translation id="371230970611282515">Dự đoán và cảnh báo cho bạn các sự kiện nguy hiểm trước khi các sự kiện đó xảy ra.</translation>
 <translation id="37207012422556617">Nội dung tìm kiếm thịnh hành</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index a94d93d..131cdcf7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">有可用的配置文件</translation>
 <translation id="3670030362669914947">卡号</translation>
 <translation id="3691593122358196899">已将书签添加到“<ph name="FOLDER_TITLE" />”</translation>
-<translation id="369349502275246497">提示保存密码</translation>
 <translation id="3709582977625132201">标记为未读</translation>
 <translation id="371230970611282515">预测危险事件并在此类事件发生前向您发出警告。</translation>
 <translation id="37207012422556617">热搜字词</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 44b98c8..0533dc7f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">有可用的設定描述檔。</translation>
 <translation id="3670030362669914947">號碼</translation>
 <translation id="3691593122358196899">已將書籤加入到「<ph name="FOLDER_TITLE" />」</translation>
-<translation id="369349502275246497">儲存密碼提議</translation>
 <translation id="3709582977625132201">標示為未讀取</translation>
 <translation id="371230970611282515">在危險事件發生前進行預測並發出警告。</translation>
 <translation id="37207012422556617">熱門搜尋</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 86bcc12c..c2d949e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -88,7 +88,7 @@
 <translation id="1531836666020185856">精選內容</translation>
 <translation id="1535268707340844072">你目前的設定可能會導致某些網站無法正常運作。如要管理所有網站的 Cookie,請參閱 <ph name="BEGIN_LINK" />Cookie 設定<ph name="END_LINK" />。</translation>
 <translation id="1540800554400757039">地址 1</translation>
-<translation id="1545749641540134597">掃描 QR 圖碼</translation>
+<translation id="1545749641540134597">掃描 QR code</translation>
 <translation id="1552525382687785070">你的管理員停用了同步功能</translation>
 <translation id="1554477036522844996">開啟新視窗</translation>
 <translation id="1565371473877914088">新無痕分頁</translation>
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">有可用的設定描述檔</translation>
 <translation id="3670030362669914947">號碼</translation>
 <translation id="3691593122358196899">已將書籤加入「<ph name="FOLDER_TITLE" />」</translation>
-<translation id="369349502275246497">顯示儲存密碼的選項</translation>
 <translation id="3709582977625132201">標示為未讀取</translation>
 <translation id="371230970611282515">可預測不安全事件,並在這類事件發生前顯示警告訊息。</translation>
 <translation id="37207012422556617">熱門搜尋</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 0d410fbe..757d359 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -365,7 +365,6 @@
 <translation id="3661160521073045932">Iphrofayela Lokulungiselela Liyatholakala</translation>
 <translation id="3670030362669914947">Inombolo</translation>
 <translation id="3691593122358196899">Kubhukumakwe ku-<ph name="FOLDER_TITLE" /></translation>
-<translation id="369349502275246497">Nikezela Ukulondoloza Amaphasiwedi</translation>
 <translation id="3709582977625132201">Maka njengokungafundiwe</translation>
 <translation id="371230970611282515">Ibikezela futhi ikuxwayise ngemicimbi eyingozi ngaphambo kokuba yenzeke.</translation>
 <translation id="37207012422556617">Usesho Oluthrendayo</translation>
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/sync_error_infobar_banner_overlay_request_config_unittest.mm b/ios/chrome/browser/overlays/public/infobar_banner/sync_error_infobar_banner_overlay_request_config_unittest.mm
index bbffb59..01cb65d 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/sync_error_infobar_banner_overlay_request_config_unittest.mm
+++ b/ios/chrome/browser/overlays/public/infobar_banner/sync_error_infobar_banner_overlay_request_config_unittest.mm
@@ -74,7 +74,7 @@
   SyncErrorBannerRequestConfig* config =
       request->GetConfig<SyncErrorBannerRequestConfig>();
 
-  EXPECT_NSEQ([UIColor colorNamed:kTextPrimaryColor],
+  EXPECT_NSEQ([UIColor colorNamed:kPrimaryBackgroundColor],
               config -> icon_image_tint_color());
   EXPECT_NSEQ([UIColor colorNamed:kRed500Color],
               config -> background_tint_color());
diff --git a/ios/chrome/browser/signin/account_capabilities_fetcher_ios_unittest.mm b/ios/chrome/browser/signin/account_capabilities_fetcher_ios_unittest.mm
index cabaef8b..7b1751ff 100644
--- a/ios/chrome/browser/signin/account_capabilities_fetcher_ios_unittest.mm
+++ b/ios/chrome/browser/signin/account_capabilities_fetcher_ios_unittest.mm
@@ -92,7 +92,7 @@
                                        signin::Tribool::kUnknown);
 }
 
-// Check that a capability set to Unknown is received as Unknown.
+// Check that an unset capability is received as Unknown.
 TEST_F(AccountCapabilitiesFetcherIOSTest, CheckUnsetCapability) {
   TestCapabilityValueFetchedIsReceived(absl::nullopt,
                                        signin::Tribool::kUnknown);
diff --git a/ios/chrome/browser/ui/appearance/appearance_customization.mm b/ios/chrome/browser/ui/appearance/appearance_customization.mm
index 1737f73..8eb0d3ff 100644
--- a/ios/chrome/browser/ui/appearance/appearance_customization.mm
+++ b/ios/chrome/browser/ui/appearance/appearance_customization.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/appearance/appearance_customization.h"
 
-#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index 404d884..5797c2a9b 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -1837,7 +1837,7 @@
                                    completion:completion];
 }
 
-// TODO(crbug.com/906525) : Move WebStateListObserving out of
+// TODO(crbug.com/1403956) : Move WebStateListObserving out of
 // BrowserCoordinator.
 #pragma mark - WebStateListObserving
 
@@ -1863,7 +1863,7 @@
   [self stopNTPIfNeeded];
 }
 
-// TODO(crbug.com/906525) : Move out of BrowserCoordinator along with
+// TODO(crbug.com/1403956) : Move out of BrowserCoordinator along with
 // WebStateListObserving.
 #pragma mark - Private WebState management methods
 
@@ -2002,22 +2002,32 @@
   DCHECK(!_prerenderService ||
          !_prerenderService->IsWebStatePrerendered(webState));
 
+  // TODO(crbug.com/1403957): Move AutofillTabHelper logic inside
+  // TabLifecycleMediator.
   if (AutofillTabHelper::FromWebState(webState)) {
     AutofillTabHelper::FromWebState(webState)->SetBaseViewController(
         self.viewController);
   }
 
+  // TODO(crbug.com/1403959): Move PrintTabHelper logic inside
+  // TabLifecycleMediator.
   if (PrintTabHelper::FromWebState(webState)) {
     PrintTabHelper::FromWebState(webState)->set_printer(self.printController);
   }
 
+  // TODO(crbug.com/1403960): Move RepostFormTabHelper logic inside
+  // TabLifecycleMediator.
   RepostFormTabHelper::FromWebState(webState)->SetDelegate(self);
 
+  // TODO(crbug.com/1403962): Move FollowTabHelper logic inside
+  // TabLifecycleMediator.
   FollowTabHelper* followTabHelper = FollowTabHelper::FromWebState(webState);
   if (followTabHelper) {
     followTabHelper->set_follow_iph_presenter(self.followIPHCoordinator);
   }
 
+  // TODO(crbug.com/1403963): Move CaptivePortalTabHelper logic inside
+  // TabLifecycleMediator.
   if (CaptivePortalTabHelper::FromWebState(webState)) {
     TabInsertionBrowserAgent* insertionAgent =
         TabInsertionBrowserAgent::FromBrowser(self.browser);
@@ -2025,15 +2035,21 @@
         insertionAgent);
   }
 
+  // TODO(crbug.com/1403964): Move NewTabPageTabHelper logic inside
+  // TabLifecycleMediator.
   if (NewTabPageTabHelper::FromWebState(webState)) {
     NewTabPageTabHelper::FromWebState(webState)->SetDelegate(self);
   }
 
+  // TODO(crbug.com/1403967): Move AnnotationsTabHelper logic inside
+  // TabLifecycleMediator.
   if (AnnotationsTabHelper::FromWebState(webState)) {
     AnnotationsTabHelper::FromWebState(webState)->SetBaseViewController(
         self.viewController);
   }
 
+  // TODO(crbug.com/1403968): Move PriceNotificationsTabHelper logic inside
+  // TabLifecycleMediator.
   PriceNotificationsTabHelper* priceNotificationsTabHelper =
       PriceNotificationsTabHelper::FromWebState(webState);
   if (priceNotificationsTabHelper) {
@@ -2049,34 +2065,50 @@
     return;
   }
 
+  // TODO(crbug.com/1403957): Move AutofillTabHelper logic inside
+  // TabLifecycleMediator.
   if (AutofillTabHelper::FromWebState(webState)) {
     AutofillTabHelper::FromWebState(webState)->SetBaseViewController(nil);
   }
 
+  // TODO(crbug.com/1403959): Move PrintTabHelper logic inside
+  // TabLifecycleMediator.
   if (PrintTabHelper::FromWebState(webState)) {
     PrintTabHelper::FromWebState(webState)->set_printer(nil);
   }
 
+  // TODO(crbug.com/1403960): Move RepostFormTabHelper logic inside
+  // TabLifecycleMediator.
   RepostFormTabHelper::FromWebState(webState)->SetDelegate(nil);
 
+  // TODO(crbug.com/1403962): Move FollowTabHelper logic inside
+  // TabLifecycleMediator.
   FollowTabHelper* followTabHelper = FollowTabHelper::FromWebState(webState);
   if (followTabHelper) {
     followTabHelper->set_follow_iph_presenter(nil);
   }
 
+  // TODO(crbug.com/1403963): Move CaptivePortalTabHelper logic inside
+  // TabLifecycleMediator.
   if (CaptivePortalTabHelper::FromWebState(webState)) {
     CaptivePortalTabHelper::FromWebState(webState)->SetTabInsertionBrowserAgent(
         nil);
   }
 
+  // TODO(crbug.com/1403964): Move NewTabPageTabHelper logic inside
+  // TabLifecycleMediator.
   if (NewTabPageTabHelper::FromWebState(webState)) {
     NewTabPageTabHelper::FromWebState(webState)->SetDelegate(nil);
   }
 
+  // TODO(crbug.com/1403967): Move AnnotationsTabHelper logic inside
+  // TabLifecycleMediator.
   if (AnnotationsTabHelper::FromWebState(webState)) {
     AnnotationsTabHelper::FromWebState(webState)->SetBaseViewController(nil);
   }
 
+  // TODO(crbug.com/1403968): Move PriceNotificationsTabHelper logic inside
+  // TabLifecycleMediator.
   PriceNotificationsTabHelper* priceNotificationsTabHelper =
       PriceNotificationsTabHelper::FromWebState(webState);
   if (priceNotificationsTabHelper) {
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
index fb4b2da..e5fd770 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
@@ -27,8 +27,6 @@
     "content_suggestions_selection_actions.h",
     "content_suggestions_shortcut_tile_view.h",
     "content_suggestions_shortcut_tile_view.mm",
-    "content_suggestions_text_item.h",
-    "content_suggestions_text_item.mm",
     "content_suggestions_tile_layout_util.h",
     "content_suggestions_tile_layout_util.mm",
     "content_suggestions_tile_view.h",
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.h
deleted file mode 100644
index 2c5dfef..0000000
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 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_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_TEXT_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_TEXT_ITEM_H_
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
-#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h"
-
-// Item displaying two text labels.
-@interface ContentSuggestionsTextItem : CollectionViewItem<SuggestedContent>
-
-@property(nonatomic, nullable, copy) NSString* text;
-@property(nonatomic, nullable, copy) NSString* detailText;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_TEXT_ITEM_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm
deleted file mode 100644
index 15114c6..0000000
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2017 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/ui/content_suggestions/cells/content_suggestions_text_item.h"
-
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_cell.h"
-#import "ios/chrome/common/ui/colors/semantic_color_names.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@implementation ContentSuggestionsTextItem
-
-@synthesize text = _text;
-@synthesize detailText = _detailText;
-@synthesize suggestionIdentifier = _suggestionIdentifier;
-@synthesize metricsRecorded = _metricsRecorded;
-
-- (instancetype)initWithType:(NSInteger)type {
-  self = [super initWithType:type];
-  if (self) {
-    self.cellClass = [CollectionViewTextCell class];
-  }
-  return self;
-}
-
-- (void)configureCell:(CollectionViewTextCell*)cell {
-  [super configureCell:cell];
-
-  [self configureTextLabel:cell.textLabel];
-  [self configureDetailTextLabel:cell.detailTextLabel];
-
-  cell.isAccessibilityElement = YES;
-  if (self.detailText.length == 0) {
-    cell.accessibilityLabel = self.text;
-  } else {
-    cell.accessibilityLabel =
-        [NSString stringWithFormat:@"%@, %@", self.text, self.detailText];
-  }
-}
-
-- (CGFloat)cellHeightForWidth:(CGFloat)width {
-  UILabel* textLabel = [[UILabel alloc] init];
-  UILabel* detailTextLabel = [[UILabel alloc] init];
-  [self configureTextLabel:textLabel];
-  [self configureDetailTextLabel:detailTextLabel];
-
-  return [self.cellClass heightForTitleLabel:textLabel
-                             detailTextLabel:detailTextLabel
-                                       width:width];
-}
-
-#pragma mark - Private
-
-// Configures the `textLabel`.
-- (void)configureTextLabel:(UILabel*)textLabel {
-  textLabel.text = self.text;
-  textLabel.textColor = [UIColor colorNamed:kTextPrimaryColor];
-  textLabel.font =
-      [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
-  textLabel.adjustsFontForContentSizeCategory = YES;
-  textLabel.numberOfLines = 0;
-}
-
-// Configures the `detailTextLabel`.
-- (void)configureDetailTextLabel:(UILabel*)detailTextLabel {
-  detailTextLabel.text = self.detailText;
-  detailTextLabel.textColor = [UIColor colorNamed:kTextSecondaryColor];
-  detailTextLabel.font =
-      [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
-  detailTextLabel.adjustsFontForContentSizeCategory = YES;
-  detailTextLabel.numberOfLines = 0;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/download/activities/open_downloads_folder_activity.h b/ios/chrome/browser/ui/download/activities/open_downloads_folder_activity.h
index 210a5fd..035d75e 100644
--- a/ios/chrome/browser/ui/download/activities/open_downloads_folder_activity.h
+++ b/ios/chrome/browser/ui/download/activities/open_downloads_folder_activity.h
@@ -6,7 +6,6 @@
 #define IOS_CHROME_BROWSER_UI_DOWNLOAD_ACTIVITIES_OPEN_DOWNLOADS_FOLDER_ACTIVITY_H_
 
 #import <UIKit/UIKit.h>
-#import "ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller_delegate.h"
 
 @protocol BrowserCoordinatorCommands;
 
diff --git a/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm
index db4e11d..d5e51dc 100644
--- a/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm
@@ -10,6 +10,7 @@
 #import "base/notreached.h"
 #import "ios/chrome/browser/infobars/infobar_metrics_recorder.h"
 #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h"
+#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h"
 #import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_handler.h"
 #import "ios/chrome/browser/ui/permissions/permission_info.h"
 #import "ios/chrome/browser/ui/permissions/permission_metrics_util.h"
diff --git a/ios/chrome/browser/ui/permissions/permissions_delegate.h b/ios/chrome/browser/ui/permissions/permissions_delegate.h
index c1c46a0..ba2f288e 100644
--- a/ios/chrome/browser/ui/permissions/permissions_delegate.h
+++ b/ios/chrome/browser/ui/permissions/permissions_delegate.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_PERMISSIONS_PERMISSIONS_DELEGATE_H_
 #define IOS_CHROME_BROWSER_UI_PERMISSIONS_PERMISSIONS_DELEGATE_H_
 
-#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h"
+#import <Foundation/Foundation.h>
 
 @class PermissionInfo;
 
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index a674611..5b1c4e6 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -54,7 +54,6 @@
 #import "ios/chrome/browser/ui/icons/symbols.h"
 #import "ios/chrome/browser/ui/lens/lens_entrypoint.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
-#import "ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h"
 #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.h"
 #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_text_item.h"
 #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h"
diff --git a/ios/chrome/browser/ui/settings/cells/version_item.mm b/ios/chrome/browser/ui/settings/cells/version_item.mm
index f54ac478..5dc14c6 100644
--- a/ios/chrome/browser/ui/settings/cells/version_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/version_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/version_item.h"
 
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h"
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
index 8591de0..f2e6c708 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -43,8 +43,6 @@
 #import "ios/chrome/browser/signin/identity_manager_factory.h"
 #import "ios/chrome/browser/sync/sync_service_factory.h"
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/icons/symbols.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
index c134c98a..bafec7f5 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -431,7 +431,15 @@
 
 // Tests to open the sign-out confirmation dialog, and then open an external
 // URL.
-- (void)testInterruptDuringSignOutConfirmation {
+// TODO(crbug.com/1403825): Fails on device.
+#if TARGET_IPHONE_SIMULATOR
+#define MAYBE_testInterruptDuringSignOutConfirmation \
+  testInterruptDuringSignOutConfirmation
+#else
+#define MAYBE_testInterruptDuringSignOutConfirmation \
+  DISABLED_testInterruptDuringSignOutConfirmation
+#endif
+- (void)MAYBE_testInterruptDuringSignOutConfirmation {
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
 
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.mm
index d81dc54f..7a48d01 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.mm
@@ -51,7 +51,7 @@
   static const IconConfigs kSymbols = {
       true,
       [UIColor colorNamed:kRed500Color],
-      [UIColor colorNamed:kTextPrimaryColor],
+      [UIColor colorNamed:kPrimaryBackgroundColor],
       DefaultSymbolTemplateWithPointSize(kSyncErrorSymbol,
                                          kInfobarSymbolPointSize),
   };
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate_unittest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate_unittest.mm
index 65781d30..68c95bef 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate_unittest.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate_unittest.mm
@@ -64,7 +64,7 @@
       new SyncErrorInfoBarDelegate(chrome_browser_state_.get(), presenter));
 
   EXPECT_TRUE(delegate->UseIconBackgroundTint());
-  EXPECT_NSEQ([UIColor colorNamed:kTextPrimaryColor],
+  EXPECT_NSEQ([UIColor colorNamed:kPrimaryBackgroundColor],
               delegate -> GetIconImageTintColor());
   EXPECT_NSEQ([UIColor colorNamed:kRed500Color],
               delegate -> GetIconBackgroundColor());
diff --git a/ios/chrome/browser/ui/tab_switcher/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/BUILD.gn
index e4d3ff6..bf799a5a 100644
--- a/ios/chrome/browser/ui/tab_switcher/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/BUILD.gn
@@ -19,3 +19,22 @@
     "//url",
   ]
 }
+
+source_set("tab_utils") {
+  sources = [
+    "tab_utils.h",
+    "tab_utils.mm",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  deps = [
+    ":tab_switcher",
+    "//base",
+    "//ios/chrome/browser/tabs",
+    "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
+    "//ios/chrome/browser/url",
+    "//ios/chrome/browser/web_state_list",
+    "//ios/web/public",
+  ]
+}
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
index 5941364..56d4f332 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -41,7 +41,7 @@
     "//ios/chrome/browser/sessions:restoration_agent",
     "//ios/chrome/browser/sessions:serialisation",
     "//ios/chrome/browser/snapshots",
-    "//ios/chrome/browser/tabs",
+    "//ios/chrome/browser/tabs:tabs_internal",
     "//ios/chrome/browser/tabs_search",
     "//ios/chrome/browser/tabs_search:tabs_search_factory",
     "//ios/chrome/browser/ui:feature_flags",
@@ -68,6 +68,7 @@
     "//ios/chrome/browser/ui/sharing",
     "//ios/chrome/browser/ui/snackbar",
     "//ios/chrome/browser/ui/tab_switcher",
+    "//ios/chrome/browser/ui/tab_switcher:tab_utils",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs:features",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn
index 0aafb8a..6efed4b 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/BUILD.gn
@@ -18,8 +18,8 @@
     "//components/favicon/ios:ios",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/main",
-    "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui/tab_switcher",
+    "//ios/chrome/browser/ui/tab_switcher:tab_utils",
     "//ios/chrome/browser/url",
     "//ios/chrome/browser/web_state_list",
     "//ios/web",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm
index 33bafd50..7d6cec03 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm
@@ -15,10 +15,10 @@
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/main/browser_list.h"
 #import "ios/chrome/browser/main/browser_list_factory.h"
-#import "ios/chrome/browser/tabs/tab_title_util.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_collection_consumer.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/features.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_utils.h"
 #import "ios/chrome/browser/url/url_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
@@ -31,18 +31,6 @@
 
 namespace {
 
-// Constructs a TabSwitcherItem from a `web_state`.
-TabSwitcherItem* CreateItem(web::WebState* web_state) {
-  TabSwitcherItem* item = [[TabSwitcherItem alloc]
-      initWithIdentifier:web_state->GetStableIdentifier()];
-  // chrome://newtab (NTP) tabs have no title.
-  item.hidesTitle = IsURLNtp(web_state->GetVisibleURL());
-  item.title = tab_util::GetTabTitle(web_state);
-  item.showsActivity = web_state->IsLoading();
-
-  return item;
-}
-
 // Constructs an array of TabSwitcherItems from a `web_state_list`.
 NSArray* CreatePinnedTabConsumerItems(WebStateList* web_state_list) {
   NSMutableArray* items = [[NSMutableArray alloc] init];
@@ -54,44 +42,9 @@
     web::WebState* web_state = web_state_list->GetWebStateAt(i);
     [items addObject:CreateItem(web_state)];
   }
-
   return [items copy];
 }
 
-// Returns the ID of the active tab in `web_state_list`.
-NSString* GetActivePinnedWebStateId(WebStateList* web_state_list) {
-  if (!web_state_list) {
-    return nil;
-  }
-
-  int web_state_index = web_state_list->active_index();
-  if (web_state_index == WebStateList::kInvalidIndex) {
-    return nil;
-  }
-
-  if (!web_state_list->IsWebStatePinnedAt(web_state_index)) {
-    return nil;
-  }
-
-  // WebState cannot be null, so no need to check here.
-  web::WebState* web_state = web_state_list->GetWebStateAt(web_state_index);
-  return web_state->GetStableIdentifier();
-}
-
-// Returns the index of the pinned tab with `identifier` in `web_state_list`.
-// Returns WebStateList::kInvalidIndex if not found.
-int GetIndexOfPinnedTabWithId(WebStateList* web_state_list,
-                              NSString* identifier) {
-  for (int i = 0; i < web_state_list->GetIndexOfFirstNonPinnedWebState(); i++) {
-    web::WebState* web_state = web_state_list->GetWebStateAt(i);
-    if ([identifier isEqualToString:web_state->GetStableIdentifier()]) {
-      DCHECK(web_state_list->IsWebStatePinnedAt(i));
-      return i;
-    }
-  }
-  return WebStateList::kInvalidIndex;
-}
-
 }  // namespace
 
 @interface PinnedTabsMediator () <CRWWebStateObserver, WebStateListObserving>
@@ -169,13 +122,15 @@
   }
 
   if (!webStateList->IsWebStatePinnedAt(index)) {
-    [self.consumer selectItemWithID:GetActivePinnedWebStateId(webStateList)];
+    [self.consumer selectItemWithID:GetActiveWebStateIdentifier(
+                                        webStateList, /*pinned=*/YES)];
     return;
   }
 
-  [self.consumer insertItem:CreateItem(webState)
-                    atIndex:index
-             selectedItemID:GetActivePinnedWebStateId(webStateList)];
+  [self.consumer
+          insertItem:CreateItem(webState)
+             atIndex:index
+      selectedItemID:GetActiveWebStateIdentifier(webStateList, /*pinned=*/YES)];
 
   _scopedWebStateObservation->AddObservation(webState);
 }
@@ -233,12 +188,14 @@
   }
 
   if (!webStateList->IsWebStatePinnedAt(index)) {
-    [self.consumer selectItemWithID:GetActivePinnedWebStateId(webStateList)];
+    [self.consumer selectItemWithID:GetActiveWebStateIdentifier(
+                                        webStateList, /*pinned=*/YES)];
     return;
   }
 
   [self.consumer removeItemWithID:webState->GetStableIdentifier()
-                   selectedItemID:GetActivePinnedWebStateId(webStateList)];
+                   selectedItemID:GetActiveWebStateIdentifier(webStateList,
+                                                              /*pinned=*/YES)];
 
   _scopedWebStateObservation->RemoveObservation(webState);
 }
@@ -281,12 +238,14 @@
   if (webStateList->IsWebStatePinnedAt(index)) {
     [self.consumer insertItem:CreateItem(webState)
                       atIndex:index
-               selectedItemID:GetActivePinnedWebStateId(webStateList)];
+               selectedItemID:GetActiveWebStateIdentifier(webStateList,
+                                                          /*pinned=*/YES)];
 
     _scopedWebStateObservation->AddObservation(webState);
   } else {
     [self.consumer removeItemWithID:webState->GetStableIdentifier()
-                     selectedItemID:GetActivePinnedWebStateId(webStateList)];
+                     selectedItemID:GetActiveWebStateIdentifier(
+                                        webStateList, /*pinned=*/YES)];
 
     _scopedWebStateObservation->RemoveObservation(webState);
   }
@@ -327,7 +286,8 @@
 #pragma mark - PinnedTabsCommands
 
 - (void)selectItemWithID:(NSString*)itemID {
-  int index = GetIndexOfPinnedTabWithId(self.webStateList, itemID);
+  int index =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/YES);
   WebStateList* itemWebStateList = self.webStateList;
 
   if (index == WebStateList::kInvalidIndex) {
@@ -366,8 +326,9 @@
 }
 
 - (void)populateConsumerItems {
-  [self.consumer populateItems:CreatePinnedTabConsumerItems(self.webStateList)
-                selectedItemID:GetActivePinnedWebStateId(self.webStateList)];
+  [self.consumer
+       populateItems:CreatePinnedTabConsumerItems(self.webStateList)
+      selectedItemID:GetActiveWebStateIdentifier(self.webStateList, YES)];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
index 7fc62cf6..c2b7758 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -50,6 +50,7 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/features.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_item.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_utils.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/url_with_title.h"
 #import "ios/chrome/browser/url/chrome_url_constants.h"
@@ -69,18 +70,6 @@
 #endif
 
 namespace {
-// Constructs a TabSwitcherItem from a `web_state`.
-TabSwitcherItem* CreateItem(web::WebState* web_state) {
-  TabSwitcherItem* item = [[TabSwitcherItem alloc]
-      initWithIdentifier:web_state->GetStableIdentifier()];
-  // chrome://newtab (NTP) tabs have no title.
-  if (IsURLNtp(web_state->GetVisibleURL())) {
-    item.hidesTitle = YES;
-  }
-  item.title = tab_util::GetTabTitle(web_state);
-  item.showsActivity = web_state->IsLoading();
-  return item;
-}
 
 // Constructs an array of TabSwitcherItems from a `web_state_list` sorted by
 // last active time.
@@ -132,27 +121,6 @@
   return CreateItemsOrderedByIndex(web_state_list);
 }
 
-// Returns the ID of the active regular (non-pinned) WebState in the
-// `web_state_list`.
-NSString* GetActiveRegularWebStateId(WebStateList* web_state_list) {
-  if (!web_state_list)
-    return nil;
-
-  int web_state_index = web_state_list->active_index();
-  if (web_state_index == WebStateList::kInvalidIndex) {
-    return nil;
-  }
-
-  if (IsPinnedTabsEnabled() &&
-      web_state_list->IsWebStatePinnedAt(web_state_index)) {
-    return nil;
-  }
-
-  // WebState cannot be null, so no need to check here.
-  web::WebState* web_state = web_state_list->GetWebStateAt(web_state_index);
-  return web_state->GetStableIdentifier();
-}
-
 void LogPriceDropMetrics(web::WebState* web_state) {
   ShoppingPersistedDataTabHelper* shopping_helper =
       ShoppingPersistedDataTabHelper::FromWebState(web_state);
@@ -168,17 +136,6 @@
           .c_str()));
 }
 
-// Returns the index of the tab with `identifier` in `web_state_list`. Returns
-// WebStateList::kInvalidIndex if not found.
-int GetIndexOfTabWithId(WebStateList* web_state_list, NSString* identifier) {
-  for (int i = 0; i < web_state_list->count(); i++) {
-    web::WebState* web_state = web_state_list->GetWebStateAt(i);
-    if ([identifier isEqualToString:web_state->GetStableIdentifier()])
-      return i;
-  }
-  return WebStateList::kInvalidIndex;
-}
-
 // Returns the WebState with `identifier` in `browser_state`. Returns `nullptr`
 // if not found.
 web::WebState* GetWebStateWithId(ChromeBrowserState* browser_state,
@@ -190,7 +147,8 @@
                                     : browser_list->AllRegularBrowsers();
   for (Browser* browser : browsers) {
     WebStateList* web_state_list = browser->GetWebStateList();
-    int index = GetIndexOfTabWithId(web_state_list, identifier);
+    int index =
+        GetIndexOfTabWithIdentifier(web_state_list, identifier, /*pinned=*/NO);
     if (index != WebStateList::kInvalidIndex) {
       return web_state_list->GetWebStateAt(index);
     }
@@ -208,7 +166,8 @@
                                     : browser_list->AllRegularBrowsers();
   for (Browser* browser : browsers) {
     WebStateList* webStateList = browser->GetWebStateList();
-    int index = GetIndexOfTabWithId(webStateList, identifier);
+    int index =
+        GetIndexOfTabWithIdentifier(webStateList, identifier, /*pinned=*/NO);
     if (index != WebStateList::kInvalidIndex)
       return browser;
   }
@@ -326,14 +285,16 @@
   }
 
   if (IsPinnedTabsEnabled() && webStateList->IsWebStatePinnedAt(index)) {
-    [self.consumer selectItemWithID:GetActiveRegularWebStateId(webStateList)];
+    [self.consumer selectItemWithID:GetActiveWebStateIdentifier(webStateList,
+                                                                /*pinned=*/NO)];
     return;
   }
 
   NSUInteger itemIndex = [self itemIndexFromWebStateListIndex:index];
-  [self.consumer insertItem:CreateItem(webState)
-                    atIndex:itemIndex
-             selectedItemID:GetActiveRegularWebStateId(webStateList)];
+  [self.consumer
+          insertItem:CreateItem(webState)
+             atIndex:itemIndex
+      selectedItemID:GetActiveWebStateIdentifier(webStateList, /*pinned=*/NO)];
 
   _scopedWebStateObservation->AddObservation(webState);
 }
@@ -385,12 +346,14 @@
   }
 
   if (IsPinnedTabsEnabled() && webStateList->IsWebStatePinnedAt(index)) {
-    [self.consumer selectItemWithID:GetActiveRegularWebStateId(webStateList)];
+    [self.consumer selectItemWithID:GetActiveWebStateIdentifier(webStateList,
+                                                                /*pinned=*/NO)];
     return;
   }
 
   [self.consumer removeItemWithID:webState->GetStableIdentifier()
-                   selectedItemID:GetActiveRegularWebStateId(webStateList)];
+                   selectedItemID:GetActiveWebStateIdentifier(webStateList,
+                                                              /*pinned=*/NO)];
 
   _scopedWebStateObservation->RemoveObservation(webState);
 }
@@ -427,14 +390,16 @@
 
   if (IsPinnedTabsEnabled() && webStateList->IsWebStatePinnedAt(index)) {
     [self.consumer removeItemWithID:webState->GetStableIdentifier()
-                     selectedItemID:GetActiveRegularWebStateId(webStateList)];
+                     selectedItemID:GetActiveWebStateIdentifier(webStateList,
+                                                                /*pinned=*/NO)];
 
     _scopedWebStateObservation->RemoveObservation(webState);
   } else {
     NSUInteger itemIndex = [self itemIndexFromWebStateListIndex:index];
     [self.consumer insertItem:CreateItem(webState)
                       atIndex:itemIndex
-               selectedItemID:GetActiveRegularWebStateId(webStateList)];
+               selectedItemID:GetActiveWebStateIdentifier(webStateList,
+                                                          /*pinned=*/NO)];
 
     _scopedWebStateObservation->AddObservation(webState);
   }
@@ -498,7 +463,8 @@
 }
 
 - (void)moveItemWithID:(NSString*)itemID toIndex:(NSUInteger)destinationIndex {
-  int sourceIndex = GetIndexOfTabWithId(self.webStateList, itemID);
+  int sourceIndex =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/NO);
   if (sourceIndex != WebStateList::kInvalidIndex) {
     int destinationWebStateListIndex =
         [self webStateListIndexFromItemIndex:destinationIndex];
@@ -508,7 +474,8 @@
 }
 
 - (void)selectItemWithID:(NSString*)itemID {
-  int index = GetIndexOfTabWithId(self.webStateList, itemID);
+  int index =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/NO);
   WebStateList* itemWebStateList = self.webStateList;
   if (index == WebStateList::kInvalidIndex) {
     // If this is a search result, it may contain items from other windows -
@@ -523,7 +490,8 @@
     }
 
     itemWebStateList = browser->GetWebStateList();
-    index = GetIndexOfTabWithId(itemWebStateList, itemID);
+    index =
+        GetIndexOfTabWithIdentifier(itemWebStateList, itemID, /*pinned=*/NO);
     SceneState* targetSceneState =
         SceneStateBrowserAgent::FromBrowser(browser)->GetSceneState();
     SceneState* currentSceneState =
@@ -579,7 +547,8 @@
 }
 
 - (BOOL)isItemWithIDSelected:(NSString*)itemID {
-  int index = GetIndexOfTabWithId(self.webStateList, itemID);
+  int index =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/NO);
   if (index == WebStateList::kInvalidIndex) {
     return NO;
   }
@@ -587,7 +556,8 @@
 }
 
 - (void)pinItemWithID:(NSString*)itemID {
-  int index = GetIndexOfTabWithId(self.webStateList, itemID);
+  int index =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/NO);
   if (index == WebStateList::kInvalidIndex) {
     return;
   }
@@ -596,7 +566,8 @@
 }
 
 - (void)closeItemWithID:(NSString*)itemID {
-  int index = GetIndexOfTabWithId(self.webStateList, itemID);
+  int index =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/NO);
   if (index != WebStateList::kInvalidIndex) {
     self.webStateList->CloseWebStateAt(index, WebStateList::CLOSE_USER_ACTION);
     return;
@@ -619,7 +590,8 @@
   // associated web state list.
   if (browser) {
     WebStateList* itemWebStateList = browser->GetWebStateList();
-    index = GetIndexOfTabWithId(itemWebStateList, itemID);
+    index =
+        GetIndexOfTabWithIdentifier(itemWebStateList, itemID, /*pinned=*/NO);
     itemWebStateList->CloseWebStateAt(index, WebStateList::CLOSE_USER_ACTION);
   }
 }
@@ -633,7 +605,7 @@
   self.webStateList->PerformBatchOperation(
       base::BindOnce(^(WebStateList* list) {
         for (NSString* itemID in itemIDs) {
-          int index = GetIndexOfTabWithId(list, itemID);
+          int index = GetIndexOfTabWithIdentifier(list, itemID, /*pinned=*/NO);
           if (index != WebStateList::kInvalidIndex) {
             list->CloseWebStateAt(index, WebStateList::CLOSE_USER_ACTION);
           }
@@ -885,7 +857,8 @@
     // If the dropped tab is from the same Chrome window and has been removed,
     // cancel the drop operation.
     if (_dragItemID == tabInfo.tabID &&
-        GetIndexOfTabWithId(self.webStateList, tabInfo.tabID) ==
+        GetIndexOfTabWithIdentifier(self.webStateList, tabInfo.tabID,
+                                    /*pinned=*/NO) ==
             WebStateList::kInvalidIndex) {
       return UIDropOperationCancel;
     }
@@ -1056,7 +1029,8 @@
 // Calls `-populateItems:selectedItemID:` on the consumer.
 - (void)populateConsumerItems {
   [self.consumer populateItems:CreateItems(self.webStateList)
-                selectedItemID:GetActiveRegularWebStateId(self.webStateList)];
+                selectedItemID:GetActiveWebStateIdentifier(self.webStateList,
+                                                           /*pinned=*/NO)];
 }
 
 - (void)addWebStateObservations {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_strip/BUILD.gn
index 27fbf65..b782f5ffb9 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/BUILD.gn
@@ -37,10 +37,10 @@
   deps = [
     "//components/favicon/ios",
     "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui/icons:symbols",
     "//ios/chrome/browser/ui/image_util",
     "//ios/chrome/browser/ui/tab_switcher",
+    "//ios/chrome/browser/ui/tab_switcher:tab_utils",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/url",
     "//ios/chrome/browser/url:constants",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/tab_strip_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/tab_strip_mediator.mm
index a1cc605..b6ebd64 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/tab_strip_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/tab_strip_mediator.mm
@@ -6,9 +6,9 @@
 
 #import "components/favicon/ios/web_favicon_driver.h"
 #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#import "ios/chrome/browser/tabs/tab_title_util.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_strip/tab_strip_consumer.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_utils.h"
 #import "ios/chrome/browser/url/chrome_url_constants.h"
 #import "ios/chrome/browser/url/url_util.h"
 #import "ios/chrome/browser/web_state_list/all_web_state_observation_forwarder.h"
@@ -25,17 +25,6 @@
 #endif
 
 namespace {
-// Constructs a TabSwitcherItem from a `web_state`.
-TabSwitcherItem* CreateItem(web::WebState* web_state) {
-  TabSwitcherItem* item = [[TabSwitcherItem alloc]
-      initWithIdentifier:web_state->GetStableIdentifier()];
-  // chrome://newtab (NTP) tabs have no title.
-  if (IsURLNtp(web_state->GetVisibleURL())) {
-    item.hidesTitle = YES;
-  }
-  item.title = tab_util::GetTabTitle(web_state);
-  return item;
-}
 
 // Constructs an array of TabSwitcherItems from a `web_state_list`.
 NSArray* CreateItems(WebStateList* web_state_list) {
@@ -70,17 +59,6 @@
   return nullptr;
 }
 
-// Returns the index of the tab with `identifier` in `web_state_list`. Returns
-// -1 if not found.
-int GetIndexOfTabWithId(WebStateList* web_state_list, NSString* identifier) {
-  for (int i = 0; i < web_state_list->count(); i++) {
-    web::WebState* web_state = web_state_list->GetWebStateAt(i);
-    if ([identifier isEqualToString:web_state->GetStableIdentifier()])
-      return i;
-  }
-  return -1;
-}
-
 }  // namespace
 
 @interface TabStripMediator () <CRWWebStateObserver, WebStateListObserving> {
@@ -231,7 +209,8 @@
 }
 
 - (void)closeItemWithID:(NSString*)itemID {
-  int index = GetIndexOfTabWithId(self.webStateList, itemID);
+  int index =
+      GetIndexOfTabWithIdentifier(self.webStateList, itemID, /*pinned=*/NO);
   if (index >= 0)
     self.webStateList->CloseWebStateAt(index, WebStateList::CLOSE_USER_ACTION);
 }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_utils.h b/ios/chrome/browser/ui/tab_switcher/tab_utils.h
new file mode 100644
index 0000000..2327195a
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_utils.h
@@ -0,0 +1,32 @@
+// 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_UI_TAB_SWITCHER_TAB_UTILS_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_UTILS_H_
+
+#import <UIKit/UIKit.h>
+
+@class TabSwitcherItem;
+class WebStateList;
+
+namespace web {
+class WebState;
+}  // namespace web
+
+// Returns the index of the tab with `identifier` in `web_state_list`.
+// `pinned` tracks the pinned state of the tab we are looking for.
+// Returns WebStateList::kInvalidIndex if not found.
+int GetIndexOfTabWithIdentifier(WebStateList* web_state_list,
+                                NSString* identifier,
+                                BOOL pinned);
+
+// Returns the ID of the active tab in `web_state_list`.
+// `pinned` tracks the pinned state of the webState we are looking for.
+NSString* GetActiveWebStateIdentifier(WebStateList* web_state_list,
+                                      BOOL pinned);
+
+// Constructs a TabSwitcherItem from a `web_state`.
+TabSwitcherItem* CreateItem(web::WebState* web_state);
+
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_UTILS_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_utils.mm b/ios/chrome/browser/ui/tab_switcher/tab_utils.mm
new file mode 100644
index 0000000..7bad286
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_utils.mm
@@ -0,0 +1,74 @@
+// 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/ui/tab_switcher/tab_utils.h"
+
+#import "ios/chrome/browser/tabs/tab_title_util.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/features.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
+#import "ios/chrome/browser/url/url_util.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/web/public/web_state.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+int GetIndexOfTabWithIdentifier(WebStateList* web_state_list,
+                                NSString* identifier,
+                                BOOL pinned) {
+  int start, end;
+  if (pinned) {
+    DCHECK(IsPinnedTabsEnabled());
+    start = 0;
+    end = web_state_list->GetIndexOfFirstNonPinnedWebState();
+  } else {
+    start = web_state_list->GetIndexOfFirstNonPinnedWebState();
+    end = web_state_list->count();
+  }
+
+  for (int i = start; i < end; i++) {
+    web::WebState* web_state = web_state_list->GetWebStateAt(i);
+    if ([identifier isEqualToString:web_state->GetStableIdentifier()]) {
+      if (pinned) {
+        DCHECK(web_state_list->IsWebStatePinnedAt(i));
+      }
+      return i;
+    }
+  }
+  return WebStateList::kInvalidIndex;
+}
+
+NSString* GetActiveWebStateIdentifier(WebStateList* web_state_list,
+                                      BOOL pinned) {
+  if (!web_state_list) {
+    return nil;
+  }
+
+  int web_state_index = web_state_list->active_index();
+  if (web_state_index == WebStateList::kInvalidIndex) {
+    return nil;
+  }
+
+  if (IsPinnedTabsEnabled() &&
+      web_state_list->IsWebStatePinnedAt(web_state_index) && !pinned) {
+    return nil;
+  }
+
+  // WebState cannot be null, so no need to check here.
+  web::WebState* web_state = web_state_list->GetWebStateAt(web_state_index);
+  return web_state->GetStableIdentifier();
+}
+
+TabSwitcherItem* CreateItem(web::WebState* web_state) {
+  TabSwitcherItem* item = [[TabSwitcherItem alloc]
+      initWithIdentifier:web_state->GetStableIdentifier()];
+  // chrome://newtab (NTP) tabs have no title.
+  if (IsURLNtp(web_state->GetVisibleURL())) {
+    item.hidesTitle = YES;
+  }
+  item.title = tab_util::GetTabTitle(web_state);
+  item.showsActivity = web_state->IsLoading();
+  return item;
+}
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
index 5202d85f..debeb9a 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
@@ -7,7 +7,6 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/ntp/new_tab_page_controller_delegate.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_updating.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_consumer.h"
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_mediator.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_mediator.mm
index 9c04f43..914b6ba 100644
--- a/ios/chrome/browser/ui/toolbar/primary_toolbar_mediator.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_mediator.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/ui/toolbar/primary_toolbar_mediator.h"
 
 #import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h"
-#import "ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/web_state_list/active_web_state_observation_forwarder.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
diff --git a/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_strings_zh-TW.xtb b/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_strings_zh-TW.xtb
index 23b0082..b3772927 100644
--- a/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_strings_zh-TW.xtb
+++ b/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_strings_zh-TW.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
-<translation id="1545749641540134597">掃描 QR 圖碼</translation>
+<translation id="1545749641540134597">掃描 QR code</translation>
 <translation id="2204254829203467991">執行新搜尋</translation>
 <translation id="3060070342265818827">你複製的內容會顯示在這裡。</translation>
 <translation id="4056327302245368220">搜尋你複製的圖片</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb
index 1e2f562e..e27ed531 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb
@@ -24,7 +24,7 @@
 <translation id="7010831364920321713">無痕搜尋</translation>
 <translation id="7048549665319929185">搜尋或
 輸入網址</translation>
-<translation id="7317302007099170473">掃描 QR 圖碼</translation>
+<translation id="7317302007099170473">掃描 QR code</translation>
 <translation id="744668050028871192">搜尋</translation>
 <translation id="8104498668011127805">進入 Chrome 恐龍遊戲</translation>
 <translation id="8150601371542319992">智慧鏡頭</translation>
diff --git a/media/capture/video/mac/video_capture_device_avfoundation_mac.h b/media/capture/video/mac/video_capture_device_avfoundation_mac.h
index ec48e672..d9d2217 100644
--- a/media/capture/video/mac/video_capture_device_avfoundation_mac.h
+++ b/media/capture/video/mac/video_capture_device_avfoundation_mac.h
@@ -81,7 +81,8 @@
 // "next generation" moniker.
 CAPTURE_EXPORT
 @interface VideoCaptureDeviceAVFoundation
-    : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate> {
+    : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate,
+                AVCapturePhotoCaptureDelegate> {
  @private
   // The following attributes are set via -setCaptureHeight:width:frameRate:.
   int _frameWidth;
@@ -130,17 +131,20 @@
   std::vector<std::unique_ptr<media::SampleBufferTransformer>>
       _scaledFrameTransformers;
 
-  // An AVDataOutput specialized for taking pictures out of |captureSession_|.
-  base::scoped_nsobject<AVCaptureStillImageOutput> _stillImageOutput;
-  size_t _takePhotoStartedCount;
-  size_t _takePhotoPendingCount;
-  size_t _takePhotoCompletedCount;
-  bool _stillImageOutputWarmupCompleted;
+  // On macOS 10.15 or later, this has type AVCapturePhotoOutput.
+  // On earlier versions, this has type AVCaptureStillImageOutput.
+  // You say tomato, I say potato.
+  base::scoped_nsobject<id> _photoOutput;
+  // Only accessed on the main thread. The takePhoto() operation is considered
+  // pending until we're ready to take another photo, which involves a PostTask
+  // back to the main thread after the photo was taken.
+  size_t _pendingTakePhotos;
   std::unique_ptr<base::WeakPtrFactory<VideoCaptureDeviceAVFoundation>>
       _weakPtrFactoryForTakePhoto;
 
   // For testing.
-  base::RepeatingCallback<void()> _onStillImageOutputStopped;
+  base::RepeatingCallback<void()> _onPhotoOutputStopped;
+  bool _forceLegacyStillImageApi;
 
   scoped_refptr<base::SingleThreadTaskRunner> _mainThreadTaskRunner;
 }
@@ -206,8 +210,9 @@
 // formats. This implementation recognizes NV12.
 + (media::VideoPixelFormat)FourCCToChromiumPixelFormat:(FourCharCode)code;
 
-- (void)setOnStillImageOutputStoppedForTesting:
-    (base::RepeatingCallback<void()>)onStillImageOutputStopped;
+- (void)setOnPhotoOutputStoppedForTesting:
+    (base::RepeatingCallback<void()>)onPhotoOutputStopped;
+- (void)setForceLegacyStillImageApiForTesting:(bool)forceLegacyApi;
 
 // Use the below only for test.
 - (void)callLocked:(base::OnceClosure)lambda;
diff --git a/media/capture/video/mac/video_capture_device_avfoundation_mac.mm b/media/capture/video/mac/video_capture_device_avfoundation_mac.mm
index 82b18a8f..fa936dc 100644
--- a/media/capture/video/mac/video_capture_device_avfoundation_mac.mm
+++ b/media/capture/video/mac/video_capture_device_avfoundation_mac.mm
@@ -43,7 +43,7 @@
     gfx::ColorSpace::MatrixID::SMPTE170M,
     gfx::ColorSpace::RangeID::LIMITED);
 
-constexpr int kTimeToWaitBeforeStoppingStillImageCaptureInSeconds = 60;
+constexpr int kTimeToWaitBeforeStoppingPhotoOutputInSeconds = 60;
 constexpr FourCharCode kDefaultFourCCPixelFormat =
     kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;  // NV12 (a.k.a. 420v)
 
@@ -197,10 +197,10 @@
 }
 
 - (void)dealloc {
-  // Stopping a running still image output takes `_lock`. To avoid this
-  // happening inside stopCapture() below which would deadlock, we ensure that
-  // still image output is already stopped before taking `_lock`.
-  [self stopStillImageOutput];
+  // Stopping a running photo output takes `_lock`. To avoid this happening
+  // inside stopCapture() below which would deadlock, we ensure that the photo
+  // output is already stopped before taking `_lock`.
+  [self stopPhotoOutput];
   {
     // To avoid races with concurrent callbacks, grab the lock before stopping
     // capture and clearing all the variables.
@@ -239,7 +239,7 @@
     [self stopCapture];
     // Now remove the input and output from the capture session.
     [_captureSession removeOutput:_captureVideoDataOutput];
-    [self stopStillImageOutput];
+    [self stopPhotoOutput];
     if (_captureDeviceInput) {
       DCHECK(_captureDevice);
       [_captureSession stopRunning];
@@ -449,93 +449,101 @@
 - (void)stopCapture {
   DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
   _weakPtrFactoryForStallCheck.reset();
-  [self stopStillImageOutput];
+  [self stopPhotoOutput];
   if ([_captureSession isRunning])
     [_captureSession stopRunning];  // Synchronous.
   [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
 
+- (bool)useLegacyStillImageApi {
+  if (@available(macOS 10.15, *)) {
+    return _forceLegacyStillImageApi;
+  }
+  return true;
+}
+
+- (void)setForceLegacyStillImageApiForTesting:(bool)forceLegacyApi {
+  _forceLegacyStillImageApi = forceLegacyApi;
+}
+
 - (void)takePhoto {
   DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
   DCHECK([_captureSession isRunning]);
 
-  ++_takePhotoStartedCount;
+  ++_pendingTakePhotos;
+  if (_pendingTakePhotos > 1u) {
+    // There is already pending takePhoto(). When it finishes it will kick off
+    // the next takePhotoInternal(), so there is nothing more to do here.
+    return;
+  }
+  // `_pendingTakePhotos` just went from 0 to 1. In case the 60 second delayed
+  // task to perform stopPhotoOutput() is in-flight, invalidate weak ptrs to
+  // cancel any such operation.
+  _weakPtrFactoryForTakePhoto->InvalidateWeakPtrs();
 
   // Ready to take a photo immediately?
-  if (_stillImageOutput && _stillImageOutputWarmupCompleted) {
+  // Thread-safe because `_photoOutput` is only modified on the main thread.
+  if (_photoOutput) {
     [self takePhotoInternal];
     return;
   }
 
-  // Lazily instantiate the |_stillImageOutput| the first time takePhoto() is
-  // called. When takePhoto() isn't called, this avoids JPEG compession work for
-  // every frame. This can save a lot of CPU in some cases (see
-  // https://crbug.com/1116241). However because it can take a couple of second
-  // for the 3A to stabilize, lazily instantiating like may result in noticeable
-  // delays. To avoid delays in future takePhoto() calls we don't delete
-  // |_stillImageOutput| until takePhoto() has not been called for 60 seconds.
-  if (!_stillImageOutput) {
-    // We use AVCaptureStillImageOutput for historical reasons, but note that it
-    // has been deprecated in macOS 10.15[1] in favor of
-    // AVCapturePhotoOutput[2].
-    //
-    // [1]
-    // https://developer.apple.com/documentation/avfoundation/avcapturestillimageoutput
-    // [2]
-    // https://developer.apple.com/documentation/avfoundation/avcapturephotooutput
-    // TODO(https://crbug.com/1124322): Migrate to the new API.
-    _stillImageOutput.reset([[AVCaptureStillImageOutput alloc] init]);
-    if (!_stillImageOutput ||
-        ![_captureSession canAddOutput:_stillImageOutput]) {
-      // Complete this started photo as error.
-      ++_takePhotoPendingCount;
-      {
-        base::AutoLock lock(_lock);
-        if (_frameReceiver) {
-          _frameReceiver->OnPhotoError();
-        }
-      }
-      [self takePhotoCompleted];
-      return;
+  // Lazily instantiate `_photoOutput` so that if the app never calls
+  // takePhoto() we don't have to pay the associated performance cost, see
+  // https://crbug.com/1116241. This procedure is purposefully delayed by 3
+  // seconds because the camera needs to ramp up after re-configuring itself in
+  // order for 3A to stabilize or else the photo is dark/black.
+  {
+    // `_lock` is needed since `_photoOutput` may be read from non-main thread.
+    base::AutoLock lock(_lock);
+    if ([self useLegacyStillImageApi]) {
+      _photoOutput.reset([[AVCaptureStillImageOutput alloc] init]);
+    } else if (@available(macOS 10.15, *)) {
+      _photoOutput.reset([[AVCapturePhotoOutput alloc] init]);
+    } else {
+      NOTREACHED();
     }
-    [_captureSession addOutput:_stillImageOutput];
-    // A delay is needed before taking the photo or else the photo may be dark.
-    // 2 seconds was enough in manual testing; we delay by 3 for good measure.
-    _mainThreadTaskRunner->PostDelayedTask(
-        FROM_HERE,
-        base::BindOnce(
-            [](base::WeakPtr<VideoCaptureDeviceAVFoundation> weakSelf) {
-              [weakSelf.get() takePhotoInternal];
-            },
-            _weakPtrFactoryForTakePhoto->GetWeakPtr()),
-        base::Seconds(3));
   }
+  if (![_captureSession canAddOutput:_photoOutput]) {
+    {
+      base::AutoLock lock(_lock);
+      if (_frameReceiver) {
+        _frameReceiver->OnPhotoError();
+      }
+    }
+    [self takePhotoResolved];
+    return;
+  } else {
+    [_captureSession addOutput:_photoOutput];
+  }
+  // A delay is needed before taking the photo or else the photo may be dark.
+  // 2 seconds was enough in manual testing; we delay by 3 for good measure.
+  _mainThreadTaskRunner->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(
+          [](base::WeakPtr<VideoCaptureDeviceAVFoundation> weakSelf) {
+            [weakSelf.get() takePhotoInternal];
+          },
+          _weakPtrFactoryForTakePhoto->GetWeakPtr()),
+      base::Seconds(3));
 }
 
-- (void)setOnStillImageOutputStoppedForTesting:
-    (base::RepeatingCallback<void()>)onStillImageOutputStopped {
+- (void)setOnPhotoOutputStoppedForTesting:
+    (base::RepeatingCallback<void()>)onPhotoOutputStopped {
   DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
-  _onStillImageOutputStopped = onStillImageOutputStopped;
+  _onPhotoOutputStopped = onPhotoOutputStopped;
 }
 
 #pragma mark Private methods
 
 - (void)takePhotoInternal {
   DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
-  // stopStillImageOutput invalidates all weak ptrs, meaning in-flight
-  // operations are affectively cancelled. So if this method is running, still
-  // image output must be good to go.
   DCHECK([_captureSession isRunning]);
-  DCHECK(_stillImageOutput);
-  DCHECK([[_stillImageOutput connections] count] == 1);
-  AVCaptureConnection* const connection =
-      [[_stillImageOutput connections] firstObject];
-  DCHECK(connection);
-  _stillImageOutputWarmupCompleted = true;
-
-  // For all photos started that are not yet pending, take photos.
-  while (_takePhotoPendingCount < _takePhotoStartedCount) {
-    ++_takePhotoPendingCount;
+  // takePhotoInternal() can only happen when we have a `_photoOutput` because
+  // stopPhotoOutput() cancels in-flight operations by invalidating weak ptrs.
+  DCHECK(_photoOutput);
+  if ([self useLegacyStillImageApi]) {
+    // `_photoOutput` is of type AVCaptureStillImageOutput.
     const auto handler = ^(CMSampleBufferRef sampleBuffer, NSError* error) {
       {
         base::AutoLock lock(_lock);
@@ -552,7 +560,6 @@
             DCHECK_EQ(kCMVideoCodecType_JPEG,
                       CMFormatDescriptionGetMediaSubType(
                           CMSampleBufferGetFormatDescription(sampleBuffer)));
-
             char* baseAddress = 0;
             size_t length = 0;
             const bool sample_buffer_addressable =
@@ -567,75 +574,139 @@
           }
         }
       }
-      // Called both on success and failure.
+      // Whether we succeeded or failed, we need to resolve the pending
+      // takePhoto() operation.
       _mainThreadTaskRunner->PostTask(
           FROM_HERE,
           base::BindOnce(
               [](base::WeakPtr<VideoCaptureDeviceAVFoundation> weakSelf) {
-                [weakSelf.get() takePhotoCompleted];
+                [weakSelf.get() takePhotoResolved];
               },
               _weakPtrFactoryForTakePhoto->GetWeakPtr()));
     };
-    [_stillImageOutput captureStillImageAsynchronouslyFromConnection:connection
-                                                   completionHandler:handler];
+    AVCaptureStillImageOutput* image_output =
+        static_cast<AVCaptureStillImageOutput*>(_photoOutput.get());
+    DCHECK([[image_output connections] count] == 1);
+    AVCaptureConnection* const connection =
+        [[image_output connections] firstObject];
+    DCHECK(connection);
+    [image_output captureStillImageAsynchronouslyFromConnection:connection
+                                              completionHandler:handler];
+  } else if (@available(macOS 10.15, *)) {
+    // `_photoOutput` is of type AVCapturePhotoOutput.
+    @try {
+      // Asynchronous success or failure is handled inside
+      // captureOutput:didFinishProcessingPhoto:error on an unknown thread.
+      // Synchronous failures are handled in the catch clause below.
+      [_photoOutput
+          capturePhotoWithSettings:[AVCapturePhotoSettings
+                                       photoSettingsWithFormat:@{
+                                         AVVideoCodecKey : AVVideoCodecTypeJPEG
+                                       }]
+                          delegate:self];
+    } @catch (id exception) {
+      {
+        base::AutoLock lock(_lock);
+        if (_frameReceiver) {
+          _frameReceiver->OnPhotoError();
+        }
+      }
+      [self takePhotoResolved];
+    }
+  } else {
+    NOTREACHED();
   }
 }
 
-- (void)takePhotoCompleted {
-  DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
-  ++_takePhotoCompletedCount;
-  if (_takePhotoStartedCount != _takePhotoCompletedCount)
-    return;
-  // All pending takePhoto()s have completed. If no more photos are taken
-  // within 60 seconds, stop still image output to avoid expensive MJPEG
-  // conversions going forward.
-  _mainThreadTaskRunner->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(
-          [](base::WeakPtr<VideoCaptureDeviceAVFoundation> weakSelf,
-             size_t takePhotoCount) {
-            VideoCaptureDeviceAVFoundation* strongSelf = weakSelf.get();
-            if (!strongSelf)
-              return;
-            // Don't stop the still image output if takePhoto() was called
-            // while the task was pending.
-            if (strongSelf->_takePhotoStartedCount != takePhotoCount)
-              return;
-            [strongSelf stopStillImageOutput];
-          },
-          _weakPtrFactoryForTakePhoto->GetWeakPtr(), _takePhotoStartedCount),
-      base::Seconds(kTimeToWaitBeforeStoppingStillImageCaptureInSeconds));
-}
-
-- (void)stopStillImageOutput {
-  DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
-  if (!_stillImageOutput) {
-    // Already stopped.
-    return;
-  }
-  if (_captureSession) {
-    [_captureSession removeOutput:_stillImageOutput];
-  }
-  _stillImageOutput.reset();
-  _stillImageOutputWarmupCompleted = false;
-
-  // Cancel all in-flight operations.
-  _weakPtrFactoryForTakePhoto->InvalidateWeakPtrs();
-  // Report error for all pending calls that were stopped.
-  size_t pendingCalls = _takePhotoStartedCount - _takePhotoCompletedCount;
-  _takePhotoCompletedCount = _takePhotoPendingCount = _takePhotoStartedCount;
-  {
+// Callback for the `_photoOutput` operation started in takePhotoInternal().
+- (void)captureOutput:(id)output        // AVCapturePhotoOutput*
+    didFinishProcessingPhoto:(id)photo  // AVCapturePhoto*
+                       error:(NSError*)error {
+  if (@available(macOS 10.15, *)) {
     base::AutoLock lock(_lock);
+    // If `output` is no longer current, ignore the result of this operation.
+    // `_frameReceiver->OnPhotoError()` will already have been called inside
+    // stopPhotoOutput().
+    if (output != _photoOutput) {
+      return;
+    }
     if (_frameReceiver) {
-      for (size_t i = 0; i < pendingCalls; ++i) {
+      // Always non-nil according to Apple's documentation.
+      DCHECK(photo);
+      NSData* data = static_cast<AVCapturePhoto*>(photo).fileDataRepresentation;
+      if (!error && data) {
+        _frameReceiver->OnPhotoTaken(
+            reinterpret_cast<const uint8_t*>(data.bytes), data.length,
+            "image/jpeg");
+      } else {
         _frameReceiver->OnPhotoError();
       }
     }
+    // Whether we succeeded or failed, we need to resolve the pending
+    // takePhoto() operation.
+    _mainThreadTaskRunner->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            [](base::WeakPtr<VideoCaptureDeviceAVFoundation> weakSelf) {
+              [weakSelf.get() takePhotoResolved];
+            },
+            _weakPtrFactoryForTakePhoto->GetWeakPtr()));
+  } else {
+    NOTREACHED();
+  }
+}
+
+- (void)takePhotoResolved {
+  DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
+  --_pendingTakePhotos;
+  if (_pendingTakePhotos > 0u) {
+    // Take another photo.
+    [self takePhotoInternal];
+    return;
+  }
+  // All pending takePhoto()s have completed. If no more photos are taken
+  // within 60 seconds, stop photo output to avoid expensive MJPEG conversions
+  // going forward.
+  _mainThreadTaskRunner->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(
+          [](base::WeakPtr<VideoCaptureDeviceAVFoundation> weakSelf) {
+            [weakSelf.get() stopPhotoOutput];
+          },
+          _weakPtrFactoryForTakePhoto->GetWeakPtr()),
+      base::Seconds(kTimeToWaitBeforeStoppingPhotoOutputInSeconds));
+}
+
+- (void)stopPhotoOutput {
+  DCHECK(_mainThreadTaskRunner->BelongsToCurrentThread());
+  // Already stopped?
+  // Thread-safe because `_photoOutput` is only modified on the main thread.
+  if (!_photoOutput) {
+    return;
+  }
+  // Cancel all in-flight operations.
+  _weakPtrFactoryForTakePhoto->InvalidateWeakPtrs();
+  {
+    base::AutoLock lock(_lock);
+    if (_captureSession) {
+      [_captureSession removeOutput:_photoOutput];
+    }
+    // `_lock` is needed since `_photoOutput` may be read from non-main thread.
+    _photoOutput.reset();
+    // For every pending photo, report OnPhotoError().
+    if (_pendingTakePhotos) {
+      if (_frameReceiver) {
+        for (size_t i = 0; i < _pendingTakePhotos; ++i) {
+          _frameReceiver->OnPhotoError();
+        }
+      }
+      _pendingTakePhotos = 0u;
+    }
   }
 
-  if (_onStillImageOutputStopped) {
+  if (_onPhotoOutputStopped) {
     // Callback used by tests.
-    _onStillImageOutputStopped.Run();
+    _onPhotoOutputStopped.Run();
   }
 }
 
@@ -893,8 +964,7 @@
     // If we captured a frame since last check, then we aren't stalled.
     // We're also not considered stalled if takePhoto() is pending, avoiding
     // excessive capture restarts in unit tests with mock time.
-    if (_capturedFrameSinceLastStallCheck ||
-        _takePhotoStartedCount != _takePhotoCompletedCount) {
+    if (_capturedFrameSinceLastStallCheck || _pendingTakePhotos) {
       nextFailedCheckCount = 0;
     }
     _capturedFrameSinceLastStallCheck = NO;
diff --git a/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm b/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm
index cb890109..98286d3a 100644
--- a/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm
+++ b/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm
@@ -25,6 +25,9 @@
 #include "ui/gfx/color_space.h"
 
 using testing::_;
+using testing::Gt;
+using testing::Ne;
+using testing::Return;
 
 namespace media {
 
@@ -419,199 +422,228 @@
   }));
 }
 
-TEST(VideoCaptureDeviceAVFoundationMacTest, TakePhoto) {
-  RunTestCase(base::BindOnce([] {
-    NSString* deviceId = GetFirstDeviceId();
-    if (!deviceId) {
-      DVLOG(1) << "No camera available. Exiting test.";
-      return;
-    }
-
-    testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
-        frame_receiver;
+class VideoCaptureDeviceAVFoundationMacTakePhotoTest
+    : public testing::TestWithParam<bool> {
+ public:
+  base::scoped_nsobject<VideoCaptureDeviceAVFoundation> CreateCaptureDevice(
+      testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>*
+          frame_receiver) {
     base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice(
         [[VideoCaptureDeviceAVFoundation alloc]
-            initWithFrameReceiver:&frame_receiver]);
+            initWithFrameReceiver:frame_receiver]);
+    [captureDevice setForceLegacyStillImageApiForTesting:GetParam()];
+    return captureDevice;
+  }
+};
 
-    NSString* errorMessage = nil;
-    ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
-                                   errorMessage:&errorMessage]);
-    ASSERT_TRUE([captureDevice startCapture]);
+TEST_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest, TakePhoto) {
+  RunTestCase(base::BindOnce(
+      [](VideoCaptureDeviceAVFoundationMacTakePhotoTest* thiz) {
+        NSString* deviceId = GetFirstDeviceId();
+        if (!deviceId) {
+          DVLOG(1) << "No camera available. Exiting test.";
+          return;
+        }
 
-    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
-    EXPECT_CALL(frame_receiver, OnPhotoTaken)
-        .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
-    [captureDevice takePhoto];
-    run_loop.Run();
-  }));
+        testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
+            frame_receiver;
+        base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice =
+            thiz->CreateCaptureDevice(&frame_receiver);
+
+        NSString* errorMessage = nil;
+        ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
+                                       errorMessage:&errorMessage]);
+        ASSERT_TRUE([captureDevice startCapture]);
+
+        base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+        EXPECT_CALL(frame_receiver, OnPhotoTaken)
+
+            .WillOnce([&run_loop](const uint8_t* image_data,
+                                  size_t image_length,
+                                  const std::string& mime_type) {
+              EXPECT_TRUE(image_data);
+              EXPECT_GT(image_length, 0u);
+              EXPECT_EQ(mime_type, "image/jpeg");
+              run_loop.Quit();
+            });
+        [captureDevice takePhoto];
+        run_loop.Run();
+      },
+      this));
 }
 
-TEST(VideoCaptureDeviceAVFoundationMacTest, StopCaptureWhileTakingPhoto) {
-  RunTestCase(base::BindOnce([] {
-    NSString* deviceId = GetFirstDeviceId();
-    if (!deviceId) {
-      DVLOG(1) << "No camera available. Exiting test.";
-      return;
-    }
+TEST_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+       StopCaptureWhileTakingPhoto) {
+  RunTestCase(base::BindOnce(
+      [](VideoCaptureDeviceAVFoundationMacTakePhotoTest* thiz) {
+        NSString* deviceId = GetFirstDeviceId();
+        if (!deviceId) {
+          DVLOG(1) << "No camera available. Exiting test.";
+          return;
+        }
 
-    testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
-        frame_receiver;
-    base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice(
-        [[VideoCaptureDeviceAVFoundation alloc]
-            initWithFrameReceiver:&frame_receiver]);
+        testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
+            frame_receiver;
+        base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice =
+            thiz->CreateCaptureDevice(&frame_receiver);
 
-    NSString* errorMessage = nil;
-    ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
-                                   errorMessage:&errorMessage]);
-    ASSERT_TRUE([captureDevice startCapture]);
+        NSString* errorMessage = nil;
+        ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
+                                       errorMessage:&errorMessage]);
+        ASSERT_TRUE([captureDevice startCapture]);
 
-    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
-    EXPECT_CALL(frame_receiver, OnPhotoError())
-        .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
-    [captureDevice takePhoto];
-    // There is no risk that takePhoto() has successfully finishes before
-    // stopCapture() because the takePhoto() call involes a PostDelayedTask()
-    // that cannot run until RunLoop::Run() below.
-    [captureDevice stopCapture];
-    run_loop.Run();
-  }));
+        base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+        EXPECT_CALL(frame_receiver, OnPhotoError())
+            .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
+        [captureDevice takePhoto];
+        // There is no risk that takePhoto() has successfully finishes before
+        // stopCapture() because the takePhoto() call involes a
+        // PostDelayedTask() that cannot run until RunLoop::Run() below.
+        [captureDevice stopCapture];
+        run_loop.Run();
+      },
+      this));
 }
 
-TEST(VideoCaptureDeviceAVFoundationMacTest, MultiplePendingTakePhotos) {
-  RunTestCase(base::BindOnce([] {
-    NSString* deviceId = GetFirstDeviceId();
-    if (!deviceId) {
-      DVLOG(1) << "No camera available. Exiting test.";
-      return;
-    }
+TEST_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+       MultiplePendingTakePhotos) {
+  RunTestCase(base::BindOnce(
+      [](VideoCaptureDeviceAVFoundationMacTakePhotoTest* thiz) {
+        NSString* deviceId = GetFirstDeviceId();
+        if (!deviceId) {
+          DVLOG(1) << "No camera available. Exiting test.";
+          return;
+        }
 
-    testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
-        frame_receiver;
-    base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice(
-        [[VideoCaptureDeviceAVFoundation alloc]
-            initWithFrameReceiver:&frame_receiver]);
+        testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
+            frame_receiver;
+        base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice =
+            thiz->CreateCaptureDevice(&frame_receiver);
 
-    NSString* errorMessage = nil;
-    ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
-                                   errorMessage:&errorMessage]);
-    ASSERT_TRUE([captureDevice startCapture]);
+        NSString* errorMessage = nil;
+        ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
+                                       errorMessage:&errorMessage]);
+        ASSERT_TRUE([captureDevice startCapture]);
 
-    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
-    size_t photos_taken_count = 0;
-    EXPECT_CALL(frame_receiver, OnPhotoTaken)
-        .WillRepeatedly([&photos_taken_count, &run_loop] {
-          ++photos_taken_count;
-          if (photos_taken_count == 3) {
-            run_loop.Quit();
-          }
-        });
-    [captureDevice takePhoto];
-    [captureDevice takePhoto];
-    [captureDevice takePhoto];
-    run_loop.Run();
-  }));
+        base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+        EXPECT_CALL(frame_receiver, OnPhotoTaken(Ne(nullptr), Gt(0u), _))
+            .WillOnce(Return())
+            .WillOnce(Return())
+            .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
+        [captureDevice takePhoto];
+        [captureDevice takePhoto];
+        [captureDevice takePhoto];
+        run_loop.Run();
+      },
+      this));
 }
 
-TEST(VideoCaptureDeviceAVFoundationMacTest,
-     StopCaptureWhileMultiplePendingTakePhotos) {
-  RunTestCase(base::BindOnce([] {
-    NSString* deviceId = GetFirstDeviceId();
-    if (!deviceId) {
-      DVLOG(1) << "No camera available. Exiting test.";
-      return;
-    }
+TEST_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+       StopCaptureWhileMultiplePendingTakePhotos) {
+  RunTestCase(base::BindOnce(
+      [](VideoCaptureDeviceAVFoundationMacTakePhotoTest* thiz) {
+        NSString* deviceId = GetFirstDeviceId();
+        if (!deviceId) {
+          DVLOG(1) << "No camera available. Exiting test.";
+          return;
+        }
 
-    testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
-        frame_receiver;
-    base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice(
-        [[VideoCaptureDeviceAVFoundation alloc]
-            initWithFrameReceiver:&frame_receiver]);
+        testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
+            frame_receiver;
+        base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice =
+            thiz->CreateCaptureDevice(&frame_receiver);
 
-    NSString* errorMessage = nil;
-    ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
-                                   errorMessage:&errorMessage]);
-    ASSERT_TRUE([captureDevice startCapture]);
+        NSString* errorMessage = nil;
+        ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
+                                       errorMessage:&errorMessage]);
+        ASSERT_TRUE([captureDevice startCapture]);
 
-    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
-    size_t photo_error_count = 0;
-    EXPECT_CALL(frame_receiver, OnPhotoError)
-        .WillRepeatedly([&photo_error_count, &run_loop] {
-          ++photo_error_count;
-          if (photo_error_count == 3) {
-            run_loop.Quit();
-          }
-        });
-    [captureDevice takePhoto];
-    [captureDevice takePhoto];
-    [captureDevice takePhoto];
-    // There is no risk that takePhoto() has successfully finishes before
-    // stopCapture() because the takePhoto() calls involes a PostDelayedTask()
-    // that cannot run until RunLoop::Run() below.
-    [captureDevice stopCapture];
-    run_loop.Run();
-  }));
+        base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+        EXPECT_CALL(frame_receiver, OnPhotoError)
+            .WillOnce(Return())
+            .WillOnce(Return())
+            .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
+        [captureDevice takePhoto];
+        [captureDevice takePhoto];
+        [captureDevice takePhoto];
+        // There is no risk that takePhoto() has successfully finishes before
+        // stopCapture() because the takePhoto() calls involes a
+        // PostDelayedTask() that cannot run until RunLoop::Run() below.
+        [captureDevice stopCapture];
+        run_loop.Run();
+      },
+      this));
 }
 
-TEST(VideoCaptureDeviceAVFoundationMacTest,
-     StopStillImageOutputWhenNoLongerTakingPhotos) {
-  RunTestCase(base::BindOnce([] {
-    NSString* deviceId = GetFirstDeviceId();
-    if (!deviceId) {
-      DVLOG(1) << "No camera available. Exiting test.";
-      return;
-    }
+TEST_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+       StopPhotoOutputWhenNoLongerTakingPhotos) {
+  RunTestCase(base::BindOnce(
+      [](VideoCaptureDeviceAVFoundationMacTakePhotoTest* thiz) {
+        NSString* deviceId = GetFirstDeviceId();
+        if (!deviceId) {
+          DVLOG(1) << "No camera available. Exiting test.";
+          return;
+        }
 
-    testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
-        frame_receiver;
-    base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice(
-        [[VideoCaptureDeviceAVFoundation alloc]
-            initWithFrameReceiver:&frame_receiver]);
+        testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
+            frame_receiver;
+        base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice =
+            thiz->CreateCaptureDevice(&frame_receiver);
 
-    NSString* errorMessage = nil;
-    ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
-                                   errorMessage:&errorMessage]);
-    ASSERT_TRUE([captureDevice startCapture]);
+        NSString* errorMessage = nil;
+        ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
+                                       errorMessage:&errorMessage]);
+        ASSERT_TRUE([captureDevice startCapture]);
 
-    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
-    [captureDevice
-        setOnStillImageOutputStoppedForTesting:run_loop.QuitClosure()];
-    base::TimeTicks start_time = base::TimeTicks::Now();
-    [captureDevice takePhoto];
-    // The RunLoop automatically advances mocked time when there are delayed
-    // tasks pending. This allows the test to run fast and still assert how much
-    // mocked time has elapsed.
-    run_loop.Run();
-    auto time_elapsed = base::TimeTicks::Now() - start_time;
-    // Still image output is not stopped until 60 seconds of inactivity, so the
-    // mocked time must have advanced at least this much.
-    EXPECT_GE(time_elapsed.InSeconds(), 60);
-  }));
+        base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+        [captureDevice
+            setOnPhotoOutputStoppedForTesting:run_loop.QuitClosure()];
+        base::TimeTicks start_time = base::TimeTicks::Now();
+        [captureDevice takePhoto];
+        // The RunLoop automatically advances mocked time when there are delayed
+        // tasks pending. This allows the test to run fast and still assert how
+        // much mocked time has elapsed.
+        run_loop.Run();
+        auto time_elapsed = base::TimeTicks::Now() - start_time;
+        // Still image output is not stopped until 60 seconds of inactivity, so
+        // the mocked time must have advanced at least this much.
+        EXPECT_GE(time_elapsed.InSeconds(), 60);
+      },
+      this));
 }
 
-TEST(VideoCaptureDeviceAVFoundationMacTest,
-     TakePhotoAndShutDownWithoutWaiting) {
-  RunTestCase(base::BindOnce([] {
-    NSString* deviceId = GetFirstDeviceId();
-    if (!deviceId) {
-      DVLOG(1) << "No camera available. Exiting test.";
-      return;
-    }
+TEST_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+       TakePhotoAndShutDownWithoutWaiting) {
+  RunTestCase(base::BindOnce(
+      [](VideoCaptureDeviceAVFoundationMacTakePhotoTest* thiz) {
+        NSString* deviceId = GetFirstDeviceId();
+        if (!deviceId) {
+          DVLOG(1) << "No camera available. Exiting test.";
+          return;
+        }
 
-    testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
-        frame_receiver;
-    base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice(
-        [[VideoCaptureDeviceAVFoundation alloc]
-            initWithFrameReceiver:&frame_receiver]);
+        testing::NiceMock<MockVideoCaptureDeviceAVFoundationFrameReceiver>
+            frame_receiver;
+        base::scoped_nsobject<VideoCaptureDeviceAVFoundation> captureDevice =
+            thiz->CreateCaptureDevice(&frame_receiver);
 
-    NSString* errorMessage = nil;
-    ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
-                                   errorMessage:&errorMessage]);
-    ASSERT_TRUE([captureDevice startCapture]);
+        NSString* errorMessage = nil;
+        ASSERT_TRUE([captureDevice setCaptureDevice:deviceId
+                                       errorMessage:&errorMessage]);
+        ASSERT_TRUE([captureDevice startCapture]);
 
-    [captureDevice takePhoto];
-  }));
+        [captureDevice takePhoto];
+      },
+      this));
 }
 
+// When not forcing legacy API, AVCapturePhotoOutput is used if available
+// (macOS 10.15+). Otherwise AVCaptureStillImageOutput is used.
+INSTANTIATE_TEST_SUITE_P(VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+                         VideoCaptureDeviceAVFoundationMacTakePhotoTest,
+                         // Force legacy API?
+                         testing::Values(false, true));
+
 TEST(VideoCaptureDeviceAVFoundationMacTest, ForwardsOddPixelBufferResolution) {
   // See crbug/1168112.
   RunTestCase(base::BindOnce([] {
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 9019700..d9c592b 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2023-01-03 12:55 UTC
+# Last updated: 2023-01-04 12:54 UTC
 PinsListTimestamp
-1672750516
+1672836899
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb
index 76ddf92..25ac07f 100644
--- a/remoting/resources/remoting_strings_es.xtb
+++ b/remoting/resources/remoting_strings_es.xtb
@@ -118,7 +118,7 @@
 <translation id="6062854958530969723">Error al iniciar el host.</translation>
 <translation id="6099500228377758828">Servicio de Escritorio Remoto de Chrome</translation>
 <translation id="6122191549521593678">Online</translation>
-<translation id="6178645564515549384">Host de mensajes nativo para asistencia remota</translation>
+<translation id="6178645564515549384">Host de mensajería nativa para asistencia remota</translation>
 <translation id="618120821413932081">Actualiza la resolución del escritorio remoto para que se ajuste a la ventana</translation>
 <translation id="6223301979382383752">Abrir preferencias de Grabación de la pantalla</translation>
 <translation id="6284412385303060032">Se ha cerrado el host que se ejecuta en la pantalla de inicio de sesión de la consola para poder admitir el modo de cortina. Para ello, se ha cambiado a un host que se ejecuta en una sesión específica de usuario.</translation>
@@ -178,7 +178,7 @@
 <translation id="8428213095426709021">Configuración</translation>
 <translation id="8445362773033888690">Ver en Google Play Store</translation>
 <translation id="8509907436388546015">Proceso de integración del escritorio</translation>
-<translation id="8513093439376855948">Host de mensajes nativo para administración de host de forma remota</translation>
+<translation id="8513093439376855948">Host de mensajería nativa para administración de host de forma remota</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
 <translation id="858006550102277544">Comentario</translation>
 <translation id="8743328882720071828">¿Permitir que <ph name="CLIENT_USERNAME" /> vea y controle tu ordenador?</translation>
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index ad074f9..cf4a2b20 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1930,7 +1930,7 @@
       {
         "args": [],
         "cros_board": "dedede",
-        "cros_img": "dedede-release/R111-15300.0.0",
+        "cros_img": "dedede-release/R111-15301.0.0",
         "name": "lacros_all_tast_tests DEDEDE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -1978,7 +1978,7 @@
       {
         "args": [],
         "cros_board": "dedede",
-        "cros_img": "dedede-release/R108-15183.59.0",
+        "cros_img": "dedede-release/R108-15183.69.0",
         "name": "lacros_all_tast_tests DEDEDE_RELEASE_STABLE",
         "resultdb": {
           "enable": true,
@@ -1994,7 +1994,7 @@
       {
         "args": [],
         "cros_board": "eve",
-        "cros_img": "eve-release/R111-15300.0.0",
+        "cros_img": "eve-release/R111-15301.0.0",
         "name": "lacros_all_tast_tests EVE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2137,7 +2137,7 @@
       {
         "args": [],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R111-15300.0.0",
+        "cros_img": "jacuzzi-release/R111-15301.0.0",
         "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2242,7 +2242,7 @@
       {
         "args": [],
         "cros_board": "herobrine",
-        "cros_img": "herobrine-release/R111-15300.0.0",
+        "cros_img": "herobrine-release/R111-15301.0.0",
         "name": "lacros_fyi_tast_tests HEROBRINE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json
index 8fdee70..84b076f6 100644
--- a/testing/buildbot/chromium.angle.json
+++ b/testing/buildbot/chromium.angle.json
@@ -1194,9 +1194,7 @@
           "--expected-vendor-id",
           "8086",
           "--expected-device-id",
-          "3e92",
-          "--expected-device-id",
-          "5912"
+          "9bc5"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -1214,7 +1212,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -1235,7 +1233,7 @@
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--webgl-conformance-version=2.0.1",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -1253,7 +1251,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -1274,7 +1272,7 @@
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -1292,7 +1290,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -1313,7 +1311,7 @@
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -1331,7 +1329,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -1351,7 +1349,7 @@
           "-v",
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -1369,7 +1367,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index 2d736243..2395a44f 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -5150,7 +5150,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5181,7 +5181,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5212,7 +5212,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5242,7 +5242,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5270,7 +5270,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5305,7 +5305,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5333,7 +5333,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5377,7 +5377,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5419,7 +5419,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5459,7 +5459,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5502,7 +5502,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5544,7 +5544,7 @@
               "pool": "chromium.tests.gpu"
             },
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5557,7 +5557,7 @@
   },
   "Dawn Win10 x64 Builder": {},
   "Dawn Win10 x64 DEPS Builder": {},
-  "Dawn Win10 x64 DEPS Release (Intel HD 630)": {
+  "Dawn Win10 x64 DEPS Release (Intel)": {
     "gtest_tests": [
       {
         "args": [
@@ -5573,7 +5573,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5599,7 +5599,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5611,7 +5611,7 @@
       },
       {
         "args": [
-          "--enable-backend-validation=partial",
+          "--enable-backend-validation",
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
           "--exclusive-device-type-preference=discrete,integrated"
@@ -5625,7 +5625,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5651,7 +5651,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5676,7 +5676,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5699,7 +5699,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5729,7 +5729,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5752,7 +5752,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5790,7 +5790,44 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
+      },
+      {
+        "args": [
+          "--flag-specific=webgpu-with-backend-validation",
+          "--timeout-ms=30000",
+          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
+          "--target=Release_x64",
+          "--git-revision=${got_revision}"
+        ],
+        "isolate_name": "webgpu_blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "webgpu_blink_web_tests_with_backend_validation",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5825,7 +5862,45 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 14
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webgpu_cts",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--enable-dawn-backend-validation",
+          "--jobs=1"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgpu_cts_with_validation_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5863,7 +5938,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5900,7 +5975,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -5937,7 +6012,47 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webgpu_cts",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--use-webgpu-adapter=swiftshader",
+          "--test-filter=*web_platform*",
+          "--enable-dawn-backend-validation",
+          "--jobs=1"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgpu_swiftshader_web_platform_cts_with_validation_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -6459,6 +6574,42 @@
     ]
   },
   "Dawn Win10 x64 Experimental Release (Intel)": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "noop_sleep",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "noop_sleep_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      }
+    ]
+  },
+  "Dawn Win10 x64 Release (Intel)": {
     "gtest_tests": [
       {
         "args": [
@@ -6479,7 +6630,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -6506,7 +6656,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -6533,7 +6682,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -6560,7 +6708,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -6586,7 +6733,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
         },
@@ -6610,7 +6756,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "gl_unittests",
@@ -6641,7 +6786,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
@@ -6665,7 +6809,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -6704,7 +6847,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -6742,7 +6884,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -6778,7 +6919,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 14
@@ -6817,7 +6957,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 14
@@ -6856,7 +6995,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -6894,7 +7032,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -6932,7 +7069,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
@@ -6973,400 +7109,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
-  "Dawn Win10 x64 Release (Intel HD 630)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-toggles=skip_validation",
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_skip_validation_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-backend-validation=partial",
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_validation_layers_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-wire",
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_wire_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=passthrough",
-          "--use-gl=angle",
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_tests_passthrough",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "--override-steps=1",
-          "--gtest-benchmark-name=dawn_perf_tests",
-          "-v"
-        ],
-        "isolate_name": "dawn_perf_tests",
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "dawn_perf_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
-      },
-      {
-        "isolate_name": "telemetry_gpu_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_gpu_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--target=Release_x64",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-swiftshader",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--target=Release_x64",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_swiftshader_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-swiftshader-with-backend-validation",
-          "--timeout-ms=30000",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--target=Release_x64",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
-          "--use-webgpu-adapter=swiftshader",
-          "--test-filter=*web_platform*",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_swiftshader_web_platform_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
@@ -7885,7 +7627,7 @@
   },
   "Dawn Win10 x86 Builder": {},
   "Dawn Win10 x86 DEPS Builder": {},
-  "Dawn Win10 x86 DEPS Release (Intel HD 630)": {
+  "Dawn Win10 x86 DEPS Release (Intel)": {
     "gtest_tests": [
       {
         "args": [
@@ -7901,7 +7643,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -7927,7 +7669,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -7939,7 +7681,7 @@
       },
       {
         "args": [
-          "--enable-backend-validation=partial",
+          "--enable-backend-validation",
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
           "--exclusive-device-type-preference=discrete,integrated"
@@ -7953,7 +7695,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -7979,7 +7721,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8004,7 +7746,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8027,7 +7769,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8040,6 +7782,33 @@
     ],
     "isolated_scripts": [
       {
+        "args": [
+          "--override-steps=1",
+          "--gtest-benchmark-name=dawn_perf_tests",
+          "-v"
+        ],
+        "isolate_name": "dawn_perf_tests",
+        "merge": {
+          "args": [
+            "--smoke-test-mode"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "dawn_perf_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
+      },
+      {
         "isolate_name": "telemetry_gpu_unittests",
         "merge": {
           "args": [],
@@ -8053,7 +7822,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8090,7 +7859,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8126,7 +7895,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8161,7 +7930,45 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 14
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webgpu_cts",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--enable-dawn-backend-validation",
+          "--jobs=1"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgpu_cts_with_validation_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8198,7 +8005,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8234,7 +8041,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8271,7 +8078,47 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webgpu_cts",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--use-webgpu-adapter=swiftshader",
+          "--test-filter=*web_platform*",
+          "--enable-dawn-backend-validation",
+          "--jobs=1"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgpu_swiftshader_web_platform_cts_with_validation_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -8789,6 +8636,42 @@
     ]
   },
   "Dawn Win10 x86 Experimental Release (Intel)": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "noop_sleep",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "noop_sleep_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      }
+    ]
+  },
+  "Dawn Win10 x86 Release (Intel)": {
     "gtest_tests": [
       {
         "args": [
@@ -8809,7 +8692,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -8836,7 +8718,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -8863,7 +8744,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -8890,7 +8770,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "dawn_end2end_tests",
@@ -8916,7 +8795,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
         },
@@ -8940,7 +8818,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "gl_unittests",
@@ -8971,7 +8848,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
@@ -8995,7 +8871,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -9033,7 +8908,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -9070,7 +8944,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -9106,7 +8979,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 14
@@ -9145,7 +9017,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 14
@@ -9183,7 +9054,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -9220,7 +9090,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
@@ -9258,7 +9127,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
@@ -9299,406 +9167,6 @@
               "pool": "chromium.tests.gpu"
             }
           ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
-  "Dawn Win10 x86 Release (Intel HD 630)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-toggles=skip_validation",
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_skip_validation_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-backend-validation=partial",
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_validation_layers_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-wire",
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--exclusive-device-type-preference=discrete,integrated"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "dawn_end2end_wire_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=passthrough",
-          "--use-gl=angle",
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_tests_passthrough",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "isolate_name": "telemetry_gpu_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_gpu_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-with-backend-validation",
-          "--timeout-ms=30000",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_blink_web_tests_with_backend_validation",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-swiftshader",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_swiftshader_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=webgpu-swiftshader-with-backend-validation",
-          "--timeout-ms=30000",
-          "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "webgpu_blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:webgpu_blink_web_tests/"
-      },
-      {
-        "args": [
-          "webgpu_cts",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
-          "--use-webgpu-adapter=swiftshader",
-          "--test-filter=*web_platform*",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgpu_swiftshader_web_platform_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 863ee3b..9c5fd60 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -15573,814 +15573,6 @@
       }
     ]
   },
-  "Win10 FYI x64 Exp Release (Intel HD 630)": {
-    "gtest_tests": [
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--test-launcher-bot-mode",
-          "--test-launcher-jobs=1",
-          "--gtest_filter=TabCaptureApiPixelTest.EndToEnd*"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "tab_capture_end2end_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=passthrough",
-          "--use-gl=angle",
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gl_tests_passthrough",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gles2_conform_test",
-        "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=d3d9"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gles2_conform_d3d9_test",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gles2_conform_test",
-        "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=gl",
-          "--disable-gpu-sandbox"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "gles2_conform_gl_test",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gles2_conform_test",
-        "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vulkan_tests",
-        "test_id_prefix": "ninja://gpu/vulkan:vulkan_tests/"
-      },
-      {
-        "args": [
-          "--ignore-runtime-requirements=*"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "xr_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "xr_browser_tests",
-        "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "context_lost_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gpu_process_launch_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "hardware_accelerated_feature_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "9bc5"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "info_collection_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "maps_pixel_passthrough_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "mediapipe",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_higher_performance_gpu --use-cmd-decoder=passthrough --use-gl=angle"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "mediapipe_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "pixel_skia_gold_passthrough_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle",
-          "--dont-restore-color-profile-after-test"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "trace_test",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "trace_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webcodecs",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webcodecs_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgl2_conformance",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgl2_conformance_d3d11_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 20
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgl1_conformance",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgl_conformance_d3d11_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgl1_conformance",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgl_conformance_d3d9_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "webgl1_conformance",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webgl_conformance_vulkan_passthrough_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:9bc5-31.0.101.2111",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "expiration": 21600,
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
   "Win10 FYI x64 Exp Release (NVIDIA)": {
     "isolated_scripts": [
       {
@@ -16418,6 +15610,43 @@
       }
     ]
   },
+  "Win10 FYI x64 Experimental Release (Intel)": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "noop_sleep",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "noop_sleep_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:9bc5-31.0.101.2111",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      }
+    ]
+  },
   "Win10 FYI x64 Release (AMD RX 5500 XT)": {
     "gtest_tests": [
       {
@@ -17187,7 +16416,7 @@
       }
     ]
   },
-  "Win10 FYI x64 Release (Intel HD 630)": {
+  "Win10 FYI x64 Release (Intel)": {
     "gtest_tests": [
       {
         "merge": {
@@ -17199,7 +16428,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17227,7 +16456,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17253,7 +16482,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17277,7 +16506,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17300,7 +16529,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17325,7 +16554,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17351,7 +16580,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17371,7 +16600,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17394,7 +16623,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17418,7 +16647,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17456,7 +16685,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17492,7 +16721,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17528,7 +16757,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17550,9 +16779,7 @@
           "--expected-vendor-id",
           "8086",
           "--expected-device-id",
-          "3e92",
-          "--expected-device-id",
-          "5912"
+          "9bc5"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -17570,7 +16797,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17615,7 +16842,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17651,7 +16878,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17696,43 +16923,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "power",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "power_measurement_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17769,7 +16960,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17805,7 +16996,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17841,7 +17032,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17862,7 +17053,7 @@
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--webgl-conformance-version=2.0.1",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -17880,7 +17071,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17901,7 +17092,7 @@
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -17919,7 +17110,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17940,7 +17131,7 @@
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -17958,7 +17149,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -17978,7 +17169,7 @@
           "-v",
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
@@ -17996,7 +17187,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
diff --git a/testing/buildbot/filters/mac.mac12-arm64-rel.browser_tests.filter b/testing/buildbot/filters/mac.mac12-arm64-rel.browser_tests.filter
index e958ec72..b3ba0c5f 100644
--- a/testing/buildbot/filters/mac.mac12-arm64-rel.browser_tests.filter
+++ b/testing/buildbot/filters/mac.mac12-arm64-rel.browser_tests.filter
@@ -192,12 +192,6 @@
 -RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/9
 -RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/10
 -RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/11
--RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/12
--RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/13
--RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/14
--RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/15
--RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/16
--RegionCaptureBrowserCropTestInstantiation/RegionCaptureBrowserCropTest.CanCropTo/17
 -RegionCaptureClonesBrowserTest.CanCloneCroppedTracks
 -RegionCaptureClonesBrowserTest.CannotRecropClone
 -RegionCaptureClonesBrowserTest.CannotRecropTrackThatHasClone
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json
index 3ef41de..de34a0b 100644
--- a/testing/buildbot/internal.chromeos.fyi.json
+++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1140,7 +1140,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R111-15300.0.0",
+        "cros_img": "octopus-release/R111-15301.0.0",
         "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1188,7 +1188,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R111-15300.0.0",
+        "cros_img": "octopus-release/R111-15301.0.0",
         "name": "ozone_unittests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1239,7 +1239,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R111-15300.0.0",
+        "cros_img": "hana-release/R111-15301.0.0",
         "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1287,7 +1287,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R111-15300.0.0",
+        "cros_img": "strongbad-release/R111-15301.0.0",
         "name": "lacros_all_tast_tests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1335,7 +1335,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R111-15300.0.0",
+        "cros_img": "hana-release/R111-15301.0.0",
         "name": "ozone_unittests HANA_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1379,7 +1379,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R111-15300.0.0",
+        "cros_img": "strongbad-release/R111-15301.0.0",
         "name": "ozone_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1423,7 +1423,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R111-15300.0.0",
+        "cros_img": "hana-release/R111-15301.0.0",
         "name": "viz_unittests HANA_RELEASE_LKGM",
         "swarming": {},
         "test": "viz_unittests",
@@ -1467,7 +1467,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R111-15300.0.0",
+        "cros_img": "strongbad-release/R111-15301.0.0",
         "name": "viz_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "viz_unittests",
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 682d2bc3..f46fbe1 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -1293,29 +1293,6 @@
       },
     },
   },
-  'win10_intel_hd_630_stable': {
-    'swarming': {
-      'dimensions': {
-        'gpu': '8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141',
-        'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
-      },
-    },
-  },
-  'win10_intel_hd_630_stable_dimension_set': {
-    'swarming': {
-      # We use explicit 'dimension_sets' instead of 'dimensions' since this is
-      # used in conjunction with 'win10_nvidia_gtx_1660_stable_dimension_set'
-      # to trigger tests on multiple configurations.
-      'dimension_sets': [
-        {
-          'gpu': '8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141',
-          'os': 'Windows-10',
-          'pool': 'chromium.tests.gpu',
-        },
-      ],
-    },
-  },
   'win10_intel_uhd_630_experimental': {
     'swarming': {
       'dimensions': {
@@ -1325,6 +1302,29 @@
       },
     },
   },
+  'win10_intel_uhd_630_stable': {
+    'swarming': {
+      'dimensions': {
+        'gpu': '8086:9bc5-31.0.101.2111',
+        'os': 'Windows-10',
+        'pool': 'chromium.tests.gpu',
+      },
+    },
+  },
+  'win10_intel_uhd_630_stable_dimension_set': {
+    'swarming': {
+      # We use explicit 'dimension_sets' instead of 'dimensions' since this is
+      # used in conjunction with 'win10_nvidia_gtx_1660_stable_dimension_set'
+      # to trigger tests on multiple configurations.
+      'dimension_sets': [
+        {
+          'gpu': '8086:9bc5-31.0.101.2111',
+          'os': 'Windows-10',
+          'pool': 'chromium.tests.gpu',
+        },
+      ],
+    },
+  },
   'win10_nvidia_gtx_1660_experimental': {
     'swarming': {
       'dimensions': {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index d86da3f..3a163272 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2006,8 +2006,6 @@
       # Android.
       'Dawn Android arm DEPS Release (Pixel 4)',
       'Dawn Android arm Release (Pixel 4)',
-      'Dawn Win10 x86 DEPS Release (Intel HD 630)',
-      'Dawn Win10 x86 Release (Intel HD 630)',
     ],
   },
   'device_unittests': {
@@ -3134,11 +3132,6 @@
       },
     },
   },
-  'power_measurement_test': {
-    'remove_from': [
-      'Win10 FYI x64 Exp Release (Intel HD 630)',  # https://crbug.com/1376082
-    ],
-  },
   'sandbox_linux_unittests': {
     'modifications': {
       'android-nougat-x86-rel': {
@@ -3582,8 +3575,8 @@
   'video_decode_accelerator_gl_unittest': {
     'remove_from': [
       # Windows Intel doesn't have the GL extensions to support this test.
-      'Win10 FYI x64 Release (Intel HD 630)',
-      'Win10 FYI x64 Exp Release (Intel HD 630)',
+      'Win10 FYI x64 Release (Intel)',
+      'Win10 FYI x64 Experimental Release (Intel)',
     ],
   },
   'views_unittests': {
@@ -3938,8 +3931,6 @@
       'Dawn Android arm Release (Pixel 4)',
       'Dawn Mac x64 DEPS Release (AMD)',
       'Dawn Mac x64 Release (AMD)',
-      'Dawn Win10 x64 DEPS Release (Intel HD 630)',
-      'Dawn Win10 x64 Release (Intel HD 630)',
     ],
   },
   'webgpu_cts_tests': {
@@ -3962,10 +3953,6 @@
       'Dawn Android arm Release (Pixel 4)',
       'Dawn Mac x64 DEPS Release (AMD)',
       'Dawn Mac x64 Release (AMD)',
-      'Dawn Win10 x64 DEPS Release (Intel HD 630)',
-      'Dawn Win10 x64 Release (Intel HD 630)',
-      'Dawn Win10 x86 DEPS Release (Intel HD 630)',
-      'Dawn Win10 x86 Release (Intel HD 630)',
     ],
     'modifications': {
       # ci_only for bots where capacity is constrained.
@@ -3982,10 +3969,6 @@
     'remove_from': [
       'Dawn Mac x64 DEPS Release (AMD)',
       'Dawn Mac x64 Release (AMD)',
-      'Dawn Win10 x64 DEPS Release (Intel HD 630)',
-      'Dawn Win10 x64 Release (Intel HD 630)',
-      'Dawn Win10 x86 DEPS Release (Intel HD 630)',
-      'Dawn Win10 x86 Release (Intel HD 630)',
     ],
     'modifications': {
       # ci_only for bots where capacity is constrained.
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index a87deb4..1b8a973 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -2615,19 +2615,6 @@
       },
     },
 
-    # For Windows. Use the D3D12 backend validation layers but without GPU-based
-    # validation and shader patching. This avoids hangs on less powerful systems.
-    'gpu_dawn_gtests_with_partial_validation': {
-      'dawn_end2end_validation_layers_tests': {
-        'mixins': ['dawn_end2end_gpu_test'],
-        'args': [
-          '--enable-backend-validation=partial',
-        ],
-        'linux_args': [ '--no-xvfb' ],
-        'test': 'dawn_end2end_tests',
-      },
-    },
-
     # GPU gtests that test only Dawn with backend validation layers
     'gpu_dawn_gtests_with_validation': {
       'dawn_end2end_validation_layers_tests': {
@@ -3776,15 +3763,6 @@
       },
     },
 
-    'gpu_win_intel_specific_telemetry_tests': {
-      'power_measurement_test': {
-        'telemetry_test_name': 'power',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-    },
-
     'headless_browser_gtests': {
       'headless_browsertests': {},
       'headless_unittests': {},
@@ -6034,14 +6012,6 @@
       'gpu_common_gtests_passthrough',
     ],
 
-    # GPU gtests that test Dawn and integration with Chromium
-    # These tests are run both on the CI and trybots which test DEPS Dawn.
-    'gpu_dawn_integration_gtests_passthrough_win_intel': [
-      'gpu_dawn_gtests',
-      'gpu_dawn_gtests_with_partial_validation',
-      'gpu_common_gtests_passthrough',
-    ],
-
     'gpu_dawn_isolated_scripts': [
       'gpu_dawn_common_isolated_scripts',
       'gpu_dawn_perf_smoke_isolated_scripts',
@@ -6243,7 +6213,6 @@
       'gpu_webgl_conformance_d3d11_passthrough_telemetry_tests',
       'gpu_webgl_conformance_d3d9_passthrough_telemetry_tests',
       'gpu_webgl_conformance_vulkan_passthrough_telemetry_tests',
-      'gpu_win_intel_specific_telemetry_tests',
     ],
 
     'gpu_fyi_win_optional_isolated_scripts': [
@@ -7379,75 +7348,70 @@
     'win_optional_gpu_tests_rel_gpu_telemetry_tests': {
       'gpu_common_and_optional_telemetry_tests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_mediapipe_passthrough_telemetry_tests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_webcodecs_telemetry_test': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_webgl_conformance_d3d11_passthrough_telemetry_tests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_webgl_conformance_d3d9_passthrough_telemetry_tests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_webgl_conformance_vulkan_passthrough_telemetry_tests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
-      'gpu_win_intel_specific_telemetry_tests': {
-        'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
-        ],
-      },
     },
 
     'win_optional_gpu_tests_rel_gtests': {
       'gpu_default_and_optional_win_specific_gtests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_fyi_and_optional_non_linux_gtests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_fyi_and_optional_win_specific_gtests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
       'gpu_gles2_conform_gtests': {
         'variants': [
-          'WIN10_INTEL_HD_630_STABLE',
+          'WIN10_INTEL_UHD_630_STABLE',
           'WIN10_NVIDIA_GTX_1660_STABLE',
         ],
       },
diff --git a/testing/buildbot/tryserver.chromium.win.json b/testing/buildbot/tryserver.chromium.win.json
index e4b3e36..397a774 100644
--- a/testing/buildbot/tryserver.chromium.win.json
+++ b/testing/buildbot/tryserver.chromium.win.json
@@ -37,13 +37,13 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "gles2_conform_d3d9_test 8086:5912 or 8086:3e92",
+        "name": "gles2_conform_d3d9_test 8086:9bc5",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -52,7 +52,7 @@
         },
         "test": "gles2_conform_test",
         "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -90,13 +90,13 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "gles2_conform_gl_test 8086:5912 or 8086:3e92",
+        "name": "gles2_conform_gl_test 8086:9bc5",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -105,7 +105,7 @@
         },
         "test": "gles2_conform_test",
         "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -139,13 +139,13 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "gles2_conform_test 8086:5912 or 8086:3e92",
+        "name": "gles2_conform_test 8086:9bc5",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -154,7 +154,7 @@
         },
         "test": "gles2_conform_test",
         "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [],
@@ -184,13 +184,13 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "gpu_unittests 8086:5912 or 8086:3e92",
+        "name": "gpu_unittests 8086:9bc5",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -199,7 +199,7 @@
         },
         "test": "gpu_unittests",
         "test_id_prefix": "ninja://gpu:gpu_unittests/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -233,13 +233,13 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "xr_browser_tests 8086:5912 or 8086:3e92",
+        "name": "xr_browser_tests 8086:9bc5",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -248,7 +248,7 @@
         },
         "test": "xr_browser_tests",
         "test_id_prefix": "ninja://chrome/test:xr_browser_tests/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       }
     ],
     "isolated_scripts": [
@@ -304,16 +304,14 @@
           "--expected-vendor-id",
           "8086",
           "--expected-device-id",
-          "3e92",
-          "--expected-device-id",
-          "5912"
+          "9bc5"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "info_collection_tests 8086:5912 or 8086:3e92",
+        "name": "info_collection_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -324,7 +322,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -333,7 +331,7 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -386,7 +384,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "mediapipe_passthrough_tests 8086:5912 or 8086:3e92",
+        "name": "mediapipe_passthrough_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -397,7 +395,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -406,7 +404,7 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -441,43 +439,6 @@
       },
       {
         "args": [
-          "power",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--stable-jobs",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "power_measurement_test 8086:5912 or 8086:3e92",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
-      },
-      {
-        "args": [
           "trace_test",
           "--show-stdout",
           "--browser=release_x64",
@@ -527,7 +488,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "trace_test 8086:5912 or 8086:3e92",
+        "name": "trace_test 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -538,7 +499,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -547,7 +508,7 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -600,7 +561,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "webcodecs_tests 8086:5912 or 8086:3e92",
+        "name": "webcodecs_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -611,7 +572,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -620,7 +581,7 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -673,14 +634,14 @@
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--webgl-conformance-version=2.0.1",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "webgl2_conformance_d3d11_passthrough_tests 8086:5912 or 8086:3e92",
+        "name": "webgl2_conformance_d3d11_passthrough_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -691,7 +652,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -701,7 +662,7 @@
           "shards": 20
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -752,14 +713,14 @@
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "webgl_conformance_d3d11_passthrough_tests 8086:5912 or 8086:3e92",
+        "name": "webgl_conformance_d3d11_passthrough_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -770,7 +731,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -780,7 +741,7 @@
           "shards": 2
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -831,14 +792,14 @@
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu",
           "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "webgl_conformance_d3d9_passthrough_tests 8086:5912 or 8086:3e92",
+        "name": "webgl_conformance_d3d9_passthrough_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -849,7 +810,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -859,7 +820,7 @@
           "shards": 2
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       },
       {
         "args": [
@@ -908,14 +869,14 @@
           "-v",
           "--stable-jobs",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu",
-          "--jobs=2"
+          "--jobs=1"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "webgl_conformance_vulkan_passthrough_tests 8086:5912 or 8086:3e92",
+        "name": "webgl_conformance_vulkan_passthrough_tests 8086:9bc5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -926,7 +887,7 @@
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
+              "gpu": "8086:9bc5-31.0.101.2111",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu"
             }
@@ -936,7 +897,7 @@
           "shards": 2
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
-        "variant_id": "8086:5912 or 8086:3e92"
+        "variant_id": "8086:9bc5"
       }
     ]
   }
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index f090735cd..41161b64 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -542,8 +542,8 @@
   'CROS_DEDEDE_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'dedede',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'dedede-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'dedede-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'DEDEDE_RELEASE_LKGM',
@@ -569,8 +569,8 @@
   'CROS_DEDEDE_RELEASE_STABLE': {
     'skylab': {
       'cros_board': 'dedede',
-      'cros_chrome_version': '108.0.5359.75',
-      'cros_img': 'dedede-release/R108-15183.59.0',
+      'cros_chrome_version': '108.0.5359.111',
+      'cros_img': 'dedede-release/R108-15183.69.0',
     },
     'enabled': True,
     'identifier': 'DEDEDE_RELEASE_STABLE',
@@ -578,8 +578,8 @@
   'CROS_EVE_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'eve',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'eve-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'eve-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'EVE_RELEASE_LKGM',
@@ -624,8 +624,8 @@
   'CROS_HANA_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'hana',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'hana-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'hana-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'HANA_RELEASE_LKGM',
@@ -660,8 +660,8 @@
   'CROS_HEROBRINE_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'herobrine',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'herobrine-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'herobrine-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'HEROBRINE_RELEASE_LKGM',
@@ -669,8 +669,8 @@
   'CROS_JACUZZI_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'jacuzzi',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'jacuzzi-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'jacuzzi-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'JACUZZI_RELEASE_LKGM',
@@ -735,8 +735,8 @@
   'CROS_OCTOPUS_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'octopus',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'octopus-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'octopus-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'OCTOPUS_RELEASE_LKGM',
@@ -771,8 +771,8 @@
   'CROS_STRONGBAD_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'strongbad',
-      'cros_chrome_version': '111.0.5512.0',
-      'cros_img': 'strongbad-release/R111-15300.0.0',
+      'cros_chrome_version': '111.0.5514.0',
+      'cros_img': 'strongbad-release/R111-15301.0.0',
     },
     'enabled': True,
     'identifier': 'STRONGBAD_RELEASE_LKGM',
@@ -886,11 +886,11 @@
       ],
     },
   },
-  'WIN10_INTEL_HD_630_STABLE': {
-    'identifier': '8086:5912 or 8086:3e92',
+  'WIN10_INTEL_UHD_630_STABLE': {
+    'identifier': '8086:9bc5',
     'mixins': [
       'swarming_containment_auto',
-      'win10_intel_hd_630_stable',
+      'win10_intel_uhd_630_stable',
     ],
   },
   'WIN10_NVIDIA_GTX_1660_STABLE': {
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 60bf887..f1d6fe2 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1238,7 +1238,7 @@
         'os_type': 'win',
         'browser_config': 'release_x64',
         'mixins': [
-          'win10_intel_hd_630_stable',
+          'win10_intel_uhd_630_stable',
         ],
         'test_suites': {
           'gpu_telemetry_tests': 'gpu_angle_win_intel_nvidia_telemetry_tests',
@@ -2204,7 +2204,7 @@
         'browser_config': 'release_x64',
         'mixins': [
           'win10_nvidia_gtx_1660_stable_dimension_set',
-          'win10_intel_hd_630_stable_dimension_set',
+          'win10_intel_uhd_630_stable_dimension_set',
         ],
         'test_suites': {
           'gpu_telemetry_tests': 'gpu_dawn_webgpu_cts_asan',
@@ -2214,15 +2214,15 @@
       },
       'Dawn Win10 x64 Builder' : {},
       'Dawn Win10 x64 DEPS Builder' : {},
-      'Dawn Win10 x64 DEPS Release (Intel HD 630)': {
+      'Dawn Win10 x64 DEPS Release (Intel)': {
         'os_type': 'win',
         'browser_config': 'release_x64',
         'mixins': [
-          'win10_intel_hd_630_stable',
+          'win10_intel_uhd_630_stable',
         ],
         'test_suites': {
           'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel',
+          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
           'isolated_scripts': 'gpu_dawn_isolated_scripts',
         },
       },
@@ -2248,22 +2248,20 @@
         # When the experimental driver is identical to the stable driver, this
         # should be running the gpu_noop_sleep_telemetry_test. Otherwise, it
         # should be running the same test_suites as
-        # 'Dawn Win10 x64 Release (Intel HD 630)'
+        # 'Dawn Win10 x64 Release (Intel)'
         'test_suites': {
-          'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
-          'isolated_scripts': 'gpu_dawn_isolated_scripts',
+          'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
         },
       },
-      'Dawn Win10 x64 Release (Intel HD 630)': {
+      'Dawn Win10 x64 Release (Intel)': {
         'os_type': 'win',
         'browser_config': 'release_x64',
         'mixins': [
-          'win10_intel_hd_630_stable',
+          'win10_intel_uhd_630_stable',
         ],
         'test_suites': {
           'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel',
+          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
           'isolated_scripts': 'gpu_dawn_isolated_scripts',
         },
       },
@@ -2281,15 +2279,15 @@
       },
       'Dawn Win10 x86 Builder' : {},
       'Dawn Win10 x86 DEPS Builder' : {},
-      'Dawn Win10 x86 DEPS Release (Intel HD 630)': {
+      'Dawn Win10 x86 DEPS Release (Intel)': {
         'os_type': 'win',
         'browser_config': 'release',
         'mixins': [
-          'win10_intel_hd_630_stable',
+          'win10_intel_uhd_630_stable',
         ],
         'test_suites': {
           'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel',
+          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
           'isolated_scripts': 'gpu_dawn_isolated_scripts',
         },
       },
@@ -2315,22 +2313,20 @@
         # When the experimental driver is identical to the stable driver, this
         # should be running the gpu_noop_sleep_telemetry_test. Otherwise, it
         # should be running the same test_suites as
-        # 'Dawn Win10 x86 Release (Intel HD 630)'
+        # 'Dawn Win10 x86 Release (Intel)'
         'test_suites': {
-          'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
-          'isolated_scripts': 'gpu_dawn_isolated_scripts',
+          'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
         },
       },
-      'Dawn Win10 x86 Release (Intel HD 630)': {
+      'Dawn Win10 x86 Release (Intel)': {
         'os_type': 'win',
         'browser_config': 'release',
         'mixins': [
-          'win10_intel_hd_630_stable',
+          'win10_intel_uhd_630_stable',
         ],
         'test_suites': {
           'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests',
-          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel',
+          'gtest_tests': 'gpu_dawn_integration_gtests_passthrough',
           'isolated_scripts': 'gpu_dawn_isolated_scripts',
         },
       },
@@ -4631,22 +4627,6 @@
       },
       # TODO(kbr): "Experimental" caused too-long path names pre-LUCI.
       # crbug.com/812000
-      'Win10 FYI x64 Exp Release (Intel HD 630)': {
-        'os_type': 'win',
-        'browser_config': 'release_x64',
-        'mixins': [
-          'limited_capacity_bot',
-          'win10_intel_uhd_630_experimental',
-        ],
-        # When the experimental driver is identical to the stable driver, this
-        # should be running the gpu_noop_sleep_telemetry_test. Otherwise, it
-        # should be running the same test_suites as
-        # 'Win10 FYI x64 Release (Intel HD 630)'
-        'test_suites': {
-          'gtest_tests': 'gpu_fyi_win_gtests',
-          'gpu_telemetry_tests': 'gpu_fyi_win_intel_release_telemetry_tests',
-        },
-      },
       'Win10 FYI x64 Exp Release (NVIDIA)': {
         'os_type': 'win',
         'browser_config': 'release_x64',
@@ -4662,6 +4642,21 @@
           'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
         },
       },
+      'Win10 FYI x64 Experimental Release (Intel)': {
+        'os_type': 'win',
+        'browser_config': 'release_x64',
+        'mixins': [
+          'limited_capacity_bot',
+          'win10_intel_uhd_630_experimental',
+        ],
+        # When the experimental driver is identical to the stable driver, this
+        # should be running the gpu_noop_sleep_telemetry_test. Otherwise, it
+        # should be running the same test_suites as
+        # 'Win10 FYI x64 Release (Intel)'
+        'test_suites': {
+          'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
+        },
+      },
       'Win10 FYI x64 Release (AMD RX 5500 XT)': {
         # This bot currently only has two pieces of hardware behind it,
         # and is being qualified for potential scale-out.
@@ -4676,11 +4671,11 @@
           'gpu_telemetry_tests': 'gpu_fyi_win_amd_release_telemetry_tests',
         },
       },
-      'Win10 FYI x64 Release (Intel HD 630)': {
+      'Win10 FYI x64 Release (Intel)': {
         'os_type': 'win',
         'browser_config': 'release_x64',
         'mixins': [
-          'win10_intel_hd_630_stable',
+          'win10_intel_uhd_630_stable',
         ],
         'test_suites': {
           'gtest_tests': 'gpu_fyi_win_gtests',
diff --git a/testing/scripts/test_buildbucket_api_gpu_use_cases.py b/testing/scripts/test_buildbucket_api_gpu_use_cases.py
index 0f20a6f..fda173b 100755
--- a/testing/scripts/test_buildbucket_api_gpu_use_cases.py
+++ b/testing/scripts/test_buildbucket_api_gpu_use_cases.py
@@ -38,7 +38,7 @@
     # Verify we can get power measurement test data from latest successful
     # build, including the swarming bot that runs the test, and actual test
     # results.
-    bot = 'Win10 FYI x64 Release (Intel HD 630)'
+    bot = 'Win10 FYI x64 Release (Intel)'
     step = 'power_measurement_test'
     build_id = gather_power_measurement_results.GetLatestGreenBuild(bot)
     build_json = gather_power_measurement_results.GetJsonForBuildSteps(
diff --git a/testing/unexpected_passes_common/data_types.py b/testing/unexpected_passes_common/data_types.py
index 625760fd..5c723a4 100644
--- a/testing/unexpected_passes_common/data_types.py
+++ b/testing/unexpected_passes_common/data_types.py
@@ -84,7 +84,7 @@
     # We're going to be making a lot of comparisons, and fnmatch is *much*
     # slower (~40x from rough testing) than a straight comparison, so only use
     # it if necessary.
-    if '*' in test:
+    if self._IsWildcard():
       self._comp = self._CompareWildcard
     else:
       self._comp = self._CompareNonWildcard
@@ -101,6 +101,10 @@
   def __hash__(self) -> int:
     return hash((self.test, self.tags, self.expected_results, self.bug))
 
+  def _IsWildcard(self) -> bool:
+    # This logic is the same as typ's expectation parser.
+    return not self.test.endswith('\\*') and self.test.endswith('*')
+
   def _CompareWildcard(self, result_test_name: str) -> bool:
     return fnmatch.fnmatch(result_test_name, self.test)
 
@@ -145,7 +149,11 @@
         reason=self.bug,
         test=self.test,
         raw_tags=self._ProcessTagsForFileUse(),
-        raw_results=list(self.expected_results))
+        raw_results=list(self.expected_results),
+        # This logic is normally handled by typ when parsing a file, but since
+        # we're manually creating an expectation, we have to specify the
+        # glob-ness manually.
+        is_glob=self._IsWildcard())
     return typ_expectation.to_string()
 
   def _ProcessTagsForFileUse(self) -> List[str]:
diff --git a/testing/unexpected_passes_common/data_types_unittest.py b/testing/unexpected_passes_common/data_types_unittest.py
index 64b3dc5..474fe1bc 100755
--- a/testing/unexpected_passes_common/data_types_unittest.py
+++ b/testing/unexpected_passes_common/data_types_unittest.py
@@ -137,6 +137,19 @@
     e = data_types.Expectation('foo/test', ['tag2', 'tag1'], 'Failure', 'bug')
     self.assertEqual(e.AsExpectationFileString(),
                      'bug [ tag1 tag2 ] foo/test [ Failure ]')
+    e = data_types.Expectation('foo/*', ['tag2', 'tag1'], 'Failure', 'bug')
+    self.assertEqual(e.AsExpectationFileString(),
+                     'bug [ tag1 tag2 ] foo/* [ Failure ]')
+
+  def testWildcard(self) -> None:
+    e = data_types.Expectation('foo/test', ['tag1'], 'Failure')
+    self.assertFalse(e._IsWildcard())
+    e = data_types.Expectation('foo/\\*', ['tag1'], 'Failure')
+    self.assertFalse(e._IsWildcard())
+    e = data_types.Expectation('foo/*', ['tag1'], 'Failure')
+    self.assertTrue(e._IsWildcard())
+    e = data_types.Expectation('foo/\\*bar/*', ['tag1'], 'Failure')
+    self.assertTrue(e._IsWildcard())
 
 
 class ResultUnittest(unittest.TestCase):
diff --git a/testing/unexpected_passes_common/expectations_unittest.py b/testing/unexpected_passes_common/expectations_unittest.py
index 12e1c2b..bd270f7 100755
--- a/testing/unexpected_passes_common/expectations_unittest.py
+++ b/testing/unexpected_passes_common/expectations_unittest.py
@@ -1214,6 +1214,50 @@
       self.assertEqual(infile.read(),
                        FAKE_EXPECTATION_FILE_CONTENTS_WITH_COMPLEX_TAGS)
 
+  def testWildcard(self) -> None:
+    """Regression test to ensure that wildcards are modified correctly."""
+    file_contents = """\
+# tags: [ win ]
+# tags: [ amd intel ]
+# results: [ Failure ]
+
+crbug.com/1234 [ win ] foo/bar* [ Failure ]
+"""
+    with open(self.filename, 'w') as f:
+      f.write(file_contents)
+
+    amd_stats = data_types.BuildStats()
+    amd_stats.AddPassedBuild(frozenset(['win', 'amd']))
+    intel_stats = data_types.BuildStats()
+    intel_stats.AddFailedBuild('1', frozenset(['win', 'intel']))
+    # yapf: disable
+    test_expectation_map = data_types.TestExpectationMap({
+        self.filename:
+        data_types.ExpectationBuilderMap({
+            data_types.Expectation(
+                'foo/bar*', ['win'], 'Failure', 'crbug.com/1234'):
+            data_types.BuilderStepMap({
+                'win_builder':
+                data_types.StepBuildStatsMap({
+                    'amd': amd_stats,
+                    'intel': intel_stats,
+                }),
+            }),
+        }),
+    })
+    # yap: enable
+    urls = self.instance.NarrowSemiStaleExpectationScope(test_expectation_map)
+    expected_contents = """\
+# tags: [ win ]
+# tags: [ amd intel ]
+# results: [ Failure ]
+
+crbug.com/1234 [ intel win ] foo/bar* [ Failure ]
+"""
+    with open(self.filename) as infile:
+      self.assertEqual(infile.read(), expected_contents)
+    self.assertEqual(urls, {'crbug.com/1234'})
+
   def testMultipleSteps(self) -> None:
     """Tests that scope narrowing works across multiple steps."""
     amd_stats = data_types.BuildStats()
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom
index 38f8a8d..08211d29 100644
--- a/third_party/blink/public/mojom/frame/frame.mojom
+++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -27,6 +27,7 @@
 import "third_party/blink/public/mojom/devtools/inspector_issue.mojom";
 import "third_party/blink/public/mojom/favicon/favicon_url.mojom";
 import "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom";
+import "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom";
 import "third_party/blink/public/mojom/fetch/fetch_api_request.mojom";
 import "third_party/blink/public/mojom/frame/blocked_navigation_types.mojom";
 import "third_party/blink/public/mojom/frame/frame_owner_properties.mojom";
@@ -564,6 +565,21 @@
   // RemoteFrameHost messages already signal the browser via RouteMessageEvent.
   ReceivedDelegatedCapability(DelegatedCapability delegated_capability);
 
+  // See:
+  // https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md
+  //
+  // This implements the API:
+  // window.fence.reportEvent({eventType, eventData, destination})
+  //
+  // A document in a fenced frames can invoke the reportEvent API to request the
+  // browser to send `eventData` in a beacon toward the URL registered against
+  // `eventType` by the worklet in registerAdBeacon. Depending on the declared
+  // `destination`, the beacon is sent to either the buyer's or the seller's
+  // registered URL.
+  SendFencedFrameReportingBeacon(string event_data,
+                                 string event_type,
+                                 ReportingDestination destination);
+
   // Sent by the renderer process to request the creation of a new portal.
   // |portal| is the pipe to be used for the Portal object, |client| is the pipe
   // used to communicate back with the caller. Returns:
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 7c7facf..f78a04e1 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
@@ -3769,6 +3769,8 @@
   kIDNA2008DeviationCharacterInHostnameOfIFrame = 4428,
   kWindowOpenPopupOnMobile = 4429,
   kWindowOpenedAsPopupOnMobile = 4430,
+  kPrivateNetworkAccessIgnoredCrossOriginPreflightError = 4431,
+  kPrivateNetworkAccessIgnoredCrossSitePreflightError = 4432,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/web_navigation_params.h b/third_party/blink/public/web/web_navigation_params.h
index ac3d3c79..2c5c549 100644
--- a/third_party/blink/public/web/web_navigation_params.h
+++ b/third_party/blink/public/web/web_navigation_params.h
@@ -476,12 +476,10 @@
   // Null, otherwise.
   absl::optional<WebVector<WebURL>> ad_auction_components;
 
-  // If this is a navigation to a "opaque-ads" mode fenced frame, there might
-  // be associated reporting metadata. This is a map from destination type to
-  // reporting metadata which in turn is a map from the event type to the
-  // reporting url. Null, otherwise.
+  // This boolean flag indicates whether there is associated reporting metadata
+  // with the fenced frame.
   // https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md
-  absl::optional<FencedFrame::FencedFrameReporting> fenced_frame_reporting;
+  bool has_fenced_frame_reporting = false;
 
   // Whether the current context would be allowed to create an opaque-ads
   //  frame (based on the browser-side calculations). See
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index d9a8079..b871ecf 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -913,6 +913,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_shared_storage_url_with_metadata.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_connection_status.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_connection_status.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_error_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_error_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_source_buffer_config.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_source_buffer_config.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_spatial_sensor_options.cc",
@@ -1420,6 +1422,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_disposition.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_protocol.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_protocol.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_response_code.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_response_code.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_speech_synthesis_error_code.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_speech_synthesis_error_code.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_storage_bucket_durability.cc",
@@ -2315,6 +2319,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_shared_worker_global_scope.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_connection.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_connection.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_error.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_error.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_reader.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_reader.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_smart_card_reader_presence_event.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index 3689a4cb..4f49da87 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -719,6 +719,7 @@
           "//third_party/blink/renderer/modules/smart_card/navigator_smart_card.idl",
           "//third_party/blink/renderer/modules/smart_card/smart_card_connection.idl",
           "//third_party/blink/renderer/modules/smart_card/smart_card_connection_status.idl",
+          "//third_party/blink/renderer/modules/smart_card/smart_card_error.idl",
           "//third_party/blink/renderer/modules/smart_card/smart_card_reader.idl",
           "//third_party/blink/renderer/modules/smart_card/smart_card_reader_presence_event.idl",
           "//third_party/blink/renderer/modules/smart_card/smart_card_reader_presence_observer.idl",
diff --git a/third_party/blink/renderer/core/animation/BUILD.gn b/third_party/blink/renderer/core/animation/BUILD.gn
index b542e51..226112c 100644
--- a/third_party/blink/renderer/core/animation/BUILD.gn
+++ b/third_party/blink/renderer/core/animation/BUILD.gn
@@ -94,6 +94,8 @@
     "css_font_size_interpolation_type.h",
     "css_font_stretch_interpolation_type.cc",
     "css_font_stretch_interpolation_type.h",
+    "css_font_style_interpolation_type.cc",
+    "css_font_style_interpolation_type.h",
     "css_font_variation_settings_interpolation_type.cc",
     "css_font_variation_settings_interpolation_type.h",
     "css_font_weight_interpolation_type.cc",
diff --git a/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc
new file mode 100644
index 0000000..a35137e
--- /dev/null
+++ b/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc
@@ -0,0 +1,87 @@
+// 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 "third_party/blink/renderer/core/animation/css_font_style_interpolation_type.h"
+
+#include <memory>
+
+#include "base/memory/ptr_util.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
+#include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
+#include "third_party/blink/renderer/core/style/computed_style.h"
+#include "third_party/blink/renderer/platform/wtf/math_extras.h"
+
+namespace blink {
+
+class InheritedFontStyleChecker
+    : public CSSInterpolationType::CSSConversionChecker {
+ public:
+  explicit InheritedFontStyleChecker(FontSelectionValue font_style)
+      : font_style_(font_style) {}
+
+ private:
+  bool IsValid(const StyleResolverState& state,
+               const InterpolationValue&) const final {
+    return font_style_ == state.ParentStyle()->GetFontStyle();
+  }
+
+  const double font_style_;
+};
+
+InterpolationValue CSSFontStyleInterpolationType::CreateFontStyleValue(
+    FontSelectionValue font_style) const {
+  return InterpolationValue(std::make_unique<InterpolableNumber>(font_style));
+}
+
+InterpolationValue CSSFontStyleInterpolationType::MaybeConvertNeutral(
+    const InterpolationValue&,
+    ConversionCheckers&) const {
+  return InterpolationValue(std::make_unique<InterpolableNumber>(0));
+}
+
+InterpolationValue CSSFontStyleInterpolationType::MaybeConvertInitial(
+    const StyleResolverState&,
+    ConversionCheckers& conversion_checkers) const {
+  return CreateFontStyleValue(NormalSlopeValue());
+}
+
+InterpolationValue CSSFontStyleInterpolationType::MaybeConvertInherit(
+    const StyleResolverState& state,
+    ConversionCheckers& conversion_checkers) const {
+  DCHECK(state.ParentStyle());
+  FontSelectionValue inherited_font_style = state.ParentStyle()->GetFontStyle();
+  conversion_checkers.push_back(
+      std::make_unique<InheritedFontStyleChecker>(inherited_font_style));
+  return CreateFontStyleValue(inherited_font_style);
+}
+
+InterpolationValue CSSFontStyleInterpolationType::MaybeConvertValue(
+    const CSSValue& value,
+    const StyleResolverState* state,
+    ConversionCheckers& conversion_checkers) const {
+  auto* identifier_value = DynamicTo<CSSIdentifierValue>(value);
+  if (identifier_value &&
+      identifier_value->GetValueID() == CSSValueID::kItalic) {
+    return nullptr;
+  }
+  return CreateFontStyleValue(
+      StyleBuilderConverterBase::ConvertFontStyle(value));
+}
+
+InterpolationValue
+CSSFontStyleInterpolationType::MaybeConvertStandardPropertyUnderlyingValue(
+    const ComputedStyle& style) const {
+  return CreateFontStyleValue(style.GetFontStyle());
+}
+
+void CSSFontStyleInterpolationType::ApplyStandardPropertyValue(
+    const InterpolableValue& interpolable_value,
+    const NonInterpolableValue*,
+    StyleResolverState& state) const {
+  state.GetFontBuilder().SetStyle(FontSelectionValue(
+      ClampTo(To<InterpolableNumber>(interpolable_value).Value(),
+              MinObliqueValue(), MaxObliqueValue())));
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.h b/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.h
new file mode 100644
index 0000000..6fd62696
--- /dev/null
+++ b/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.h
@@ -0,0 +1,50 @@
+// 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 THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_CSS_FONT_STYLE_INTERPOLATION_TYPE_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_CSS_FONT_STYLE_INTERPOLATION_TYPE_H_
+
+#include "base/check_op.h"
+#include "third_party/blink/renderer/core/animation/css_interpolation_type.h"
+
+namespace blink {
+
+// This class performs validation and constructs InterpolationValues for
+// font-style animation. Font-style property should be animated by computed
+// value, i.e. if there is an 'oblique x deg' value, it should be interpolated
+// by the angle value x. 'normal' animates as 'oblique 0deg', animating from/to
+// 'italic' keyword should be discrete, see:
+// https://www.w3.org/TR/css-fonts-4/#font-weight-absolute-values
+// TODO(https://crbug.com/1404731): 'CSS transition' for 'italic' keyword
+// currently works as 'oblique 14deg' since there is no way to distinguish
+// 'italic' and 'oblique' keywords in ComputedStyle.
+class CSSFontStyleInterpolationType : public CSSInterpolationType {
+ public:
+  explicit CSSFontStyleInterpolationType(PropertyHandle property)
+      : CSSInterpolationType(property) {
+    DCHECK_EQ(CssProperty().PropertyID(), CSSPropertyID::kFontStyle);
+  }
+
+  InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
+      const ComputedStyle&) const final;
+  void ApplyStandardPropertyValue(const InterpolableValue&,
+                                  const NonInterpolableValue*,
+                                  StyleResolverState&) const final;
+
+ private:
+  InterpolationValue CreateFontStyleValue(FontSelectionValue) const;
+  InterpolationValue MaybeConvertNeutral(const InterpolationValue& underlying,
+                                         ConversionCheckers&) const final;
+  InterpolationValue MaybeConvertInitial(const StyleResolverState&,
+                                         ConversionCheckers&) const final;
+  InterpolationValue MaybeConvertInherit(const StyleResolverState&,
+                                         ConversionCheckers&) const final;
+  InterpolationValue MaybeConvertValue(const CSSValue&,
+                                       const StyleResolverState*,
+                                       ConversionCheckers&) const final;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_CSS_FONT_STYLE_INTERPOLATION_TYPE_H_
diff --git a/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc b/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc
index 274f88b..0f33f0ee 100644
--- a/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc
+++ b/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/core/animation/css_filter_list_interpolation_type.h"
 #include "third_party/blink/renderer/core/animation/css_font_size_interpolation_type.h"
 #include "third_party/blink/renderer/core/animation/css_font_stretch_interpolation_type.h"
+#include "third_party/blink/renderer/core/animation/css_font_style_interpolation_type.h"
 #include "third_party/blink/renderer/core/animation/css_font_variation_settings_interpolation_type.h"
 #include "third_party/blink/renderer/core/animation/css_font_weight_interpolation_type.h"
 #include "third_party/blink/renderer/core/animation/css_grid_template_property_interpolation_type.h"
@@ -292,6 +293,10 @@
         applicable_types->push_back(
             std::make_unique<CSSFontStretchInterpolationType>(used_property));
         break;
+      case CSSPropertyID::kFontStyle:
+        applicable_types->push_back(
+            std::make_unique<CSSFontStyleInterpolationType>(used_property));
+        break;
       case CSSPropertyID::kFontVariationSettings:
         applicable_types->push_back(
             std::make_unique<CSSFontVariationSettingsInterpolationType>(
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_model_test.cc b/third_party/blink/renderer/core/animation/keyframe_effect_model_test.cc
index 30344ae5..9eee250 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect_model_test.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect_model_test.cc
@@ -515,7 +515,7 @@
   keyframes[0]->SetCSSPropertyValue(CSSPropertyID::kFontFamily, "serif",
                                     SecureContextMode::kInsecureContext,
                                     nullptr);
-  keyframes[0]->SetCSSPropertyValue(CSSPropertyID::kFontStyle, "normal",
+  keyframes[0]->SetCSSPropertyValue(CSSPropertyID::kFontSynthesisWeight, "auto",
                                     SecureContextMode::kInsecureContext,
                                     nullptr);
   keyframes[1] = MakeGarbageCollected<StringKeyframe>();
@@ -523,7 +523,7 @@
   keyframes[1]->SetCSSPropertyValue(CSSPropertyID::kFontFamily, "cursive",
                                     SecureContextMode::kInsecureContext,
                                     nullptr);
-  keyframes[1]->SetCSSPropertyValue(CSSPropertyID::kFontStyle, "oblique",
+  keyframes[1]->SetCSSPropertyValue(CSSPropertyID::kFontSynthesisWeight, "none",
                                     SecureContextMode::kInsecureContext,
                                     nullptr);
 
@@ -534,9 +534,10 @@
   Interpolation* left_value = FindValue(values, CSSPropertyID::kFontFamily);
   ASSERT_TRUE(left_value);
   ExpectNonInterpolableValue("cursive", left_value);
-  Interpolation* right_value = FindValue(values, CSSPropertyID::kFontStyle);
+  Interpolation* right_value =
+      FindValue(values, CSSPropertyID::kFontSynthesisWeight);
   ASSERT_TRUE(right_value);
-  ExpectNonInterpolableValue("oblique", right_value);
+  ExpectNonInterpolableValue("none", right_value);
 }
 
 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index 9128c5f..e3dcfcd 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -1149,6 +1149,7 @@
       name: "font-style",
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
       is_descriptor: true,
+      interpolable: true,
       inherited: true,
       font: true,
       name_for_methods: "Style",
diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc
index 3a2d5cf..70086ea 100644
--- a/third_party/blink/renderer/core/css/css_property_equality.cc
+++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -174,6 +174,8 @@
       return a.FontSizeAdjust() == b.FontSizeAdjust();
     case CSSPropertyID::kFontStretch:
       return a.GetFontStretch() == b.GetFontStretch();
+    case CSSPropertyID::kFontStyle:
+      return a.GetFontStyle() == b.GetFontStyle();
     case CSSPropertyID::kFontVariationSettings:
       return base::ValuesEquivalent(a.GetFontDescription().VariationSettings(),
                                     b.GetFontDescription().VariationSettings());
diff --git a/third_party/blink/renderer/core/dom/dom_exception.cc b/third_party/blink/renderer/core/dom/dom_exception.cc
index 3d96217..d6da3225 100644
--- a/third_party/blink/renderer/core/dom/dom_exception.cc
+++ b/third_party/blink/renderer/core/dom/dom_exception.cc
@@ -155,7 +155,11 @@
      "A parity error has been detected."},
     {DOMExceptionCode::kWebTransportError, "WebTransportError",
      "The WebTransport operation failed."},
-};
+
+    // Smart Card API
+    // https://github.com/WICG/web-smart-card/blob/main/README.md#web-idl
+    {DOMExceptionCode::kSmartCardError, "SmartCardError",
+     "A Smart Card operation failed."}};
 
 uint16_t ToLegacyErrorCode(DOMExceptionCode exception_code) {
   if (DOMExceptionCode::kLegacyErrorCodeMin <= exception_code &&
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 98decd2..2bbe738a 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -585,6 +585,10 @@
   virtual void CloneNonAttributePropertiesFrom(const Element&,
                                                CloneChildrenFlag) {}
 
+  // NOTE: This shadows Node::GetComputedStyle().
+  // The definition is in node_computed_style.h.
+  inline const ComputedStyle* GetComputedStyle() const;
+
   void AttachLayoutTree(AttachContext&) override;
   void DetachLayoutTree(bool performing_reattach = false) override;
 
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.cc b/third_party/blink/renderer/core/dom/element_rare_data.cc
index 4c1a7ac1..c4a2eff 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.cc
+++ b/third_party/blink/renderer/core/dom/element_rare_data.cc
@@ -51,7 +51,7 @@
   wtf_size_t anchored_popover_count;
 };
 
-ElementRareData::ElementRareData(NodeRenderingData* node_layout_data)
+ElementRareData::ElementRareData(NodeData* node_layout_data)
     : ElementRareDataBase(node_layout_data), class_list_(nullptr) {}
 
 ElementRareData::~ElementRareData() {
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h
index 0dd531a..dde26e7 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -63,7 +63,7 @@
 
 class ElementRareData final : public ElementRareDataBase {
  public:
-  explicit ElementRareData(NodeRenderingData*);
+  explicit ElementRareData(NodeData*);
   ~ElementRareData() override;
 
   void SetPseudoElement(
diff --git a/third_party/blink/renderer/core/dom/element_rare_data_base.h b/third_party/blink/renderer/core/dom/element_rare_data_base.h
index 62506c6e9..9a77cec 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data_base.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data_base.h
@@ -42,8 +42,9 @@
 
 class ElementRareDataBase : public NodeRareData {
  public:
-  explicit ElementRareDataBase(NodeRenderingData* node_layout_data)
-      : NodeRareData(ClassType::kElementRareData, node_layout_data) {}
+  explicit ElementRareDataBase(NodeData* node_layout_data)
+      : NodeRareData(ClassType::kElementRareData,
+                     std::move(*node_layout_data)) {}
 
   virtual void SetPseudoElement(
       PseudoId,
diff --git a/third_party/blink/renderer/core/dom/element_rare_data_vector.cc b/third_party/blink/renderer/core/dom/element_rare_data_vector.cc
index 2dcb62f..6e349d7 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data_vector.cc
+++ b/third_party/blink/renderer/core/dom/element_rare_data_vector.cc
@@ -35,8 +35,7 @@
 
 namespace blink {
 
-ElementRareDataVector::ElementRareDataVector(
-    NodeRenderingData* node_layout_data)
+ElementRareDataVector::ElementRareDataVector(NodeData* node_layout_data)
     : ElementRareDataBase(node_layout_data) {}
 
 ElementRareDataVector::~ElementRareDataVector() {
diff --git a/third_party/blink/renderer/core/dom/element_rare_data_vector.h b/third_party/blink/renderer/core/dom/element_rare_data_vector.h
index 4c4ffe9..6a160301 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data_vector.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data_vector.h
@@ -121,7 +121,7 @@
   }
 
  public:
-  explicit ElementRareDataVector(NodeRenderingData*);
+  explicit ElementRareDataVector(NodeData*);
   ~ElementRareDataVector() override;
 
   void SetPseudoElement(
diff --git a/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc b/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc
index c53506a5..ddedc74 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc
+++ b/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc
@@ -20,7 +20,7 @@
  public:
   void SetUp() override {
     rare_data_ = MakeGarbageCollected<ElementRareDataVector>(
-        MakeGarbageCollected<NodeRenderingData>(nullptr, nullptr));
+        MakeGarbageCollected<NodeData>(nullptr, nullptr));
   }
 
   void SetField(unsigned field_id, ElementRareDataField* field) {
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index f77e245..d7fbdf8 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -319,7 +319,7 @@
       tree_scope_(tree_scope),
       previous_(nullptr),
       next_(nullptr),
-      data_(&NodeRenderingData::SharedEmptyData()) {
+      data_(&NodeData::SharedEmptyData()) {
   DCHECK(tree_scope_ || type == kCreateDocument || type == kCreateShadowRoot);
 #if DUMP_NODE_STATISTICS
   LiveNodeSet().insert(this);
@@ -337,13 +337,12 @@
 NodeRareData& Node::CreateRareData() {
   if (IsElementNode()) {
     if (RuntimeEnabledFeatures::ElementSuperRareDataEnabled()) {
-      data_ = MakeGarbageCollected<ElementRareDataVector>(
-          DataAsNodeRenderingData());
+      data_ = MakeGarbageCollected<ElementRareDataVector>(data_);
     } else {
-      data_ = MakeGarbageCollected<ElementRareData>(DataAsNodeRenderingData());
+      data_ = MakeGarbageCollected<ElementRareData>(data_);
     }
   } else {
-    data_ = MakeGarbageCollected<NodeRareData>(DataAsNodeRenderingData());
+    data_ = MakeGarbageCollected<NodeRareData>(std::move(*data_));
   }
 
   DCHECK(data_);
@@ -1018,32 +1017,22 @@
 }
 
 void Node::SetLayoutObject(LayoutObject* layout_object) {
-  NodeRenderingData* node_layout_data =
-      HasRareData() ? DataAsNodeRareData()->GetNodeRenderingData()
-                    : DataAsNodeRenderingData();
-
   DCHECK(!layout_object || layout_object->GetNode() == this);
 
-  // Already pointing to a non empty NodeRenderingData so just set the pointer
+  // Already pointing to a non empty NodeData so just set the pointer
   // to the new LayoutObject.
-  if (!node_layout_data->IsSharedEmptyData()) {
-    node_layout_data->SetLayoutObject(layout_object);
+  if (!data_->IsSharedEmptyData()) {
+    data_->SetLayoutObject(layout_object);
     return;
   }
 
   if (!layout_object)
     return;
 
-  // Swap the NodeRenderingData to point to a new NodeRenderingData instead of
+  // Swap the NodeData to point to a new NodeData instead of
   // the static SharedEmptyData instance.
-  DCHECK(!node_layout_data->GetComputedStyle());
-  node_layout_data =
-      MakeGarbageCollected<NodeRenderingData>(layout_object, nullptr);
-  if (HasRareData()) {
-    DataAsNodeRareData()->SetNodeRenderingData(node_layout_data);
-  } else {
-    data_ = node_layout_data;
-  }
+  DCHECK(!data_->GetComputedStyle());
+  data_ = MakeGarbageCollected<NodeData>(layout_object, nullptr);
 }
 
 void Node::SetComputedStyle(scoped_refptr<const ComputedStyle> computed_style) {
@@ -1055,14 +1044,10 @@
         ->UpdateViewTransitionNames(*element, computed_style.get());
   }
 
-  NodeRenderingData* node_layout_data =
-      HasRareData() ? DataAsNodeRareData()->GetNodeRenderingData()
-                    : DataAsNodeRenderingData();
-
-  // Already pointing to a non empty NodeRenderingData so just set the pointer
+  // Already pointing to a non empty NodeData so just set the pointer
   // to the new LayoutObject.
-  if (!node_layout_data->IsSharedEmptyData()) {
-    node_layout_data->SetComputedStyle(computed_style);
+  if (!data_->IsSharedEmptyData()) {
+    data_->SetComputedStyle(computed_style);
     return;
   }
 
@@ -1074,16 +1059,10 @@
   DCHECK(computed_style->IsEnsuredInDisplayNone() ||
          LayoutTreeBuilderTraversal::Parent(*this));
 
-  // Swap the NodeRenderingData to point to a new NodeRenderingData instead of
+  // Swap the NodeData to point to a new NodeData instead of
   // the static SharedEmptyData instance.
-  DCHECK(!node_layout_data->GetLayoutObject());
-  node_layout_data =
-      MakeGarbageCollected<NodeRenderingData>(nullptr, computed_style);
-  if (HasRareData()) {
-    DataAsNodeRareData()->SetNodeRenderingData(node_layout_data);
-  } else {
-    data_ = node_layout_data;
-  }
+  DCHECK(!data_->GetLayoutObject());
+  data_ = MakeGarbageCollected<NodeData>(nullptr, computed_style);
 }
 
 LayoutBoxModelObject* Node::GetLayoutBoxModelObject() const {
@@ -2219,6 +2198,13 @@
                                kDocumentPositionContains | connection;
 }
 
+NodeData& Node::EnsureMutableData() {
+  if (data_->IsSharedEmptyData()) {
+    data_ = MakeGarbageCollected<NodeData>(nullptr, nullptr);
+  }
+  return *data_;
+}
+
 void Node::InvalidateIfHasEffectiveAppearance() const {
   auto* layout_object = GetLayoutObject();
   if (!layout_object)
@@ -2597,6 +2583,7 @@
     DCHECK_NE(&GetDocument(), &new_document);
   }
 #endif  // DCHECK_IS_ON()
+
   // In rare situations, this node may be the focused element of the old
   // document. In this case, we need to clear the focused element of the old
   // document, and since we are currently in an event forbidden scope, we can't
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index d1bfbde0..41de8f94 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -339,10 +339,9 @@
 
   DISABLE_CFI_PERF bool IsPseudoElement() const {
 #if DCHECK_IS_ON()
-    DCHECK_EQ(HasRareData() && DataAsNodeRareData()->IsPseudoElement(),
-              GetPseudoId() != kPseudoIdNone);
+    DCHECK_EQ(data_->IsPseudoElement(), GetPseudoId() != kPseudoIdNone);
 #endif
-    return HasRareData() && DataAsNodeRareData()->IsPseudoElement();
+    return data_->IsPseudoElement();
   }
   DISABLE_CFI_PERF bool IsBeforePseudoElement() const {
     return GetPseudoId() == kPseudoIdBefore;
@@ -722,11 +721,7 @@
   // in hot code paths.
   // Note that if a Node has a layoutObject, it's parentNode is guaranteed to
   // have one as well.
-  LayoutObject* GetLayoutObject() const {
-    return HasRareData()
-               ? DataAsNodeRareData()->GetNodeRenderingData()->GetLayoutObject()
-               : DataAsNodeRenderingData()->GetLayoutObject();
-  }
+  LayoutObject* GetLayoutObject() const { return data_->GetLayoutObject(); }
   void SetLayoutObject(LayoutObject*);
   // Use these two methods with caution.
   LayoutBox* GetLayoutBox() const;
@@ -1140,6 +1135,7 @@
 
     return CreateRareData();
   }
+  NodeData& EnsureMutableData();
 
   void SetHasCustomStyleCallbacks() {
     SetFlag(true, kHasCustomStyleCallbacksFlag);
@@ -1155,6 +1151,8 @@
 
   void InvalidateIfHasEffectiveAppearance() const;
 
+  inline const ComputedStyle* GetComputedStyleAssumingElement() const;
+
  private:
   // Gets nodeName without caching AtomicStrings. Used by
   // debugName. Compositor may call debugName from the "impl" thread
@@ -1192,10 +1190,6 @@
     DCHECK(HasRareData());
     return reinterpret_cast<NodeRareData*>(data_.Get());
   }
-  NodeRenderingData* DataAsNodeRenderingData() const {
-    DCHECK(!HasRareData());
-    return reinterpret_cast<NodeRenderingData*>(data_.Get());
-  }
   ShadowRoot* GetSlotAssignmentRoot() const;
 
   void AddCandidateDirectionalityForSlot();
diff --git a/third_party/blink/renderer/core/dom/node_computed_style.h b/third_party/blink/renderer/core/dom/node_computed_style.h
index fd0e43e..28a0f2a1 100644
--- a/third_party/blink/renderer/core/dom/node_computed_style.h
+++ b/third_party/blink/renderer/core/dom/node_computed_style.h
@@ -34,10 +34,7 @@
 
 inline const ComputedStyle* Node::GetComputedStyle() const {
   if (IsElementNode()) {
-    return HasRareData() ? DataAsNodeRareData()
-                               ->GetNodeRenderingData()
-                               ->GetComputedStyle()
-                         : DataAsNodeRenderingData()->GetComputedStyle();
+    return GetComputedStyleAssumingElement();
   }
   // Text nodes and Document.
   if (LayoutObject* layout_object = GetLayoutObject())
@@ -51,5 +48,14 @@
   return *style;
 }
 
+inline const ComputedStyle* Node::GetComputedStyleAssumingElement() const {
+  DCHECK(IsElementNode());
+  return data_->GetComputedStyle();
+}
+
+inline const ComputedStyle* Element::GetComputedStyle() const {
+  return GetComputedStyleAssumingElement();
+}
+
 }  // namespace blink
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_DOM_NODE_COMPUTED_STYLE_H_
diff --git a/third_party/blink/renderer/core/dom/node_rare_data.cc b/third_party/blink/renderer/core/dom/node_rare_data.cc
index ff7d593..aa089c6 100644
--- a/third_party/blink/renderer/core/dom/node_rare_data.cc
+++ b/third_party/blink/renderer/core/dom/node_rare_data.cc
@@ -46,7 +46,8 @@
 namespace blink {
 
 struct SameSizeAsNodeRareData : NodeData {
-  Member<void*> member_[5];
+  uint16_t bit_fields_;
+  Member<void*> member_[4];
 };
 
 ASSERT_SIZE(NodeRareData, SameSizeAsNodeRareData);
@@ -78,30 +79,31 @@
   registry_.EraseAt(registry_.Find(registration));
 }
 
-void NodeData::Trace(Visitor* visitor) const {}
-
-NodeRenderingData::NodeRenderingData(
-    LayoutObject* layout_object,
-    scoped_refptr<const ComputedStyle> computed_style)
-    : NodeData(ClassType::kNodeRenderingData),
+NodeData::NodeData(LayoutObject* layout_object,
+                   scoped_refptr<const ComputedStyle> computed_style)
+    : computed_style_(computed_style),
       layout_object_(layout_object),
-      computed_style_(computed_style) {}
+      bit_field_(RestyleFlags::encode(0) |
+                 ClassTypeData::encode(static_cast<uint16_t>(
+                     ClassType::kNodeRareData))  // Just pick any.
+      ) {}
 
-void NodeRenderingData::SetComputedStyle(
+NodeData::NodeData(blink::NodeData&&) = default;
+NodeData::~NodeData() = default;
+
+void NodeData::SetComputedStyle(
     scoped_refptr<const ComputedStyle> computed_style) {
   DCHECK_NE(&SharedEmptyData(), this);
   computed_style_ = computed_style;
 }
 
-NodeRenderingData& NodeRenderingData::SharedEmptyData() {
-  DEFINE_STATIC_LOCAL(
-      Persistent<NodeRenderingData>, shared_empty_data,
-      (MakeGarbageCollected<NodeRenderingData>(nullptr, nullptr)));
+NodeData& NodeData::SharedEmptyData() {
+  DEFINE_STATIC_LOCAL(Persistent<NodeData>, shared_empty_data,
+                      (MakeGarbageCollected<NodeData>(nullptr, nullptr)));
   return *shared_empty_data;
 }
-void NodeRenderingData::Trace(Visitor* visitor) const {
+void NodeData::Trace(Visitor* visitor) const {
   visitor->Trace(layout_object_);
-  NodeData::Trace(visitor);
 }
 
 void NodeRareData::RegisterScrollTimeline(ScrollTimeline* timeline) {
@@ -127,7 +129,6 @@
 void NodeRareData::Trace(blink::Visitor* visitor) const {
   visitor->Trace(mutation_observer_data_);
   visitor->Trace(flat_tree_node_data_);
-  visitor->Trace(node_layout_data_);
   visitor->Trace(node_lists_);
   visitor->Trace(scroll_timelines_);
   NodeData::Trace(visitor);
diff --git a/third_party/blink/renderer/core/dom/node_rare_data.h b/third_party/blink/renderer/core/dom/node_rare_data.h
index 5d7202f..ebc4fc9 100644
--- a/third_party/blink/renderer/core/dom/node_rare_data.h
+++ b/third_party/blink/renderer/core/dom/node_rare_data.h
@@ -41,7 +41,6 @@
 class LayoutObject;
 class MutationObserverRegistration;
 class NodeListsNodeData;
-class NodeRenderingData;
 class NodeRareData;
 class ScrollTimeline;
 
@@ -80,21 +79,44 @@
     kNumberOfDynamicRestyleFlags = 14
   };
 
+  // NOTE: This can only distinguish between NodeRareData and ElementRareData,
+  // not a regular NodeData (because we never need to do that).
   enum class ClassType : uint8_t {
     kNodeRareData,
     kElementRareData,
-    kNodeRenderingData,
-    kLastType = kNodeRenderingData
+    kLastType = kElementRareData,
   };
 
-  virtual ~NodeData() = default;
+  virtual ~NodeData();
   virtual void Trace(Visitor*) const;
 
+  CORE_EXPORT NodeData(LayoutObject*,
+                       scoped_refptr<const ComputedStyle> computed_style);
+  NodeData(const NodeData&) = delete;
+  NodeData(NodeData&&);
+
+  LayoutObject* GetLayoutObject() const { return layout_object_; }
+  void SetLayoutObject(LayoutObject* layout_object) {
+    DCHECK_NE(&SharedEmptyData(), this);
+    layout_object_ = layout_object;
+  }
+
+  const ComputedStyle* GetComputedStyle() const {
+    return computed_style_.get();
+  }
+  void SetComputedStyle(scoped_refptr<const ComputedStyle> computed_style);
+
+  void SetIsPseudoElement(bool value) { is_pseudo_element_ = value; }
+  bool IsPseudoElement() const { return is_pseudo_element_; }
+
+  static NodeData& SharedEmptyData();
+  bool IsSharedEmptyData() { return this == &SharedEmptyData(); }
+
  protected:
   using BitField = WTF::ConcurrentlyReadBitField<uint16_t>;
   using RestyleFlags =
       BitField::DefineFirstValue<uint16_t, kNumberOfDynamicRestyleFlags>;
-  static constexpr size_t kClassTypeBits = 2;
+  static constexpr size_t kClassTypeBits = 1;
   static_assert(static_cast<size_t>(ClassType::kLastType) <
                     ((size_t{1} << kClassTypeBits)),
                 "Too many subtypes to fit into bitfield.");
@@ -103,35 +125,22 @@
                                     kClassTypeBits,
                                     WTF::BitFieldValueConstness::kConst>;
 
-  explicit NodeData(ClassType sub_type)
-      : connected_frame_count_(0),
-        element_flags_(0),
-        is_pseudo_element_(false),
-        bit_field_(RestyleFlags::encode(0) |
-                   ClassTypeData::encode(static_cast<uint8_t>(sub_type))) {}
-
   ClassType GetClassType() const {
     return static_cast<ClassType>(bit_field_.get_concurrently<ClassTypeData>());
   }
 
-  uint16_t connected_frame_count_ : kConnectedFrameCountBits;
-  uint16_t element_flags_ : kNumberOfElementFlags;
-  bool is_pseudo_element_ : 1;
+ protected:
+  scoped_refptr<const ComputedStyle> computed_style_;
+  Member<LayoutObject> layout_object_;
   BitField bit_field_;
+  bool is_pseudo_element_ = false;
+  // 8 free bits here (or 16, if moving is_pseudo_element_ into bit_field_).
 
   friend struct DowncastTraits<NodeRareData>;
-  friend struct DowncastTraits<NodeRenderingData>;
   friend struct DowncastTraits<ElementRareData>;
 };
 
 template <>
-struct DowncastTraits<NodeRenderingData> {
-  static bool AllowFrom(const NodeData& node_data) {
-    return node_data.GetClassType() == NodeData::ClassType::kNodeRenderingData;
-  }
-};
-
-template <>
 struct DowncastTraits<NodeRareData> {
   static bool AllowFrom(const NodeData& node_data) {
     return node_data.GetClassType() == NodeData::ClassType::kNodeRareData;
@@ -145,47 +154,18 @@
   }
 };
 
-class CORE_EXPORT NodeRenderingData final : public NodeData {
- public:
-  NodeRenderingData(LayoutObject*,
-                    scoped_refptr<const ComputedStyle> computed_style);
-  NodeRenderingData(const NodeRenderingData&) = delete;
-  NodeRenderingData& operator=(const NodeRenderingData&) = delete;
-
-  LayoutObject* GetLayoutObject() const { return layout_object_; }
-  void SetLayoutObject(LayoutObject* layout_object) {
-    DCHECK_NE(&SharedEmptyData(), this);
-    layout_object_ = layout_object;
-  }
-
-  const ComputedStyle* GetComputedStyle() const {
-    return computed_style_.get();
-  }
-  void SetComputedStyle(scoped_refptr<const ComputedStyle> computed_style);
-
-  static NodeRenderingData& SharedEmptyData();
-  bool IsSharedEmptyData() { return this == &SharedEmptyData(); }
-
-  void Trace(Visitor*) const override;
-
- private:
-  Member<LayoutObject> layout_object_;
-  scoped_refptr<const ComputedStyle> computed_style_;
-};
-
 class NodeRareData : public NodeData {
  public:
-  explicit NodeRareData(NodeRenderingData* node_layout_data)
-      : NodeRareData(ClassType::kNodeRareData, node_layout_data) {}
+  explicit NodeRareData(NodeData&& node_layout_data)
+      : NodeData(std::move(node_layout_data)),
+        connected_frame_count_(0),
+        element_flags_(0) {
+    bit_field_.set<ClassTypeData>(
+        ClassTypeData::encode(static_cast<uint8_t>(ClassType::kNodeRareData)));
+  }
   NodeRareData(const NodeRareData&) = delete;
   NodeRareData& operator=(const NodeRareData&) = delete;
 
-  NodeRenderingData* GetNodeRenderingData() const { return node_layout_data_; }
-  void SetNodeRenderingData(NodeRenderingData* node_layout_data) {
-    DCHECK(node_layout_data);
-    node_layout_data_ = node_layout_data;
-  }
-
   void ClearNodeLists() { node_lists_.Clear(); }
   NodeListsNodeData* NodeLists() const { return node_lists_.Get(); }
   // EnsureNodeLists() and a following NodeListsNodeData functions must be
@@ -245,18 +225,20 @@
   void UnregisterScrollTimeline(ScrollTimeline*);
   void InvalidateAssociatedAnimationEffects();
 
-  void SetIsPseudoElement(bool value) { is_pseudo_element_ = value; }
-  bool IsPseudoElement() const { return is_pseudo_element_; }
-
   void Trace(blink::Visitor*) const override;
 
  protected:
-  NodeRareData(ClassType class_type, NodeRenderingData* node_layout_data)
-      : NodeData(class_type), node_layout_data_(node_layout_data) {
-    CHECK_NE(node_layout_data, nullptr);
+  NodeRareData(ClassType class_type, NodeData&& node_layout_data)
+      : NodeData(std::move(node_layout_data)),
+        connected_frame_count_(0),
+        element_flags_(0) {
+    bit_field_.set<ClassTypeData>(
+        ClassTypeData::encode(static_cast<uint16_t>(class_type)));
   }
 
-  Member<NodeRenderingData> node_layout_data_;
+  uint16_t connected_frame_count_ : kConnectedFrameCountBits;
+  uint16_t element_flags_ : kNumberOfElementFlags;
+  // 16 free bits here.
 
  private:
   NodeListsNodeData& CreateNodeLists();
diff --git a/third_party/blink/renderer/core/dom/pseudo_element.cc b/third_party/blink/renderer/core/dom/pseudo_element.cc
index 46b4ebf..d8f37f4 100644
--- a/third_party/blink/renderer/core/dom/pseudo_element.cc
+++ b/third_party/blink/renderer/core/dom/pseudo_element.cc
@@ -178,7 +178,7 @@
   parent->GetTreeScope().AdoptIfNeeded(*this);
   SetParentOrShadowHostNode(parent);
   SetHasCustomStyleCallbacks();
-  EnsureRareData().SetIsPseudoElement(true);
+  EnsureMutableData().SetIsPseudoElement(true);
   if ((pseudo_id == kPseudoIdBefore || pseudo_id == kPseudoIdAfter) &&
       parent->HasTagName(html_names::kInputTag)) {
     UseCounter::Count(parent->GetDocument(),
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index 8e15273..b320f51 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -2452,7 +2452,7 @@
     // metadata (navigated by urn:uuids).
     // If we are in an iframe that doesn't qualify, return nullptr.
     if (!blink::features::IsAllowURNsInIframeEnabled() ||
-        !GetFrame()->GetDocument()->Loader()->FencedFrameReporting()) {
+        !GetFrame()->GetDocument()->Loader()->HasFencedFrameReporting()) {
       return nullptr;
     }
   }
diff --git a/third_party/blink/renderer/core/html/fenced_frame/fence.cc b/third_party/blink/renderer/core/html/fenced_frame/fence.cc
index a5b592c..5aaf015 100644
--- a/third_party/blink/renderer/core/html/fenced_frame/fence.cc
+++ b/third_party/blink/renderer/core/html/fenced_frame/fence.cc
@@ -9,12 +9,12 @@
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
 #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom-blink.h"
+#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_fence_event.h"
 #include "third_party/blink/renderer/core/frame/frame_owner.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/loader/document_loader.h"
-#include "third_party/blink/renderer/core/loader/ping_loader.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
@@ -97,49 +97,18 @@
   DCHECK(fenced_frame);
   DCHECK(fenced_frame->GetDocument());
 
-  const absl::optional<blink::FencedFrameReporting>& fenced_frame_reporting =
-      fenced_frame->GetDocument()->Loader()->FencedFrameReporting();
-  if (!fenced_frame_reporting) {
+  bool has_fenced_frame_reporting =
+      fenced_frame->GetDocument()->Loader()->HasFencedFrameReporting();
+  if (!has_fenced_frame_reporting) {
     AddConsoleMessage("This frame did not register reporting metadata.");
     return;
   }
 
   for (const V8FenceReportingDestination& web_destination :
        event->destination()) {
-    blink::FencedFrame::ReportingDestination destination =
-        ToPublicDestination(web_destination);
-
-    const auto metadata_iter =
-        fenced_frame_reporting->metadata.find(destination);
-    if (metadata_iter == fenced_frame_reporting->metadata.end()) {
-      AddConsoleMessage(
-          "This frame did not register reporting metadata for "
-          "destination '" +
-          web_destination.AsString() + "'.");
-      continue;
-    }
-
-    const auto url_iter = metadata_iter->value.find(event->eventType());
-    if (url_iter == metadata_iter->value.end()) {
-      AddConsoleMessage(
-          "This frame did not register reporting url for "
-          "destination '" +
-          web_destination.AsString() + "' and event_type '" +
-          event->eventType() + "'.");
-      continue;
-    }
-
-    KURL url = url_iter->value;
-    if (!url.IsValid() || !url.ProtocolIsInHTTPFamily()) {
-      AddConsoleMessage(
-          "This frame registered invalid reporting url for "
-          "destination '" +
-          web_destination.AsString() + "' and event_type '" +
-          event->eventType() + "'.");
-      continue;
-    }
-
-    PingLoader::SendBeacon(*script_state, frame, url, event->eventData());
+    fenced_frame->GetLocalFrameHostRemote().SendFencedFrameReportingBeacon(
+        event->eventData(), event->eventType(),
+        ToPublicDestination(web_destination));
   }
 }
 
@@ -169,7 +138,7 @@
   DCHECK(DomWindow());
   DomWindow()->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
       mojom::blink::ConsoleMessageSource::kJavaScript,
-      mojom::blink::ConsoleMessageLevel::kWarning, message));
+      mojom::blink::ConsoleMessageLevel::kError, message));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc
index 13ca971..48174b9 100644
--- a/third_party/blink/renderer/core/layout/layout_block.cc
+++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -2125,7 +2125,7 @@
   if (!IsAnonymous())  // For anonymous blocks, the children add outline rects.
     rects.emplace_back(additional_offset, Size());
 
-  if (include_block_overflows == NGOutlineType::kIncludeBlockVisualOverflow &&
+  if (ShouldIncludeBlockVisualOverflow(include_block_overflows) &&
       !HasNonVisibleOverflow() && !HasControlClip()) {
     AddOutlineRectsForNormalChildren(rects, additional_offset,
                                      include_block_overflows);
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index 03bd411..f7faff0 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -4702,7 +4702,7 @@
   LayoutBlock::AddOutlineRects(rects, info, additional_offset,
                                include_block_overflows);
 
-  if (include_block_overflows == NGOutlineType::kIncludeBlockVisualOverflow &&
+  if (ShouldIncludeBlockVisualOverflow(include_block_overflows) &&
       !HasNonVisibleOverflow() && !HasControlClip()) {
     for (RootInlineBox* curr = FirstRootBox(); curr;
          curr = curr->NextRootBox()) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_outline_type.h b/third_party/blink/renderer/core/layout/ng/ng_outline_type.h
index bf2d59a..a4b82ad 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_outline_type.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_outline_type.h
@@ -9,10 +9,20 @@
 
 // Outline styles
 enum class NGOutlineType {
-  kDontIncludeBlockVisualOverflow,  // Standard outline
-  kIncludeBlockVisualOverflow,      // Focus outline
+  kDontIncludeBlockVisualOverflow,       // Standard outline
+  kIncludeBlockVisualOverflow,           // Focus outline
+  kIncludeBlockVisualOverflowForAnchor,  // Focus outline for anchor
 };
 
+inline bool ShouldIncludeBlockVisualOverflow(NGOutlineType type) {
+  return type == NGOutlineType::kIncludeBlockVisualOverflow ||
+         type == NGOutlineType::kIncludeBlockVisualOverflowForAnchor;
+}
+
+inline bool ShouldIncludeBlockVisualOverflowForAnchorOnly(NGOutlineType type) {
+  return type == NGOutlineType::kIncludeBlockVisualOverflowForAnchor;
+}
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_OUTLINE_TYPE_H_
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
index 71f407d..6bb3b40 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -1320,6 +1320,11 @@
       *info = LayoutObject::OutlineInfo::GetFromStyle(Style());
   }
 
+  if (ShouldIncludeBlockVisualOverflow(outline_type) &&
+      IsA<HTMLAnchorElement>(GetNode())) {
+    outline_type = NGOutlineType::kIncludeBlockVisualOverflowForAnchor;
+  }
+
   AddOutlineRects(additional_offset, outline_type,
                   /* container_relative */ false, outline_rects);
 }
@@ -1358,7 +1363,7 @@
     }
   }
 
-  if (outline_type == NGOutlineType::kIncludeBlockVisualOverflow &&
+  if (ShouldIncludeBlockVisualOverflow(outline_type) &&
       !HasNonVisibleOverflow() && !HasControlClip(*this)) {
     // Tricky code ahead: we pass a 0,0 additional_offset to
     // AddOutlineRectsForNormalChildren, and add it in after the call.
@@ -1375,8 +1380,13 @@
            base::make_span(*outline_rects).subspan(size_before))
         rect.offset += additional_offset;
     }
-    for (const auto& child : PostLayoutChildren()) {
-      if (child->IsOutOfFlowPositioned()) {
+
+    if (ShouldIncludeBlockVisualOverflowForAnchorOnly(outline_type)) {
+      for (const auto& child : PostLayoutChildren()) {
+        if (!child->IsOutOfFlowPositioned()) {
+          continue;
+        }
+
         AddOutlineRectsForDescendant(
             child, outline_rects, additional_offset, outline_type,
             To<LayoutBoxModelObject>(GetLayoutObject()));
@@ -1448,11 +1458,35 @@
   // Adjust the rectangles using |additional_offset| and |container_relative|.
   if (!container_relative)
     additional_offset -= this_offset_in_container;
-  if (additional_offset.IsZero())
-    return;
-  for (PhysicalRect& rect :
-       base::make_span(rects->begin() + initial_rects_size, rects->end()))
-    rect.offset += additional_offset;
+  if (!additional_offset.IsZero()) {
+    for (PhysicalRect& rect :
+         base::make_span(rects->begin() + initial_rects_size, rects->end())) {
+      rect.offset += additional_offset;
+    }
+  }
+
+  if (ShouldIncludeBlockVisualOverflowForAnchorOnly(outline_type) &&
+      !HasNonVisibleOverflow() && !HasControlClip(*this)) {
+    if (container->IsAnonymousBlock()) {
+      // TODO(crbug.com/1380673): Just picking the first fragment isn't right.
+      container =
+          To<LayoutBox>(container->GetLayoutObject()->NonAnonymousAncestor())
+              ->GetPhysicalFragment(0);
+      DCHECK(container);
+    }
+
+    for (const auto& child : container->PostLayoutChildren()) {
+      if (!child->IsOutOfFlowPositioned() ||
+          child->GetLayoutObject()->ContainerForAbsolutePosition() !=
+              layout_object) {
+        continue;
+      }
+
+      AddOutlineRectsForDescendant(child, rects, additional_offset,
+                                   outline_type,
+                                   To<LayoutBoxModelObject>(layout_object));
+    }
+  }
 }
 
 PositionWithAffinity NGPhysicalBoxFragment::PositionForPoint(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index 6b3d8a52..e498883 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -853,8 +853,9 @@
       }
       case NGFragmentItem::kGeneratedText:
       case NGFragmentItem::kText: {
-        if (outline_type == NGOutlineType::kDontIncludeBlockVisualOverflow)
+        if (!ShouldIncludeBlockVisualOverflow(outline_type)) {
           break;
+        }
         PhysicalRect rect = item.RectInContainerFragment();
         if (UNLIKELY(text_combine))
           rect = text_combine->AdjustRectForBoundingBox(rect);
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 546b323..8ddc8bb 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -303,7 +303,7 @@
   std::unique_ptr<CodeCacheHost> code_cache_host;
   HashMap<KURL, EarlyHintsPreloadEntry> early_hints_preloaded_resources;
   absl::optional<Vector<KURL>> ad_auction_components;
-  absl::optional<blink::FencedFrameReporting> fenced_frame_reporting;
+  bool has_fenced_frame_reporting_;
   std::unique_ptr<ExtraData> extra_data;
   AtomicString reduced_accept_language;
   network::mojom::NavigationDeliveryType navigation_delivery_type;
@@ -504,6 +504,7 @@
           params_->is_cross_site_cross_browsing_context_group),
       navigation_api_back_entries_(params_->navigation_api_back_entries),
       navigation_api_forward_entries_(params_->navigation_api_forward_entries),
+      has_fenced_frame_reporting_(params_->has_fenced_frame_reporting),
       extra_data_(std::move(extra_data)),
       reduced_accept_language_(params_->reduced_accept_language),
       navigation_delivery_type_(params_->navigation_delivery_type),
@@ -561,18 +562,6 @@
     }
   }
 
-  if (params_->fenced_frame_reporting) {
-    fenced_frame_reporting_.emplace();
-    for (const auto& [destination, metadata] :
-         params_->fenced_frame_reporting->metadata) {
-      HashMap<String, KURL> data;
-      for (const auto& [event_type, url] : metadata) {
-        data.insert(String::FromUTF8(event_type), KURL(url));
-      }
-      fenced_frame_reporting_->metadata.insert(destination, std::move(data));
-    }
-  }
-
   if (service_worker_network_provider_) {
     service_worker_initial_controller_mode_ =
         service_worker_network_provider_->GetControllerServiceWorkerMode();
@@ -655,20 +644,7 @@
       params->ad_auction_components->emplace_back(KURL(url));
     }
   }
-  if (fenced_frame_reporting_) {
-    params->fenced_frame_reporting.emplace();
-    for (const auto& [destination, metadata] :
-         fenced_frame_reporting_->metadata) {
-      base::flat_map<std::string, GURL> data;
-      for (const auto& [event_type, url] : metadata) {
-        data.emplace(event_type.Utf8(), url);
-      }
-      params->fenced_frame_reporting->metadata.emplace(destination,
-                                                       std::move(data));
-    }
-  }
-  if (fenced_frame_properties_)
-    params->fenced_frame_properties = std::move(fenced_frame_properties_);
+  params->has_fenced_frame_reporting = has_fenced_frame_reporting_;
   params->reduced_accept_language = reduced_accept_language_;
   params->navigation_delivery_type = navigation_delivery_type_;
   return params;
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h
index 49dbc526..3dc94d5 100644
--- a/third_party/blink/renderer/core/loader/document_loader.h
+++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -400,10 +400,7 @@
     return ad_auction_components_;
   }
 
-  const absl::optional<blink::FencedFrameReporting>& FencedFrameReporting()
-      const {
-    return fenced_frame_reporting_;
-  }
+  bool HasFencedFrameReporting() const { return has_fenced_frame_reporting_; }
 
   const absl::optional<FencedFrame::RedactedFencedFrameProperties>&
   FencedFrameProperties() const {
@@ -786,12 +783,10 @@
   // otherwise.
   absl::optional<Vector<KURL>> ad_auction_components_;
 
-  // If this is a navigation to a "opaque-ads" mode fenced frame, there might
-  // be associated reporting metadata. This is a map from destination type to
-  // reporting metadata which in turn is a map from the event type to the
-  // reporting url. `nullptr` otherwise.
+  // This boolean flag indicates whether there is associated reporting metadata
+  // with the fenced frame.
   // https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md
-  absl::optional<blink::FencedFrameReporting> fenced_frame_reporting_;
+  bool has_fenced_frame_reporting_;
 
   std::unique_ptr<ExtraData> extra_data_;
 
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 6fcd65d8..5e9b579 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -1060,40 +1060,35 @@
   // initiated from inside the fenced frame. Embedder-initiated navigations
   // use a unique origin (in `FencedFrame::Navigate`), so the requestor is
   // always considered cross-origin by the check (in MPArch).
+  // TODO(crbug.com/1381158): Move the checks for whether fenced frame reporting
+  // metadata should be copied or not, to the browser process.
   bool is_requestor_same_origin =
       !navigation_params->requestor_origin.IsNull() &&
       navigation_params->requestor_origin.IsSameOriginWith(
           WebSecurityOrigin::Create(navigation_params->url));
   if (is_requestor_same_origin) {
-    for (const WebNavigationParams::RedirectInfo& redirect :
-         navigation_params->redirects) {
-      is_requestor_same_origin &=
-          navigation_params->requestor_origin.IsSameOriginWith(
+    // Check if all redirects are same origin with `requestor_origin`.
+    // If there is a cross-origin redirect, renderer will mark the fenced frame
+    // having no associated reporting metadata.
+    auto has_same_origin_with_requestor =
+        [&requestor_origin = std::as_const(
+             navigation_params->requestor_origin)](const auto& redirect) {
+          return requestor_origin.IsSameOriginWith(
               WebSecurityOrigin::Create(redirect.new_url));
-    }
+        };
+    is_requestor_same_origin = base::ranges::all_of(
+        navigation_params->redirects, has_same_origin_with_requestor);
   }
   if (is_requestor_same_origin) {
-    const absl::optional<blink::FencedFrameReporting>&
-        old_fenced_frame_reporting = document_loader_->FencedFrameReporting();
-    // In urn iframes, embedder-initiated navigations may be same-origin, so
-    // this isn't true.
-    if (navigation_params->fenced_frame_reporting) {
+    if (navigation_params->has_fenced_frame_reporting) {
+      // In urn iframes, embedder-initiated navigations may be same-origin, so
+      // this isn't true.
       DCHECK(!frame_->IsFencedFrameRoot() &&
              blink::features::IsAllowURNsInIframeEnabled());
-    }
-
-    if (!navigation_params->fenced_frame_reporting &&
-        old_fenced_frame_reporting) {
-      navigation_params->fenced_frame_reporting.emplace();
-      for (const auto& [destination, event_type_url] :
-           old_fenced_frame_reporting->metadata) {
-        base::flat_map<std::string, GURL> data;
-        for (const auto& [event_type, url] : event_type_url) {
-          data.emplace(event_type.Utf8(), url);
-        }
-        navigation_params->fenced_frame_reporting->metadata.emplace(
-            destination, std::move(data));
-      }
+    } else if (document_loader_->HasFencedFrameReporting()) {
+      // Fenced frame reporting metadata persists across same-origin navigations
+      // initiated from inside the fenced frame.
+      navigation_params->has_fenced_frame_reporting = true;
     }
   }
 
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 58d5617..e03f56ae 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -863,6 +863,11 @@
     return GetFontDescription().Stretch();
   }
 
+  // font-style
+  FontSelectionValue GetFontStyle() const {
+    return GetFontDescription().Style();
+  }
+
   // Child is aligned to the parent by matching the parent’s dominant baseline
   // to the same baseline in the child.
   CORE_EXPORT FontBaseline GetFontBaseline() const;
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
index 01ff4b57..0c01176 100644
--- a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
+++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
@@ -249,6 +249,11 @@
 void FakeLocalFrameHost::ReceivedDelegatedCapability(
     blink::mojom::DelegatedCapability delegated_capability) {}
 
+void FakeLocalFrameHost::SendFencedFrameReportingBeacon(
+    const WTF::String& event_data,
+    const WTF::String& event_type,
+    blink::FencedFrame::ReportingDestination destination) {}
+
 void FakeLocalFrameHost::CreatePortal(
     mojo::PendingAssociatedReceiver<mojom::blink::Portal> portal,
     mojo::PendingAssociatedRemote<mojom::blink::PortalClient> client,
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.h b/third_party/blink/renderer/core/testing/fake_local_frame_host.h
index e392886..7beed0c 100644
--- a/third_party/blink/renderer/core/testing/fake_local_frame_host.h
+++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.h
@@ -169,6 +169,10 @@
   void DidChangeBaseURL(const ::blink::KURL& url) override;
   void ReceivedDelegatedCapability(
       blink::mojom::DelegatedCapability delegated_capability) override;
+  void SendFencedFrameReportingBeacon(
+      const WTF::String& event_data,
+      const WTF::String& event_type,
+      blink::FencedFrame::ReportingDestination destination) override;
   void CreatePortal(
       mojo::PendingAssociatedReceiver<mojom::blink::Portal> portal,
       mojo::PendingAssociatedRemote<mojom::blink::PortalClient> client,
diff --git a/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.cc
index c41101c..16ae27e4 100644
--- a/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.cc
@@ -3,11 +3,15 @@
 // found in the LICENSE file.
 
 #include "third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h"
+
+#include "base/notreached.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
 #include "third_party/blink/renderer/core/dom/abort_signal.h"
 #include "third_party/blink/renderer/core/dom/events/event_target_impl.h"
+#include "third_party/blink/renderer/core/streams/readable_byte_stream_controller.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
+#include "third_party/blink/renderer/core/streams/underlying_byte_source_base.h"
 #include "third_party/blink/renderer/core/streams/underlying_sink_base.h"
 #include "third_party/blink/renderer/core/streams/underlying_source_base.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
@@ -15,9 +19,107 @@
 #include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 
 namespace blink {
 
+namespace {
+
+class ForwardingUnderlyingSource : public UnderlyingSourceBase {
+ public:
+  explicit ForwardingUnderlyingSource(
+      ReadableStreamDefaultWrapper* readable_stream_wrapper)
+      : UnderlyingSourceBase(readable_stream_wrapper->GetScriptState()),
+        readable_stream_wrapper_(readable_stream_wrapper) {}
+
+  ScriptPromise Start(ScriptState* script_state) override {
+    readable_stream_wrapper_->SetController(Controller());
+    return ScriptPromise::CastUndefined(script_state);
+  }
+
+  ScriptPromise pull(ScriptState* script_state) override {
+    readable_stream_wrapper_->Pull();
+    return ScriptPromise::CastUndefined(script_state);
+  }
+
+  ScriptPromise Cancel(ScriptState* script_state, ScriptValue reason) override {
+    readable_stream_wrapper_->CloseStream();
+    return ScriptPromise::CastUndefined(script_state);
+  }
+
+  void Trace(Visitor* visitor) const override {
+    visitor->Trace(readable_stream_wrapper_);
+    UnderlyingSourceBase::Trace(visitor);
+  }
+
+ private:
+  const Member<ReadableStreamDefaultWrapper> readable_stream_wrapper_;
+};
+
+class ForwardingUnderlyingSink : public UnderlyingSinkBase {
+ public:
+  explicit ForwardingUnderlyingSink(
+      WritableStreamWrapper* writable_stream_wrapper)
+      : writable_stream_wrapper_(writable_stream_wrapper) {}
+
+  ScriptPromise start(ScriptState* script_state,
+                      WritableStreamDefaultController* controller,
+                      ExceptionState&) override {
+    class AbortAlgorithm final : public AbortSignal::Algorithm {
+     public:
+      explicit AbortAlgorithm(WritableStreamWrapper* writable_stream_wrapper)
+          : writable_stream_wrapper_(writable_stream_wrapper) {}
+
+      void Run() override { writable_stream_wrapper_->OnAbortSignal(); }
+
+      void Trace(Visitor* visitor) const override {
+        visitor->Trace(writable_stream_wrapper_);
+        Algorithm::Trace(visitor);
+      }
+
+     private:
+      Member<WritableStreamWrapper> writable_stream_wrapper_;
+    };
+
+    writable_stream_wrapper_->SetController(controller);
+    abort_handle_ = Controller()->signal()->AddAlgorithm(
+        MakeGarbageCollected<AbortAlgorithm>(writable_stream_wrapper_));
+    return ScriptPromise::CastUndefined(script_state);
+  }
+
+  ScriptPromise write(ScriptState*,
+                      ScriptValue chunk,
+                      WritableStreamDefaultController* controller,
+                      ExceptionState& exception_state) override {
+    DCHECK_EQ(writable_stream_wrapper_->Controller(), controller);
+    return writable_stream_wrapper_->Write(chunk, exception_state);
+  }
+
+  ScriptPromise close(ScriptState* script_state, ExceptionState&) override {
+    writable_stream_wrapper_->CloseStream();
+    abort_handle_.Clear();
+    return ScriptPromise::CastUndefined(script_state);
+  }
+
+  ScriptPromise abort(ScriptState* script_state,
+                      ScriptValue reason,
+                      ExceptionState& exception_state) override {
+    return close(script_state, exception_state);
+  }
+
+  void Trace(Visitor* visitor) const override {
+    visitor->Trace(writable_stream_wrapper_);
+    visitor->Trace(abort_handle_);
+    UnderlyingSinkBase::Trace(visitor);
+  }
+
+ private:
+  const Member<WritableStreamWrapper> writable_stream_wrapper_;
+  Member<AbortSignal::AlgorithmHandle> abort_handle_;
+};
+
+}  // namespace
+
 StreamWrapper::StreamWrapper(ScriptState* script_state)
     : script_state_(script_state) {}
 
@@ -35,22 +137,43 @@
 }
 
 void ReadableStreamWrapper::Trace(Visitor* visitor) const {
-  visitor->Trace(source_);
   visitor->Trace(readable_);
   StreamWrapper::Trace(visitor);
 }
 
-void ReadableStreamWrapper::InitSourceAndReadable(UnderlyingSource* source,
-                                                  size_t high_water_mark) {
-  source_ = source;
-  ScriptState::Scope scope(GetScriptState());
-  readable_ = ReadableStream::CreateWithCountQueueingStrategy(
-      GetScriptState(), source, high_water_mark);
+ReadableStreamDefaultWrapper::ReadableStreamDefaultWrapper(
+    ScriptState* script_state)
+    : ReadableStreamWrapper(script_state) {}
+
+void ReadableStreamDefaultWrapper::Trace(Visitor* visitor) const {
+  visitor->Trace(source_);
+  visitor->Trace(controller_);
+  ReadableStreamWrapper::Trace(visitor);
 }
 
-ReadableStreamDefaultControllerWithScriptScope*
-ReadableStreamWrapper::Controller() const {
-  return source_->Controller();
+// static
+UnderlyingSourceBase*
+ReadableStreamDefaultWrapper::MakeForwardingUnderlyingSource(
+    ReadableStreamDefaultWrapper* readable_stream_wrapper) {
+  return MakeGarbageCollected<ForwardingUnderlyingSource>(
+      readable_stream_wrapper);
+}
+
+ReadableByteStreamWrapper::ReadableByteStreamWrapper(ScriptState* script_state)
+    : ReadableStreamWrapper(script_state) {}
+
+void ReadableByteStreamWrapper::Trace(Visitor* visitor) const {
+  visitor->Trace(source_);
+  visitor->Trace(controller_);
+  ReadableStreamWrapper::Trace(visitor);
+}
+
+// static
+UnderlyingByteSourceBase*
+ReadableByteStreamWrapper::MakeForwardingUnderlyingByteSource(
+    ReadableByteStreamWrapper* readable_stream_wrapper) {
+  NOTIMPLEMENTED();
+  return nullptr;
 }
 
 WritableStreamWrapper::WritableStreamWrapper(ScriptState* script_state)
@@ -63,106 +186,15 @@
 void WritableStreamWrapper::Trace(Visitor* visitor) const {
   visitor->Trace(sink_);
   visitor->Trace(writable_);
+  visitor->Trace(controller_);
   StreamWrapper::Trace(visitor);
 }
 
-void WritableStreamWrapper::InitSinkAndWritable(UnderlyingSink* sink,
-                                                size_t high_water_mark) {
-  sink_ = sink;
-  ScriptState::Scope scope(GetScriptState());
-  writable_ = WritableStream::CreateWithCountQueueingStrategy(
-      GetScriptState(), sink, high_water_mark);
-}
-
-WritableStreamDefaultController* WritableStreamWrapper::Controller() const {
-  return sink_->Controller();
-}
-
-ReadableStreamWrapper::UnderlyingSource::UnderlyingSource(
-    ScriptState* script_state,
-    ReadableStreamWrapper* readable_stream_wrapper)
-    : UnderlyingSourceBase(script_state),
-      readable_stream_wrapper_(readable_stream_wrapper) {}
-
-ScriptPromise ReadableStreamWrapper::UnderlyingSource::Start(
-    ScriptState* script_state) {
-  return ScriptPromise::CastUndefined(script_state);
-}
-
-ScriptPromise ReadableStreamWrapper::UnderlyingSource::pull(
-    ScriptState* script_state) {
-  readable_stream_wrapper_->Pull();
-  return ScriptPromise::CastUndefined(script_state);
-}
-
-ScriptPromise ReadableStreamWrapper::UnderlyingSource::Cancel(
-    ScriptState* script_state,
-    ScriptValue) {
-  readable_stream_wrapper_->CloseStream();
-  return ScriptPromise::CastUndefined(script_state);
-}
-
-void ReadableStreamWrapper::UnderlyingSource::Trace(Visitor* visitor) const {
-  visitor->Trace(readable_stream_wrapper_);
-  UnderlyingSourceBase::Trace(visitor);
-}
-
-WritableStreamWrapper::UnderlyingSink::UnderlyingSink(
-    WritableStreamWrapper* writable_stream_wrapper)
-    : writable_stream_wrapper_(writable_stream_wrapper) {}
-
-ScriptPromise WritableStreamWrapper::UnderlyingSink::start(
-    ScriptState* script_state,
-    WritableStreamDefaultController*,
-    ExceptionState&) {
-  class AbortAlgorithm final : public AbortSignal::Algorithm {
-   public:
-    explicit AbortAlgorithm(WritableStreamWrapper* writable_stream_wrapper)
-        : writable_stream_wrapper_(writable_stream_wrapper) {}
-
-    void Run() override { writable_stream_wrapper_->OnAbortSignal(); }
-
-    void Trace(Visitor* visitor) const override {
-      visitor->Trace(writable_stream_wrapper_);
-      Algorithm::Trace(visitor);
-    }
-
-   private:
-    Member<WritableStreamWrapper> writable_stream_wrapper_;
-  };
-
-  abort_handle_ = Controller()->signal()->AddAlgorithm(
-      MakeGarbageCollected<AbortAlgorithm>(GetWritableStreamWrapper()));
-  return ScriptPromise::CastUndefined(script_state);
-}
-
-ScriptPromise WritableStreamWrapper::UnderlyingSink::write(
-    ScriptState* script_state,
-    ScriptValue chunk,
-    WritableStreamDefaultController*,
-    ExceptionState& exception_state) {
-  return writable_stream_wrapper_->Write(chunk, exception_state);
-}
-
-ScriptPromise WritableStreamWrapper::UnderlyingSink::close(
-    ScriptState* script_state,
-    ExceptionState&) {
-  writable_stream_wrapper_->CloseStream();
-  abort_handle_.Clear();
-  return ScriptPromise::CastUndefined(script_state);
-}
-
-ScriptPromise WritableStreamWrapper::UnderlyingSink::abort(
-    ScriptState* script_state,
-    ScriptValue,
-    ExceptionState& exception_state) {
-  return close(script_state, exception_state);
-}
-
-void WritableStreamWrapper::UnderlyingSink::Trace(Visitor* visitor) const {
-  visitor->Trace(writable_stream_wrapper_);
-  visitor->Trace(abort_handle_);
-  UnderlyingSinkBase::Trace(visitor);
+// static
+UnderlyingSinkBase* WritableStreamWrapper::MakeForwardingUnderlyingSink(
+    WritableStreamWrapper* writable_stream_wrapper) {
+  return MakeGarbageCollected<ForwardingUnderlyingSink>(
+      writable_stream_wrapper);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h b/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h
index 4fc435f..3f6b41e3 100644
--- a/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h
+++ b/third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h
@@ -6,20 +6,18 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_STREAM_WRAPPER_H_
 
 #include "base/containers/span.h"
-#include "base/notreached.h"
-#include "third_party/blink/renderer/core/dom/abort_signal.h"
+#include "third_party/blink/renderer/core/streams/readable_byte_stream_controller.h"
+#include "third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h"
+#include "third_party/blink/renderer/core/streams/underlying_byte_source_base.h"
 #include "third_party/blink/renderer/core/streams/underlying_sink_base.h"
 #include "third_party/blink/renderer/core/streams/underlying_source_base.h"
+#include "third_party/blink/renderer/core/streams/writable_stream_default_controller.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
-#include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace net {
-
 class IPEndPoint;
-
 }  // namespace net
 
 namespace blink {
@@ -42,6 +40,7 @@
   State GetState() const { return state_; }
   ScriptState* GetScriptState() const { return script_state_; }
 
+  // Checks whether associated stream is locked to a reader/writer.
   virtual bool Locked() const = 0;
 
   virtual void CloseStream() = 0;
@@ -59,45 +58,89 @@
 
 class ReadableStreamWrapper : public StreamWrapper {
  public:
-  explicit ReadableStreamWrapper(ScriptState*);
-
   ReadableStream* Readable() const { return readable_; }
+
+  // Checks whether |readable_| is locked to a reader.
   bool Locked() const override;
 
   // Implements UnderlyingSource::pull(...)
   virtual void Pull() = 0;
 
   // Enqueues the data in the stream controller queue.
-  virtual bool Push(base::span<const uint8_t> data,
-                    const absl::optional<net::IPEndPoint>& src_addr) = 0;
+  // Returns the number of bytes enqueued.
+  virtual uint32_t Push(base::span<const uint8_t> data,
+                        const absl::optional<net::IPEndPoint>& src_addr) = 0;
 
   void Trace(Visitor*) const override;
 
  protected:
-  class UnderlyingSource;
-  void InitSourceAndReadable(UnderlyingSource*, size_t high_water_mark);
+  explicit ReadableStreamWrapper(ScriptState*);
 
-  ReadableStreamDefaultControllerWithScriptScope* Controller() const;
+  void SetReadable(ReadableStream* readable) { readable_ = readable; }
 
  private:
-  Member<UnderlyingSource> source_;
   Member<ReadableStream> readable_;
 };
 
+class ReadableStreamDefaultWrapper : public ReadableStreamWrapper {
+ public:
+  using ControllerType = ReadableStreamDefaultControllerWithScriptScope;
+
+  void Trace(Visitor*) const override;
+
+  ControllerType* Controller() const { return controller_; }
+  void SetController(ControllerType* controller) { controller_ = controller; }
+
+ protected:
+  explicit ReadableStreamDefaultWrapper(ScriptState*);
+
+  // Creates a specialized underlying source that forwards its method calls to
+  // the provided |readable_stream_wrapper|.
+  static UnderlyingSourceBase* MakeForwardingUnderlyingSource(
+      ReadableStreamDefaultWrapper* readable_stream_wrapper);
+
+  void SetSource(UnderlyingSourceBase* source) { source_ = source; }
+
+ private:
+  Member<UnderlyingSourceBase> source_;
+  Member<ControllerType> controller_;
+};
+
+class ReadableByteStreamWrapper : public ReadableStreamWrapper {
+ public:
+  using ControllerType = ReadableByteStreamController;
+
+  void Trace(Visitor*) const override;
+
+  ControllerType* Controller() const { return controller_; }
+  void SetController(ControllerType* controller) { controller_ = controller; }
+
+ protected:
+  explicit ReadableByteStreamWrapper(ScriptState*);
+
+  // Creates a specialized underlying byte source that forwards its method calls
+  // to the provided |readable_stream_wrapper|.
+  static UnderlyingByteSourceBase* MakeForwardingUnderlyingByteSource(
+      ReadableByteStreamWrapper* readable_stream_wrapper);
+
+  void SetSource(UnderlyingByteSourceBase* source) { source_ = source; }
+
+ private:
+  Member<UnderlyingByteSourceBase> source_;
+  Member<ControllerType> controller_;
+};
+
 class WritableStreamWrapper : public StreamWrapper {
  public:
-  explicit WritableStreamWrapper(ScriptState*);
+  using ControllerType = WritableStreamDefaultController;
 
   WritableStream* Writable() const { return writable_; }
+
+  // Checks whether |writable_| is locked to a writer.
   bool Locked() const override;
 
   // Checks whether there's a write in progress.
   virtual bool HasPendingWrite() const { return false; }
-  void Trace(Visitor*) const override;
-
- protected:
-  class UnderlyingSink;
-  void InitSinkAndWritable(UnderlyingSink*, size_t high_water_mark);
 
   // Intercepts signal from WritableStream::abort(...) and processes it out
   // of order (without waiting for queued writes to complete first).
@@ -109,60 +152,26 @@
   // Implements UnderlyingSink::write(...)
   virtual ScriptPromise Write(ScriptValue, ExceptionState&) = 0;
 
-  WritableStreamDefaultController* Controller() const;
+  ControllerType* Controller() const { return controller_; }
+  void SetController(ControllerType* controller) { controller_ = controller; }
+
+  void Trace(Visitor*) const override;
+
+ protected:
+  explicit WritableStreamWrapper(ScriptState*);
+
+  // Creates a specialized underlying source that forwards its method calls to
+  // the provided |writable_stream_wrapper|.
+  static UnderlyingSinkBase* MakeForwardingUnderlyingSink(
+      WritableStreamWrapper* writable_stream_wrapper);
+
+  void SetSink(UnderlyingSinkBase* sink) { sink_ = sink; }
+  void SetWritable(WritableStream* writable) { writable_ = writable; }
 
  private:
-  Member<UnderlyingSink> sink_;
+  Member<UnderlyingSinkBase> sink_;
   Member<WritableStream> writable_;
-};
-
-class ReadableStreamWrapper::UnderlyingSource : public UnderlyingSourceBase {
- public:
-  UnderlyingSource(ScriptState*, ReadableStreamWrapper*);
-
-  ScriptPromise Start(ScriptState*) override;
-  ScriptPromise pull(ScriptState*) override;
-  ScriptPromise Cancel(ScriptState*, ScriptValue reason) override;
-
-  void Trace(Visitor*) const override;
-
- protected:
-  ReadableStreamWrapper* GetReadableStreamWrapper() const {
-    return readable_stream_wrapper_;
-  }
-
- private:
-  friend class ReadableStreamWrapper;
-  const Member<ReadableStreamWrapper> readable_stream_wrapper_;
-};
-
-class WritableStreamWrapper::UnderlyingSink : public UnderlyingSinkBase {
- public:
-  explicit UnderlyingSink(WritableStreamWrapper*);
-
-  ScriptPromise start(ScriptState*,
-                      WritableStreamDefaultController*,
-                      ExceptionState&) override;
-  ScriptPromise write(ScriptState*,
-                      ScriptValue chunk,
-                      WritableStreamDefaultController*,
-                      ExceptionState&) override;
-  ScriptPromise close(ScriptState*, ExceptionState&) override;
-  ScriptPromise abort(ScriptState*,
-                      ScriptValue reason,
-                      ExceptionState&) override;
-
-  void Trace(Visitor*) const override;
-
- protected:
-  WritableStreamWrapper* GetWritableStreamWrapper() const {
-    return writable_stream_wrapper_;
-  }
-
- private:
-  friend class WritableStreamWrapper;
-  const Member<WritableStreamWrapper> writable_stream_wrapper_;
-  Member<AbortSignal::AlgorithmHandle> abort_handle_;
+  Member<ControllerType> controller_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
index ce21ed42..db0d7f3 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
@@ -31,7 +31,7 @@
     ScriptState* script_state,
     CloseOnceCallback on_close,
     mojo::ScopedDataPipeConsumerHandle handle)
-    : ReadableStreamWrapper(script_state),
+    : ReadableStreamDefaultWrapper(script_state),
       on_close_(std::move(on_close)),
       data_pipe_(std::move(handle)),
       read_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL),
@@ -48,15 +48,21 @@
       WTF::BindRepeating(&TCPReadableStreamWrapper::OnHandleReset,
                          WrapWeakPersistent(this)));
 
+  ScriptState::Scope scope(script_state);
+
+  auto* source =
+      ReadableStreamDefaultWrapper::MakeForwardingUnderlyingSource(this);
+  SetSource(source);
+
   // Set queuing strategy of default behavior with a high water mark of 0.
-  InitSourceAndReadable(
-      /*source=*/MakeGarbageCollected<UnderlyingSource>(script_state, this),
-      /*high_water_mark=*/0);
+  auto* readable = ReadableStream::CreateWithCountQueueingStrategy(
+      script_state, source, /*high_water_mark=*/0);
+  SetReadable(readable);
 }
 
 void TCPReadableStreamWrapper::Trace(Visitor* visitor) const {
   visitor->Trace(pending_exception_);
-  ReadableStreamWrapper::Trace(visitor);
+  ReadableStreamDefaultWrapper::Trace(visitor);
 }
 
 void TCPReadableStreamWrapper::OnHandleReady(MojoResult result,
@@ -87,10 +93,12 @@
                                           MOJO_BEGIN_READ_DATA_FLAG_NONE);
   switch (result) {
     case MOJO_RESULT_OK: {
-      Push(base::make_span(static_cast<const uint8_t*>(buffer),
-                           buffer_num_bytes),
-           {});
-      result = data_pipe_->EndReadData(buffer_num_bytes);
+      auto chunk = base::make_span(static_cast<const uint8_t*>(buffer),
+                                   buffer_num_bytes);
+      uint32_t bytes_pushed = Push(chunk, /*src_addr=*/{});
+      DCHECK_LE(bytes_pushed, buffer_num_bytes);
+
+      result = data_pipe_->EndReadData(bytes_pushed);
       DCHECK_EQ(result, MOJO_RESULT_OK);
 
       break;
@@ -110,12 +118,13 @@
   }
 }
 
-bool TCPReadableStreamWrapper::Push(base::span<const uint8_t> data,
-                                    const absl::optional<net::IPEndPoint>&) {
+uint32_t TCPReadableStreamWrapper::Push(
+    base::span<const uint8_t> data,
+    const absl::optional<net::IPEndPoint>&) {
   auto* buffer = DOMUint8Array::Create(data.data(), data.size_bytes());
   Controller()->Enqueue(buffer);
 
-  return true;
+  return static_cast<uint32_t>(data.size_bytes());
 }
 
 void TCPReadableStreamWrapper::CloseStream() {
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h
index d9e31773..8f8f2ed 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h
@@ -25,7 +25,7 @@
 // Helper class to read from a mojo consumer handle
 class MODULES_EXPORT TCPReadableStreamWrapper
     : public GarbageCollected<TCPReadableStreamWrapper>,
-      public ReadableStreamWrapper {
+      public ReadableStreamDefaultWrapper {
   USING_PRE_FINALIZER(TCPReadableStreamWrapper, Dispose);
 
  public:
@@ -35,8 +35,8 @@
 
   // ReadableStreamWrapper:
   void Pull() override;
-  bool Push(base::span<const uint8_t> data,
-            const absl::optional<net::IPEndPoint>&) override;
+  uint32_t Push(base::span<const uint8_t> data,
+                const absl::optional<net::IPEndPoint>&) override;
   void CloseStream() override;
   void ErrorStream(int32_t error_code) override;
   void Trace(Visitor*) const override;
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc
index 1708141..4092266e6 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc
@@ -52,10 +52,16 @@
       WTF::BindRepeating(&TCPWritableStreamWrapper::OnHandleReset,
                          WrapWeakPersistent(this)));
 
+  ScriptState::Scope scope(script_state);
+
+  auto* sink = WritableStreamWrapper::MakeForwardingUnderlyingSink(this);
+  SetSink(sink);
+
   // Set the CountQueueingStrategy's high water mark as 1 to make the logic of
-  // |WriteOrCacheData| much simpler
-  InitSinkAndWritable(/*sink=*/MakeGarbageCollected<UnderlyingSink>(this),
-                      /*high_water_mark=*/1);
+  // |WriteOrCacheData| much simpler.
+  auto* writable = WritableStream::CreateWithCountQueueingStrategy(
+      script_state, sink, /*high_water_mark=*/1);
+  SetWritable(writable);
 }
 
 bool TCPWritableStreamWrapper::HasPendingWrite() const {
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.h b/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.h
index 1d67483..ccfccae6 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.h
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.h
@@ -42,9 +42,6 @@
   void ErrorStream(int32_t error_code) override;
   bool HasPendingWrite() const override;
   void Trace(Visitor*) const override;
-
- protected:
-  // WritableStreamWrapper:
   void OnAbortSignal() override;
   ScriptPromise Write(ScriptValue chunk, ExceptionState&) override;
 
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc
index 700da74..9f36b30e 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc
@@ -41,12 +41,18 @@
     ScriptState* script_state,
     CloseOnceCallback on_close,
     const Member<UDPSocketMojoRemote> udp_socket)
-    : ReadableStreamWrapper(script_state),
+    : ReadableStreamDefaultWrapper(script_state),
       on_close_(std::move(on_close)),
       udp_socket_(udp_socket) {
-  InitSourceAndReadable(
-      /*source=*/MakeGarbageCollected<UnderlyingSource>(GetScriptState(), this),
-      kReadableStreamBufferSize);
+  ScriptState::Scope scope(script_state);
+
+  auto* source =
+      ReadableStreamDefaultWrapper::MakeForwardingUnderlyingSource(this);
+  SetSource(source);
+
+  auto* readable = ReadableStream::CreateWithCountQueueingStrategy(
+      script_state, source, /*high_water_mark=*/kReadableStreamBufferSize);
+  SetReadable(readable);
 }
 
 void UDPReadableStreamWrapper::Pull() {
@@ -60,7 +66,7 @@
   }
 }
 
-bool UDPReadableStreamWrapper::Push(
+uint32_t UDPReadableStreamWrapper::Push(
     base::span<const uint8_t> data,
     const absl::optional<net::IPEndPoint>& src_addr) {
   DCHECK_GT(pending_receive_requests_, 0);
@@ -78,12 +84,12 @@
 
   Controller()->Enqueue(message);
 
-  return true;
+  return static_cast<uint32_t>(data.size_bytes());
 }
 
 void UDPReadableStreamWrapper::Trace(Visitor* visitor) const {
   visitor->Trace(udp_socket_);
-  ReadableStreamWrapper::Trace(visitor);
+  ReadableStreamDefaultWrapper::Trace(visitor);
 }
 
 void UDPReadableStreamWrapper::CloseStream() {
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.h b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.h
index 1cb3e37b..d037157 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.h
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.h
@@ -22,7 +22,7 @@
 
 class MODULES_EXPORT UDPReadableStreamWrapper
     : public GarbageCollected<UDPReadableStreamWrapper>,
-      public ReadableStreamWrapper {
+      public ReadableStreamDefaultWrapper {
  public:
   UDPReadableStreamWrapper(ScriptState*,
                            CloseOnceCallback,
@@ -30,15 +30,13 @@
 
   // ReadableStreamWrapper:
   void Pull() override;
-  bool Push(base::span<const uint8_t> data,
-            const absl::optional<net::IPEndPoint>& src_addr) override;
+  uint32_t Push(base::span<const uint8_t> data,
+                const absl::optional<net::IPEndPoint>& src_addr) override;
   void CloseStream() override;
   void ErrorStream(int32_t error_code) override;
   void Trace(Visitor*) const override;
 
  private:
-  class UDPUnderlyingSource;
-
   CloseOnceCallback on_close_;
   const Member<UDPSocketMojoRemote> udp_socket_;
   int32_t pending_receive_requests_ = 0;
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.cc
index 09d0717d..3a82d431 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.cc
@@ -40,8 +40,14 @@
     : WritableStreamWrapper(script_state),
       on_close_(std::move(on_close)),
       udp_socket_(udp_socket) {
-  InitSinkAndWritable(/*sink=*/MakeGarbageCollected<UnderlyingSink>(this),
-                      /*high_water_mark=*/1);
+  ScriptState::Scope scope(script_state);
+
+  auto* sink = WritableStreamWrapper::MakeForwardingUnderlyingSink(this);
+  SetSink(sink);
+
+  auto* writable = WritableStream::CreateWithCountQueueingStrategy(
+      script_state, sink, /*high_water_mark=*/1);
+  SetWritable(writable);
 }
 
 bool UDPWritableStreamWrapper::HasPendingWrite() const {
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.h b/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.h
index 047012f..7341394b 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.h
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.h
@@ -34,9 +34,6 @@
   void ErrorStream(int32_t error_code) override;
   bool HasPendingWrite() const override;
   void Trace(Visitor*) const override;
-
- protected:
-  // WritableStreamWrapper:
   void OnAbortSignal() override;
   ScriptPromise Write(ScriptValue chunk, ExceptionState&) override;
 
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc
index 3b3288d2..ae4bdf14 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/modules/mediastream/mock_constraint_factory.h"
 #include "third_party/blink/renderer/modules/mediastream/mock_media_stream_video_sink.h"
 #include "third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.h"
+#include "third_party/blink/renderer/modules/mediastream/video_track_adapter.h"
 #include "third_party/blink/renderer/modules/mediastream/video_track_adapter_settings.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
 #include "third_party/blink/renderer/platform/testing/io_task_runner_testing_platform_support.h"
@@ -525,6 +526,204 @@
   sink.DisconnectFromTrack();
 }
 
+// This test verifies that all frames are forwarded when sending starts at the
+// specified max rate and that a frame sent too close in time related to the
+// previous frame is dropped but that forwarding is then restored as soon as the
+// spacing is normal again.
+TEST_F(MediaStreamVideoSourceTest, ForwardsAtMaxFrameRateAndDropsWhenTooClose) {
+  constexpr int kMaxFps = 10;
+  WebMediaStreamTrack track = CreateTrackAndStartSource(640, 480, kMaxFps);
+  MockMediaStreamVideoSink sink;
+  sink.ConnectToTrack(track);
+  MediaStreamVideoTrack* native_track = MediaStreamVideoTrack::From(track);
+  native_track->SetSinkNotifyFrameDroppedCallback(
+      &sink, sink.GetNotifyFrameDroppedCB());
+
+  // Drive three frames through at the specified max frame rate and expect all
+  // three to be delivered since the EMA filter inside the VideoTrackAdapter
+  // (VTA) should be initialized to `kMaxFps` and therefore forward these frames
+  // from the start. The fourth frame is sent too close to the third and should
+  // be dropped with `TimestampTooCloseToPrevious`.
+  base::RunLoop run_loop;
+  base::OnceClosure quit_closure = run_loop.QuitClosure();
+
+  EXPECT_CALL(sink, OnVideoFrame).Times(3).WillRepeatedly(Return());
+  EXPECT_CALL(*mock_source(),
+              OnFrameDropped(media::VideoCaptureFrameDropReason::
+                                 kResolutionAdapterTimestampTooCloseToPrevious))
+      .Times(1)
+      .WillOnce([&] { std::move(quit_closure).Run(); });
+
+  DeliverVideoFrame(100, 100, base::Milliseconds(100));
+  DeliverVideoFrame(100, 100, base::Milliseconds(200));
+  DeliverVideoFrame(100, 100, base::Milliseconds(300));
+  DeliverVideoFrame(
+      100, 100,
+      base::Milliseconds(300 + VideoTrackAdapter::kMinTimeBetweenFramesMs - 1));
+  run_loop.Run();
+  EXPECT_EQ(3, sink.number_of_frames());
+
+  // The dropped frame should not affect any state in the VTA and additional
+  // frames sent at max rate should pass as before.
+  DeliverVideoFrameAndWaitForRenderer(100, 100, base::Milliseconds(400), &sink);
+  DeliverVideoFrameAndWaitForRenderer(100, 100, base::Milliseconds(500), &sink);
+  EXPECT_EQ(5, sink.number_of_frames());
+
+  sink.DisconnectFromTrack();
+}
+
+// This test verifies that a frame sent directly after a dropped frame will
+// pass even if it is sent with a slightly too high rate related to the frame
+// that was dropped. The frame should pass since the frame-rate calculation
+// is be based on the last forwarded frame and not the dropped frame.
+TEST_F(MediaStreamVideoSourceTest, DropFrameAtTooHighRateAndThenStopDropping) {
+  constexpr int kMaxFps = 10;
+  WebMediaStreamTrack track = CreateTrackAndStartSource(640, 480, kMaxFps);
+  MockMediaStreamVideoSink sink;
+  sink.ConnectToTrack(track);
+  MediaStreamVideoTrack* native_track = MediaStreamVideoTrack::From(track);
+  native_track->SetSinkNotifyFrameDroppedCallback(
+      &sink, sink.GetNotifyFrameDroppedCB());
+
+  base::RunLoop run_loop;
+  base::OnceClosure quit_closure = run_loop.QuitClosure();
+  EXPECT_CALL(sink, OnNotifyFrameDropped).WillOnce([&] {
+    std::move(quit_closure).Run();
+  });
+
+  // Start by sending frames at a slightly too high rate (12.5 fps). Given the
+  // current EMA filter in the VideoFrameAdapter, it takes four frames until the
+  // frame rate is detected as too high and the first frame is dropped.
+  constexpr base::TimeDelta kDeltaTimestampSlightlyTooHighRateDuration =
+      base::Milliseconds(80);
+  base::TimeDelta timestamp =
+      base::TimeDelta() + kDeltaTimestampSlightlyTooHighRateDuration;
+  for (int i = 0; i < 4; ++i) {
+    DeliverVideoFrame(100, 100, timestamp);
+    timestamp += kDeltaTimestampSlightlyTooHighRateDuration;
+  }
+  run_loop.Run();
+
+  // Given that a frame was just dropped, send yet another at the same rate.
+  // This time it should pass since the rate should be derived based on frames
+  // that are actually delivered. In this case, the last forwarded packet had
+  // a timestamp which is 160 ms less than `timestamp`; hence the sending rate
+  // should be seen as ~6.2 fps which is lower than max fps (10). The last
+  // frame will cause the filtered frame rate estimate to go from ~10.7 fps
+  // (=> dropped) to ~10.2 fps (=> forwarded).
+  DeliverVideoFrameAndWaitForRenderer(100, 100, timestamp, &sink);
+
+  sink.DisconnectFromTrack();
+}
+
+// This test verifies that the frame-dropping algorithm works correctly and
+// does not drop frames with a "too close" reason code after a packet has been
+// dropped due to too high frame rate. The test also continues driving frames
+// after the first session of dropped frames to ensure that not all frames are
+// dropped even at a too high frame rate.
+TEST_F(MediaStreamVideoSourceTest,
+       EmitsFrameRateTooHighDespiteTooClosePreviousDrop) {
+  constexpr int kMaxFps = 5;
+  WebMediaStreamTrack track = CreateTrackAndStartSource(640, 480, kMaxFps);
+  MockMediaStreamVideoSink sink;
+  sink.ConnectToTrack(track);
+
+  // Send one initial frame and ensure that it gets delivered. This action will
+  // reset all states (EMA filter, timestamp etc.) in the VideoFrameAdapter
+  // (VTA).
+  DeliverVideoFrameAndWaitForRenderer(100, 100, &sink);
+  EXPECT_EQ(1, sink.number_of_frames());
+
+  // Drive three frames through where the timestamps for the first two are
+  // spaced too close for the max frame rate. The second frame should be dropped
+  // and cause a notification and a `FrameRateIsHigherThanRequested` reason.
+  // The third frame is then sent with a time difference less than the allowed
+  // min delta time between two frames after the second frame. But, given that
+  // the second frame was dropped, the actual time difference between two valid
+  // frames is 14 milliseconds and it should not trigger dropped frame with
+  // reason set to `TimestampTooCloseToPrevious` but instead a second reason
+  // code of `FrameRateIsHigherThanRequested`.
+  base::RunLoop run_loop;
+  base::OnceClosure quit_closure = run_loop.QuitClosure();
+
+  EXPECT_CALL(
+      *mock_source(),
+      OnFrameDropped(media::VideoCaptureFrameDropReason::
+                         kResolutionAdapterFrameRateIsHigherThanRequested))
+      .Times(3)
+      .WillOnce(Return())
+      .WillOnce(Return())
+      .WillOnce([&] { std::move(quit_closure).Run(); });
+
+  DeliverVideoFrame(100, 100, base::Milliseconds(10));
+  DeliverVideoFrame(100, 100, base::Milliseconds(20));
+  DeliverVideoFrame(
+      100, 100,
+      base::Milliseconds(20 + VideoTrackAdapter::kMinTimeBetweenFramesMs - 1));
+  run_loop.Run();
+  EXPECT_EQ(1, sink.number_of_frames());
+
+  // At this stage the EMA filter inside the VTA is at ~21 fps given the initial
+  // too high rate. But the VTA also contains a "keep, or leak mechanism" which
+  // builds up a "keep indicator" over time also when frames are dropped.
+  // Sending one more frame at the specified max rate should therefore be
+  // delivered in this state but those after shall not since the
+  // "keep mechanism" is reset after each pass and the EMA filter still says
+  // "too high frame rate".
+  DeliverVideoFrameAndWaitForRenderer(100, 100, base::Milliseconds(200), &sink);
+  EXPECT_EQ(2, sink.number_of_frames());
+
+  // Send one more frame close enough to the previous one to trigger a
+  // frame drop with reason set to `TooClose`. No states in the VTA should be
+  // updated and the EMA filter is now at ~19 fps given the frame that passed.
+  base::RunLoop run_loop2;
+  base::OnceClosure quit_closure2 = run_loop2.QuitClosure();
+
+  EXPECT_CALL(*mock_source(),
+              OnFrameDropped(media::VideoCaptureFrameDropReason::
+                                 kResolutionAdapterTimestampTooCloseToPrevious))
+      .Times(1)
+      .WillOnce([&] { std::move(quit_closure2).Run(); });
+
+  DeliverVideoFrame(
+      100, 100,
+      base::Milliseconds(200 + VideoTrackAdapter::kMinTimeBetweenFramesMs - 1));
+  run_loop2.Run();
+  EXPECT_EQ(2, sink.number_of_frames());
+
+  // Drive three more frames at max fps (5 Hz) and expect the first two to be
+  // dropped with `FrameRateIsHigherThanRequested` but the third frame to pass
+  // due to the "keep mechanism" in the VTA. The estimated frame rate after
+  // this session has reduced to  ~14.5 fps. The last timestamp of the last
+  // forwarded frame is 800 ms. In total, three frames should have been
+  // delivered after this round.
+  base::RunLoop run_loop3;
+  base::OnceClosure quit_closure3 = run_loop3.QuitClosure();
+
+  EXPECT_CALL(
+      *mock_source(),
+      OnFrameDropped(media::VideoCaptureFrameDropReason::
+                         kResolutionAdapterFrameRateIsHigherThanRequested))
+      .Times(2)
+      .WillRepeatedly(Return());
+  EXPECT_CALL(sink, OnVideoFrame).Times(1).WillOnce([&](base::TimeTicks) {
+    std::move(quit_closure3).Run();
+  });
+
+  constexpr base::TimeDelta kDeltaTimestampSteadyRateDuration =
+      base::Milliseconds(200);
+  base::TimeDelta timestamp =
+      base::Milliseconds(200) + kDeltaTimestampSteadyRateDuration;
+  for (int i = 0; i < 3; ++i) {
+    DeliverVideoFrame(100, 100, timestamp);
+    timestamp += kDeltaTimestampSteadyRateDuration;
+  }
+  run_loop3.Run();
+  EXPECT_EQ(3, sink.number_of_frames());
+
+  sink.DisconnectFromTrack();
+}
+
 TEST_F(MediaStreamVideoSourceTest, ReconfigureTrack) {
   WebMediaStreamTrack track = CreateTrackAndStartSource(
       640, 480, media::limits::kMaxFramesPerSecond - 2);
diff --git a/third_party/blink/renderer/modules/mediastream/video_track_adapter.cc b/third_party/blink/renderer/modules/mediastream/video_track_adapter.cc
index fa91ae0..19a7866 100644
--- a/third_party/blink/renderer/modules/mediastream/video_track_adapter.cc
+++ b/third_party/blink/renderer/modules/mediastream/video_track_adapter.cc
@@ -59,7 +59,8 @@
 
 // Min delta time between two frames allowed without being dropped if a max
 // frame rate is specified.
-constexpr base::TimeDelta kMinTimeInMsBetweenFrames = base::Milliseconds(5);
+constexpr base::TimeDelta kMinTimeInMsBetweenFrames =
+    base::Milliseconds(VideoTrackAdapter::kMinTimeBetweenFramesMs);
 // If the delta between two frames is bigger than this, we will consider it to
 // be invalid and reset the fps calculation.
 constexpr base::TimeDelta kMaxTimeInMsBetweenFrames = base::Milliseconds(1000);
@@ -363,6 +364,9 @@
     return;
   }
 
+  // Update the last timestamp since the frame was approved and not dropped.
+  last_time_stamp_ = video_frame->timestamp();
+
   // If the frame is a texture not backed up by GPU memory we don't apply
   // cropping/scaling and deliver the frame as-is, leaving it up to the
   // destination to rescale it. Otherwise, cropping and scaling is soft-applied
@@ -493,7 +497,6 @@
 
   // Do not drop frames if max frame rate hasn't been specified.
   if (!settings_.max_frame_rate().has_value()) {
-    last_time_stamp_ = frame.timestamp();
     return false;
   }
 
@@ -502,8 +505,7 @@
   // Check if the time since the last frame is completely off.
   if (delta_ms.is_negative() || delta_ms > kMaxTimeInMsBetweenFrames) {
     DVLOG(3) << " reset timestamps";
-    // Reset |last_time_stamp_| and fps calculation.
-    last_time_stamp_ = frame.timestamp();
+    // Reset fps calculation.
     frame_rate_ = settings_.max_frame_rate().value_or(
         MediaStreamVideoSource::kDefaultFrameRate);
     DVLOG(1) << " frame rate filter initialized to " << frame_rate_ << " fps";
@@ -526,7 +528,7 @@
         kResolutionAdapterTimestampTooCloseToPrevious;
     return true;
   }
-  last_time_stamp_ = frame.timestamp();
+
   // Calculate the frame rate using an exponential moving average (EMA) filter.
   // Use a simple filter with 0.1 weight of the current sample.
   frame_rate_ = 100 / delta_ms.InMillisecondsF() + 0.9 * frame_rate_;
diff --git a/third_party/blink/renderer/modules/mediastream/video_track_adapter.h b/third_party/blink/renderer/modules/mediastream/video_track_adapter.h
index e5e99d2..b537819b 100644
--- a/third_party/blink/renderer/modules/mediastream/video_track_adapter.h
+++ b/third_party/blink/renderer/modules/mediastream/video_track_adapter.h
@@ -43,6 +43,10 @@
  public:
   using OnMutedCallback = base::RepeatingCallback<void(bool mute_state)>;
 
+  // Min delta time between two frames allowed without being dropped if a max
+  // frame rate is specified. Exposed globally for testability.
+  static constexpr int kMinTimeBetweenFramesMs = 5;
+
   VideoTrackAdapter(
       scoped_refptr<base::SequencedTaskRunner> video_task_runner,
       base::WeakPtr<MediaStreamVideoSource> media_stream_video_source);
diff --git a/third_party/blink/renderer/modules/payments/can_make_payment_event.cc b/third_party/blink/renderer/modules/payments/can_make_payment_event.cc
index 5d3e9129..2b34fd8 100644
--- a/third_party/blink/renderer/modules/payments/can_make_payment_event.cc
+++ b/third_party/blink/renderer/modules/payments/can_make_payment_event.cc
@@ -4,8 +4,6 @@
 
 #include "third_party/blink/renderer/modules/payments/can_make_payment_event.h"
 
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
-#include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
@@ -13,31 +11,9 @@
 #include "third_party/blink/renderer/modules/payments/can_make_payment_respond_with_observer.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
-#include "v8/include/v8-local-handle.h"
-#include "v8/include/v8-value.h"
 
 namespace blink {
-namespace {
-
-template <typename IDLType, typename T>
-ScriptValue GetScriptValueOrUndefined(ScriptState* script_state,
-                                      const T& value) {
-  v8::Isolate* isolate = script_state->GetIsolate();
-
-  // Merchant and user identifying fields should return undefined values when
-  // ClearIdentityInCanMakePaymentEvent is enabled.
-  if (RuntimeEnabledFeatures::ClearIdentityInCanMakePaymentEventEnabled(
-          ExecutionContext::From(script_state))) {
-    return ScriptValue(isolate, v8::Undefined(isolate));
-  }
-
-  return ScriptValue(
-      isolate, ToV8Traits<IDLType>::ToV8(script_state, value).ToLocalChecked());
-}
-
-}  // namespace
 
 CanMakePaymentEvent* CanMakePaymentEvent::Create(
     const AtomicString& type,
@@ -61,24 +37,22 @@
   return event_interface_names::kCanMakePaymentEvent;
 }
 
-ScriptValue CanMakePaymentEvent::topOrigin(ScriptState* script_state) const {
-  return GetScriptValueOrUndefined<IDLUSVString>(script_state, top_origin_);
+const String& CanMakePaymentEvent::topOrigin() const {
+  return top_origin_;
 }
 
-ScriptValue CanMakePaymentEvent::paymentRequestOrigin(
-    ScriptState* script_state) const {
-  return GetScriptValueOrUndefined<IDLUSVString>(script_state,
-                                                 payment_request_origin_);
+const String& CanMakePaymentEvent::paymentRequestOrigin() const {
+  return payment_request_origin_;
 }
 
-ScriptValue CanMakePaymentEvent::methodData(ScriptState* script_state) const {
-  return GetScriptValueOrUndefined<IDLArray<PaymentMethodData>>(script_state,
-                                                                method_data_);
+const HeapVector<Member<PaymentMethodData>>& CanMakePaymentEvent::methodData()
+    const {
+  return method_data_;
 }
 
-ScriptValue CanMakePaymentEvent::modifiers(ScriptState* script_state) const {
-  return GetScriptValueOrUndefined<IDLArray<PaymentDetailsModifier>>(
-      script_state, modifiers_);
+const HeapVector<Member<PaymentDetailsModifier>>&
+CanMakePaymentEvent::modifiers() const {
+  return modifiers_;
 }
 
 void CanMakePaymentEvent::respondWith(ScriptState* script_state,
diff --git a/third_party/blink/renderer/modules/payments/can_make_payment_event.h b/third_party/blink/renderer/modules/payments/can_make_payment_event.h
index efe0816..00dc791f 100644
--- a/third_party/blink/renderer/modules/payments/can_make_payment_event.h
+++ b/third_party/blink/renderer/modules/payments/can_make_payment_event.h
@@ -45,10 +45,10 @@
 
   const AtomicString& InterfaceName() const override;
 
-  ScriptValue topOrigin(ScriptState*) const;
-  ScriptValue paymentRequestOrigin(ScriptState*) const;
-  ScriptValue methodData(ScriptState*) const;
-  ScriptValue modifiers(ScriptState*) const;
+  const String& topOrigin() const;
+  const String& paymentRequestOrigin() const;
+  const HeapVector<Member<PaymentMethodData>>& methodData() const;
+  const HeapVector<Member<PaymentDetailsModifier>>& modifiers() const;
 
   void respondWith(ScriptState*, ScriptPromise, ExceptionState&);
 
diff --git a/third_party/blink/renderer/modules/payments/can_make_payment_event.idl b/third_party/blink/renderer/modules/payments/can_make_payment_event.idl
index 919e113..2889da6 100644
--- a/third_party/blink/renderer/modules/payments/can_make_payment_event.idl
+++ b/third_party/blink/renderer/modules/payments/can_make_payment_event.idl
@@ -9,10 +9,10 @@
     Exposed=ServiceWorker
 ] interface CanMakePaymentEvent : ExtendableEvent {
     constructor(DOMString type, CanMakePaymentEventInit eventInitDict);
-    [DeprecateAs=IdentityInCanMakePaymentEvent, CallWith=ScriptState] readonly attribute USVString topOrigin;
-    [DeprecateAs=IdentityInCanMakePaymentEvent, CallWith=ScriptState] readonly attribute USVString paymentRequestOrigin;
-    [DeprecateAs=IdentityInCanMakePaymentEvent, CallWith=ScriptState] readonly attribute any methodData;
-    [DeprecateAs=IdentityInCanMakePaymentEvent, CallWith=ScriptState] readonly attribute any modifiers;
+    [DeprecateAs=IdentityInCanMakePaymentEvent, RuntimeEnabled=AddIdentityInCanMakePaymentEvent] readonly attribute USVString topOrigin;
+    [DeprecateAs=IdentityInCanMakePaymentEvent, RuntimeEnabled=AddIdentityInCanMakePaymentEvent] readonly attribute USVString paymentRequestOrigin;
+    [DeprecateAs=IdentityInCanMakePaymentEvent, RuntimeEnabled=AddIdentityInCanMakePaymentEvent] readonly attribute FrozenArray<PaymentMethodData> methodData;
+    [DeprecateAs=IdentityInCanMakePaymentEvent, RuntimeEnabled=AddIdentityInCanMakePaymentEvent] readonly attribute FrozenArray<PaymentDetailsModifier> modifiers;
 
     [CallWith=ScriptState, RaisesException] void respondWith(Promise<boolean> canMakePaymentResponse);
 };
diff --git a/third_party/blink/renderer/modules/smart_card/BUILD.gn b/third_party/blink/renderer/modules/smart_card/BUILD.gn
index 9eff74f..552d64c 100644
--- a/third_party/blink/renderer/modules/smart_card/BUILD.gn
+++ b/third_party/blink/renderer/modules/smart_card/BUILD.gn
@@ -8,6 +8,8 @@
   sources = [
     "smart_card_connection.cc",
     "smart_card_connection.h",
+    "smart_card_error.cc",
+    "smart_card_error.h",
     "smart_card_reader.cc",
     "smart_card_reader.h",
     "smart_card_reader_presence_event.cc",
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_error.cc b/third_party/blink/renderer/modules/smart_card/smart_card_error.cc
new file mode 100644
index 0000000..b349a1b
--- /dev/null
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_error.cc
@@ -0,0 +1,30 @@
+// 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 "third_party/blink/renderer/modules/smart_card/smart_card_error.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_smart_card_error_options.h"
+#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+
+namespace blink {
+
+// static
+SmartCardError* SmartCardError::Create(String message,
+                                       const SmartCardErrorOptions* options) {
+  return MakeGarbageCollected<SmartCardError>(std::move(message),
+                                              options->responseCode());
+}
+
+SmartCardError::SmartCardError(String message,
+                               V8SmartCardResponseCode::Enum value)
+    : SmartCardError(std::move(message), V8SmartCardResponseCode(value)) {}
+
+SmartCardError::SmartCardError(String message,
+                               V8SmartCardResponseCode response_code)
+    : DOMException(DOMExceptionCode::kSmartCardError, std::move(message)),
+      response_code_(std::move(response_code)) {}
+
+SmartCardError::~SmartCardError() = default;
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_error.h b/third_party/blink/renderer/modules/smart_card/smart_card_error.h
new file mode 100644
index 0000000..d365f7b5
--- /dev/null
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_error.h
@@ -0,0 +1,36 @@
+// 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 THIRD_PARTY_BLINK_RENDERER_MODULES_SMART_CARD_SMART_CARD_ERROR_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMART_CARD_SMART_CARD_ERROR_H_
+
+#include "third_party/blink/renderer/bindings/modules/v8/v8_smart_card_response_code.h"
+#include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+
+namespace blink {
+
+class SmartCardErrorOptions;
+
+// https://w3c.github.io/webtransport/#web-transport-error-interface
+class MODULES_EXPORT SmartCardError : public DOMException {
+  DEFINE_WRAPPERTYPEINFO();
+
+ public:
+  // Constructor exposed to script. Called by the V8 bindings.
+  static SmartCardError* Create(String message, const SmartCardErrorOptions*);
+
+  SmartCardError(String message, V8SmartCardResponseCode::Enum);
+  SmartCardError(String message, V8SmartCardResponseCode);
+  ~SmartCardError() override;
+
+  V8SmartCardResponseCode responseCode() const { return response_code_; }
+
+ private:
+  const V8SmartCardResponseCode response_code_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_SMART_CARD_SMART_CARD_ERROR_H_
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_error.idl b/third_party/blink/renderer/modules/smart_card/smart_card_error.idl
new file mode 100644
index 0000000..10a4de5
--- /dev/null
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_error.idl
@@ -0,0 +1,37 @@
+// 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.
+
+// https://github.com/WICG/web-smart-card/blob/main/README.md#web-idl
+
+enum SmartCardResponseCode {
+  "no-service",
+  "no-smartcard",
+  "not-ready",
+  "not-transacted",
+  "proto-mismatch",
+  "reader-unavailable",
+  "removed-card",
+  "reset-card",
+  "sharing-violation",
+  "system-cancelled",
+  "unpowered-card",
+  "unresponsive-card",
+  "unsupported-card",
+  "unsupported-feature"
+};
+
+dictionary SmartCardErrorOptions {
+  required SmartCardResponseCode responseCode;
+};
+
+[
+  Exposed=Window,
+  RuntimeEnabled=SmartCard,
+  SecureContext,
+  IsolatedContext
+] interface SmartCardError : DOMException {
+  constructor(DOMString message, SmartCardErrorOptions options);
+  readonly attribute SmartCardResponseCode responseCode;
+};
+
diff --git a/third_party/blink/renderer/platform/bindings/exception_code.h b/third_party/blink/renderer/platform/bindings/exception_code.h
index 596eb2e..aa153d4 100644
--- a/third_party/blink/renderer/platform/bindings/exception_code.h
+++ b/third_party/blink/renderer/platform/bindings/exception_code.h
@@ -113,6 +113,10 @@
   // WebTransport - https://w3c.github.io/webtransport/
   kWebTransportError,
 
+  // Smart Card API
+  // https://github.com/WICG/web-smart-card/blob/main/README.md#web-idl
+  kSmartCardError,
+
   kNumOfCodes,
 };
 
diff --git a/third_party/blink/renderer/platform/fonts/font_selection_types.h b/third_party/blink/renderer/platform/fonts/font_selection_types.h
index 515b33c..0dd0738c 100644
--- a/third_party/blink/renderer/platform/fonts/font_selection_types.h
+++ b/third_party/blink/renderer/platform/fonts/font_selection_types.h
@@ -172,8 +172,8 @@
   return italicThreshold;
 }
 
-static inline bool isItalic(FontSelectionValue fontWeight) {
-  return fontWeight >= ItalicThreshold();
+static inline bool isItalic(FontSelectionValue fontStyle) {
+  return fontStyle >= ItalicThreshold();
 }
 
 static inline const FontSelectionValue& FontSelectionZeroValue() {
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 82e7971..947de55f 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -253,6 +253,13 @@
       public: true,
     },
     {
+      name: "AddIdentityInCanMakePaymentEvent",
+      base_feature: "AddIdentityInCanMakePaymentEvent",
+      origin_trial_allows_third_party: true,
+      origin_trial_feature_name: "AddIdentityInCanMakePaymentEvent",
+      public: true,
+    },
+    {
       name: "AddressSpace",
       status: "experimental",
       implied_by: ["CorsRFC1918"],
@@ -473,6 +480,7 @@
       status: "stable",
     },
     {
+      // TODO(crbug.com/1290492): Remove when all call sites switch to AddIdentityInCanMakePaymentEvent.
       name: "ClearIdentityInCanMakePaymentEvent",
       base_feature: "ClearIdentityInCanMakePaymentEvent",
       origin_trial_allows_third_party: true,
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 5127d820..f3514951 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -1565,10 +1565,12 @@
 crbug.com/1035582 paint/invalidation/outline/focus-continuations.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
+crbug.com/1035582 paint/invalidation/outline/focus-ring-on-child-move.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
+crbug.com/1035582 paint/invalidation/outline/focus-ring-for-anchor.html [ Failure ]
+crbug.com/1035582 paint/invalidation/outline/focus-ring-for-anchor1.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/outline-become-affected-by-descendant.html [ Failure ]
 crbug.com/1035582 paint/invalidation/outline/outline-become-not-affected-by-descendant.html [ Failure ]
-crbug.com/1035582 paint/invalidation/outline/transform-focus-ring-repaint.html [ Failure ]
 crbug.com/1035582 paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container.html [ Failure ]
 crbug.com/1035582 paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container.html [ Failure ]
 crbug.com/1035582 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index eea9e221a..2bec6eb 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -4242,6 +4242,10 @@
 crbug.com/1288027 external/wpt/largest-contentful-paint/mouseover-heuristics-element.tentative.html [ Skip Timeout ]
 crbug.com/1288027 external/wpt/largest-contentful-paint/mouseover-heuristics-background.tentative.html [ Skip Timeout ]
 
+# Disable until further investigation.
+crbug.com/1404826 [ Linux ] virtual/scalefactor200/external/wpt/largest-contentful-paint/larger-text.html [ Failure Pass ]
+crbug.com/1404826 [ Mac ] virtual/scalefactor200/external/wpt/largest-contentful-paint/larger-text.html [ Failure Pass ]
+
 # Sheriff 2019-09-04
 crbug.com/1000396 [ Win ] media/video-remove-insert-repaints.html [ Failure Pass ]
 
@@ -5152,7 +5156,6 @@
 crbug.com/1216139 http/tests/devtools/bfcache/bfcache-elements-update.js [ Failure Pass ]
 
 # Sheriff 2021-06-10
-crbug.com/1177996 [ Mac10.15 ] storage/websql/database-lock-after-reload.html [ Failure Pass ]
 
 # CSS Highlight API painting issues related to general CSS highlight
 # pseudo-elements painting
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 1e942c98..5c29c39e 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -158794,13 +158794,39 @@
        {}
       ]
      ],
-     "marker-text-align.html": [
-      "c5f8ed3a2016a55039b3f94dc93780b5517b35a3",
+     "marker-text-align-001.html": [
+      "5ef1d8d75d78f25854b43b259eae43f1f21efa8f",
       [
        null,
        [
         [
-         "/css/css-pseudo/marker-text-align-ref.html",
+         "/css/css-pseudo/marker-text-align-001-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "marker-text-align-002.html": [
+      "6fe05b728d94873371c03a85c1cf5085790f94a9",
+      [
+       null,
+       [
+        [
+         "/css/css-pseudo/marker-text-align-002-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "marker-text-align-003.html": [
+      "38c513d7ae15bd21b998c96617088487c02fb2e5",
+      [
+       null,
+       [
+        [
+         "/css/css-pseudo/marker-text-align-003-ref.html",
          "=="
         ]
        ],
@@ -169745,6 +169771,19 @@
        {}
       ]
      ],
+     "svg-intrinsic-size-006.html": [
+      "b136c0198cd2db09587e901b1c943c97c15f6fd7",
+      [
+       null,
+       [
+        [
+         "/css/css-sizing/svg-intrinsic-size-006-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "table-child-percentage-height-with-border-box.html": [
       "7700b00dc3239245e38f90c72df944ef04a36998",
       [
@@ -261087,11 +261126,11 @@
   "support": {
    ".cache": {
     "gitignore2.json": [
-     "c32fa02f6a92cff39a1bce0fb487369cdcfe714f",
+     "29f8bd322490a46bcdcdd73756440d01065ad00d",
      []
     ],
     "mtime.json": [
-     "35eb6f24f2f7a21622f4b601d0a545d693fcc776",
+     "8d3d8e2196c95692774434e80568c52142dd2580",
      []
     ]
    },
@@ -261431,7 +261470,7 @@
      []
     ],
     "structured-clone.any.js.ini": [
-     "2fe6bf87780461c988447d5c8271ee5190176b8e",
+     "f020440d96281d468cc7e4c68486adaa6b27e696",
      []
     ],
     "transaction-abort-generator-revert.html.ini": [
@@ -267787,17 +267826,13 @@
      []
     ],
     "cookieListItem_attributes.https.any.js.ini": [
-     "0f2e60c7d78496d92ac1a4aa6cd13992eafb58d7",
+     "6bd74be822f2ed4b9e864bbea8dbcc14236e835d",
      []
     ],
     "cookieStore_get_set_across_origins.sub.https.html.ini": [
      "cbb01649c32968e14bbf2f712f7a02ed628fc7fe",
      []
     ],
-    "cookieStore_set_arguments.https.any.js.ini": [
-     "991863ef9c10a74754b27370402d8a38d4762149",
-     []
-    ],
     "cookieStore_subscribe_arguments.https.any.js.ini": [
      "ced6aca6a7c11717408c84bc79b1ab6b41e3dcd6",
      []
@@ -268271,7 +268306,7 @@
      ]
     },
     "fedcm-network-requests.https.html.ini": [
-     "d272c84b67bc4561fd50bf58934390465d720f31",
+     "12ce602cecbfe3da3820b5c1b611c02d8f99e59f",
      []
     ],
     "federatedcredential-framed-get.sub.https-expected.txt": [
@@ -271161,7 +271196,7 @@
        []
       ],
       "float-nowrap-4.html.ini": [
-       "5b5e8dbb4ca2103520f29ee0352a8a413b00b51c",
+       "118137923cf41d279118a91dc1e6d3caca8e1ef7",
        []
       ],
       "float-nowrap-5-ref.html": [
@@ -276996,7 +277031,7 @@
       []
      ],
      "anchor-position-inline-004.html.ini": [
-      "b2fa31ba5afca514557cac6bfe4b9ffbb94600c8",
+      "4b68313d9e00e1237cfe7e80e447ef5092f2bdc6",
       []
      ],
      "anchor-position-top-layer-ref.html": [
@@ -277074,7 +277109,7 @@
       []
      ],
      "Element-getAnimations-dynamic-changes.tentative.html.ini": [
-      "cd79bce0007ca0a053223c57c0ae0e86b094c20e",
+      "90372850a2b15bec987edeacd277c571fa2bae64",
       []
      ],
      "KeyframeEffect-getKeyframes.tentative-expected.txt": [
@@ -282634,6 +282669,10 @@
       []
      ],
      "parsing": {
+      "color-scheme-computed.html.ini": [
+       "393908a38e6d87320cb9e58aecfb85fabddee318",
+       []
+      ],
       "print-color-adjust-expected.txt": [
        "1fbbb6154eea30c0ec1253dcb8d69f12889bb733",
        []
@@ -283169,7 +283208,7 @@
        []
       ],
       "nested-query-containers.html.ini": [
-       "076a237cb6ed39fb8a51cd6b9ce67f6cbdab5f88",
+       "e92a5bb1a4fa7e9a60bb42f506d455adf8c71d9a",
        []
       ],
       "percentage-padding-orthogonal-expected.txt": [
@@ -287816,7 +287855,7 @@
       []
      ],
      "image-as-flexitem-size-003v.html.ini": [
-      "8b88ef426223c96dab4f90eddff8d6dc7e7d1b5d",
+      "a15c7101bad33b050d9207a6e8afb27295232e30",
       []
      ],
      "image-as-flexitem-size-004.html.ini": [
@@ -287848,7 +287887,7 @@
       []
      ],
      "image-as-flexitem-size-007v.html.ini": [
-      "c33d2d7ad799c9224fbb027618cf9bdc0dcd88d8",
+      "0ef2b0d64488868411a54acb4d11982c06bd85d6",
       []
      ],
      "interactive": {
@@ -301109,7 +301148,7 @@
        []
       ],
       "Initial-letter-breaking-rtl.html.ini": [
-       "46ebc05b8e015794e21ad5efbbb278c2a1c4a978",
+       "9451204c3f8e54260349e0a2b1aaf03911bce7bd",
        []
       ],
       "Initial-letter-breaking-vlr-ref.html": [
@@ -301225,7 +301264,7 @@
        []
       ],
       "initial-letter-block-position-raise-under-ruby.html.ini": [
-       "eede05d174440899bdc8f37125124321ef974f11",
+       "1136475e22104014fed3be82b9c07d8e27771af5",
        []
       ],
       "initial-letter-computed.html.ini": [
@@ -301249,7 +301288,7 @@
        []
       ],
       "initial-letter-drop-initial-vlr.html.ini": [
-       "984123ce1ba95aaa082597019805d29f51c77e3b",
+       "1e3e90322b20750c45315a4553d727d330e621e8",
        []
       ],
       "initial-letter-drop-initial-vrl-ref.html": [
@@ -301261,7 +301300,7 @@
        []
       ],
       "initial-letter-drop-initial.html.ini": [
-       "497ccbc87b10a361c6b9e430069b7a98ab683bcf",
+       "bda49d3ccb569063ca848311b14c11d0f95c0743",
        []
       ],
       "initial-letter-float-001-ref.html": [
@@ -301293,7 +301332,7 @@
        []
       ],
       "initial-letter-float-001.html.ini": [
-       "4b45bbf55e041276119bcbd59878946c3a181b5b",
+       "ae13c19797a134284cfe0ffd2c225b9e7bbc0b3e",
        []
       ],
       "initial-letter-float-002-ref.html": [
@@ -301317,7 +301356,7 @@
        []
       ],
       "initial-letter-float-004.html.ini": [
-       "d614985677939eaa1215fce3dade526bbaf911fd",
+       "4030844f14a45ef2407ccd1e385f5476eacfb7b7",
        []
       ],
       "initial-letter-float-005-ref.html": [
@@ -301389,7 +301428,7 @@
        []
       ],
       "initial-letter-raised-sunken-caps-raise.html.ini": [
-       "20d257d084d1c674f557b5675678b67b2cef6e2e",
+       "56b3ed619093439c9fb4fcb32570ff49c56afd09",
        []
       ],
       "initial-letter-raised-sunken-caps-sunken-ref.html": [
@@ -301441,7 +301480,7 @@
        []
       ],
       "initial-letter-sunk-initial-vrl.html.ini": [
-       "145423c11791d55ae88c994d027a2d62c7a4c7e1",
+       "77a501b58596bd661170dd5bd74ceaac0d7c228d",
        []
       ],
       "initial-letter-sunk-initial.html.ini": [
@@ -301457,7 +301496,7 @@
        []
       ],
       "initial-letter-with-first-line.html.ini": [
-       "56e94a8670efbccb3863be467419c218b0835400",
+       "7f69acbb5b8b735f2cc960f4832090c3f085738a",
        []
       ],
       "initial-letter-with-tab-ref.html": [
@@ -301680,10 +301719,6 @@
       ]
      },
      "fallback-layout": {
-      "constructor-error.https.html.ini": [
-       "3ab53016c15110c81b40cdd928fc8f072afb021c",
-       []
-      ],
       "fallback-layout-fallback-ref.html": [
        "63bb91e90ca00f02d108f562ed857058df2443ca",
        []
@@ -306509,6 +306544,10 @@
       "9ee9a0fdc8d17a195b6ad213e77929f3dccc9783",
       []
      ],
+     "parse-input-arguments-008.https.html.ini": [
+      "d3a6b1c32a685179777b5eef540e99c2785cda76",
+      []
+     ],
      "parse-input-arguments-010.https.html.ini": [
       "2fe67ddb232722d2676757352c87fbfc7adc93d8",
       []
@@ -306518,17 +306557,13 @@
       []
      ],
      "parse-input-arguments-018.https.html.ini": [
-      "62f06bdce5f2be8cb9f41506da803a3741713e2b",
+      "44bac5302b65c8d9f1907e6c029154a6fd30f0cd",
       []
      ],
      "parse-input-arguments-019.https.html.ini": [
       "c6e28228a9a208de10943e8397955332c80faf7a",
       []
      ],
-     "parse-input-arguments-022.https.html.ini": [
-      "a607705d4acd2bf282c9c4c0590d039e2a0c62a0",
-      []
-     ],
      "parse-input-arguments-ref.html": [
       "862212092a488948c202d88ba18334a738b583a8",
       []
@@ -308361,10 +308396,18 @@
       "2985ac2eeba46348f51eb3c5a9717ab8e38edd83",
       []
      ],
-     "marker-text-align-ref.html": [
+     "marker-text-align-001-ref.html": [
       "2355fab2e7e1398d61c239187201504480ec08a6",
       []
      ],
+     "marker-text-align-002-ref.html": [
+      "04fd8c20ef08c9d96cdefa0776ab44e3826c4b85",
+      []
+     ],
+     "marker-text-align-003-ref.html": [
+      "98d52645f0fe8d026db1458df4d6744c7a88c080",
+      []
+     ],
      "marker-text-combine-upright-ref.html": [
       "2ad96e37bb145b4bae9aae37db8b23df7ddfdc3b",
       []
@@ -309285,6 +309328,10 @@
       "db4f23c886c44282afc27fd09475ade0c189e6f8",
       []
      ],
+     "ruby-text-combine-upright-001a.html.ini": [
+      "0df837fbb07d756aa4f778765d6ce08a5f296275",
+      []
+     ],
      "ruby-text-combine-upright-001b.html.ini": [
       "654ce463d1c2e4eac1fc8aad024ad0e5ce2313f9",
       []
@@ -311843,6 +311890,10 @@
       "1d64836f885e1e29e8e5abd43f51fda756f6a726",
       []
      ],
+     "svg-intrinsic-size-006-ref.html": [
+      "4e164672e20777062f222be66b3f394ec3b5f1a3",
+      []
+     ],
      "thin-element-render-ref.html": [
       "0d5851d5544f9692d0761dc92c23b6b2b546b4d3",
       []
@@ -316587,7 +316638,7 @@
        []
       ],
       "text-transform-capitalize-010.html.ini": [
-       "a501ea396ccd5515d5f84196aeec7f268c5cb022",
+       "892a514c8de51b620ba30af9b89244aaa370327e",
        []
       ],
       "text-transform-capitalize-016.html.ini": [
@@ -330608,7 +330659,7 @@
       []
      ],
      "scroll-behavior-main-frame-window.html.ini": [
-      "0912a03633a3304d40c284435f02469bccf2c122",
+      "dc6759f838e3e537aaf4ef03c47c3b52e1458640",
       []
      ],
      "scroll-behavior-scrollintoview-nested.html.ini": [
@@ -332331,7 +332382,7 @@
        []
       ],
       "has-complexity.html.ini": [
-       "e68b8834c35b14faf8441aeae6645f26015c9331",
+       "abe15aeacde200f0388f4f5429cb6dcc5498773e",
        []
       ],
       "logical-combinations-in-has-expected.txt": [
@@ -333108,7 +333159,7 @@
       []
      ],
      "ElementInternals-target-element-is-held-strongly.html.ini": [
-      "d33171cd2fbbf84eb04c07df6cb676aac3037b99",
+      "fdce5ad83e1ee4393bd7eff4269cd10b729f35a0",
       []
      ],
      "ElementInternals-validation-expected.txt": [
@@ -334731,6 +334782,10 @@
       "2657bb761955202e50cd65f00431fdc415a09eb3",
       []
      ],
+     "Range-mutations-dataChange.html.ini": [
+      "c1f1d46ce54df403fe78ec637233281dbb7e2fef",
+      []
+     ],
      "Range-mutations-deleteData.html.ini": [
       "8a4d2feb07a10de291aaf74a7996c09fef195942",
       []
@@ -336402,7 +336457,7 @@
       []
      ],
      "insertunorderedlist.html.ini": [
-      "e53adccaea7711dd2f2faf4be0e91746e23a7e40",
+      "086c537e5a97cb985f897c62c159ca72bebab445",
       []
      ],
      "italic.html.ini": [
@@ -336811,7 +336866,7 @@
        []
       ],
       "eucjp-encode-href-errors-han.html.ini": [
-       "de94c744ab12e2787d0b62bcbf6a18543bb8f663",
+       "c056e52331777c9b752f8aa832f38a2f740000e0",
        []
       ],
       "eucjp-encode-href-errors-hangul.html.headers": [
@@ -336877,7 +336932,7 @@
        []
       ],
       "iso2022jp-decode.html.ini": [
-       "5470cb8939013788cab92ea33cf70594d12e77b0",
+       "6f52998fafee1951702b906b6c79dd09c58bcf35",
        []
       ],
       "iso2022jp-decoder.js": [
@@ -336967,7 +337022,7 @@
        []
       ],
       "sjis-decode-ms932.html.ini": [
-       "e8a046f875179688890a13bacbeef9388ae59bd4",
+       "19fe6b81f5fe05a54fcfeea436bc2b219854a081",
        []
       ],
       "sjis-decode-ms_kanji.html.ini": [
@@ -337645,7 +337700,7 @@
      []
     ],
     "unsupported-labels.window.js.ini": [
-     "1b76ac536b466fa7a8afe94ee6b2ddd80a639dcf",
+     "450e960b98d0e4b0d49c321f740d312acdb15b08",
      []
     ]
    },
@@ -340937,7 +340992,7 @@
        []
       ],
       "element-meta-refresh.https.optional.sub.html.ini": [
-       "86cd06a416677654309e18c9d84b393130469edf",
+       "9874a8c90794c6daa1e2289e60a7982173db62b8",
        []
       ],
       "element-meta-refresh.optional.sub.html.ini": [
@@ -340992,10 +341047,6 @@
        "be183287eb3b80035a7bb3d1a3843fce41ffe7d5",
        []
       ],
-      "window-history.https.sub.html.ini": [
-       "3905902d31f4bfe73904da41048c2327f779fc61",
-       []
-      ],
       "worker-dedicated-constructor.sub.html.ini": [
        "da6289c1350e26985fe621228331fbcfb802ce0d",
        []
@@ -341550,7 +341601,7 @@
       ]
      },
      "service-worker-background-fetch.https.window.js.ini": [
-      "71a608241880e804f7c295bffda04cb61b569849",
+      "ff15806f1f68c5f74a9a324a6338986be83e3b09",
       []
      ],
      "service-worker-fetch.https.window.js.ini": [
@@ -341891,7 +341942,7 @@
      []
     ],
     "focus-already-focused-iframe-same-site.html.ini": [
-     "c8cb0f97f7b02f70990a80ee9fe25f1d9b8db7a2",
+     "4f0bb0ce512506e160d3de8c8bdf6bbc231d11df",
      []
     ],
     "focus-event-after-focusing-iframes-expected.txt": [
@@ -344253,7 +344304,7 @@
      []
     ],
     "clamped-time-origin.html.ini": [
-     "9082a0b2944b33844a9d5a28ccfbb3a43f1f8f1e",
+     "ab661818c92ffc42c403c6c65cbb42645b627317",
      []
     ],
     "cross-origin-isolated-timing-attack.https.html.headers": [
@@ -344317,16 +344368,12 @@
      []
     ],
     "anonymous-iframe": {
-     "anonymous-iframe-popup.tentative.https.window.js.ini": [
-      "dc4dd8c6f2c72fcd84ed7037eb3d714b5fc35212",
-      []
-     ],
      "cookie-store.tentative.https.window.js.ini": [
       "f9ef8df9679b96f3645832ded00a205bf6aaf236",
       []
      ],
      "embedding.tentative.https.window.js.ini": [
-      "c0c94b22d95a3cf100decad911c9f051ec7bd360",
+      "21e5d4fae70b75cd36b1a9daa85da4e9a841668b",
       []
      ],
      "fenced-frame-bypass.tentative.https.window-expected.txt": [
@@ -344593,10 +344640,6 @@
         "before-load-hash-twice.html.ini": [
          "5827e20f32e674c3ac9966a1f11d5562542481b9",
          []
-        ],
-        "before-load-hash.html.ini": [
-         "07db753679f024ede5d7459689eb2e35e7edd6a6",
-         []
         ]
        },
        "persisted-user-state-restoration": {
@@ -345645,10 +345688,6 @@
         "2a8989f27252570aa49ada5a1e6eefbddfd9b207",
         []
        ],
-       "combination_history_006.html.ini": [
-        "9a7593eab709f3940ee46d0deb382620b4e5e8d4",
-        []
-       ],
        "history-state-after-bfcache.window.js.ini": [
         "3ff7eb10abd8ea6e78075c57bb4326858481877d",
         []
@@ -345890,7 +345929,7 @@
         []
        ],
        "location-protocol-setter-non-broken.html.ini": [
-        "31f51cf42107748d72536cf32c60b4ec7f2c38c2",
+        "218b1cc1d61b5431ae3e46cc81b67f3082d7929a",
         []
        ],
        "location-prototype-setting-cross-origin-domain.sub-expected.txt": [
@@ -346187,7 +346226,7 @@
          []
         ],
         "parent-yes-child-no-same.sub.https.html.ini": [
-         "c5662b40305800686cf263cc61750628ee4e991c",
+         "7683c127a6934937d22bf2eaaaba2f8789fd25fa",
          []
         ],
         "parent-yes-child-no-subdomain.sub.https.html.headers": [
@@ -346195,7 +346234,7 @@
          []
         ],
         "parent-yes-child-no-subdomain.sub.https.html.ini": [
-         "88fd82f5ed244ea415ff50b2d0d5dcdee19abb06",
+         "1524e6e285a6186fe7dd732b0faf4db6e3ea8ebf",
          []
         ],
         "parent-yes-child-yes-port.sub.https.html.headers": [
@@ -346203,7 +346242,7 @@
          []
         ],
         "parent-yes-child-yes-port.sub.https.html.ini": [
-         "2c3782b364adde0e5fecca73eec09a86c377271f",
+         "1fe764980cdb004b33f17ae5ae9329436157fe58",
          []
         ],
         "parent-yes-child-yes-same.sub.https.html.headers": [
@@ -346211,7 +346250,7 @@
          []
         ],
         "parent-yes-child-yes-same.sub.https.html.ini": [
-         "21a226635de11b863215c756aee7b0791a7e43bb",
+         "e3a89c0f7ce9961f842110f8818e4e27fd505f8b",
          []
         ],
         "parent-yes-child-yes-subdomain.sub.https.html.headers": [
@@ -346219,7 +346258,7 @@
          []
         ],
         "parent-yes-child-yes-subdomain.sub.https.html.ini": [
-         "7d1f8d71a7f1c246989e97c433364988505a9850",
+         "428253fdf40cc6bdee2242af4fe458fdb741e1e6",
          []
         ]
        },
@@ -346237,11 +346276,7 @@
          []
         ],
         "parent-no-child1-yes-subdomain-child2-no-port.sub.https.html.ini": [
-         "8b8493d7d3127bf61316869c8a13a64d1c154d48",
-         []
-        ],
-        "parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini": [
-         "2ae4867c1c4fc9e6b1049177e5f6c0476956640b",
+         "e5fb8dea59a6a992a74d4e88f84bb1078d1e04dd",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.headers": [
@@ -346249,7 +346284,7 @@
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini": [
-         "a6a8b30b86e1738b531feef0c99b2b70862577ce",
+         "1d37b551b8796e43084bd8f689e46e21474382f2",
          []
         ],
         "parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html.headers": [
@@ -346272,6 +346307,10 @@
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
+        "parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini": [
+         "9bcd06566805156e9c14fabd814b7d34a3a803aa",
+         []
+        ],
         "parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html.headers": [
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
@@ -346293,7 +346332,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini": [
-         "ce7dbbfda2430ac74efd6e77aa0f8c0315fd281f",
+         "71b884a38cb29b9ec5ed7504e50a3aad3f2a674f",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html.headers": [
@@ -346309,7 +346348,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini": [
-         "cdeff1ef2022fb11645ab1c31225f8212a56b034",
+         "785b82bcbee81c3cc4c76982e3b589be6de6148a",
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.headers": [
@@ -346317,7 +346356,7 @@
          []
         ],
         "parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini": [
-         "05729211a40f89914e08a4462d315d98c013b735",
+         "55092ef7500f2092b4ef7e5c787589b55ffe0166",
          []
         ]
        },
@@ -346382,16 +346421,12 @@
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
-        "javascript-url-yes.https.html.ini": [
-         "300ae43ef4c3e8800127b329607ad79591d30700",
-         []
-        ],
         "removed-iframe.sub.https.html.headers": [
          "79a20f30fc0f486014c8b93edef7483605101504",
          []
         ],
         "removed-iframe.sub.https.html.ini": [
-         "55f11aaf08ab4b06ada0ae665685c483a7805dd2",
+         "dd33a866e9ddaec5d22f512a0092facd83d3744a",
          []
         ],
         "resources": {
@@ -346425,7 +346460,7 @@
          []
         ],
         "sandboxed-same-origin-iframe-no.https.html.ini": [
-         "ba59a28c25169698f1fae444c753d1baac527fb1",
+         "27d7b90a39f0b3627a686e2a6c41bd450bbc5872",
          []
         ],
         "sandboxed-same-origin-iframe-yes.https.html.headers": [
@@ -346433,7 +346468,7 @@
          []
         ],
         "sandboxed-same-origin-iframe-yes.https.html.ini": [
-         "71f8030d85162e0bad5c0d7e41f58165d9a7d53d",
+         "805a17e15d672b160c0c087c55acb1fd91cf8ce3",
          []
         ]
        },
@@ -346447,27 +346482,27 @@
        ],
        "iframe-navigation": {
         "parent-no-1-no-same-2-yes-port.sub.https.html.ini": [
-         "7dd4eacf802bd2655ff6178afd87ddaf8610d61f",
+         "ec2a502d92a980ccdf4976cc1155f85ad599095b",
          []
         ],
         "parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini": [
-         "1600e6fc8a11413f7500b8d534b47dc9e6600a90",
+         "29d716063918c30f789ec92576f7e6dec2901fbe",
          []
         ],
         "parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini": [
-         "eae6fc7f81a169a7a8497434d7938dca79b495af",
+         "076b56dbf568243af2939dd9c4a28a3aef8b1963",
          []
         ],
         "parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini": [
-         "16816d416ecf363e793607903f34eb779ddddeaf",
+         "0f6e6c5cc697b85bb3b915839572761b59421017",
          []
         ],
         "parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini": [
-         "fdcb26e785d34c9b00059041c0d124c2d1a61ff6",
+         "80582a0bda86f9a1fe51800c41e0d32fa97dea52",
          []
         ],
         "parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini": [
-         "aa701dfece5d837c59b9ccf1c00407252557bd5f",
+         "2d7a272b30800f5e65aa37b4f60b1caf199bc06d",
          []
         ],
         "parent-yes-1-no-same-2-no-port.sub.https.html.headers": [
@@ -346475,7 +346510,7 @@
          []
         ],
         "parent-yes-1-no-same-2-no-port.sub.https.html.ini": [
-         "bf08842a95539dd79c8aede5cf7c6612230bd010",
+         "011d73afdc0110dbe8de576ed8fdce3909094f0d",
          []
         ],
         "parent-yes-1-no-same-2-no-subdomain.sub.https.html.headers": [
@@ -346483,7 +346518,7 @@
          []
         ],
         "parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini": [
-         "844f2b1bea35a7c67e7a329bf4d1e749752cfef9",
+         "b8ea2ca58bb23a1ff95204f2ab640907ffac4c58",
          []
         ]
        },
@@ -346497,7 +346532,7 @@
        ],
        "popups": {
         "opener-no-openee-yes-subdomain.sub.https.html.ini": [
-         "afa51c3e414cbea6919adb9cfb65b5e625fd6f50",
+         "1368d4ebe063c13c54fee10ae3d296b08c8ba5ff",
          []
         ],
         "opener-yes-openee-no-port.sub.https.html.headers": [
@@ -346505,7 +346540,7 @@
          []
         ],
         "opener-yes-openee-no-port.sub.https.html.ini": [
-         "1ddca58b67d024c0f556dcb991043ae1a4182e8c",
+         "9b1a10aa46e106fe931b8c0ec758ed5b5297f91e",
          []
         ],
         "opener-yes-openee-no-same.sub.https.html.headers": [
@@ -346545,7 +346580,7 @@
          []
         ],
         "opener-yes-openee-yes-subdomain.sub.https.html.ini": [
-         "42f89ad89f2319febbf177f3fcf115b5f678c7af",
+         "3cc93c11dae56f86ae7b8d6cbd614c0743649202",
          []
         ]
        },
@@ -346558,7 +346593,7 @@
         []
        ],
        "removing-iframes.sub.https.html.ini": [
-        "d943b31962c0c3aa451b6472158658179ddbfcc3",
+        "45bad45437ae9feeabcb5419604a82c069208990",
         []
        ],
        "resources": {
@@ -346614,7 +346649,7 @@
       },
       "relaxing-the-same-origin-restriction": {
        "document_domain_access_details.sub.html.ini": [
-        "29f86924eef02d1e3b0ae455083488ecd296a665",
+        "61766e689ec4224e9dae6a463eff726dc29b6fbe",
         []
        ],
        "document_domain_setter.html.ini": [
@@ -346903,10 +346938,6 @@
          []
         ]
        },
-       "open-features-is-popup-condition.html.ini": [
-        "05409bab024e90c5473631368a46e867d505aeed",
-        []
-       ],
        "open-features-negative-innerwidth-innerheight.html.ini": [
         "ad6ace0710760cedf3840baf02a126775e92c870",
         []
@@ -346967,6 +346998,10 @@
         "97ab60773abb587368339945de01df4af993a54b",
         []
        ],
+       "open-features-non-integer-width.html.ini": [
+        "1e059b010bdfe835d5f64e515f658e60674c8e98",
+        []
+       ],
        "open-features-tokenization-noopener.html.ini": [
         "efce1ae6e9edcabfa74899c229df8f185f87e1d4",
         []
@@ -346984,7 +347019,7 @@
         []
        ],
        "open-features-tokenization-top-left.html.ini": [
-        "e05e8a3bcbab57f52352fb305219cb1af318369a",
+        "a5ba4c24deabf5feac62e046e01bf9f663a60048",
         []
        ],
        "resources": {
@@ -347056,8 +347091,12 @@
        "ba9df39fbb40986537c7a4688da7dd7ea82e32f2",
        []
       ],
+      "window-open-noopener.html.ini": [
+       "2220bb32d524339a473308465ce1fdebe7f9903e",
+       []
+      ],
       "window-open-windowfeatures-values.html.ini": [
-       "c7f00b14c71320896d8d02c8cbd5a2e248e2017d",
+       "ef909a9fbff128dcd041f2de23ab974043d2a261",
        []
       ],
       "window-properties.https-expected.txt": [
@@ -349144,6 +349183,12 @@
        "d0524194c9186da948d150da7b36f0f1144a61f9",
        []
       ],
+      "drawing-images-to-the-canvas": {
+       "2d.drawImage.animated.poster.html.ini": [
+        "55cf49a5996f364b25c55a553a419b2ee026a4e9",
+        []
+       ]
+      },
       "fill-and-stroke-styles": {
        "2d.pattern.paint.repeat.basic.html.ini": [
         "59c6d7d3f9c14d3dd9470bb82563a12804617949",
@@ -349171,7 +349216,7 @@
          []
         ],
         "offscreencanvas.resize.html.ini": [
-         "fd91f0f4b0bc089e5c7f10ec0ed1c66be5262794",
+         "a579b95449e376bc8f99b295e27e8be94cd3e647",
          []
         ],
         "offscreencanvas.transferrable-expected.txt": [
@@ -349723,11 +349768,7 @@
        []
       ],
       "image.https.window.js.ini": [
-       "617fdcced505b4716e26dd11d57d4b6b97afb498",
-       []
-      ],
-      "reporting-subresource-corp.https.window.js.ini": [
-       "dc3970db5c07e161ad737624d2f0d38e501a3438",
+       "a048ac86484f29356c08bbe2a935a01e5f3345c7",
        []
       ],
       "resources": {
@@ -349782,7 +349823,11 @@
       []
      ],
      "dedicated-worker.https.html.ini": [
-      "dd9391b4781ce4c78e976f9ecfeff33007e91255",
+      "6bc5f6dc9a7127f1db057f8b4c431ea962406f0a",
+      []
+     ],
+     "iframe-history-none-require-corp.https.html.ini": [
+      "aadcf66577c38999e91c2868e2cfde9601e71d67",
       []
      ],
      "javascript.https.html.headers": [
@@ -349892,7 +349937,7 @@
       []
      ],
      "reporting-subresource-corp.https.html.ini": [
-      "9560d8d6541b56b4f89b1c765fd870b6832d5131",
+      "12f401ec9857d92ca399601a430344f0c46690df",
       []
      ],
      "reporting-to-document-reporting-endpoint.https.window.js.ini": [
@@ -350188,7 +350233,7 @@
       []
      ],
      "coep-with-same-site.https.html.ini": [
-      "7938d8f2b665e7fc8bbf947af158948991ed4210",
+      "06986c34c07abae401f3ef56c52e1eccc891aba9",
       []
      ],
      "coop-coep-sandbox.https.html.headers": [
@@ -350231,24 +350276,28 @@
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
      ],
-     "coop-sandbox.https.html.ini": [
-      "e003d2bb2946910aa31942370e4f6dc7eec55d70",
-      []
-     ],
      "header-parsing-failures.https.html.ini": [
-      "1272acc4db378a41c9accfe25f9b65d3ea69b0d5",
+      "0395d5862b3e044ca8194db3057565e3ad48d74c",
       []
      ],
      "header-parsing-non-ascii.https.html.headers": [
       "54e44a7113def0babd42f726c878fc90db2e99f9",
       []
      ],
+     "header-parsing-non-ascii.https.html.ini": [
+      "352e7aad6f020561a33cc066d29ae815dd33f1e0",
+      []
+     ],
      "header-parsing-repeated.https.html.headers": [
       "85c58be8a1c60ed64b2efaed8a155fc5e087537e",
       []
      ],
      "header-parsing-repeated.https.html.ini": [
-      "6c6d744722cce15a515c5f0f8755f60cde65d9a7",
+      "0ff031216698bcc77afe7110f069d5f7d0fd27e9",
+      []
+     ],
+     "header-parsing-successes.https.html.ini": [
+      "f545d7b1ba24a55f980a8cfdee522fd7d71f230d",
       []
      ],
      "historical": {
@@ -350272,22 +350321,22 @@
        "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
        []
       ],
-      "popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.ini": [
-       "1879499d14a5dacfc8e07ed2dd15df7e1924f968",
-       []
-      ],
       "popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
        "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
        []
       ],
       "popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini": [
-       "0ece312708b561da25f350af89dc0abe0c211465",
+       "eb3fd0485663ee6cfb5d98810486043aa6a2e766",
        []
       ],
       "popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers": [
        "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
        []
       ],
+      "popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.ini": [
+       "8d718f6b6ce27cf4718657f1f6228bc0e16210fd",
+       []
+      ],
       "popup-same-site-with-cross-origin.https.html.headers": [
        "34bd099a302f893f92586241ea38aac812bf28d0",
        []
@@ -350301,7 +350350,7 @@
        []
       ],
       "popup-same-site-with-same-origin.https.html.ini": [
-       "71fe175cf71dcb57025122ae5251bb2abfbcfbaa",
+       "4a8a69c67ce65a40e37fc817e5763a78a2cf951a",
        []
       ],
       "popup-same-site-with-same-site.https.html.headers": [
@@ -350326,7 +350375,7 @@
       []
      ],
      "iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini": [
-      "852cb8e7d076d066975c7fe2b59baabf2a5ee2e0",
+      "fbb8b7ea360ac444a02016d6e916050745585372",
       []
      ],
      "iframe-popup-same-origin-allow-popups-to-unsafe-none.https.html.headers": [
@@ -350342,7 +350391,7 @@
       []
      ],
      "iframe-popup-same-origin-to-same-origin.https.html.ini": [
-      "223c26b5d730d933a5f58b18a1597c67a0aac633",
+      "c6cd6b730183649c8f3a41dd1e35837e05470862",
       []
      ],
      "iframe-popup-same-origin-to-unsafe-none.https.html.headers": [
@@ -350370,11 +350419,15 @@
       []
      ],
      "javascript-url.https.html.ini": [
-      "043f54e21263e0b98143fb900231e4ea89ccb498",
+      "a613d3bad75f9c9582949bb450f3a4750c34fdd5",
+      []
+     ],
+     "navigate-to-aboutblank.https.html.ini": [
+      "056fc91fee52cf3c18f9e9c5f31f4cc2f78611e7",
       []
      ],
      "navigate-top-to-aboutblank.https.html.ini": [
-      "1aeca853cfa3c55b386ca9cb36493b699d321c2b",
+      "d5c6b7629520bbf8969208c96e72707a0ef0454e",
       []
      ],
      "no-https.html.headers": [
@@ -350390,7 +350443,7 @@
       []
      ],
      "popup-redirect-cache.https.html.ini": [
-      "a2126157625cd8daee02358582ad29f8d7adebda",
+      "5f9ca4e98d2c6479aa3793f2cea70104840669e8",
       []
      ],
      "popup-redirect-same-origin-allow-popups.https.html.ini": [
@@ -350429,6 +350482,10 @@
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
      ],
+     "popup-same-origin-with-cross-origin.https.html.ini": [
+      "5edb38c4da12a526b55e978b0fd09cf29bfab2cc",
+      []
+     ],
      "popup-same-origin-with-same-origin.https.html.headers": [
       "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
       []
@@ -350480,7 +350537,7 @@
         []
        ],
        "access-from-coop-page-to-opener_coop-ro.https.html.ini": [
-        "7845145c8ed58b716c52ab7c80cf1f03d7d06442",
+        "75251f82e9084a5548933004eb1a3f2d5d5efe6c",
         []
        ],
        "access-from-coop-page-to-opener_coop-ro_cross-origin.https.html.ini": [
@@ -350500,7 +350557,7 @@
         []
        ],
        "access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini": [
-        "c12963c37c283f6c853bb9f9ef36b7cf83c9d0df",
+        "a07396ec29b90d8998c0949887aa263615f8ad36",
         []
        ],
        "access-to-coop-page-from-opener_coop-ro.https.html.ini": [
@@ -350512,7 +350569,7 @@
         []
        ],
        "access-to-coop-page-from-other_coop-ro.https.html.ini": [
-        "12463d2a477294446d1b508952f81fdfcfd6296e",
+        "22693c3d4521115956429a962468b7b769327914",
         []
        ],
        "access-to-coop-page-from-other_coop-ro_cross-origin.https.html.ini": [
@@ -350536,7 +350593,7 @@
         []
        ],
        "property-frames.https.html.ini": [
-        "01f4fcd2960d85861b72c469942031529268ec2f",
+        "21215fd305f462e4142845a404889820349c098d",
         []
        ],
        "property-indexed-getter.https.html.headers": [
@@ -350556,23 +350613,23 @@
         []
        ],
        "property-location-set.https.html.ini": [
-        "e016cf9c67e1853eefcc7da328877d3d0866029c",
+        "2f7117844e127f6a83ab378339e2027d18eea311",
         []
        ],
        "property-named-getter.https.html.headers": [
         "64f4d5fedffd208b7174c7d8e0bce4e99ce1ac0f",
         []
        ],
-       "property-named-getter.https.html.ini": [
-        "a713a5f1fd7eea7cfad4e994ae94b6f4efea9a42",
-        []
-       ],
        "property-opener-get.https.html.ini": [
         "e053a92320caf24980ff5f4d623361e7485303db",
         []
        ],
+       "property-opener-set.https.html.ini": [
+        "5c096b165ef8879b38c62e8c116bc3dc39ae7263",
+        []
+       ],
        "property-postmessage-1.https.html.ini": [
-        "ab4e882800645f49b748ce816f1108237bde01a8",
+        "943353e4f9e25b62aaec539cff959e753180bc02",
         []
        ],
        "property-postmessage-2.https.html.ini": [
@@ -350584,7 +350641,7 @@
         []
        ],
        "property-top.https.html.ini": [
-        "7bd46c45dea7626c43b604418611570c9f08691d",
+        "f989a1455a8ba373848579c707526c997bdb5f20",
         []
        ],
        "property-window.https.html.ini": [
@@ -350736,7 +350793,7 @@
       }
      },
      "resource-popup.https.html.ini": [
-      "950ed5a35712e468a2528cbffb9fe22d1c6cce11",
+      "f030a189f9ec459fd336f1b123ed5796391ab211",
       []
      ],
      "resources": {
@@ -350812,7 +350869,7 @@
         []
        ],
        "iframe-popup-to-so.https.html.ini": [
-        "2451a4e76d7be93cdd583e20dac264d5707d4b4a",
+        "e3a14cedcbe3ad3c6aca7ec0a8af4f792a026b11",
         []
        ],
        "iframe-popup-to-soap.https.html.headers": [
@@ -350820,7 +350877,7 @@
         []
        ],
        "iframe-popup-to-soap.https.html.ini": [
-        "f8661d582e1632d4967a02fc2a63c594f5c87a44",
+        "dd70f03b2e8d09c23ac6f0ee6e91bb37edf4b0e9",
         []
        ],
        "iframe-popup-to-un.https.html.headers": [
@@ -350828,7 +350885,7 @@
         []
        ],
        "iframe-popup-to-un.https.html.ini": [
-        "275706e4b4b566e979c0822359ded85f476fde89",
+        "9afd7b3f9b0ba4181c16b1de799a272170e49feb",
         []
        ],
        "iframe-popup-to-un.https_1-2-expected.txt": [
@@ -350856,7 +350913,7 @@
         []
        ],
        "iframe-popup.https.html.ini": [
-        "4f6dc509504b25a91462730fcac2315ccc823f69",
+        "51dea9892a1a00fd09fb795c64c44dc95857d766",
         []
        ],
        "iframe-popup.https_1-2-expected.txt": [
@@ -350924,7 +350981,7 @@
         []
        ],
        "popup-un.https.html.ini": [
-        "1fa6809af65f62531cd6f9859c421595da663651",
+        "3825ee4b58097e7262bc7d1e1cff1fcc0684f5fa",
         []
        ],
        "popup-with-cross-origin.https-expected.txt": [
@@ -350936,7 +350993,7 @@
         []
        ],
        "popup-with-cross-origin.https.html.ini": [
-        "f97561bf0fff98b15162863581a99dfd0dc6bbc5",
+        "4e17baa0cc7389cbdb7ad5478ca25b3c307b8269",
         []
        ],
        "popup-with-same-origin.https-expected.txt": [
@@ -350948,7 +351005,7 @@
         []
        ],
        "popup-with-same-origin.https.html.ini": [
-        "5e23173a1ad96fa1cc19ae9e7649a3afd97de59d",
+        "a2bc292d5496bafa25dc8d092a25dc18e19e6747",
         []
        ],
        "popup-with-same-site.https-expected.txt": [
@@ -350960,7 +351017,7 @@
         []
        ],
        "popup-with-same-site.https.html.ini": [
-        "58021850c1aadb55cffd98d9127004c0961fa3b3",
+        "38b2f93760f06bd187430b8f5f7bbf6bf5844c2b",
         []
        ]
       }
@@ -351520,10 +351577,6 @@
       []
      ],
      "render-blocking": {
-      "script-inserted-script.html.ini": [
-       "e11044cfb6253752396bd957d05295fc1d8c2c07",
-       []
-      ],
       "script-inserted-stylesheet-link.tentative.html.ini": [
        "64be6e97171f830f84edb718f094f89392c8f731",
        []
@@ -357217,7 +357270,7 @@
          []
         ],
         "resource-selection-invoke-audio-constructor.html.ini": [
-         "0fb6a8301e84fda502c54a63dd632e2fed3fe47a",
+         "832554d322a83d49960e5586a1b22eb166cf8708",
          []
         ],
         "resource-selection-invoke-in-sync-event-expected.txt": [
@@ -357249,7 +357302,7 @@
          []
         ],
         "resource-selection-invoke-insert-source.html.ini": [
-         "90bfb401de4601bdb01e22caa517ec61f3a10f98",
+         "ffcd9afbc824c17e78504dcb765aa69f74d34cef",
          []
         ],
         "resource-selection-invoke-load.html.ini": [
@@ -357257,7 +357310,7 @@
          []
         ],
         "resource-selection-invoke-pause-networkState.html.ini": [
-         "fb095150a0d522562806caf4e43af4887f5bdb80",
+         "e889ab762e3f0df906ff3f35139c60e0c4a89904",
          []
         ],
         "resource-selection-invoke-pause.html.ini": [
@@ -357269,7 +357322,7 @@
          []
         ],
         "resource-selection-invoke-remove-from-document-networkState.html.ini": [
-         "940dd055965fc8216fc7b76adf46fce4ea80c73c",
+         "33e2bbbf2db5f400c6b95c9f46e33d3e663a43c5",
          []
         ],
         "resource-selection-invoke-set-src-not-in-document.html.ini": [
@@ -357277,7 +357330,7 @@
          []
         ],
         "resource-selection-invoke-set-src.html.ini": [
-         "1d86d05b30bbae23f96c56f3b0cc2bcb4da62c47",
+         "c0581652ef344bf42e125cffdd9d6761b9b91d4b",
          []
         ],
         "resource-selection-pointer-control-expected.txt": [
@@ -357767,10 +357820,6 @@
           "96afaef346374e70cdf2fec425f19f7a1239e175",
           []
          ],
-         "track-cue-rendering-after-controls-removed.html.ini": [
-          "cd1b74eeb79be9307b34f5ed97d40da43b33b932",
-          []
-         ],
          "track-cue-rendering-line-doesnt-fit-ref.html": [
           "8354041eb2a0aa57b283e12d9c0390f16327ac80",
           []
@@ -358242,7 +358291,7 @@
         []
        ],
        "sandbox-top-navigation-child.tentative.sub.window.js.ini": [
-        "9e36063fb286f655dd09c1a3c8321469a15d89fe",
+        "ce6897a13e1dfb8c0b1412cb27eff9d89af02617",
         []
        ],
        "sandbox-top-navigation-escalate-privileges.tentative.sub.window.js.ini": [
@@ -358545,10 +358594,6 @@
         "05a60034ad0683c72db70f659c66075ac52c17bf",
         []
        ],
-       "image-loading-lazy-data-url-to-https.html.ini": [
-        "668679d346a232ccd1a51db6cf1cab1beb05bbaf",
-        []
-       ],
        "image-loading-lazy-expected.txt": [
         "724ecac7ecfd4ce12ff9faf48d58d6c79ef61472",
         []
@@ -359330,7 +359375,7 @@
         []
        ],
        "selectmenu-form-state-restore.tentative.html.ini": [
-        "12a4ba6bdc34b75a8bbc2857619930c03a08a76b",
+        "2dbfcd2a827090ec23178c8e097b29712ffd5de1",
         []
        ],
        "selectmenu-keyboard.tentative.html.ini": [
@@ -359354,7 +359399,7 @@
         []
        ],
        "selectmenu-parts-structure.tentative.html.ini": [
-        "269dc031ec4d4aaa34cb7fe006d544bfbd87e2b8",
+        "4ff897be9aaaa5cd51033f95579b2cb2b6cdedf4",
         []
        ],
        "support": {
@@ -359738,7 +359783,7 @@
         []
        ],
        "activation-behavior.window.js.ini": [
-        "b02e6bff1e09e278ce309cbba67bc9726e807f9d",
+        "f5ddbc8ba5601734ab87044f39ecc6f83acbeddc",
         []
        ]
       },
@@ -363755,7 +363800,7 @@
        ],
        "integration-with-the-javascript-job-queue": {
         "promise-job-entry.html.ini": [
-         "b7889a6b7b76419e7532fabed84ecc1dc853db6b",
+         "ba12335c9236bd83734393abb5315ec9073772a1",
          []
         ],
         "promise-job-incumbent-expected.txt": [
@@ -363971,6 +364016,12 @@
        ]
       }
      },
+     "timers": {
+      "negative-settimeout.any.js.ini": [
+       "80e633e8f58e4fe51beac4a4ef046c40019eab2f",
+       []
+      ]
+     },
      "update-rendering": {
       "child-document-raf-order-expected.txt": [
        "f9ba495c5a66c946d32656087abe29b6b7e83097",
@@ -364442,10 +364493,6 @@
       []
      ]
     },
-    "bare-specifiers.sub.html.ini": [
-     "5e759f2363634ee769c267bb03c3ee4910ad956c",
-     []
-    ],
     "csp": {
      "hash-failure.html.ini": [
       "8126e2b0875b9a63b01d1a5382db9462bf1fa244",
@@ -365178,7 +365225,7 @@
       []
      ],
      "webtransport-h3.https.sub.any.js.ini": [
-      "667aadcf01418289fbe5842a37335b9cdddd9b56",
+      "66e623f8d70d32122d5a1abe3b40c9baf4ed21c2",
       []
      ],
      "wpt-server-wpt-flags.sub.html.ini": [
@@ -366573,7 +366620,7 @@
      []
     ],
     "cross-origin-iframe.sub.html.ini": [
-     "a93fa19475c19c312c7d05d2263f5c7ba8ac52b9",
+     "547df299e57f1b3c7250a4bdc155e1a9cab3fec1",
      []
     ],
     "idlharness.window-expected.txt": [
@@ -366868,12 +366915,12 @@
       []
      ],
      "observe-cross-origin-tao-animated-image.tentative.html.ini": [
-      "bd26a29edfe54b30409db23fb6d001cb9b15e2f4",
+      "1cd483bde895dd98ddd0bc113ae4761fe696ccb5",
       []
      ]
     },
     "first-paint-equals-lcp-text.html.ini": [
-     "2e33519c46d6f33c42e399a635264256aceff165",
+     "7d56e9397679a858bc0ea8f4e1681b27b96c2601",
      []
     ],
     "image-upscaling-expected.txt": [
@@ -367126,7 +367173,7 @@
       []
      ],
      "preload-finished-before-final-response.h2.window.js.ini": [
-      "27b93e4049a5624f18f3acf5102c08590cdcfa83",
+      "a7688341bb408cd71b5eab2d4a9e126bd0e4142d",
       []
      ],
      "preload-finished-while-receiving-final-response-body.h2.window.js.ini": [
@@ -367190,7 +367237,7 @@
       []
      ],
      "referrer-policy-unsafe-url.h2.window.js.ini": [
-      "a432caa2324441ba258a7c9a2bbbf2386baf373f",
+      "b282f0012b050882834afc5235da63f23fa47926",
       []
      ],
      "resources": {
@@ -367429,7 +367476,7 @@
      []
     ],
     "longtask-in-sibling-iframe-crossorigin.html.ini": [
-     "1a806b495fe18933dcd2e9a3763b9f6c27baa645",
+     "9aec8da79cfcdf2cf8308e10bb38a7567175ddd5",
      []
     ],
     "longtask-sync-xhr.html.ini": [
@@ -367764,6 +367811,10 @@
        "4fd4b225f3527a151b9d63e7603ab224453d7721",
        []
       ],
+      "legacy-mstyle-attributes.html.ini": [
+       "422903cf4ab17eb19bbc2fc1dcf85dc5b954002b",
+       []
+      ],
       "mrow-painting-order-ref.html": [
        "72694959a86f1917cbd3db13b7f1a8b71714b711",
        []
@@ -367922,10 +367973,6 @@
        "f72fdc8403719b0d07a283ad725975ce72dfe056",
        []
       ],
-      "operator-dictionary-arabic-002.html.ini": [
-       "f0fa72f41bfa4a4f79b8af912e2e1b3857c5b907",
-       []
-      ],
       "operator-dictionary-empty-and-three-chars-ref.html": [
        "2cbed129401e721fccfeb12874d6b7223bff8def",
        []
@@ -368153,7 +368200,7 @@
        ]
       },
       "ignored-properties-001.html.ini": [
-       "5b2c3d516e3a1d4db12e797e087230664156fc7d",
+       "72e28090ec5f96a3d73a1aa34c4b0d14a1cf2f75",
        []
       ],
       "legacy-scriptminsize-attribute-ref.html": [
@@ -369164,7 +369211,7 @@
       []
      ],
      "mediasource-worker-play-terminate-worker.html.ini": [
-      "6d693cae3edc28badde86986a0b7459d1e80cd81",
+      "f45744bda7103f4e0e6eea8b9d476fbf6a285493",
       []
      ],
      "mediasource-worker-play-terminate-worker.js": [
@@ -369212,12 +369259,8 @@
      "bfadae16bea68043faa770b0e86704c5173295c4",
      []
     ],
-    "mediasource-appendbuffer-quota-exceeded.html.ini": [
-     "0dd051012546496ff21aea166d30e2dc914d55e8",
-     []
-    ],
     "mediasource-avtracks.html.ini": [
-     "a211a60e109ac6a1beb629e1372d9203e285c35f",
+     "395d921ffa795d66aed85c8d87f795dce25396db",
      []
     ],
     "mediasource-buffered-expected.txt": [
@@ -369289,7 +369332,7 @@
      []
     ],
     "mediasource-duration.html.ini": [
-     "d73c3f22958564d711eddcdd6dd5837fa1fa367a",
+     "e23991a44d05dc947b282963b19b18ecddc52cab",
      []
     ],
     "mediasource-endofstream-expected.txt": [
@@ -371066,7 +371109,7 @@
     },
     "scroll-behavior": {
      "after-transition-intercept-handler-modifies.html.ini": [
-      "61cb1657f2ae6ad5810ee5721301e6c25fbb872a",
+      "81269fb15e30009b5547992fbc0ca854a12ca540",
       []
      ]
     },
@@ -371211,7 +371254,11 @@
       "afe09530d75866dbfd84ad4c346b0d8d6f27e5d3",
       []
      ]
-    }
+    },
+    "test-performance-attributes.sub.html.ini": [
+     "d0a1c619e930382e80cc1a15856054973d3f5ca5",
+     []
+    ]
    },
    "netinfo": {
     "DIR_METADATA": [
@@ -371981,7 +372028,7 @@
      []
     ],
     "pending_beacon-sendondiscard.tentative.https.window.js.ini": [
-     "34e4879e89cb58fda5df658c6422efe29ceeb454",
+     "0afa3eb6ba538b31e263ed102d977b93203d55f3",
      []
     ],
     "pending_beacon-sendonhidden.tentative.https.window.js.ini": [
@@ -372078,7 +372125,7 @@
       []
      ],
      "performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini": [
-      "b84c0c60cfc69eb767dd686943a8a4ee6ac7c205",
+      "af1aaca9dc47d6b282f5743c5c7ba78d915e7528",
       []
      ],
      "performance-navigation-timing-same-origin-replace.tentative.window.js.ini": [
@@ -372321,10 +372368,6 @@
       "a54ad04c8585af431bd123c07479959332908ee2",
       []
      ],
-     "unload-allowed-by-default.tentative.window.js.ini": [
-      "6360a03d9b2e0a9a6e94ac5a30cf26dc57b5e32c",
-      []
-     ],
      "vertical-scroll-main-frame-manual.tentative.html.headers": [
       "8d9c01e14835acbc0af74b5b9157a4a8b95243f8",
       []
@@ -375693,7 +375736,7 @@
      []
     ],
     "reporting-isolated-across-navigations.https.sub.html.ini": [
-     "2e790806d3c53de11d90330caa785419b314766f",
+     "ff4e0da62988e1ce1a8790cd7ccbb7fbc8f8f93e",
      []
     ],
     "resources": {
@@ -375833,15 +375876,11 @@
      []
     ],
     "deadline-max-rAF-dynamic.html.ini": [
-     "04b0e95e76cf5bce0496de6e6f24ffdaf1ef66c0",
-     []
-    ],
-    "deadline-max-rAF.html.ini": [
-     "c2a9bbc2d2bfc59f1c6b4b8823275c23b7419994",
+     "f827d6250bf610959f743f72b5d29b4f9522627d",
      []
     ],
     "deadline-max-timeout-dynamic.html.ini": [
-     "e86c52100ce2d0c59e5bedf252a41dbc3abe116d",
+     "28ba1bf464969e40ec63582daf9619802a7a62fc",
      []
     ],
     "deadline-max.html.ini": [
@@ -375945,7 +375984,7 @@
      []
     ],
     "content-type-parsing.html.ini": [
-     "17aa7dbcc6d221125e412094bc476262d0147cd9",
+     "affb928e47ef29adb6b3458452c5fd797915d146",
      []
     ],
     "frameset-timing.html": [
@@ -375997,7 +376036,7 @@
      []
     ],
     "no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini": [
-     "be64ae2e80ab56dfa6b68027a551ad69be3d667e",
+     "ff8840b1c4670c311ffe8732818d81842e38a5aa",
      []
     ],
     "ping-rt-entries-expected.txt": [
@@ -376395,7 +376434,7 @@
      ]
     },
     "response-status-code.html.ini": [
-     "1b6605f1b1955d587fbb4c31453a4bd34ce3de9f",
+     "5496d8a03c56938d14b220e199ef0960a2fd1590",
      []
     ],
     "sleep.py": [
@@ -378358,7 +378397,7 @@
       []
      ],
      "cache-add.https.any.js.ini": [
-      "a4f459911f261afbbd0e3fb21b0dcc034af2a914",
+      "6af02218b5b2c5ed518ec57e09f313d9239354bc",
       []
      ],
      "cache-add.https.any.serviceworker-expected.txt": [
@@ -378616,11 +378655,11 @@
       []
      ],
      "about-blank-replacement.https.html.ini": [
-      "b2a61d9c24fb4e80b97cb4747249e50855d8dddb",
+      "c59a16f3f05b2c5ffde6c477c227fb8ad9b3cf6a",
       []
      ],
      "client-navigate.https.html.ini": [
-      "a8461b4ee03ceec4debc39d832812c38d41052c6",
+      "3c0cf64aa232d2b5c99f8a70eec0ec3298a69ac3",
       []
      ],
      "client-url-of-blob-url-worker.https-expected.txt": [
@@ -380516,7 +380555,7 @@
       []
      ],
      "unregister-immediately-during-extendable-events.https.html.ini": [
-      "48187be6cf659c80f88dd2bbf4828e0763dd24f2",
+      "5f5d44ef6825889ebe4a83a500c41ac97fecd7c6",
       []
      ],
      "unregister-then-register-new-script.https-expected.txt": [
@@ -380806,28 +380845,12 @@
     }
    },
    "shared-storage": {
-    "permissions-policy-default.tentative.https.sub.html.ini": [
-     "9deb67829d8af150820c88d4073378bbd0f9af14",
-     []
-    ],
-    "permissions-policy-none.tentative.https.sub.html.headers": [
-     "9903f7c578df6af6d2a43454e305aec6cffdfa5f",
-     []
-    ],
-    "permissions-policy-none.tentative.https.sub.html.ini": [
-     "23f7b3298d252967f49398973226300baa7fbf17",
-     []
-    ],
-    "permissions-policy-self.tentative.https.sub.html.headers": [
-     "36c95f2b087ba06f930731dbd16a54e913d588ca",
-     []
-    ],
-    "permissions-policy-self.tentative.https.sub.html.ini": [
-     "156f91068e52fdbeb645869d92269f8989dff2a3",
-     []
-    ],
     "resources": {
-     "permissions-policy-helper.html": [
+     "select-url-permissions-policy-helper.html": [
+      "b70d763ad457415dd7facc78a003e5a20a1d9c5d",
+      []
+     ],
+     "shared-storage-permissions-policy-helper.html": [
       "d87092aad1d2efedf5d4245884e28e159880b2df",
       []
      ],
@@ -380836,10 +380859,46 @@
       []
      ],
      "util.js": [
-      "4dea9837646dc38ccee9ab01aeb83cf371ff3a5a",
+      "838885a56570fca26e08e168b8a078928e131b62",
       []
      ]
-    }
+    },
+    "select-url-permissions-policy-none.tentative.https.sub.html.headers": [
+     "fdd2e3780bf08395689d19cd9d914eb48ad26093",
+     []
+    ],
+    "select-url-permissions-policy-none.tentative.https.sub.html.ini": [
+     "990b636943d1bd9feb121ddfc18dc53dd6d67140",
+     []
+    ],
+    "select-url-permissions-policy-self.tentative.https.sub.html.headers": [
+     "20d5451ba2cf84d7e063f230efc5861c1ff7b1c1",
+     []
+    ],
+    "select-url-permissions-policy-self.tentative.https.sub.html.ini": [
+     "5a7c2d8c2d2a56bad7002ec8559787455c65f5da",
+     []
+    ],
+    "shared-storage-permissions-policy-default.tentative.https.sub.html.ini": [
+     "660ded2f50057c8311e8b591f937511dcb2f2e00",
+     []
+    ],
+    "shared-storage-permissions-policy-none.tentative.https.sub.html.headers": [
+     "9903f7c578df6af6d2a43454e305aec6cffdfa5f",
+     []
+    ],
+    "shared-storage-permissions-policy-none.tentative.https.sub.html.ini": [
+     "3abf34c362e22886c14abcff38a6966067b5584b",
+     []
+    ],
+    "shared-storage-permissions-policy-self.tentative.https.sub.html.headers": [
+     "36c95f2b087ba06f930731dbd16a54e913d588ca",
+     []
+    ],
+    "shared-storage-permissions-policy-self.tentative.https.sub.html.ini": [
+     "d7f746113001034102efdae1d592a4675211ad63",
+     []
+    ]
    },
    "signed-exchange": {
     "META.yml": [
@@ -381442,7 +381501,7 @@
       []
      ],
      "csp-script-src-self.html.ini": [
-      "03af32c4ad3c3f7c1c775cc0a17a90438d279b2f",
+      "23f1c74d2192d78ec8bfdc0e18f8bc75d497bf36",
       []
      ],
      "csp-script-src-unsafe-inline.html.ini": [
@@ -381482,7 +381541,7 @@
       []
      ],
      "navigator-plugins.tentative.html.ini": [
-      "6d40224b5f63c0761e26dcc880f5c97c2302d641",
+      "a9fa26cb4b1628423ea781bd5ae1792dd1da06ba",
       []
      ],
      "navigator-subapp.https.tentative.html.ini": [
@@ -381498,7 +381557,7 @@
       []
      ],
      "referrer-policy-no-referrer.html.ini": [
-      "0a70c55e029e0ec01b921fcaafc4aa3b4752c4ae",
+      "76132cd0681cf55ee750ed7b3503eb2dc77b5e30",
       []
      ],
      "referrer-policy-origin.html.ini": [
@@ -381928,11 +381987,11 @@
       ]
      },
      "response-code-non-successful.html.ini": [
-      "ba0befaada95db283d4615c26d289ad9e390b92b",
+      "dc41559188572c33f486292f66492bb9956ba088",
       []
      ],
      "response-code-successful.html.ini": [
-      "b60b1de7e9ebd129b4416f06f9dbac828028a127",
+      "a98d0a405b61e8ed2b63e3d52c20cec2c96617ee",
       []
      ],
      "restriction-audio-setSinkId-with-invalid-sinkId.https.tentative.html.ini": [
@@ -381956,7 +382015,7 @@
       []
      ],
      "restriction-bluetooth.tentative.https.html.ini": [
-      "430d214a46243795c50eef1a5dbe7e0ecce35eac",
+      "ebc3e375c39a321111cc155ac1f4dd9137b73fb7",
       []
      ],
      "restriction-broadcast-channel.html.ini": [
@@ -382008,7 +382067,7 @@
       []
      ],
      "restriction-message-boxes.html.ini": [
-      "8bd97880f870a2162a3f55e3fd75921935149f95",
+      "a19061396a8e8780f34563f70ec2627d23d9f65a",
       []
      ],
      "restriction-midi-sysex.https.html.ini": [
@@ -382068,7 +382127,7 @@
       []
      ],
      "restriction-service-worker-postmessage.https.html.ini": [
-      "7b07883516ff22329c9128a6aabf12ccc501c50f",
+      "d9875a35a59f9a50af436bfdaa706e7562fd89cd",
       []
      ],
      "restriction-service-worker-unregister.https.html.ini": [
@@ -382080,7 +382139,7 @@
       []
      ],
      "restriction-speech-synthesis.html.ini": [
-      "6984300e6cd9030dfa2b49775fba95f141b0a14c",
+      "c8b329d54aa3a58e3d46a6bcf37e2690d62df42e",
       []
      ],
      "restriction-storage-persist.https.html.ini": [
@@ -382096,7 +382155,7 @@
       []
      ],
      "restriction-web-locks.https.html.ini": [
-      "d55497aebf9840b327c385139090af4fabebdd0b",
+      "eb9f2ef76f3bb3a5a3e5124c258c2ba9d0bb3076",
       []
      ],
      "restriction-web-nfc.https.html.ini": [
@@ -382108,11 +382167,11 @@
       []
      ],
      "restriction-web-share.https.html.ini": [
-      "f0101a566f68838984b93135e83d7b5434335db8",
+      "9e705b807a47eb8a7ae02e2c4c116679250d9b98",
       []
      ],
      "restriction-web-usb.https.html.ini": [
-      "2fb4aa2fd1451f6cbb2990b624bc6485654f10ea",
+      "7cbd1ebd15260386a2272efc12970bbf8b631950",
       []
      ],
      "restriction-web-xr-immersive-vr-session.https.html.ini": [
@@ -382124,7 +382183,7 @@
       []
      ],
      "restriction-window-move.html.ini": [
-      "241db3c6ae3ceca2e0028c3a96405802838fa6ab",
+      "87802b2eb28eb268058b152c573e7e727f6b22de",
       []
      ],
      "restriction-window-open.html.ini": [
@@ -382200,7 +382259,7 @@
       []
      ],
      "windowclient-navigate.https.html.ini": [
-      "cdaf1ae05915a3cce5aabcc7884288ef2ad6cbf0",
+      "1ea18b66ef38498d1a9a053e0d365cdabc7308d3",
       []
      ],
      "workers.html.ini": [
@@ -386013,7 +386072,7 @@
      []
     ],
     "a-element-xhtml.xhtml.ini": [
-     "a90e16b8c38a1dc542c8402c820788ef098d5c31",
+     "0e56240999a61fc731006830a78b69bf32d31ce0",
      []
     ],
     "a-element-xhtml_include=javascript-expected.txt": [
@@ -386025,7 +386084,7 @@
      []
     ],
     "a-element.html.ini": [
-     "85ce55478a5ea8f11db3c6a2f7a0c3192552d5b6",
+     "42b42a2f205f6715a88c460a185d74b6104ab8bf",
      []
     ],
     "a-element_include=javascript-expected.txt": [
@@ -386037,7 +386096,7 @@
      []
     ],
     "failure.html.ini": [
-     "4364c892cde3d29b38bf7cace0017c9e9c5da053",
+     "97ce9874698c763da51039b3e9d709d2bb581aff",
      []
     ],
     "idlharness-shadowrealm.window-expected.txt": [
@@ -386045,11 +386104,7 @@
      []
     ],
     "idlharness-shadowrealm.window.js.ini": [
-     "27b57a31bb5da2c0dcfdaffd9629930d71b3dbf3",
-     []
-    ],
-    "percent-encoding.window.js.ini": [
-     "36d57023fae6a0fbf2d834ab075a368470e527de",
+     "1fb49415db04546f898a6416b2794ee4d1c1e4ad",
      []
     ],
     "resources": {
@@ -386087,7 +386142,7 @@
      []
     ],
     "toascii.window.js.ini": [
-     "5cfe13bf17539c78cb35a60876727bad45c9caca",
+     "f1a9b16df7d1ee5bef2cd897d4ab8341aa1e0cea",
      []
     ],
     "url-constructor.any.js.ini": [
@@ -386115,7 +386170,7 @@
      []
     ],
     "url-setters-a-area.window.js.ini": [
-     "a11a7016bd64c7c004fa11c7bb6f6c8a6cf04b5f",
+     "71ef2b0e1f86b48b1865eadb849054e12797e108",
      []
     ],
     "url-setters-a-area.window_include=javascript-expected.txt": [
@@ -386131,7 +386186,7 @@
      []
     ],
     "url-setters-stripping.any.js.ini": [
-     "5c23a98a6205bc1eeba0e0623b80063b03a8d6f1",
+     "ad2f860fc3677f34b0f5d29d7f7248d15cd4099b",
      []
     ],
     "url-setters-stripping.any.worker-expected.txt": [
@@ -386175,7 +386230,7 @@
      []
     ],
     "urlsearchparams-stringifier.any.js.ini": [
-     "e3259c3a89c26e14f9cb23a2047b939b33fdaeb8",
+     "6439b79b689574cbf46c27472392e52da9df0484",
      []
     ]
    },
@@ -387185,7 +387240,7 @@
      },
      "Animation": {
       "finished.html.ini": [
-       "3f679f0ca3a1954a030f3b5b55d0290fe7028345",
+       "1311a6a60d04d6b5f64dd34510156105b8ae9754",
        []
       ]
      },
@@ -387387,7 +387442,7 @@
      },
      "timelines": {
       "document-timelines.html.ini": [
-       "8c474c4dac8bc4767a86e055c819fe3f07b63f59",
+       "08dcd48709615c9a9b1a969e392a50990c32d801",
        []
       ],
       "resources": {
@@ -387405,7 +387460,7 @@
        []
       ],
       "sibling-iframe-timeline.html.ini": [
-       "60172dd34fead1471dd91e42bf1e0039a9ae2ed3",
+       "fda793bb285bae3f6cddefbd47036b789da06e18",
        []
       ],
       "timelines.html.ini": [
@@ -387882,16 +387937,16 @@
      "release.tentative.https.html.ini": [
       "f580f5e14398488bb0ca0d1b7db19639af60315f",
       []
+     ],
+     "sharedworker-multiple.tentative.https.html.ini": [
+      "d8bf264011d4080217ef892d547ee92890c3aed3",
+      []
      ]
     },
     "clientids.tentative.https.html.ini": [
      "4423c326ffe912062124a75cc712052f08b5a15e",
      []
     ],
-    "query-ordering.tentative.https.html.ini": [
-     "236f81ad0bebb737c8cf24c41b4b375df775be5a",
-     []
-    ],
     "query.tentative.https.any.js.ini": [
      "c7d15b034eebc3ff91bcfe3f8a7cc87dd6180ebe",
      []
@@ -388191,7 +388246,7 @@
      },
      "the-analysernode-interface": {
       "test-analyser-output.html.ini": [
-       "b2da746bbef1182d895f8dc4c22ef9fcbfaf3599",
+       "9673c067ce940429c2761735c2f54f3ac6212694",
        []
       ]
      },
@@ -388455,7 +388510,7 @@
        []
       ],
       "convolver-response-4-chan.html.ini": [
-       "fa12c207a7cbdf641d86be2a7c79ccefb43befb4",
+       "9c0d59a77e7824048b91f56b2f8d52d4e5c76459",
        []
       ]
      },
@@ -388471,7 +388526,7 @@
      },
      "the-mediaelementaudiosourcenode-interface": {
       "mediaElementAudioSourceToScriptProcessorTest.html.ini": [
-       "efe3d87894b34d3d1f24dd770c227575c348c1ff",
+       "93fe64730d11fed13a1e159500ac6ed2bbba250a",
        []
       ],
       "no-cors.https.html.ini": [
@@ -389595,10 +389650,6 @@
       "78a2399e152728ede2bb513b81091cbdee406093",
       []
      ],
-     "origin.window.js.ini": [
-      "df1f5ad7646d059bae0d9e4c1b34180c99a3e8e3",
-      []
-     ],
      "resources": {
       "cross-origin.html": [
        "5078b6fc8e46f556fe1b86c7e1aa5a141c132be1",
@@ -389813,7 +389864,7 @@
      []
     ],
     "idlharness.https.any.js.ini": [
-     "1f6ede487cd60ddc1b822834cce6468c8d0f268a",
+     "38d8bc33f28fe39696f388385484ffb6badec6e3",
      []
     ],
     "idlharness.https.any.worker-expected.txt": [
@@ -390747,7 +390798,7 @@
      []
     ],
     "Create-protocols-repeated-case-insensitive.any.js.ini": [
-     "84485549eab7c540ec76b302475ed5418be830e2",
+     "7c37212c93636206fdc91750eb33ba6541f84def",
      []
     ],
     "Create-protocols-repeated-case-insensitive.any.worker-expected.txt": [
@@ -392385,6 +392436,10 @@
         "d4bd2b74c2db0e560114109af960c7f38cb38575",
         []
        ],
+       "audio_has_no_subtitles.html.ini": [
+        "6a131e93824e3d10701a21726ed463f487d76d3d",
+        []
+       ],
        "background.png": [
         "6d16cc84c4dd3b8777bd83d97888eaf8d351f6b5",
         []
@@ -394855,7 +394910,7 @@
      []
     ],
     "events_referenceSpace_reset_inline.https.html.ini": [
-     "c348a52f35b2c0cc051257b0ade447bfa00a6a14",
+     "1ce49284877fef1bb51c9f36344d5b108ffe05c9",
      []
     ],
     "events_session_select.https.html.ini": [
@@ -394938,10 +394993,6 @@
      "ar_hittest_subscription_unlocalizable.https.html.ini": [
       "65043476afd3b63dec7abb0c67b197b0933e3df3",
       []
-     ],
-     "xrRay_matrix.https.html.ini": [
-      "b22a17ae0df0d9690ab4db9d0ae3e6369b45327e",
-      []
      ]
     },
     "idlharness.https.window-expected.txt": [
@@ -395510,6 +395561,10 @@
        "2cf26a723e8efd9865628cb6a0d6c899ffa0fb14",
        []
       ],
+      "dummy-name.html.ini": [
+       "bacc91894800f986c359a3d17def9016e9089af5",
+       []
+      ],
       "dummy-shared-worker.js": [
        "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
        []
@@ -395637,7 +395692,7 @@
      []
     ],
     "data-url-shared.html.ini": [
-     "5f7aaa454e796cb32359e596c42360e44f774cd5",
+     "298751cfede5f6617127beeb81b91edbfa0c1477",
      []
     ],
     "dedicated-worker-from-blob-url.window.js.ini": [
@@ -395717,10 +395772,6 @@
         "acf89ca6f678bf0b1d7b9d92605ee8554bf65674",
         []
        ],
-       "setting.html.ini": [
-        "45a75a52353f752684031bb350133099df724c99",
-        []
-       ],
        "setting.js": [
         "c705e9c40a6dd6d4e733bf60c017e91b07d56e6e",
         []
@@ -395780,7 +395831,7 @@
         []
        ],
        "redirect.html.ini": [
-        "fd33d33be2f9c0d25ef8afed8d0a024b96686d2f",
+        "3a0f10f26cb7bf5f58f70a9cb9691f6886a5421a",
         []
        ],
        "redirect.js": [
@@ -395994,7 +396045,7 @@
       []
      ],
      "dedicated-worker-import-meta.html.ini": [
-      "f8185f10976eba9cc50ff6423ba9337629f38735",
+      "1457ee30dc6f11cbb7c828c35e02aecbb3d8d32a",
       []
      ],
      "dedicated-worker-options-credentials.html.headers": [
@@ -396455,6 +396506,10 @@
       "002.js": [
        "627272aaefa3457f90417ed0f19e967a2c036273",
        []
+      ],
+      "003.html.ini": [
+       "df5625513ab314bd0b1b1468fd54a697f69f4879",
+       []
       ]
      },
      "structured-clone": {
@@ -598078,22 +598133,43 @@
     ]
    },
    "shared-storage": {
-    "permissions-policy-default.tentative.https.sub.html": [
-     "f055ae0421f6c93afcb6ce84cb2381b0ed051390",
+    "select-url-permissions-policy-default.tentative.https.sub.html": [
+     "67911388ec0f41790d8c7c678256f153765a6294",
      [
       null,
       {}
      ]
     ],
-    "permissions-policy-none.tentative.https.sub.html": [
-     "7154061d50abada545c21e2489d55822d5772567",
+    "select-url-permissions-policy-none.tentative.https.sub.html": [
+     "6820edb0843863257aa2de3a8741d08383a13eab",
      [
       null,
       {}
      ]
     ],
-    "permissions-policy-self.tentative.https.sub.html": [
-     "bde32a5c306602f54ea02ad77b58eb3febc0d558",
+    "select-url-permissions-policy-self.tentative.https.sub.html": [
+     "b79bc065c214235d219fbf880baf556e7b030f3c",
+     [
+      null,
+      {}
+     ]
+    ],
+    "shared-storage-permissions-policy-default.tentative.https.sub.html": [
+     "5439df2a0684331e63059e095396a9b2af89c17f",
+     [
+      null,
+      {}
+     ]
+    ],
+    "shared-storage-permissions-policy-none.tentative.https.sub.html": [
+     "17a4bf1803ca33edb2d0259d14f484839c9aa3e5",
+     [
+      null,
+      {}
+     ]
+    ],
+    "shared-storage-permissions-policy-self.tentative.https.sub.html": [
+     "171325cdf8f0a909eac659e1dcbb334e50eef216",
      [
       null,
       {}
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini b/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini
index 2fe6bf87..f020440 100644
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/structured-clone.any.js.ini
@@ -3,40 +3,12 @@
 [structured-clone.any.html?81-100]
 
 [structured-clone.any.worker.html?101-last]
-  expected:
-    if product == "chrome": [OK, TIMEOUT]
-  [Blob: [object Blob\]]
-    expected:
-      if product == "chrome": [PASS, TIMEOUT]
-
-  [Not serializable: Event: [object Event\]]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [Not serializable: DedicatedWorkerGlobalScope: [object DedicatedWorkerGlobalScope\]]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [Not serializable: function: function() {}]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [Not serializable: symbol: Symbol(desc)]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [File: [object File\]]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
-  [Not serializable: MessageChannel: [object MessageChannel\]]
-    expected:
-      if product == "chrome": [PASS, NOTRUN]
-
 
 [structured-clone.any.worker.html?41-60]
 
 [structured-clone.any.html?101-last]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
 
 [structured-clone.any.html?21-40]
 
diff --git a/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt
deleted file mode 100644
index 4a45559..0000000
--- a/third_party/blink/web_tests/external/wpt/compute-pressure/idlharness.https.window-expected.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-This is a testharness.js-based test.
-PASS idl_test setup
-PASS idl_test validation
-PASS PressureObserver interface: existence and properties of interface object
-PASS PressureObserver interface object length
-PASS PressureObserver interface object name
-PASS PressureObserver interface: existence and properties of interface prototype object
-PASS PressureObserver interface: existence and properties of interface prototype object's "constructor" property
-PASS PressureObserver interface: existence and properties of interface prototype object's @@unscopables property
-PASS PressureObserver interface: operation observe(PressureSource)
-PASS PressureObserver interface: operation unobserve(PressureSource)
-PASS PressureObserver interface: operation disconnect()
-PASS PressureObserver interface: operation takeRecords()
-PASS PressureObserver interface: attribute supportedSources
-FAIL PressureObserver interface: operation requestPermission() assert_own_property: interface object missing static operation expected property "requestPermission" missing
-PASS PressureObserver must be primary interface of observer
-PASS Stringification of observer
-PASS PressureObserver interface: observer must inherit property "observe(PressureSource)" with the proper type
-PASS PressureObserver interface: calling observe(PressureSource) on observer with too few arguments must throw TypeError
-PASS PressureObserver interface: observer must inherit property "unobserve(PressureSource)" with the proper type
-PASS PressureObserver interface: calling unobserve(PressureSource) on observer with too few arguments must throw TypeError
-PASS PressureObserver interface: observer must inherit property "disconnect()" with the proper type
-PASS PressureObserver interface: observer must inherit property "takeRecords()" with the proper type
-PASS PressureObserver interface: observer must inherit property "supportedSources" with the proper type
-PASS PressureObserver interface: observer must inherit property "requestPermission()" with the proper type
-PASS PressureRecord interface: existence and properties of interface object
-PASS PressureRecord interface object length
-PASS PressureRecord interface object name
-PASS PressureRecord interface: existence and properties of interface prototype object
-PASS PressureRecord interface: existence and properties of interface prototype object's "constructor" property
-PASS PressureRecord interface: existence and properties of interface prototype object's @@unscopables property
-PASS PressureRecord interface: attribute source
-PASS PressureRecord interface: attribute state
-PASS PressureRecord interface: attribute factors
-PASS PressureRecord interface: attribute time
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js.ini b/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js.ini
index 0f2e60c..6bd74be8 100644
--- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js.ini
@@ -1,18 +1,10 @@
 [cookieListItem_attributes.https.any.serviceworker.html]
-  [CookieListItem - cookieStore.set with expires set to a timestamp 10 years in the future]
-    expected:
-      if os == "win": FAIL
-
-  [CookieListItem - cookieStore.set with expires set to a Date 10 years in the future]
-    expected:
-      if os == "win": FAIL
-
 
 [cookieListItem_attributes.https.any.html]
   [CookieListItem - cookieStore.set with expires set to a timestamp 10 years in the future]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
 
   [CookieListItem - cookieStore.set with expires set to a Date 10 years in the future]
     expected:
-      if os == "win": [PASS, FAIL]
+      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini
deleted file mode 100644
index 991863e..0000000
--- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_set_arguments.https.any.js.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[cookieStore_set_arguments.https.any.serviceworker.html]
-  [cookieStore.set with expires set to a future Date]
-    expected:
-      if os == "win": FAIL
-
-  [cookieStore.set with expires set to a future timestamp]
-    expected:
-      if os == "win": FAIL
-
-
-[cookieStore_set_arguments.https.any.html]
-  [cookieStore.set with expires set to a future Date]
-    expected:
-      if os == "win": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini
index d272c84..12ce602c 100644
--- a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.https.html.ini
@@ -1,7 +1,8 @@
 [fedcm-network-requests.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if (flag_specific == "") and (os == "linux") and (product == "chrome"): TIMEOUT
+    if (flag_specific == "") and (os == "win"): TIMEOUT
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
   [nonce is not required in FederatedIdentityProvider.]
     expected:
       if product == "chrome": NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini
index 5b5e8dbb..1181379 100644
--- a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-nowrap-4.html.ini
@@ -1,5 +1,4 @@
 [float-nowrap-4.html]
   expected:
-    if (flag_specific == "") and (os == "win"): [TIMEOUT, CRASH]
-    if flag_specific == "disable-layout-ng": PASS
+    if (os == "linux") and (flag_specific == "disable-layout-ng"): PASS
     CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-inline-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-inline-004.html.ini
index b2fa31ba5..4b68313d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-inline-004.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-inline-004.html.ini
@@ -1,72 +1,96 @@
 [anchor-position-inline-004.html]
   [.target 1]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 2]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 3]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 4]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 5]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 6]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 7]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 8]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 9]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 10]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 11]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 12]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 13]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 14]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 15]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 16]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 17]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 18]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 19]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 20]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 21]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 22]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 23]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
 
   [.target 24]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini
index cd79bce..9037285 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html.ini
@@ -7,3 +7,7 @@
 
   [Animation state is preserved when interleaving animations in list]
     expected: FAIL
+
+  [Animations preserve their startTime when changed]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/parsing/color-scheme-computed.html.ini b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/parsing/color-scheme-computed.html.ini
new file mode 100644
index 0000000..393908a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/parsing/color-scheme-computed.html.ini
@@ -0,0 +1,3 @@
+[color-scheme-computed.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini
index 076a237..e92a5bb1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/nested-query-containers.html.ini
@@ -1,2 +1,4 @@
 [nested-query-containers.html]
-  expected: CRASH
+  expected:
+    if os == "win": [TIMEOUT, CRASH]
+    CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html.ini
index 8b88ef42..a15c710 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html.ini
@@ -18,3 +18,23 @@
   [.flexbox > img 8]
     expected:
       if flag_specific == "disable-layout-ng": FAIL
+
+  [.flexbox > img 12]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [.flexbox > img 14]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [.flexbox > img 10]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [.flexbox > img 11]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [.flexbox > img 9]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini
index c33d2d7..0ef2b0d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html.ini
@@ -9,32 +9,32 @@
 
   [.flexbox > img 11]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 6]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 12]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 9]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 7]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 14]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 10]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [.flexbox > img 1]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/animations/font-style-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/animations/font-style-interpolation.html
new file mode 100644
index 0000000..4666025
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/animations/font-style-interpolation.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-style interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-style">
+<meta name="assert" content="Font-style should be animated smoothly.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.container {
+  font-style: oblique 20deg;
+}
+.container2 {
+  font-style: oblique 5deg;
+}
+.target {
+  display: inline-block;
+  font: 100px sans-serif;
+  font-style: normal;
+}
+.expected {
+  color: green;
+  margin-right: 30px;
+}
+</style>
+
+<body>
+<template id="target-template">
+  <span class="container">
+    <div class="target">TT</div>
+  </span>
+</template>
+
+<span id="inv-container" class="container">
+  <div id="inv-target" class="target">TT</div>
+</span>
+</body>
+
+<script>
+test_interpolation({
+  property: 'font-style',
+  from: 'normal',
+  to: 'oblique 10deg'
+}, [
+  {at: -2, expect: 'oblique -20deg'},
+  {at: -0.25, expect: 'oblique -2.5deg'},
+  {at: 0, expect: 'normal'},
+  {at: 0.3, expect: 'oblique 3deg'},
+  {at: 0.6, expect: 'oblique 6deg'},
+  {at: 1, expect: 'oblique 10deg'},
+  {at: 1.5, expect: 'oblique 15deg'},
+]);
+
+test_interpolation({
+  property: 'font-style',
+  from: 'oblique 5deg',
+  to: 'oblique 15deg'
+}, [
+  { at: -2, expect: 'oblique -15deg' },
+  { at: -0.25, expect: 'oblique 2.5deg' },
+  { at: 0, expect: 'oblique 5deg' },
+  { at: 0.3, expect: 'oblique 8deg' },
+  { at: 0.6, expect: 'oblique 11deg' },
+  { at: 1, expect: 'oblique 15deg' },
+  { at: 1.5, expect: 'oblique 20deg' },
+]);
+
+test_interpolation({
+  property: 'font-style',
+  from: 'initial',
+  to: 'inherit'
+}, [
+  { at: -2, expect: 'oblique -40deg' },
+  { at: -0.25, expect: 'oblique -5deg' },
+  { at: 0, expect: 'normal' },
+  { at: 0.3, expect: 'oblique 6deg' },
+  { at: 0.6, expect: 'oblique 12deg' },
+  { at: 1, expect: 'oblique 20deg' },
+  { at: 1.5, expect: 'oblique 30deg' },
+]);
+
+test_interpolation({
+  property: 'font-style',
+  from: 'oblique 20deg',
+  to: 'normal'
+}, [
+  { at: -1, expect: 'oblique 40deg' },
+  { at: 0, expect: 'oblique 20deg' },
+  { at: 0.5, expect: 'oblique 10deg' },
+  { at: 1, expect: 'normal' },
+  { at: 1.5, expect: 'oblique -10deg' },
+]);
+
+test_interpolation({
+  property: 'font-style',
+  from: 'oblique -90deg',
+  to: 'oblique 90deg'
+}, [
+  { at: -2, expect: 'oblique -90deg' },
+  { at: -1, expect: 'oblique -90deg' },
+  { at: 0, expect: 'oblique -90deg' },
+  { at: 0.5, expect: 'normal' },
+  { at: 1, expect: 'oblique 90deg' },
+  { at: 1.5, expect: 'oblique 90deg' },
+]);
+
+test(t => {
+  var container = document.getElementById('inv-container');
+  var target = document.getElementById('inv-target');
+  var anim = target.animate({ fontStyle: ['normal', 'inherit'] }, 1000);
+  anim.pause();
+  anim.currentTime = 500;
+  assert_equals(getComputedStyle(target).fontStyle, 'oblique 10deg');
+
+  container.setAttribute('class', 'container2');
+  assert_equals(getComputedStyle(target).fontStyle, 'oblique 2.5deg');
+}, "An interpolation to inherit updates correctly on a parent style change.");
+
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini
index 46ebc05b..9451204 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/Initial-letter-breaking-rtl.html.ini
@@ -1,3 +1,4 @@
 [Initial-letter-breaking-rtl.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini
index eede05d..1136475 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-block-position-raise-under-ruby.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-block-position-raise-under-ruby.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini
index 984123ce..1e3e903 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial-vlr.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-drop-initial-vlr.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini
index 497ccbc..bda49d3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-drop-initial.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-drop-initial.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini
index 4b45bbf..ae13c19 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-001.html.ini
@@ -1,3 +1,4 @@
 [initial-letter-float-001.html]
   expected:
-    if flag_specific == "disable-layout-ng": FAIL
+    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
+    if (os == "linux") and (product == "chrome"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-004.html.ini
index d614985..4030844f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-004.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-004.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-float-004.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-raise.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-raise.html.ini
index 20d257d..56b3ed6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-raise.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-raised-sunken-caps-raise.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-raised-sunken-caps-raise.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini
index 145423c1..77a501b5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-sunk-initial-vrl.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-sunk-initial-vrl.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini
index 56e94a867..7f69acb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-first-line.html.ini
@@ -1,4 +1,3 @@
 [initial-letter-with-first-line.html]
   expected:
-    if (os == "linux") and (product == "content_shell") and (flag_specific == "disable-layout-ng"): FAIL
-    if (os == "linux") and (product == "chrome"): FAIL
+    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-layout/constructor-error.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-layout/constructor-error.https.html.ini
deleted file mode 100644
index 3ab53016..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-layout/constructor-error.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[constructor-error.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-008.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-008.https.html.ini
new file mode 100644
index 0000000..d3a6b1c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-008.https.html.ini
@@ -0,0 +1,3 @@
+[parse-input-arguments-008.https.html]
+  expected:
+    if os == "win": [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini
index 62f06bd..44bac53 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html.ini
@@ -1,4 +1,4 @@
 [parse-input-arguments-018.https.html]
   expected:
-    if os == "win": [CRASH, TIMEOUT]
+    if flag_specific == "disable-layout-ng": PASS
     CRASH
diff --git a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-022.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-022.https.html.ini
deleted file mode 100644
index a607705..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-paint-api/parse-input-arguments-022.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[parse-input-arguments-022.https.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom-expected.txt
index e4c9ae0a7..41455cd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom-expected.txt
@@ -1,7 +1,8 @@
 This is a testharness.js-based test.
-FAIL CSSOM setters function as expected for unregistered properties assert_equals: expected "10px" but got " 10px"
+FAIL Initially unregistered values from stylesheet assert_equals: expected "10px" but got " 10px"
+PASS CSSOM setters function as expected for unregistered properties
 PASS CSS.registerProperty
-FAIL Formerly valid values are still readable from inline styles but are computed as the unset value assert_equals: expected "5" but got ""
+PASS Formerly valid values are still readable from inline styles but are computed as the unset value
 PASS Values not matching the registered type can still be set
 PASS Values can be removed from inline styles
 PASS Stylesheets can be modified by CSSOM
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom.html b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom.html
index 95c4c17..6231e27 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-cssom.html
@@ -27,7 +27,9 @@
   // Nothing registered yet, whatever you specify works
   assert_equals(computedStyle.getPropertyValue('--length'), '10px');
   assert_equals(computedStyle.getPropertyValue('--color'), 'red');
+}, "Initially unregistered values from stylesheet");
 
+test(function() {
   inlineStyle.setProperty('--length', '5');
   inlineStyle.setProperty('--color', 'hello');
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-001-ref.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-ref.html
rename to third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-001-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-001.html
similarity index 95%
rename from third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align.html
rename to third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-001.html
index c5f8ed3a..5ef1d8d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-001.html
@@ -2,7 +2,7 @@
 <meta charset="utf-8">
 <title>CSS Test: ::marker pseudo elements styled with 'text-align' property</title>
 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
-<link rel="match" href="marker-text-align-ref.html">
+<link rel="match" href="marker-text-align-001-ref.html">
 <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
 <link rel="help" href="https://drafts.csswg.org/css-text/#text-align-property">
 <meta name="assert" content="Checks that 'text-align' doesn't apply nor inherit to ::marker.">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-002-ref.html
new file mode 100644
index 0000000..04fd8c2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-002-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'text-align' property</title>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#marker-properties">
+<link rel="help" href="https://drafts.csswg.org/css-text/#text-align-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1805603">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+ul {
+  width: 300px;
+  border: 1px solid black;
+  font-family: Ahem;
+}
+li {
+  /* Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1808393 */
+  list-style-type: "A";
+}
+</style>
+<ul class="ul">
+  <li><div style="text-align: right;">AAA</div></li>
+</ul>
+<ul class="ul">
+  <li><div style="text-align: end;">AAA</div></li>
+</ul>
+<ul class="ul">
+  <li><div style="text-align: center;">AAA</div></li>
+</ul>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-002.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-002.html
new file mode 100644
index 0000000..6fe05b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-002.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'text-align' property</title>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#marker-properties">
+<link rel="help" href="https://drafts.csswg.org/css-text/#text-align-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1805603">
+<link rel="match" href="marker-text-align-002-ref.html">
+<meta name="assert" content="Checks that 'text-align' does not shift the ::marker element.">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+ul {
+  width: 300px;
+  border: 1px solid black;
+  font-family: Ahem;
+}
+li {
+  /* Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1808393 */
+  list-style-type: "A";
+}
+</style>
+<ul class="ul">
+  <li style="text-align: right;">AAA</li>
+</ul>
+<ul class="ul">
+  <li style="text-align: end;">AAA</li>
+</ul>
+<ul class="ul">
+  <li style="text-align: center;">AAA</li>
+</ul>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-003-ref.html
new file mode 100644
index 0000000..98d52645
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-003-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'text-align' property</title>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#marker-properties">
+<link rel="help" href="https://drafts.csswg.org/css-text/#text-align-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1805603">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+body {
+  direction: rtl;
+}
+ul {
+  width: 300px;
+  border: 1px solid black;
+  font-family: Ahem;
+}
+li {
+  /* Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1808393 */
+  list-style-type: "A";
+}
+</style>
+<ul class="ul">
+  <li><div style="text-align: left;">AAA</div></li>
+</ul>
+<ul class="ul">
+  <li><div style="text-align: end;">AAA</div></li>
+</ul>
+<ul class="ul">
+  <li><div style="text-align: center;">AAA</div></li>
+</ul>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-003.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-003.html
new file mode 100644
index 0000000..38c513d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-text-align-003.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'text-align' property</title>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#marker-properties">
+<link rel="help" href="https://drafts.csswg.org/css-text/#text-align-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1805603">
+<link rel="match" href="marker-text-align-003-ref.html">
+<meta name="assert" content="Checks that 'text-align' does not shift the ::marker element.">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+body {
+  direction: rtl;
+}
+ul {
+  width: 300px;
+  border: 1px solid black;
+  font-family: Ahem;
+}
+li {
+  /* Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1808393 */
+  list-style-type: "A";
+}
+</style>
+<ul class="ul">
+  <li style="text-align: left;">AAA</li>
+</ul>
+<ul class="ul">
+  <li style="text-align: end;">AAA</li>
+</ul>
+<ul class="ul">
+  <li style="text-align: center;">AAA</li>
+</ul>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001a.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001a.html.ini
new file mode 100644
index 0000000..0df837fb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-text-combine-upright-001a.html.ini
@@ -0,0 +1,3 @@
+[ruby-text-combine-upright-001a.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/svg-intrinsic-size-006-ref.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/svg-intrinsic-size-006-ref.html
new file mode 100644
index 0000000..4e164672
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/svg-intrinsic-size-006-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test Reference: Test SVG intrinsic sizing with and without preferred aspect-ratio</title>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1801581">
+
+<style>
+div {
+  width: 300px;
+  height: 30px;
+  background: green;
+  line-height: 0;
+  border: 5px solid black;
+  margin: 5px;
+}
+</style>
+
+<!-- Chrome 110 and Safari 16.4 render these two divs with zero width. -->
+<div style="width: 0; height: 0"></div>
+<div style="width: 0; height: 0"></div>
+
+<!-- Chrome 110 and Safari 16.4 render the following divs with 300px width. -->
+<div style="width: 300px; height: 150px"></div>
+<div></div>
+<div></div>
+<div></div>
+<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/svg-intrinsic-size-006.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/svg-intrinsic-size-006.html
new file mode 100644
index 0000000..b136c01
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/svg-intrinsic-size-006.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: Test SVG intrinsic sizing with and without preferred aspect-ratio</title>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1801581">
+<link rel="match" href="svg-intrinsic-size-006-ref.html">
+
+<style>
+div {
+  width: max-content;
+  background: green;
+  line-height: 0;
+  border: 5px solid black;
+  margin: 5px;
+}
+svg {
+  vertical-align: top;
+}
+</style>
+
+<!-- Chrome 110 and Safari 16.4 render these two divs with zero width. -->
+<div><svg viewBox="0 0 1 1"></svg></div>
+<div><svg style="aspect-ratio: 1/1;"></svg></div>
+
+<!-- Chrome 110 and Safari 16.4 render the following divs with 300px width. -->
+<div><svg></svg></div>
+<div><svg style="width: 10%" viewBox="0 0 1 1"></svg></div>
+<div><svg width="10%" viewBox="0 0 1 1"></svg></div>
+<div><svg style="width: 10%; aspect-ratio: 1/1"></svg></div>
+<div><svg width="10%" style="aspect-ratio: 1/1"></svg></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-010.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-010.html.ini
index a501ea3..892a514c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-010.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-010.html.ini
@@ -1,3 +1,3 @@
 [text-transform-capitalize-010.html]
   expected:
-    if (os == "linux") and (flag_specific == ""): FAIL
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-window.html.ini b/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-window.html.ini
index 0912a03..dc6759f8 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-window.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scroll-behavior-main-frame-window.html.ini
@@ -1,8 +1,48 @@
 [scroll-behavior-main-frame-window.html]
   [Main frame with smooth scroll-behavior ; scrollBy() with default behavior]
     expected:
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
 
   [Main frame with smooth scroll-behavior ; scrollBy() with smooth behavior]
     expected:
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): FAIL
+
+  [Main frame with smooth scroll-behavior ; scroll() with smooth behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with smooth scroll-behavior ; scrollTo() with smooth behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with smooth scroll-behavior ; scrollTo() with auto behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with smooth scroll-behavior ; scrollTo() with default behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with smooth scroll-behavior ; scrollBy() with auto behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with auto scroll-behavior ; scroll() with smooth behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with auto scroll-behavior ; scrollBy() with smooth behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with smooth scroll-behavior ; scroll() with auto behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with auto scroll-behavior ; scrollTo() with smooth behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
+
+  [Main frame with smooth scroll-behavior ; scroll() with default behavior]
+    expected:
+      if (os == "linux") and (product == "content_shell") and (flag_specific == ""): [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini
index e68b883..abe15aea 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/has-complexity.html.ini
@@ -1,2 +1,4 @@
 [has-complexity.html]
-  expected: TIMEOUT
+  expected:
+    if product == "chrome": OK
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini
index d33171c..fdce5ad 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html.ini
@@ -1,4 +1,4 @@
 [ElementInternals-target-element-is-held-strongly.html]
   expected:
-    if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
-    if os == "win": TIMEOUT
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "win"): TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini
new file mode 100644
index 0000000..c1f1d46
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/ranges/Range-mutations-dataChange.html.ini
@@ -0,0 +1,3 @@
+[Range-mutations-dataChange.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/insertunorderedlist.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/insertunorderedlist.html.ini
index e53adcca..086c537e 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/insertunorderedlist.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/insertunorderedlist.html.ini
@@ -1,4 +1,6 @@
 [insertunorderedlist.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
   [[["insertunorderedlist",""\]\] "foo[\]bar" queryCommandValue("insertunorderedlist") before]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
index de94c74..c056e523 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
@@ -29,6 +29,8 @@
 [eucjp-encode-href-errors-han.html?19001-20000]
 
 [eucjp-encode-href-errors-han.html?14001-15000]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
 
 [eucjp-encode-href-errors-han.html?3001-4000]
 
@@ -41,5 +43,3 @@
 [eucjp-encode-href-errors-han.html?2001-3000]
 
 [eucjp-encode-href-errors-han.html?4001-5000]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decode.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decode.html.ini
index 5470cb893..6f52998 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decode.html.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decode.html.ini
@@ -1,12 +1,12 @@
 [iso2022jp-decode.html?1001-2000]
 
 [iso2022jp-decode.html?6001-7000]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
 
 [iso2022jp-decode.html?4001-5000]
 
 [iso2022jp-decode.html?1-1000]
+  expected:
+    if os == "win": [OK, CRASH]
 
 [iso2022jp-decode.html?2001-3000]
 
diff --git a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-decode-ms932.html.ini b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-decode-ms932.html.ini
index e8a046f..19fe6b8 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-decode-ms932.html.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/legacy-mb-japanese/shift_jis/sjis-decode-ms932.html.ini
@@ -1,12 +1,12 @@
 [sjis-decode-ms932.html?1-1000]
 
 [sjis-decode-ms932.html?6001-7000]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
 
 [sjis-decode-ms932.html?2001-3000]
 
 [sjis-decode-ms932.html?7001-last]
-  expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
 
 [sjis-decode-ms932.html?3001-4000]
 
diff --git a/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini b/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini
index 1b76ac5..450e960b 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/encoding/unsupported-labels.window.js.ini
@@ -1,6 +1,6 @@
 [unsupported-labels.window.html]
   expected:
-    if product == "chrome": OK
+    if product == "chrome": [OK, TIMEOUT]
     TIMEOUT
   [_autodetect_all is not supported by the Encoding Standard]
     expected: [PASS, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini
index 86cd06a..9874a8c 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html.ini
@@ -1,3 +1,3 @@
 [element-meta-refresh.https.optional.sub.html]
   expected:
-    if os == "win": TIMEOUT
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini
deleted file mode 100644
index 3905902..0000000
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/generated/window-history.https.sub.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[window-history.https.sub.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini
index 71a6082..ff15806f 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window.js.ini
@@ -1,12 +1,11 @@
 [service-worker-background-fetch.https.window.html]
   [local to local: success.]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [private to local: success.]
     expected:
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [private to private: success.]
@@ -15,8 +14,6 @@
 
   [public to local: success.]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
-      if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [public to private: success.]
diff --git a/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini b/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini
index c8cb0f97..4f0bb0c 100644
--- a/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini
+++ b/third_party/blink/web_tests/external/wpt/focus/focus-already-focused-iframe-same-site.html.ini
@@ -1,4 +1,2 @@
 [focus-already-focused-iframe-same-site.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
-    TIMEOUT
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin.html.ini b/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin.html.ini
index 9082a0b2..ab66181 100644
--- a/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin.html.ini
+++ b/third_party/blink/web_tests/external/wpt/hr-time/clamped-time-origin.html.ini
@@ -1,3 +1,3 @@
 [clamped-time-origin.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/anonymous-iframe-popup.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/anonymous-iframe-popup.tentative.https.window.js.ini
deleted file mode 100644
index dc4dd8c..0000000
--- a/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/anonymous-iframe-popup.tentative.https.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[anonymous-iframe-popup.tentative.https.window.html]
-  expected:
-    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, CRASH]
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini
index c0c94b2..21e5d4fae 100644
--- a/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.js.ini
@@ -3,6 +3,10 @@
     if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?13-last]
+  [Cross-Origin-Isolated parent embeds cross-origin COEP credentialless iframe]
+    expected:
+      if os == "win": [PASS, FAIL]
+
 
 [embedding.tentative.https.window.html?3-4]
   expected:
@@ -17,8 +21,6 @@
     if product == "chrome": ERROR
 
 [embedding.tentative.https.window.html?11-11]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?5-5]
 
@@ -27,6 +29,8 @@
 [embedding.tentative.https.window.html?6-6]
 
 [embedding.tentative.https.window.html?7-7]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?10-10]
 
@@ -35,8 +39,12 @@
 [embedding.tentative.https.window.html?12-12]
 
 [embedding.tentative.https.window.html?4-4]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [embedding.tentative.https.window.html?8-8]
+  expected:
+    if product == "chrome": [ERROR, OK]
 
 [embedding.tentative.https.window.html?3-3]
 
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini
deleted file mode 100644
index 07db753..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[before-load-hash.html]
-  [when changing hash, before load]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [FAIL, PASS]
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/combination_history_006.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/combination_history_006.html.ini
deleted file mode 100644
index 9a7593e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-history-interface/combination_history_006.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[combination_history_006.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini
index 31f51cf4..218b1cc 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html.ini
@@ -1,8 +1,10 @@
 [location-protocol-setter-non-broken.html]
   [Set HTTP URL frame location.protocol to data]
-    expected: FAIL
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
+      FAIL
 
   [Set data URL frame location.protocol to data]
     expected:
-      if flag_specific == "disable-layout-ng": PASS
+      if (flag_specific == "") and (product == "content_shell"): PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-same.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-same.sub.https.html.ini
index c5662b4..7683c12 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-same.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-same.sub.https.html.ini
@@ -1,10 +1,10 @@
 [parent-yes-child-no-same.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini
index 88fd82f..1524e6e2 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html.ini
@@ -1,11 +1,8 @@
 [parent-yes-child-no-subdomain.sub.https.html]
   [setting document.domain must not give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
-      if flag_specific == "disable-layout-ng": FAIL
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-port.sub.https.html.ini
index 2c3782b..1fe7649 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-port.sub.https.html.ini
@@ -1,5 +1,4 @@
 [parent-yes-child-yes-port.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini
index 21a2266..e3a89c0f 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html.ini
@@ -1,10 +1,8 @@
 [parent-yes-child-yes-same.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
 
   [child: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": FAIL
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-subdomain.sub.https.html.ini
index 7d1f8d71..428253f 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-subdomain.sub.https.html.ini
@@ -1,13 +1,5 @@
 [parent-yes-child-yes-subdomain.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
-
-  [child: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-
-  [setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-port.sub.https.html.ini
index 8b8493d..e5fb8dea 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-port.sub.https.html.ini
@@ -2,3 +2,16 @@
   [child1: originAgentCluster must equal true]
     expected:
       if (flag_specific == "") and (product == "content_shell"): FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [Parent to child1: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [child1 to child2: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [child2 to child1: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
deleted file mode 100644
index 2ae4867..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html]
-  [Parent to child1: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [Parent to child2: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [child1: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [child2: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini
index a6a8b30..1d37b55 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html.ini
@@ -13,3 +13,11 @@
     expected:
       if (flag_specific == "") and (product == "chrome"): FAIL
       if flag_specific == "disable-site-isolation-trials": FAIL
+
+  [child2: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+
+  [child1: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini
new file mode 100644
index 0000000..9bcd0656
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html.ini
@@ -0,0 +1,24 @@
+[parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html]
+  [Parent to child1: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [Parent to child2: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [child1 to child2: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [child2 to child1: setting document.domain must not give sync access]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [parent: originAgentCluster must equal true]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [child2: originAgentCluster must equal true]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
index ce7dbbf..71b884a3 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html.ini
@@ -1,23 +1,23 @@
 [parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html]
   [parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child1: originAgentCluster must equal true]
     expected:
-      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if os == "win": FAIL
+      if (flag_specific == "") and (os == "win"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child2: originAgentCluster must equal true]
     expected:
-      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if os == "win": FAIL
+      if (flag_specific == "") and (os == "win"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Parent to child2: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Parent to child1: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini
index cdeff1ef..785b82bcb 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html.ini
@@ -1,28 +1,28 @@
 [parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html]
   [child1 to child2: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child2 to child1: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child1: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [child2: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Parent to child2: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Parent to child1: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [parent: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini
index 0572921..55092ef7 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html.ini
@@ -1,8 +1,9 @@
 [parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
 
   [child1: originAgentCluster must equal true]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/javascript-url-yes.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/javascript-url-yes.https.html.ini
deleted file mode 100644
index 300ae43..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/javascript-url-yes.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[javascript-url-yes.https.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini
index 55f11aaf..dd33a86 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html.ini
@@ -1,4 +1,5 @@
 [removed-iframe.sub.https.html]
   [Removing the iframe does not change originAgentCluster]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-no.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-no.https.html.ini
index ba59a28..27d7b90 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-no.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-no.https.html.ini
@@ -2,4 +2,4 @@
   [originAgentCluster must equal false]
     expected:
       if (flag_specific == "") and (product == "content_shell"): FAIL
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini
index 71f8030..805a17e1 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html.ini
@@ -1,5 +1,5 @@
 [sandboxed-same-origin-iframe-yes.https.html]
   [originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-port.sub.https.html.ini
index 7dd4eac..ec2a502 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-port.sub.https.html.ini
@@ -1,12 +1,12 @@
 [parent-no-1-no-same-2-yes-port.sub.https.html]
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if os == "win": [PASS, FAIL]
 
   [before child: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if os == "win": [PASS, FAIL]
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini
index 1600e6f..29d71606 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html.ini
@@ -1,18 +1,18 @@
 [parent-no-1-no-same-2-yes-subdomain.sub.https.html]
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": PASS
+      FAIL
 
   [before child: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": PASS
+      FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-layout-ng": FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini
index eae6fc7f..076b56d 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html.ini
@@ -1,24 +1,30 @@
 [parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html]
   [Before: parent to child: setting document.domain must give sync access]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": PASS
+      if (flag_specific == "") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
       FAIL
 
   [After: parent to child: setting document.domain must give sync access]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": PASS
+      if (flag_specific == "") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
       FAIL
 
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if (flag_specific == "") and (product == "content_shell"): FAIL
       if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-      FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
+      if (flag_specific == "") and (product == "content_shell"): FAIL
       if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
-      FAIL
+
+  [before child: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+
+  [after child: originAgentCluster must equal false]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini
index 16816d4..0f6e6c5 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html.ini
@@ -11,16 +11,16 @@
 
   [before parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if os == "win": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if os == "win": FAIL
 
   [After: parent to child: setting document.domain must not give sync access]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [after child: originAgentCluster must equal true]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini
index fdcb26e..80582a0 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html.ini
@@ -1,14 +1,20 @@
 [parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html]
   [After: parent to child: setting document.domain must give sync access]
     expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if product == "chrome": PASS
       FAIL
 
   [before parent: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
 
   [after parent: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": FAIL
+
+  [before child: originAgentCluster must equal true]
+    expected:
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini
index aa701dfe..2d7a272 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html.ini
@@ -2,17 +2,21 @@
   [before parent: originAgentCluster must equal false]
     expected:
       if (os == "linux") and (flag_specific == "") and (product == "content_shell"): FAIL
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
+      if os == "win": FAIL
 
   [before child: originAgentCluster must equal true]
     expected:
       if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
 
   [after parent: originAgentCluster must equal false]
     expected:
       if (os == "linux") and (flag_specific == "") and (product == "content_shell"): FAIL
-      if os == "win": [PASS, FAIL]
+      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
+      if os == "win": FAIL
 
   [after child: originAgentCluster must equal true]
     expected:
       if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini
index bf08842..011d73af 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html.ini
@@ -1,13 +1,13 @@
 [parent-yes-1-no-same-2-no-port.sub.https.html]
   [before parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
 
   [before child: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
 
   [After: parent to child: setting document.domain must not give sync access]
     expected:
@@ -15,9 +15,9 @@
 
   [after parent: originAgentCluster must equal true]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if product == "chrome": FAIL
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
 
   [after child: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini
index 844f2b1b..b8ea2ca5 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html.ini
@@ -17,3 +17,7 @@
   [After: parent to child: setting document.domain must not give sync access]
     expected:
       if product == "chrome": FAIL
+
+  [after child: originAgentCluster must equal false]
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini
index afa51c3..1368d4e 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html.ini
@@ -1,4 +1,8 @@
 [opener-no-openee-yes-subdomain.sub.https.html]
   [opener: originAgentCluster must equal false]
     expected:
-      if flag_specific == "disable-layout-ng": FAIL
+      if os == "win": [PASS, FAIL]
+
+  [openee: originAgentCluster must equal true]
+    expected:
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-port.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-port.sub.https.html.ini
index 1ddca58..9b1a10a 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-port.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-port.sub.https.html.ini
@@ -1,8 +1,12 @@
 [opener-yes-openee-no-port.sub.https.html]
   [setting document.domain must not give sync access]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
 
   [opener: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini
index 42f89ad..3cc93c1 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html.ini
@@ -1,8 +1,9 @@
 [opener-yes-openee-yes-subdomain.sub.https.html]
   [openee: originAgentCluster must equal true]
     expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
       if flag_specific == "disable-layout-ng": FAIL
 
   [opener: originAgentCluster must equal true]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini
index d943b31..45bad454 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html.ini
@@ -10,19 +10,3 @@
       if (flag_specific == "") and (product == "chrome"): PASS
       if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
-
-  [Before: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [parent: originAgentCluster must equal true]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [Parent to child2: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
-
-  [Parent to child3: setting document.domain must not give sync access]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini
index 29f86924..61766e6 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_access_details.sub.html.ini
@@ -1,4 +1,7 @@
 [document_domain_access_details.sub.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
+    if flag_specific == "disable-layout-ng": [OK, TIMEOUT]
   [Access allowed if different-origin but both set document.domain to parent domain.]
     expected:
       if (flag_specific == "") and (product == "chrome"): PASS
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini
deleted file mode 100644
index 05409ba..0000000
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[open-features-is-popup-condition.html?single-2]
-
-[open-features-is-popup-condition.html?position]
-
-[open-features-is-popup-condition.html?single-1]
-  expected:
-    if product == "chrome": [TIMEOUT, ERROR]
-
-[open-features-is-popup-condition.html?combination]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-width.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-width.html.ini
new file mode 100644
index 0000000..1e059b0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-width.html.ini
@@ -0,0 +1,3 @@
+[open-features-non-integer-width.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-top-left.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-top-left.html.ini
index e05e8a3..a5ba4c24d 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-top-left.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-top-left.html.ini
@@ -1,82 +1,50 @@
 [open-features-tokenization-top-left.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [",,top= 152, left=152" should set top and left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [" left = 141" should set left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["LEFT=141" should set left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["top=142" should set top position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["top=152,,left=152," should set top and left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["left==141" should set left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["top=152,left=152" should set top and left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [" top = 142" should set top position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["\\ttop= 142" should set top position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["top=152==left=152" should set top and left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [",left=141,," should set left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["TOP=142" should set top position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["left=141" should set left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["\nleft= 141" should set left position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [",top=142,," should set top position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   ["top==142" should set top position of opened window]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini
new file mode 100644
index 0000000..2220bb32
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-noopener.html.ini
@@ -0,0 +1,9 @@
+[window-open-noopener.html?indexed]
+  expected:
+    if product == "chrome": [OK, ERROR]
+
+[window-open-noopener.html?_top]
+
+[window-open-noopener.html?_self]
+
+[window-open-noopener.html?_parent]
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini
index c7f00b1..ef909a9 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/window-open-windowfeatures-values.html.ini
@@ -1,3 +1,3 @@
 [window-open-windowfeatures-values.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini
new file mode 100644
index 0000000..55cf49a5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini
@@ -0,0 +1,3 @@
+[2d.drawImage.animated.poster.html]
+  expected:
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
index fd91f0f..a579b954 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
@@ -1,16 +1,11 @@
 [offscreencanvas.resize.html]
   [Verify that resizing an OffscreenCanvas with a webgl context propagates the new size to its placeholder canvas asynchronously.]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): FAIL
+      if flag_specific == "disable-site-isolation-trials": FAIL
 
   [Verify that drawImage uses the size of the frame as the intinsic size of a placeholder canvas.]
     expected:
-      if (flag_specific == "") and (os == "win"): PASS
-      if flag_specific == "disable-site-isolation-trials": [FAIL, PASS]
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
+      if flag_specific == "disable-layout-ng": PASS
       FAIL
-
-  [Verify that resizing an OffscreenCanvas with a 2d context propagates the new size to its placeholder canvas asynchronously.]
-    expected:
-      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/image.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/image.https.window.js.ini
index 617fdcc..a048ac8 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/image.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/image.https.window.js.ini
@@ -1,3 +1,3 @@
 [image.https.window.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/reporting-subresource-corp.https.window.js.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/reporting-subresource-corp.https.window.js.ini
deleted file mode 100644
index dc3970d..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/credentialless/reporting-subresource-corp.https.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reporting-subresource-corp.https.window.html]
-  expected:
-    if flag_specific == "disable-layout-ng": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/dedicated-worker.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/dedicated-worker.https.html.ini
index dd9391b4..6bc5f6d 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/dedicated-worker.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/dedicated-worker.https.html.ini
@@ -1,6 +1,6 @@
 [dedicated-worker.https.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
+    if flag_specific == "disable-site-isolation-trials": TIMEOUT
   [COEP: require-corp worker in COEP: none frame]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/iframe-history-none-require-corp.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/iframe-history-none-require-corp.https.html.ini
new file mode 100644
index 0000000..aadcf66
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/iframe-history-none-require-corp.https.html.ini
@@ -0,0 +1,3 @@
+[iframe-history-none-require-corp.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini
index 9560d8d6..12f401ec 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html.ini
@@ -10,3 +10,7 @@
 
   [[shared worker\] blocked during redirect]
     expected: FAIL
+
+  [[service worker\] blocked due to COEP]
+    expected:
+      if os == "win": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-with-same-site.https.html.ini
index 7938d8f..06986c34 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-with-same-site.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-with-same-site.https.html.ini
@@ -1,3 +1,3 @@
 [coep-with-same-site.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html.ini
deleted file mode 100644
index e003d2bb..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[coop-sandbox.https.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini
index 1272acc..0395d58 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-failures.https.html.ini
@@ -1,9 +1,9 @@
 [header-parsing-failures.https.html?1-4]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [header-parsing-failures.https.html?12-last]
 
 [header-parsing-failures.https.html?9-12]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [header-parsing-failures.https.html?5-8]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini
new file mode 100644
index 0000000..352e7aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-non-ascii.https.html.ini
@@ -0,0 +1,3 @@
+[header-parsing-non-ascii.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini
index 6c6d744..0ff03121 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-repeated.https.html.ini
@@ -1,3 +1,3 @@
 [header-parsing-repeated.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-successes.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-successes.https.html.ini
new file mode 100644
index 0000000..f545d7b1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/header-parsing-successes.https.html.ini
@@ -0,0 +1,3 @@
+[header-parsing-successes.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.ini
deleted file mode 100644
index 1879499d..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini
index 0ece312..eb3fd048 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.ini
@@ -1,3 +1,3 @@
 [popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.ini
new file mode 100644
index 0000000..8d718f6b6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.ini
@@ -0,0 +1,3 @@
+[popup-same-site-unsafe-allow-outgoing-with-same-site.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.ini
index 71fe175..4a8a69c6 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.ini
@@ -1,3 +1,3 @@
 [popup-same-site-with-same-origin.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini
index 852cb8e..fbb8b7e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini
@@ -15,3 +15,5 @@
     if product == "chrome": ERROR
 
 [iframe-popup-same-origin-allow-popups-to-same-origin.https.html?7-8]
+  expected:
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini
index 223c26b..c6cd6b7 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-same-origin.https.html.ini
@@ -7,8 +7,6 @@
     if product == "chrome": ERROR
 
 [iframe-popup-same-origin-to-same-origin.https.html?9-last]
-  expected:
-    if product == "chrome": ERROR
 
 [iframe-popup-same-origin-to-same-origin.https.html?7-8]
   expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
index 043f54e..a613d3ba 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
@@ -7,16 +7,14 @@
     if product == "chrome": ERROR
 
 [javascript-url.https.html?11-12]
-
-[javascript-url.https.html?13-14]
   expected:
     if product == "chrome": [OK, ERROR]
 
+[javascript-url.https.html?13-14]
+
 [javascript-url.https.html?15-16]
 
 [javascript-url.https.html?17-last]
-  expected:
-    if product == "chrome": ERROR
 
 [javascript-url.https.html?5-6]
   expected:
@@ -28,4 +26,4 @@
 
 [javascript-url.https.html?9-10]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html.ini
new file mode 100644
index 0000000..056fc91f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html.ini
@@ -0,0 +1,3 @@
+[navigate-to-aboutblank.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini
index 1aeca85..d5c6b762 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html.ini
@@ -1,8 +1,12 @@
 [navigate-top-to-aboutblank.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
   [Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin), iframe origin: https://www1.web-platform.test:8444]
     expected: FAIL
 
   [Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin-allow-popups), iframe origin: https://www1.web-platform.test:8444]
     expected: FAIL
+
+  [Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin), iframe origin: https://web-platform.test:8444]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini
index a2126157..5f9ca4e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html.ini
@@ -1,13 +1,13 @@
 [popup-redirect-cache.https.html?2-3]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [popup-redirect-cache.https.html?0-1]
 
 [popup-redirect-cache.https.html?6-7]
+  expected:
+    if product == "chrome": [OK, ERROR]
 
 [popup-redirect-cache.https.html?4-5]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [popup-redirect-cache.https.html?8-last]
-  expected:
-    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.ini
new file mode 100644
index 0000000..5edb38c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.ini
@@ -0,0 +1,3 @@
+[popup-same-origin-with-cross-origin.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro.https.html.ini
index 7845145..75251f82 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-from-coop-page-to-opener_coop-ro.https.html.ini
@@ -1,10 +1,3 @@
 [access-from-coop-page-to-opener_coop-ro.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [access-from-coop-page-to-opener, same-origin + redirect]
-    expected:
-      if product == "chrome": FAIL
-
-  [access-from-coop-page-to-opener, same-origin]
-    expected:
-      if product == "chrome": FAIL
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini
index c12963c3..a07396ec2 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-openee_coop-ro_cross-origin.https.html.ini
@@ -1,4 +1,6 @@
 [access-to-coop-page-from-openee_coop-ro_cross-origin.https.html]
+  expected:
+    if product == "chrome": [ERROR, OK]
   [access-to-coop-page-from-openee, cross-origin]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini
index 12463d2..22693c3 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/access-to-coop-page-from-other_coop-ro.https.html.ini
@@ -1,3 +1,6 @@
 [access-to-coop-page-from-other_coop-ro.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [access-to-coop-page-from-other (COOP-RO)]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini
index 01f4fcd..21215fd 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-frames.https.html.ini
@@ -1,3 +1,8 @@
 [property-frames.https.html]
-  expected:
-    if product == "chrome": ERROR
+  [cross-origin > w => w.frames]
+    expected:
+      if product == "chrome": FAIL
+
+  [same-origin > w => w.frames]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini
index e016cf9..2f71178 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-location-set.https.html.ini
@@ -1,3 +1,10 @@
 [property-location-set.https.html]
   expected:
-    if product == "chrome": ERROR
+    if product == "chrome": [OK, ERROR]
+  [same-origin > w => w.location = "#"]
+    expected:
+      if product == "chrome": FAIL
+
+  [cross-origin > w => w.location = "#"]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-named-getter.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-named-getter.https.html.ini
deleted file mode 100644
index a713a5f..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-named-getter.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[property-named-getter.https.html]
-  expected:
-    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini
new file mode 100644
index 0000000..5c096b16
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini
@@ -0,0 +1,3 @@
+[property-opener-set.https.html]
+  expected:
+    if product == "chrome": [ERROR, OK]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-postmessage-1.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-postmessage-1.https.html.ini
index ab4e882..943353e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-postmessage-1.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-postmessage-1.https.html.ini
@@ -1,6 +1,4 @@
 [property-postmessage-1.https.html]
-  expected:
-    if product == "chrome": [ERROR, OK]
   [same-origin > w => w.postMessage("", "")]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini
index 7bd46c4..f989a145 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-top.https.html.ini
@@ -1,4 +1,6 @@
 [property-top.https.html]
+  expected:
+    if product == "chrome": [ERROR, OK]
   [same-origin > w => w.top]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini
index 950ed5a35..f030a18 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resource-popup.https.html.ini
@@ -1,3 +1,3 @@
 [resource-popup.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini
index 2451a4e..e3a14ce 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.ini
@@ -3,8 +3,6 @@
     if product == "chrome": ERROR
 
 [iframe-popup-to-so.https.html?5-6]
-  expected:
-    if product == "chrome": ERROR
 
 [iframe-popup-to-so.https.html?3-4]
   expected:
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini
index f8661d5..dd70f03 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.ini
@@ -15,3 +15,5 @@
     if product == "chrome": ERROR
 
 [iframe-popup-to-soap.https.html?9-last]
+  expected:
+    if product == "chrome": [ERROR, OK]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini
index 275706e..9afd7b3f 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.ini
@@ -19,6 +19,8 @@
 
 
 [iframe-popup-to-un.https.html?9-last]
+  expected:
+    if product == "chrome": [ERROR, OK]
   [COOP: restrict-properties to popup COOP: unsafe-none via an iframe, with cross origin iframe, cross origin popup with window_open]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
index 4f6dc5095..51dea989 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
@@ -9,6 +9,8 @@
 
 
 [iframe-popup.https.html?9-last]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with cross origin iframe, cross origin popup with window_open]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini
index 1fa6809a..3825ee4b5 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.ini
@@ -1,6 +1,6 @@
 [popup-un.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [SAME_ORIGIN popup with coop restrict-properties]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.ini
index f97561b..4e17baa 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.ini
@@ -1,6 +1,6 @@
 [popup-with-cross-origin.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [Cross-origin popup with empty coop]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini
index 5e23173a..a2bc292 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.ini
@@ -1,4 +1,6 @@
 [popup-with-same-origin.https.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [Same-origin popup with coop restrict-properties]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.ini
index 5802185..38b2f937 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.ini
@@ -1,6 +1,6 @@
 [popup-with-same-site.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [Same-site popup with coop restrict-properties]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/script-inserted-script.html.ini b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/script-inserted-script.html.ini
deleted file mode 100644
index e11044c..0000000
--- a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/script-inserted-script.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[script-inserted-script.html]
-  [Rendering is blocked before render-blocking resources are loaded]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini
index 0fb6a830..832554d 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-audio-constructor.html.ini
@@ -1,5 +1,3 @@
 [resource-selection-invoke-audio-constructor.html]
   [invoking resource selection with new Audio(src)]
-    expected:
-      if flag_specific == "disable-site-isolation-trials": PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini
index 90bfb40..ffcd9afb 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-insert-source.html.ini
@@ -1,5 +1,5 @@
 [resource-selection-invoke-insert-source.html]
   [invoking resource selection by inserting <source>]
     expected:
-      if flag_specific == "disable-layout-ng": PASS
+      if product == "chrome": PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini
index fb095150..e889ab7 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-pause-networkState.html.ini
@@ -1,6 +1,3 @@
 [resource-selection-invoke-pause-networkState.html]
   [NOT invoking resource selection with pause() when networkState is not NETWORK_EMPTY]
-    expected:
-      if (flag_specific == "") and (os == "win"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini
index 940dd05..33e2bbbf 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html.ini
@@ -1,5 +1,3 @@
 [resource-selection-invoke-remove-from-document-networkState.html]
   [NOT invoking resource selection with implicit pause() when networkState is not NETWORK_EMPTY]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini
index 1d86d05..c0581652 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-set-src.html.ini
@@ -1,6 +1,3 @@
 [resource-selection-invoke-set-src.html]
   [invoking load by setting src]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
-      if (flag_specific == "") and (os == "win"): PASS
-      FAIL
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini
deleted file mode 100644
index cd1b74e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-removed.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[track-cue-rendering-after-controls-removed.html]
-  expected:
-    if (flag_specific == "") and (os == "win"): FAIL
-    if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini
index 9e36063f..ce6897a 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js.ini
@@ -1,3 +1,4 @@
 [sandbox-top-navigation-child.tentative.sub.window.html]
   expected:
+    if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
     if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-data-url-to-https.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-data-url-to-https.html.ini
deleted file mode 100644
index 668679d34..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-data-url-to-https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[image-loading-lazy-data-url-to-https.html]
-  expected:
-    if (flag_specific == "") and (os == "win"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini
index 12a4ba6..2dbfcd2 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-form-state-restore.tentative.html.ini
@@ -1,4 +1,4 @@
 [selectmenu-form-state-restore.tentative.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "chrome"): ERROR
-    if (flag_specific == "") and (os == "win"): ERROR
+    if flag_specific == "disable-site-isolation-trials": OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html.ini
index 269dc031e..4ff897be 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html.ini
@@ -10,7 +10,7 @@
     expected: [PASS, NOTRUN]
 
   [New parts should be detected even when in the subtree of an inserted node]
-    expected: [PASS, TIMEOUT]
+    expected: [PASS, NOTRUN]
 
   [Part removals should be detected even when in the subtree of a removed node]
     expected: [PASS, NOTRUN]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
index b02e6bff1..f5ddbc8b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
@@ -1,7 +1,12 @@
 [activation-behavior.window.html]
   [<area> that is not connected should not be followed]
-    expected: FAIL
+    expected:
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): PASS
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      FAIL
 
   [<a> that is not connected should be followed]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): FAIL
+      if product == "chrome": PASS
+      [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
index b7889a6..ba12335 100644
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
@@ -1,3 +1,3 @@
 [promise-job-entry.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [OK, CRASH]
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js.ini b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js.ini
new file mode 100644
index 0000000..80e633e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js.ini
@@ -0,0 +1,5 @@
+[negative-settimeout.any.worker.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
+
+[negative-settimeout.any.html]
diff --git a/third_party/blink/web_tests/external/wpt/import-maps/bare-specifiers.sub.html.ini b/third_party/blink/web_tests/external/wpt/import-maps/bare-specifiers.sub.html.ini
deleted file mode 100644
index 5e759f23..0000000
--- a/third_party/blink/web_tests/external/wpt/import-maps/bare-specifiers.sub.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[bare-specifiers.sub.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): CRASH
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini b/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
index 667aadcf..66e623f8 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/server/webtransport-h3.https.sub.any.js.ini
@@ -11,9 +11,8 @@
 
 
 [webtransport-h3.https.sub.any.sharedworker.html]
+
+[webtransport-h3.https.sub.any.html]
   [WebTransport server should be running and should handle a bidirectional stream]
     expected:
       if os == "win": FAIL
-
-
-[webtransport-h3.https.sub.any.html]
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl b/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl
index 92a105bd..b435a2ac 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/compute-pressure.idl
@@ -24,8 +24,6 @@
   sequence<PressureRecord> takeRecords();
 
   [SameObject] static readonly attribute FrozenArray<PressureSource> supportedSources;
-
-  [Exposed=Window] static Promise<PermissionState> requestPermission();
 };
 
 [Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl b/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl
index 109e405..c76ef09 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl
@@ -41,19 +41,10 @@
 
 [Exposed=ServiceWorker]
 interface CanMakePaymentEvent : ExtendableEvent {
-  constructor(DOMString type, optional CanMakePaymentEventInit eventInitDict = {});
-  readonly attribute USVString topOrigin;
-  readonly attribute USVString paymentRequestOrigin;
-  readonly attribute FrozenArray<PaymentMethodData> methodData;
+  constructor(DOMString type);
   undefined respondWith(Promise<boolean> canMakePaymentResponse);
 };
 
-dictionary CanMakePaymentEventInit : ExtendableEventInit {
-  USVString topOrigin;
-  USVString paymentRequestOrigin;
-  sequence<PaymentMethodData> methodData;
-};
-
 partial interface ServiceWorkerGlobalScope {
   attribute EventHandler onpaymentrequest;
 };
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
index a93fa19..547df29 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
@@ -2,11 +2,14 @@
   [topDocument.scrollingElement.scrollTop = 200]
     expected:
       if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
-      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
-      FAIL
+      if (os == "linux") and (flag_specific == "") and (product == "chrome"): FAIL
+      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): FAIL
 
   [iframeDocument.scrollingElement.scrollTop = 250]
     expected:
-      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [PASS, FAIL]
-      if (os == "linux") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
-      if os == "win": FAIL
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+
+  [topDocument.scrollingElement.scrollTop = 100]
+    expected:
+      if (flag_specific == "") and (product == "content_shell") and (os == "linux"): FAIL
+      if (flag_specific == "") and (product == "content_shell") and (os == "win"): [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini
index bd26a29..1cd483b 100644
--- a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/animated/observe-cross-origin-tao-animated-image.tentative.html.ini
@@ -1,3 +1,3 @@
 [observe-cross-origin-tao-animated-image.tentative.html]
   expected:
-    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
+    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini
index 2e33519..7d56e93 100644
--- a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html.ini
@@ -1,5 +1,5 @@
 [first-paint-equals-lcp-text.html]
   [FCP and LCP are the same when there is a single text element in the page.]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if product == "chrome": PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-finished-before-final-response.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-finished-before-final-response.h2.window.js.ini
index 27b93e40..a768834 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-finished-before-final-response.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/preload-finished-before-final-response.h2.window.js.ini
@@ -1,2 +1,4 @@
 [preload-finished-before-final-response.h2.window.html]
-  expected: ERROR
+  expected:
+    if product == "chrome": OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/loading/early-hints/referrer-policy-unsafe-url.h2.window.js.ini b/third_party/blink/web_tests/external/wpt/loading/early-hints/referrer-policy-unsafe-url.h2.window.js.ini
index a432caa..b282f00 100644
--- a/third_party/blink/web_tests/external/wpt/loading/early-hints/referrer-policy-unsafe-url.h2.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/loading/early-hints/referrer-policy-unsafe-url.h2.window.js.ini
@@ -1,2 +1,4 @@
 [referrer-policy-unsafe-url.h2.window.html]
-  expected: ERROR
+  expected:
+    if product == "chrome": OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini b/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini
index 1a806b4..9aec8da 100644
--- a/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini
+++ b/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html.ini
@@ -1,4 +1,5 @@
 [longtask-in-sibling-iframe-crossorigin.html]
   [Performance longtask entries from cross-origin iframe are observable in its sibling.]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if flag_specific == "disable-site-isolation-trials": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini
new file mode 100644
index 0000000..422903cf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html.ini
@@ -0,0 +1,4 @@
+[legacy-mstyle-attributes.html]
+  [Legacy mstyle attributes do not apply to mo]
+    expected:
+      if product == "chrome": [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/operator-dictionary-arabic-002.html.ini b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/operator-dictionary-arabic-002.html.ini
deleted file mode 100644
index f0fa72f4..0000000
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/operator-dictionary-arabic-002.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[operator-dictionary-arabic-002.html]
-  expected:
-    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/ignored-properties-001.html.ini b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/ignored-properties-001.html.ini
index 5b2c3d5..72e2809 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/ignored-properties-001.html.ini
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/ignored-properties-001.html.ini
@@ -1,7 +1,4 @@
 [ignored-properties-001.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
   [maction layout is not affected by width: 100px !important; height: 200px !important;]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini b/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
index 6d693ca..f45744bd 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
@@ -1,4 +1,4 @@
 [mediasource-worker-play-terminate-worker.html]
   [Test worker MediaSource termination after at least 8 main thread setTimeouts, starting counting before setting srcObject]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html.ini b/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html.ini
deleted file mode 100644
index 0dd0510..0000000
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[mediasource-appendbuffer-quota-exceeded.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini b/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini
index a211a60e..395d921f 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/mediasource-avtracks.html.ini
@@ -4,6 +4,5 @@
 
   [Media tracks must be removed when the SourceBuffer is removed from the MediaSource]
     expected:
-      if (flag_specific == "") and (product == "chrome"): PASS
-      if flag_specific == "disable-layout-ng": PASS
-      FAIL
+      if (flag_specific == "") and (os == "win"): FAIL
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini b/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini
index d73c3f2..e23991a4 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini
+++ b/third_party/blink/web_tests/external/wpt/media-source/mediasource-duration.html.ini
@@ -1,8 +1,5 @@
 [mediasource-duration.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): ERROR
-    if flag_specific == "disable-site-isolation-trials": ERROR
-  [Test endOfStream completes previous seek to truncated duration]
-    expected:
-      if (flag_specific == "") and (product == "chrome"): [PASS, FAIL]
-      if flag_specific == "disable-layout-ng": FAIL
+    if (flag_specific == "") and (os == "linux") and (product == "chrome"): OK
+    if (flag_specific == "") and (os == "win"): OK
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini
index 61cb165..81269fb 100644
--- a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini
+++ b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html.ini
@@ -1,4 +1,4 @@
 [after-transition-intercept-handler-modifies.html]
   [scroll: state should be saved before intercept handlers run]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini b/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini
new file mode 100644
index 0000000..d0a1c61
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/navigation-timing/test-performance-attributes.sub.html.ini
@@ -0,0 +1,4 @@
+[test-performance-attributes.sub.html]
+  [Check that performance.timing has reasonable values for secureConnectionStart and other attributes]
+    expected:
+      if product == "chrome": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/app-can-make-payment.js b/third_party/blink/web_tests/external/wpt/payment-handler/app-can-make-payment.js
index f55cf21..cd27bce 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/app-can-make-payment.js
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/app-can-make-payment.js
@@ -1,89 +1,34 @@
+let responseType = 'canMakePayment-true';
+self.addEventListener('message', event => {
+  responseType = event.data.responseType;
+});
+
 self.addEventListener('canmakepayment', event => {
-  if (event.methodData.length !== 1) {
-    const msg = 'Expected exactly one method data.';
+  if (event.methodData) {
+    const msg = 'Expected no method data.';
     event.respondWith(Promise.reject(new Error(msg)));
     return;
   }
 
-  const [method] = event.methodData;
-  if (!method || method.supportedMethods.length !== 1) {
-    const msg = 'Expected exactly one supported method name';
+  if (event.modifiers) {
+    const msg = 'Expected no modifiers';
     event.respondWith(Promise.reject(new Error(msg)));
     return;
   }
 
-  if (method.data.defaultParameter !== 'defaultValue') {
-    const msg = `Unexpected value for "defaultParameter": ${
-      method.data.defaultParameter
-    }`;
+  if (event.topOrigin) {
+    const msg = `Unexpected topOrigin.`;
     event.respondWith(Promise.reject(new Error(msg)));
     return;
   }
 
-  if ('defaultUnsupportedParameter' in method.data) {
-    const msg = 'Unexpected "defaultUnsupportedParameter"';
+  if (event.paymentRequestOrigin) {
+    const msg = `Unexpected iframe origin.`;
     event.respondWith(Promise.reject(new Error(msg)));
     return;
   }
 
-  if (event.modifiers.length !== 1) {
-    const msg = 'Expected exactly one modifier';
-    event.respondWith(Promise.reject(new Error(msg)));
-    return;
-  }
-
-  const [modifier] = event.modifiers;
-
-  if (!modifier || modifier.supportedMethods.length !== 1) {
-    const msg = 'Expected exactly one supported method name in modifier';
-    event.respondWith(Promise.reject(new Error(msg)));
-    return;
-  }
-
-  for (const member of [
-    'additionalDisplayItems',
-    'modifiedUnsupportedParameter',
-    'total',
-  ]) {
-    if (member in modifier) {
-      const msg = `Unexpected member "${member}" in modifier`;
-      event.respondWith(Promise.reject(new Error(msg)));
-      return;
-    }
-  }
-
-  const [methodName] = method.supportedMethods;
-  const [modifierMethodName] = modifier.supportedMethods;
-  if (modifierMethodName !== methodName) {
-    const msg = `Unexpected modifier method name: "${modifierMethodName}". Expected "${methodName}".`;
-    event.respondWith(Promise.reject(new Error(msg)));
-    return;
-  }
-
-  if (modifier.data.modifiedParameter !== 'modifiedValue') {
-    const msg = `Unexpected value for 'modifiedParameter': ${
-      modifier.data.modifiedParameter
-    }`;
-    event.respondWith(Promise.reject(new Error(msg)));
-    return;
-  }
-
-  const methodAsURL = new URL(methodName);
-  if (event.topOrigin !== methodAsURL.origin) {
-    const msg = `Unexpected event.topOrigin: "${
-      event.topOrigin
-    }". Expected "${methodAsURL.origin}".`;
-    event.respondWith(Promise.reject(new Error(msg)));
-    return;
-  }
-
-  if (event.paymentRequestOrigin !== methodAsURL.origin) {
-    const msg = `Unexpected iframe origin ${event.paymentRequestOrigin}`;
-    event.respondWith(Promise.reject(new Error(msg)));
-    return;
-  }
-
-  switch (methodAsURL.pathname.substr(1)) {
+  switch (responseType) {
     case 'canMakePayment-true':
       event.respondWith(true);
       break;
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event-constructor.https.serviceworker.js b/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event-constructor.https.serviceworker.js
index 01ce642d..5b334d9c 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event-constructor.https.serviceworker.js
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event-constructor.https.serviceworker.js
@@ -32,8 +32,10 @@
     modifiers: [],
   });
   assert_false(ev.isTrusted, 'constructed in script, so not be trusted');
-  assert_equals(ev.topOrigin, 'https://foo.com');
-  assert_equals(ev.paymentRequestOrigin, 'https://bar.com');
+  assert_equals(ev.topOrigin, undefined);
+  assert_equals(ev.paymentRequestOrigin, undefined);
+  assert_equals(ev.methodData, undefined);
+  assert_equals(ev.modifiers, undefined);
 }, 'CanMakePaymentEvent can be constructed with a CanMakePaymentEventInit, even if not trusted');
 
 test(() => {
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event.https.html b/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event.https.html
index 28c001c6..941c206 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event.https.html
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/can-make-payment-event.https.html
@@ -30,7 +30,7 @@
 }
 
 function buildPaymentRequest(methodName) {
-  const unsupportedMethodName = methodName + '-unsupported';
+  const unsupportedMethodName = methodName + '/unsupported';
   return new PaymentRequest(
     [
       {
@@ -105,7 +105,7 @@
 }
 
 promise_test(async t => {
-  const methodName = window.location.origin + '/canMakePayment-true';
+  const methodName = window.location.origin;
   // Intentionally do not install the payment app.
   const request = buildPaymentRequest(methodName);
   assert_not_equals(request, undefined);
@@ -129,8 +129,10 @@
 }, 'If a payment handler is not installed, then the payment method is not supported.');
 
 promise_test(async t => {
-  const methodName = window.location.origin + '/canMakePayment-false';
+  const methodName = window.location.origin;
   await registerApp(methodName);
+  navigator.serviceWorker.controller.postMessage(
+      {responseType: 'canMakePayment-false'});
   const request = buildPaymentRequest(methodName);
   assert_not_equals(request, undefined);
   let paymentRequestCanMakePaymentResult;
@@ -153,8 +155,10 @@
 }, 'If CanMakePaymentEvent.respondWith(false) is called, then the payment method is not supported.');
 
 promise_test(async t => {
-  const methodName = window.location.origin + '/canMakePayment-promise-false';
+  const methodName = window.location.origin;
   await registerApp(methodName);
+  navigator.serviceWorker.controller.postMessage(
+      {responseType: 'canMakePayment-promise-false'});
   const request = buildPaymentRequest(methodName);
   assert_not_equals(request, undefined);
   let paymentRequestCanMakePaymentResult;
@@ -177,8 +181,10 @@
 }, 'If CanMakePaymentEvent.respondWith(Promise.resolve(false)) is called, then the payment method is not supported.');
 
 promise_test(async t => {
-  const methodName = window.location.origin + '/canMakePayment-true';
+  const methodName = window.location.origin;
   await registerApp(methodName);
+  navigator.serviceWorker.controller.postMessage(
+      {responseType: 'canMakePayment-true'});
   const request = buildPaymentRequest(methodName);
   assert_not_equals(request, undefined);
   let paymentRequestCanMakePaymentResult;
@@ -203,8 +209,10 @@
 }, 'If CanMakePaymentEvent.respondWith(true) is called, then the payment method is supported.');
 
 promise_test(async t => {
-  const methodName = window.location.origin + '/canMakePayment-promise-true';
+  const methodName = window.location.origin;
   await registerApp(methodName);
+  navigator.serviceWorker.controller.postMessage(
+      {responseType: 'canMakePayment-promise-true'});
   const request = buildPaymentRequest(methodName);
   assert_not_equals(request, undefined);
   let paymentRequestCanMakePaymentResult;
@@ -229,8 +237,10 @@
 }, 'If CanMakePaymentEvent.respondWith(Promise.resolve(true)) is called, then the payment method is supported.');
 
 promise_test(async t => {
-  const methodName = window.location.origin + '/canMakePayment-custom-error';
+  const methodName = window.location.origin;
   await registerApp(methodName);
+  navigator.serviceWorker.controller.postMessage(
+      {responseType: 'canMakePayment-custom-error'});
   const request = buildPaymentRequest(methodName);
   assert_not_equals(request, undefined);
   let paymentRequestCanMakePaymentResult;
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.js.ini b/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.js.ini
index 0972e39..e65a5db 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.js.ini
@@ -27,18 +27,12 @@
 
 
 [idlharness.https.any.serviceworker.html]
-  [CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "methodData" with the proper type]
-    expected: FAIL
-
   [CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "respondWith(Promise<boolean>)" with the proper type]
     expected: FAIL
 
   [PaymentManager interface: attribute instruments]
     expected: FAIL
 
-  [CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "paymentRequestOrigin" with the proper type]
-    expected: FAIL
-
   [PaymentManager interface: attribute userHint]
     expected: FAIL
 
@@ -78,9 +72,6 @@
   [CanMakePaymentEvent interface: calling respondWith(Promise<boolean>) on new CanMakePaymentEvent("type") with too few arguments must throw TypeError]
     expected: FAIL
 
-  [CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "topOrigin" with the proper type]
-    expected: FAIL
-
   [PaymentRequestEvent interface: new PaymentRequestEvent("type") must inherit property "openWindow(USVString)" with the proper type]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.serviceworker-expected.txt
index 0174ac7..4e6173b 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.serviceworker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/idlharness.https.any.serviceworker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 97 tests; 65 PASS, 32 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 91 tests; 62 PASS, 29 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS Partial interface ServiceWorkerRegistration: original interface defined
@@ -51,15 +51,9 @@
 PASS CanMakePaymentEvent interface: existence and properties of interface prototype object
 PASS CanMakePaymentEvent interface: existence and properties of interface prototype object's "constructor" property
 PASS CanMakePaymentEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS CanMakePaymentEvent interface: attribute topOrigin
-PASS CanMakePaymentEvent interface: attribute paymentRequestOrigin
-PASS CanMakePaymentEvent interface: attribute methodData
 PASS CanMakePaymentEvent interface: operation respondWith(Promise<boolean>)
 FAIL CanMakePaymentEvent must be primary interface of new CanMakePaymentEvent("type") assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
 FAIL Stringification of new CanMakePaymentEvent("type") assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
-FAIL CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "topOrigin" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
-FAIL CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "paymentRequestOrigin" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
-FAIL CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "methodData" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
 FAIL CanMakePaymentEvent interface: new CanMakePaymentEvent("type") must inherit property "respondWith(Promise<boolean>)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
 FAIL CanMakePaymentEvent interface: calling respondWith(Promise<boolean>) on new CanMakePaymentEvent("type") with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'CanMakePaymentEvent': 2 arguments required, but only 1 present."
 PASS PaymentRequestEvent interface: existence and properties of interface object
diff --git a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini
index 34e4879..0afa3eb6 100644
--- a/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/pending-beacon/pending_beacon-sendondiscard.tentative.https.window.js.ini
@@ -3,8 +3,8 @@
     if product == "chrome": ERROR
   [A discarded document does not send an already sent beacon.]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
+      if os == "win": FAIL
 
   [A discarded document sends all its beacons of which backgroundTimeouts are\n    not default.]
     expected:
-      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
+      if (os == "linux") and (flag_specific == ""): [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini b/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini
index b84c0c6..af1aaca9 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.js.ini
@@ -2,4 +2,4 @@
   [RemoteContextHelper navigation using BFCache]
     expected:
       if (flag_specific == "") and (os == "linux") and (product == "chrome"): FAIL
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [FAIL, PASS]
+      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.js.ini b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.js.ini
deleted file mode 100644
index 6360a03d..0000000
--- a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[unload-allowed-by-default.tentative.window.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini
index 2e79080..ff4e0da 100644
--- a/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/reporting/reporting-isolated-across-navigations.https.sub.html.ini
@@ -1,5 +1,5 @@
 [reporting-isolated-across-navigations.https.sub.html]
   [Reports should be sent to the correct endpoints]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): [PASS, FAIL]
+      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): FAIL
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini
index 04b0e95..f827d62 100644
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF-dynamic.html.ini
@@ -1,3 +1,3 @@
 [deadline-max-rAF-dynamic.html]
   expected:
-    if (os == "linux") and (flag_specific == "disable-layout-ng"): [OK, TIMEOUT]
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini
deleted file mode 100644
index c2a9bbc..0000000
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-rAF.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[deadline-max-rAF.html]
-  expected:
-    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini
index e86c521..28ba1bf 100644
--- a/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini
+++ b/third_party/blink/web_tests/external/wpt/requestidlecallback/deadline-max-timeout-dynamic.html.ini
@@ -1,5 +1,3 @@
 [deadline-max-timeout-dynamic.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
   [Check that the deadline is changed if there is a new timeout from within requestIdleCallback.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
index 17aa7db..affb928e4 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
@@ -37,14 +37,13 @@
 
   [content-type 13 : text/plain,*/*;charset=gbk]
     expected:
-      if (flag_specific == "") and (os == "win"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
+      if os == "win": PASS
       FAIL
 
   [content-type 14 : text/html,*/*;charset=gbk]
     expected:
+      if (flag_specific == "") and (os == "linux") and (product == "chrome"): PASS
       if (flag_specific == "") and (os == "win"): PASS
-      if flag_specific == "disable-site-isolation-trials": PASS
       FAIL
 
   [content-type 15 : text/html;x=",text/plain]
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini
index be64ae2..ff8840b 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html.ini
@@ -1,5 +1,5 @@
 [no-entries-for-cross-origin-css-fetched-memory-cache.sub.html]
   [Make sure that resources fetched by cross origin CSS are not in the timeline.]
     expected:
-      if (os == "linux") and (flag_specific == "") and (product == "content_shell"): PASS
+      if flag_specific == "disable-layout-ng": PASS
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini
index 1b6605f1..5496d8a0 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/response-status-code.html.ini
@@ -1,8 +1,4 @@
 [response-status-code.html]
-  [This test validates the response status of resources. 273]
-    expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
-
   [This test validates the response status of resources. 271]
     expected: [PASS, NOTRUN]
 
@@ -563,8 +559,12 @@
 
   [This test validates the response status of resources. 277]
     expected:
-      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
+      if product == "chrome": [PASS, FAIL]
 
   [This test validates the response status of resources. 278]
     expected:
-      if flag_specific == "disable-site-isolation-trials": [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): [FAIL, PASS]
+
+  [This test validates the response status of resources. 274]
+    expected:
+      if flag_specific == "disable-layout-ng": [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini b/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini
index a4f4599..6af02218 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/cache-add.https.any.js.ini
@@ -7,6 +7,10 @@
   [Cache.addAll called with the same Request object specified twice]
     expected: FAIL
 
+  [Cache.addAll should succeed when entries differ by vary header]
+    expected:
+      if product == "chrome": [PASS, FAIL]
+
 
 [cache-add.https.any.serviceworker.html]
   [Cache.addAll called with the same Request object specified twice]
@@ -14,7 +18,7 @@
 
   [Cache.addAll should succeed when entries differ by vary header]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if product == "chrome": FAIL
 
 
 [cache-add.https.any.html]
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini
index b2a61d9c..c59a16f 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html.ini
@@ -1,6 +1,6 @@
 [about-blank-replacement.https.html]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
   [Initial about:blank is controlled, exposed to clients.matchAll(), and matches final Client.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini
index a8461b4..3c0cf64 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/client-navigate.https.html.ini
@@ -1,4 +1,4 @@
 [client-navigate.https.html]
   [Frame location should not be accessible after cross-origin navigation]
     expected:
-      if flag_specific == "disable-layout-ng": [PASS, FAIL]
+      if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini
index 48187be..5f5d44e 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/unregister-immediately-during-extendable-events.https.html.ini
@@ -1,6 +1,6 @@
 [unregister-immediately-during-extendable-events.https.html]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): OK
+    if flag_specific == "disable-site-isolation-trials": OK
     TIMEOUT
   [Clear-Site-Data must fail pending subresource fetch events.]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/select-url-permissions-policy-none.tentative.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/shared-storage/select-url-permissions-policy-none.tentative.https.sub.html.ini
new file mode 100644
index 0000000..990b6369
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shared-storage/select-url-permissions-policy-none.tentative.https.sub.html.ini
@@ -0,0 +1,9 @@
+[select-url-permissions-policy-none.tentative.https.sub.html]
+  [permissions policy header shared-storage-select-url=() disallows sharedStorage.selectURL() in the current page.]
+    expected: FAIL
+
+  [permissions policy header shared-storage-select-url=() disallows sharedStorage.selectURL() in same-origin iframes.]
+    expected: FAIL
+
+  [permissions policy header shared-storage-select-url=() disallows sharedStorage.selectURL() in cross-origin iframes.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/select-url-permissions-policy-self.tentative.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/shared-storage/select-url-permissions-policy-self.tentative.https.sub.html.ini
new file mode 100644
index 0000000..5a7c2d8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shared-storage/select-url-permissions-policy-self.tentative.https.sub.html.ini
@@ -0,0 +1,3 @@
+[select-url-permissions-policy-self.tentative.https.sub.html]
+  [permissions policy header shared-storage-select-url=(self) disallows sharedStorage.selectURL() in cross-origin iframes.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini
index 03af32c..23f1c74 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/csp-script-src-self.html.ini
@@ -1,4 +1,4 @@
 [csp-script-src-self.html]
   expected:
-    if (flag_specific == "") and (os == "win"): ERROR
-    if flag_specific == "disable-layout-ng": ERROR
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, ERROR]
+    if os == "win": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini
index 6d40224..a9fa26cb 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/navigator-plugins.tentative.html.ini
@@ -1,5 +1,6 @@
 [navigator-plugins.tentative.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": TIMEOUT
   [prerendering page should be able to access the navigator.plugins]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-no-referrer.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-no-referrer.html.ini
index 0a70c55e..76132cd0 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-no-referrer.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/referrer-policy-no-referrer.html.ini
@@ -1,7 +1,6 @@
 [referrer-policy-no-referrer.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if product == "chrome": TIMEOUT
   [no referrer]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini
index ba0befa..dc41559 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-non-successful.html.ini
@@ -1,14 +1,12 @@
 [response-code-non-successful.html?code=204]
 
 [response-code-non-successful.html?code=402]
-  expected:
-    if product == "chrome": [OK, ERROR]
 
 [response-code-non-successful.html?code=500]
 
 [response-code-non-successful.html?code=404]
   expected:
-    if product == "chrome": [OK, ERROR]
+    if product == "chrome": ERROR
 
 [response-code-non-successful.html?code=503]
 
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini
index b60b1de..a98d0a40 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/response-code-successful.html.ini
@@ -6,11 +6,7 @@
 
 [response-code-successful.html?code=200]
   expected:
-    if product == "chrome": [OK, ERROR]
-  [Responses with code 200 should be activated]
-    expected:
-      if product == "chrome": FAIL
-
+    if product == "chrome": ERROR
 
 [response-code-successful.html?code=201]
   [Responses with code 201 should be activated]
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-bluetooth.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-bluetooth.tentative.https.html.ini
index 430d214a..ebc3e37 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-bluetooth.tentative.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-bluetooth.tentative.https.html.ini
@@ -1,5 +1,6 @@
 [restriction-bluetooth.tentative.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [the access to the Bluetooth API should be deferred until the\n   prerendered page is activated]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
index 8bd9788..a190613 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-message-boxes.html.ini
@@ -1,7 +1,7 @@
 [restriction-message-boxes.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    if os == "win": ERROR
   [alert() does not display the modal and returns immediately]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-postmessage.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-postmessage.https.html.ini
index 7b078835..d9875a3 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-postmessage.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-service-worker-postmessage.https.html.ini
@@ -1,7 +1,6 @@
 [restriction-service-worker-postmessage.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": TIMEOUT
+    if product == "chrome": TIMEOUT
   [ServiceWorker#postMessage() from a prerendered page should be deferred until page activation.]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini
index 6984300..c8b329d 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-speech-synthesis.html.ini
@@ -1,7 +1,7 @@
 [restriction-speech-synthesis.html]
   expected:
-    if (product == "content_shell") and (os == "win"): [OK, ERROR]
-    if product == "chrome": TIMEOUT
+    if (os == "linux") and (product == "chrome"): TIMEOUT
+    if os == "win": ERROR
   [speechSynthesis.speak(utterance) should be deferred until the prerendered page is activated]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini
index d55497ae..eb9f2ef 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-locks.https.html.ini
@@ -1,5 +1,6 @@
 [restriction-web-locks.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, ERROR]
     if product == "chrome": TIMEOUT
   [navigator.locks.request should be deferred until the prerendered page is activated]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini
index f0101a56..9e705b8 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-share.https.html.ini
@@ -1,5 +1,6 @@
 [restriction-web-share.https.html]
   expected:
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if product == "chrome": TIMEOUT
   [prerendering pages should not be able to invoke the Web Share API]
     expected:
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-usb.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-usb.https.html.ini
index 2fb4aa2..7cbd1eb 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-usb.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-web-usb.https.html.ini
@@ -1,7 +1,6 @@
 [restriction-web-usb.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": ERROR
+    if product == "chrome": TIMEOUT
   [the access to the Web USB API should be deferred until the prerendered\n    page is activated]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-move.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-move.html.ini
index 241db3c..87802b2 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-move.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-window-move.html.ini
@@ -1,7 +1,6 @@
 [restriction-window-move.html]
   expected:
-    if (os == "linux") and (product == "chrome"): TIMEOUT
-    if os == "win": ERROR
+    if product == "chrome": TIMEOUT
   [a prerendering page cannot move its window by executing moveTo.]
     expected:
       if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini
index cdaf1ae..1ea18b66 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/windowclient-navigate.https.html.ini
@@ -3,5 +3,4 @@
     if product == "chrome": TIMEOUT
   [WindowClient.navigate() for a prerendered main page should throw aTypeError]
     expected:
-      if (os == "linux") and (product == "chrome"): TIMEOUT
-      if os == "win": FAIL
+      if product == "chrome": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini b/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini
index a90e16b..0e56240 100644
--- a/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini
+++ b/third_party/blink/web_tests/external/wpt/url/a-element-xhtml.xhtml.ini
@@ -963,8 +963,8 @@
 
 [a-element-xhtml.xhtml?include=file]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): CRASH
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
   [Parsing: <file://example%/> against <about:blank>]
     expected: FAIL
 
@@ -1212,6 +1212,8 @@
 
 
 [a-element-xhtml.xhtml?exclude=(file|javascript|mailto)]
+  expected:
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [Parsing: <non-special://test:@test/x> against <about:blank>]
     expected: FAIL
 
@@ -2063,15 +2065,14 @@
 
 [a-element-xhtml.xhtml?include=mailto]
   expected:
-    if (os == "linux") and (product == "chrome"): OK
     if os == "win": TIMEOUT
-    [OK, CRASH]
   [Parsing: <mailto:/../> against <about:blank>]
     expected: FAIL
 
 
 [a-element-xhtml.xhtml?include=javascript]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
+    if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, CRASH]
   [Parsing: <javascript:/../> against <about:blank>]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/url/a-element.html.ini b/third_party/blink/web_tests/external/wpt/url/a-element.html.ini
index 85ce554..42b42a2f 100644
--- a/third_party/blink/web_tests/external/wpt/url/a-element.html.ini
+++ b/third_party/blink/web_tests/external/wpt/url/a-element.html.ini
@@ -1073,7 +1073,8 @@
 
 [a-element.html?include=file]
   expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
+    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if flag_specific == "disable-layout-ng": [OK, CRASH]
   [Parsing: <file://example%/> against <about:blank>]
     expected: FAIL
 
@@ -1322,7 +1323,8 @@
 
 [a-element.html?include=mailto]
   expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): CRASH
+    if flag_specific == "highdpi": [OK, CRASH]
   [Parsing: <mailto:/../> against <about:blank>]
     expected: FAIL
 
@@ -2178,7 +2180,5 @@
 
 
 [a-element.html?include=javascript]
-  expected:
-    if os == "win": TIMEOUT
   [Parsing: <javascript:/../> against <about:blank>]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/url/failure.html.ini b/third_party/blink/web_tests/external/wpt/url/failure.html.ini
index 4364c892..97ce987 100644
--- a/third_party/blink/web_tests/external/wpt/url/failure.html.ini
+++ b/third_party/blink/web_tests/external/wpt/url/failure.html.ini
@@ -1,7 +1,7 @@
 [failure.html]
   expected:
-    if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [OK, CRASH]
-    if product == "chrome": TIMEOUT
+    if (flag_specific == "") and (product == "chrome"): TIMEOUT
+    if flag_specific == "disable-layout-ng": CRASH
   [Location's href: file://example:1/ should throw]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini b/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini
index 27b57a31..1fb49415 100644
--- a/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/idlharness-shadowrealm.window.js.ini
@@ -1,2 +1,4 @@
 [idlharness-shadowrealm.window.html]
-  expected: ERROR
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [ERROR, CRASH]
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/url/percent-encoding.window.js.ini b/third_party/blink/web_tests/external/wpt/url/percent-encoding.window.js.ini
deleted file mode 100644
index 36d5702..0000000
--- a/third_party/blink/web_tests/external/wpt/url/percent-encoding.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[percent-encoding.window.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini b/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini
index 5cfe13bf..f1a9b16 100644
--- a/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/toascii.window.js.ini
@@ -1,4 +1,6 @@
 [toascii.window.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [xn--a (using URL)]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini b/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini
index a11a7016..71ef2b0 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters-a-area.window.js.ini
@@ -585,6 +585,8 @@
 
 
 [url-setters-a-area.window.html?include=file]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, CRASH]
   [<a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host]
     expected: FAIL
 
@@ -1161,9 +1163,6 @@
 
 
 [url-setters-a-area.window.html?include=javascript]
-  expected:
-    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
-    if (os == "linux") and (flag_specific == "disable-layout-ng"): [OK, CRASH]
   [<a>: Setting <javascript://x/>.username = 'wario']
     expected: FAIL
 
@@ -1185,7 +1184,8 @@
 
 [url-setters-a-area.window.html?include=mailto]
   expected:
-    if (flag_specific == "") and (os == "win"): [OK, TIMEOUT]
+    if (os == "linux") and (flag_specific == "") and (product == "content_shell"): [OK, CRASH]
+    if os == "win": TIMEOUT
   [<a>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini b/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini
index 5c23a98..ad2f860 100644
--- a/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/url-setters-stripping.any.js.ini
@@ -1,6 +1,4 @@
 [url-setters-stripping.any.html]
-  expected:
-    if os == "win": [OK, TIMEOUT]
   [Setting pathname with leading U+0000 (https:)]
     expected: FAIL
 
@@ -318,6 +316,8 @@
 
 
 [url-setters-stripping.any.worker.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
   [Setting pathname with leading U+0000 (https:)]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini
index e3259c3..6439b79b 100644
--- a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-stringifier.any.js.ini
@@ -1,5 +1,5 @@
 [urlsearchparams-stringifier.any.html]
-
-[urlsearchparams-stringifier.any.worker.html]
   expected:
     if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
+
+[urlsearchparams-stringifier.any.worker.html]
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
index 3f679f0..1311a6a6 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
@@ -1,4 +1,5 @@
 [finished.html]
   [Test finished promise changes for animation duration changes]
     expected:
-      if (product == "content_shell") and (flag_specific == "disable-layout-ng"): [PASS, FAIL]
+      if (flag_specific == "") and (product == "chrome"): [FAIL, PASS]
+      if flag_specific == "disable-layout-ng": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini
index 8c474c4..08dcd48 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini
+++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/document-timelines.html.ini
@@ -1,4 +1,4 @@
 [document-timelines.html]
   [Document timelines report current time relative to navigationStart]
     expected:
-      if product == "chrome": [PASS, FAIL]
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini
index 60172dd..fda793b 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini
+++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html.ini
@@ -1,5 +1,6 @@
 [sibling-iframe-timeline.html]
   [animation tied to another frame's timeline runs properly]
     expected:
-      if (flag_specific == "") and (os == "win"): FAIL
-      if flag_specific == "disable-layout-ng": [FAIL, PASS]
+      if (flag_specific == "") and (product == "chrome"): PASS
+      if flag_specific == "disable-site-isolation-trials": PASS
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/bfcache/sharedworker-multiple.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/web-locks/bfcache/sharedworker-multiple.tentative.https.html.ini
new file mode 100644
index 0000000..d8bf264
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-locks/bfcache/sharedworker-multiple.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[sharedworker-multiple.tentative.https.html]
+  expected:
+    if os == "win": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
deleted file mode 100644
index 236f81a..0000000
--- a/third_party/blink/web_tests/external/wpt/web-locks/query-ordering.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[query-ordering.tentative.https.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
index b2da746b..9673c06 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
@@ -1,4 +1,4 @@
 [test-analyser-output.html]
   [AnalyserNode output]
     expected:
-      if (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if (flag_specific == "") and (os == "win"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan.html.ini
index fa12c20..9c0d59a 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan.html.ini
@@ -1,3 +1,3 @@
 [convolver-response-4-chan.html]
   expected:
-    if flag_specific == "disable-layout-ng": [OK, CRASH]
+    if flag_specific == "disable-layout-ng": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
index efe3d878..93fe647 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
@@ -1,5 +1,4 @@
 [mediaElementAudioSourceToScriptProcessorTest.html]
   [All data processed correctly]
     expected:
-      if (product == "content_shell") and (flag_specific == "") and (os == "linux"): FAIL
-      if product == "chrome": [PASS, FAIL]
+      if (product == "content_shell") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/broadcastchannel/origin.window.js.ini b/third_party/blink/web_tests/external/wpt/webmessaging/broadcastchannel/origin.window.js.ini
deleted file mode 100644
index df1f5ad..0000000
--- a/third_party/blink/web_tests/external/wpt/webmessaging/broadcastchannel/origin.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[origin.window.html]
-  expected:
-    if flag_specific == "disable-layout-ng": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js.ini b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js.ini
index 1f6ede4..38d8bc33 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/webnn/idlharness.https.any.js.ini
@@ -1,4 +1,6 @@
 [idlharness.https.any.html]
+  expected:
+    if product == "chrome": [OK, ERROR]
   [idl_test setup]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.js.ini b/third_party/blink/web_tests/external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.js.ini
index 8448554..7c37212 100644
--- a/third_party/blink/web_tests/external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.js.ini
@@ -9,6 +9,8 @@
 
 
 [Create-protocols-repeated-case-insensitive.any.worker.html?wpt_flags=h2]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, CRASH]
   [Create WebSocket - Pass a valid URL and an array of protocol strings with repeated values but different case - SYNTAX_ERR is thrown]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html.ini b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html.ini
new file mode 100644
index 0000000..6a131e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html.ini
@@ -0,0 +1,3 @@
+[audio_has_no_subtitles.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
index c348a52f..1ce4928 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
@@ -1,7 +1,6 @@
 [events_referenceSpace_reset_inline.https.html]
   expected:
-    if (os == "linux") and (product == "chrome"): [TIMEOUT, OK]
-    if os == "win": OK
+    if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     TIMEOUT
   [XRSession resetpose from a device properly fires off the right events for non-immersive sessions - webgl]
     expected:
@@ -9,4 +8,4 @@
 
   [XRSession resetpose from a device properly fires off the right events for non-immersive sessions - webgl2]
     expected:
-      if os == "linux": [TIMEOUT, PASS]
+      if os == "linux": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/xrRay_matrix.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/xrRay_matrix.https.html.ini
deleted file mode 100644
index b22a17a..0000000
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/xrRay_matrix.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[xrRay_matrix.https.html]
-  expected:
-    if flag_specific == "highdpi": CRASH
diff --git a/third_party/blink/web_tests/external/wpt/workers/constructors/SharedWorker/dummy-name.html.ini b/third_party/blink/web_tests/external/wpt/workers/constructors/SharedWorker/dummy-name.html.ini
new file mode 100644
index 0000000..bacc918
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/workers/constructors/SharedWorker/dummy-name.html.ini
@@ -0,0 +1,3 @@
+[dummy-name.html]
+  expected:
+    if flag_specific == "disable-site-isolation-trials": [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/workers/data-url-shared.html.ini b/third_party/blink/web_tests/external/wpt/workers/data-url-shared.html.ini
index 5f7aaa4..298751c 100644
--- a/third_party/blink/web_tests/external/wpt/workers/data-url-shared.html.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/data-url-shared.html.ini
@@ -1,2 +1,3 @@
 [data-url-shared.html]
-  expected: [OK, ERROR]
+  expected:
+    if product == "chrome": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/workers/interfaces/SharedWorkerGlobalScope/name/setting.html.ini b/third_party/blink/web_tests/external/wpt/workers/interfaces/SharedWorkerGlobalScope/name/setting.html.ini
deleted file mode 100644
index 45a75a5..0000000
--- a/third_party/blink/web_tests/external/wpt/workers/interfaces/SharedWorkerGlobalScope/name/setting.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[setting.html]
-  expected:
-    if flag_specific == "disable-site-isolation-trials": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini b/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini
index fd33d33..3a0f10f 100644
--- a/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/interfaces/WorkerGlobalScope/location/redirect.html.ini
@@ -1,3 +1,3 @@
 [redirect.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if os == "win": TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini b/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini
index f8185f10..1457ee30 100644
--- a/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini
+++ b/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-import-meta.html.ini
@@ -1,5 +1,3 @@
 [dedicated-worker-import-meta.html]
-  expected:
-    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): TIMEOUT
   [Test import.meta.url on the imported module script with a fragment.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/workers/semantics/run-a-worker/003.html.ini b/third_party/blink/web_tests/external/wpt/workers/semantics/run-a-worker/003.html.ini
new file mode 100644
index 0000000..df562551
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/workers/semantics/run-a-worker/003.html.ini
@@ -0,0 +1,3 @@
+[003.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png
index 48b90e5..a7fa9c2 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/canmakepayment-identity-issue-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/canmakepayment-identity-issue-expected.txt
deleted file mode 100644
index 789dcec..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/canmakepayment-identity-issue-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-Tests that deprecation issues are reported for "canmakepayment" identity fields
-Inspector issue: {
-    issue : {
-        code : DeprecationIssue
-        details : {
-            deprecationIssueDetails : {
-                sourceCodeLocation : {
-                    columnNumber : 35
-                    lineNumber : 9
-                    scriptId : <string>
-                    url : http://127.0.0.1:8000/inspector-protocol/resources/canmakepayment-identity.js
-                }
-                type : IdentityInCanMakePaymentEvent
-            }
-        }
-    }
-}
-
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/canmakepayment-identity-issue.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/canmakepayment-identity-issue.js
deleted file mode 100644
index 9af43c1c..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/canmakepayment-identity-issue.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(async function (testRunner) {
-  const {session, dp} = await testRunner.startBlank(
-    'Tests that deprecation issues are reported for ' +
-    '"canmakepayment" identity fields');
-
-  await dp.Audits.enable();
-  await dp.Target.setAutoAttach(
-    {autoAttach: true, waitForDebuggerOnStart: true, flatten: true});
-
-  const dir = '/inspector-protocol/resources';
-  await session.navigate(`${dir}/canmakepayment-identity.html`);
-
-  const attachedPromise = dp.Target.onceAttachedToTarget();
-  session.evaluate(
-      `navigator.serviceWorker.register("${dir}/canmakepayment-identity.js");`);
-  const attachedToTarget = await attachedPromise;
-
-  const swdp = session.createChild(attachedToTarget.params.sessionId).protocol;
-
-  const issueAddedPromise = swdp.Audits.onceIssueAdded();
-
-  await Promise.all([
-    swdp.Audits.enable(),
-    swdp.Runtime.runIfWaitingForDebugger(),
-  ]);
-
-  const issueAddedResult = await issueAddedPromise;
-  testRunner.log(issueAddedResult.params, 'Inspector issue: ');
-  testRunner.completeTest();
-})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/canmakepayment-identity.html b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/canmakepayment-identity.html
deleted file mode 100644
index 080a2c07..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/canmakepayment-identity.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!doctype html>
-<html>
-<head>
-<title>Webpage for canmakepayment-identity.js service worker</title>
-</head>
-<body></body>
-</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/canmakepayment-identity.js b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/canmakepayment-identity.js
deleted file mode 100644
index 7a582e8..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/canmakepayment-identity.js
+++ /dev/null
@@ -1,14 +0,0 @@
-self.addEventListener('install', (evt) => {
-  console.log(evt); // Should pause here.
-  const canMakePaymentEvent = new CanMakePaymentEvent('canmakepayment', {
-      topOrigin: 'https://test1.example',
-      paymentRequestOrigin: 'https://test2.example',
-      methodData: [],
-      modifiers: [],
-    });
-  // Access the deprecated identity fields:
-  console.log(canMakePaymentEvent.topOrigin);
-  console.log(canMakePaymentEvent.paymentRequestOrigin);
-  console.log(canMakePaymentEvent.methodData);
-  console.log(canMakePaymentEvent.modifiers);
-});
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 b314e491..5b8565c 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
@@ -122,10 +122,6 @@
     method open
 interface CanMakePaymentEvent : ExtendableEvent
     attribute @@toStringTag
-    getter methodData
-    getter modifiers
-    getter paymentRequestOrigin
-    getter topOrigin
     method constructor
     method respondWith
 interface CanvasFilter
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor-expected.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor-expected.html
new file mode 100644
index 0000000..2546325
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor-expected.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<style>
+  body {
+    margin: 0;
+    padding: 0;
+    font-size: 17px;
+    line-height: 20px;
+  }
+  a {
+    position: relative;
+    outline: red auto thin;
+    background: yellow;
+    width: 80px;
+    height: 80px;
+  }
+  div {
+    position: relative;
+    width: 80px;
+    height: 80px;
+  }
+</style>
+
+<a href="#" >Click
+  <div style="margin-left:40px; margin-top:20px; background-color: blue;"></div>
+  <div style="margin-left:80px; margin-top:-40px; background-color: green;"></div>
+</a>
+
+<a href="#" style="display:block; top:40px;">Click
+  <div style="margin-left:40px; margin-top:20px; background-color:blue;"></div>
+  <div style="margin-left:80px; margin-top:-40px; background-color:green;"></div>
+</a>
+
+<a href="#" style="display:block; top:160px;">Click
+  <div style="margin-left:40px; margin-top:20px; background-color: blue;"></div>
+  <div style="margin-left:80px; margin-top:-40px; background-color: green;"></div>
+</a>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor.html
new file mode 100644
index 0000000..c5b03a9
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<style>
+  body {
+    margin: 0;
+    padding: 0;
+    font-size: 17px;
+    line-height: 20px;
+  }
+  a {
+    width: 80px;
+    height: 80px;
+    outline: red auto thin;
+    background: yellow;
+  }
+  a.relative {
+    position: relative;
+  }
+  a.absolute {
+    position: absolute;
+  }
+  a.block {
+    display: block;
+  }
+  div {
+    position: absolute;
+    width: 80px;
+    height: 80px;
+    top: 40px;
+    left: 40px;
+  }
+</style>
+
+<a href="#" class="relative">Click
+  <div style="background-color: blue;">
+    <div style="background-color: green;"></div>
+  </div>
+</a>
+
+<a href="#" class="relative block" style="top:180px;">Click
+  <div style="background-color: blue;">
+    <div style="background-color: green;"></div>
+  </div>
+</a>
+
+<a href="#" class="absolute" style="top:400px;">Click
+  <div style="background-color: blue;">
+    <div style="background-color: green;"></div>
+  </div>
+</a>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1-expected.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1-expected.html
new file mode 100644
index 0000000..be4ba8f
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1-expected.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<style>
+  body {
+    line-height: 20px;
+  }
+  a {
+    width: 80px;
+    height: 80px;
+    outline: red auto thin;
+    background: yellow;
+  }
+  div {
+    position:relative;
+    width: 80px;
+    height: 80px;
+    background: yellow;
+  }
+</style>
+
+<a href="#">Click</a>
+<div style="margin-top:12px; margin-left:32px; background-color: blue;"></div>
+<div style="margin-top:-40px; margin-left:72px; background-color: green;"></div>
+
+<a href="#" style="display: block; margin-top:28px;">Click</a>
+<div style="margin-top:-38px; margin-left:32px; background-color: blue;"></div>
+<div style="margin-top:-40px; margin-left:72px; background-color: green;"></div>
+
+<div style="top:30px; outline: red auto thin;">Click</div>
+<div style="margin-top:-10px; margin-left:40px; background-color: blue;"></div>
+<div style="margin-top:-40px; margin-left:80px; background-color: green;"></div>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1.html b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1.html
new file mode 100644
index 0000000..e7579d3b
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-for-anchor1.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<style>
+  body {
+    line-height: 20px;
+  }
+  a {
+    width: 80px;
+    height: 80px;
+    outline: red auto thin;
+    background: yellow;
+  }
+  div {
+    position: absolute;
+    width: 80px;
+    height: 80px;
+    background: yellow;
+  }
+  div.test_div {
+    top: 40px;
+    left: 40px;
+  }
+</style>
+
+<a href="#">Click
+  <div class="test_div" style="background-color: blue;">
+    <div class="test_div" style="background-color: green;"></div>
+  </div>
+</a>
+
+<a href="#" style="display: block; margin-top:160px">Click
+  <div class="test_div" style="background-color: blue; top:230px">
+    <div class="test_div" style="background-color: green; top:40px"></div>
+  </div>
+</a>
+
+<div style="top: 380px; outline: red auto thin;">Click
+  <div class="test_div" style="background-color: blue;">
+    <div class="test_div" style="background-color: green;"></div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
index 23751aa..cef08ea 100644
--- a/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
@@ -1,12 +1,13 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [98, 48, 304, 304]
+        [300, 50, 20, 300],
+        [150, 50, 20, 300]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html b/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html
index 178fb32..2505f31d 100644
--- a/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html
+++ b/third_party/blink/web_tests/paint/invalidation/outline/outline-auto-descendant-transform.html
@@ -2,7 +2,8 @@
 <html lang="en">
   <head>
     <style type="text/css">
-      .a {
+      a {
+        display: block;
         background: blue;
         height: 20px;
         width: 20px;
@@ -11,7 +12,7 @@
         outline-color: red;
         outline-style: auto;
       }
-      .b {
+      div {
         background: green;
         height: 100%;
         width: 100%;
@@ -24,7 +25,7 @@
     </style>
   </head>
   <body>
-    <div class="a"><div class="b"></div></div>
-    <div class="a"><div class="b"></div></div>
+    <a><div></div></a>
+    <a><div></div></a>
   </body>
 </html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.html b/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.html
deleted file mode 100644
index 4d016b1f..0000000
--- a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<div style="height: 50px">
-Result repaint rects should cover the whole focus ring.
-</div>
-<div id="target" style="width: 200px; height: 200px; background-color: yellow; outline: red auto thin">
-    <div style="position: relative; top: 100px; left: 100px; background-color: blue; width: 300px; height: 300px">
-        <div style="position: relative; top: 40px; left: 100px; background-color: green; width: 100px; height: 400px"></div>
-    </div>
-</div>
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.txt b/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.txt
deleted file mode 100644
index 7de1c59c..0000000
--- a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling background of LayoutView #document",
-      "bounds": [800, 600],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "LayoutNGBlockFlow (positioned) DIV id='target'",
-      "position": [-2, -2],
-      "bounds": [404, 544],
-      "contentsOpaqueForText": true,
-      "backfaceVisibility": "hidden",
-      "invalidations": [
-        [0, 0, 404, 544]
-      ],
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [8, 58, 0, 1]
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint.html b/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint.html
deleted file mode 100644
index d040bdc8..0000000
--- a/third_party/blink/web_tests/paint/invalidation/outline/transform-focus-ring-repaint.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/text-based-repaint.js"></script>
-<script>
-function repaintTest() {
-  document.getElementById('target').style.outline = 'red auto thin';
-}
-onload = runRepaintAndPixelTest;
-</script>
-<div style="height: 50px">
-Result repaint rects should cover the whole focus ring.
-</div>
-<div id="target" style="position: absolute; backface-visibility: hidden; width: 200px; height: 200px; background-color: yellow">
-    <div style="transform: rotate(90deg); position: absolute; top: 100px; left: 100px; background-color: blue; width: 300px; height: 300px">
-        <div style="position: absolute; top: 100px; left: 40px; background-color: green; width: 400px; height: 100px"></div>
-    </div>
-</div>
diff --git a/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
index e88f5fed..4a360150 100644
--- a/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png
index 368f7e2..369088a4 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png
index fb8ca04..3ac5cdb 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png
index db9099b..07c01fa8 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 0ab826d4..36dd775 100644
--- a/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -122,10 +122,6 @@
     method open
 interface CanMakePaymentEvent : ExtendableEvent
     attribute @@toStringTag
-    getter methodData
-    getter modifiers
-    getter paymentRequestOrigin
-    getter topOrigin
     method constructor
     method respondWith
 interface CanvasFilter
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/attributionsrc-request-format.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/request-format.sub.https.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/attribution-reporting/attributionsrc-request-format.sub.https.html
rename to third_party/blink/web_tests/wpt_internal/attribution-reporting/request-format.sub.https.html
diff --git a/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-click.html.ini b/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-click.html.ini
index e9d6baf9..10a1e2c 100644
--- a/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-click.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/forms/file/file-input-webkitdirectory-click.html.ini
@@ -1,4 +1,6 @@
 [file-input-webkitdirectory-click.html]
+  expected:
+    if (flag_specific == "") and (os == "linux") and (product == "content_shell"): [OK, TIMEOUT]
   [clicking a file input with the webkitdirectory attribute launches a file chooser]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini b/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini
index 4e85ae1..816edad 100644
--- a/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/html/interaction/focus/the-autofocus-attribute/object-fallback.html.ini
@@ -1,6 +1,6 @@
 [object-fallback.html]
   expected:
-    if os == "win": [OK, TIMEOUT]
+    if os == "win": TIMEOUT
   [An autofocus element in an OBJECT with a loaded frame should not be processed]
     expected:
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/resource-timing/initiator-type-early-hints-preload.h2.window.js.ini b/third_party/blink/web_tests/wpt_internal/resource-timing/initiator-type-early-hints-preload.h2.window.js.ini
index 68f2e53..c7fbadc5 100644
--- a/third_party/blink/web_tests/wpt_internal/resource-timing/initiator-type-early-hints-preload.h2.window.js.ini
+++ b/third_party/blink/web_tests/wpt_internal/resource-timing/initiator-type-early-hints-preload.h2.window.js.ini
@@ -1,6 +1,6 @@
 [initiator-type-early-hints-preload.h2.window.html]
   expected:
-    if product == "chrome": OK
+    if product == "chrome": [OK, ERROR]
     ERROR
   [Ensure initiatorType is set to 'early-hints']
     expected: FAIL
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index 0d26014..09319fb 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: 6edd1d11b0a6d5f502cc29394eaf8ee0c62f5930
+Version: f7f0a266fe5baf2abc96564e696e666d24b54920
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 46274d3..a5549ff 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -4060,12 +4060,13 @@
       'gn_args': ('disable_file_support=true '
                   'enable_websockets=false '
                   'include_transport_security_state_preload_list=false '
+		  'is_cronet_build=true '
                   'use_crash_key_stubs=true use_platform_icu_alternatives=true')
     },
 
     'cronet_ios': {
       'mixins': ['cronet_common'],
-      'gn_args': ('disable_brotli_filter=false is_cronet_build=true enable_remoting=false use_partition_alloc=false use_allocator_shim=false ios_stack_profiler_enabled=false'),
+      'gn_args': ('disable_brotli_filter=false enable_remoting=false use_partition_alloc=false use_allocator_shim=false ios_stack_profiler_enabled=false'),
     },
 
     'custom_args': {
diff --git a/tools/mb/mb_config_expectations/chromium.android.fyi.json b/tools/mb/mb_config_expectations/chromium.android.fyi.json
index 22314e11..4ed44f4 100644
--- a/tools/mb/mb_config_expectations/chromium.android.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.android.fyi.json
@@ -77,6 +77,7 @@
       "is_asan": true,
       "is_clang": true,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json
index c38e3d5..a0bf1e2 100644
--- a/tools/mb/mb_config_expectations/chromium.android.json
+++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -251,6 +251,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "is_java_debug": false,
       "media_use_ffmpeg": false,
@@ -280,6 +281,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -308,6 +310,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -335,6 +338,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -367,6 +371,7 @@
       "is_asan": true,
       "is_clang": true,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -395,6 +400,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -423,6 +429,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -450,6 +457,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
index b108fec..491d88f 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -212,6 +212,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "is_java_debug": false,
       "media_use_ffmpeg": false,
@@ -239,6 +240,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -266,6 +268,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -298,6 +301,7 @@
       "is_asan": true,
       "is_clang": true,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -327,6 +331,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -356,6 +361,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -384,6 +390,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -410,6 +417,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -436,6 +444,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -462,6 +471,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -488,6 +498,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": true,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
@@ -515,6 +526,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -544,6 +556,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "is_official_build": true,
       "media_use_ffmpeg": false,
@@ -1032,6 +1045,7 @@
       "ffmpeg_branding": "Chrome",
       "include_transport_security_state_preload_list": false,
       "is_component_build": false,
+      "is_cronet_build": true,
       "is_debug": false,
       "media_use_ffmpeg": false,
       "proprietary_codecs": true,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 33f19b4..143e9a9e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -41732,6 +41732,9 @@
   <int value="4428" label="IDNA2008DeviationCharacterInHostnameOfIFrame"/>
   <int value="4429" label="WindowOpenPopupOnMobile"/>
   <int value="4430" label="WindowOpenedAsPopupOnMobile"/>
+  <int value="4431"
+      label="PrivateNetworkAccessIgnoredCrossOriginPreflightError"/>
+  <int value="4432" label="PrivateNetworkAccessIgnoredCrossSitePreflightError"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -60471,6 +60474,7 @@
   <int value="-238415226" label="GlobalVaapiLock:disabled"/>
   <int value="-238175256" label="EarlyExitOnNoopClassOrStyleChange:enabled"/>
   <int value="-237367320" label="AssistantAudioEraser:disabled"/>
+  <int value="-236719122" label="AddIdentityInCanMakePaymentEvent:enabled"/>
   <int value="-236433493" label="ArcKeyboardShortcutHelperIntegration:enabled"/>
   <int value="-236071174" label="NearbyShareVisibilityReminder:disabled"/>
   <int value="-235949168" label="DrawPredictedInkPoint:enabled"/>
@@ -61373,6 +61377,7 @@
   <int value="299792415" label="OmniboxSuggestionTransparencyOptions:enabled"/>
   <int value="300095239" label="FCMInvalidations:enabled"/>
   <int value="300870732" label="ShelfDimming:disabled"/>
+  <int value="301513718" label="PrivacySandboxSettings4:enabled"/>
   <int value="301536977" label="DetailedLanguageSettings:enabled"/>
   <int value="301630312" label="ForcedColors:disabled"/>
   <int value="301869874" label="NTPPhysicalWebPageSuggestions:disabled"/>
@@ -62131,6 +62136,7 @@
   <int value="737421745" label="enable-accessibility-object-model"/>
   <int value="738868972" label="GdiTextPrinting:disabled"/>
   <int value="738962107" label="ExoOrdinalMotion:disabled"/>
+  <int value="739906838" label="CrOSLateBootAudioFlexibleLoopback:disabled"/>
   <int value="739938466"
       label="WebPaymentsPerMethodCanMakePaymentQuota:disabled"/>
   <int value="740056959" label="ImeServiceConnectable:enabled"/>
@@ -63197,6 +63203,7 @@
   <int value="1361073386" label="ContentSuggestionsNotifications:enabled"/>
   <int value="1363136936" label="VrCustomTabBrowsing:enabled"/>
   <int value="1363151585" label="SyncPseudoUSSAppList:enabled"/>
+  <int value="1363283577" label="CrOSLateBootAudioFlexibleLoopback:enabled"/>
   <int value="1365642727" label="IdentityStatusConsistency:enabled"/>
   <int value="1365857480" label="WebUITabStripNewTabButtonInTabStrip:enabled"/>
   <int value="1367406392" label="VaapiVideoDecoder:disabled"/>
@@ -63731,6 +63738,7 @@
   <int value="1689123607" label="enable-app-link"/>
   <int value="1689183477" label="enable-merge-key-char-events"/>
   <int value="1690248203" label="HelpAppV2:enabled"/>
+  <int value="1690415951" label="PrivacySandboxSettings4:disabled"/>
   <int value="1690837904" label="save-previous-document-resources"/>
   <int value="1691568199" label="AndroidSpellCheckerNonLowEnd:disabled"/>
   <int value="1691853573" label="PersonalizationHub:enabled"/>
@@ -64041,6 +64049,7 @@
       label="enable-message-center-always-scroll-up-upon-notification-removal"/>
   <int value="1861515782" label="WebFeedOnboarding:enabled"/>
   <int value="1861521561" label="OmniboxLocalEntitySuggestions:enabled"/>
+  <int value="1861699795" label="AddIdentityInCanMakePaymentEvent:disabled"/>
   <int value="1862126613" label="DesktopPWAsRunOnOsLogin:enabled"/>
   <int value="1862207743" label="enable-android-spellchecker"/>
   <int value="1863622457" label="WebAuthentication:enabled"/>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 5e594ed..c326a4bc 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -450,7 +450,7 @@
 </histogram>
 
 <histogram name="Download.Incognito.Message" enum="IncognitoMessageEvent"
-    expires_after="2022-12-31">
+    expires_after="2023-06-30">
   <owner>tommasin@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 574fd7a..bcf569f 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -5807,13 +5807,6 @@
   <affected-histogram name="ChromeOS.Settings.Languages.Toggle"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="SettingsResetPromptSettingType" separator="_">
-  <suffix name="DefaultSearch" label="Reset state for default search engine."/>
-  <suffix name="Homepage" label="Reset state for homepage."/>
-  <suffix name="StartupUrls" label="Reset state for startup URLs."/>
-  <affected-histogram name="SettingsResetPrompt.ResetState"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="SharingChannelType" separator=".">
   <suffix name="FcmSenderId" label="FCM Sender ID"/>
   <suffix name="FcmVapid" label="FCM VAPID"/>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 4fb3961a..06e8cc1 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -8503,25 +8503,6 @@
   </summary>
 </histogram>
 
-<histogram name="Mouse.Acceleration.Changed" enum="BooleanEnabled"
-    expires_after="M87">
-  <owner>zentaro@chromium.org</owner>
-  <owner>cros-peripherals@chromium.org</owner>
-  <summary>
-    Tracks mouse acceleration setting changes by the user. Only reported on
-    Chrome OS.
-  </summary>
-</histogram>
-
-<histogram name="Mouse.Acceleration.Started" enum="BooleanEnabled"
-    expires_after="M87">
-  <owner>zentaro@chromium.org</owner>
-  <owner>cros-peripherals@chromium.org</owner>
-  <summary>
-    Tracks mouse acceleration setting on startup. Only reported on Chrome OS.
-  </summary>
-</histogram>
-
 <histogram name="Mouse.PointerSensitivity.Changed" enum="PointerSensitivity"
     expires_after="2023-06-18">
   <owner>zentaro@chromium.org</owner>
@@ -8542,23 +8523,6 @@
   </summary>
 </histogram>
 
-<histogram name="Mouse.ReverseScroll.Changed" enum="BooleanEnabled"
-    expires_after="M77">
-  <owner>lannm@chromium.org</owner>
-  <summary>
-    Tracks mouse reverse scroll setting changes by the user. Only reported on
-    Chrome OS.
-  </summary>
-</histogram>
-
-<histogram name="Mouse.ReverseScroll.Started" enum="BooleanEnabled"
-    expires_after="M85">
-  <owner>lannm@chromium.org</owner>
-  <summary>
-    Tracks mouse reverse scroll setting on startup. Only reported on Chrome OS.
-  </summary>
-</histogram>
-
 <histogram base="true" name="Mouse.ScrollAcceleration" enum="BooleanEnabled"
     expires_after="2022-06-15">
 <!-- Name completed by histogram_suffixes name="PreferenceChangeType" -->
@@ -13926,25 +13890,6 @@
   </summary>
 </histogram>
 
-<histogram name="Touchpad.Acceleration.Changed" enum="BooleanEnabled"
-    expires_after="M87">
-  <owner>zentaro@chromium.org</owner>
-  <owner>cros-peripherals@chromium.org</owner>
-  <summary>
-    Tracks touchpad acceleration setting changes by the user. Only reported on
-    Chrome OS.
-  </summary>
-</histogram>
-
-<histogram name="Touchpad.Acceleration.Started" enum="BooleanEnabled"
-    expires_after="M87">
-  <owner>zentaro@chromium.org</owner>
-  <owner>cros-peripherals@chromium.org</owner>
-  <summary>
-    Tracks touchpad acceleration setting on startup. Only reported on Chrome OS.
-  </summary>
-</histogram>
-
 <histogram name="Touchpad.Device" enum="TouchpadDeviceState"
     expires_after="M85">
   <owner>jhawkins@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index b068cb7..870f349 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -2292,8 +2292,8 @@
 
 <histogram
     name="PageLoad.Internal.PaintTiming.LargestContentfulPaint.ContentType"
-    enum="LargestContentType" expires_after="2023-01-15">
-  <owner>npm@chromium.org</owner>
+    enum="LargestContentType" expires_after="2023-07-03">
+  <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
     Measures whether the largest contentful paint, whose timestamp is measured
@@ -2306,7 +2306,7 @@
 <histogram
     name="PageLoad.Internal.PaintTiming.LargestContentfulPaint.MainFrame.ContentType"
     enum="LargestContentType" expires_after="2023-07-03">
-  <owner>npm@chromium.org</owner>
+  <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
     Measures whether the largest contentful paint in the main frame, whose
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index e896bfd..cd43d757e 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -703,88 +703,6 @@
   </summary>
 </histogram>
 
-<histogram name="SettingsResetPrompt.ConfigError"
-    enum="SettingsResetPromptConfigError" expires_after="M82">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    Indicates if an error was detected in the settings reset prompt config data
-    while initializing the reset prompt configuration.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.DialogShown" enum="BooleanShown"
-    expires_after="M85">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    Indicates whether the settings reset prompt dialog was shown to the user.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.PromptAccepted" enum="BooleanAccepted"
-    expires_after="M95">
-  <owner>proberge@chromium.org</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    Indicates whether the user accepted the settings reset prompt. Warning: This
-    histogram was expired in M90 and restored M92. Data may be missing M90-91.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.PromptRequired" enum="BooleanRequired"
-    expires_after="M82">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    Indicates whether the settings reset prompt should be shown to the user
-    based on the state of the user's settings.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.ResetState"
-    enum="SettingsResetPromptResetState" expires_after="M82">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    Indicates whether the settings reset prompt is enabled for the user's
-    setting, or the reason for it being disabled. Logged once after startup.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.SettingsReset"
-    enum="SettingsResetPromptSettingsReset" expires_after="M85">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    Indicates which settings were reset after the user accepted the settings
-    reset prompt.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.TimeUntilAccepted" units="ms"
-    expires_after="M85">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    The time between the settings reset prompt dialog being shown and the user
-    accepting the prompt.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.TimeUntilCanceled" units="ms"
-    expires_after="M85">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    The time between the settings reset prompt dialog being shown and the user
-    declining the prompt by clicking the cancel button.
-  </summary>
-</histogram>
-
-<histogram name="SettingsResetPrompt.TimeUntilDismissed" units="ms"
-    expires_after="M85">
-  <owner>alito@chromium.org</owner>
-  <summary>
-    The time between the settings reset prompt dialog being shown and the user
-    dismissing the prompt, for example by clicking on the 'x' in the dialog or
-    pressing the Escape key.
-  </summary>
-</histogram>
-
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index 117555b..6347f73 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -189,7 +189,7 @@
 </histogram>
 
 <histogram name="Sync.BookmarkModelMergerTime{UpdatesCount}" units="ms"
-    expires_after="2023-02-01">
+    expires_after="2023-08-01">
   <owner>rushans@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -199,9 +199,10 @@
   </summary>
   <token key="UpdatesCount">
     <variant name="" summary="regardless of the number of updates"/>
-    <variant name="10kUpdates" summary="having more than 10k remote updates"/>
-    <variant name="50kUpdates" summary="having more than 50k remote updates"/>
-    <variant name="100kUpdates" summary="having more than 100k remote updates"/>
+    <variant name=".10kUpdates" summary="having more than 10k remote updates"/>
+    <variant name=".50kUpdates" summary="having more than 50k remote updates"/>
+    <variant name=".100kUpdates"
+        summary="having more than 100k remote updates"/>
   </token>
 </histogram>
 
@@ -1433,7 +1434,7 @@
 
 <histogram
     name="Sync.TrustedVaultErrorShownOnStartup{TrustedVaultTimeSinceMigrationSuffix}"
-    enum="Boolean" expires_after="2023-01-15">
+    enum="Boolean" expires_after="2023-07-15">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1569,7 +1570,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultRecoverabilityDegradedFixTrigger"
-    enum="TrustedVaultUserActionTrigger" expires_after="2023-01-15">
+    enum="TrustedVaultUserActionTrigger" expires_after="2023-07-15">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1582,7 +1583,7 @@
 
 <histogram
     name="Sync.TrustedVaultRecoverabilityDegradedOnStartup{TrustedVaultTimeSinceMigrationSuffix}"
-    enum="Boolean" expires_after="2023-01-15">
+    enum="Boolean" expires_after="2023-07-15">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 778f3f1..dab09bf 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "5caa61b5bb3704299ac576f1a4d4c8b6c26c418a",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/7d9bdde6f8d732767f0fce4273f492648335c77a/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/5d21cea244356ef7dcc225131564ecfe778348fa/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "6373f26144aad58f230d11d6a91efda5a09c9873",
diff --git a/tools/traffic_annotation/auditor/chromeos/safe_list.txt b/tools/traffic_annotation/auditor/chromeos/safe_list.txt
index bcf765a..c63a4d3 100644
--- a/tools/traffic_annotation/auditor/chromeos/safe_list.txt
+++ b/tools/traffic_annotation/auditor/chromeos/safe_list.txt
@@ -8,7 +8,6 @@
 all,chromeos/geolocation/simple_geolocation_request.cc
 all,components/quirks/quirks_client.cc
 all,chromeos/ash/services/device_sync/cryptauth_client_impl.cc
-all,chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
 all,chrome/browser/ash/net/network_diagnostics/network_diagnostics_util.cc
 all,chrome/browser/ash/net/network_diagnostics/tls_prober.cc
 all,ash/quick_pair/repository/fast_pair/fast_pair_image_decoder.cc
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index dfcf08b..b95b902 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -10,7 +10,7 @@
 <annotations>
  <item id="accounts_image_fetcher" added_in_milestone="66" content_hash_code="02b53da6" os_list="linux,windows,chromeos,android" file_path="components/signin/internal/identity_manager/account_fetcher_service.cc" />
  <item id="adb_client_socket" added_in_milestone="65" content_hash_code="03607bec" os_list="linux,windows,chromeos" file_path="chrome/browser/devtools/device/adb/adb_client_socket.cc" />
- <item id="affiliation_lookup_by_hash" added_in_milestone="87" content_hash_code="04e2a551" os_list="linux,windows,chromeos,android" file_path="components/password_manager/core/browser/affiliation/hash_affiliation_fetcher.cc" />
+ <item id="affiliation_lookup_by_hash" added_in_milestone="87" content_hash_code="04e2a551" os_list="windows,chromeos,android,linux" file_path="components/password_manager/core/browser/affiliation/hash_affiliation_fetcher.cc" />
  <item id="aggregation_service_helper_keys" added_in_milestone="96" content_hash_code="006e2ea0" os_list="linux,windows,chromeos,android" file_path="content/browser/aggregation_service/aggregation_service_network_fetcher_impl.cc" />
  <item id="aggregation_service_report" added_in_milestone="95" content_hash_code="037768da" os_list="linux,windows,chromeos,android" file_path="content/browser/aggregation_service/aggregatable_report_sender.cc" />
  <item id="android_device_manager_socket" added_in_milestone="65" content_hash_code="00623801" os_list="linux,windows,chromeos" file_path="chrome/browser/devtools/device/android_device_manager.cc" />
@@ -316,7 +316,7 @@
  <item id="download_bitmap" added_in_milestone="98" content_hash_code="0632ef37" os_list="android" file_path="chrome/browser/share/bitmap_download_request.cc" />
  <item id="family_info" added_in_milestone="98" content_hash_code="01831b1a" os_list="android,chromeos" file_path="chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc" />
  <item id="permission_request_creator" added_in_milestone="98" content_hash_code="04629d73" os_list="android,chromeos" file_path="chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc" />
- <item id="kids_chrome_management_client_classify_url" added_in_milestone="98" content_hash_code="06b848f5" os_list="android" file_path="chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc" />
+ <item id="kids_chrome_management_client_classify_url" added_in_milestone="98" content_hash_code="06b848f5" os_list="android,chromeos" file_path="chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc" />
  <item id="kids_chrome_management_list_family_members" added_in_milestone="106" content_hash_code="00458289" os_list="android,chromeos" file_path="chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc" />
  <item id="publish_note_request" added_in_milestone="98" content_hash_code="01e9f0b8" os_list="android" file_path="components/content_creation/notes/core/server/notes_server_saver.cc" />
  <item id="cached_image_fetcher" added_in_milestone="98" content_hash_code="06334a2d" os_list="android" file_path="components/image_fetcher/image_fetcher_bridge.cc" />
@@ -401,6 +401,7 @@
  <item id="customization_document" added_in_milestone="110" content_hash_code="007a3dda" os_list="chromeos" file_path="chrome/browser/ash/customization/customization_document.cc" />
  <item id="nearby_webrtc_connection" added_in_milestone="110" content_hash_code="070e1f72" os_list="chromeos" file_path="chrome/services/sharing/nearby/platform/webrtc.cc" />
  <item id="wallpaper_online_downloader" added_in_milestone="110" content_hash_code="060d5790" os_list="chromeos" file_path="ash/wallpaper/wallpaper_controller_impl.cc" />
+ <item id="fenced_frame_reporting_beacon" added_in_milestone="110" content_hash_code="03cebf59" os_list="linux,windows,android,chromeos" file_path="content/browser/renderer_host/render_frame_host_impl.cc" />
  <item id="password_sync_token_fetcher" added_in_milestone="110" content_hash_code="0451c1ff" os_list="chromeos" file_path="chrome/browser/ash/login/saml/password_sync_token_fetcher.cc" />
  <item id="projector_xhr_loader" added_in_milestone="110" content_hash_code="071c4ac5" os_list="chromeos" file_path="ash/webui/projector_app/projector_xhr_sender.cc" />
  <item id="cloud_speech_recognition" added_in_milestone="110" content_hash_code="00d56fd8" os_list="linux,windows,chromeos" file_path="components/live_caption/live_translate_controller.cc" />
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 5abb6f9..84fc54bf1 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -262,6 +262,7 @@
       <annotation id="nearby_share_contacts"/>
       <annotation id="nearby_share_list_public_certificates"/>
       <annotation id="managed_acccount_signin_restrictions_secure_connect_chromeos"/>
+      <annotation id="fenced_frame_reporting_beacon"/>
       <annotation id="ntp_custom_background"/>
       <annotation id="iwa_policy_update_manifest"/>
       <annotation id="iwa_policy_signed_web_bundle"/>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
index 5ab6158..7d5946d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -180,7 +180,7 @@
 <translation id="2500392669976258912">Gujarati fonetisk</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2517472476991765520">Scan</translation>
-<translation id="252641322760726369">Hold fingeren nede på en fil, tryk på <ph name="ICON" />, og vælg "<ph name="PIN_COMMAND" />" for hurtigt at få adgang til dine filer på hylden.</translation>
+<translation id="252641322760726369">Hold fingeren på en fil, tryk på <ph name="ICON" />, og vælg "<ph name="PIN_COMMAND" />" for hurtigt at få adgang til dine filer på hylden.</translation>
 <translation id="2534460670861217804">Sikker HTTP-proxy</translation>
 <translation id="2541377937973966830">Indholdet i denne mappe er skrivebeskyttet. Det er ikke alle aktiviteter, der understøttes.</translation>
 <translation id="2542049655219295786">Google-tabel</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
index ba4467db..a5ad6e0c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -608,7 +608,7 @@
 <translation id="5957366693331451795">Chromebox-ak</translation>
 <translation id="5982621672636444458">Ordenatzeko aukerak</translation>
 <translation id="6007237601604674381">Ezin izan da eraman. <ph name="ERROR_MESSAGE" /></translation>
-<translation id="6011074160056912900">Ethernet sarea</translation>
+<translation id="6011074160056912900">Ethernet-sarea</translation>
 <translation id="60357267506638014">QWERTY txekiarra</translation>
 <translation id="603895874132768835">Ezingo duzu erabili sarea beste PIN bat konfiguratzen duzun arte</translation>
 <translation id="6040143037577758943">Itxi</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
index 393c006..2b422837 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -179,7 +179,7 @@
 <translation id="2470939964922472929">Prevečkrat ste vnesli napačno kodo PIN. Če želite nastaviti novo kodo PIN, vnesite 8-mestno osebno kodo za odblokiranje (PUK), ki jo dobite od operaterja.</translation>
 <translation id="2500392669976258912">gudžaratščina (fonetična)</translation>
 <translation id="2515586267016047495">Alt</translation>
-<translation id="2517472476991765520">Išči</translation>
+<translation id="2517472476991765520">Optično preberi</translation>
 <translation id="252641322760726369">Pridržite datoteko in se dotaknite ikone <ph name="ICON" /> ter izberite ukaz »<ph name="PIN_COMMAND" />«, če želite hitro dostopati do datotek na polici.</translation>
 <translation id="2534460670861217804">Varni proxy HTTP</translation>
 <translation id="2541377937973966830">Vsebina te mape je samo za branje. Nekatere dejavnosti niso podprte.</translation>
diff --git a/ui/webui/resources/cr_components/README.md b/ui/webui/resources/cr_components/README.md
index cc02579..13bcd35 100644
--- a/ui/webui/resources/cr_components/README.md
+++ b/ui/webui/resources/cr_components/README.md
@@ -11,8 +11,10 @@
 
 For simpler components with no I18n or chrome dependencies, see cr_elements.
 
-Note that some cr_components also have independent ts_library()s. These can be
-identified by looking for a ts_library() rule in the BUILD.gn file for the
-component. Components like this should not use relative paths to other files
-in ui/webui/resources/, and users of these components must add a dependency on
-the ts_library target to use the component.
+See [build_cr_component()](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/webui_build_configuration.md#build_cr_component)
+for the recommended way of building individual cr_components/.
+
+cr_components/ that have a dedicated ts_library() or build_cr_component() target
+should not use relative paths to other files in ui/webui/resources/, and users
+of these components must add a dependency on the ts_library target to use the
+component.
diff --git a/ui/webui/resources/cr_components/certificate_manager/BUILD.gn b/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
index 4e929a4..95f8a86c 100644
--- a/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
+++ b/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
@@ -3,70 +3,51 @@
 # found in the LICENSE file.
 
 import("//crypto/features.gni")
-import("//tools/grit/preprocess_if_expr.gni")
-import("//tools/polymer/css_to_wrapper.gni")
-import("//tools/polymer/html_to_wrapper.gni")
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
 import("//ui/webui/webui_features.gni")
-import("certificate_manager.gni")
+import("../../tools/build_cr_component.gni")
 
 assert(use_nss_certs)
 
-preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/certificate_manager_tmp"
-preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/certificate_manager"
+build_cr_component("build") {
+  grd_prefix = "cr_components_certificate_manager"
 
-preprocess_if_expr("preprocess") {
-  visibility = [
-    ":build_ts",
-    ":css_wrapper_files",
-    ":html_wrapper_files",
+  web_component_files = [
+    "ca_trust_edit_dialog.ts",
+    "certificate_delete_confirmation_dialog.ts",
+    "certificate_entry.ts",
+    "certificate_list.ts",
+    "certificate_manager.ts",
+    "certificate_password_decryption_dialog.ts",
+    "certificate_password_encryption_dialog.ts",
+    "certificate_subentry.ts",
+    "certificates_error_dialog.ts",
   ]
-  in_folder = "."
-  out_folder = preprocess_folder_tmp
-  in_files = ts_files + html_files + css_files
-}
 
-css_to_wrapper("css_wrapper_files") {
-  deps = [ ":preprocess" ]
-  in_folder = preprocess_folder_tmp
-  out_folder = preprocess_folder_tmp
-  in_files = css_files
-  minify = optimize_webui
-}
+  if (is_chromeos) {
+    web_component_files += [
+      "certificate_provisioning_details_dialog.ts",
+      "certificate_provisioning_entry.ts",
+      "certificate_provisioning_list.ts",
+    ]
+  }
 
-html_to_wrapper("html_wrapper_files") {
-  deps = [ ":preprocess" ]
-  in_folder = preprocess_folder_tmp
-  out_folder = preprocess_folder_tmp
-  in_files = html_files
-  minify = optimize_webui
-}
+  non_web_component_files = [
+    "certificate_manager_types.ts",
+    "certificates_browser_proxy.ts",
+  ]
 
-ts_library("build_ts") {
-  root_dir = preprocess_folder_tmp
-  out_dir = preprocess_folder
-  composite = true
-  tsconfig_base = "tsconfig_base.json"
-  in_files = ts_files + css_wrapper_files + html_wrapper_files
-  definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
+  if (is_chromeos) {
+    non_web_component_files += [ "certificate_provisioning_browser_proxy.ts" ]
+  }
 
-  deps = [
+  css_files = [ "certificate_shared.css" ]
+
+  tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/certificate_manager"
+  ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
+  ts_deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources:library",
   ]
-  extra_deps = [
-    ":css_wrapper_files",
-    ":html_wrapper_files",
-    ":preprocess",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "cr_components_certificate_manager"
-  out_grd = "$target_gen_dir/resources.grdp"
-  public_deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "cr_components/certificate_manager"
+  optimize = optimize_webui
 }
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni
deleted file mode 100644
index a162c2e..0000000
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni
+++ /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.
-
-import("//build/config/chromeos/ui_mode.gni")
-
-# Files holding a Polymer element definition AND have an equivalent .html file.
-_web_component_files = [
-  "ca_trust_edit_dialog.ts",
-  "certificate_delete_confirmation_dialog.ts",
-  "certificate_entry.ts",
-  "certificate_list.ts",
-  "certificate_manager.ts",
-  "certificate_password_decryption_dialog.ts",
-  "certificate_password_encryption_dialog.ts",
-  "certificate_subentry.ts",
-  "certificates_error_dialog.ts",
-]
-
-if (is_chromeos) {
-  _web_component_files += [
-    "certificate_provisioning_details_dialog.ts",
-    "certificate_provisioning_entry.ts",
-    "certificate_provisioning_list.ts",
-  ]
-}
-
-# Files that are passed as input to html_to_wrapper().
-html_files = []
-foreach(f, _web_component_files) {
-  html_files += [ string_replace(f, ".ts", ".html") ]
-}
-
-# Files that are generated by html_to_wrapper().
-html_wrapper_files = []
-foreach(f, html_files) {
-  html_wrapper_files += [ f + ".ts" ]
-}
-
-_non_web_component_files = [
-  "certificate_manager_types.ts",
-  "certificates_browser_proxy.ts",
-]
-
-if (is_chromeos) {
-  _non_web_component_files += [ "certificate_provisioning_browser_proxy.ts" ]
-}
-
-ts_files = _web_component_files + _non_web_component_files
-
-# Files that are passed as input to css_to_wrapper().
-css_files = [ "certificate_shared.css" ]
-
-# Files that are generated by css_to_wrapper().
-css_wrapper_files = []
-foreach(f, css_files) {
-  css_wrapper_files += [ f + ".ts" ]
-}
diff --git a/ui/webui/resources/cr_components/color_change_listener/BUILD.gn b/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
index 2b64012..601d716 100644
--- a/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
+++ b/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
@@ -3,55 +3,27 @@
 # found in the LICENSE file.
 
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("../../tools/build_cr_component.gni")
 
 assert(!is_android && !is_ios)
 
-preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/color_change_listener"
-
 mojom("mojom") {
   sources = [ "color_change_listener.mojom" ]
   public_deps = [ "//mojo/public/mojom/base" ]
   webui_module_path = "chrome://resources/cr_components/color_change_listener/"
 }
 
-copy("copy_mojom") {
-  deps = [ ":mojom_js__generator" ]
-  sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom-webui.js" ]
-  outputs = [ "$target_gen_dir/{{source_file_part}}" ]
-}
-
-copy("copy_src") {
-  sources = [
-    "browser_proxy.ts",
-    "colors_css_updater.ts",
-  ]
-  outputs = [ "$target_gen_dir/{{source_file_part}}" ]
-}
-
-ts_library("build_ts") {
-  root_dir = target_gen_dir
-  out_dir = preprocess_folder
-  composite = true
-  tsconfig_base = "tsconfig_base.json"
-  in_files = [
-    "browser_proxy.ts",
-    "colors_css_updater.ts",
-    "color_change_listener.mojom-webui.js",
-  ]
-  deps = [ "//ui/webui/resources/mojo:library" ]
-  extra_deps = [
-    ":copy_mojom",
-    ":copy_src",
-  ]
-}
-
-generate_grd("build_grdp") {
+build_cr_component("build") {
   grd_prefix = "cr_components_color_change_listener"
-  out_grd = "$target_gen_dir/resources.grdp"
-  public_deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "cr_components/color_change_listener"
+
+  non_web_component_files = [
+    "browser_proxy.ts",
+    "colors_css_updater.ts",
+  ]
+
+  mojo_files_deps = [ ":mojom_js__generator" ]
+  mojo_files = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom-webui.js" ]
+
+  tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/color_change_listener"
+  ts_deps = [ "//ui/webui/resources/mojo:library" ]
 }
diff --git a/ui/webui/resources/cr_components/customize_themes/BUILD.gn b/ui/webui/resources/cr_components/customize_themes/BUILD.gn
index 085adeb..2b4b68c 100644
--- a/ui/webui/resources/cr_components/customize_themes/BUILD.gn
+++ b/ui/webui/resources/cr_components/customize_themes/BUILD.gn
@@ -3,12 +3,8 @@
 # found in the LICENSE file.
 
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//tools/grit/preprocess_if_expr.gni")
-import("//tools/polymer/html_to_wrapper.gni")
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
 import("//ui/webui/webui_features.gni")
-import("customize_themes.gni")
+import("../../tools/build_cr_component.gni")
 
 assert(!is_android && !is_ios)
 
@@ -23,61 +19,30 @@
   webui_module_path = "chrome://resources/cr_components/customize_themes/"
 }
 
-# Output folder used to hold preprocess_if_expr() output.
-preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/customize_themes_tmp"
+build_cr_component("build") {
+  grd_prefix = "cr_components_customize_themes"
 
-# Output folder used to hold ts_library() output.
-preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/customize_themes"
+  static_files = [
+    "colorize.svg",
+    "brush.svg",
+  ]
 
-preprocess_if_expr("preprocess") {
-  in_folder = "."
-  out_folder = preprocess_folder_tmp
-  in_files = ts_files + html_files
-}
+  web_component_files = [
+    "customize_themes.ts",
+    "theme_icon.ts",
+  ]
 
-html_to_wrapper("html_wrapper_files") {
-  deps = [ ":preprocess" ]
-  in_folder = preprocess_folder_tmp
-  out_folder = preprocess_folder_tmp
-  in_files = html_files
-  minify = optimize_webui
-}
+  non_web_component_files = [ "browser_proxy.ts" ]
 
-copy("copy_mojom") {
-  deps = [ ":mojom_js__generator" ]
-  sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/customize_themes/customize_themes.mojom-webui.js" ]
-  outputs = [ "$preprocess_folder_tmp/{{source_file_part}}" ]
-}
+  mojo_files_deps = [ ":mojom_js__generator" ]
+  mojo_files = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/customize_themes/customize_themes.mojom-webui.js" ]
 
-ts_library("build_ts") {
-  root_dir = preprocess_folder_tmp
-  out_dir = preprocess_folder
-  composite = true
-  tsconfig_base = "tsconfig_base.json"
-  in_files = ts_files + html_wrapper_files + mojo_files
-
-  deps = [
+  tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/customize_themes"
+  ts_deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources:library",
     "//ui/webui/resources/mojo:library",
   ]
-  extra_deps = [
-    ":copy_mojom",
-    ":html_wrapper_files",
-    ":preprocess",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "cr_components_customize_themes"
-  out_grd = "$target_gen_dir/resources.grdp"
-  input_files_base_dir = rebase_path(".", "//")
-  input_files = [
-    "colorize.svg",
-    "brush.svg",
-  ]
-  public_deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "cr_components/customize_themes"
+  optimize = optimize_webui
 }
diff --git a/ui/webui/resources/cr_components/customize_themes/customize_themes.gni b/ui/webui/resources/cr_components/customize_themes/customize_themes.gni
deleted file mode 100644
index 1b6de76..0000000
--- a/ui/webui/resources/cr_components/customize_themes/customize_themes.gni
+++ /dev/null
@@ -1,27 +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.
-
-# Files holding a Polymer element definition AND have an equivalent .html file.
-_web_component_files = [
-  "customize_themes.ts",
-  "theme_icon.ts",
-]
-
-# Files that are passed as input to html_to_wrapper().
-html_files = []
-foreach(f, _web_component_files) {
-  html_files += [ string_replace(f, ".ts", ".html") ]
-}
-
-# Files that are generated by html_to_wrapper().
-html_wrapper_files = []
-foreach(f, html_files) {
-  html_wrapper_files += [ f + ".ts" ]
-}
-
-_non_web_component_files = [ "browser_proxy.ts" ]
-
-mojo_files = [ "customize_themes.mojom-webui.js" ]
-
-ts_files = _web_component_files + _non_web_component_files
diff --git a/ui/webui/resources/cr_components/customize_themes/customize_themes.ts b/ui/webui/resources/cr_components/customize_themes/customize_themes.ts
index cc4ab66b..dcca204 100644
--- a/ui/webui/resources/cr_components/customize_themes/customize_themes.ts
+++ b/ui/webui/resources/cr_components/customize_themes/customize_themes.ts
@@ -3,23 +3,22 @@
 // found in the LICENSE file.
 
 import '../managed_dialog/managed_dialog.js';
-import '../../cr_elements/cr_button/cr_button.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.js';
-import '../../cr_elements/cr_icons.css.js';
-import '../../cr_elements/cr_grid/cr_grid.js';
-import '../../cr_elements/cr_shared_vars.css.js';
-import '../../cr_elements/cr_shared_style.css.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import 'chrome://resources/cr_elements/cr_icons.css.js';
+import 'chrome://resources/cr_elements/cr_grid/cr_grid.js';
+import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
+import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import './theme_icon.js';
 import '//resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {hexColorToSkColor, skColorToRgba} from 'chrome://resources/js/color_utils.js';
 import {SkColor} from 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js';
 import {DomRepeat} from 'chrome://resources/polymer/v3_0/polymer/lib/elements/dom-repeat.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {I18nMixin} from '../../cr_elements/i18n_mixin.js';
-import {assert} from '../../js/assert_ts.js';
-import {hexColorToSkColor, skColorToRgba} from '../../js/color_utils.js';
-
 import {CustomizeThemesBrowserProxyImpl} from './browser_proxy.js';
 import {getTemplate} from './customize_themes.html.js';
 import {ChromeTheme, CustomizeThemesClientCallbackRouter, CustomizeThemesHandlerInterface, Theme, ThemeType} from './customize_themes.mojom-webui.js';
diff --git a/ui/webui/resources/cr_components/customize_themes/theme_icon.ts b/ui/webui/resources/cr_components/customize_themes/theme_icon.ts
index d8d1cd8..774331d 100644
--- a/ui/webui/resources/cr_components/customize_themes/theme_icon.ts
+++ b/ui/webui/resources/cr_components/customize_themes/theme_icon.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../../cr_elements/cr_shared_vars.css.js';
+import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ui/webui/resources/cr_components/history_clusters/BUILD.gn b/ui/webui/resources/cr_components/history_clusters/BUILD.gn
index 9a820703..bcd279c9 100644
--- a/ui/webui/resources/cr_components/history_clusters/BUILD.gn
+++ b/ui/webui/resources/cr_components/history_clusters/BUILD.gn
@@ -3,22 +3,11 @@
 # found in the LICENSE file.
 
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//tools/grit/preprocess_if_expr.gni")
-import("//tools/polymer/css_to_wrapper.gni")
-import("//tools/polymer/html_to_wrapper.gni")
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
 import("//ui/webui/webui_features.gni")
-import("history_clusters.gni")
+import("../../tools/build_cr_component.gni")
 
 assert(!is_android)
 
-# Output folder used to hold preprocess_if_expr() output.
-preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/history_clusters_tmp"
-
-# Output folder used to hold ts_library() output.
-preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/history_clusters"
-
 mojom("mojo_bindings") {
   sources = [ "history_clusters.mojom" ]
   public_deps = [
@@ -30,60 +19,39 @@
   webui_module_path = "chrome://resources/cr_components/history_clusters/"
 }
 
-preprocess_if_expr("preprocess") {
-  in_folder = "."
-  out_folder = preprocess_folder_tmp
-  in_files = ts_files + html_files + css_files
-}
+build_cr_component("build") {
+  grd_prefix = "cr_components_history_clusters"
 
-css_to_wrapper("css_wrapper_files") {
-  deps = [ ":preprocess" ]
-  in_folder = preprocess_folder_tmp
-  out_folder = preprocess_folder_tmp
-  in_files = css_files
-  minify = optimize_webui
-}
+  web_component_files = [
+    "cluster.ts",
+    "clusters.ts",
+    "cluster_menu.ts",
+    "page_favicon.ts",
+    "search_query.ts",
+    "url_visit.ts",
+  ]
 
-html_to_wrapper("html_wrapper_files") {
-  deps = [ ":preprocess" ]
-  in_folder = preprocess_folder_tmp
-  out_folder = preprocess_folder_tmp
-  in_files = html_files
-  minify = optimize_webui
-}
+  non_web_component_files = [
+    "browser_proxy.ts",
+    "metrics_proxy.ts",
+    "utils.ts",
+  ]
 
-copy("copy_history_clusters_mojom") {
-  sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom-webui.js" ]
-  outputs = [ "$preprocess_folder_tmp/{{source_file_part}}" ]
-  deps = [ ":mojo_bindings_js__generator" ]
-}
+  css_files = [
+    "history_clusters_shared_style.css",
+    "shared_vars.css",
+  ]
 
-ts_library("build_ts") {
-  root_dir = preprocess_folder_tmp
-  out_dir = preprocess_folder
-  composite = true
-  tsconfig_base = "tsconfig_base.json"
-  in_files = ts_files + css_wrapper_files + html_wrapper_files +
-             [ "history_clusters.mojom-webui.js" ]
-  deps = [
+  mojo_files_deps = [ ":mojo_bindings_js__generator" ]
+  mojo_files = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom-webui.js" ]
+
+  tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/history_clusters"
+  ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
+  ts_deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources:library",
     "//ui/webui/resources/mojo:library",
   ]
-  definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
-  extra_deps = [
-    ":copy_history_clusters_mojom",
-    ":css_wrapper_files",
-    ":html_wrapper_files",
-    ":preprocess",
-  ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "cr_components_history_clusters"
-  out_grd = "$target_gen_dir/resources.grdp"
-  public_deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
-  resource_path_prefix = "cr_components/history_clusters"
+  optimize = optimize_webui
 }
diff --git a/ui/webui/resources/cr_components/history_clusters/cluster.ts b/ui/webui/resources/cr_components/history_clusters/cluster.ts
index 58d483f..4623283 100644
--- a/ui/webui/resources/cr_components/history_clusters/cluster.ts
+++ b/ui/webui/resources/cr_components/history_clusters/cluster.ts
@@ -7,16 +7,15 @@
 import './history_clusters_shared_style.css.js';
 import './shared_vars.css.js';
 import './url_visit.js';
-import '../../cr_elements/cr_icons.css.js';
+import 'chrome://resources/cr_elements/cr_icons.css.js';
 import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import 'chrome://resources/cr_elements/cr_auto_img/cr_auto_img.js';
 
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {assert} from 'chrome://resources/js/assert_ts.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 {assert} from '../../js/assert_ts.js';
-import {loadTimeData} from '../../js/load_time_data.js';
-
 import {BrowserProxyImpl} from './browser_proxy.js';
 import {getTemplate} from './cluster.html.js';
 import {Cluster, ClusterAction, PageCallbackRouter, SearchQuery, URLVisit, VisitAction} from './history_clusters.mojom-webui.js';
diff --git a/ui/webui/resources/cr_components/history_clusters/cluster_menu.ts b/ui/webui/resources/cr_components/history_clusters/cluster_menu.ts
index d422939..3e9f9c3 100644
--- a/ui/webui/resources/cr_components/history_clusters/cluster_menu.ts
+++ b/ui/webui/resources/cr_components/history_clusters/cluster_menu.ts
@@ -3,17 +3,16 @@
 // found in the LICENSE file.
 
 import './history_clusters_shared_style.css.js';
-import '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
+import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
 
+import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
+import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.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 {CrActionMenuElement} from '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
-import {loadTimeData} from '../../js/load_time_data.js';
-
 import {getTemplate} from './cluster_menu.html.js';
 import {URLVisit} from './history_clusters.mojom-webui.js';
 
diff --git a/ui/webui/resources/cr_components/history_clusters/clusters.ts b/ui/webui/resources/cr_components/history_clusters/clusters.ts
index 56fd670..704f9303 100644
--- a/ui/webui/resources/cr_components/history_clusters/clusters.ts
+++ b/ui/webui/resources/cr_components/history_clusters/clusters.ts
@@ -4,27 +4,26 @@
 
 import './cluster.js';
 import './history_clusters_shared_style.css.js';
-import '../../cr_elements/cr_button/cr_button.js';
-import '../../cr_elements/cr_dialog/cr_dialog.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
-import '../../cr_elements/cr_toast/cr_toast.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
+import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
+import 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js';
 
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
+import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
+import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {FocusOutlineManager} from 'chrome://resources/js/focus_outline_manager.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {IronScrollThresholdElement} from 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
-import {CrToastElement} from '../../cr_elements/cr_toast/cr_toast.js';
-import {assert} from '../../js/assert_ts.js';
-import {FocusOutlineManager} from '../../js/focus_outline_manager.js';
-import {loadTimeData} from '../../js/load_time_data.js';
-
 import {BrowserProxyImpl} from './browser_proxy.js';
 import {getTemplate} from './clusters.html.js';
 import {Cluster, PageCallbackRouter, PageHandlerRemote, QueryResult, URLVisit} from './history_clusters.mojom-webui.js';
diff --git a/ui/webui/resources/cr_components/history_clusters/history_clusters.gni b/ui/webui/resources/cr_components/history_clusters/history_clusters.gni
deleted file mode 100644
index 47f87fd..0000000
--- a/ui/webui/resources/cr_components/history_clusters/history_clusters.gni
+++ /dev/null
@@ -1,43 +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.
-
-# Files holding a Polymer element definition AND have an equivalent .html file.
-_web_component_files = [
-  "cluster.ts",
-  "clusters.ts",
-  "cluster_menu.ts",
-  "page_favicon.ts",
-  "search_query.ts",
-  "url_visit.ts",
-]
-
-# Files that are passed as input to html_to_wrapper().
-html_files = []
-foreach(f, _web_component_files) {
-  html_files += [ string_replace(f, ".ts", ".html") ]
-}
-
-# Files that are generated by html_to_wrapper().
-html_wrapper_files = []
-foreach(f, html_files) {
-  html_wrapper_files += [ f + ".ts" ]
-}
-
-ts_files = _web_component_files + [
-             "browser_proxy.ts",
-             "metrics_proxy.ts",
-             "utils.ts",
-           ]
-
-# Files that are passed as input to css_to_wrapper().
-css_files = [
-  "history_clusters_shared_style.css",
-  "shared_vars.css",
-]
-
-# Files that are generated by css_to_wrapper().
-css_wrapper_files = []
-foreach(f, css_files) {
-  css_wrapper_files += [ f + ".ts" ]
-}
diff --git a/ui/webui/resources/cr_components/history_clusters/history_clusters_shared_style.css b/ui/webui/resources/cr_components/history_clusters/history_clusters_shared_style.css
index 6322ceee..091d06a 100644
--- a/ui/webui/resources/cr_components/history_clusters/history_clusters_shared_style.css
+++ b/ui/webui/resources/cr_components/history_clusters/history_clusters_shared_style.css
@@ -4,8 +4,8 @@
 
 /* #css_wrapper_metadata_start
  * #type=style
- * #import=../../cr_elements/cr_shared_style.css.js
- * #import=../../cr_elements/cr_shared_vars.css.js
+ * #import=chrome://resources/cr_elements/cr_shared_style.css.js
+ * #import=chrome://resources/cr_elements/cr_shared_vars.css.js
  * #import=./shared_vars.css.js
  * #include=cr-shared-style cr-hidden-style
  * #css_wrapper_metadata_end */
diff --git a/ui/webui/resources/cr_components/history_clusters/page_favicon.ts b/ui/webui/resources/cr_components/history_clusters/page_favicon.ts
index 5a7475a..aebfd157 100644
--- a/ui/webui/resources/cr_components/history_clusters/page_favicon.ts
+++ b/ui/webui/resources/cr_components/history_clusters/page_favicon.ts
@@ -5,12 +5,11 @@
 import './shared_vars.css.js';
 import 'chrome://resources/cr_elements/cr_auto_img/cr_auto_img.js';
 
+import {getFaviconForPageURL} from 'chrome://resources/js/icon.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {getFaviconForPageURL} from '../../js/icon.js';
-import {loadTimeData} from '../../js/load_time_data.js';
-
 import {getTemplate} from './page_favicon.html.js';
 
 /**
diff --git a/ui/webui/resources/cr_components/history_clusters/shared_vars.css b/ui/webui/resources/cr_components/history_clusters/shared_vars.css
index 04175d4..bbc69262 100644
--- a/ui/webui/resources/cr_components/history_clusters/shared_vars.css
+++ b/ui/webui/resources/cr_components/history_clusters/shared_vars.css
@@ -4,7 +4,7 @@
 
 /* #css_wrapper_metadata_start
  * #type=vars
- * #import=../../cr_elements/cr_shared_vars.css.js
+ * #import=chrome://resources/cr_elements/cr_shared_vars.css.js
  * #import=chrome://resources/polymer/v3_0/paper-styles/color.js
  * #css_wrapper_metadata_end */
 
diff --git a/ui/webui/resources/cr_components/history_clusters/url_visit.ts b/ui/webui/resources/cr_components/history_clusters/url_visit.ts
index 97e6b96..9b4f377 100644
--- a/ui/webui/resources/cr_components/history_clusters/url_visit.ts
+++ b/ui/webui/resources/cr_components/history_clusters/url_visit.ts
@@ -4,17 +4,16 @@
 
 import './page_favicon.js';
 import './history_clusters_shared_style.css.js';
-import '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
+import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
 
+import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
+import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.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 {CrActionMenuElement} from '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
-import {loadTimeData} from '../../js/load_time_data.js';
-
 import {BrowserProxyImpl} from './browser_proxy.js';
 import {Annotation, URLVisit} from './history_clusters.mojom-webui.js';
 import {getTemplate} from './url_visit.html.js';
diff --git a/ui/webui/resources/cr_components/history_clusters/utils.ts b/ui/webui/resources/cr_components/history_clusters/utils.ts
index 057f9a6..6af34cc 100644
--- a/ui/webui/resources/cr_components/history_clusters/utils.ts
+++ b/ui/webui/resources/cr_components/history_clusters/utils.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {highlight} from '../../js/search_highlight_utils.js';
+import {highlight} from 'chrome://resources/js/search_highlight_utils.js';
 
 import {MatchPosition} from './history_clusters.mojom-webui.js';
 
diff --git a/ui/webui/resources/tools/build_cr_component.gni b/ui/webui/resources/tools/build_cr_component.gni
new file mode 100644
index 0000000..52126dac
--- /dev/null
+++ b/ui/webui/resources/tools/build_cr_component.gni
@@ -0,0 +1,254 @@
+# 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.
+
+import("//chrome/common/features.gni")
+import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/css_to_wrapper.gni")
+import("//tools/polymer/html_to_wrapper.gni")
+import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+# See documentation at https://chromium.googlesource.com/chromium/src/+/HEAD/docs/webui_build_configuration.md#build_cr_component
+
+template("build_cr_component") {
+  not_needed([ "target_name" ])
+
+  forward_variables_from(invoker,
+                         [
+                           "grd_prefix",
+                           "resource_path_prefix",
+                           "static_files",
+                         ])
+
+  preprocess_dir = "${target_gen_dir}/preprocessed"
+
+  tsc_dir = "${target_gen_dir}/tsc"
+  if (defined(invoker.tsc_dir)) {
+    tsc_dir = invoker.tsc_dir
+  }
+
+  if (defined(invoker.web_component_files) ||
+      defined(invoker.icons_html_files) || defined(invoker.css_files)) {
+    optimize = false
+    if (defined(invoker.optimize)) {
+      optimize = invoker.optimize
+    }
+  }
+
+  ### Compute the lists of files that are used across multiple targets.
+
+  # At least one of `web_component_files` or 'non_web_component_files` must be
+  # defined.
+  assert(defined(invoker.web_component_files) ||
+         defined(invoker.non_web_component_files))
+
+  ts_files = []
+  if (defined(invoker.web_component_files)) {
+    ts_files += invoker.web_component_files
+  }
+  if (defined(invoker.non_web_component_files)) {
+    ts_files += invoker.non_web_component_files
+  }
+
+  if (defined(invoker.web_component_files) ||
+      defined(invoker.icons_html_files)) {
+    # Files that are passed as input to html_to_wrapper().
+    html_files = []
+    if (defined(invoker.web_component_files)) {
+      foreach(f, invoker.web_component_files) {
+        html_files += [ string_replace(f, ".ts", ".html") ]
+      }
+    }
+    if (defined(invoker.icons_html_files)) {
+      html_files += invoker.icons_html_files
+    }
+
+    # Files that are generated by html_to_wrapper().
+    html_wrapper_files = []
+    foreach(f, html_files) {
+      html_wrapper_files += [ f + ".ts" ]
+    }
+  }
+
+  if (defined(invoker.css_files)) {
+    # Files that are generated by css_to_wrapper().
+    css_wrapper_files = []
+    foreach(f, invoker.css_files) {
+      css_wrapper_files += [ f + ".ts" ]
+    }
+  }
+
+  # Generated Mojo JS files.
+  if (defined(invoker.mojo_files)) {
+    assert(defined(invoker.mojo_files_deps))
+    mojo_files = []
+    foreach(mojo_file, invoker.mojo_files) {
+      mojo_files += [ get_path_info(invoker.mojo_files, "file") ]
+    }
+  }
+
+  if (defined(invoker.static_files)) {
+    # Compute which static_files should be preprocessed.
+    non_preprocessed_files_filter = [
+      "*.jpg",
+      "*.png",
+      "*.svg",
+    ]
+    static_non_preprocessed_files =
+        filter_include(static_files, non_preprocessed_files_filter)
+    static_preprocessed_files =
+        filter_exclude(static_files, non_preprocessed_files_filter)
+  }
+
+  ### Define the various targets that are required by the build pipeline.
+
+  # Specifically the order in which these targets are executed is:
+  #
+  #  1) preprocess_if_expr()
+  #  2) html_to_wrapper(), css_to_wrapper()
+  #  3) ts_library()
+  #  4) generate_grd()
+
+  if (defined(invoker.static_files)) {
+    preprocess_if_expr("preprocess_static_files") {
+      visibility = [ ":build_grdp" ]
+      defines = chrome_grit_defines
+      in_folder = "."
+      out_folder = preprocess_dir
+      in_files = static_preprocessed_files
+      out_manifest = "${target_gen_dir}/preprocess_static_files_manifest.json"
+    }
+  }
+
+  preprocess_if_expr("preprocess") {
+    visibility = [
+      ":build_ts",
+      ":css_wrapper_files",
+      ":html_wrapper_files",
+    ]
+
+    defines = chrome_grit_defines
+    in_folder = "."
+    out_folder = preprocess_dir
+    in_files = ts_files
+
+    if (defined(html_files)) {
+      in_files += html_files
+    }
+
+    if (defined(invoker.css_files)) {
+      in_files += invoker.css_files
+    }
+  }
+
+  if (defined(html_files)) {
+    html_to_wrapper("html_wrapper_files") {
+      visibility = [ ":build_ts" ]
+      deps = [ ":preprocess" ]
+      in_folder = preprocess_dir
+      out_folder = preprocess_dir
+      in_files = html_files
+      minify = optimize
+
+      if (defined(invoker.html_to_wrapper_template)) {
+        template = invoker.html_to_wrapper_template
+      }
+    }
+  }
+
+  if (defined(invoker.css_files)) {
+    css_to_wrapper("css_wrapper_files") {
+      visibility = [ ":build_ts" ]
+      deps = [ ":preprocess" ]
+      in_folder = preprocess_dir
+      out_folder = preprocess_dir
+      in_files = invoker.css_files
+      minify = optimize
+    }
+  }
+
+  if (defined(invoker.mojo_files_deps)) {
+    copy("copy_mojo") {
+      visibility = [ ":build_ts" ]
+      deps = invoker.mojo_files_deps
+      sources = invoker.mojo_files
+      outputs = [ "${preprocess_dir}/{{source_file_part}}" ]
+    }
+  }
+
+  ts_library("build_ts") {
+    root_dir = preprocess_dir
+    out_dir = tsc_dir
+
+    composite = true
+
+    if (!defined(invoker.ts_use_local_config) || invoker.ts_use_local_config) {
+      tsconfig_base = "tsconfig_base.json"
+    }
+
+    in_files = ts_files
+
+    extra_deps = [ ":preprocess" ]
+
+    if (defined(html_files)) {
+      in_files += html_wrapper_files
+      extra_deps += [ ":html_wrapper_files" ]
+    }
+
+    if (defined(invoker.css_files)) {
+      in_files += css_wrapper_files
+      extra_deps += [ ":css_wrapper_files" ]
+    }
+
+    if (defined(invoker.ts_deps)) {
+      deps = invoker.ts_deps
+    }
+
+    if (defined(invoker.ts_definitions)) {
+      definitions = invoker.ts_definitions
+    }
+
+    if (defined(invoker.ts_path_mappings)) {
+      path_mappings = invoker.ts_path_mappings
+    }
+
+    if (defined(invoker.mojo_files_deps)) {
+      assert(defined(invoker.mojo_files))
+      target_outputs = get_target_outputs(":copy_mojo")
+
+      # Add all Mojo JS files produced by `:copy_mojo` as inputs to the TS
+      # compiler.
+      foreach(o, target_outputs) {
+        in_files += [ rebase_path(o, preprocess_dir) ]
+      }
+      extra_deps += [ ":copy_mojo" ]
+    }
+
+    if (defined(invoker.ts_extra_deps)) {
+      extra_deps += invoker.ts_extra_deps
+    }
+  }
+
+  generate_grd("build_grdp") {
+    grd_prefix = grd_prefix
+    out_grd = "${target_gen_dir}/resources.grdp"
+
+    deps = []
+    manifest_files = []
+
+    if (defined(invoker.static_files)) {
+      input_files = static_non_preprocessed_files
+      input_files_base_dir = rebase_path(".", "//")
+
+      deps += [ ":preprocess_static_files" ]
+      manifest_files +=
+          [ "${target_gen_dir}/preprocess_static_files_manifest.json" ]
+    }
+
+    deps += [ ":build_ts" ]
+    manifest_files +=
+        filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
+    resource_path_prefix = rebase_path(".", "//ui/webui/resources")
+  }
+}
diff --git a/weblayer/browser/browser_context_impl.cc b/weblayer/browser/browser_context_impl.cc
index 43bb7a6f..513e6572 100644
--- a/weblayer/browser/browser_context_impl.cc
+++ b/weblayer/browser/browser_context_impl.cc
@@ -17,7 +17,6 @@
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/origin_trials/browser/origin_trials.h"
-#include "components/origin_trials/browser/prefservice_persistence_provider.h"
 #include "components/payments/core/payment_prefs.h"
 #include "components/permissions/permission_manager.h"
 #include "components/pref_registry/pref_registry_syncable.h"
diff --git a/weblayer/browser/origin_trials_browsertest.cc b/weblayer/browser/origin_trials_browsertest.cc
index 850f0eb..fa3fb42 100644
--- a/weblayer/browser/origin_trials_browsertest.cc
+++ b/weblayer/browser/origin_trials_browsertest.cc
@@ -10,7 +10,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "components/browsing_data/content/browsing_data_helper.h"
 #include "components/origin_trials/browser/origin_trials.h"
-#include "components/origin_trials/browser/prefservice_persistence_provider.h"
 #include "components/user_prefs/user_prefs.h"
 #include "content/public/browser/origin_trials_controller_delegate.h"
 #include "content/public/common/content_features.h"