diff --git a/DEPS b/DEPS
index 9bc5f324..556e2b9 100644
--- a/DEPS
+++ b/DEPS
@@ -295,19 +295,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '2514606e5e8e4ce2af8ebbddaeff318b9a987568',
+  'src_internal_revision': '7033656091f15c89917d3fd040c03dd346684c3b',
   # 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': '6205201c6b92d4a5492815049257c588fb1cd2a5',
+  'skia_revision': 'd2c201cb1a599d6d06985b27d45add4190d56e0f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'f603959113a63b6ee8fb0ab1efa6df3765e2b8ca',
+  'v8_revision': '15e797f9eaefc113c3c1b2dafc0513ad6a81afb5',
   # 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': 'bf837e01756fdd934c0f6adb17e5e379dde0f74a',
+  'angle_revision': '333395f96bfc371f267ce477efafee0695d2c7a1',
   # 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 googletest
   # and whatever else without interference from each other.
-  'googletest_revision': '90a41521142c978131f38c6da07b4eb96a9f1ff6',
+  'googletest_revision': '8b8ef3ff0d1f7a1739e0d7c3dd46ab37104fcd9a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lighttpd
   # and whatever else without interference from each other.
@@ -375,7 +375,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '4713630a70ba7a976468b5db45206e085640784e',
+  'crossbench_revision': 'b2370868e5c8e20bc99d386e4f675e1ea6ced3fe',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # 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 fuzztest
   # and whatever else without interference from each other.
-  'fuzztest_revision': '9c1ffdc7fb3d8db64e42c7a9662d8b9906625b77',
+  'fuzztest_revision': '1f21600f675e2bb8972acf57bfae6ff3416d37bb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling domato
   # and whatever else without interference from each other.
@@ -391,7 +391,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': '58221174205b00e188e181a3cbb1d63e05d23331',
+  'devtools_frontend_revision': '90051cb4b9ad9818b9c00643752370be66deaa50',
   # 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.
@@ -515,7 +515,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling webpagereplay
   # and whatever else without interference from each other.
-  'webpagereplay_revision': '2c5049abfc2cf36ece82f7f84ebdcb786659eaf7',
+  'webpagereplay_revision': '18172a359f6dab8e3f70b6c5c8c7c55d3e97537a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
@@ -1486,7 +1486,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '24dba4094427e89cdb21ff38df13ac54ce2bb238',
+    'bdbf6803cc84244212889ace086086cab20c18c6',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1645,7 +1645,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': '77JFcazE3nHDyZZ4RYND-IEyes3SQTICM2Kz231QD60C',
+          'version': 'NgN4G3kZkU23fj174TE4RsZAis3Apk2LfPTjb8wllxwC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2840,7 +2840,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@cd7971b83f29d029d06895f39630cffa5ec421f1',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@3bb9a2c5d2ef0dc54ae9697f8a6e628cc06b9fd3',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@963588074b26326ff0426c8953c1235213309bdb',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
   'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@6d0784e9f1ab92c17eeea94821b2465c14a52be9',
@@ -2849,7 +2849,7 @@
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@a8bec310845ce80af5c00342243ae972cbe95e3b',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@60b640cb931814fcc6dabe4fc61f4738c56579f6',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@4f628210460c4df62029959cc7fb237ac75f7189',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@f74722ee649f9c9cc7daa7d13d434febc424e7a4',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@7647300983abe4aa095dd74c2544c2cbe5906a7c',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -2888,7 +2888,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'c01b768bce4a143e152c1870b6ba99ea6267d2b0',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '71e9fad6cf757c1d6ce2ec56c5201dd42eec0aa3',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'f5816ba68bc2ec4a0c30ef4dcea0b104f81ceb9e',
 
   'src/third_party/webpagereplay':
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
@@ -3016,7 +3016,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_app/app',
-        'version': '4rIcnAZG8n0o36G3bDtLpFEflf6VI7sHbs9dXlr0bkMC',
+        'version': 'v09qbUPtnHylJbLchXOwMLnYbNOjwYjrDuA4acfRRYYC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS
index 2a318242..ba4a90f6 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -2661,7 +2661,8 @@
     'blink_device_orientation': ['kubo@igalia.com'],
     'blink_devtools': ['devtools-reviews+blink@chromium.org'],
     'blink_dom': ['blink-reviews-dom@chromium.org'],
-    'blink_dom_storage': ['dmurph+watching-domstorage@chromium.org'],
+    'blink_dom_storage': ['dmurph+watching-domstorage@chromium.org',
+                          'edgestoragedev@microsoft.com'],
     'blink_events': ['blink-reviews-events@chromium.org',
                      'dtapuska+blinkwatch@chromium.org'],
     'blink_fetch': ['gavinp+loader@chromium.org',
@@ -2679,6 +2680,7 @@
     'blink_image_codecs': ['cblume+imagecodecs@chromium.org',
                            'mbarowsky+watch-image-codecs@chromium.org'],
     'blink_indexed_db': ['dmurph+watching-idb@chromium.org',
+                         'edgestoragedev@microsoft.com',
                          'enne+idb@chromium.org'],
     'blink_input': ['dtapuska+blinkwatch@chromium.org'],
     'blink_layers': ['blink-layers+watch@chromium.org'],
@@ -2933,7 +2935,8 @@
     'discardable_memory': ['thiabaud+watch-discardable-memory@google.com'],
     'disk_cache': ['gavinp+disk@chromium.org'],
     'display': ['zhangwenyu+watch@google.com'],
-    'dom_storage': ['dmurph+watchingdomstorage@chromium.org'],
+    'dom_storage': ['dmurph+watchingdomstorage@chromium.org',
+                    'edgestoragedev@microsoft.com'],
     'download': ['dtrainor+watch@chromium.org'],
     'download_bubble': ['xinghuilu+watch@chromium.org',
                         'drubery+watch@chromium.org',
@@ -3000,6 +3003,7 @@
     'incident_reporting': ['grt+watch@chromium.org'],
     'incognito': ['roagarwal+watch@chromium.org'],
     'indexed_db': ['dmurph+watching-idb@chromium.org',
+                   'edgestoragedev@microsoft.com',
                    'enne+idb@chromium.org'],
     'input': ['dtapuska+chromiumwatch@chromium.org'],
     'input_device_settings': ['michaelcheco+watch-input-device-settings@google.com',
@@ -3292,7 +3296,8 @@
     'startup': ['nicolaso+watch@chromium.org',
                 'ydago+watch@chromium.org'],
     'storage_access_api': ['cfredric+watch@chromium.org'],
-    'storage_service': ['dmurph+watching-storageservice@chromium.org'],
+    'storage_service': ['dmurph+watching-storageservice@chromium.org',
+                        'edgestoragedev@microsoft.com'],
     'structured_headers': ['iclelland+watch@chromium.org'],
     'styleguide': ['danakj+watch@chromium.org',
                    'jbroman+cpp@chromium.org',
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index bc3eb0e..b7a9a80 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -280,6 +280,14 @@
                 "When enabled, Autofill will offer support for filling the user's loyalty cards"
                         + " stored in Google Wallet."),
         Flag.baseFeature(
+                AutofillFeatures.AUTOFILL_ENABLE_LOYALTY_CARDS_FILLING,
+                "When enabled, Autofill will offer support for filling the user's loyalty cards"
+                        + " stored in Google Wallet."),
+        Flag.baseFeature(
+                AutofillFeatures.AUTOFILL_ENABLE_EMAIL_OR_LOYALTY_CARDS_FILLING,
+                "When enabled, Autofill will offer support for Autofill suggestions on fields "
+                        + "requesting email or loyalty card values."),
+        Flag.baseFeature(
                 AutofillFeatures.AUTOFILL_PAGE_LANGUAGE_DETECTION,
                 "Enables Autofill to retrieve the page language for form parsing."),
         Flag.baseFeature(
diff --git a/base/apple/owned_objc.h b/base/apple/owned_objc.h
index 87e3c72..d9d25b20 100644
--- a/base/apple/owned_objc.h
+++ b/base/apple/owned_objc.h
@@ -67,7 +67,6 @@
     explicit operator bool() const;                          \
     /* Comparisons. */                                       \
     bool operator==(const classname& other) const;           \
-    bool operator!=(const classname& other) const;           \
     /* Logging (to allow CHECK_EQ, etc). */                  \
     std::string ToString() const;                            \
     /* Objective-C-only constructor and getter. */           \
diff --git a/base/apple/owned_objc.mm b/base/apple/owned_objc.mm
index 9a43949..54d5c5fe 100644
--- a/base/apple/owned_objc.mm
+++ b/base/apple/owned_objc.mm
@@ -31,9 +31,6 @@
   bool classname::operator==(const classname& other) const {                  \
     return objc_storage_->obj == other.objc_storage_->obj;                    \
   }                                                                           \
-  bool classname::operator!=(const classname& other) const {                  \
-    return !this->operator==(other);                                          \
-  }                                                                           \
   std::string classname::ToString() const {                                   \
     return objc_storage_->obj                                                 \
                ? id<NSObject>(objc_storage_->obj).debugDescription.UTF8String \
diff --git a/base/containers/flat_tree_unittest.cc b/base/containers/flat_tree_unittest.cc
index 5bd62bc9..4ab4c65 100644
--- a/base/containers/flat_tree_unittest.cc
+++ b/base/containers/flat_tree_unittest.cc
@@ -76,12 +76,7 @@
     return tmp;
   }
 
-  friend bool operator==(const InputIterator& lhs, const InputIterator& rhs) {
-    return lhs.it_ == rhs.it_;
-  }
-  friend bool operator!=(const InputIterator& lhs, const InputIterator& rhs) {
-    return !(lhs == rhs);
-  }
+  friend bool operator==(const InputIterator&, const InputIterator&) = default;
 
  private:
   It it_;
diff --git a/base/containers/intrusive_heap_unittest.cc b/base/containers/intrusive_heap_unittest.cc
index fcf51b1..99c081c 100644
--- a/base/containers/intrusive_heap_unittest.cc
+++ b/base/containers/intrusive_heap_unittest.cc
@@ -489,11 +489,7 @@
   void set_value(int value) { value_ = value; }
 
   bool operator==(const Value& rhs) const { return value_ == rhs.value_; }
-  bool operator!=(const Value& rhs) const { return value_ != rhs.value_; }
-  bool operator<=(const Value& rhs) const { return value_ <= rhs.value_; }
-  bool operator>=(const Value& rhs) const { return value_ >= rhs.value_; }
-  bool operator<(const Value& rhs) const { return value_ < rhs.value_; }
-  bool operator>(const Value& rhs) const { return value_ > rhs.value_; }
+  auto operator<=>(const Value& rhs) const { return value_ <=> rhs.value_; }
 
  private:
   int value_;
diff --git a/base/i18n/streaming_utf8_validator_unittest.cc b/base/i18n/streaming_utf8_validator_unittest.cc
index 509f667..49eb362d 100644
--- a/base/i18n/streaming_utf8_validator_unittest.cc
+++ b/base/i18n/streaming_utf8_validator_unittest.cc
@@ -200,11 +200,8 @@
     return std::string_view(valid[index_], prefix_length_);
   }
 
-  bool operator==(const PartialIterator& rhs) const {
-    return index_ == rhs.index_ && prefix_length_ == rhs.prefix_length_;
-  }
-
-  bool operator!=(const PartialIterator& rhs) const { return !(rhs == *this); }
+  friend bool operator==(const PartialIterator&,
+                         const PartialIterator&) = default;
 
  private:
   // This constructor is used by the end() method.
diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h
index 90ca64d1..e380927 100644
--- a/base/memory/ref_counted.h
+++ b/base/memory/ref_counted.h
@@ -474,11 +474,6 @@
   return lhs.data == rhs.data;
 }
 
-template <typename T>
-bool operator!=(const RefCountedData<T>& lhs, const RefCountedData<T>& rhs) {
-  return !(lhs == rhs);
-}
-
 }  // namespace base
 
 #endif  // BASE_MEMORY_REF_COUNTED_H_
diff --git a/base/task/thread_pool/task_source_sort_key.h b/base/task/thread_pool/task_source_sort_key.h
index 3d4eda1..ca7201f 100644
--- a/base/task/thread_pool/task_source_sort_key.h
+++ b/base/task/thread_pool/task_source_sort_key.h
@@ -9,8 +9,7 @@
 #include "base/task/task_traits.h"
 #include "base/time/time.h"
 
-namespace base {
-namespace internal {
+namespace base::internal {
 
 // An immutable but assignable representation of the priority of a Sequence.
 class BASE_EXPORT TaskSourceSortKey final {
@@ -30,14 +29,8 @@
   // Used for a max-heap.
   bool operator<(const TaskSourceSortKey& other) const;
 
-  bool operator==(const TaskSourceSortKey& other) const {
-    return priority_ == other.priority_ &&
-           worker_count_ == other.worker_count_ &&
-           ready_time_ == other.ready_time_;
-  }
-  bool operator!=(const TaskSourceSortKey& other) const {
-    return !(other == *this);
-  }
+  friend bool operator==(const TaskSourceSortKey&,
+                         const TaskSourceSortKey&) = default;
 
  private:
   // The private section allows this class to keep its immutable property while
@@ -56,7 +49,6 @@
   TimeTicks ready_time_;
 };
 
-}  // namespace internal
-}  // namespace base
+}  // namespace base::internal
 
 #endif  // BASE_TASK_THREAD_POOL_TASK_SOURCE_SORT_KEY_H_
diff --git a/base/threading/platform_thread_ref.h b/base/threading/platform_thread_ref.h
index 2b0e12e..d04df30a 100644
--- a/base/threading/platform_thread_ref.h
+++ b/base/threading/platform_thread_ref.h
@@ -42,8 +42,8 @@
   constexpr PlatformThreadRef() = default;
   explicit constexpr PlatformThreadRef(RefType id) : id_(id) {}
 
-  bool operator==(PlatformThreadRef other) const { return id_ == other.id_; }
-  bool operator!=(PlatformThreadRef other) const { return id_ != other.id_; }
+  friend bool operator==(const PlatformThreadRef&,
+                         const PlatformThreadRef&) = default;
 
   bool is_null() const { return id_ == 0; }
 
diff --git a/base/trace_event/heap_profiler_allocation_context.cc b/base/trace_event/heap_profiler_allocation_context.cc
index 16ce077d..532be7d 100644
--- a/base/trace_event/heap_profiler_allocation_context.cc
+++ b/base/trace_event/heap_profiler_allocation_context.cc
@@ -26,10 +26,6 @@
   return lhs.value == rhs.value;
 }
 
-bool operator!=(const StackFrame& lhs, const StackFrame& rhs) {
-  return !(lhs.value == rhs.value);
-}
-
 Backtrace::Backtrace() = default;
 
 bool operator==(const Backtrace& lhs, const Backtrace& rhs) {
@@ -39,24 +35,12 @@
   return std::equal(lhs.frames, lhs.frames + lhs.frame_count, rhs.frames);
 }
 
-bool operator!=(const Backtrace& lhs, const Backtrace& rhs) {
-  return !(lhs == rhs);
-}
-
 AllocationContext::AllocationContext() : type_name(nullptr) {}
 
 AllocationContext::AllocationContext(const Backtrace& backtrace,
                                      const char* type_name)
     : backtrace(backtrace), type_name(type_name) {}
 
-bool operator==(const AllocationContext& lhs, const AllocationContext& rhs) {
-  return (lhs.backtrace == rhs.backtrace) && (lhs.type_name == rhs.type_name);
-}
-
-bool operator!=(const AllocationContext& lhs, const AllocationContext& rhs) {
-  return !(lhs == rhs);
-}
-
 }  // namespace base::trace_event
 
 namespace std {
diff --git a/base/trace_event/heap_profiler_allocation_context.h b/base/trace_event/heap_profiler_allocation_context.h
index 9c08d447..da921a4 100644
--- a/base/trace_event/heap_profiler_allocation_context.h
+++ b/base/trace_event/heap_profiler_allocation_context.h
@@ -13,8 +13,7 @@
 #include "base/base_export.h"
 #include "base/memory/raw_ptr.h"
 
-namespace base {
-namespace trace_event {
+namespace base::trace_event {
 
 // When heap profiling is enabled, tracing keeps track of the allocation
 // context for each allocation intercepted. It is generated by the
@@ -48,7 +47,6 @@
 
 bool BASE_EXPORT operator<(const StackFrame& lhs, const StackFrame& rhs);
 bool BASE_EXPORT operator==(const StackFrame& lhs, const StackFrame& rhs);
-bool BASE_EXPORT operator!=(const StackFrame& lhs, const StackFrame& rhs);
 
 struct BASE_EXPORT Backtrace {
   Backtrace();
@@ -62,7 +60,6 @@
 };
 
 bool BASE_EXPORT operator==(const Backtrace& lhs, const Backtrace& rhs);
-bool BASE_EXPORT operator!=(const Backtrace& lhs, const Backtrace& rhs);
 
 // The |AllocationContext| is context metadata that is kept for every allocation
 // when heap profiling is enabled. To simplify memory management for book-
@@ -71,6 +68,9 @@
   AllocationContext();
   AllocationContext(const Backtrace& backtrace, const char* type_name);
 
+  friend bool BASE_EXPORT operator==(const AllocationContext&,
+                                     const AllocationContext&) = default;
+
   Backtrace backtrace;
 
   // Type name of the type stored in the allocated memory. A null pointer
@@ -80,19 +80,13 @@
   const char* type_name;
 };
 
-bool BASE_EXPORT operator==(const AllocationContext& lhs,
-                            const AllocationContext& rhs);
-bool BASE_EXPORT operator!=(const AllocationContext& lhs,
-                            const AllocationContext& rhs);
-
 // Struct to store the size and count of the allocations.
 struct AllocationMetrics {
   size_t size;
   size_t count;
 };
 
-}  // namespace trace_event
-}  // namespace base
+}  // namespace base::trace_event
 
 namespace std {
 
diff --git a/base/types/optional_unittest.cc b/base/types/optional_unittest.cc
index 586a49f..92863c8a 100644
--- a/base/types/optional_unittest.cc
+++ b/base/types/optional_unittest.cc
@@ -83,8 +83,6 @@
     return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
   }
 
-  bool operator!=(const TestObject& other) const { return !(*this == other); }
-
   int foo() const { return foo_; }
   State state() const { return state_; }
   int move_ctors_count() const { return move_ctors_count_; }
diff --git a/base/types/zip_unittest.cc b/base/types/zip_unittest.cc
index c55373f..7779f804 100644
--- a/base/types/zip_unittest.cc
+++ b/base/types/zip_unittest.cc
@@ -39,9 +39,6 @@
       ++it_;
       return temp;
     }
-    bool operator!=(const typename std::vector<T>::iterator& other) const {
-      return it_ != other;
-    }
 
     bool operator==(const typename std::vector<T>::iterator& other) const {
       return it_ == other;
diff --git a/build/action_helpers.py b/build/action_helpers.py
index 065a34e..b8b0ae5 100644
--- a/build/action_helpers.py
+++ b/build/action_helpers.py
@@ -38,7 +38,8 @@
   dirname = os.path.dirname(path) or '.'
   os.makedirs(dirname, exist_ok=True)
   with tempfile.NamedTemporaryFile(mode,
-                                   suffix=os.path.basename(path),
+                                   prefix=".tempfile.",
+                                   suffix="." + os.path.basename(path),
                                    dir=dirname,
                                    delete=False) as f:
     try:
diff --git a/build/config/clang/BUILD.gn b/build/config/clang/BUILD.gn
index 47046082..6e56ef47 100644
--- a/build/config/clang/BUILD.gn
+++ b/build/config/clang/BUILD.gn
@@ -67,6 +67,11 @@
       # for the dawn repo.
       "raw-ptr-exclude-path=" +
           rebase_path("//third_party/dawn/", root_build_dir),
+
+      # TODO(crbug.com/417356903): RawRefFieldMatcher causes OOM while
+      # building webidl_in_process_fuzzer.
+      "raw-ptr-exclude-path=" +
+          rebase_path("chrome/test/fuzzing/webidl_fuzzing/", root_build_dir),
     ]
 
     if (enable_check_raw_ptr_fields) {
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index ce09752..12bb562 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2639,6 +2639,8 @@
 
   metadata.display_transform_hint = active_tree_->display_transform_hint();
 
+  metadata.is_mobile_optimized = IsMobileOptimized(active_tree_.get());
+
   if (const gfx::DelegatedInkMetadata* delegated_ink_metadata_ptr =
           active_tree_->delegated_ink_metadata()) {
     std::unique_ptr<gfx::DelegatedInkMetadata> delegated_ink_metadata =
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 4c96e1a..93907fa9f 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -370,7 +370,6 @@
   "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderProperties.java",
   "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewBinder.java",
   "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java",
-  "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemProperties.java",
   "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewBinder.java",
   "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemWithIconButtonProperties.java",
   "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemWithIconButtonViewBinder.java",
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
index 59543b2f..fbef9118 100644
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -53,9 +53,6 @@
     <item type="id" name="contextmenu_save_page" />
     <item type="id" name="contextmenu_share_page" />
     <item type="id" name="contextmenu_print_page" />
-    <item type="id" name="contextmenu_back" />
-    <item type="id" name="contextmenu_forward" />
-    <item type="id" name="contextmenu_reload" />
     <item type="id" name="contextmenu_inspect_element" />
 
     <!-- Custom Tab Group -->
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgentImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgentImpl.java
index cae63db5..7e714942 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgentImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgentImpl.java
@@ -465,7 +465,7 @@
                 TaskTraits.UI_DEFAULT,
                 () -> {
                     AccountManagerFacadeProvider.getInstance()
-                            .getCoreAccountInfos()
+                            .getAccounts()
                             .then(
                                     (ignored) -> {
                                         accountsLatch.countDown();
@@ -643,7 +643,7 @@
         return PostTask.runSynchronously(
                 TaskTraits.UI_DEFAULT,
                 () -> {
-                    return AccountUtils.findAccountByEmail(getAccountInfos(), accountEmail);
+                    return AccountUtils.findAccountByEmail(getAccounts(), accountEmail);
                 });
     }
 
@@ -655,11 +655,11 @@
         return PostTask.runSynchronously(
                 TaskTraits.UI_DEFAULT,
                 () -> {
-                    return AccountUtils.findAccountByGaiaId(getAccountInfos(), accountGaiaId);
+                    return AccountUtils.findAccountByGaiaId(getAccounts(), accountGaiaId);
                 });
     }
 
-    private static List<AccountInfo> getAccountInfos() {
+    private static List<AccountInfo> getAccounts() {
         return AccountManagerFacadeProvider.getInstance().getAccounts().getResult();
     }
 
@@ -743,7 +743,7 @@
                             };
 
                     AccountUtils.checkChildAccountStatus(
-                            accountManagerFacade, getAccountInfos(), listener);
+                            accountManagerFacade, getAccounts(), listener);
                 });
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java
index 4cccf5b7d..f355b84 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java
@@ -114,8 +114,8 @@
             return coreAccountInfo.getEmail();
         }
         final @Nullable CoreAccountInfo defaultCoreAccountInfo =
-                AccountUtils.getDefaultCoreAccountInfoIfFulfilled(
-                        AccountManagerFacadeProvider.getInstance().getCoreAccountInfos());
+                AccountUtils.getDefaultAccountIfFulfilled(
+                        AccountManagerFacadeProvider.getInstance().getAccounts());
         return defaultCoreAccountInfo != null ? defaultCoreAccountInfo.getEmail() : null;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
index 259693b..27ff5d0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
@@ -68,9 +68,6 @@
         Item.SAVE_PAGE,
         Item.SHARE_PAGE,
         Item.PRINT_PAGE,
-        Item.BACK,
-        Item.FORWARD,
-        Item.RELOAD,
         Item.INSPECT_ELEMENT,
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -124,13 +121,10 @@
         int SAVE_PAGE = 36;
         int SHARE_PAGE = 37;
         int PRINT_PAGE = 38;
-        int BACK = 39;
-        int FORWARD = 40;
-        int RELOAD = 41;
         // Developer Group
-        int INSPECT_ELEMENT = 42;
+        int INSPECT_ELEMENT = 39;
         // ALWAYS UPDATE!
-        int NUM_ENTRIES = 43;
+        int NUM_ENTRIES = 40;
     }
 
     /** Mapping from {@link Item} to the ID found in the ids.xml. */
@@ -174,9 +168,6 @@
         R.id.contextmenu_save_page, // Item.SAVE_PAGE
         R.id.contextmenu_share_page, // Item.SHARE_PAGE
         R.id.contextmenu_print_page, // Item.PRINT_PAGE
-        R.id.contextmenu_back, // Item.BACK
-        R.id.contextmenu_forward, // Item.FORWARD
-        R.id.contextmenu_reload, // Item.RELOAD
         R.id.contextmenu_inspect_element, // Item.INSPECT_ELEMENT
     };
 
@@ -221,9 +212,6 @@
         R.string.contextmenu_save_page, // Item.SAVE_PAGE
         R.string.contextmenu_share_page, // Item.SHARE_PAGE
         R.string.contextmenu_print_page, // Item.PRINT_PAGE
-        R.string.contextmenu_back, // Item.BACK
-        R.string.contextmenu_forward, // Item.FORWARD
-        R.string.contextmenu_reload, // Item.RELOAD
         R.string.contextmenu_inspect_element, // Item.INSPECT_ELEMENT
     };
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
index ce795c2..541b38fd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -4,12 +4,12 @@
 
 package org.chromium.chrome.browser.contextmenu;
 
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.ENABLED;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.MENU_ID;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.TEXT;
 import static org.chromium.chrome.browser.contextmenu.ContextMenuItemWithIconButtonProperties.BUTTON_CONTENT_DESC;
 import static org.chromium.chrome.browser.contextmenu.ContextMenuItemWithIconButtonProperties.BUTTON_IMAGE;
 import static org.chromium.chrome.browser.contextmenu.ContextMenuItemWithIconButtonProperties.BUTTON_MENU_ID;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.TITLE;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -179,9 +179,6 @@
             Action.SAVE_PAGE,
             Action.SHARE_PAGE,
             Action.PRINT_PAGE,
-            Action.BACK,
-            Action.FORWARD,
-            Action.RELOAD,
             Action.INSPECT_ELEMENT,
             Action.SHOW_INTEREST_IN_ELEMENT,
         })
@@ -231,9 +228,9 @@
             int SAVE_PAGE = 41;
             int SHARE_PAGE = 42;
             int PRINT_PAGE = 43;
-            int BACK = 44;
-            int FORWARD = 45;
-            int RELOAD = 46;
+            // int BACK = 44;  Deprecated since 05/2025.
+            // int FORWARD = 45;  Deprecated since 05/2025.
+            // int RELOAD = 46;  Deprecated since 05/2025.
             int INSPECT_ELEMENT = 47;
             int SHOW_INTEREST_IN_ELEMENT = 48;
             int NUM_ENTRIES = 49;
@@ -314,15 +311,6 @@
         List<Pair<Integer, ModelList>> groupedItems = new ArrayList<>();
 
         if (mParams.isPage() && shouldShowEmptySpaceContextMenu()) {
-            ModelList pageNavigationGroup = new ModelList();
-            pageNavigationGroup.add(
-                    createListItem(Item.BACK, false, mItemDelegate.canCurrentTabGoBack()));
-            pageNavigationGroup.add(
-                    createListItem(Item.FORWARD, false, mItemDelegate.canCurrentTabGoForward()));
-            pageNavigationGroup.add(createListItem(Item.RELOAD, false, true));
-            groupedItems.add(
-                    new Pair<>(R.string.contextmenu_page_navigation_title, pageNavigationGroup));
-
             ModelList pageGroup = new ModelList();
             // TODO(crbug.com/405842034): investigate supporting downloads in incognito mode.
             if (!mItemDelegate.isIncognito()
@@ -586,16 +574,7 @@
 
     @Override
     public boolean onItemSelected(int itemId) {
-        if (itemId == R.id.contextmenu_back) {
-            recordContextMenuSelection(ContextMenuUma.Action.BACK);
-            mItemDelegate.onCurrentTabGoBack();
-        } else if (itemId == R.id.contextmenu_forward) {
-            recordContextMenuSelection(ContextMenuUma.Action.FORWARD);
-            mItemDelegate.onCurrentTabGoForward();
-        } else if (itemId == R.id.contextmenu_reload) {
-            recordContextMenuSelection(ContextMenuUma.Action.RELOAD);
-            mItemDelegate.onReloadCurrentTab();
-        } else if (itemId == R.id.contextmenu_open_in_new_tab) {
+        if (itemId == R.id.contextmenu_open_in_new_tab) {
             recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_NEW_TAB);
             RecordUserAction.record("TabContextMenu.OpenInNewTab");
             mItemDelegate.onOpenInNewTab(
@@ -1128,10 +1107,10 @@
 
     private ListItem createListItem(@Item int item, boolean showInProductHelp, boolean enabled) {
         final PropertyModel model =
-                new PropertyModel.Builder(ContextMenuItemProperties.ALL_KEYS)
-                        .with(MENU_ID, ChromeContextMenuItem.getMenuId(item))
+                new PropertyModel.Builder(MENU_ITEM_ID, TITLE, ENABLED)
+                        .with(MENU_ITEM_ID, ChromeContextMenuItem.getMenuId(item))
                         .with(
-                                TEXT,
+                                TITLE,
                                 ChromeContextMenuItem.getTitle(
                                         mContext, getProfile(), item, showInProductHelp))
                         .with(ENABLED, enabled)
@@ -1144,10 +1123,10 @@
         final Pair<Drawable, CharSequence> shareInfo = createRecentShareAppInfo(isLink);
         final PropertyModel model =
                 new PropertyModel.Builder(ContextMenuItemWithIconButtonProperties.ALL_KEYS)
-                        .with(MENU_ID, ChromeContextMenuItem.getMenuId(item))
+                        .with(MENU_ITEM_ID, ChromeContextMenuItem.getMenuId(item))
                         .with(ENABLED, true)
                         .with(
-                                TEXT,
+                                TITLE,
                                 ChromeContextMenuItem.getTitle(mContext, getProfile(), item, false))
                         .with(BUTTON_IMAGE, shareInfo.first)
                         .with(BUTTON_CONTENT_DESC, shareInfo.second)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
index e5f87363..37eb43f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -4,10 +4,10 @@
 
 package org.chromium.chrome.browser.contextmenu;
 
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.ENABLED;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.MENU_ID;
 import static org.chromium.chrome.browser.contextmenu.ContextMenuItemWithIconButtonProperties.BUTTON_CLICK_LISTENER;
 import static org.chromium.chrome.browser.contextmenu.ContextMenuItemWithIconButtonProperties.BUTTON_MENU_ID;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
 
 import android.app.Activity;
 import android.graphics.Rect;
@@ -61,13 +61,15 @@
         ListItemType.DIVIDER,
         ListItemType.HEADER,
         ListItemType.CONTEXT_MENU_ITEM,
-        ListItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON
+        ListItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON,
+        ListItemType.CONTEXT_MENU_ITEM_WITH_CHECKBOX,
     })
     public @interface ListItemType {
         int DIVIDER = 0;
         int HEADER = 1;
         int CONTEXT_MENU_ITEM = 2;
         int CONTEXT_MENU_ITEM_WITH_ICON_BUTTON = 3;
+        int CONTEXT_MENU_ITEM_WITH_CHECKBOX = 4;
     }
 
     private static final int INVALID_ITEM_ID = -1;
@@ -317,7 +319,7 @@
                         if (getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM
                                 || getItemViewType(position)
                                         == ListItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON) {
-                            return ((ListItem) getItem(position)).model.get(MENU_ID);
+                            return ((ListItem) getItem(position)).model.get(MENU_ITEM_ID);
                         }
                         return INVALID_ITEM_ID;
                     }
@@ -584,8 +586,8 @@
         for (int i = 0; i < getCount(); i++) {
             final ListItem item = getItem(i);
             // If the item is a title/divider, its model does not have MENU_ID as key.
-            if (item.model.getAllSetProperties().contains(MENU_ID)
-                    && item.model.get(MENU_ID) == id) {
+            if (item.model.getAllSetProperties().contains(MENU_ITEM_ID)
+                    && item.model.get(MENU_ITEM_ID) == id) {
                 return item;
             }
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemProperties.java
deleted file mode 100644
index dc4c188..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemProperties.java
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.contextmenu;
-
-import org.chromium.ui.modelutil.PropertyKey;
-import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
-import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey;
-import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
-
-class ContextMenuItemProperties {
-    public static final WritableObjectPropertyKey<CharSequence> TEXT =
-            new WritableObjectPropertyKey<>();
-    public static final WritableIntPropertyKey MENU_ID = new WritableIntPropertyKey();
-    public static final WritableBooleanPropertyKey ENABLED = new WritableBooleanPropertyKey();
-
-    public static final PropertyKey[] ALL_KEYS = {TEXT, MENU_ID, ENABLED};
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewBinder.java
index 86d9ff9..e9caa3c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewBinder.java
@@ -4,8 +4,8 @@
 
 package org.chromium.chrome.browser.contextmenu;
 
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.ENABLED;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.TEXT;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.TITLE;
 
 import android.view.View;
 import android.widget.TextView;
@@ -15,8 +15,8 @@
 
 class ContextMenuItemViewBinder {
     public static void bind(PropertyModel model, View view, PropertyKey propertyKey) {
-        if (propertyKey == TEXT) {
-            ((TextView) view).setText(model.get(TEXT));
+        if (propertyKey == TITLE) {
+            ((TextView) view).setText(model.get(TITLE));
         } else if (propertyKey == ENABLED) {
             view.setEnabled(model.get(ENABLED));
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemWithIconButtonProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemWithIconButtonProperties.java
index 5b5452a..ec84687 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemWithIconButtonProperties.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemWithIconButtonProperties.java
@@ -7,12 +7,12 @@
 import android.graphics.drawable.Drawable;
 import android.view.View;
 
+import org.chromium.ui.listmenu.ListMenuItemProperties;
 import org.chromium.ui.modelutil.PropertyKey;
-import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
 
-class ContextMenuItemWithIconButtonProperties extends ContextMenuItemProperties {
+class ContextMenuItemWithIconButtonProperties extends ListMenuItemProperties {
     public static final WritableObjectPropertyKey<Drawable> BUTTON_IMAGE =
             new WritableObjectPropertyKey<>();
     public static final WritableObjectPropertyKey<CharSequence> BUTTON_CONTENT_DESC =
@@ -22,9 +22,13 @@
             new WritableObjectPropertyKey<>();
 
     public static final PropertyKey[] ALL_KEYS =
-            PropertyModel.concatKeys(
-                    ContextMenuItemProperties.ALL_KEYS,
-                    new PropertyKey[] {
-                        BUTTON_IMAGE, BUTTON_CONTENT_DESC, BUTTON_MENU_ID, BUTTON_CLICK_LISTENER
-                    });
+            new PropertyKey[] {
+                MENU_ITEM_ID,
+                TITLE,
+                ENABLED,
+                BUTTON_IMAGE,
+                BUTTON_CONTENT_DESC,
+                BUTTON_MENU_ID,
+                BUTTON_CLICK_LISTENER
+            };
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java
index a953b47b..c6456e7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java
@@ -153,8 +153,8 @@
     }
 
     @Override
-    public int getTitleVisibilityState() {
-        return CustomTabsIntent.SHOW_PAGE_TITLE;
+    public @TitleVisibility int getTitleVisibilityState() {
+        return TitleVisibility.VISIBLE;
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
index 6195a65d..5ee14c3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -656,6 +656,7 @@
                         getCloseButtonVisibilityManager(),
                         getCustomTabBrowserControlsVisibilityDelegate(),
                         getCustomTabToolbarColorController(),
+                        getAppHeaderCoordinator(),
                         getCustomTabCompositorContentInitializer());
 
         CustomTabIntentHandlingStrategy customTabIntentHandlingStrategy =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
index 354a0508..fe07367 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -26,6 +26,7 @@
 import static androidx.browser.customtabs.CustomTabsIntent.EXTRA_INITIAL_ACTIVITY_HEIGHT_PX;
 import static androidx.browser.customtabs.CustomTabsIntent.EXTRA_INITIAL_ACTIVITY_WIDTH_PX;
 import static androidx.browser.customtabs.CustomTabsIntent.EXTRA_NETWORK;
+import static androidx.browser.customtabs.CustomTabsIntent.EXTRA_TITLE_VISIBILITY_STATE;
 import static androidx.browser.customtabs.CustomTabsIntent.EXTRA_TOOLBAR_CORNER_RADIUS_DP;
 import static androidx.browser.trusted.LaunchHandlerClientMode.FOCUS_EXISTING;
 import static androidx.browser.trusted.LaunchHandlerClientMode.NAVIGATE_EXISTING;
@@ -577,11 +578,16 @@
         // until native is loaded.
 
         mTrustedWebActivityDisplayMode = resolveTwaDisplayMode();
-        mTitleVisibilityState =
+
+        int intentVisibilityState =
                 IntentUtils.safeGetIntExtra(
                         intent,
                         CustomTabsIntent.EXTRA_TITLE_VISIBILITY_STATE,
                         CustomTabsIntent.NO_TITLE);
+        mTitleVisibilityState =
+                BrowserServicesIntentDataProvider.customTabIntentTitleBarVisibility(
+                        intentVisibilityState, isTwa);
+
         mRemoteViews =
                 IntentUtils.safeGetParcelableExtra(intent, CustomTabsIntent.EXTRA_REMOTEVIEWS);
         mClickableViewIds =
@@ -1120,7 +1126,7 @@
         if (IntentUtils.safeHasExtra(intent, CustomTabsIntent.EXTRA_SHARE_STATE)) {
             featureUsage.log(CustomTabsFeature.EXTRA_SHARE_STATE);
         }
-        if (mTitleVisibilityState != CustomTabsIntent.NO_TITLE) {
+        if (IntentUtils.safeHasExtra(intent, EXTRA_TITLE_VISIBILITY_STATE)) {
             featureUsage.log(CustomTabsFeature.EXTRA_TITLE_VISIBILITY_STATE);
         }
         if (IntentUtils.safeHasExtra(intent, CustomTabsIntent.EXTRA_TOOLBAR_ITEMS)) {
@@ -1276,7 +1282,7 @@
     }
 
     @Override
-    public int getTitleVisibilityState() {
+    public @TitleVisibility int getTitleVisibilityState() {
         return mTitleVisibilityState;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
index d7f9df7..2ea1a03 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -65,6 +65,7 @@
 import org.chromium.chrome.browser.browserservices.SessionHandler;
 import org.chromium.chrome.browser.browserservices.intents.BrowserCallbackWrapper;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.TitleVisibility;
 import org.chromium.chrome.browser.browserservices.intents.SessionHolder;
 import org.chromium.chrome.browser.content.WebContentsFactory;
 import org.chromium.chrome.browser.customtabs.ClientManager.CalledWarmup;
@@ -2184,9 +2185,10 @@
     }
 
     /** Specifies what content should be presented by the CustomTabs instance in location bar. */
-    public int getTitleVisibilityState(BrowserServicesIntentDataProvider intentData) {
+    public @TitleVisibility int getTitleVisibilityState(
+            BrowserServicesIntentDataProvider intentData) {
         if (shouldEnableOmniboxForIntent(intentData)) {
-            return CustomTabsIntent.NO_TITLE;
+            return CustomTabIntentDataProvider.TitleVisibility.HIDDEN;
         }
         return intentData.getTitleVisibilityState();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java
index 312bff4..07c39497 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java
@@ -88,11 +88,14 @@
         mShowShareItem =
                 IntentUtils.safeGetBooleanExtra(
                         intent, CustomTabsIntent.EXTRA_DEFAULT_SHARE_MENU_ITEM, false);
-        mTitleVisibilityState =
+        int intentVisibilityState =
                 IntentUtils.safeGetIntExtra(
                         intent,
                         CustomTabsIntent.EXTRA_TITLE_VISIBILITY_STATE,
                         CustomTabsIntent.NO_TITLE);
+        mTitleVisibilityState =
+                BrowserServicesIntentDataProvider.customTabIntentTitleBarVisibility(
+                        intentVisibilityState, false);
 
         mUiType = getUiType(intent);
         updateExtraMenuItemsIfNecessary(intent);
@@ -305,7 +308,7 @@
     }
 
     @Override
-    public int getTitleVisibilityState() {
+    public @TitleVisibility int getTitleVisibilityState() {
         return mTitleVisibilityState;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/MismatchNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/MismatchNotificationController.java
index 95be621e..497ffa1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/MismatchNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/MismatchNotificationController.java
@@ -36,13 +36,10 @@
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.AccountsChangeObserver;
 import org.chromium.components.signin.base.CoreAccountId;
-import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modelutil.PropertyModel;
 
-import java.util.List;
-
 /** A controller for the account mismatched notice message. */
 public class MismatchNotificationController
         implements SigninManager.SignInStateObserver, AccountsChangeObserver {
@@ -224,10 +221,10 @@
 
     @Override
     public void onCoreAccountInfosChanged() {
-        assert mAccountManagerFacade.getCoreAccountInfos().isFulfilled();
-        final List<CoreAccountInfo> coreAccountInfos =
-                mAccountManagerFacade.getCoreAccountInfos().getResult();
-        if (AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, mAppAccountEmail) == null) {
+        var accountsPromise = mAccountManagerFacade.getAccounts();
+        assert accountsPromise.isFulfilled();
+        if (AccountUtils.findAccountByEmail(accountsPromise.getResult(), mAppAccountEmail)
+                == null) {
             dismissMessage();
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
index 408367be..893ff50 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.customtabs.features.toolbar;
 
 import static androidx.browser.customtabs.CustomTabsIntent.CLOSE_BUTTON_POSITION_END;
-import static androidx.browser.customtabs.CustomTabsIntent.NO_TITLE;
 
 import static org.chromium.base.MathUtils.interpolate;
 import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.CustomTabProfileType.INCOGNITO;
@@ -71,6 +70,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.TitleVisibility;
 import org.chromium.chrome.browser.customtabs.CustomTabFeatureOverridesManager;
 import org.chromium.chrome.browser.customtabs.features.CustomTabDimensionUtils;
 import org.chromium.chrome.browser.customtabs.features.branding.ToolbarBrandingDelegate;
@@ -498,7 +498,7 @@
         if (mLocationBar.mOmniboxEnabled) {
             locationBarMinWidth +=
                     getResources().getDimensionPixelSize(R.dimen.toolbar_button_width);
-        } else if (mIntentDataProvider.getTitleVisibilityState() == NO_TITLE) {
+        } else if (mIntentDataProvider.getTitleVisibilityState() == TitleVisibility.HIDDEN) {
             locationBarMinWidth +=
                     getResources().getDimensionPixelSize(R.dimen.custom_tabs_security_icon_width);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java
index ece327c..01402e2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java
@@ -14,7 +14,6 @@
 import android.view.View;
 
 import androidx.annotation.Nullable;
-import androidx.browser.customtabs.CustomTabsIntent;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
@@ -27,6 +26,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsVisibilityManager;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.TitleVisibility;
 import org.chromium.chrome.browser.browserservices.intents.CustomButtonParams;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
 import org.chromium.chrome.browser.customtabs.CloseButtonVisibilityManager;
@@ -40,6 +40,9 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab_ui.TabModelDotInfo;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
+import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils;
+import org.chromium.chrome.browser.ui.web_app_header.WebAppHeaderUtils;
+import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager;
 import org.chromium.components.browser_ui.share.ShareHelper;
 import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.ui.util.TokenHolder;
@@ -68,6 +71,7 @@
     private final CloseButtonVisibilityManager mCloseButtonVisibilityManager;
     private final CustomTabBrowserControlsVisibilityDelegate mVisibilityDelegate;
     private final CustomTabToolbarColorController mToolbarColorController;
+    private final @Nullable DesktopWindowStateManager mDesktopWindowStateManager;
 
     @Nullable private ToolbarManager mToolbarManager;
 
@@ -87,6 +91,7 @@
             CloseButtonVisibilityManager closeButtonVisibilityManager,
             CustomTabBrowserControlsVisibilityDelegate visibilityDelegate,
             CustomTabToolbarColorController toolbarColorController,
+            @Nullable DesktopWindowStateManager desktopWindowStateManager,
             CustomTabCompositorContentInitializer customTabCompositorContentInitializer) {
         mIntentDataProvider = intentDataProvider;
         mTabProvider = tabProvider;
@@ -97,8 +102,48 @@
         mCloseButtonVisibilityManager = closeButtonVisibilityManager;
         mVisibilityDelegate = visibilityDelegate;
         mToolbarColorController = toolbarColorController;
+        mDesktopWindowStateManager = desktopWindowStateManager;
 
         customTabCompositorContentInitializer.addCallback(this::onCompositorContentInitialized);
+        observeDesktopWindowingState();
+    }
+
+    private void observeDesktopWindowingState() {
+        if (!WebAppHeaderUtils.isMinimalUiEnabled(mIntentDataProvider)) {
+            return;
+        }
+        // Guaranteed by the check above.
+        assert mDesktopWindowStateManager != null;
+
+        DesktopWindowStateManager.AppHeaderObserver appHeaderObserver =
+                new DesktopWindowStateManager.AppHeaderObserver() {
+                    @Override
+                    public void onDesktopWindowingModeChanged(boolean isInDesktopWindow) {
+                        updateTitleBarVisibility();
+                    }
+                };
+        mDesktopWindowStateManager.addObserver(appHeaderObserver);
+    }
+
+    private void updateTitleBarVisibility() {
+        if (mToolbarManager == null) return;
+
+        int titleVisibilityState =
+                CustomTabsConnection.getInstance().getTitleVisibilityState(mIntentDataProvider);
+        switch (titleVisibilityState) {
+            case TitleVisibility.HIDDEN:
+                mToolbarManager.setShowTitle(false);
+                break;
+            case TitleVisibility.VISIBLE:
+                mToolbarManager.setShowTitle(true);
+                break;
+            case TitleVisibility.VISIBLE_IN_DESKTOP:
+                mToolbarManager.setShowTitle(
+                        AppHeaderUtils.isAppInDesktopWindow(mDesktopWindowStateManager));
+                break;
+            default:
+                assert false;
+        }
     }
 
     /**
@@ -112,10 +157,8 @@
         mToolbarColorController.onToolbarInitialized(manager);
         mCloseButtonVisibilityManager.setVisibility(mIntentDataProvider.isCloseButtonEnabled());
         mCloseButtonVisibilityManager.onToolbarInitialized(manager);
+        updateTitleBarVisibility();
 
-        manager.setShowTitle(
-                CustomTabsConnection.getInstance().getTitleVisibilityState(mIntentDataProvider)
-                        == CustomTabsIntent.SHOW_PAGE_TITLE);
         if (CustomTabsConnection.getInstance()
                 .shouldHideDomainForSession(mIntentDataProvider.getSession())) {
             manager.setUrlBarHidden(true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
index c05247d..b876a88 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -137,12 +137,12 @@
      */
     void start() {
         AccountManagerFacadeProvider.getInstance()
-                .getCoreAccountInfos()
+                .getAccounts()
                 .then(
-                        coreAccountInfos -> {
+                        accounts -> {
                             RecordHistogram.recordCount1MHistogram(
                                     "Signin.AndroidDeviceAccountsNumberWhenEnteringFRE",
-                                    Math.min(coreAccountInfos.size(), 2));
+                                    Math.min(accounts.size(), 2));
 
                             assert !mAccountsAvailable;
                             mAccountsAvailable = true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
index 8cbbd04..4192250 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
@@ -111,7 +111,7 @@
 
     private void updateVisibility() {
         final boolean isAccountsCachePopulated =
-                AccountManagerFacadeProvider.getInstance().getCoreAccountInfos().isFulfilled();
+                AccountManagerFacadeProvider.getInstance().getAccounts().isFulfilled();
         boolean canShowPersonalizedSigninPromo =
                 mSigninManager.isSigninAllowed()
                         && mSyncPromoController.canShowSyncPromo()
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
index f719390..4b57e4e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
@@ -33,7 +33,7 @@
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.GAIAServiceType;
-import org.chromium.components.signin.base.CoreAccountInfo;
+import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.metrics.AccountConsistencyPromoAction;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
 import org.chromium.ui.base.WindowAndroid;
@@ -106,10 +106,10 @@
                     SigninAccessPoint.WEB_SIGNIN);
             return;
         }
-        final List<CoreAccountInfo> coreAccountInfos =
-                AccountUtils.getCoreAccountInfosIfFulfilledOrEmpty(
-                        AccountManagerFacadeProvider.getInstance().getCoreAccountInfos());
-        if (coreAccountInfos.isEmpty()) {
+        List<AccountInfo> accounts =
+                AccountUtils.getAccountsIfFulfilledOrEmpty(
+                        AccountManagerFacadeProvider.getInstance().getAccounts());
+        if (accounts.isEmpty()) {
             SigninMetricsUtils.logAccountConsistencyPromoAction(
                     AccountConsistencyPromoAction.SUPPRESSED_NO_ACCOUNTS,
                     SigninAccessPoint.WEB_SIGNIN);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
index d0b1bf0..72d2761 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
@@ -20,7 +20,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
-import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
@@ -43,6 +42,7 @@
 import org.chromium.components.signin.AccountsChangeObserver;
 import org.chromium.components.signin.SigninFeatureMap;
 import org.chromium.components.signin.SigninFeatures;
+import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountId;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.identitymanager.AccountInfoServiceProvider;
@@ -152,11 +152,10 @@
                 SigninManagerImplJni.get().isSigninAllowed(mNativeSigninManagerAndroid);
         mAccountManagerFacade = AccountManagerFacadeProvider.getInstance();
         mAccountManagerFacade.addObserver(this);
-        Promise<List<CoreAccountInfo>> coreAccountInfosPromise =
-                mAccountManagerFacade.getCoreAccountInfos();
-        if (coreAccountInfosPromise.isFulfilled()
+        var accountsPromise = mAccountManagerFacade.getAccounts();
+        if (accountsPromise.isFulfilled()
                 && (mAccountManagerFacade.didAccountFetchSucceed()
-                        || !coreAccountInfosPromise.getResult().isEmpty())) {
+                        || !accountsPromise.getResult().isEmpty())) {
             seedThenReloadAllAccountsFromSystem(
                     CoreAccountInfo.getIdFrom(
                             identityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN)));
@@ -179,11 +178,10 @@
     /** Implements {@link AccountsChangeObserver}. */
     @Override
     public void onCoreAccountInfosChanged() {
-        Promise<List<CoreAccountInfo>> coreAccountInfosPromise =
-                mAccountManagerFacade.getCoreAccountInfos();
-        assert coreAccountInfosPromise.isFulfilled();
-        List<CoreAccountInfo> coreAccountInfos = coreAccountInfosPromise.getResult();
-        if (!mAccountManagerFacade.didAccountFetchSucceed() && coreAccountInfos.isEmpty()) {
+        var accountsPromise = mAccountManagerFacade.getAccounts();
+        assert accountsPromise.isFulfilled();
+        List<AccountInfo> accounts = accountsPromise.getResult();
+        if (!mAccountManagerFacade.didAccountFetchSucceed() && accounts.isEmpty()) {
             // If the account fetch did not succeed, the AccountManagerFacade falls back to an empty
             // list. Do nothing when this is the case.
             return;
@@ -196,9 +194,7 @@
             seedThenReloadAllAccountsFromSystem(null);
             return;
         }
-        if (AccountUtils.findCoreAccountInfoByGaiaId(
-                        coreAccountInfos, primaryAccountInfo.getGaiaId())
-                != null) {
+        if (AccountUtils.findAccountByGaiaId(accounts, primaryAccountInfo.getGaiaId()) != null) {
             // The primary account is still on the device, reseed accounts.
             seedThenReloadAllAccountsFromSystem(CoreAccountInfo.getIdFrom(primaryAccountInfo));
             return;
@@ -378,7 +374,7 @@
 
     private void signinInternalAfterCheckingManagedState() {
         // Retrieve the primary account and use it to seed and reload all accounts.
-        if (!mAccountManagerFacade.getCoreAccountInfos().isFulfilled()) {
+        if (!mAccountManagerFacade.getAccounts().isFulfilled()) {
             throw new IllegalStateException("Account information should be available on signin");
         }
         if (mSignInState.mCoreAccountInfo == null) {
@@ -602,7 +598,7 @@
                                 SigninPreferencesManager.SigninPromoAccessPointId.NTP),
                         0);
         SignOutCallback signOutCallback = mSignOutState.mSignOutCallback;
-        if (mAccountManagerFacade.getCoreAccountInfos().isFulfilled()) {
+        if (mAccountManagerFacade.getAccounts().isFulfilled()) {
             // We don't reload the accounts if they are not yet available.
             // They will be seeded in onCoreAccountInfosChanged() when they become available.
             seedThenReloadAllAccountsFromSystem(null);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
index 14c5ced2..9f43c30 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
@@ -50,6 +50,7 @@
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.GAIAServiceType;
+import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
 import org.chromium.components.signin.metrics.SignoutReason;
@@ -175,10 +176,10 @@
                 IdentityServicesProvider.get()
                         .getIdentityManager(getProfile())
                         .getPrimaryAccountInfo(ConsentLevel.SIGNIN);
-        List<CoreAccountInfo> coreAccountInfos =
-                AccountUtils.getCoreAccountInfosIfFulfilledOrEmpty(
-                        AccountManagerFacadeProvider.getInstance().getCoreAccountInfos());
-        if (mSignedInCoreAccountInfo == null || coreAccountInfos.isEmpty()) {
+        List<AccountInfo> accounts =
+                AccountUtils.getAccountsIfFulfilledOrEmpty(
+                        AccountManagerFacadeProvider.getInstance().getAccounts());
+        if (mSignedInCoreAccountInfo == null || accounts.isEmpty()) {
             // The AccountManagementFragment can only be shown when the user is signed in. If the
             // user is signed out, exit the fragment.
             SettingsNavigationFactory.createSettingsNavigation().finishCurrentSettings(this);
@@ -193,9 +194,7 @@
         addPreferencesFromResource(R.xml.account_management_preferences);
         configureSignOutSwitch();
         configureChildAccountPreferences();
-        AccountManagerFacadeProvider.getInstance()
-                .getCoreAccountInfos()
-                .then(this::updateAccountsList);
+        AccountManagerFacadeProvider.getInstance().getAccounts().then(this::updateAccountsList);
     }
 
     /**
@@ -279,12 +278,12 @@
         }
     }
 
-    private void updateAccountsList(List<CoreAccountInfo> coreAccountInfos) {
+    private void updateAccountsList(List<AccountInfo> accounts) {
         // This method is called asynchronously on accounts fetched from AccountManagerFacade.
         // Make sure the fragment is alive before updating preferences.
         if (!isResumed()) return;
 
-        setAccountBadges(coreAccountInfos);
+        setAccountBadges(accounts);
 
         PreferenceCategory accountsCategory = findPreference(PREF_ACCOUNTS_CATEGORY);
         if (accountsCategory == null) {
@@ -300,9 +299,9 @@
         accountsCategory.addPreference(createManageYourGoogleAccountPreference());
         accountsCategory.addPreference(createDividerPreference(R.layout.horizontal_divider));
 
-        for (CoreAccountInfo coreAccountInfo : coreAccountInfos) {
-            if (!mSignedInCoreAccountInfo.equals(coreAccountInfo)) {
-                accountsCategory.addPreference(createAccountPreference(coreAccountInfo));
+        for (CoreAccountInfo account : accounts) {
+            if (!mSignedInCoreAccountInfo.equals(account)) {
+                accountsCategory.addPreference(createAccountPreference(account));
             }
         }
         accountsCategory.addPreference(createAddAccountPreference());
@@ -405,11 +404,11 @@
         return getPreferenceManager().getContext();
     }
 
-    private void setAccountBadges(List<CoreAccountInfo> coreAccountInfos) {
-        for (CoreAccountInfo coreAccountInfo : coreAccountInfos) {
+    private void setAccountBadges(List<AccountInfo> accounts) {
+        for (CoreAccountInfo account : accounts) {
             AccountManagerFacadeProvider.getInstance()
                     .checkIsSubjectToParentalControls(
-                            coreAccountInfo,
+                            account,
                             (isChild, childAccount) -> {
                                 Context context = getContext();
                                 if (isChild && context != null) {
@@ -427,9 +426,7 @@
     // ProfileDataCache.Observer implementation:
     @Override
     public void onProfileDataUpdated(String accountEmail) {
-        AccountManagerFacadeProvider.getInstance()
-                .getCoreAccountInfos()
-                .then(this::updateAccountsList);
+        AccountManagerFacadeProvider.getInstance().getAccounts().then(this::updateAccountsList);
     }
 
     // SignInStateObserver implementation:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java
index 001df853..a8a7ca7d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java
@@ -14,7 +14,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.browser.customtabs.CustomTabsIntent;
 import androidx.browser.trusted.TrustedWebActivityDisplayMode;
 import androidx.browser.trusted.TrustedWebActivityDisplayMode.DefaultMode;
 import androidx.browser.trusted.TrustedWebActivityDisplayMode.ImmersiveMode;
@@ -133,8 +132,8 @@
     }
 
     @Override
-    public int getTitleVisibilityState() {
-        return CustomTabsIntent.SHOW_PAGE_TITLE;
+    public @TitleVisibility int getTitleVisibilityState() {
+        return TitleVisibility.VISIBLE;
     }
 
     @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
index fe44fe7..6600cad 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
@@ -11,9 +11,9 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.ENABLED;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.MENU_ID;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.TEXT;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.TITLE;
 
 import android.app.Activity;
 import android.net.Uri;
@@ -177,10 +177,10 @@
             for (int j = 0; j < contextMenuState.get(i).second.size(); j++) {
                 PropertyModel model = contextMenuState.get(i).second.get(j).model;
                 assertEquals(
-                        "'" + model.get(TEXT) + "' has different enablement setting than expected",
-                        !disabled.contains(model.get(MENU_ID)),
+                        "'" + model.get(TITLE) + "' has different enablement setting than expected",
+                        !disabled.contains(model.get(MENU_ITEM_ID)),
                         model.get(ENABLED));
-                availableInTab[j] = model.get(MENU_ID);
+                availableInTab[j] = model.get(MENU_ITEM_ID);
             }
 
             int[] expectedItemsInGroup = groups[i];
@@ -205,7 +205,7 @@
                 StringBuilder generated_info = new StringBuilder();
                 for (int j = 0; j < contextMenuState.get(i).second.size(); j++) {
                     generated_info.append("'");
-                    generated_info.append(contextMenuState.get(i).second.get(j).model.get(TEXT));
+                    generated_info.append(contextMenuState.get(i).second.get(j).model.get(TITLE));
                     generated_info.append("' ");
                 }
                 StringBuilder expected_info = new StringBuilder();
@@ -1633,7 +1633,6 @@
                         /* additionalNavigationParams= */ null);
 
         int[][] expected = {
-            {R.id.contextmenu_back, R.id.contextmenu_forward, R.id.contextmenu_reload},
             {R.id.contextmenu_save_page, R.id.contextmenu_share_page, R.id.contextmenu_print_page},
             {R.id.contextmenu_inspect_element},
         };
@@ -1655,60 +1654,6 @@
     @Test
     @SmallTest
     @UiThreadTest
-    public void testPageNavigation() {
-        FirstRunStatus.setFirstRunFlowComplete(true);
-        ContextMenuParams params =
-                new ContextMenuParams(
-                        0,
-                        ContextMenuDataMediaType.NONE,
-                        new GURL(PAGE_URL),
-                        GURL.emptyGURL(),
-                        "",
-                        GURL.emptyGURL(),
-                        GURL.emptyGURL(),
-                        "",
-                        null,
-                        false,
-                        0,
-                        0,
-                        MenuSourceType.TOUCH,
-                        false,
-                        false,
-                        0,
-                        /* additionalNavigationParams= */ null);
-
-        int[][] expected = {
-            {R.id.contextmenu_back, R.id.contextmenu_forward, R.id.contextmenu_reload},
-            {R.id.contextmenu_save_page, R.id.contextmenu_share_page, R.id.contextmenu_print_page},
-            {R.id.contextmenu_inspect_element},
-        };
-
-        // All items are present and enabled.
-        initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.NORMAL, params);
-        checkMenuOptions(expected);
-
-        // Only back is disabled.
-        when(mItemDelegate.canCurrentTabGoBack()).thenReturn(false);
-        List<Integer> expected_disabled = Arrays.asList(R.id.contextmenu_back);
-        initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.NORMAL, params);
-        checkMenuOptions(expected_disabled, expected);
-
-        // Both back and forward are disabled.
-        when(mItemDelegate.canCurrentTabGoForward()).thenReturn(false);
-        expected_disabled = Arrays.asList(R.id.contextmenu_back, R.id.contextmenu_forward);
-        initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.NORMAL, params);
-        checkMenuOptions(expected_disabled, expected);
-
-        // Only forward is disabled.
-        when(mItemDelegate.canCurrentTabGoBack()).thenReturn(true);
-        expected_disabled = Arrays.asList(R.id.contextmenu_forward);
-        initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.NORMAL, params);
-        checkMenuOptions(expected_disabled, expected);
-    }
-
-    @Test
-    @SmallTest
-    @UiThreadTest
     public void testPageNotOnDesktop() {
         FirstRunStatus.setFirstRunFlowComplete(true);
         ContextMenuParams params =
@@ -1772,27 +1717,24 @@
                         /* additionalNavigationParams= */ null);
         DownloadUtils.setIsDownloadRestrictedByPolicyForTesting(true);
 
-        int[] expected1 = {
-            R.id.contextmenu_back, R.id.contextmenu_forward, R.id.contextmenu_reload
-        };
-        int[] expected2 = {
+        int[] expectedPage = {
             R.id.contextmenu_save_page, R.id.contextmenu_share_page, R.id.contextmenu_print_page
         };
-        int[] expected3 = {R.id.contextmenu_inspect_element};
+        int[] expectedDevtools = {R.id.contextmenu_inspect_element};
         List<Integer> expected_disabled = Arrays.asList(R.id.contextmenu_save_page);
 
         initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.NORMAL, params);
-        checkMenuOptions(expected_disabled, expected1, expected2, expected3);
+        checkMenuOptions(expected_disabled, expectedPage, expectedDevtools);
 
         initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.CUSTOM_TAB, params);
-        checkMenuOptions(expected_disabled, expected1, expected2, expected3);
+        checkMenuOptions(expected_disabled, expectedPage, expectedDevtools);
 
         initializePopulatorOnDesktop(ChromeContextMenuPopulator.ContextMenuMode.WEB_APP, params);
-        checkMenuOptions(expected_disabled, expected1, expected2, expected3);
+        checkMenuOptions(expected_disabled, expectedPage, expectedDevtools);
 
         initializePopulatorOnDesktop(
                 ChromeContextMenuPopulator.ContextMenuMode.NETWORK_BOUND_TAB, params);
-        checkMenuOptions(expected_disabled, expected1, expected2, expected3);
+        checkMenuOptions(expected_disabled, expectedPage, expectedDevtools);
     }
 
     @Test
@@ -1821,7 +1763,6 @@
                         /* additionalNavigationParams= */ null);
 
         int[][] expected = {
-            {R.id.contextmenu_back, R.id.contextmenu_forward, R.id.contextmenu_reload},
             {R.id.contextmenu_save_page, R.id.contextmenu_share_page},
             {R.id.contextmenu_inspect_element},
         };
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewTest.java
index 84c038a4..f1a77ac 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemViewTest.java
@@ -75,7 +75,7 @@
                     mModel =
                             new PropertyModel.Builder(
                                             ContextMenuItemWithIconButtonProperties.ALL_KEYS)
-                                    .with(ContextMenuItemWithIconButtonProperties.TEXT, "")
+                                    .with(ContextMenuItemWithIconButtonProperties.TITLE, "")
                                     .with(ContextMenuItemWithIconButtonProperties.ENABLED, true)
                                     .with(
                                             ContextMenuItemWithIconButtonProperties.BUTTON_IMAGE,
@@ -107,7 +107,7 @@
     @UiThreadTest
     public void testText() {
         ThreadUtils.runOnUiThreadBlocking(
-                () -> mModel.set(ContextMenuItemWithIconButtonProperties.TEXT, TEXT));
+                () -> mModel.set(ContextMenuItemWithIconButtonProperties.TITLE, TEXT));
         assertThat("Incorrect item text.", mText.getText(), equalTo(TEXT));
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
index b8f3dfea..8d98147 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
@@ -35,6 +35,7 @@
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.components.embedder_support.contextmenu.ContextMenuSwitches;
+import org.chromium.ui.listmenu.ListMenuItemProperties;
 import org.chromium.ui.modelutil.LayoutViewBuilder;
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
@@ -248,8 +249,11 @@
     }
 
     private PropertyModel getItemModel(String title) {
-        return new PropertyModel.Builder(ContextMenuItemProperties.ALL_KEYS)
-                .with(ContextMenuItemProperties.TEXT, title)
+        return new PropertyModel.Builder(
+                        ListMenuItemProperties.MENU_ITEM_ID,
+                        ListMenuItemProperties.TITLE,
+                        ListMenuItemProperties.ENABLED)
+                .with(ListMenuItemProperties.TITLE, title)
                 .build();
     }
 
@@ -261,7 +265,7 @@
                                 UrlUtils.getIsolatedTestFilePath(
                                         "chrome/test/data/android/UiCapture/dots.png")));
         return new PropertyModel.Builder(ContextMenuItemWithIconButtonProperties.ALL_KEYS)
-                .with(ContextMenuItemWithIconButtonProperties.TEXT, title)
+                .with(ContextMenuItemWithIconButtonProperties.TITLE, title)
                 .with(ContextMenuItemWithIconButtonProperties.ENABLED, true)
                 .with(ContextMenuItemWithIconButtonProperties.BUTTON_IMAGE, drawable)
                 .build();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
index 77914253..fd486db 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
@@ -15,6 +15,8 @@
 import static org.mockito.Mockito.when;
 
 import static org.chromium.chrome.browser.contextmenu.ContextMenuCoordinator.ListItemType.CONTEXT_MENU_ITEM;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.TITLE;
 
 import android.content.ClipData;
 import android.content.ClipboardManager;
@@ -1306,7 +1308,7 @@
         List<Integer> actualItems = new ArrayList<>();
         for (int i = 0; i < menu.getCount(); i++) {
             if (menu.getItem(i).type >= CONTEXT_MENU_ITEM) {
-                actualItems.add(menu.getItem(i).model.get(ContextMenuItemProperties.MENU_ID));
+                actualItems.add(menu.getItem(i).model.get(MENU_ITEM_ID));
             }
         }
 
@@ -1320,8 +1322,7 @@
         StringBuilder items = new StringBuilder();
         for (int i = 0; i < menu.getCount(); i++) {
             if (menu.getItem(i).type >= CONTEXT_MENU_ITEM) {
-                items.append("\n")
-                        .append(menu.getItem(i).model.get(ContextMenuItemProperties.TEXT));
+                items.append("\n").append(menu.getItem(i).model.get(TITLE));
             }
         }
         return items.toString();
@@ -1331,8 +1332,8 @@
         StringBuilder itemName = new StringBuilder();
         for (int i = 0; i < menu.getCount(); i++) {
             if (menu.getItem(i).type >= CONTEXT_MENU_ITEM) {
-                if (menu.getItem(i).model.get(ContextMenuItemProperties.MENU_ID) == itemId) {
-                    itemName.append(menu.getItem(i).model.get(ContextMenuItemProperties.TEXT));
+                if (menu.getItem(i).model.get(MENU_ITEM_ID) == itemId) {
+                    itemName.append(menu.getItem(i).model.get(TITLE));
                     return itemName.toString();
                 }
             }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java
index 2749182..f6b7274 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java
@@ -459,7 +459,6 @@
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     Assert.assertTrue(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN));
-                    Assert.assertFalse(mAccountManagerFacade.getCoreAccountInfos().isFulfilled());
                     Assert.assertFalse(mAccountManagerFacade.getAccounts().isFulfilled());
                     Assert.assertEquals(
                             List.of(TestAccounts.ACCOUNT1),
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
index 7c1f1ef..65fca986 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
@@ -10,9 +10,9 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
 
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.ENABLED;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.MENU_ID;
-import static org.chromium.chrome.browser.contextmenu.ContextMenuItemProperties.TEXT;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
+import static org.chromium.ui.listmenu.ListMenuItemProperties.TITLE;
 
 import android.app.Activity;
 import android.graphics.Rect;
@@ -562,11 +562,11 @@
 
     private ListItem createListItem(@Item int item, boolean enabled) {
         final PropertyModel model =
-                new PropertyModel.Builder(ContextMenuItemProperties.ALL_KEYS)
-                        .with(MENU_ID, ChromeContextMenuItem.getMenuId(item))
+                new PropertyModel.Builder(MENU_ITEM_ID, TITLE, ENABLED)
+                        .with(MENU_ITEM_ID, ChromeContextMenuItem.getMenuId(item))
                         .with(ENABLED, enabled)
                         .with(
-                                TEXT,
+                                TITLE,
                                 ChromeContextMenuItem.getTitle(mActivity, mProfile, item, false))
                         .build();
         return new ListItem(ListItemType.CONTEXT_MENU_ITEM, model);
@@ -575,10 +575,10 @@
     private ListItem createShareListItem(@Item int item) {
         final PropertyModel model =
                 new PropertyModel.Builder(ContextMenuItemWithIconButtonProperties.ALL_KEYS)
-                        .with(MENU_ID, ChromeContextMenuItem.getMenuId(item))
+                        .with(MENU_ITEM_ID, ChromeContextMenuItem.getMenuId(item))
                         .with(ENABLED, true)
                         .with(
-                                TEXT,
+                                TITLE,
                                 ChromeContextMenuItem.getTitle(mActivity, mProfile, item, false))
                         .build();
         return new ListItem(ListItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON, model);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java
index 64549be..fcb7e7ed9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java
@@ -39,6 +39,7 @@
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.CustomTabProfileType;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.CustomTabsUiType;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.TitleVisibility;
 import org.chromium.chrome.browser.flags.ActivityType;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.ui.base.TestActivity;
@@ -85,7 +86,7 @@
                 mIntentDataProvider.shouldEnableUrlBarHiding());
         assertEquals(
                 "Page title should be visible.",
-                CustomTabsIntent.SHOW_PAGE_TITLE,
+                TitleVisibility.VISIBLE,
                 mIntentDataProvider.getTitleVisibilityState());
         assertEquals(
                 "Ui type should be AUTH_TAB.",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinatorUnitTest.java
index 6f12c4d..d8ec3c12 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinatorUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinatorUnitTest.java
@@ -43,6 +43,7 @@
 import org.chromium.chrome.browser.share.ShareDelegateSupplier;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
+import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager;
 import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.url.GURL;
 
@@ -70,6 +71,7 @@
     @Mock private PendingIntent mPendingIntent;
     @Mock private Activity mActivity;
     @Mock private ToolbarManager mToolbarManager;
+    @Mock private DesktopWindowStateManager mDesktopWindowStateManager;
 
     private Activity mActivityForResources;
     private CustomTabActivityTabController mTabController;
@@ -91,6 +93,7 @@
                         mCloseButtonVisibilityManager,
                         mVisibilityDelegate,
                         mToolbarColorController,
+                        mDesktopWindowStateManager,
                         mCompositorContentInitializer);
 
         ShareDelegateSupplier.setInstanceForTesting(mShareDelegateSupplier);
diff --git a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/Player.java b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/Player.java
index d6cde8a..92518f6 100644
--- a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/Player.java
+++ b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/Player.java
@@ -36,7 +36,7 @@
         BottomSheetController getBottomSheetController();
 
         /** Returns true if highlighting is supported. */
-        boolean isHighlightingSupported();
+        boolean isHighlightingSupported(PlaybackMode playbackMode);
 
         /** Set highlighter mode. */
         void setHighlighterMode(@Highlighter.Mode int mode);
@@ -149,12 +149,12 @@
     default void destroy() {}
 
     /** Show the mini player, called when playback is requested. */
-    default void playTabRequested() {}
+    default void playTabRequested(PlaybackMode playbackMode) {}
 
     /**
      * Update players when playback is ready.
      *
-     * @param playback             New Playback object.
+     * @param playback New Playback object.
      * @param currentPlaybackState Playback state.
      */
     default void playbackReady(
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 2fd52c4..65184d5 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -7413,7 +7413,21 @@
   <message name="IDS_FLOATING_WORKSPACE_STARTUP_DIALOG_BUTTON" desc="Button for floating workspace dialog that closes the dialog without waiting for browser and app windows to be restored.">
     Don't restore windows
   </message>
-
+  <message name="IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_TITLE" desc="Title for floating workspace network dialog which is shown when there is no network connection.">
+    Network not available
+  </message>
+  <message name="IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_SUBTITLE" desc="Subtitle for floating workspace network dialog which is shown when there is no network connection.">
+    Internet connection is required.
+  </message>
+  <message name="IDS_FLOATING_WORKSPACE_ERROR_DIALOG_TITLE" desc="Title for floating dialog error screen which is shown when floating workspace can not restore the session.">
+    Can't restore windows from your previous session
+  </message>
+  <message name="IDS_FLOATING_WORKSPACE_ERROR_DIALOG_SUBTITLE" desc="Subtitle for floating dialog error screen which is shown when floating workspace can not restore the session.">
+    An error occured
+  </message>
+  <message name="IDS_FLOATING_WORKSPACE_ERROR_DIALOG_BUTTON" desc="Button for floating workspace error dialog that disables floating workspace and closes the dialog after the error screen is shown.">
+    Continue to new session
+  </message>
 
   <!-- Shortcut Accessibility Label-->
   <message name="IDS_APP_SHORTCUT_ACCESSIBILITY_LABEL"
diff --git a/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_BUTTON.png.sha1
new file mode 100644
index 0000000..1952e4d
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_BUTTON.png.sha1
@@ -0,0 +1 @@
+bd890f7d0a968337e4a2d863534764227e38fe79
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_SUBTITLE.png.sha1
new file mode 100644
index 0000000..1952e4d
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+bd890f7d0a968337e4a2d863534764227e38fe79
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..1952e4d
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_ERROR_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+bd890f7d0a968337e4a2d863534764227e38fe79
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_SUBTITLE.png.sha1
new file mode 100644
index 0000000..aa05784
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+840809863272a9dfbe1b5e03aeec9117c2ac4acc
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..aa05784
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_FLOATING_WORKSPACE_NETWORK_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+840809863272a9dfbe1b5e03aeec9117c2ac4acc
\ No newline at end of file
diff --git a/chrome/app/profiles_strings.grdp b/chrome/app/profiles_strings.grdp
index d9c8e5b4..5c74856 100644
--- a/chrome/app/profiles_strings.grdp
+++ b/chrome/app/profiles_strings.grdp
@@ -1131,7 +1131,7 @@
     <message translateable="false" name="IDS_HISTORY_SYNC_OPT_IN_ACCEPT_BUTTON" desc="">
       Yes, I 'm in
     </message>
-    <message translateable="false" name="IDS_HISTORY_SYNC_OPT_IN_CANCEL_BUTTON" desc="">
+    <message translateable="false" name="IDS_HISTORY_SYNC_OPT_IN_REJECT_BUTTON" desc="">
       No thanks
     </message>
     <!-- History Sync Opt-in Expansion Pill Desktop -->
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index c5a28069..b5d09a4 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4371,6 +4371,7 @@
       "//chrome/browser/ui/page_action:icon_type",
       "//chrome/browser/ui/privacy_sandbox",
       "//chrome/browser/ui/send_tab_to_self",
+      "//chrome/browser/ui/webui/access_code_cast",
 
       # TODO(413315837): Remove this dependency when chrome/browser/privacy_sandbox
       # gets modularized.
@@ -4579,6 +4580,10 @@
       "//chrome/browser/ui/tabs/tab_strip_api:impl",
       "//chrome/browser/ui/bookmarks:impl",
       "//chrome/browser/ui/promos:impl",
+
+      # TODO(crbug.com/364667551): It includes
+      # //c/b/signin/identity_manager_factory.h.
+      "//chrome/browser/ui/webui/access_code_cast",
     ]
 
     #!is_android
@@ -4647,6 +4652,7 @@
 
       deps += [
         "//chrome/browser/shortcuts",
+        "//chrome/browser/ui/webui/app_home",
         "//chrome/browser/ui/webui/signin:profile",
         "//chrome/browser/ui/webui/signin:profile_impl",
       ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 84d3f6e..9b6739a 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -9111,11 +9111,6 @@
      flag_descriptions::kFedCmMultiIdpDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kFedCmMultipleIdentityProviders)},
 
-    {"fedcm-selective-disclosure",
-     flag_descriptions::kFedCmSelectiveDisclosureName,
-     flag_descriptions::kFedCmSelectiveDisclosureDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kFedCmSelectiveDisclosure)},
-
     {"fedcm-show-filtered-accounts",
      flag_descriptions::kFedCmShowFilteredAccountsName,
      flag_descriptions::kFedCmShowFilteredAccountsDescription, kOsAll,
@@ -9675,6 +9670,15 @@
      flag_descriptions::kReduceTransferSizeUpdatedIPCDescription, kOsAll,
      FEATURE_VALUE_TYPE(network::features::kReduceTransferSizeUpdatedIPC)},
 
+#if BUILDFLAG(IS_LINUX)
+    {"reduce-user-agent-data-linux-platform-version",
+     flag_descriptions::kReduceUserAgentDataLinuxPlatformVersionName,
+     flag_descriptions::kReduceUserAgentDataLinuxPlatformVersionDescription,
+     kOsLinux,
+     FEATURE_VALUE_TYPE(
+         blink::features::kReduceUserAgentDataLinuxPlatformVersion)},
+#endif  // BUILDFLAG(IS_LINUX)
+
 #if BUILDFLAG(IS_CHROMEOS)
     {"enable-variable-refresh-rate",
      flag_descriptions::kEnableVariableRefreshRateName,
diff --git a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
index b3f74b4..5e2314f 100644
--- a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
+++ b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
@@ -106,6 +106,40 @@
     }
 
     /**
+     * Defines whether the page title on the toolbar should be Visible, Hidden, or Visible only in
+     * Desktop Mode.
+     */
+    @IntDef({TitleVisibility.HIDDEN, TitleVisibility.VISIBLE, TitleVisibility.VISIBLE_IN_DESKTOP})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface TitleVisibility {
+        // Always hide
+        int HIDDEN = 0;
+        // Always show
+        int VISIBLE = 1;
+        // Only show in Desktop Mode
+        int VISIBLE_IN_DESKTOP = 2;
+    }
+
+    /**
+     * Converts from AndroidX's {@link CustomTabsIntent} values of title bar visibility to {@link
+     * TitleVisibility}.
+     *
+     * @see CustomTabsIntent.EXTRA_TITLE_VISIBILITY_STATE
+     */
+    public static @TitleVisibility int customTabIntentTitleBarVisibility(
+            int intentValue, boolean isTWA) {
+        switch (intentValue) {
+            case CustomTabsIntent.NO_TITLE:
+                if (isTWA) return TitleVisibility.VISIBLE_IN_DESKTOP;
+                else return TitleVisibility.HIDDEN;
+            case CustomTabsIntent.SHOW_PAGE_TITLE:
+                return TitleVisibility.VISIBLE;
+            default:
+                return TitleVisibility.HIDDEN;
+        }
+    }
+
+    /**
      * Side sheet's default slide-in behavior. Same as {@link
      * ACTIVITY_SIDE_SHEET_SLIDE_IN_FROM_SIDE}.
      */
@@ -237,8 +271,8 @@
     /**
      * @return The title visibility state for the toolbar.
      */
-    public int getTitleVisibilityState() {
-        return CustomTabsIntent.NO_TITLE;
+    public @TitleVisibility int getTitleVisibilityState() {
+        return TitleVisibility.HIDDEN;
     }
 
     /**
diff --git a/chrome/browser/ash/login/screens/device_disabled_screen.cc b/chrome/browser/ash/login/screens/device_disabled_screen.cc
index fac0656b..03ca041 100644
--- a/chrome/browser/ash/login/screens/device_disabled_screen.cc
+++ b/chrome/browser/ash/login/screens/device_disabled_screen.cc
@@ -56,7 +56,7 @@
   params.restriction_schedule_end_time =
       DeviceRestrictionScheduleController().RestrictionScheduleEndTime();
   view_->Show(params);
-  DeviceDisablingManager()->AddObserver(this);
+  observation_.Observe(DeviceDisablingManager());
 }
 
 void DeviceDisabledScreen::HideImpl() {
diff --git a/chrome/browser/ash/login/screens/device_disabled_screen.h b/chrome/browser/ash/login/screens/device_disabled_screen.h
index f1df979a..c4530e83 100644
--- a/chrome/browser/ash/login/screens/device_disabled_screen.h
+++ b/chrome/browser/ash/login/screens/device_disabled_screen.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_ASH_LOGIN_SCREENS_DEVICE_DISABLED_SCREEN_H_
 
 #include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
 #include "chrome/browser/ash/login/screens/base_screen.h"
 #include "chrome/browser/ash/system/device_disabling_manager.h"
 
@@ -34,6 +35,8 @@
   void HideImpl() override;
 
   base::WeakPtr<DeviceDisabledScreenView> view_;
+  base::ScopedObservation<system::DeviceDisablingManager, DeviceDisabledScreen>
+      observation_{this};
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/system/device_disabling_manager.h b/chrome/browser/ash/system/device_disabling_manager.h
index 85b4ef28..9041961 100644
--- a/chrome/browser/ash/system/device_disabling_manager.h
+++ b/chrome/browser/ash/system/device_disabling_manager.h
@@ -12,6 +12,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/observer_list_types.h"
 #include "chromeos/ash/components/policy/restriction_schedule/device_restriction_schedule_controller.h"
 #include "chromeos/ash/components/settings/cros_settings.h"
 
@@ -55,11 +56,11 @@
  public:
   using DeviceDisabledCheckCallback = base::OnceCallback<void(bool)>;
 
-  class Observer {
+  class Observer : public base::CheckedObserver {
    public:
     Observer& operator=(const Observer&) = delete;
 
-    virtual ~Observer();
+    ~Observer() override;
 
     virtual void OnDisabledMessageChanged(
         const std::string& disabled_message) = 0;
@@ -138,7 +139,7 @@
   raw_ptr<CrosSettings> cros_settings_;
   raw_ptr<user_manager::UserManager> user_manager_;
 
-  base::ObserverList<Observer>::UncheckedAndDanglingUntriaged observers_;
+  base::ObserverList<Observer> observers_;
 
   base::CallbackListSubscription device_disabled_subscription_;
   base::CallbackListSubscription disabled_message_subscription_;
diff --git a/chrome/browser/autofill/android/java/res/layout/editable_option_editor_footer.xml b/chrome/browser/autofill/android/java/res/layout/editable_option_editor_footer.xml
index 162856d..ef175277 100644
--- a/chrome/browser/autofill/android/java/res/layout/editable_option_editor_footer.xml
+++ b/chrome/browser/autofill/android/java/res/layout/editable_option_editor_footer.xml
@@ -18,7 +18,8 @@
         android:layout_marginStart="@dimen/pref_autofill_field_horizontal_padding"
         android:layout_marginEnd="@dimen/pref_autofill_field_horizontal_padding"
         android:textAppearance="@style/TextAppearance.TextSmall.Secondary"
-        android:text="@string/payments_required_field_message" />
+        android:text="@string/payments_required_field_message"
+        android:importantForAccessibility="no"/>
 
     <TextView
         android:id="@+id/footer_message"
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java
index da14d11..c8ac0a25 100644
--- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java
@@ -25,6 +25,7 @@
 import android.widget.TextView.OnEditorActionListener;
 
 import androidx.core.view.ViewCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 
 import com.google.android.material.textfield.TextInputLayout;
 
@@ -170,10 +171,25 @@
     void setLabel(String label, boolean isRequired) {
         // Build up the label. Required fields are indicated by appending a '*'.
         if (isRequired) {
+            // TODO(crbug.com/417413188): Fix a bug where label is announced too many times.
+            // Build the accessibility description manually by combining "required" string with  the
+            // label, because '*' are not announced by the screen reader and it is more informative.
+            final int requiredFieldContentDescriptionId =
+                    R.string.autofill_address_edit_dialog_required_field_content_description;
+            final String labelForAccessibility =
+                    getContext().getString(requiredFieldContentDescriptionId, label);
+            mInputLayout.setTextInputAccessibilityDelegate(
+                    new TextInputLayout.AccessibilityDelegate(mInputLayout) {
+                        @Override
+                        public void onInitializeAccessibilityNodeInfo(
+                                View host, AccessibilityNodeInfoCompat info) {
+                            super.onInitializeAccessibilityNodeInfo(host, info);
+                            info.setText(labelForAccessibility);
+                        }
+                    });
             label += REQUIRED_FIELD_INDICATOR;
         }
         mInputLayout.setHint(label);
-        mInput.setContentDescription(label);
     }
 
     void setValidator(@Nullable EditorFieldValidator validator) {
diff --git a/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/TextFieldViewUnitTest.java b/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/TextFieldViewUnitTest.java
index 13311671..0ab4075 100644
--- a/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/TextFieldViewUnitTest.java
+++ b/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/TextFieldViewUnitTest.java
@@ -4,7 +4,10 @@
 
 package org.chromium.chrome.browser.autofill.editors;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
@@ -17,7 +20,9 @@
 import android.app.Activity;
 import android.text.Editable;
 import android.view.View;
+import android.view.View.AccessibilityDelegate;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.AutoCompleteTextView;
 import android.widget.LinearLayout;
 
@@ -30,6 +35,7 @@
 import org.robolectric.Robolectric;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.autofill.R;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 import org.chromium.ui.text.EmptyTextWatcher;
@@ -41,6 +47,8 @@
     private ViewGroup mContentView;
     private View mOtherFocusableField;
 
+    private static final String FIELD_LABEL = "label";
+
     @Before
     public void setUp() {
         mActivity = Robolectric.setupActivity(Activity.class);
@@ -51,7 +59,7 @@
 
     private PropertyModel buildDefaultPropertyModel() {
         return new PropertyModel.Builder(TEXT_ALL_KEYS)
-                .with(LABEL, "label")
+                .with(LABEL, FIELD_LABEL)
                 .with(VALUE, "value")
                 .build();
     }
@@ -343,4 +351,54 @@
 
         assertTrue(field.validate());
     }
+
+    /**
+     * Test that "required" string is announced and "*" is added to the hint when field is marked as
+     * required.
+     */
+    @Test
+    public void testRequiredFieldHasCorrectLabelAndAccessibility() {
+        PropertyModel model = buildDefaultPropertyModel();
+        model.set(IS_REQUIRED, true);
+
+        TextInputLayout inputLayout = attachTextFieldView(model).getInputLayoutForTesting();
+        AccessibilityDelegate delegate = inputLayout.getEditText().getAccessibilityDelegate();
+        assertNotNull(delegate);
+
+        AccessibilityNodeInfo infoNode = AccessibilityNodeInfo.obtain();
+        delegate.onInitializeAccessibilityNodeInfo(inputLayout, infoNode);
+
+        assertEquals(
+                infoNode.getText().toString(),
+                mActivity.getString(
+                        R.string.autofill_address_edit_dialog_required_field_content_description,
+                        FIELD_LABEL));
+        assertTrue(
+                inputLayout.getHint().toString().contains(TextFieldView.REQUIRED_FIELD_INDICATOR));
+    }
+
+    /**
+     * Test that "required" string is not announced and "*" is not added to the hint when field is
+     * not marked as required.
+     */
+    @Test
+    public void testNonRequiredFieldHasCorrectLabelAndAccessibility() {
+        PropertyModel model = buildDefaultPropertyModel();
+        model.set(IS_REQUIRED, false);
+
+        TextInputLayout inputLayout = attachTextFieldView(model).getInputLayoutForTesting();
+        AccessibilityDelegate delegate = inputLayout.getEditText().getAccessibilityDelegate();
+        assertNotNull(delegate);
+
+        AccessibilityNodeInfo infoNode = AccessibilityNodeInfo.obtain();
+        delegate.onInitializeAccessibilityNodeInfo(inputLayout, infoNode);
+
+        assertNotEquals(
+                infoNode.getText().toString(),
+                mActivity.getString(
+                        R.string.autofill_address_edit_dialog_required_field_content_description,
+                        FIELD_LABEL));
+        assertFalse(
+                inputLayout.getHint().toString().contains(TextFieldView.REQUIRED_FIELD_INDICATOR));
+    }
 }
diff --git a/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/HistorySyncPromoCoordinator.java b/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/HistorySyncPromoCoordinator.java
index c64da34..46f2f7e6 100644
--- a/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/HistorySyncPromoCoordinator.java
+++ b/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/HistorySyncPromoCoordinator.java
@@ -67,7 +67,7 @@
                             onModuleClickedCallback.run();
                         });
 
-        Profile profile = mActionDelegate.getProfileSupplier().get();
+        Profile profile = mActionDelegate.getProfileSupplier().get().getOriginalProfile();
         assert profile != null;
 
         mIdentityManager = IdentityServicesProvider.get().getIdentityManager(profile);
diff --git a/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediatorUnitTest.java b/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediatorUnitTest.java
index eda5b124..353324e 100644
--- a/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediatorUnitTest.java
+++ b/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediatorUnitTest.java
@@ -82,6 +82,7 @@
         // Setup for History sync promo
         mProfileSupplier = new ObservableSupplierImpl<>();
         mProfileSupplier.set(mProfile);
+        when(mProfile.getOriginalProfile()).thenReturn(mProfile);
         when(mActionDelegate.getProfileSupplier()).thenReturn(mProfileSupplier);
         IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider);
         when(mIdentityServicesProvider.getIdentityManager(mProfile)).thenReturn(mIdentityManager);
diff --git a/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/HistorySyncPromoCoordinatorUnitTest.java b/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/HistorySyncPromoCoordinatorUnitTest.java
index 56a53cf..c3e3b67 100644
--- a/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/HistorySyncPromoCoordinatorUnitTest.java
+++ b/chrome/browser/educational_tip/junit/src/org/chromium/chrome/browser/educational_tip/HistorySyncPromoCoordinatorUnitTest.java
@@ -51,6 +51,7 @@
     public void setUp() {
         mProfileSupplier = new ObservableSupplierImpl<>();
         mProfileSupplier.set(mProfile);
+        when(mProfile.getOriginalProfile()).thenReturn(mProfile);
         IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider);
         when(mActionDelegate.getProfileSupplier()).thenReturn(mProfileSupplier);
         IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider);
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_private_api_unittest.cc b/chrome/browser/extensions/api/autofill_private/autofill_private_api_unittest.cc
index e430684..1121c6a4 100644
--- a/chrome/browser/extensions/api/autofill_private/autofill_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/autofill_private/autofill_private_api_unittest.cc
@@ -389,21 +389,13 @@
   autofill_client()->set_entity_data_manager(
       autofill::AutofillEntityDataManagerFactory::GetForProfile(profile()));
   autofill_client()->SetUpPrefsAndIdentityForAutofillAi();
-  EXPECT_TRUE(autofill::SetAutofillAiOptInStatus(*autofill_client(), false));
-  EXPECT_FALSE(autofill::GetAutofillAiOptInStatus(*autofill_client()));
-  EXPECT_TRUE(RunAutofillSubtest("verifyUserOptedOutOfAutofillAi"));
 
   ASSERT_TRUE(autofill::MayPerformAutofillAiAction(
       *autofill_client(), autofill::AutofillAiAction::kOptIn));
-
-  // Verify that we can opt into Autofill AI while eligible.
-  ASSERT_TRUE(RunAutofillSubtest("optIntoAutofillAi"));
-  EXPECT_TRUE(autofill::GetAutofillAiOptInStatus(*autofill_client()));
-  EXPECT_TRUE(RunAutofillSubtest("verifyUserOptedIntoAutofillAi"));
+  EXPECT_TRUE(autofill::SetAutofillAiOptInStatus(*autofill_client(), true));
 
   // Verify that we can opt out of Autofill AI while eligible.
   ASSERT_TRUE(RunAutofillSubtest("optOutOfAutofillAi"));
-  EXPECT_FALSE(autofill::GetAutofillAiOptInStatus(*autofill_client()));
   EXPECT_TRUE(RunAutofillSubtest("verifyUserOptedOutOfAutofillAi"));
 
   // Become ineligible.
@@ -413,7 +405,6 @@
 
   // Verify that we cannot opt into Autofill AI anymore.
   ASSERT_TRUE(RunAutofillSubtest("optIntoAutofillAi"));
-  EXPECT_FALSE(autofill::GetAutofillAiOptInStatus(*autofill_client()));
   EXPECT_TRUE(RunAutofillSubtest("verifyUserOptedOutOfAutofillAi"));
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 656472f2..97aac0a 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1662,6 +1662,11 @@
     "expiry_milestone": 145
   },
   {
+      "name": "colorful-tab-group",
+      "owners": ["gambard@google.com", "bling-flags@google.com"],
+      "expiry_milestone": 140
+  },
+  {
     "name": "compare-confirmation-toast",
     "owners": ["mdjones@chromium.org", "meiliang@chromium.org", "chrome-shopping-eng@google.com"],
     "expiry_milestone": 135
@@ -4879,11 +4884,6 @@
     "expiry_milestone": 145
   },
   {
-    "name": "fedcm-selective-disclosure",
-    "owners": ["goto@chromium.org", "web-identity-eng@google.com"],
-    "expiry_milestone": 140
-  },
-  {
     "name": "fedcm-show-filtered-accounts",
     "owners": ["npm@chromium.org", "web-identity-eng@google.com"],
     "expiry_milestone": 137
@@ -8090,6 +8090,11 @@
     "expiry_milestone": 130
   },
   {
+    "name": "reduce-user-agent-data-linux-platform-version",
+    "owners": [ "bershanskyi@gmail.com", "miketaylr@chromium.org", "victortan@chromium.org" ],
+    "expiry_milestone": 150
+  },
+  {
     "name": "reengagement-notification",
     "owners": [ "dtrainor@chromium.org", "xingliu@chromium.org" ],
     "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 5ca6938..9dc7d9f5 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2076,11 +2076,6 @@
     "Allows the FedCM API to request multiple identity providers "
     "simultaneously. Requires FedCM to be enabled as well.";
 
-const char kFedCmSelectiveDisclosureName[] = "FedCmSelectiveDisclosure";
-const char kFedCmSelectiveDisclosureDescription[] =
-    "Allows a relying party to selectively request a set of identity "
-    "attributes to be disclosed.";
-
 const char kFedCmShowFilteredAccountsName[] = "FedCmShowFilteredAccounts";
 const char kFedCmShowFilteredAccountsDescription[] =
     "Allows the FedCM API to show filtered accounts greyed out.";
@@ -3509,6 +3504,13 @@
     "When enabled, the network service will send TransferSizeUpdatedIPC IPC "
     "only when DevTools is attached or the request is for an ad request.";
 
+#if BUILDFLAG(IS_LINUX)
+const char kReduceUserAgentDataLinuxPlatformVersionName[] =
+    "Reduce Linux platform version Client Hint";
+const char kReduceUserAgentDataLinuxPlatformVersionDescription[] =
+    "Set platform version Client Hint on Linux to empty string.";
+#endif  // BUILDFLAG(IS_LINUX)
+
 #if BUILDFLAG(IS_ANDROID)
 const char kReplaceSyncPromosWithSignInPromosName[] =
     "Replace all sync-related UI with sign-in ones";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 958be59..6f4ca4a 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1197,9 +1197,6 @@
 extern const char kFedCmQuietUiName[];
 extern const char kFedCmQuietUiDescription[];
 
-extern const char kFedCmSelectiveDisclosureName[];
-extern const char kFedCmSelectiveDisclosureDescription[];
-
 extern const char kFedCmShowFilteredAccountsName[];
 extern const char kFedCmShowFilteredAccountsDescription[];
 
@@ -2578,6 +2575,11 @@
 extern const char kReduceTransferSizeUpdatedIPCName[];
 extern const char kReduceTransferSizeUpdatedIPCDescription[];
 
+#if BUILDFLAG(IS_LINUX)
+extern const char kReduceUserAgentDataLinuxPlatformVersionName[];
+extern const char kReduceUserAgentDataLinuxPlatformVersionDescription[];
+#endif  // #if BUILDFLAG(IS_LINUX)
+
 extern const char kResetAudioSelectionImprovementPrefName[];
 extern const char kResetAudioSelectionImprovementPrefDescription[];
 
diff --git a/chrome/browser/headless/headless_mode_protocol_browsertest.cc b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
index 65fed52c..3432391 100644
--- a/chrome/browser/headless/headless_mode_protocol_browsertest.cc
+++ b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
@@ -387,4 +387,9 @@
     "sanity/create-target-secondary-screen.js",
     "--screen-info={label='#1'}{label='#2'}")
 
+HEADLESS_MODE_PROTOCOL_TEST_WITH_COMMAND_LINE_EXTRAS(
+    WindowOpenPopupPlacement,
+    "sanity/window-open-popup-placement.js",
+    "--screen-info={1600x1200} --disable-popup-blocking")
+
 }  // namespace headless
diff --git a/chrome/browser/headless/test/data/protocol/sanity/window-open-popup-placement-expected.txt b/chrome/browser/headless/test/data/protocol/sanity/window-open-popup-placement-expected.txt
new file mode 100644
index 0000000..c94f22060
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/sanity/window-open-popup-placement-expected.txt
@@ -0,0 +1,2 @@
+Tests popup window open placement.
+Popup: {10,20 600x399}
\ No newline at end of file
diff --git a/chrome/browser/headless/test/data/protocol/sanity/window-open-popup-placement.js b/chrome/browser/headless/test/data/protocol/sanity/window-open-popup-placement.js
new file mode 100644
index 0000000..ef408f8f
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/sanity/window-open-popup-placement.js
@@ -0,0 +1,52 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function(testRunner) {
+  const {session, dp} =
+      await testRunner.startBlank('Tests popup window open placement.');
+
+  const {sessionId} =
+      (await testRunner.browserP().Target.attachToBrowserTarget({})).result;
+  const bp = (new TestRunner.Session(testRunner, sessionId)).protocol;
+
+  const HttpInterceptor =
+      await testRunner.loadScriptAbsolute('../resources/http-interceptor.js');
+  const httpInterceptor = await (new HttpInterceptor(testRunner, bp)).init();
+  httpInterceptor.setDisableRequestedUrlsLogging(true);
+
+  httpInterceptor.addResponse('https://example.com/index.html', `
+      <html>
+      <head><link rel="icon" href="data:,"></head>
+      <script>
+          const popup = window.open('/page2.html', '_blank',
+              'popup, left=10, top=20, width=600, height=400');
+          if (!popup) {
+            console.log('Failed to create popup');
+          } else {
+            popup.addEventListener('load', async () => {
+              console.log('Popup: ' +
+                  '{' + popup.screenLeft + ',' + popup.screenTop +
+                  ' ' + popup.innerWidth + 'x' + popup.innerHeight +
+                  '}');
+            });
+          }
+      </script>
+      </html>
+  `);
+
+  httpInterceptor.addResponse(
+      'https://example.com/page2.html', `<body>Page2</body>`);
+
+  await dp.Browser.grantPermissions({permissions: ['windowManagement']});
+
+  dp.Runtime.enable();
+  const readyPromise = dp.Runtime.onceConsoleAPICalled();
+
+  session.navigate('https://example.com/index.html');
+
+  const message = (await readyPromise).params.args[0].value;
+  testRunner.log(message);
+
+  testRunner.completeTest();
+})
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
index b89bd64..4f8bc78 100644
--- a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
+++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -378,7 +378,8 @@
             system_permission_settings::SystemPermission::kAllowed) {
       std::move(pending_request->callback)
           .Run(blink::mojom::StreamDevicesSet(),
-               blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+               blink::mojom::MediaStreamRequestResult::
+                   PERMISSION_DENIED_BY_SYSTEM,
                /*ui=*/nullptr);
       return;
     }
@@ -433,9 +434,10 @@
       system_media_permissions::CheckSystemScreenCapturePermission() !=
           system_permission_settings::SystemPermission::kAllowed) {
     std::move(pending_request->callback)
-        .Run(blink::mojom::StreamDevicesSet(),
-             blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
-             /*ui=*/nullptr);
+        .Run(
+            blink::mojom::StreamDevicesSet(),
+            blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
+            /*ui=*/nullptr);
     return;
   }
 #endif
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc
index 7efbee9..5110c8e 100644
--- a/chrome/browser/media/webrtc/display_media_access_handler.cc
+++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -62,6 +62,11 @@
 #endif
 
 namespace {
+using ::blink::mojom::MediaStreamRequestResult;
+using ::content::DesktopMediaID;
+using ::content::WebContents;
+using ::content::WebContentsMediaCaptureId;
+
 constexpr UrlIdentity::TypeSet allowed_types = {
     UrlIdentity::Type::kDefault, UrlIdentity::Type::kIsolatedWebApp,
     UrlIdentity::Type::kFile, UrlIdentity::Type::kChromeExtension};
@@ -71,7 +76,7 @@
         UrlIdentity::DefaultFormatOptions::kOmitCryptographicScheme}};
 
 // Helper function to get the title of the calling application.
-std::u16string GetApplicationTitle(content::WebContents* web_contents) {
+std::u16string GetApplicationTitle(WebContents* web_contents) {
   DCHECK(web_contents);
   GURL content_origin =
       web_contents->GetPrimaryMainFrame()->GetLastCommittedOrigin().GetURL();
@@ -83,7 +88,7 @@
 
 #if !BUILDFLAG(IS_ANDROID)
 
-bool IsGlicWebUI(const content::WebContents* web_contents) {
+bool IsGlicWebUI(const WebContents* web_contents) {
 #if BUILDFLAG(ENABLE_GLIC)
   return glic::IsGlicWebUI(web_contents);
 #else
@@ -93,14 +98,14 @@
 
 // If bypassing the media selection dialog is allowed for this request, this
 // returns the `DesktopMediaId` to use. Returns a null ID otherwise.
-content::DesktopMediaID GetMediaForSelectionDialogBypass(
+DesktopMediaID GetMediaForSelectionDialogBypass(
     const HostContentSettingsMap& content_settings,
-    content::WebContents* web_contents,
+    WebContents* web_contents,
     const content::MediaStreamRequest& request) {
   // Only bypass for chrome:// URLs.
   if (web_contents->GetLastCommittedURL().scheme() !=
       content::kChromeUIScheme) {
-    return content::DesktopMediaID();
+    return DesktopMediaID();
   }
 
   const GURL& origin_url = web_contents->GetLastCommittedURL();
@@ -108,10 +113,9 @@
   if (request.video_type ==
           blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB &&
       IsGlicWebUI(web_contents)) {
-    content::DesktopMediaID media_id(
-        content::DesktopMediaID::TYPE_WEB_CONTENTS,
-        content::DesktopMediaID::kNullId,
-        content::WebContentsMediaCaptureId(
+    DesktopMediaID media_id(
+        DesktopMediaID::TYPE_WEB_CONTENTS, DesktopMediaID::kNullId,
+        WebContentsMediaCaptureId(
             web_contents->GetPrimaryMainFrame()
                 ->GetProcess()
                 ->GetDeprecatedID(),
@@ -126,11 +130,10 @@
                  origin_url, origin_url,
                  ContentSettingsType::DISPLAY_MEDIA_SYSTEM_AUDIO) ==
                  ContentSetting::CONTENT_SETTING_ALLOW) {
-    return content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
-                                   content::DesktopMediaID::kNullId,
-                                   /*audio_share=*/true);
+    return DesktopMediaID(DesktopMediaID::TYPE_SCREEN, DesktopMediaID::kNullId,
+                          /*audio_share=*/true);
   }
-  return content::DesktopMediaID();
+  return DesktopMediaID();
 }
 
 #endif
@@ -176,7 +179,7 @@
 }
 
 void DisplayMediaAccessHandler::HandleRequest(
-    content::WebContents* web_contents,
+    WebContents* web_contents,
     const content::MediaStreamRequest& request,
     content::MediaResponseCallback callback,
     const extensions::Extension* extension) {
@@ -186,10 +189,9 @@
   if (capture_policy::GetAllowedCaptureLevel(request.security_origin,
                                              web_contents) ==
       AllowedScreenCaptureLevel::kDisallowed) {
-    std::move(callback).Run(
-        blink::mojom::StreamDevicesSet(),
-        blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
-        /*ui=*/nullptr);
+    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                            MediaStreamRequestResult::PERMISSION_DENIED,
+                            /*ui=*/nullptr);
     return;
   }
 
@@ -202,10 +204,9 @@
       safe_browsing::SafeBrowsingUserInteractionObserver::FromWebContents(
           web_contents);
   if (observer) {
-    std::move(callback).Run(
-        blink::mojom::StreamDevicesSet(),
-        blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
-        /*ui=*/nullptr);
+    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                            MediaStreamRequestResult::PERMISSION_DENIED,
+                            /*ui=*/nullptr);
     observer->OnDesktopCaptureRequest();
     return;
   }
@@ -226,9 +227,9 @@
       !web_contents->HasPictureInPictureDocument() &&
       request.request_type != blink::MEDIA_DEVICE_UPDATE) {
     LOG(ERROR) << "Do not allow getDisplayMedia() on a backgrounded page.";
-    std::move(callback).Run(
-        blink::mojom::StreamDevicesSet(),
-        blink::mojom::MediaStreamRequestResult::INVALID_STATE, /*ui=*/nullptr);
+    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                            MediaStreamRequestResult::INVALID_STATE,
+                            /*ui=*/nullptr);
     return;
   }
 #endif  // BUILDFLAG(IS_MAC)
@@ -250,10 +251,9 @@
     content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
         request.render_process_id, request.render_frame_id);
     if (!rfh) {
-      std::move(callback).Run(
-          blink::mojom::StreamDevicesSet(),
-          blink::mojom::MediaStreamRequestResult::INVALID_STATE,
-          /*ui=*/nullptr);
+      std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                              MediaStreamRequestResult::INVALID_STATE,
+                              /*ui=*/nullptr);
       return;
     }
 
@@ -264,10 +264,9 @@
       bad_message::ReceivedBadMessage(
           rfh->GetProcess(), bad_message::BadMessageReason::
                                  RFH_DISPLAY_CAPTURE_PERMISSION_MISSING);
-      std::move(callback).Run(
-          blink::mojom::StreamDevicesSet(),
-          blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
-          /*ui=*/nullptr);
+      std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                              MediaStreamRequestResult::PERMISSION_DENIED,
+                              /*ui=*/nullptr);
       return;
     }
 
@@ -278,10 +277,9 @@
     if (!rfh->HasTransientUserActivation() &&
         capture_policy::IsTransientActivationRequiredForGetDisplayMedia(
             web_contents)) {
-      std::move(callback).Run(
-          blink::mojom::StreamDevicesSet(),
-          blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
-          /*ui=*/nullptr);
+      std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                              MediaStreamRequestResult::PERMISSION_DENIED,
+                              /*ui=*/nullptr);
       return;
     }
   }
@@ -292,7 +290,7 @@
       HostContentSettingsMapFactory::GetForProfile(
           web_contents->GetBrowserContext());
   CHECK(content_settings);
-  content::DesktopMediaID media_id = GetMediaForSelectionDialogBypass(
+  DesktopMediaID media_id = GetMediaForSelectionDialogBypass(
       *content_settings, web_contents, request);
   if (!media_id.is_null()) {
     BypassMediaSelectionDialog(web_contents, request, media_id,
@@ -304,10 +302,9 @@
   // Except for the case when DISPLAY_MEDIA_SYSTEM_AUDIO is allowed, all
   // requests should contain video stream.
   if (request.video_type == blink::mojom::MediaStreamType::NO_SERVICE) {
-    std::move(callback).Run(
-        blink::mojom::StreamDevicesSet(),
-        blink::mojom::MediaStreamRequestResult::NOT_SUPPORTED,
-        /*ui=*/nullptr);
+    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                            MediaStreamRequestResult::NOT_SUPPORTED,
+                            /*ui=*/nullptr);
     return;
   }
 
@@ -340,15 +337,15 @@
 }
 
 void DisplayMediaAccessHandler::ShowMediaSelectionDialog(
-    content::WebContents* web_contents,
+    WebContents* web_contents,
     const content::MediaStreamRequest& request,
     content::MediaResponseCallback callback) {
   std::unique_ptr<DesktopMediaPicker> picker =
       picker_factory_->CreatePicker(&request);
   if (!picker) {
-    std::move(callback).Run(
-        blink::mojom::StreamDevicesSet(),
-        blink::mojom::MediaStreamRequestResult::INVALID_STATE, /*ui=*/nullptr);
+    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                            MediaStreamRequestResult::INVALID_STATE,
+                            /*ui=*/nullptr);
     return;
   }
 
@@ -368,16 +365,15 @@
 }
 
 void DisplayMediaAccessHandler::BypassMediaSelectionDialog(
-    content::WebContents* web_contents,
+    WebContents* web_contents,
     const content::MediaStreamRequest& request,
-    const content::DesktopMediaID& media_id,
+    const DesktopMediaID& media_id,
     content::MediaResponseCallback callback) {
   if (web_contents->GetLastCommittedURL().scheme() !=
       content::kChromeUIScheme) {
-    std::move(callback).Run(
-        blink::mojom::StreamDevicesSet(),
-        blink::mojom::MediaStreamRequestResult::NOT_SUPPORTED,
-        /*ui=*/nullptr);
+    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
+                            MediaStreamRequestResult::NOT_SUPPORTED,
+                            /*ui=*/nullptr);
     return;
   }
   blink::mojom::StreamDevicesSet stream_devices_set;
@@ -390,13 +386,12 @@
       request.disable_local_echo, request.suppress_local_audio_playback,
       /*display_notification=*/false, GetApplicationTitle(web_contents),
       request.captured_surface_control_active, stream_devices);
-  std::move(callback).Run(stream_devices_set,
-                          blink::mojom::MediaStreamRequestResult::OK,
+  std::move(callback).Run(stream_devices_set, MediaStreamRequestResult::OK,
                           std::move(ui));
 }
 
 void DisplayMediaAccessHandler::ProcessChangeSourceRequest(
-    content::WebContents* web_contents,
+    WebContents* web_contents,
     const content::MediaStreamRequest& request,
     content::MediaResponseCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -412,13 +407,14 @@
       /*is_allowlisted_extension=*/false));
   // If this is the only request then pop it. Otherwise, there is already a task
   // scheduled to pop the next request.
-  if (queue.size() == 1)
+  if (queue.size() == 1) {
     ProcessQueuedAccessRequest(queue, web_contents);
+  }
 }
 
 void DisplayMediaAccessHandler::ProcessQueuedAccessRequest(
     const RequestsQueue& queue,
-    content::WebContents* web_contents) {
+    WebContents* web_contents) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(web_contents);
 
@@ -431,8 +427,7 @@
 
   // If Capture is not allowed, then reject.
   if (capture_level == AllowedScreenCaptureLevel::kDisallowed) {
-    RejectRequest(web_contents,
-                  blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED);
+    RejectRequest(web_contents, MediaStreamRequestResult::PERMISSION_DENIED);
     return;
   }
 
@@ -446,19 +441,19 @@
 
 void DisplayMediaAccessHandler::ProcessQueuedPickerRequest(
     const PendingAccessRequest& pending_request,
-    content::WebContents* web_contents,
+    WebContents* web_contents,
     AllowedScreenCaptureLevel capture_level,
     const GURL& request_origin) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(web_contents);
 
-  content::WebContents* ui_web_contents = web_contents;
+  WebContents* ui_web_contents = web_contents;
 
 #if defined(TOOLKIT_VIEWS)
   // If `web_contents` is the opener of a Document Picture in Picture window,
   // and if the pip window currently has the focus, then show the request in the
   // pip window instead.
-  if (content::WebContents* const child_web_contents =
+  if (WebContents* const child_web_contents =
           web_contents->HasPictureInPictureDocument()
               ? PictureInPictureWindowManager::GetInstance()
                     ->GetChildWebContents()
@@ -540,54 +535,54 @@
 
 void DisplayMediaAccessHandler::ProcessQueuedChangeSourceRequest(
     const content::MediaStreamRequest& request,
-    content::WebContents* web_contents) {
+    WebContents* web_contents) {
   DCHECK(web_contents);
   DCHECK(!request.requested_video_device_ids.empty());
 
-  content::WebContentsMediaCaptureId web_contents_id;
-  if (!content::WebContentsMediaCaptureId::Parse(
+  WebContentsMediaCaptureId web_contents_id;
+  if (!WebContentsMediaCaptureId::Parse(
           request.requested_video_device_ids.front(), &web_contents_id)) {
-    RejectRequest(web_contents,
-                  blink::mojom::MediaStreamRequestResult::INVALID_STATE);
+    RejectRequest(web_contents, MediaStreamRequestResult::INVALID_STATE);
     return;
   }
-  content::DesktopMediaID media_id(content::DesktopMediaID::TYPE_WEB_CONTENTS,
-                                   content::DesktopMediaID::kNullId,
-                                   web_contents_id);
+  DesktopMediaID media_id(DesktopMediaID::TYPE_WEB_CONTENTS,
+                          DesktopMediaID::kNullId, web_contents_id);
   media_id.audio_share =
       request.audio_type != blink::mojom::MediaStreamType::NO_SERVICE;
   OnDisplaySurfaceSelected(web_contents->GetWeakPtr(), media_id);
 }
 
-void DisplayMediaAccessHandler::RejectRequest(
-    content::WebContents* web_contents,
-    blink::mojom::MediaStreamRequestResult result) {
+void DisplayMediaAccessHandler::RejectRequest(WebContents* web_contents,
+                                              MediaStreamRequestResult result) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(web_contents);
 
   auto it = pending_requests_.find(web_contents);
-  if (it == pending_requests_.end())
+  if (it == pending_requests_.end()) {
     return;
+  }
   RequestsQueue& mutable_queue = it->second;
-  if (mutable_queue.empty())
+  if (mutable_queue.empty()) {
     return;
+  }
   PendingAccessRequest& mutable_request = *mutable_queue.front();
   std::move(mutable_request.callback)
       .Run(blink::mojom::StreamDevicesSet(), result, /*ui=*/nullptr);
   mutable_queue.pop_front();
-  if (!mutable_queue.empty())
+  if (!mutable_queue.empty()) {
     ProcessQueuedAccessRequest(mutable_queue, web_contents);
+  }
 }
 
-void DisplayMediaAccessHandler::AcceptRequest(
-    content::WebContents* web_contents,
-    const content::DesktopMediaID& media_id) {
+void DisplayMediaAccessHandler::AcceptRequest(WebContents* web_contents,
+                                              const DesktopMediaID& media_id) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(web_contents);
 
   auto it = pending_requests_.find(web_contents);
-  if (it == pending_requests_.end())
+  if (it == pending_requests_.end()) {
     return;
+  }
   RequestsQueue& queue = it->second;
   if (queue.empty()) {
     // UpdateMediaRequestState() called with MEDIA_REQUEST_STATE_CLOSING. Don't
@@ -597,7 +592,7 @@
   PendingAccessRequest& pending_request = *queue.front();
 
   const bool disable_local_echo =
-      (media_id.type == content::DesktopMediaID::TYPE_WEB_CONTENTS) &&
+      (media_id.type == DesktopMediaID::TYPE_WEB_CONTENTS) &&
       media_id.web_contents_id.disable_local_echo;
 
   blink::mojom::StreamDevicesSet stream_devices_set;
@@ -613,17 +608,17 @@
   UpdateTarget(pending_request.request, media_id);
 
   std::move(pending_request.callback)
-      .Run(stream_devices_set, blink::mojom::MediaStreamRequestResult::OK,
-           std::move(ui));
+      .Run(stream_devices_set, MediaStreamRequestResult::OK, std::move(ui));
   queue.pop_front();
 
-  if (!queue.empty())
+  if (!queue.empty()) {
     ProcessQueuedAccessRequest(queue, web_contents);
+  }
 }
 
 void DisplayMediaAccessHandler::OnDisplaySurfaceSelected(
-    base::WeakPtr<content::WebContents> web_contents,
-    content::DesktopMediaID media_id) {
+    base::WeakPtr<WebContents> web_contents,
+    DesktopMediaID media_id) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (!web_contents) {
@@ -634,18 +629,17 @@
 
   if (media_id.is_null()) {
     RejectRequest(web_contents.get(),
-                  blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED);
+                  MediaStreamRequestResult::PERMISSION_DENIED);
     return;
   }
 
   // If the media id is tied to a tab, check that it hasn't been destroyed.
-  if (media_id.type == content::DesktopMediaID::TYPE_WEB_CONTENTS &&
-      !content::WebContents::FromRenderFrameHost(
-          content::RenderFrameHost::FromID(
-              media_id.web_contents_id.render_process_id,
-              media_id.web_contents_id.main_render_frame_id))) {
+  if (media_id.type == DesktopMediaID::TYPE_WEB_CONTENTS &&
+      !WebContents::FromRenderFrameHost(content::RenderFrameHost::FromID(
+          media_id.web_contents_id.render_process_id,
+          media_id.web_contents_id.main_render_frame_id))) {
     RejectRequest(web_contents.get(),
-                  blink::mojom::MediaStreamRequestResult::TAB_CAPTURE_FAILURE);
+                  MediaStreamRequestResult::TAB_CAPTURE_FAILURE);
     return;
   }
 
@@ -656,14 +650,12 @@
   // window which will be captured internally, the macOS screen capture APIs
   // will not be used.
   if (system_media_permissions::ScreenCaptureNeedsSystemLevelPermissions() &&
-      (media_id.type == content::DesktopMediaID::TYPE_SCREEN ||
-       (media_id.type == content::DesktopMediaID::TYPE_WINDOW &&
-        !media_id.window_id)) &&
+      (media_id.type == DesktopMediaID::TYPE_SCREEN ||
+       (media_id.type == DesktopMediaID::TYPE_WINDOW && !media_id.window_id)) &&
       system_media_permissions::CheckSystemScreenCapturePermission() !=
           system_permission_settings::SystemPermission::kAllowed) {
-    RejectRequest(
-        web_contents.get(),
-        blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED);
+    RejectRequest(web_contents.get(),
+                  MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM);
     return;
   }
 #endif  // BUILDFLAG(IS_MAC)
@@ -684,8 +676,8 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 void DisplayMediaAccessHandler::OnDlpRestrictionChecked(
-    base::WeakPtr<content::WebContents> web_contents,
-    const content::DesktopMediaID& media_id,
+    base::WeakPtr<WebContents> web_contents,
+    const DesktopMediaID& media_id,
     bool is_dlp_allowed) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
@@ -695,7 +687,7 @@
 
   if (!is_dlp_allowed) {
     RejectRequest(web_contents.get(),
-                  blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED);
+                  MediaStreamRequestResult::PERMISSION_DENIED);
   }
   AcceptRequest(web_contents.get(), media_id);
 }
@@ -720,7 +712,7 @@
 }
 
 void DisplayMediaAccessHandler::WebContentsDestroyed(
-    content::WebContents* web_contents) {
+    WebContents* web_contents) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   pending_requests_.erase(web_contents);
diff --git a/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc b/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
index b6961705..0edb61e4 100644
--- a/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
+++ b/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
@@ -256,7 +256,7 @@
 #if BUILDFLAG(IS_MAC)
   // On macOS, screen capture requires system permissions that are disabled by
   // default.
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
             result);
   return;
 #endif
@@ -298,7 +298,7 @@
 #if BUILDFLAG(IS_MAC)
   // On macOS, screen capture requires system permissions that are disabled by
   // default.
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
             result);
   return;
 #endif
@@ -648,7 +648,7 @@
 #if BUILDFLAG(IS_MAC)
   // On macOS, screen capture requires system permissions that are disabled by
   // default.
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
             result);
   return;
 #endif
@@ -754,7 +754,7 @@
 #if BUILDFLAG(IS_MAC)
   // On macOS, screen capture requires system permissions that are disabled by
   // default.
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
             results[0]);
   return;
 #endif
@@ -789,7 +789,7 @@
 #if BUILDFLAG(IS_MAC)
   // On macOS, screen capture requires system permissions that are disabled by
   // default.
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
             results[0]);
   return;
 #endif
@@ -825,7 +825,7 @@
 #if BUILDFLAG(IS_MAC)
   // On macOS, screen capture requires system permissions that are disabled by
   // default.
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED,
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM,
             results[0]);
   return;
 #endif
diff --git a/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc b/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
index 637c425d..66e3770 100644
--- a/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
+++ b/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
@@ -358,7 +358,7 @@
                  system_audio_permission == SystemPermission::kDenied) {
         content_settings::UpdateLocationBarUiForWebContents(web_contents);
         final_result =
-            blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED;
+            blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM;
         system_media_permissions::SystemAudioCapturePermissionBlocked();
       } else {
         DCHECK_EQ(system_audio_permission, SystemPermission::kAllowed);
@@ -386,7 +386,7 @@
                  system_video_permission == SystemPermission::kDenied) {
         content_settings::UpdateLocationBarUiForWebContents(web_contents);
         final_result =
-            blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED;
+            blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM;
         system_media_permissions::SystemVideoCapturePermissionBlocked();
       } else {
         DCHECK_EQ(system_video_permission, SystemPermission::kAllowed);
diff --git a/chrome/browser/notifications/non_persistent_notification_handler.cc b/chrome/browser/notifications/non_persistent_notification_handler.cc
index bc2a5a47..802b818 100644
--- a/chrome/browser/notifications/non_persistent_notification_handler.cc
+++ b/chrome/browser/notifications/non_persistent_notification_handler.cc
@@ -78,7 +78,7 @@
   // notifications with high notification volume and low site engagement score.
   ukm::SourceId source_id = ukm::UkmRecorder::GetSourceIdForNotificationEvent(
       base::PassKey<NonPersistentNotificationHandler>(), origin);
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile, origin,
       DisruptiveNotificationPermissionsManager::FalsePositiveReason::
           kNonPersistentNotificationClick,
diff --git a/chrome/browser/notifications/persistent_notification_handler.cc b/chrome/browser/notifications/persistent_notification_handler.cc
index 6599d35..f6516d9 100644
--- a/chrome/browser/notifications/persistent_notification_handler.cc
+++ b/chrome/browser/notifications/persistent_notification_handler.cc
@@ -225,7 +225,7 @@
   // notifications with high notification volume and low site engagement score.
   ukm::SourceId source_id = ukm::UkmRecorder::GetSourceIdForNotificationEvent(
       base::PassKey<PersistentNotificationHandler>(), origin);
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile, origin,
       DisruptiveNotificationPermissionsManager::FalsePositiveReason::
           kPersistentNotificationClick,
diff --git a/chrome/browser/notifications/platform_notification_service_unittest.cc b/chrome/browser/notifications/platform_notification_service_unittest.cc
index 3cc90d9e..d6d4d49 100644
--- a/chrome/browser/notifications/platform_notification_service_unittest.cc
+++ b/chrome/browser/notifications/platform_notification_service_unittest.cc
@@ -31,7 +31,7 @@
 #include "chrome/browser/notifications/platform_notification_service_impl.h"
 #include "chrome/browser/safe_browsing/notification_content_detection/mock_notification_content_detection_service.h"
 #include "chrome/browser/safe_browsing/notification_content_detection/notification_content_detection_service_factory.h"
-#include "chrome/browser/ui/safety_hub/safety_hub_constants.h"
+#include "chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -416,18 +416,16 @@
 
   HostContentSettingsMap* hcsm =
       HostContentSettingsMapFactory::GetForProfile(profile_.get());
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, kDailyNotificationCount);
-  auto constraint =
-      content_settings::ContentSettingConstraints(base::Time::Now());
-  constraint.set_lifetime(base::Days(30));
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)), constraint);
+  DisruptiveNotificationPermissionsManager::ContentSettingHelper(*hcsm)
+      .PersistRevocationEntry(
+          url,
+          DisruptiveNotificationPermissionsManager::RevocationEntry{
+              .revocation_state = DisruptiveNotificationPermissionsManager::
+                  RevocationState::kProposed,
+              .site_engagement = 0.0,
+              .daily_notification_count = kDailyNotificationCount,
+              .lifetime = base::Days(30),
+          });
 
   PlatformNotificationData data;
   data.title = u"My notification's title";
@@ -453,18 +451,16 @@
 
   HostContentSettingsMap* hcsm =
       HostContentSettingsMapFactory::GetForProfile(profile_.get());
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, kDailyNotificationCount);
-  auto constraint =
-      content_settings::ContentSettingConstraints(base::Time::Now());
-  constraint.set_lifetime(base::Days(30));
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)), constraint);
+  DisruptiveNotificationPermissionsManager::ContentSettingHelper(*hcsm)
+      .PersistRevocationEntry(
+          url,
+          DisruptiveNotificationPermissionsManager::RevocationEntry{
+              .revocation_state = DisruptiveNotificationPermissionsManager::
+                  RevocationState::kProposed,
+              .site_engagement = 0.0,
+              .daily_notification_count = kDailyNotificationCount,
+              .lifetime = base::Days(30),
+          });
 
   PlatformNotificationData data;
   data.title = u"My notification's title";
diff --git a/chrome/browser/page_load_metrics/observers/from_gws_abandoned_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/from_gws_abandoned_page_load_metrics_observer_browsertest.cc
index e19f048..2a7bfae 100644
--- a/chrome/browser/page_load_metrics/observers/from_gws_abandoned_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/from_gws_abandoned_page_load_metrics_observer_browsertest.cc
@@ -103,6 +103,12 @@
     return url;
   }
 
+  GURL url_non_srp_error() {
+    GURL url(current_test_server()->GetURL("a.test", "/error"));
+    EXPECT_FALSE(page_load_metrics::IsGoogleSearchResultUrl(url));
+    return url;
+  }
+
   GURL GetTargetURLForMilestone(NavigationMilestone milestone) override {
     if (milestone ==
         NavigationMilestone::kFirstRedirectResponseLoaderCallback) {
@@ -120,6 +126,14 @@
     return http_response;
   }
 
+  std::unique_ptr<net::test_server::HttpResponse> DefaultNetErrorHandler(
+      const net::test_server::HttpRequest& request) {
+    auto http_response =
+        std::make_unique<net::test_server::BasicHttpResponse>();
+    http_response->set_code(net::HttpStatusCode::HTTP_INTERNAL_SERVER_ERROR);
+    return http_response;
+  }
+
   void SetUpOnMainThread() override {
     current_test_server()->RegisterDefaultHandler(
         base::BindRepeating(&net::test_server::HandlePrefixedRequest, "/search",
@@ -130,6 +144,12 @@
             &FromGwsAbandonedPageLoadMetricsObserverBrowserTest::
                 DefaultRedirectHandler,
             base::Unretained(this))));
+    current_test_server()->RegisterDefaultHandler(base::BindRepeating(
+        &net::test_server::HandlePrefixedRequest, "/error",
+        base::BindRepeating(
+            &FromGwsAbandonedPageLoadMetricsObserverBrowserTest::
+                DefaultNetErrorHandler,
+            base::Unretained(this))));
     GWSAbandonedPageLoadMetricsObserverBrowserTest::SetUpOnMainThread();
   }
 
@@ -836,6 +856,40 @@
       std::nullopt, base::OnceCallback<void()>());
 }
 
+// Test navigations that are cancelled because of the server error. We should
+// record the net::Error if the cancelation is from the network error.
+IN_PROC_BROWSER_TEST_F(FromGwsAbandonedPageLoadMetricsObserverBrowserTest,
+                       CancelledByServerError) {
+  // Navigate to SRP page.
+  EXPECT_TRUE(content::NavigateToURL(web_contents(), url_srp()));
+
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
+  // Navigate to a redirected non-SRP page.
+  EXPECT_FALSE(content::NavigateToURL(web_contents(), url_non_srp_error()));
+
+  // Navigate to a non-SRP page to flush.
+  EXPECT_TRUE(content::NavigateToURL(web_contents(), url_non_srp()));
+
+  auto ukm_entries =
+      ukm_recorder.GetEntriesByName("Navigation.FromGoogleSearch.Abandoned");
+  const ukm::mojom::UkmEntry* ukm_entry = ukm_entries[0].get();
+  ukm_recorder.ExpectEntrySourceHasUrl(ukm_entry, url_non_srp_error());
+
+  ukm_recorder.ExpectEntryMetric(ukm_entry, "Net.ErrorCode",
+                                 -net::ERR_HTTP_RESPONSE_CODE_FAILURE);
+
+  ukm_recorder.ExpectEntryMetric(ukm_entry, "AbandonReason",
+                                 static_cast<int>(AbandonReason::kErrorPage));
+  ukm_recorder.ExpectEntryMetric(
+      ukm_entry, "LastMilestoneBeforeAbandon",
+      static_cast<int>(
+          NavigationMilestone::kNonRedirectResponseLoaderCallback));
+
+  CheckTimingInformationMetrics(
+      ukm_recorder, NavigationMilestone::kNonRedirectResponseLoaderCallback,
+      url_non_srp_error(), url_non_srp_error());
+}
+
 class FromGwsAbandonedPageLoadMetricsObserverWithImpressionBrowserTest
     : public FromGwsAbandonedPageLoadMetricsObserverBrowserTest {
  public:
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index e7897fc..da829eb 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -23,12 +23,15 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/bind.h"
+#include "base/test/gtest_util.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_command_line.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/trace_event_analyzer.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "cc/base/switches.h"
 #include "chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer.h"
@@ -3816,15 +3819,13 @@
     : public PageLoadMetricsBrowserTestTerminatedPage,
       public ::testing::WithParamInterface<const char*> {};
 
-// TODO(crbug.com/376032466): flaky on Linux/Windows.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
-#define MAYBE_UkmIsRecordedForCrashedTabPage \
-  DISABLED_UkmIsRecordedForCrashedTabPage
-#else
-#define MAYBE_UkmIsRecordedForCrashedTabPage UkmIsRecordedForCrashedTabPage
-#endif
 IN_PROC_BROWSER_TEST_P(PageLoadMetricsBrowserTestCrashedPage,
-                       MAYBE_UkmIsRecordedForCrashedTabPage) {
+                       UkmIsRecordedForCrashedTabPage) {
+  // This flag must be enabled to log metrics for blink::kChromeUIGpuCrashURL.
+  base::test::ScopedCommandLine scoped_command_line;
+  scoped_command_line.GetProcessCommandLine()->AppendSwitch(
+      switches::kEnableGpuBenchmarking);
+
   // Open a new foreground tab and navigate.
   content::WebContents* contents = OpenTabAndNavigate();
 
@@ -3841,13 +3842,17 @@
 
   // Kill the page.
   content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes;
-  EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(GetParam())));
-
+  NavigateParams params(
+      browser(), GURL(GetParam()),
+      ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED |
+                                ui::PAGE_TRANSITION_FROM_ADDRESS_BAR));
+  ui_test_utils::NavigateToURL(&params);
   // Page being crashed is only verifiable in these crashes.
   if (GetParam() == blink::kChromeUIKillURL ||
-      GetParam() == blink::kChromeUICrashURL)
+      GetParam() == blink::kChromeUICrashURL) {
     EXPECT_TRUE(
         browser()->tab_strip_model()->GetActiveWebContents()->IsCrashed());
+  }
 
   // Verify page load metric is recorded.
   EXPECT_NEAR(
@@ -3861,7 +3866,6 @@
     PageLoadMetricsBrowserTestCrashedPage,
     testing::ValuesIn({blink::kChromeUIKillURL, blink::kChromeUICrashURL,
                        blink::kChromeUIGpuCrashURL,
-                       blink::kChromeUIBrowserCrashURL,
                        blink::kChromeUINetworkErrorURL,
                        blink::kChromeUIProcessInternalsURL}));
 
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
index adc62b3..3ddb2d7 100644
--- a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
+++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/permissions/permission_actions_history_factory.h"
 #include "chrome/browser/permissions/permissions_aiv1_handler.h"
 #include "chrome/browser/permissions/prediction_model_handler_provider.h"
+#include "chrome/browser/permissions/prediction_model_handler_provider_factory.h"
 #include "chrome/browser/permissions/prediction_service_factory.h"
 #include "chrome/browser/permissions/prediction_service_request.h"
 #include "chrome/browser/profiles/profile.h"
@@ -29,7 +30,6 @@
 #include "components/permissions/permission_request.h"
 #include "components/permissions/permission_uma_util.h"
 #include "components/permissions/permission_util.h"
-#include "components/permissions/prediction_service/permissions_aiv3_handler.h"
 #include "components/permissions/prediction_service/prediction_common.h"
 #include "components/permissions/prediction_service/prediction_service.h"
 #include "components/permissions/prediction_service/prediction_service_messages.pb.h"
@@ -42,7 +42,7 @@
 #include "mojo/public/cpp/bindings/callback_helpers.h"
 
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-#include "chrome/browser/permissions/prediction_model_handler_provider_factory.h"
+#include "components/permissions/prediction_service/permissions_aiv3_handler.h"
 #include "components/permissions/prediction_service/prediction_model_handler.h"
 #endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 
@@ -161,14 +161,22 @@
           /*is_on_device=*/false, request_type));
 }
 
+void PredictionBasedPermissionUiSelector::
+    InquireOnDeviceAiv1AndServerModelIfAvailable(
+        content::RenderFrameHost* rfh,
+        PredictionRequestFeatures features,
+        permissions::RequestType request_type) {
+  content_extraction::GetInnerText(
+      *rfh, /*node_id=*/std::nullopt,
+      base::BindOnce(
+          &PredictionBasedPermissionUiSelector::OnGetInnerTextForOnDeviceModel,
+          weak_ptr_factory_.GetWeakPtr(), std::move(features), request_type));
+}
+
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 void PredictionBasedPermissionUiSelector::InquireCpssV1OnDeviceModelIfAvailable(
     const PredictionRequestFeatures& features,
     permissions::RequestType request_type) {
-#if !BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-  VLOG(1) << "[CPSS] Client doesn't support CPSSv1";
-  std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning());
-  return;
-#else
   PredictionModelHandlerProvider* prediction_model_handler_provider =
       PredictionModelHandlerProviderFactory::GetForBrowserContext(profile_);
   permissions::PredictionModelHandler* prediction_model_handler = nullptr;
@@ -196,19 +204,6 @@
   }
   VLOG(1) << "[CPSS] On device CPSSv1 model unavailable";
   std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning());
-#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-}
-
-void PredictionBasedPermissionUiSelector::
-    InquireOnDeviceAiv1AndServerModelIfAvailable(
-        content::RenderFrameHost* rfh,
-        PredictionRequestFeatures features,
-        permissions::RequestType request_type) {
-  content_extraction::GetInnerText(
-      *rfh, /*node_id=*/std::nullopt,
-      base::BindOnce(
-          &PredictionBasedPermissionUiSelector::OnGetInnerTextForOnDeviceModel,
-          weak_ptr_factory_.GetWeakPtr(), std::move(features), request_type));
 }
 
 void PredictionBasedPermissionUiSelector::
@@ -236,6 +231,64 @@
           weak_ptr_factory_.GetWeakPtr(), std::move(features), request_type));
 }
 
+void PredictionBasedPermissionUiSelector::OnSnapshotTakenForOnDeviceModel(
+    PredictionRequestFeatures features,
+    permissions::RequestType request_type,
+    const SkBitmap& snapshot) {
+  VLOG(1) << "[PermissionsAIv3] On device AI prediction requested";
+  if (snapshot.drawsNothing()) {
+    VLOG(1) << "[PermissionsAIv3] The page's snapshot is empty";
+  } else {
+    if (PredictionModelHandlerProvider* prediction_model_handler_provider =
+            PredictionModelHandlerProviderFactory::GetForBrowserContext(
+                profile_)) {
+      if (PermissionsAiv3Handler* aiv3_handler =
+              prediction_model_handler_provider->GetPermissionsAiv3Handler(
+                  request_type)) {
+        VLOG(1) << "[PermissionsAIv3] Inquire model";
+
+        aiv3_handler->ExecuteModel(
+            base::BindRepeating(&PredictionBasedPermissionUiSelector::
+                                    OnDeviceAiv3ModelExecutionCallback,
+                                weak_ptr_factory_.GetWeakPtr(),
+                                std::move(features), request_type),
+            std::make_unique<SkBitmap>(snapshot));
+        return;
+      }
+    }
+    VLOG(1) << "[PermissionsAIv3] On device AI model session unavailable";
+  }
+  InquireServerModel(features, request_type, /*record_source=*/true);
+}
+
+void PredictionBasedPermissionUiSelector::OnDeviceAiv3ModelExecutionCallback(
+    PredictionRequestFeatures features,
+    permissions::RequestType request_type,
+    const std::optional<PermissionRequestRelevance>& relevance) {
+  VLOG(1) << "[PermissionsAIv3]: AI model execution callback called "
+          << (relevance.has_value() ? "with value" : "without value");
+  if (relevance.has_value()) {
+    VLOG(1) << "[PermissionsAIv3]: PermissionRequest has a relevance of "
+            << static_cast<int>(relevance.value());
+    last_permission_request_relevance_ = relevance.value();
+    features.permission_relevance = relevance.value();
+    // TODO(crbug.com/382447738) refactor this function to also encode the model
+    // version
+    permissions::PermissionUmaUtil::RecordPermissionRequestRelevance(
+        features.permission_relevance);
+  } else {
+    last_permission_request_relevance_ =
+        PermissionRequestRelevance::kUnspecified;
+  }
+
+  // We get Unspecified only if the model was not executed; so we call the
+  // server side model as if we never inquired the on-device model before.
+  InquireServerModel(features, request_type,
+                     /*record_source=*/
+                     !(relevance == PermissionRequestRelevance::kUnspecified));
+}
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+
 void PredictionBasedPermissionUiSelector::SelectUiToUse(
     content::WebContents* web_contents,
     permissions::PermissionRequest* request,
@@ -285,22 +338,32 @@
   DCHECK(!request_);
 
   switch (prediction_source) {
-    case PredictionSource::kOnDeviceAiv1AndServerSideModel:
-      InquireOnDeviceAiv1AndServerModelIfAvailable(
-          web_contents->GetPrimaryMainFrame(), std::move(features),
-          request->request_type());
-      return;
-    case PredictionSource::kOnDeviceAiv3AndServerSideModel:
-      InquireOnDeviceAiv3AndServerModelIfAvailable(
-          web_contents->GetRenderWidgetHostView(), std::move(features),
-          request->request_type());
-      return;
     case PredictionSource::kServerSideCpssV3Model:
       return InquireServerModel(features, request->request_type(),
                                 /*record_source=*/true);
+    case PredictionSource::kOnDeviceAiv1AndServerSideModel:
+      return InquireOnDeviceAiv1AndServerModelIfAvailable(
+          web_contents->GetPrimaryMainFrame(), std::move(features),
+          request->request_type());
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+    case PredictionSource::kOnDeviceAiv3AndServerSideModel:
+      return InquireOnDeviceAiv3AndServerModelIfAvailable(
+          web_contents->GetRenderWidgetHostView(), std::move(features),
+          request->request_type());
     case PredictionSource::kOnDeviceCpssV1Model:
       return InquireCpssV1OnDeviceModelIfAvailable(features,
                                                    request->request_type());
+#else
+    case PredictionSource::kOnDeviceAiv3AndServerSideModel:
+      [[fallthrough]];
+    case PredictionSource::kOnDeviceCpssV1Model:
+      VLOG(1) << "[CPSS] Client doesn't support on-device tflite: "
+              << static_cast<int>(prediction_source);
+      std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning());
+      return;
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+    case PredictionSource::kNoCpssModel:
+      [[fallthrough]];
     default:
       NOTREACHED();
   }
@@ -339,36 +402,6 @@
   InquireServerModel(features, request_type, /*record_source=*/true);
 }
 
-void PredictionBasedPermissionUiSelector::OnSnapshotTakenForOnDeviceModel(
-    PredictionRequestFeatures features,
-    permissions::RequestType request_type,
-    const SkBitmap& snapshot) {
-  VLOG(1) << "[PermissionsAIv3] On device AI prediction requested";
-  if (snapshot.drawsNothing()) {
-    VLOG(1) << "[PermissionsAIv3] The page's snapshot is empty";
-  } else {
-    if (PredictionModelHandlerProvider* prediction_model_handler_provider =
-            PredictionModelHandlerProviderFactory::GetForBrowserContext(
-                profile_)) {
-      if (PermissionsAiv3Handler* aiv3_handler =
-              prediction_model_handler_provider->GetPermissionsAiv3Handler(
-                  request_type)) {
-        VLOG(1) << "[PermissionsAIv3] Inquire model";
-
-        aiv3_handler->ExecuteModel(
-            base::BindRepeating(&PredictionBasedPermissionUiSelector::
-                                    OnDeviceAiv3ModelExecutionCallback,
-                                weak_ptr_factory_.GetWeakPtr(),
-                                std::move(features), request_type),
-            std::make_unique<SkBitmap>(snapshot));
-        return;
-      }
-    }
-    VLOG(1) << "[PermissionsAIv3] On device AI model session unavailable";
-  }
-  InquireServerModel(features, request_type, /*record_source=*/true);
-}
-
 void PredictionBasedPermissionUiSelector::Cancel() {
   request_.reset();
   callback_.Reset();
@@ -469,33 +502,6 @@
                      /*record_source=*/!response.has_value());
 }
 
-void PredictionBasedPermissionUiSelector::OnDeviceAiv3ModelExecutionCallback(
-    PredictionRequestFeatures features,
-    permissions::RequestType request_type,
-    const std::optional<PermissionRequestRelevance>& relevance) {
-  VLOG(1) << "[PermissionsAIv3]: AI model execution callback called "
-          << (relevance.has_value() ? "with value" : "without value");
-  if (relevance.has_value()) {
-    VLOG(1) << "[PermissionsAIv3]: PermissionRequest has a relevance of "
-            << static_cast<int>(relevance.value());
-    last_permission_request_relevance_ = relevance.value();
-    features.permission_relevance = relevance.value();
-    // TODO(crbug.com/382447738) refactor this function to also encode the model
-    // version
-    permissions::PermissionUmaUtil::RecordPermissionRequestRelevance(
-        features.permission_relevance);
-  } else {
-    last_permission_request_relevance_ =
-        PermissionRequestRelevance::kUnspecified;
-  }
-
-  // We get Unspecified only if the model was not executed; so we call the
-  // server side model as if we never inquired the on-device model before.
-  InquireServerModel(features, request_type,
-                     /*record_source=*/
-                     !(relevance == PermissionRequestRelevance::kUnspecified));
-}
-
 void PredictionBasedPermissionUiSelector::LookupResponseReceived(
     base::TimeTicks model_inquire_start_time,
     bool is_on_device,
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.h b/chrome/browser/permissions/prediction_based_permission_ui_selector.h
index d573853e..bb34a745 100644
--- a/chrome/browser/permissions/prediction_based_permission_ui_selector.h
+++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.h
@@ -14,6 +14,7 @@
 #include "components/optimization_guide/core/optimization_guide_model_executor.h"
 #include "components/optimization_guide/core/optimization_guide_model_provider.h"
 #include "components/optimization_guide/core/optimization_guide_util.h"
+#include "components/optimization_guide/machine_learning_tflite_buildflags.h"
 #include "components/optimization_guide/proto/common_types.pb.h"
 #include "components/optimization_guide/proto/features/permissions_ai.pb.h"
 #include "components/optimization_guide/proto/models.pb.h"
@@ -22,6 +23,8 @@
 #include "components/permissions/permission_ui_selector.h"
 #include "components/permissions/prediction_service/prediction_request_features.h"
 #include "components/permissions/request_type.h"
+// pref_names include is needed for the browser tests to work as they cannot
+// include this dependency themselves
 #include "components/unified_consent/pref_names.h"
 #include "content/public/browser/render_widget_host_view.h"
 
@@ -97,13 +100,6 @@
       permissions::RequestType request_type,
       std::optional<optimization_guide::proto::PermissionsAiResponse> response);
 
-  // Callback for the Aiv3ModelHandler, with the first to parameters being
-  // curryed to be used for the server side model call.
-  void OnDeviceAiv3ModelExecutionCallback(
-      permissions::PredictionRequestFeatures features,
-      permissions::RequestType request_type,
-      const std::optional<permissions::PermissionRequestRelevance>& relevance);
-
   permissions::PredictionRequestFeatures BuildPredictionRequestFeatures(
       permissions::PermissionRequest* request);
   void LookupResponseReceived(
@@ -129,15 +125,6 @@
       permissions::RequestType request_type,
       std::unique_ptr<content_extraction::InnerTextResult> result);
 
-  // Part of the AIv3 model execution chain; provided as a curryed callback to
-  // be submitted to the logic that fetches a snapshot that serves as the input
-  // for the AIv3 model. The first two parameters are set by the callee, to be
-  // used by the server side model later.
-  void OnSnapshotTakenForOnDeviceModel(
-      permissions::PredictionRequestFeatures features,
-      permissions::RequestType request_type,
-      const SkBitmap& screenshot);
-
   bool ShouldHoldBack(bool is_on_device, permissions::RequestType request_type);
 
   void InquireServerModel(
@@ -145,10 +132,6 @@
       permissions::RequestType request_type,
       bool record_source);
 
-  void InquireCpssV1OnDeviceModelIfAvailable(
-      const permissions::PredictionRequestFeatures& features,
-      permissions::RequestType request_type);
-
   // As the first part of the AIv3 model execution chain, this function triggers
   // AIv3 input collection and model execution, with its output being input of
   // the follow-up CPSSv3 server side model execution. If the AIv3 model is not
@@ -159,6 +142,7 @@
       permissions::PredictionRequestFeatures features,
       permissions::RequestType request_type);
 
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
   // As the first part of the AIv3 model execution chain, this function triggers
   // AIv3 input collection and model execution, with its output being input of
   // the follow-up CPSSv3 server side model execution. If the AIv3 model is not
@@ -169,6 +153,28 @@
       permissions::PredictionRequestFeatures features,
       permissions::RequestType request_type);
 
+  // Part of the AIv3 model execution chain; provided as a curryed callback to
+  // be submitted to the logic that fetches a snapshot that serves as the input
+  // for the AIv3 model. The first two parameters are set by the callee, to be
+  // used by the server side model later.
+  void OnSnapshotTakenForOnDeviceModel(
+      permissions::PredictionRequestFeatures features,
+      permissions::RequestType request_type,
+      const SkBitmap& screenshot);
+
+  // Callback for the Aiv3ModelHandler, with the first to parameters being
+  // curryed to be used for the server side model call.
+  void OnDeviceAiv3ModelExecutionCallback(
+      permissions::PredictionRequestFeatures features,
+      permissions::RequestType request_type,
+      const std::optional<permissions::PermissionRequestRelevance>& relevance);
+
+  // Use on device CPSSv1 tflite model.
+  void InquireCpssV1OnDeviceModelIfAvailable(
+      const permissions::PredictionRequestFeatures& features,
+      permissions::RequestType request_type);
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+
   raw_ptr<Profile> profile_;
   std::unique_ptr<PredictionServiceRequest> request_;
   std::optional<PredictionGrantLikelihood> last_request_grant_likelihood_;
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 7ec1d8a..b9b9634 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -667,6 +667,9 @@
   { key::kImagesBlockedForUrls,
     prefs::kManagedImagesBlockedForUrls,
     base::Value::Type::LIST },
+  { key::kShowHomeButton,
+    prefs::kShowHomeButton,
+    base::Value::Type::BOOLEAN },
 #if !BUILDFLAG(IS_ANDROID)
   { key::kInsecureContentAllowedForUrls,
     prefs::kManagedInsecureContentAllowedForUrls,
@@ -810,9 +813,6 @@
   { key::kShowFullUrlsInAddressBar,
     omnibox::kPreventUrlElisionsInOmnibox,
     base::Value::Type::BOOLEAN },
-  { key::kShowHomeButton,
-    prefs::kShowHomeButton,
-    base::Value::Type::BOOLEAN },
   { key::kSignedHTTPExchangeEnabled,
     prefs::kSignedHTTPExchangeEnabled,
     base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/prefs/BUILD.gn b/chrome/browser/prefs/BUILD.gn
index 330485b6..1842ec28 100644
--- a/chrome/browser/prefs/BUILD.gn
+++ b/chrome/browser/prefs/BUILD.gn
@@ -78,6 +78,7 @@
     "//chrome/browser/ui/safety_hub",
     "//chrome/browser/ui/search_engines",
     "//chrome/browser/ui/startup:startup_tab",
+    "//chrome/browser/ui/webui/accessibility",
     "//chrome/browser/updates/announcement_notification",
     "//components/blocked_content",
     "//components/bookmarks/common",
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
index 1ab7310..0953ecfb 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -3955,6 +3955,44 @@
   EXPECT_FALSE(base::Contains(inner_html, "prefetch"));
 }
 
+IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceNavigationPrefetchBrowserTest,
+                       PrefetchIsNotCancelled) {
+  set_service_deferral_type(
+      SearchPreloadTestResponseDeferralType::kDeferHeader);
+  auto* search_prefetch_service =
+      SearchPrefetchServiceFactory::GetForProfile(browser()->profile());
+  std::string search_terms = kOmniboxSuggestPrefetchQuery;
+
+  AutocompleteMatch autocomplete_match =
+      CreateSearchSuggestionMatch(search_terms, search_terms, true);
+  AutocompleteResult autocomplete_result;
+  autocomplete_result.AppendMatches({autocomplete_match});
+  SearchPrefetchServiceFactory::GetForProfile(browser()->profile())
+      ->OnResultChanged(GetWebContents(), autocomplete_result);
+
+  WaitUntilStatusChangesTo(
+      GetCanonicalSearchURL(autocomplete_match.destination_url),
+      SearchPrefetchStatus::kCanBeServed);
+  auto prefetch_status =
+      search_prefetch_service->GetSearchPrefetchStatusForTesting(
+          GetCanonicalSearchURL(autocomplete_match.destination_url));
+  ASSERT_TRUE(prefetch_status.has_value());
+  EXPECT_EQ(SearchPrefetchStatus::kCanBeServed, prefetch_status.value());
+
+  // Change the autocomplete to remove "porgs" entirely.
+  autocomplete_match =
+      CreateSearchSuggestionMatch(search_terms, search_terms, true);
+  autocomplete_result.Reset();
+  autocomplete_result.AppendMatches({autocomplete_match});
+  SearchPrefetchServiceFactory::GetForProfile(browser()->profile())
+      ->OnResultChanged(GetWebContents(), autocomplete_result);
+
+  prefetch_status = search_prefetch_service->GetSearchPrefetchStatusForTesting(
+      GetCanonicalSearchURL(autocomplete_match.destination_url));
+  ASSERT_TRUE(prefetch_status.has_value());
+  EXPECT_EQ(SearchPrefetchStatus::kCanBeServed, prefetch_status.value());
+}
+
 // Test suite to check the PreloadingAttempt with prefetch_holdback.
 class SearchNavigationPrefetchHoldbackBrowserTest
     : public SearchPrefetchBaseBrowserTest {
@@ -4049,86 +4087,6 @@
   }
 }
 
-// Test suite to check that prefetches are not cancelled.
-class SearchNavigationPrefetchNoCancelBrowserTest
-    : public SearchPrefetchBaseBrowserTest {
- public:
-  SearchNavigationPrefetchNoCancelBrowserTest() {
-    std::vector<base::test::FeatureRefAndParams> enabled_features = {
-        {kSearchPrefetchServicePrefetching,
-         {{"max_attempts_per_caching_duration", "3"},
-          {"cache_size", "1"},
-          {"device_memory_threshold_MB", "0"}}},
-        {kSearchNavigationPrefetch, {{}}}};
-    std::vector<base::test::FeatureRef> disabled_features = {};
-
-    feature_list_.InitWithFeaturesAndParameters(enabled_features,
-                                                disabled_features);
-  }
-
-  void SetUpOnMainThread() override {
-    SearchPrefetchBaseBrowserTest::SetUpOnMainThread();
-    // Initialize PreloadingAttempt for the test suite.
-    test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
-    attempt_entry_builder_ =
-        std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>(
-            chrome_preloading_predictor::kOmniboxSearchPredictor);
-  }
-
-  ukm::TestAutoSetUkmRecorder* test_ukm_recorder() {
-    return test_ukm_recorder_.get();
-  }
-
-  const content::test::PreloadingAttemptUkmEntryBuilder&
-  attempt_entry_builder() {
-    return *attempt_entry_builder_;
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-  std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
-  std::unique_ptr<content::test::PreloadingAttemptUkmEntryBuilder>
-      attempt_entry_builder_;
-};
-
-IN_PROC_BROWSER_TEST_F(SearchNavigationPrefetchNoCancelBrowserTest,
-                       PrefetchIsNotCancelled) {
-  set_service_deferral_type(
-      SearchPreloadTestResponseDeferralType::kDeferHeader);
-  auto* search_prefetch_service =
-      SearchPrefetchServiceFactory::GetForProfile(browser()->profile());
-  std::string search_terms = kOmniboxSuggestPrefetchQuery;
-
-  AutocompleteMatch autocomplete_match =
-      CreateSearchSuggestionMatch(search_terms, search_terms, true);
-  AutocompleteResult autocomplete_result;
-  autocomplete_result.AppendMatches({autocomplete_match});
-  SearchPrefetchServiceFactory::GetForProfile(browser()->profile())
-      ->OnResultChanged(GetWebContents(), autocomplete_result);
-
-  WaitUntilStatusChangesTo(
-      GetCanonicalSearchURL(autocomplete_match.destination_url),
-      SearchPrefetchStatus::kCanBeServed);
-  auto prefetch_status =
-      search_prefetch_service->GetSearchPrefetchStatusForTesting(
-          GetCanonicalSearchURL(autocomplete_match.destination_url));
-  ASSERT_TRUE(prefetch_status.has_value());
-  EXPECT_EQ(SearchPrefetchStatus::kCanBeServed, prefetch_status.value());
-
-  // Change the autocomplete to remove "porgs" entirely.
-  autocomplete_match =
-      CreateSearchSuggestionMatch(search_terms, search_terms, true);
-  autocomplete_result.Reset();
-  autocomplete_result.AppendMatches({autocomplete_match});
-  SearchPrefetchServiceFactory::GetForProfile(browser()->profile())
-      ->OnResultChanged(GetWebContents(), autocomplete_result);
-
-  prefetch_status = search_prefetch_service->GetSearchPrefetchStatusForTesting(
-      GetCanonicalSearchURL(autocomplete_match.destination_url));
-  ASSERT_TRUE(prefetch_status.has_value());
-  EXPECT_EQ(SearchPrefetchStatus::kCanBeServed, prefetch_status.value());
-}
-
 class SearchNavigationPrefetchDefaultMatchBrowserTest
     : public testing::WithParamInterface<bool>,
       public SearchPrefetchBaseBrowserTest {
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
index fd805f2..2ac00e2 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
@@ -254,23 +254,22 @@
       }
 
       long getResponseTime() {
-      return mResponseTimestamp;
-      }
+            return mResponseTimestamp;
+        }
 
-      boolean getTimepointsSupported() {
-      return getTimepointsSupported(PlaybackArgs.PlaybackMode.CLASSIC);
-      }
+        boolean getTimepointsSupported(PlaybackArgs.PlaybackMode mode) {
+            return getReadabilityResultForMode(mode).supportsHighlighting;
+        }
 
-      boolean getTimepointsSupported(PlaybackArgs.PlaybackMode mode) {
-      return getReadabilityResultForMode(mode).supportsHighlighting;
-      }
-
-      private ReadAloudReadabilityHooks.ReadabilityResult getReadabilityResultForMode(
-          PlaybackArgs.PlaybackMode mode) {
-      return mReadabilityInfoPerMode.getOrDefault(
-          mode,
-          new ReadAloudReadabilityHooks.ReadabilityResult(
-              /* readable= */ false, /* supportsHighlighting= */ false));
+        private ReadAloudReadabilityHooks.ReadabilityResult getReadabilityResultForMode(
+                PlaybackArgs.PlaybackMode mode) {
+            if (mode == PlaybackMode.UNSPECIFIED) {
+                mode = PlaybackMode.CLASSIC;
+            }
+            return mReadabilityInfoPerMode.getOrDefault(
+                    mode,
+                    new ReadAloudReadabilityHooks.ReadabilityResult(
+                            /* readable= */ false, /* supportsHighlighting= */ false));
       }
   }
 
@@ -1077,11 +1076,18 @@
             mPlaybackHooks.initVoices();
         }
 
+        final String sanitizedUrl = stripUserData(tab.getUrl()).getSpec();
+        final int sanitizedUrlHash = urlToHash(sanitizedUrl);
+        ReadabilityInfo readabilityInfo = getReadabilityInfoIfUnexpired(sanitizedUrlHash);
+        final String playbackLanguage = getLanguageForNewPlayback(tab);
+
+        PlaybackMode playbackMode =
+                getPlaybackModeForNewPlayback(readabilityInfo, playbackLanguage);
+
         // Notify player UI that playback is happening soon and show UI in case there's an error
         // coming.
-        assumeNonNull(mPlayerCoordinator).playTabRequested();
+        assumeNonNull(mPlayerCoordinator).playTabRequested(playbackMode);
 
-        final String playbackLanguage = getLanguageForNewPlayback(tab);
         boolean isTranslated = isTranslated(tab);
         var voices = mPlaybackHooks.getVoicesFor(playbackLanguage);
         // TODO: Don't show entrypoints for unsupported languages
@@ -1092,11 +1098,6 @@
             return promise;
         }
 
-        final String sanitizedUrl = stripUserData(tab.getUrl()).getSpec();
-        final int sanitizedUrlHash = urlToHash(sanitizedUrl);
-        ReadabilityInfo readabilityInfo = getReadabilityInfoIfUnexpired(sanitizedUrlHash);
-        PlaybackMode playbackMode =
-                getPlaybackModeForNewPlayback(readabilityInfo, playbackLanguage);
         PlaybackArgs args =
                 new PlaybackArgs(
                         sanitizedUrl,
@@ -1152,13 +1153,13 @@
      * Whether or not timepoints are supported for the tab's content. Timepoints are needed for word
      * highlighting.
      */
-    public boolean timepointsSupported(Tab tab) {
+    public boolean timepointsSupported(Tab tab, PlaybackMode playbackMode) {
         if (!GURL.isEmptyOrInvalid(tab.getUrl())) {
             int urlHash = urlToHash(stripUserData(tab.getUrl()).getSpec());
             if (sReadabilityInfoMap.get(urlHash) == null) {
                 return false;
             }
-            return sReadabilityInfoMap.get(urlHash).getTimepointsSupported();
+            return sReadabilityInfoMap.get(urlHash).getTimepointsSupported(playbackMode);
         }
         return false;
     }
@@ -1232,7 +1233,7 @@
     }
 
     private void maybeSetUpHighlighter(Playback.Metadata metadata) {
-        boolean highlightingSupported = isHighlightingSupported();
+        boolean highlightingSupported = isHighlightingSupported(metadata.playbackMode());
         ReadAloudMetrics.recordHighlightingSupported(highlightingSupported);
         if (highlightingSupported) {
             if (mHighlighter == null) {
@@ -1459,11 +1460,11 @@
     }
 
     @Override
-    public boolean isHighlightingSupported() {
+    public boolean isHighlightingSupported(PlaybackMode playbackMode) {
         if (mActivePlaybackTabSupplier.get() == null) {
             return false;
         }
-        return timepointsSupported(mActivePlaybackTabSupplier.get())
+        return timepointsSupported(mActivePlaybackTabSupplier.get(), playbackMode)
                 && !isTranslated(mActivePlaybackTabSupplier.get());
     }
 
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java
index 7b99876..8aff2414 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java
@@ -296,6 +296,7 @@
         verify(mLayoutStateProvider).addObserver(mLayoutStateObserver.capture());
         verify(mFullscreenManager).addObserver(mFullscreenObserver.capture());
         when(mMetadata.languageCode()).thenReturn("en");
+        when(mMetadata.playbackMode()).thenReturn(PlaybackMode.CLASSIC);
         when(mPlayback.getMetadata()).thenReturn(mMetadata);
         when(mWebContents.getMainFrame()).thenReturn(mRenderFrameHost);
         when(mRenderFrameHost.getGlobalRenderFrameHostId()).thenReturn(mGlobalRenderFrameHostId);
@@ -654,9 +655,15 @@
                 .isPageReadable(eq(sTestGURL.getSpec()), mCallbackCaptor.capture());
         assertFalse(mController.isReadable(mTab));
 
-        mCallbackCaptor.getValue().onSuccess(sTestGURL.getSpec(), ImmutableMap.of(PlaybackMode.CLASSIC, new ReadAloudReadabilityHooks.ReadabilityResult(true, false)));
+        mCallbackCaptor
+                .getValue()
+                .onSuccess(
+                        sTestGURL.getSpec(),
+                        ImmutableMap.of(
+                                PlaybackMode.CLASSIC,
+                                new ReadAloudReadabilityHooks.ReadabilityResult(true, false)));
         assertTrue(mController.isReadable(mTab));
-        assertFalse(mController.timepointsSupported(mTab));
+        assertFalse(mController.timepointsSupported(mTab, PlaybackMode.CLASSIC));
 
         // now check that the second time the same url loads we don't resend a request
         mController.maybeCheckReadability(mTab);
@@ -745,7 +752,7 @@
                 .getValue()
                 .onFailure(sTestGURL.getSpec(), new Throwable("Something went wrong"));
         assertFalse(mController.isReadable(mTab));
-        assertFalse(mController.timepointsSupported(mTab));
+        assertFalse(mController.timepointsSupported(mTab, PlaybackMode.CLASSIC));
 
         // now check that the second time the same url loads we will resend a request
         mController.maybeCheckReadability(mTab);
@@ -802,14 +809,20 @@
         assertFalse(mController.isReadable(mTab));
 
         // The page is readable, result should be cached.
-        mCallbackCaptor.getValue().onSuccess(sTestGURL.getSpec(), ImmutableMap.of(PlaybackMode.CLASSIC, new ReadAloudReadabilityHooks.ReadabilityResult(true, false)));
+        mCallbackCaptor
+                .getValue()
+                .onSuccess(
+                        sTestGURL.getSpec(),
+                        ImmutableMap.of(
+                                PlaybackMode.CLASSIC,
+                                new ReadAloudReadabilityHooks.ReadabilityResult(true, false)));
         assertTrue(mController.isReadable(mTab));
-        assertFalse(mController.timepointsSupported(mTab));
+        assertFalse(mController.timepointsSupported(mTab, PlaybackMode.CLASSIC));
 
         // A second newly created controller should know that the page is readable.
         mController2 = createController();
         assertTrue(mController2.isReadable(mTab));
-        assertFalse(mController2.timepointsSupported(mTab));
+        assertFalse(mController2.timepointsSupported(mTab, PlaybackMode.CLASSIC));
 
         // The second controller should not send requests to check the same URL's readability.
         mController2.maybeCheckReadability(mTab);
@@ -1686,9 +1699,15 @@
         verify(mHooksImpl, times(1)).isPageReadable(eq(sanitized), mCallbackCaptor.capture());
         assertFalse(mController.isReadable(mTab));
 
-        mCallbackCaptor.getValue().onSuccess(sanitized, ImmutableMap.of(PlaybackMode.CLASSIC, new ReadAloudReadabilityHooks.ReadabilityResult(true, true)));
+        mCallbackCaptor
+                .getValue()
+                .onSuccess(
+                        sanitized,
+                        ImmutableMap.of(
+                                PlaybackMode.CLASSIC,
+                                new ReadAloudReadabilityHooks.ReadabilityResult(true, true)));
         assertTrue(mController.isReadable(mTab));
-        assertTrue(mController.timepointsSupported(mTab));
+        assertTrue(mController.timepointsSupported(mTab, PlaybackMode.CLASSIC));
     }
 
     @Test
@@ -1703,6 +1722,7 @@
         resolvePromises();
         verify(mPlaybackHooks, times(1))
                 .createPlayback(Mockito.any(), mPlaybackCallbackCaptor.capture());
+
         onPlaybackSuccess(mPlayback);
 
         mController.setHighlighterMode(2);
@@ -2280,7 +2300,7 @@
     public void testIsHighlightingSupported_noPlayback() {
         mFakeTranslateBridge.setIsPageTranslated(false);
 
-        assertFalse(mController.isHighlightingSupported());
+        assertFalse(mController.isHighlightingSupported(PlaybackMode.UNSPECIFIED));
     }
 
     @Test
@@ -2290,7 +2310,7 @@
         mController.playTab(mTab, ReadAloudController.Entrypoint.MAGIC_TOOLBAR);
         resolvePromises();
 
-        assertFalse(mController.isHighlightingSupported());
+        assertFalse(mController.isHighlightingSupported(PlaybackMode.UNSPECIFIED));
     }
 
     @Test
@@ -2300,7 +2320,7 @@
         mController.playTab(mTab, ReadAloudController.Entrypoint.MAGIC_TOOLBAR);
         resolvePromises();
 
-        assertFalse(mController.isHighlightingSupported());
+        assertFalse(mController.isHighlightingSupported(PlaybackMode.UNSPECIFIED));
     }
 
     @Test
@@ -2310,7 +2330,7 @@
         mController.playTab(mTab, ReadAloudController.Entrypoint.MAGIC_TOOLBAR);
         resolvePromises();
 
-        assertTrue(mController.isHighlightingSupported());
+        assertTrue(mController.isHighlightingSupported(PlaybackMode.UNSPECIFIED));
     }
 
     @Test
@@ -3325,7 +3345,7 @@
         mController.setTimepointsSupportedForTest("", true);
         when(mTab.getUrl()).thenReturn(new GURL(""));
         // a tab with an empty url should not be supported
-        assertFalse(mController.timepointsSupported(mTab));
+        assertFalse(mController.timepointsSupported(mTab, PlaybackMode.CLASSIC));
     }
 
     @Test
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinator.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinator.java
index 8ab1ae02..c4ea611 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinator.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinator.java
@@ -18,6 +18,7 @@
 import org.chromium.chrome.browser.readaloud.player.expanded.ExpandedPlayerCoordinator;
 import org.chromium.chrome.browser.readaloud.player.mini.MiniPlayerCoordinator;
 import org.chromium.chrome.modules.readaloud.Playback;
+import org.chromium.chrome.modules.readaloud.PlaybackArgs.PlaybackMode;
 import org.chromium.chrome.modules.readaloud.PlaybackListener;
 import org.chromium.chrome.modules.readaloud.Player;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -118,8 +119,9 @@
     }
 
     @Override
-    public void playTabRequested() {
+    public void playTabRequested(PlaybackMode playbackMode) {
         mMediator.setPlayback(null);
+        mMediator.setRequestedPlaybackMode(playbackMode);
         mMediator.setPlaybackState(PlaybackListener.State.BUFFERING);
         if (!mExpandedPlayer.anySheetShowing()) {
             mMiniPlayer.show(/* animate= */ true);
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java
index a42e954..17a01a7 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java
@@ -42,6 +42,7 @@
 import org.chromium.chrome.browser.readaloud.testing.MockPrefServiceHelper;
 import org.chromium.chrome.modules.readaloud.Feedback.FeedbackType;
 import org.chromium.chrome.modules.readaloud.Playback;
+import org.chromium.chrome.modules.readaloud.PlaybackArgs.PlaybackMode;
 import org.chromium.chrome.modules.readaloud.PlaybackArgs.PlaybackVoice;
 import org.chromium.chrome.modules.readaloud.PlaybackListener;
 import org.chromium.chrome.modules.readaloud.Player;
@@ -128,18 +129,19 @@
 
     @Test
     public void testPlayTabRequested() {
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.OVERVIEW);
 
         // Mini player shows in buffering state
         verify(mMediator).setPlayback(eq(null));
         verify(mMediator).setPlaybackState(eq(PlaybackListener.State.BUFFERING));
+        verify(mMediator).setRequestedPlaybackMode(PlaybackMode.OVERVIEW);
         verify(mMiniPlayer).show(eq(true));
     }
 
     @Test
     public void testPlayTabRequested_withExpandedPlayerVisible() {
         doReturn(true).when(mExpandedPlayer).anySheetShowing();
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.UNSPECIFIED);
 
         // Mini player is not shown.
         verify(mMediator).setPlayback(eq(null));
@@ -149,7 +151,7 @@
 
     @Test
     public void testPlaybackReady() {
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.UNSPECIFIED);
         verify(mMediator).setPlayback(eq(null));
         verify(mMediator).setPlaybackState(eq(PlaybackListener.State.BUFFERING));
         reset(mMediator);
@@ -161,7 +163,7 @@
 
     @Test
     public void testPlaybackFailed() {
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.UNSPECIFIED);
         verify(mMediator).setPlayback(eq(null));
         verify(mMediator).setPlaybackState(eq(PlaybackListener.State.BUFFERING));
         reset(mMediator);
@@ -194,7 +196,7 @@
 
     @Test
     public void testDismissPlayers() {
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.UNSPECIFIED);
         verify(mMediator).setPlayback(eq(null));
         verify(mMediator).setPlaybackState(eq(PlaybackListener.State.BUFFERING));
         reset(mMediator);
@@ -208,7 +210,7 @@
 
     @Test
     public void testDismissPlayers_restorablePlayer() {
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.UNSPECIFIED);
         verify(mMediator).setPlayback(eq(null));
         verify(mMediator).setPlaybackState(eq(PlaybackListener.State.BUFFERING));
         reset(mMediator);
@@ -348,7 +350,7 @@
     public void testDestroy() {
         mPlayerCoordinator.addObserver(mObserver);
         // Show mini player
-        mPlayerCoordinator.playTabRequested();
+        mPlayerCoordinator.playTabRequested(PlaybackMode.UNSPECIFIED);
         reset(mMediator);
 
         mPlayerCoordinator.destroy();
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java
index e59c74b71..850939b5 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java
@@ -203,7 +203,8 @@
                     PlayerProperties.HIGHLIGHTING_ENABLED,
                     assumeNonNull(mDelegate.getHighlightingEnabledSupplier().get()));
             mModel.set(
-                    PlayerProperties.HIGHLIGHTING_SUPPORTED, mDelegate.isHighlightingSupported());
+                    PlayerProperties.HIGHLIGHTING_SUPPORTED,
+                    mDelegate.isHighlightingSupported(metadata.playbackMode()));
             mModel.set(PlayerProperties.PLAYBACK_MODE, metadata.playbackMode().getValue());
 
             mTotalTimeMillis = 0;
@@ -211,6 +212,10 @@
         }
     }
 
+    void setRequestedPlaybackMode(PlaybackMode playbackMode) {
+        mModel.set(PlayerProperties.REQUESTED_PLAYBACK_MODE, playbackMode.getValue());
+    }
+
     void setPlaybackState(@PlaybackListener.State int currentPlaybackState) {
         mModel.set(PlayerProperties.PLAYBACK_STATE, currentPlaybackState);
     }
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java
index c48eef3..7603d6ec 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java
@@ -184,7 +184,7 @@
         mPlaybackData = new TestPlaybackData();
         mClock = new FakeClock();
 
-        doReturn(true).when(mDelegate).isHighlightingSupported();
+        doReturn(true).when(mDelegate).isHighlightingSupported(any());
         doReturn(mHighlightingEnabledSupplier).when(mDelegate).getHighlightingEnabledSupplier();
         doReturn(mVoicesSupplier).when(mDelegate).getCurrentLanguageVoicesSupplier();
         doReturn(mPlaybackModeSelectorEnabledSupplier).when(mDelegate).getPlaybackModeSelectionEnabled();
@@ -253,6 +253,15 @@
     }
 
     @Test
+    public void testSetRequestedPlaybackMode() {
+        mMediator.setRequestedPlaybackMode(PlaybackMode.OVERVIEW);
+
+        assertEquals(
+                PlaybackMode.OVERVIEW.getValue(),
+                (int) mModel.get(PlayerProperties.REQUESTED_PLAYBACK_MODE));
+    }
+
+    @Test
     public void testSetPlaybackState() {
         mMediator.setPlaybackState(PLAYING);
         assertEquals(PLAYING, (int) mModel.get(PlayerProperties.PLAYBACK_STATE));
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerProperties.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerProperties.java
index 99e3c12..74da2a9 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerProperties.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerProperties.java
@@ -52,6 +52,8 @@
             new WritableIntPropertyKey();
     public static final WritableIntPropertyKey PLAYBACK_MODE = new WritableIntPropertyKey();
     public static final WritableIntPropertyKey FEEDBACK_TYPE = new WritableIntPropertyKey();
+    public static final WritableIntPropertyKey REQUESTED_PLAYBACK_MODE =
+            new WritableIntPropertyKey();
 
     public static final PropertyKey[] ALL_KEYS = {
         EXPANDED_PLAYER_VISIBILITY,
@@ -75,5 +77,6 @@
         PLAYBACK_MODE_SELECTION_ENABLED,
         PLAYBACK_MODE,
         FEEDBACK_TYPE,
+        REQUESTED_PLAYBACK_MODE,
     };
 }
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayout.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayout.java
index 3c11428..0e13cb742 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayout.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayout.java
@@ -52,6 +52,7 @@
     private ImageView mPlayPauseView;
     private FrameLayout mBackdrop;
     private View mContents;
+    private TextView mLoadingMessage;
 
     // Layouts related to different playback states.
     private LinearLayout mNormalLayout;
@@ -65,6 +66,7 @@
     private float mFinalOpacity;
     private @ColorInt int mBackgroundColorArgb;
     private int mYOffset;
+    private PlaybackMode mRequestedPlaybackMode = PlaybackMode.UNSPECIFIED;
 
     /** Constructor for inflating from XML. */
     public MiniPlayerLayout(Context context, AttributeSet attrs) {
@@ -92,6 +94,8 @@
         mBufferingLayout = (LinearLayout) findViewById(R.id.buffering_layout);
         mErrorLayout = (LinearLayout) findViewById(R.id.error_layout);
 
+        mLoadingMessage = (TextView) findViewById(R.id.loading_message);
+
         // Set dynamic colors.
         Context context = getContext();
         mBackgroundColorArgb = Colors.getMiniPlayerBackgroundColor(context);
@@ -175,11 +179,21 @@
         mTitle.setText(title);
     }
 
-  void setPlaybackMode(PlaybackMode playbackMode) {
-    mSubtitle.setText(
-        playbackMode == PlaybackMode.OVERVIEW
-            ? mContext.getString(R.string.readaloud_chrome_now_playing_audio_overview)
-            : mContext.getString(R.string.readaloud_chrome_now_playing));
+    void setRequestedPlaybackMode(PlaybackMode playbackMode) {
+        mRequestedPlaybackMode = playbackMode;
+        if (mRequestedPlaybackMode == PlaybackMode.OVERVIEW) {
+            mLoadingMessage.setText(
+                    mContext.getString(R.string.readaloud_mini_player_loading_ai_playback));
+        } else {
+            mLoadingMessage.setText(mContext.getString(R.string.readaloud_playback_loading));
+        }
+    }
+
+    void setPlaybackMode(PlaybackMode playbackMode) {
+        mSubtitle.setText(
+                playbackMode == PlaybackMode.OVERVIEW
+                        ? mContext.getString(R.string.readaloud_chrome_now_playing_audio_overview)
+                        : mContext.getString(R.string.readaloud_chrome_now_playing));
     }
 
     /**
@@ -220,18 +234,18 @@
                 // UNKNOWN is currently the "reset" state and can be treated same as buffering.
             case BUFFERING:
             case UNKNOWN:
-                showOnly(mBufferingLayout);
+                showBufferingLayout();
                 mProgressBar.setVisibility(View.GONE);
                 break;
 
             case ERROR:
-                showOnly(mErrorLayout);
+                showErrorLayout();
                 mProgressBar.setVisibility(View.GONE);
                 break;
 
             case PLAYING:
                 if (mLastPlaybackState != PLAYING && mLastPlaybackState != PAUSED) {
-                    showOnly(mNormalLayout);
+                    showNormalLayout();
                     mProgressBar.setVisibility(View.VISIBLE);
                 }
 
@@ -247,7 +261,7 @@
                 if (mLastPlaybackState != PLAYING
                         && mLastPlaybackState != PAUSED
                         && mLastPlaybackState != ERROR) {
-                    showOnly(mNormalLayout);
+                    showNormalLayout();
                     mProgressBar.setVisibility(View.VISIBLE);
                 }
                 mPlayPauseView.setImageResource(R.drawable.mini_play_button);
@@ -261,15 +275,28 @@
         mLastPlaybackState = state;
     }
 
-    // Show `layout` and hide the other two.
-    private void showOnly(LinearLayout layout) {
-        setVisibleIfMatch(mNormalLayout, layout);
-        setVisibleIfMatch(mBufferingLayout, layout);
-        setVisibleIfMatch(mErrorLayout, layout);
+    private void showBufferingLayout() {
+        mBufferingLayout.setVisibility(View.VISIBLE);
+        mNormalLayout.setVisibility(View.GONE);
+        mErrorLayout.setVisibility(View.GONE);
+        if (mRequestedPlaybackMode == PlaybackMode.OVERVIEW) {
+            mLoadingMessage.setText(
+                    mContext.getString(R.string.readaloud_mini_player_loading_ai_playback));
+        } else {
+            mLoadingMessage.setText(mContext.getString(R.string.readaloud_playback_loading));
+        }
     }
 
-    private static void setVisibleIfMatch(LinearLayout a, LinearLayout b) {
-        a.setVisibility(a == b ? View.VISIBLE : View.GONE);
+    private void showNormalLayout() {
+        mNormalLayout.setVisibility(View.VISIBLE);
+        mBufferingLayout.setVisibility(View.GONE);
+        mErrorLayout.setVisibility(View.GONE);
+    }
+
+    private void showErrorLayout() {
+        mErrorLayout.setVisibility(View.VISIBLE);
+        mNormalLayout.setVisibility(View.GONE);
+        mBufferingLayout.setVisibility(View.GONE);
     }
 
     private void setOnClickListener(int id, Runnable handler) {
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayoutUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayoutUnitTest.java
index 176f08d3..eb3b785 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayoutUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayoutUnitTest.java
@@ -85,6 +85,22 @@
     }
 
     @Test
+    public void testBufferingStrings() {
+        mLayout.setRequestedPlaybackMode(PlaybackMode.OVERVIEW);
+        mLayout.onPlaybackStateChanged(PlaybackListener.State.BUFFERING);
+
+        assertEquals(View.VISIBLE, mLayout.findViewById(R.id.buffering_layout).getVisibility());
+        assertEquals(
+                mLayout.getContext().getString(R.string.readaloud_mini_player_loading_ai_playback),
+                ((TextView) mLayout.findViewById(R.id.loading_message)).getText());
+
+        mLayout.setRequestedPlaybackMode(PlaybackMode.CLASSIC);
+        assertEquals(
+                mLayout.getContext().getString(R.string.readaloud_playback_loading),
+                ((TextView) mLayout.findViewById(R.id.loading_message)).getText());
+    }
+
+    @Test
     public void testPlayingState() {
         mLayout.onPlaybackStateChanged(PlaybackListener.State.PLAYING);
 
@@ -152,7 +168,8 @@
     public void testSetSubtitle() {
         mLayout.onPlaybackStateChanged(PlaybackListener.State.PLAYING);
         mLayout.setPlaybackMode(PlaybackMode.OVERVIEW);
-        assertEquals("AI audio playback", ((TextView) mLayout.findViewById(R.id.subtitle)).getText());
+        assertEquals(
+                "AI audio playback", ((TextView) mLayout.findViewById(R.id.subtitle)).getText());
     }
 
     @Test
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerViewBinder.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerViewBinder.java
index 7ec6d469..5818904 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerViewBinder.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerViewBinder.java
@@ -46,6 +46,9 @@
 
         } else if (key == PlayerProperties.INTERACTION_HANDLER) {
             view.setInteractionHandler(model.get(PlayerProperties.INTERACTION_HANDLER));
+        } else if (key == PlayerProperties.REQUESTED_PLAYBACK_MODE) {
+            view.setRequestedPlaybackMode(
+                    PlaybackMode.fromValue(model.get(PlayerProperties.REQUESTED_PLAYBACK_MODE)));
         }
     }
 
diff --git a/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd b/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd
index d6c7128..5232483 100644
--- a/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd
+++ b/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd
@@ -267,6 +267,9 @@
       <message name="IDS_READALOUD_PLAYBACK_LOADING" desc="Message displayed when 'Listen to this page' playback is buffering.">
         Loading…
       </message>
+      <message name="IDS_READALOUD_MINI_PLAYER_LOADING_AI_PLAYBACK" desc="Description message displayed in the mini player when about to play Audio Overviews">
+        Generating AI audio...
+      </message>
        <message name="IDS_READALOUD_VOICE_MENU_TITLE" desc="Voice menu title in options menu.">
         Voice
       </message>
diff --git a/chrome/browser/readaloud/android/resources/android_readaloud_strings_grd/IDS_READALOUD_MINI_PLAYER_LOADING_AI_PLAYBACK.png.sha1 b/chrome/browser/readaloud/android/resources/android_readaloud_strings_grd/IDS_READALOUD_MINI_PLAYER_LOADING_AI_PLAYBACK.png.sha1
new file mode 100644
index 0000000..16d935c2
--- /dev/null
+++ b/chrome/browser/readaloud/android/resources/android_readaloud_strings_grd/IDS_READALOUD_MINI_PLAYER_LOADING_AI_PLAYBACK.png.sha1
@@ -0,0 +1 @@
+87b4f110140a07b7760fe2977eeee4d923bc58a3
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index f3d2f31fee..62c2e1e 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -188,6 +188,7 @@
     "site_settings/file_system_site_entry.ts",
     "site_settings/file_system_site_entry_item.ts",
     "site_settings/file_system_site_list.ts",
+    "site_settings/geolocation_page.ts",
     "site_settings/media_picker.ts",
     "site_settings/notifications_page.ts",
     "site_settings/pdf_documents.ts",
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index c7aebf8..57889c0 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -47,6 +47,7 @@
 import './site_settings/category_setting_exceptions.js';
 import './site_settings/chooser_exception_list.js';
 import './site_settings/site_details_permission_device_entry.js';
+import './site_settings/geolocation_page.js';
 import './site_settings/media_picker.js';
 import './site_settings/notifications_page.js';
 import './site_settings/pdf_documents.js';
@@ -253,6 +254,7 @@
 export {FileSystemSiteEntryElement} from './site_settings/file_system_site_entry.js';
 export {FileSystemSiteEntryItemElement} from './site_settings/file_system_site_entry_item.js';
 export {FileSystemSiteListElement} from './site_settings/file_system_site_list.js';
+export {GeolocationPageElement} from './site_settings/geolocation_page.js';
 export {NotificationsPageElement} from './site_settings/notifications_page.js';
 export {AppHandlerEntry, AppProtocolEntry, HandlerEntry, ProtocolEntry, ProtocolHandlersElement} from './site_settings/protocol_handlers.js';
 export {SettingsCategoryDefaultRadioGroupElement} from './site_settings/settings_category_default_radio_group.js';
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index bac18889..0026474 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -7,9 +7,7 @@
       .radio-group-sub-heading {
         padding-bottom: 10px;
       }
-      .padded-radio-section {
-        padding-inline-start: 50px;
-      }
+
       settings-collapse-radio-button {
         --settings-collapse-toggle-min-height: var(--cr-section-min-height);
       }
@@ -499,113 +497,7 @@
         <settings-subpage page-title="$i18n{siteSettingsCategoryLocation}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsLocationDescription}
-          </div>
-
-          <template is="dom-if"
-              if="[[!enablePermissionSiteSettingsRadioButton_]]">
-            <div id="locationRadioGroup" class="radio-group">
-              <h2>$i18n{siteSettingsDefaultBehavior}</h2>
-              <div id="geolocationSubHeading"
-                  class="secondary radio-sub-heading">
-                  $i18n{siteSettingsDefaultBehaviorDescription}
-              </div>
-
-              <cr-radio-group
-                  on-selected-changed="onLocationTopLevelRadioChanged_">
-                <cr-radio-button no-collapse
-                    id="locationAskRadioButton"
-                    name="location-ask-radio-button"
-                    checked$="[[isLocationAllowed_]]">
-                  <cr-icon icon="settings:location-on"></cr-icon>
-                  $i18n{siteSettingsLocationAllowed}
-                </cr-radio-button>
-
-                <settings-radio-group
-                    id="locationCpssRadioGroup"
-                    pref="{{prefs.generated.geolocation}}"
-                    selectable-elements="cr-radio-button"
-                    hidden$="[[!isLocationAllowed_]]">
-                  <cr-radio-button class="padded-radio-section"
-                      name="[[settingsStateEnum_.QUIET]]"
-                      pref="[[prefs.generated.geolocation]]"
-                      label="$i18n{siteSettingsLocationAskQuiet}">
-                  </cr-radio-button>
-
-                  <cr-radio-button class="padded-radio-section"
-                      name="[[settingsStateEnum_.CPSS]]"
-                      pref="[[prefs.generated.geolocation]]"
-                      label="$i18n{siteSettingsLocationAskCPSS}">
-                  </cr-radio-button>
-
-                  <cr-radio-button class="padded-radio-section"
-                      name="[[settingsStateEnum_.LOUD]]"
-                      pref="[[prefs.generated.geolocation]]"
-                      label="$i18n{siteSettingsLocationAskLoud}">
-                  </cr-radio-button>
-                </settings-radio-group>
-
-                <cr-radio-button class="two-line"
-                    id="location-block-radio-button"
-                    name="location-block-radio-button"
-                    sub-label="$i18n{siteSettingsLocationBlockedSubLabel}"
-                    checked$="[[!isLocationAllowed_]]">
-                  <cr-icon icon="privacy:location-off"></cr-icon>
-                  $i18n{siteSettingsLocationBlocked}
-                </cr-radio-button>
-              </cr-radio-group>
-            </div>
-          </template>
-
-          <template is="dom-if"
-              if="[[enablePermissionSiteSettingsRadioButton_]]">
-            <settings-category-default-radio-group
-                id="locationDefaultRadioGroup"
-                category="[[contentSettingsTypesEnum_.GEOLOCATION]]"
-                allow-option-label="$i18n{siteSettingsLocationAllowed}"
-                allow-option-icon="settings:location-on"
-                block-option-label="$i18n{siteSettingsLocationBlocked}"
-                block-option-icon="privacy:location-off"
-                on-selected-changed="onLocationTopLevelRadioChanged2_">
-            </settings-category-default-radio-group>
-            <div class="radio-group"
-                id="locationCpssRadioGroup"
-                hidden$="[[!isLocationAllowed_]]">
-              <h2 class="cpss-heading">
-                $i18n{siteSettingsHowToShowRequests}
-              </h2>
-              <settings-radio-group
-                  pref="{{prefs.generated.geolocation}}"
-                  selectable-elements="cr-radio-button">
-                <cr-radio-button
-                    name="[[settingsStateEnum_.QUIET]]"
-                    pref="[[prefs.generated.geolocation]]"
-                    label="$i18n{siteSettingsLocationAskQuiet}">
-                </cr-radio-button>
-
-                <cr-radio-button
-                    name="[[settingsStateEnum_.CPSS]]"
-                    pref="[[prefs.generated.geolocation]]"
-                    label="$i18n{siteSettingsLocationAskCPSS}">
-                </cr-radio-button>
-
-                <cr-radio-button
-                    name="[[settingsStateEnum_.LOUD]]"
-                    pref="[[prefs.generated.geolocation]]"
-                    label="$i18n{siteSettingsLocationAskLoud}">
-                </cr-radio-button>
-              </settings-radio-group>
-            </div>
-          </template>
-
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.GEOLOCATION]]"
-              read-only-list
-              allow-header="$i18n{siteSettingsLocationAllowedExceptions}"
-              block-header="$i18n{siteSettingsLocationBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-geolocation-page prefs="{{prefs}}"></settings-location-page>
         </settings-subpage>
       </template>
       <template is="dom-if" route-path="/handlers" no-search>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
index 4f69f3a..e951b93 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
@@ -20,6 +20,7 @@
 import '../settings_page/settings_animated_pages.js';
 import '../settings_page/settings_subpage.js';
 import '../settings_shared.css.js';
+import '../site_settings/geolocation_page.js';
 import '../site_settings/notifications_page.js';
 import '../site_settings/settings_category_default_radio_group.js';
 import '../site_settings/smart_card_readers_page.js';
@@ -46,7 +47,7 @@
 import {RouteObserverMixin, Router} from '../router.js';
 import type {SafetyHubBrowserProxy} from '../safety_hub/safety_hub_browser_proxy.js';
 import {SafetyHubBrowserProxyImpl} from '../safety_hub/safety_hub_browser_proxy.js';
-import {ChooserType, ContentSetting, ContentSettingsTypes, CookieControlsMode, SettingsState} from '../site_settings/constants.js';
+import {ChooserType, ContentSetting, ContentSettingsTypes, CookieControlsMode} from '../site_settings/constants.js';
 import type {SiteSettingsPrefsBrowserProxy} from '../site_settings/site_settings_prefs_browser_proxy.js';
 import {SiteSettingsPrefsBrowserProxyImpl} from '../site_settings/site_settings_prefs_browser_proxy.js';
 
@@ -232,12 +233,6 @@
             loadTimeData.getBoolean('enableAutomaticFullscreenContentSetting'),
       },
 
-      enablePermissionSiteSettingsRadioButton_: {
-        type: Boolean,
-        value: () =>
-            loadTimeData.getBoolean('enablePermissionSiteSettingsRadioButton'),
-      },
-
       focusConfig_: {
         type: Object,
         value() {
@@ -277,14 +272,6 @@
         },
       },
 
-      /**
-       * Expose the Permissions SettingsState enum to HTML bindings.
-       */
-      settingsStateEnum_: {
-        type: Object,
-        value: SettingsState,
-      },
-
       searchFilter_: {
         type: String,
         value: '',
@@ -357,8 +344,6 @@
         value: () => loadTimeData.getBoolean('enableIncognitoTrackingProtections'),
       },
 
-      isNotificationAllowed_: Boolean,
-      isLocationAllowed_: Boolean,
       allSitesPageTitle_: String,
     };
   }
@@ -385,7 +370,6 @@
   declare private isPrivacySandboxRestricted_: boolean;
   declare private isPrivacySandboxRestrictedNoticeEnabled_: boolean;
   declare private enableAutomaticFullscreenContentSetting_: boolean;
-  declare private enablePermissionSiteSettingsRadioButton_: boolean;
   private privateStateTokensEnabled_: boolean;
   declare private autoPictureInPictureEnabled_: boolean;
   declare private capturedSurfaceControlEnabled_: boolean;
@@ -404,8 +388,6 @@
       SiteSettingsPrefsBrowserProxyImpl.getInstance();
   private safetyHubBrowserProxy_: SafetyHubBrowserProxy =
       SafetyHubBrowserProxyImpl.getInstance();
-  declare private isNotificationAllowed_: boolean;
-  declare private isLocationAllowed_: boolean;
   // <if expr="chrome_root_store_cert_management_ui">
   declare private enableCertManagementUIV2_: boolean;
   // </if>
@@ -431,7 +413,6 @@
         (status: BlockAutoplayStatus) =>
             this.onBlockAutoplayStatusChanged_(status));
 
-    this.updateLocationAndNotificationState_();
     this.updateAllSitesPageTitle_();
   }
 
@@ -516,72 +497,6 @@
     Router.getInstance().navigateTo(routes.INCOGNITO_TRACKING_PROTECTIONS);
   }
 
-  private async updateLocationAndNotificationState_() {
-    const [notificationDefaultValue, locationDefaultValue] = await Promise.all([
-      this.siteSettingsPrefsBrowserProxy_.getDefaultValueForContentType(
-          ContentSettingsTypes.NOTIFICATIONS),
-      this.siteSettingsPrefsBrowserProxy_.getDefaultValueForContentType(
-          ContentSettingsTypes.GEOLOCATION),
-    ]);
-    this.isNotificationAllowed_ =
-        (notificationDefaultValue.setting === ContentSetting.ASK);
-    this.isLocationAllowed_ =
-        (locationDefaultValue.setting === ContentSetting.ASK);
-  }
-
-  private onLocationTopLevelRadioChanged_(event: CustomEvent<{value: string}>) {
-    const radioButtonName = event.detail.value;
-    switch (radioButtonName) {
-      case 'location-block-radio-button':
-        this.setPrefValue('generated.geolocation', SettingsState.BLOCK);
-        this.isLocationAllowed_ = false;
-        break;
-      case 'location-ask-radio-button':
-        this.setPrefValue('generated.geolocation', SettingsState.CPSS);
-        this.isLocationAllowed_ = true;
-        break;
-    }
-  }
-
-  private onNotificationTopLevelRadioChanged_(
-      event: CustomEvent<{value: string}>) {
-    const radioButtonName = event.detail.value;
-    switch (radioButtonName) {
-      case 'notification-block-radio-button':
-        this.setPrefValue('generated.notification', SettingsState.BLOCK);
-        this.isNotificationAllowed_ = false;
-        break;
-      case 'notification-ask-radio-button':
-        this.setPrefValue('generated.notification', SettingsState.CPSS);
-        this.isNotificationAllowed_ = true;
-        break;
-    }
-  }
-
-  private onLocationTopLevelRadioChanged2_(
-      event: CustomEvent<{value: boolean}>) {
-    const selected = event.detail.value;
-    if (selected) {
-      this.setPrefValue('generated.geolocation', SettingsState.CPSS);
-      this.isLocationAllowed_ = true;
-    } else {
-      this.setPrefValue('generated.geolocation', SettingsState.BLOCK);
-      this.isLocationAllowed_ = false;
-    }
-  }
-
-  private onNotificationTopLevelRadioChanged2_(
-      event: CustomEvent<{value: boolean}>) {
-    const selected = event.detail.value;
-    if (selected) {
-      this.setPrefValue('generated.notification', SettingsState.CPSS);
-      this.isNotificationAllowed_ = true;
-    } else {
-      this.setPrefValue('generated.notification', SettingsState.BLOCK);
-      this.isNotificationAllowed_ = false;
-    }
-  }
-
   private onPrivacyGuideClick_() {
     this.metricsBrowserProxy_.recordPrivacyGuideEntryExitHistogram(
         PrivacyGuideInteractions.SETTINGS_LINK_ROW_ENTRY);
diff --git a/chrome/browser/resources/settings/site_settings/OWNERS b/chrome/browser/resources/settings/site_settings/OWNERS
index 0e263ad..6f380459 100644
--- a/chrome/browser/resources/settings/site_settings/OWNERS
+++ b/chrome/browser/resources/settings/site_settings/OWNERS
@@ -4,3 +4,4 @@
 
 per-file media_picker*=file://chrome/browser/ui/views/media_preview/OWNERS
 per-file notifications_page.*=lyf@chromium.org
+per-file geolocation_page.*=lyf@chromium.org
diff --git a/chrome/browser/resources/settings/site_settings/geolocation_page.html b/chrome/browser/resources/settings/site_settings/geolocation_page.html
new file mode 100644
index 0000000..353493d6
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/geolocation_page.html
@@ -0,0 +1,112 @@
+<style include="cr-shared-style cr-hidden-style settings-shared">
+  .content-settings-header,
+  .radio-group {
+    padding: 0 var(--cr-section-padding);
+  }
+
+  .padded-radio-section {
+    padding-inline-start: 50px;
+  }
+
+  .cpss-heading {
+    padding-bottom: 13px;
+    padding-top: 13px;
+  }
+</style>
+<div class="content-settings-header secondary">
+  $i18n{siteSettingsLocationDescription}
+</div>
+<template is="dom-if"
+    if="[[!enablePermissionSiteSettingsRadioButton_]]">
+  <div id="locationRadioGroup" class="radio-group">
+    <h2>$i18n{siteSettingsDefaultBehavior}</h2>
+    <div id="geolocationSubHeading"
+        class="secondary radio-sub-heading">
+        $i18n{siteSettingsDefaultBehaviorDescription}
+    </div>
+    <cr-radio-group
+        on-selected-changed="onLocationTopLevelRadioChanged_">
+      <cr-radio-button no-collapse
+          id="locationAskRadioButton"
+          name="location-ask-radio-button"
+          checked$="[[isLocationAllowed_]]">
+        <cr-icon icon="settings:location-on"></cr-icon>
+        $i18n{siteSettingsLocationAllowed}
+      </cr-radio-button>
+      <settings-radio-group
+          id="locationCpssRadioGroup"
+          pref="{{prefs.generated.geolocation}}"
+          selectable-elements="cr-radio-button"
+          hidden$="[[!isLocationAllowed_]]">
+        <cr-radio-button class="padded-radio-section"
+            name="[[settingsStateEnum_.QUIET]]"
+            pref="[[prefs.generated.geolocation]]"
+            label="$i18n{siteSettingsLocationAskQuiet}">
+        </cr-radio-button>
+        <cr-radio-button class="padded-radio-section"
+            name="[[settingsStateEnum_.CPSS]]"
+            pref="[[prefs.generated.geolocation]]"
+            label="$i18n{siteSettingsLocationAskCPSS}">
+        </cr-radio-button>
+        <cr-radio-button class="padded-radio-section"
+            name="[[settingsStateEnum_.LOUD]]"
+            pref="[[prefs.generated.geolocation]]"
+            label="$i18n{siteSettingsLocationAskLoud}">
+        </cr-radio-button>
+      </settings-radio-group>
+      <cr-radio-button class="two-line"
+          id="location-block-radio-button"
+          name="location-block-radio-button"
+          sub-label="$i18n{siteSettingsLocationBlockedSubLabel}"
+          checked$="[[!isLocationAllowed_]]">
+        <cr-icon icon="privacy:location-off"></cr-icon>
+        $i18n{siteSettingsLocationBlocked}
+      </cr-radio-button>
+    </cr-radio-group>
+  </div>
+</template>
+<template is="dom-if"
+    if="[[enablePermissionSiteSettingsRadioButton_]]">
+  <settings-category-default-radio-group
+      id="locationDefaultRadioGroup"
+      category="[[contentSettingsTypesEnum_.GEOLOCATION]]"
+      allow-option-label="$i18n{siteSettingsLocationAllowed}"
+      allow-option-icon="settings:location-on"
+      block-option-label="$i18n{siteSettingsLocationBlocked}"
+      block-option-icon="privacy:location-off"
+      on-selected-changed="onLocationTopLevelRadioChanged2_">
+  </settings-category-default-radio-group>
+  <div class="radio-group"
+      id="locationCpssRadioGroup"
+      hidden$="[[!isLocationAllowed_]]">
+    <h2 class="cpss-heading">
+      $i18n{siteSettingsHowToShowRequests}
+    </h2>
+    <settings-radio-group
+        pref="{{prefs.generated.geolocation}}"
+        selectable-elements="cr-radio-button">
+      <cr-radio-button
+          name="[[settingsStateEnum_.QUIET]]"
+          pref="[[prefs.generated.geolocation]]"
+          label="$i18n{siteSettingsLocationAskQuiet}">
+      </cr-radio-button>
+      <cr-radio-button
+          name="[[settingsStateEnum_.CPSS]]"
+          pref="[[prefs.generated.geolocation]]"
+          label="$i18n{siteSettingsLocationAskCPSS}">
+      </cr-radio-button>
+      <cr-radio-button
+          name="[[settingsStateEnum_.LOUD]]"
+          pref="[[prefs.generated.geolocation]]"
+          label="$i18n{siteSettingsLocationAskLoud}">
+      </cr-radio-button>
+    </settings-radio-group>
+  </div>
+</template>
+<category-setting-exceptions
+    category="[[contentSettingsTypesEnum_.GEOLOCATION]]"
+    read-only-list
+    allow-header="$i18n{siteSettingsLocationAllowedExceptions}"
+    block-header="$i18n{siteSettingsLocationBlockedExceptions}"
+    search-filter="[[searchFilter_]]">
+</category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/geolocation_page.ts b/chrome/browser/resources/settings/site_settings/geolocation_page.ts
new file mode 100644
index 0000000..1f87bf7
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/geolocation_page.ts
@@ -0,0 +1,120 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import '/shared/settings/prefs/prefs.js';
+import 'chrome://resources/cr_elements/cr_hidden_style.css.js';
+import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js';
+import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js';
+import 'chrome://resources/cr_elements/cr_shared_style.css.js';
+import 'chrome://resources/cr_elements/icons.html.js';
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import '../controls/settings_radio_group.js';
+import '../privacy_icons.html.js';
+import '../settings_shared.css.js';
+
+import {PrefsMixin} from '/shared/settings/prefs/prefs_mixin.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {loadTimeData} from '../i18n_setup.js';
+
+import {ContentSetting, ContentSettingsTypes, SettingsState} from './constants.js';
+import {getTemplate} from './geolocation_page.html.js';
+import type {SiteSettingsPrefsBrowserProxy} from './site_settings_prefs_browser_proxy.js';
+import {SiteSettingsPrefsBrowserProxyImpl} from './site_settings_prefs_browser_proxy.js';
+
+const GeolocationPageElementBase = PrefsMixin(PolymerElement);
+
+export class GeolocationPageElement extends GeolocationPageElementBase {
+  static get is() {
+    return 'settings-geolocation-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      enablePermissionSiteSettingsRadioButton_: {
+        type: Boolean,
+        value: () =>
+            loadTimeData.getBoolean('enablePermissionSiteSettingsRadioButton'),
+      },
+
+      /** Expose the Permissions SettingsState enum to HTML bindings. */
+      settingsStateEnum_: {
+        type: Object,
+        value: SettingsState,
+      },
+
+      /** Expose ContentSettingsTypes enum to HTML bindings. */
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+
+      /** Expose ContentSetting enum to HTML bindings. */
+      contentSettingEnum_: {
+        type: Object,
+        value: ContentSetting,
+      },
+
+      isLocationAllowed_: Boolean,
+    };
+  }
+
+  declare private enablePermissionSiteSettingsRadioButton_: boolean;
+  declare private isLocationAllowed_: boolean;
+  private siteSettingsPrefsBrowserProxy_: SiteSettingsPrefsBrowserProxy =
+      SiteSettingsPrefsBrowserProxyImpl.getInstance();
+
+  override ready() {
+    super.ready();
+    this.updateLocationState_();
+  }
+
+  private async updateLocationState_() {
+    const [locationDefaultValue] = await Promise.all([
+      this.siteSettingsPrefsBrowserProxy_.getDefaultValueForContentType(
+          ContentSettingsTypes.GEOLOCATION),
+    ]);
+    this.isLocationAllowed_ =
+        (locationDefaultValue.setting === ContentSetting.ASK);
+  }
+
+  private onLocationTopLevelRadioChanged_(event: CustomEvent<{value: string}>) {
+    const radioButtonName = event.detail.value;
+    switch (radioButtonName) {
+      case 'location-block-radio-button':
+        this.setPrefValue('generated.geolocation', SettingsState.BLOCK);
+        this.isLocationAllowed_ = false;
+        break;
+      case 'location-ask-radio-button':
+        this.setPrefValue('generated.geolocation', SettingsState.CPSS);
+        this.isLocationAllowed_ = true;
+        break;
+    }
+  }
+
+  private onLocationTopLevelRadioChanged2_(
+      event: CustomEvent<{value: boolean}>) {
+    const selected = event.detail.value;
+    if (selected) {
+      this.setPrefValue('generated.geolocation', SettingsState.CPSS);
+      this.isLocationAllowed_ = true;
+    } else {
+      this.setPrefValue('generated.geolocation', SettingsState.BLOCK);
+      this.isLocationAllowed_ = false;
+    }
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-geolocation-page': GeolocationPageElement;
+  }
+}
+
+customElements.define(GeolocationPageElement.is, GeolocationPageElement);
diff --git a/chrome/browser/resources/signin/history_sync_optin/BUILD.gn b/chrome/browser/resources/signin/history_sync_optin/BUILD.gn
index 0bdf5a8..0c8e008 100644
--- a/chrome/browser/resources/signin/history_sync_optin/BUILD.gn
+++ b/chrome/browser/resources/signin/history_sync_optin/BUILD.gn
@@ -12,6 +12,7 @@
   static_files = [ "history_sync_optin.html" ]
 
   ts_files = [
+    "browser_proxy.ts",
     "history_sync_optin.ts",
     "history_sync_optin_app.ts",
     "history_sync_optin_app.html.ts",
diff --git a/chrome/browser/resources/signin/history_sync_optin/browser_proxy.ts b/chrome/browser/resources/signin/history_sync_optin/browser_proxy.ts
new file mode 100644
index 0000000..cb6f46d
--- /dev/null
+++ b/chrome/browser/resources/signin/history_sync_optin/browser_proxy.ts
@@ -0,0 +1,35 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from './history_sync_optin.mojom-webui.js';
+import type {PageHandlerInterface} from './history_sync_optin.mojom-webui.js';
+
+// Exporting the interface helps when creating a TestBrowserProxy wrapper.
+export interface HistorySyncOptInBrowserProxy {
+  callbackRouter: PageCallbackRouter;
+  handler: PageHandlerInterface;
+}
+
+export class HistorySyncOptInBrowserProxyImpl implements
+    HistorySyncOptInBrowserProxy {
+  callbackRouter: PageCallbackRouter;
+  handler: PageHandlerInterface;
+  private constructor() {
+    this.callbackRouter = new PageCallbackRouter();
+    this.handler = new PageHandlerRemote();
+    PageHandlerFactory.getRemote().createHistorySyncOptinHandler(
+        this.callbackRouter.$.bindNewPipeAndPassRemote(),
+        (this.handler as PageHandlerRemote).$.bindNewPipeAndPassReceiver());
+  }
+
+  static getInstance(): HistorySyncOptInBrowserProxy {
+    return instance || (instance = new HistorySyncOptInBrowserProxyImpl());
+  }
+
+  static setInstance(proxy: HistorySyncOptInBrowserProxy) {
+    instance = proxy;
+  }
+}
+
+let instance: HistorySyncOptInBrowserProxy|null = null;
diff --git a/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.html.ts b/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.html.ts
index c4c5639..6064792 100644
--- a/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.html.ts
+++ b/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.html.ts
@@ -16,9 +16,9 @@
       <div id="subtitle">$i18n{historySyncOptInSubtitle}</div>
     </div>
     <div id="buttonRow">
-      <cr-button id="cancelButton" class="tonal-button"
-          @click="${this.onCancel_}">
-        $i18n{historySyncOptInCancelButtonLabel}
+      <cr-button id="rejectButton" class="tonal-button"
+          @click="${this.onReject_}">
+        $i18n{historySyncOptInRejectButtonLabel}
       </cr-button>
       <cr-button id="acceptButton" class="action-button"
           @click="${this.onAccept_}">
diff --git a/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.ts b/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.ts
index a9c06082..ccfb76c8 100644
--- a/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.ts
+++ b/chrome/browser/resources/signin/history_sync_optin/history_sync_optin_app.ts
@@ -9,6 +9,8 @@
 import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js';
 import {loadTimeData} from '//resources/js/load_time_data.js';
 
+import {HistorySyncOptInBrowserProxyImpl} from './browser_proxy.js';
+import type {HistorySyncOptInBrowserProxy} from './browser_proxy.js';
 import {getCss} from './history_sync_optin_app.css.js';
 import {getHtml} from './history_sync_optin_app.html.js';
 
@@ -35,10 +37,16 @@
 
   protected accessor accountImageSrc_: string =
       loadTimeData.getString('accountPictureUrl');
+  private historySyncOptInBrowserProxy_: HistorySyncOptInBrowserProxy =
+      HistorySyncOptInBrowserProxyImpl.getInstance();
 
-  // TODO(crbug.com/326912202): Wire the keys.
-  protected onCancel_() {}
-  protected onAccept_() {}
+  protected onReject_() {
+    this.historySyncOptInBrowserProxy_.handler.reject();
+  }
+
+  protected onAccept_() {
+    this.historySyncOptInBrowserProxy_.handler.accept();
+  }
 }
 
 declare global {
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
index 65324306..4b59065f 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
@@ -351,8 +351,7 @@
     }
 
     private void populateCache(AccountInfoService accountInfoService) {
-        Promise<List<CoreAccountInfo>> accountsPromise =
-                AccountManagerFacadeProvider.getInstance().getCoreAccountInfos();
+        var accountsPromise = AccountManagerFacadeProvider.getInstance().getAccounts();
         if (accountsPromise.isFulfilled()) {
             populateCacheForAllAccounts(accountInfoService, accountsPromise.getResult());
         } else {
@@ -364,9 +363,9 @@
     }
 
     private void populateCacheForAllAccounts(
-            AccountInfoService accountInfoService, List<CoreAccountInfo> accounts) {
-        for (CoreAccountInfo coreAccountInfo : accounts) {
-            populateCacheForAccount(accountInfoService, coreAccountInfo.getEmail());
+            AccountInfoService accountInfoService, List<AccountInfo> accounts) {
+        for (CoreAccountInfo account : accounts) {
+            populateCacheForAccount(accountInfoService, account.getEmail());
         }
     }
 
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
index b556f9d3..3d350fe9 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
@@ -39,7 +39,7 @@
         mSigninManager = signinManager;
         mAccountManagerFacade = AccountManagerFacadeProvider.getInstance();
         mAccountManagerFacade.addObserver(this);
-        if (mAccountManagerFacade.getCoreAccountInfos().isFulfilled()) {
+        if (mAccountManagerFacade.getAccounts().isFulfilled()) {
             onCoreAccountInfosChanged();
         }
         mNumOfChildAccountChecksDone = 0;
diff --git a/chrome/browser/supervised_user/linux_mac_windows/supervised_user_extensions_metrics_delegate_impl_unittest.cc b/chrome/browser/supervised_user/linux_mac_windows/supervised_user_extensions_metrics_delegate_impl_unittest.cc
index 0958c29..b429323385 100644
--- a/chrome/browser/supervised_user/linux_mac_windows/supervised_user_extensions_metrics_delegate_impl_unittest.cc
+++ b/chrome/browser/supervised_user/linux_mac_windows/supervised_user_extensions_metrics_delegate_impl_unittest.cc
@@ -50,7 +50,8 @@
 
     supervised_user_metrics_service_ =
         std::make_unique<supervised_user::SupervisedUserMetricsService>(
-            profile()->GetPrefs(), GetURLFilter(),
+            profile()->GetPrefs(),
+            *SupervisedUserServiceFactory::GetForProfile(profile_.get()),
             std::make_unique<SupervisedUserExtensionsMetricsDelegateImpl>(
                 extensions::ExtensionRegistry::Get(profile()), profile()));
     CHECK(supervised_user_metrics_service_);
@@ -68,12 +69,6 @@
         prefs::kSupervisedUserMetricsDayId);
   }
 
-  supervised_user::SupervisedUserURLFilter* GetURLFilter() {
-    supervised_user::SupervisedUserService* service =
-        SupervisedUserServiceFactory::GetForProfile(profile_.get());
-    return service->GetURLFilter();
-  }
-
   base::HistogramTester histogram_tester_;
 
  private:
diff --git a/chrome/browser/supervised_user/supervised_user_metrics_service_factory.cc b/chrome/browser/supervised_user/supervised_user_metrics_service_factory.cc
index 6e9c396..15599add 100644
--- a/chrome/browser/supervised_user/supervised_user_metrics_service_factory.cc
+++ b/chrome/browser/supervised_user/supervised_user_metrics_service_factory.cc
@@ -71,7 +71,7 @@
 
   return std::make_unique<supervised_user::SupervisedUserMetricsService>(
       profile->GetPrefs(),
-      SupervisedUserServiceFactory::GetForProfile(profile)->GetURLFilter(),
+      *SupervisedUserServiceFactory::GetForProfile(profile),
       std::move(extensions_metrics_delegate));
 }
 
diff --git a/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc b/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc
index b54303c..b1f1c7e 100644
--- a/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc
+++ b/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc
@@ -1678,7 +1678,7 @@
 #if BUILDFLAG(ENABLE_GLIC)
     {glic::prefs::kGlicRolloutEligibility,
      {syncable_prefs_ids::kGlicRolloutEligibility, syncer::PRIORITY_PREFERENCES,
-      sync_preferences::PrefSensitivity::kNone,
+      sync_preferences::PrefSensitivity::kExemptFromUserControlWhileSignedIn,
       sync_preferences::MergeBehavior::kNone}},
 #endif  // BUILDFLAG(ENABLE_GLIC)
 });
@@ -1709,14 +1709,4 @@
       std::inserter(syncable_prefs, syncable_prefs.end()));
   return syncable_prefs;
 }
-
-bool ChromeSyncablePrefsDatabase::IsPreferenceAlwaysSyncing(
-    std::string_view pref_name) const {
-#if BUILDFLAG(ENABLE_GLIC)
-  if (pref_name == glic::prefs::kGlicRolloutEligibility) {
-    return true;
-  }
-#endif  // BUILDFLAG(ENABLE_GLIC)
-  return common_syncable_prefs_database_.IsPreferenceAlwaysSyncing(pref_name);
-}
 }  // namespace browser_sync
diff --git a/chrome/browser/sync/prefs/chrome_syncable_prefs_database.h b/chrome/browser/sync/prefs/chrome_syncable_prefs_database.h
index 8d172d6..3ae6e999 100644
--- a/chrome/browser/sync/prefs/chrome_syncable_prefs_database.h
+++ b/chrome/browser/sync/prefs/chrome_syncable_prefs_database.h
@@ -24,8 +24,6 @@
   std::map<std::string_view, sync_preferences::SyncablePrefMetadata>
   GetAllSyncablePrefsForTest() const;
 
-  bool IsPreferenceAlwaysSyncing(std::string_view pref_name) const override;
-
  private:
   // This defines the list of preferences that are syncable across all
   // platforms.
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 2bd4a83..20d0962 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -136,8 +136,6 @@
     "webid/identity_dialog_controller.h",
     "webid/identity_ui_utils.cc",
     "webid/identity_ui_utils.h",
-    "webui/accessibility/accessibility_ui.cc",
-    "webui/accessibility/accessibility_ui.h",
     "webui/autofill_and_password_manager_internals/autofill_internals_ui.cc",
     "webui/autofill_and_password_manager_internals/autofill_internals_ui.h",
     "webui/autofill_and_password_manager_internals/internals_ui_handler.cc",
@@ -418,6 +416,7 @@
     "//chrome/browser/ui/tab_contents:impl",
     "//chrome/browser/ui/webui",
     "//chrome/browser/ui/webui/about",
+    "//chrome/browser/ui/webui/accessibility",
     "//chrome/browser/ui/webui/bluetooth_internals",
     "//chrome/browser/ui/zoom",
     "//chrome/browser/updates/announcement_notification",
@@ -1366,12 +1365,6 @@
       "views/file_system_access/file_system_access_scroll_panel.h",
       "views/search_engine_choice/search_engine_choice_dialog_view.cc",
       "views/search_engine_choice/search_engine_choice_dialog_view.h",
-      "webui/access_code_cast/access_code_cast_dialog.cc",
-      "webui/access_code_cast/access_code_cast_dialog.h",
-      "webui/access_code_cast/access_code_cast_handler.cc",
-      "webui/access_code_cast/access_code_cast_handler.h",
-      "webui/access_code_cast/access_code_cast_ui.cc",
-      "webui/access_code_cast/access_code_cast_ui.h",
       "webui/app_service_internals/app_service_internals_page_handler_impl.cc",
       "webui/app_service_internals/app_service_internals_page_handler_impl.h",
       "webui/app_service_internals/app_service_internals_ui.cc",
@@ -1689,6 +1682,7 @@
       "//chrome/browser/first_party_sets",
       "//chrome/browser/lifetime:termination_notification",
       "//chrome/browser/privacy_sandbox",
+      "//chrome/browser/ui/webui/access_code_cast",
 
       # TODO(crbug.com/370804668i): Remove the dependency when chrome/browser/serial
       # gets modularized.
@@ -1957,6 +1951,14 @@
       "//chrome/browser/ui/tabs:tab_strip_impl",
       "//chrome/browser/ui/bookmarks:impl",
       "//chrome/browser/ui/feature_first_run:impl",
+
+      # TODO(crbug.com/364667551): It includes quite a few files from //c/b/ui's
+      # subdirectories such as views and webui which are not modularized yet.
+      "//chrome/browser/ui/webui/access_code_cast",
+
+      # TODO(crbug.com/364667551): It includes //c/b/ui/browser.h and
+      # //c/b/ui/browser_window.h.
+      "//chrome/browser/ui/webui/accessibility",
     ]
 
     if (is_mac) {
@@ -3144,10 +3146,6 @@
       "views/web_apps/force_installed_deprecated_apps_dialog_view.h",
       "views/web_apps/force_installed_preinstalled_deprecated_app_dialog_view.cc",
       "views/web_apps/force_installed_preinstalled_deprecated_app_dialog_view.h",
-      "webui/app_home/app_home_page_handler.cc",
-      "webui/app_home/app_home_page_handler.h",
-      "webui/app_home/app_home_ui.cc",
-      "webui/app_home/app_home_ui.h",
       "webui/app_management/web_app_settings_page_handler.cc",
       "webui/app_management/web_app_settings_page_handler.h",
       "webui/app_settings/web_app_settings_navigation_throttle.cc",
@@ -3186,6 +3184,7 @@
       "//chrome/browser/on_device_translation",
       "//chrome/browser/on_device_translation:language_pack_util",
       "//chrome/browser/shortcuts",
+      "//chrome/browser/ui/webui/app_home",
       "//chrome/browser/ui/webui/signin:profile",
       "//chrome/browser/ui/webui/signin:profile_impl",
       "//components/capture_mode",
@@ -3197,8 +3196,13 @@
 
     # Any circular includes must depend on the target "//chrome/browser:browser_public_dependencies".
     # Non-android and non-chromeos-ash circular deps.
-    allow_circular_includes_from +=
-        [ "//chrome/browser/ui/webui/signin:profile_impl" ]
+    allow_circular_includes_from += [
+      "//chrome/browser/ui/webui/signin:profile_impl",
+
+      # TODO(crbug.com/364667551): It includes quite a few files from //c/b/ui's
+      # subdirectories such as views and webui which are not modularized yet.
+      "//chrome/browser/ui/webui/app_home",
+    ]
 
     if (enable_dice_support) {
       sources += [
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncCoordinator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncCoordinator.java
index a2703aaf..0349aee 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncCoordinator.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncCoordinator.java
@@ -36,7 +36,7 @@
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler.BackPressResult;
 import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
-import org.chromium.components.signin.base.CoreAccountInfo;
+import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
 import org.chromium.components.signin.identitymanager.IdentityManager;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
@@ -312,15 +312,15 @@
         }
 
         AccountManagerFacadeProvider.getInstance()
-                .getCoreAccountInfos()
+                .getAccounts()
                 .then(
-                        coreAccountInfos -> {
-                            finishLoadingAndSelectSigninFlow(coreAccountInfos);
+                        accounts -> {
+                            finishLoadingAndSelectSigninFlow(accounts);
                             mFlowInitialized = true;
                         });
     }
 
-    private void finishLoadingAndSelectSigninFlow(List<CoreAccountInfo> coreAccountInfos) {
+    private void finishLoadingAndSelectSigninFlow(List<AccountInfo> accounts) {
         // The history opt-in screen should be shown after the coreAccountInfos
         // become available to avoid showing additional loading UI after history
         // opt-in screen is shown.
@@ -332,7 +332,7 @@
             return;
         }
 
-        if (!coreAccountInfos.isEmpty()) {
+        if (!accounts.isEmpty()) {
             showSigninBottomSheet();
             SigninMetricsUtils.logSigninStarted(mSigninAccessPoint);
             return;
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java
index f386a4b..b1fe4a1 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java
@@ -350,8 +350,7 @@
                 AccountManagerFacadeProvider.getInstance();
         if (visibleAccount == null) {
             visibleAccount =
-                    AccountUtils.getDefaultCoreAccountInfoIfFulfilled(
-                            accountManagerFacade.getCoreAccountInfos());
+                    AccountUtils.getDefaultAccountIfFulfilled(accountManagerFacade.getAccounts());
         }
         return visibleAccount;
     }
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerMediator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerMediator.java
index b1f9717..41f156e7 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerMediator.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerMediator.java
@@ -18,6 +18,7 @@
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.AccountsChangeObserver;
+import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.ui.modelutil.MVCListAdapter;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -50,14 +51,13 @@
         mAccountManagerFacade.addObserver(this);
         mProfileDataCache.addObserver(this);
         updateAccounts(
-                AccountUtils.getCoreAccountInfosIfFulfilledOrEmpty(
-                        mAccountManagerFacade.getCoreAccountInfos()));
+                AccountUtils.getAccountsIfFulfilledOrEmpty(mAccountManagerFacade.getAccounts()));
     }
 
     /** Implements {@link AccountsChangeObserver}. */
     @Override
     public void onCoreAccountInfosChanged() {
-        mAccountManagerFacade.getCoreAccountInfos().then(this::updateAccounts);
+        mAccountManagerFacade.getAccounts().then(this::updateAccounts);
     }
 
     /** Implements {@link ProfileDataCache.Observer}. */
@@ -88,16 +88,16 @@
         mAccountManagerFacade.removeObserver(this);
     }
 
-    private void updateAccounts(List<CoreAccountInfo> coreAccountInfos) {
+    private void updateAccounts(List<AccountInfo> accounts) {
         mListModel.clear();
 
         // Add an "existing account" row for each account
-        for (CoreAccountInfo coreAccountInfo : coreAccountInfos) {
+        for (CoreAccountInfo account : accounts) {
             PropertyModel model =
                     ExistingAccountRowProperties.createModel(
-                            mProfileDataCache.getProfileDataOrDefault(coreAccountInfo.getEmail()),
+                            mProfileDataCache.getProfileDataOrDefault(account.getEmail()),
                             /* isCurrentlySelected= */ false,
-                            () -> mAccountPickerListener.onAccountSelected(coreAccountInfo));
+                            () -> mAccountPickerListener.onAccountSelected(account));
             mListModel.add(new MVCListAdapter.ListItem(ItemType.EXISTING_ACCOUNT_ROW, model));
         }
 
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FullscreenSigninMediator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FullscreenSigninMediator.java
index 695de7d..485393ac 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FullscreenSigninMediator.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FullscreenSigninMediator.java
@@ -177,7 +177,8 @@
     }
 
     private Account getSelectedAccount() {
-        return AccountUtils.createAccountFromName(assertNonNull(mSelectedAccount).getEmail());
+        assertNonNull(mSelectedAccount);
+        return CoreAccountInfo.getAndroidAccountFrom(mSelectedAccount);
     }
 
     private void onNativeLoaded() {
@@ -209,7 +210,7 @@
 
         // We need the account fetching to be complete before we can hide the initial loading
         // spinner.
-        if (!mAccountManagerFacade.getCoreAccountInfos().isFulfilled()) return;
+        if (!mAccountManagerFacade.getAccounts().isFulfilled()) return;
 
         if (mDelegate.getChildAccountStatusSupplier().get() != null
                 && mDelegate.getPolicyLoadListener().get() != null
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediator.java
index 3d2e2f5..ab4ffa5 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediator.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediator.java
@@ -237,8 +237,7 @@
                 mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN);
         if (visibleAccount == null) {
             visibleAccount =
-                    AccountUtils.getDefaultCoreAccountInfoIfFulfilled(
-                            mAccountManagerFacade.getCoreAccountInfos());
+                    AccountUtils.getDefaultAccountIfFulfilled(mAccountManagerFacade.getAccounts());
         }
         return visibleAccount;
     }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 7f15f0a..b7c8083 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3112,15 +3112,6 @@
       <message name="IDS_CONTEXTMENU_PRINT_PAGE" desc="This string is shown in the context menu for printing the current page. [CHAR_LIMIT=30]">
         Print
       </message>
-      <message name="IDS_CONTEXTMENU_BACK" desc="This string is shown in the context menu for going to the previous page in history. [CHAR_LIMIT=30]">
-        Back
-      </message>
-      <message name="IDS_CONTEXTMENU_FORWARD" desc="This string is shown in the context menu for going to the next page in history. [CHAR_LIMIT=30]">
-        Forward
-      </message>
-      <message name="IDS_CONTEXTMENU_RELOAD" desc="This string is shown in the context menu for reloading the current page. [CHAR_LIMIT=30]">
-        Reload
-      </message>
       <message name="IDS_CONTEXTMENU_OPEN_IN_OTHER_WINDOW" desc="Context sensitive menu item to open the selected link in the other window. [CHAR_LIMIT=30]">
         Open in other window
       </message>
@@ -5681,9 +5672,6 @@
       </message>
 
       <!-- Custom Context Menu Informations -->
-      <message name="IDS_CONTEXTMENU_PAGE_NAVIGATION_TITLE" desc="The title of a context menu tab when the item pressed contains more than one type. This indicates that all the actions are related to navigating between the pages.">
-        PAGE NAVIGATION
-      </message>
       <message name="IDS_CONTEXTMENU_PAGE_TITLE" desc="The title of a context menu tab when the item pressed contains more than one type. This indicates that all the actions are related to the page.">
         PAGE
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_BACK.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_BACK.png.sha1
deleted file mode 100644
index 70b8c29f..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_BACK.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2f07b9c56d247dde3cbc98308aad3e487c46e9ef
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_FORWARD.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_FORWARD.png.sha1
deleted file mode 100644
index 70b8c29f..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_FORWARD.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2f07b9c56d247dde3cbc98308aad3e487c46e9ef
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_RELOAD.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_RELOAD.png.sha1
deleted file mode 100644
index 70b8c29f..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_RELOAD.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2f07b9c56d247dde3cbc98308aad3e487c46e9ef
\ No newline at end of file
diff --git a/chrome/browser/ui/ash/system/BUILD.gn b/chrome/browser/ui/ash/system/BUILD.gn
index 0e5870ea..10e7c0b 100644
--- a/chrome/browser/ui/ash/system/BUILD.gn
+++ b/chrome/browser/ui/ash/system/BUILD.gn
@@ -33,6 +33,7 @@
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/browser/ui/ash/login",
     "//chrome/browser/ui/ash/system_web_apps",
+    "//chrome/browser/ui/webui/access_code_cast",
     "//chrome/browser/ui/webui/ash/bluetooth",
     "//chrome/browser/ui/webui/ash/internet",
     "//chrome/browser/ui/webui/ash/multidevice_setup",
diff --git a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc
index 183ace4..6f529af 100644
--- a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc
+++ b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc
@@ -9,13 +9,15 @@
 #include "base/json/values_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/user_metrics.h"
+#include "base/time/time.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/safety_hub/safety_hub_constants.h"
 #include "chrome/browser/ui/safety_hub/safety_hub_util.h"
 #include "chrome/common/chrome_features.h"
+#include "components/content_settings/core/browser/content_settings_info.h"
 #include "components/content_settings/core/browser/content_settings_type_set.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings_constraints.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/content_settings/core/common/content_settings_utils.h"
 #include "components/permissions/notifications_engagement_service.h"
@@ -29,41 +31,19 @@
 
 namespace {
 
+constexpr char kRevokedStatusDictKeyStr[] = "revoked_status";
+constexpr char kIgnoreStr[] = "ignore";
+constexpr char kRevokeStr[] = "revoke";
+constexpr char kProposedStr[] = "proposed";
+constexpr char kSiteEngagementStr[] = "site_engagement";
+constexpr char kDailyNotificationCountStr[] = "daily_notification_count";
+constexpr char kHasReportedProposalStr[] = "has_reported_proposal";
+constexpr char kHasReportedFalsePositiveStr[] = "has_reported_false_positive";
+constexpr char kTimestampStr[] = "timestamp";
+
 constexpr char kRevocationResultHistogram[] =
     "Settings.SafetyHub.DisruptiveNotificationRevocations.RevocationResult";
 
-content_settings::ContentSettingConstraints GetDefaultConstraint(
-    base::Clock* clock) {
-  content_settings::ContentSettingConstraints constraint(clock->Now());
-  constraint.set_lifetime(safety_hub_util::GetCleanUpThreshold());
-  return constraint;
-}
-
-content_settings::ContentSettingConstraints GetConstraintFromInfo(
-    const content_settings::SettingInfo& info) {
-  auto constraint = content_settings::ContentSettingConstraints(
-      info.metadata.expiration() - info.metadata.lifetime());
-  constraint.set_lifetime(info.metadata.lifetime());
-  return constraint;
-}
-
-base::Value UpdateContentSettingValue(
-    HostContentSettingsMap* hcsm,
-    const GURL& url,
-    base::Value::Dict dict,
-    const content_settings::ContentSettingConstraints& constraint) {
-  CHECK(url.is_valid());
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)), constraint);
-
-  return hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-}
-
 void UpdateNotificationPermission(HostContentSettingsMap* hcsm,
                                   const GURL& url,
                                   ContentSetting setting_value) {
@@ -73,8 +53,105 @@
       setting_value);
 }
 
+DisruptiveNotificationPermissionsManager::RevocationState GetRevocationState(
+    const base::Value::Dict& dict) {
+  const std::string* revocation_state =
+      dict.FindString(kRevokedStatusDictKeyStr);
+  if (!revocation_state) {
+    return DisruptiveNotificationPermissionsManager::RevocationState::kNone;
+  } else if (*revocation_state == kProposedStr) {
+    return DisruptiveNotificationPermissionsManager::RevocationState::kProposed;
+  } else if (*revocation_state == kRevokeStr) {
+    return DisruptiveNotificationPermissionsManager::RevocationState::kRevoked;
+  } else if (*revocation_state == kIgnoreStr) {
+    return DisruptiveNotificationPermissionsManager::RevocationState::kIgnore;
+  } else {
+    return DisruptiveNotificationPermissionsManager::RevocationState::kUnknown;
+  }
+}
+
 }  // namespace
 
+DisruptiveNotificationPermissionsManager::ContentSettingHelper::
+    ContentSettingHelper(HostContentSettingsMap& hcsm)
+    : hcsm_(hcsm) {}
+
+std::optional<DisruptiveNotificationPermissionsManager::RevocationEntry>
+DisruptiveNotificationPermissionsManager::ContentSettingHelper::
+    GetRevocationEntry(const GURL& url) {
+  content_settings::SettingInfo info;
+  base::Value stored_value = hcsm_->GetWebsiteSetting(
+      url, url,
+      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
+  if (stored_value.is_none() || !stored_value.is_dict()) {
+    return std::nullopt;
+  }
+  base::Value::Dict dict = std::move(stored_value).TakeDict();
+
+  return RevocationEntry{
+      .revocation_state = GetRevocationState(dict),
+      .site_engagement = dict.FindDouble(kSiteEngagementStr).value_or(0),
+      .daily_notification_count =
+          dict.FindInt(kDailyNotificationCountStr).value_or(0),
+      .timestamp =
+          base::ValueToTime(dict.Find(kTimestampStr)).value_or(base::Time()),
+      .has_reported_proposal =
+          dict.FindBool(kHasReportedProposalStr).value_or(false),
+      .has_reported_false_positive =
+          dict.FindBool(kHasReportedFalsePositiveStr).value_or(false),
+      .created_at = info.metadata.expiration() - info.metadata.lifetime(),
+      .lifetime = info.metadata.lifetime(),
+  };
+}
+
+void DisruptiveNotificationPermissionsManager::ContentSettingHelper::
+    PersistRevocationEntry(const GURL& url, const RevocationEntry& entry) {
+  CHECK(url.is_valid());
+
+  std::string_view revocation_state_string;
+  switch (entry.revocation_state) {
+    case DisruptiveNotificationPermissionsManager::RevocationState::kNone:
+    case DisruptiveNotificationPermissionsManager::RevocationState::kUnknown:
+      // Invalid entry, we won't persist it.
+      return;
+    case DisruptiveNotificationPermissionsManager::RevocationState::kProposed:
+      revocation_state_string = kProposedStr;
+      break;
+    case DisruptiveNotificationPermissionsManager::RevocationState::kRevoked:
+      revocation_state_string = kRevokeStr;
+      break;
+    case DisruptiveNotificationPermissionsManager::RevocationState::kIgnore:
+      revocation_state_string = kIgnoreStr;
+      break;
+  }
+  base::Value::Dict dict;
+  dict.Set(kRevokedStatusDictKeyStr, revocation_state_string);
+  dict.Set(kSiteEngagementStr, entry.site_engagement);
+  dict.Set(kDailyNotificationCountStr, entry.daily_notification_count);
+  dict.Set(kTimestampStr, base::TimeToValue(entry.timestamp));
+  if (entry.has_reported_proposal) {
+    dict.Set(kHasReportedProposalStr, entry.has_reported_proposal);
+  }
+  if (entry.has_reported_false_positive) {
+    dict.Set(kHasReportedFalsePositiveStr, entry.has_reported_false_positive);
+  }
+  content_settings::ContentSettingConstraints constraints(entry.created_at);
+  constraints.set_lifetime(entry.lifetime);
+  hcsm_->SetWebsiteSettingCustomScope(
+      ContentSettingsPattern::FromURLNoWildcard(url),
+      ContentSettingsPattern::Wildcard(),
+      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
+      base::Value(std::move(dict)), constraints);
+}
+
+void DisruptiveNotificationPermissionsManager::ContentSettingHelper::
+    DeleteRevocationEntry(const GURL& url) {
+  hcsm_->SetWebsiteSettingCustomScope(
+      ContentSettingsPattern::FromURLNoWildcard(url),
+      ContentSettingsPattern::Wildcard(),
+      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, {});
+}
+
 DisruptiveNotificationPermissionsManager::SafetyHubNotificationWrapper::
     ~SafetyHubNotificationWrapper() = default;
 
@@ -153,17 +230,6 @@
     GURL url = GURL(item.primary_pattern.ToString());
     CHECK(url.is_valid());
 
-    // Check if content setting already exists.
-    content_settings::SettingInfo info;
-    base::Value stored_value = hcsm_->GetWebsiteSetting(
-        url, url,
-        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-        &info);
-    if (!stored_value.is_none()) {
-      revoked_anything |=
-          HandleExistingValueAndMaybeRevoke(url, std::move(stored_value), info);
-      continue;
-    }
     auto it = notification_count_map.find(
         std::make_pair(item.primary_pattern, item.secondary_pattern));
     int notification_count =
@@ -174,14 +240,34 @@
       continue;
     }
 
+    // At this point we know that the url is allowed to send notifications and
+    // is classified as sending disruptive notifications. Now check if we
+    // already have a revocation entry for this url and process it.
+    //
+    // Note that proposed revocations from previous runs will not actually be
+    // revoked if they are not anymore classified are disruptive.
+    std::optional<RevocationEntry> revocation_entry =
+        ContentSettingHelper(*hcsm_).GetRevocationEntry(url);
+    if (revocation_entry) {
+      revoked_anything |=
+          HandleExistingValueAndMaybeRevoke(url, *revocation_entry);
+      continue;
+    }
+
     // Only can revoke notification permissions if ASK is the default setting.
     if (default_notification_setting != CONTENT_SETTING_ASK) {
       base::UmaHistogramEnumeration(kRevocationResultHistogram,
                                     RevocationResult::kNoRevokeDefaultBlock);
       continue;
     }
-    StoreRevokedDisruptiveNotificationPermission(
-        url, GetDefaultConstraint(clock_), notification_count);
+
+    ContentSettingHelper(*hcsm_).PersistRevocationEntry(
+        url, RevocationEntry{
+                 .revocation_state = RevocationState::kProposed,
+                 .site_engagement = site_engagement_service_->GetScore(url),
+                 .daily_notification_count = notification_count,
+                 .timestamp = clock_->Now(),
+             });
     base::UmaHistogramCounts100(
         "Settings.SafetyHub.DisruptiveNotificationRevocations.Proposed."
         "NotificationCount",
@@ -201,77 +287,45 @@
 }
 
 bool DisruptiveNotificationPermissionsManager::
-    HandleExistingValueAndMaybeRevoke(
-        const GURL& url,
-        base::Value stored_value,
-        const content_settings::SettingInfo& info) {
-  CHECK(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  auto recorded_score = dict.FindDouble(safety_hub::kSiteEngagementStr);
-  if (!recorded_score.has_value()) {
-    return false;
+    HandleExistingValueAndMaybeRevoke(const GURL& url,
+                                      const RevocationEntry& revocation_entry) {
+  switch (revocation_entry.revocation_state) {
+    case RevocationState::kNone:
+    case RevocationState::kUnknown:
+    case RevocationState::kRevoked:
+      // kNone and kUnknown mean that this is an invalid entry, while kRevoked
+      // should never happen, because the content setting is granted. In any of
+      // these three cases we are in an inconsistent state, so let's clean this
+      // up.
+      ContentSettingHelper(*hcsm_).DeleteRevocationEntry(url);
+      return false;
+    case RevocationState::kIgnore:
+      base::UmaHistogramEnumeration(kRevocationResultHistogram,
+                                    RevocationResult::kIgnore);
+      return false;
+    case RevocationState::kProposed:
+      if (!features::kSafetyHubDisruptiveNotificationRevocationShadowRun
+               .Get() &&
+          CanRevokeNotifications(url, revocation_entry)) {
+        RevokeNotifications(url, revocation_entry);
+        return true;
+      } else {
+        base::UmaHistogramEnumeration(
+            kRevocationResultHistogram,
+            RevocationResult::kAlreadyInProposedRevokeList);
+        return false;
+      }
   }
-  const std::string* revoked_status =
-      dict.FindString(safety_hub::kRevokedStatusDictKeyStr);
-  if (!revoked_status) {
-    return false;
-  }
-  if (*revoked_status == safety_hub::kFalsePositiveStr) {
-    base::UmaHistogramEnumeration(kRevocationResultHistogram,
-                                  RevocationResult::kAlreadyFalsePositive);
-    return false;
-  }
-
-  if (*revoked_status == safety_hub::kIgnoreStr) {
-    base::UmaHistogramEnumeration(kRevocationResultHistogram,
-                                  RevocationResult::kIgnore);
-    return false;
-  }
-
-  if (*revoked_status != safety_hub::kProposedStr) {
-    return false;
-  }
-
-  if (!features::kSafetyHubDisruptiveNotificationRevocationShadowRun.Get() &&
-      CanRevokeNotifications(url, dict)) {
-    RevokeNotifications(url, std::move(dict));
-    return true;
-  }
-
-  base::UmaHistogramEnumeration(kRevocationResultHistogram,
-                                RevocationResult::kAlreadyInProposedRevokeList);
-  return false;
-}
-
-void DisruptiveNotificationPermissionsManager::RecordFalsePositive(
-    const GURL& url,
-    base::Value::Dict dict,
-    const content_settings::SettingInfo& info,
-    double new_score) {
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kFalsePositiveStr);
-  UpdateContentSettingValue(hcsm_.get(), url, std::move(dict),
-                            GetConstraintFromInfo(info));
-  base::UmaHistogramCounts100(
-      "Settings.SafetyHub.DisruptiveNotificationRevocations."
-      "FalsePositive.SiteEngagement",
-      new_score);
-  base::UmaHistogramEnumeration(kRevocationResultHistogram,
-                                RevocationResult::kFalsePositive);
 }
 
 bool DisruptiveNotificationPermissionsManager::CanRevokeNotifications(
     const GURL& url,
-    const base::Value::Dict& dict) {
-  const base::Value* stored_timestamp = dict.Find(safety_hub::kTimestampStr);
-  const base::TimeDelta delta_since_proposed_revocation =
-      clock_->Now() -
-      base::ValueToTime(stored_timestamp).value_or(clock_->Now());
+    const RevocationEntry& revocation_entry) {
+  CHECK_EQ(revocation_entry.revocation_state, RevocationState::kProposed);
   const int days_since_proposed_revocation =
-      delta_since_proposed_revocation.InDays();
+      (clock_->Now() - revocation_entry.timestamp).InDays();
 
-  const bool has_reported_metrics =
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false);
-  return has_reported_metrics ||
+  return revocation_entry.has_reported_proposal ||
          days_since_proposed_revocation >=
              features::
                  kSafetyHubDisruptiveNotificationRevocationWaitingForMetricsDays
@@ -280,17 +334,13 @@
 
 void DisruptiveNotificationPermissionsManager::RevokeNotifications(
     const GURL& url,
-    base::Value::Dict dict) {
-  const base::Value* stored_timestamp = dict.Find(safety_hub::kTimestampStr);
+    RevocationEntry revocation_entry) {
   const base::TimeDelta delta_since_proposed_revocation =
-      clock_->Now() -
-      base::ValueToTime(stored_timestamp).value_or(clock_->Now());
-  const bool has_reported_metrics =
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false);
-
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr);
-  UpdateContentSettingValue(hcsm_.get(), url, std::move(dict),
-                            GetDefaultConstraint(clock_));
+      clock_->Now() - revocation_entry.timestamp;
+  revocation_entry.revocation_state = RevocationState::kRevoked;
+  revocation_entry.created_at = clock_->Now();
+  revocation_entry.lifetime = safety_hub_util::GetCleanUpThreshold();
+  ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, revocation_entry);
   UpdateNotificationPermission(hcsm_.get(), url,
                                ContentSetting::CONTENT_SETTING_DEFAULT);
   base::UmaHistogramEnumeration(kRevocationResultHistogram,
@@ -302,7 +352,7 @@
   base::UmaHistogramBoolean(
       "Settings.SafetyHub.DisruptiveNotificationRevocations."
       "HasReportedMetricsBeforeRevocation",
-      has_reported_metrics);
+      revocation_entry.has_reported_proposal);
 }
 
 void DisruptiveNotificationPermissionsManager::DisplayNotification() {
@@ -341,22 +391,10 @@
   // values.
   for (const auto& revoked_permission : revoked_permissions) {
     const GURL& url = revoked_permission.primary_pattern.ToRepresentativeUrl();
-    content_settings::SettingInfo info;
-    base::Value stored_value = hcsm_->GetWebsiteSetting(
-        url, url,
-        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-        &info);
-    if (stored_value.is_none()) {
-      continue;
-    }
-    CHECK(stored_value.is_dict());
-    base::Value::Dict dict = std::move(stored_value).TakeDict();
-    const std::string* revoked_status =
-        dict.FindString(safety_hub::kRevokedStatusDictKeyStr);
-    if (!revoked_status) {
-      continue;
-    }
-    if (*revoked_status == safety_hub::kRevokeStr) {
+    std::optional<RevocationEntry> revocation_entry =
+        ContentSettingHelper(*hcsm_).GetRevocationEntry(url);
+    if (revocation_entry &&
+        revocation_entry->revocation_state == RevocationState::kRevoked) {
       result.emplace_back(revoked_permission);
     }
   }
@@ -372,7 +410,10 @@
   // If the user decides to regrant permissions for `url`, check if it has
   // revoked disruptive notification permissions. If so, allow notification
   // permissions and ignore the `url` from future auto-revocation.
-  if (!safety_hub_util::IsUrlRevokedDisruptiveNotification(hcsm_.get(), url)) {
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm_).GetRevocationEntry(url);
+  if (!revocation_entry ||
+      revocation_entry->revocation_state != RevocationState::kRevoked) {
     return;
   }
 
@@ -380,15 +421,11 @@
 
   UpdateNotificationPermission(hcsm_.get(), url,
                                ContentSetting::CONTENT_SETTING_ALLOW);
-  base::Value stored_value(hcsm_->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS));
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kIgnoreStr);
   // Update the stored status value to "ignore" while clearing the constraints
   // so the value won't expire.
-  UpdateContentSettingValue(hcsm_.get(), url, std::move(dict),
-                            /*constraints*/ {});
+  revocation_entry->revocation_state = RevocationState::kIgnore;
+  revocation_entry->lifetime = base::TimeDelta();
+  ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, *revocation_entry);
 }
 
 void DisruptiveNotificationPermissionsManager::UndoRegrantPermissionForUrl(
@@ -402,10 +439,11 @@
   if (!permission_types.contains(ContentSettingsType::NOTIFICATIONS)) {
     return;
   }
-  base::Value stored_value(hcsm_->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS));
-  if (stored_value.is_none()) {
+
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm_).GetRevocationEntry(url);
+  if (!revocation_entry ||
+      revocation_entry->revocation_state != RevocationState::kIgnore) {
     return;
   }
 
@@ -413,9 +451,11 @@
 
   UpdateNotificationPermission(hcsm_.get(), url,
                                ContentSetting::CONTENT_SETTING_DEFAULT);
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr);
-  UpdateContentSettingValue(hcsm_.get(), url, std::move(dict), constraints);
+  revocation_entry->revocation_state = RevocationState::kRevoked;
+  revocation_entry->created_at =
+      constraints.expiration() - constraints.lifetime();
+  revocation_entry->lifetime = constraints.lifetime();
+  ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, *revocation_entry);
 }
 
 void DisruptiveNotificationPermissionsManager::ClearRevokedPermissionsList() {
@@ -423,23 +463,14 @@
       ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
   for (const auto& revoked_permission : revoked_permissions) {
     const GURL& url = revoked_permission.primary_pattern.ToRepresentativeUrl();
-    base::Value stored_value(hcsm_->GetWebsiteSetting(
-        url, url,
-        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS));
-    if (stored_value.is_none()) {
-      continue;
+    std::optional<RevocationEntry> revocation_entry =
+        ContentSettingHelper(*hcsm_).GetRevocationEntry(url);
+    if (revocation_entry &&
+        revocation_entry->revocation_state == RevocationState::kRevoked) {
+      DeleteRevokedPermissionContentSetting(
+          revoked_permission.primary_pattern,
+          revoked_permission.secondary_pattern);
     }
-    CHECK(stored_value.is_dict());
-    const std::string& setting_val =
-        stored_value.GetDict()
-            .Find(safety_hub::kRevokedStatusDictKeyStr)
-            ->GetString();
-    if (setting_val != safety_hub::kRevokeStr) {
-      continue;
-    }
-
-    DeleteRevokedPermissionContentSetting(revoked_permission.primary_pattern,
-                                          revoked_permission.secondary_pattern);
   }
 }
 
@@ -466,30 +497,8 @@
   return low_site_engagement_score && high_daily_notification_count;
 }
 
-void DisruptiveNotificationPermissionsManager::
-    StoreRevokedDisruptiveNotificationPermission(
-        const GURL& url,
-        const content_settings::ContentSettingConstraints& constraints,
-        int daily_notification_count) {
-  // The url should be valid as it is checked that the pattern represents a
-  // single origin.
-  CHECK(url.is_valid());
-
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-  dict.Set(safety_hub::kSiteEngagementStr,
-           site_engagement_service_->GetScore(url));
-  dict.Set(safety_hub::kDailyNotificationCountStr, daily_notification_count);
-  dict.Set(safety_hub::kTimestampStr, base::TimeToValue(clock_->Now()));
-  hcsm_->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)), constraints);
-}
-
 // static
-void DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+void DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
     Profile* profile,
     const GURL& url,
     FalsePositiveReason reason,
@@ -502,28 +511,17 @@
     return;
   }
 
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  if (stored_value.is_none()) {
-    return;
-  }
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  const std::string* revoked_status =
-      dict.FindString(safety_hub::kRevokedStatusDictKeyStr);
-  if (!revoked_status) {
-    return;
-  }
-  if (*revoked_status != safety_hub::kRevokeStr &&
-      *revoked_status != safety_hub::kProposedStr) {
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  if (!revocation_entry ||
+      (revocation_entry->revocation_state != RevocationState::kProposed &&
+       revocation_entry->revocation_state != RevocationState::kRevoked) ||
+      revocation_entry->has_reported_false_positive) {
     return;
   }
 
-  const base::Value* stored_timestamp = dict.Find(safety_hub::kTimestampStr);
   base::TimeDelta delta_since_proposed_revocation =
-      base::Time::Now() -
-      base::ValueToTime(stored_timestamp).value_or(base::Time::Now());
+      base::Time::Now() - revocation_entry->timestamp;
   const int days_since_proposed_revocation =
       delta_since_proposed_revocation.InDays();
 
@@ -539,8 +537,7 @@
     return;
   }
 
-  const double old_site_engagement_score =
-      dict.FindDouble(safety_hub::kSiteEngagementStr).value_or(0.0);
+  const double old_site_engagement_score = revocation_entry->site_engagement;
   const double new_site_engagement_score =
       site_engagement::SiteEngagementService::Get(profile)->GetScore(url);
   if (new_site_engagement_score - old_site_engagement_score <
@@ -556,23 +553,14 @@
       .SetReason(static_cast<int>(reason))
       .SetNewSiteEngagement(new_site_engagement_score)
       .SetOldSiteEngagement(old_site_engagement_score)
-      .SetDailyAverageVolume(
-          dict.FindInt(safety_hub::kDailyNotificationCountStr).value_or(0))
+      .SetDailyAverageVolume(revocation_entry->daily_notification_count)
       .Record(ukm::UkmRecorder::Get());
+  revocation_entry->has_reported_false_positive = true;
+  ContentSettingHelper(*hcsm).PersistRevocationEntry(url, *revocation_entry);
 
   base::UmaHistogramEnumeration(
       "Settings.SafetyHub.DisruptiveNotificationRevocations.FalsePositive",
       reason);  // kPageVisit or kNotificationClick
-
-  // Update the content setting value and update the expiration to 7 days to
-  // catch possible user regrant.
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kFalsePositiveStr);
-  content_settings::ContentSettingConstraints constraint(base::Time::Now());
-  constraint.set_lifetime(base::Days(
-      features::
-          kSafetyHubDisruptiveNotificationRevocationUserRegrantWaitingPeriod
-              .Get()));
-  UpdateContentSettingValue(hcsm, url, std::move(dict), constraint);
 }
 
 // static
@@ -587,40 +575,22 @@
   if (!hcsm || !url.is_valid()) {
     return;
   }
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  if (stored_value.is_none()) {
-    return;
-  }
-  CHECK(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-
-  const std::string* revoked_status =
-      dict.FindString(safety_hub::kRevokedStatusDictKeyStr);
-  if (!revoked_status) {
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  if (!revocation_entry ||
+      revocation_entry->revocation_state != RevocationState::kRevoked) {
     return;
   }
 
-  // It should be already false positive since the website is being visited.
-  if (*revoked_status != safety_hub::kFalsePositiveStr) {
-    return;
-  }
-
-  const base::Value* stored_timestamp = dict.Find(safety_hub::kTimestampStr);
   base::TimeDelta delta_since_proposed_revocation =
-      base::Time::Now() -
-      base::ValueToTime(stored_timestamp).value_or(base::Time::Now());
+      base::Time::Now() - revocation_entry->timestamp;
   ukm::builders::SafetyHub_DisruptiveNotificationRevocations_UserRegrant(
       source_id)
       .SetDaysSinceRevocation(delta_since_proposed_revocation.InDays())
       .SetNewSiteEngagement(
           site_engagement::SiteEngagementService::Get(profile)->GetScore(url))
-      .SetOldSiteEngagement(
-          dict.FindDouble(safety_hub::kSiteEngagementStr).value_or(0))
-      .SetDailyAverageVolume(
-          dict.FindInt(safety_hub::kDailyNotificationCountStr).value_or(0))
+      .SetOldSiteEngagement(revocation_entry->site_engagement)
+      .SetDailyAverageVolume(revocation_entry->daily_notification_count)
       .Record(ukm::UkmRecorder::Get());
 }
 
@@ -636,31 +606,32 @@
   if (!hcsm || !url.is_valid()) {
     return;
   }
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  if (stored_value.is_none()) {
+
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  if (!revocation_entry ||
+      revocation_entry->revocation_state != RevocationState::kProposed ||
+      revocation_entry->has_reported_proposal) {
     return;
   }
-  CHECK(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  const bool has_reported_metrics =
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false);
-  if (!has_reported_metrics) {
-    ukm::builders::SafetyHub_DisruptiveNotificationRevocations_Proposed(
-        source_id)
-        .SetDailyAverageVolume(
-            dict.FindInt(safety_hub::kDailyNotificationCountStr).value_or(0))
-        .SetSiteEngagement(
-            dict.FindDouble(safety_hub::kSiteEngagementStr).value_or(0))
-        .Record(ukm::UkmRecorder::Get());
-    // Update the stored content setting value.
-    dict.Set(safety_hub::kHasReportedMetricsStr, true);
-    stored_value = UpdateContentSettingValue(hcsm, url, std::move(dict),
-                                             GetConstraintFromInfo(info));
-    dict = std::move(stored_value).TakeDict();
-  }
+  ukm::builders::SafetyHub_DisruptiveNotificationRevocations_Proposed(source_id)
+      .SetDailyAverageVolume(revocation_entry->daily_notification_count)
+      .SetSiteEngagement(revocation_entry->site_engagement)
+      .Record(ukm::UkmRecorder::Get());
+
+  // Update the stored content setting value.
+  revocation_entry->has_reported_proposal = true;
+  ContentSettingHelper(*hcsm).PersistRevocationEntry(url, *revocation_entry);
+}
+
+// static
+bool DisruptiveNotificationPermissionsManager::
+    IsUrlRevokedDisruptiveNotification(HostContentSettingsMap* hcsm,
+                                       const GURL& url) {
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  return revocation_entry &&
+         revocation_entry->revocation_state == RevocationState::kRevoked;
 }
 
 void DisruptiveNotificationPermissionsManager::SetClockForTesting(
diff --git a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h
index 0b61957..a10b03e 100644
--- a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h
+++ b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <set>
 
+#include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
 #include "base/time/clock.h"
 #include "base/time/default_clock.h"
@@ -39,11 +40,6 @@
   // Shadow run: the site is proposed for revocation (kProposedRevoke) and
   // returns kAlreadyInProposedRevokeList for all the next runs.
   //
-  // False positives: when the increase in site engagement score is detected for
-  // proposed revocation, it's reported as kFalsePositive. In the next runs
-  // (until a notification is shown and metrics are reported), the site is
-  // reported as kAlreadyFalsePositive.
-  //
   // Actual revocation: the site first is marked for revocation (returns
   // kProposedRevoke) and then the permission is actually revoked (return
   // kRevoke). After the permission is revoked, the content setting is removed
@@ -59,11 +55,11 @@
     kNotSiteScopedContentSetting = 2,
     kManagedContentSetting = 3,
     kAlreadyInProposedRevokeList = 4,
-    kFalsePositive = 5,
+    // kFalsePositive = 5,  // deprecated, now reported as kNotDisruptive
     kNotDisruptive = 6,
     kProposedRevoke = 7,
     kNoRevokeDefaultBlock = 8,
-    kAlreadyFalsePositive = 9,
+    // kAlreadyFalsePositive = 9,  // deprecated, now reported as kNotDisruptive
     kRevoke = 10,
     kIgnore = 11,
     kMaxValue = kIgnore,
@@ -88,6 +84,15 @@
   };
   // LINT.ThenChange(//tools/metrics/histograms/enums.xml:DisruptiveNotificationFalsePositiveReason)
 
+  enum class RevocationState {
+    kNone = 0,
+    kProposed = 1,
+    kRevoked = 2,
+    kIgnore = 3,
+    kUnknown = 4,
+    kMaxValue = kUnknown,
+  };
+
   class SafetyHubNotificationWrapper {
    public:
     virtual ~SafetyHubNotificationWrapper();
@@ -143,10 +148,10 @@
 
   // If the URL is in the revoke or proposed revoke list, report a false
   // positive and record metrics.
-  static void CheckForFalsePositive(Profile* profile,
-                                    const GURL& origin,
-                                    FalsePositiveReason reason,
-                                    ukm::SourceId source_id);
+  static void MaybeReportFalsePositive(Profile* profile,
+                                       const GURL& origin,
+                                       FalsePositiveReason reason,
+                                       ukm::SourceId source_id);
 
   // If the URL is in the false positive list, report user regrant after a
   // revocation. Since the user regrant only happens on a page visit, the site
@@ -161,6 +166,11 @@
                          const GURL& url,
                          ukm::SourceId source_id);
 
+  // Returns true if `url` has been revoked notification permissions because of
+  // sending disruptive notifications.
+  static bool IsUrlRevokedDisruptiveNotification(HostContentSettingsMap* hcsm,
+                                                 const GURL& url);
+
   // content_settings::Observer implementation.
   void OnContentSettingChanged(
       const ContentSettingsPattern& primary_pattern,
@@ -173,42 +183,70 @@
       std::unique_ptr<SafetyHubNotificationWrapper> wrapper);
 
  private:
+  friend class DisruptiveNotificationPermissionsManagerTest;
+  friend class RevokedPermissionsServiceBrowserTest;
+  friend class RevokedPermissionsServiceTest;
+  FRIEND_TEST_ALL_PREFIXES(
+      PlatformNotificationServiceTest,
+      ProposedDisruptiveNotificationRevocationMetricsPersistent);
+  FRIEND_TEST_ALL_PREFIXES(
+      PlatformNotificationServiceTest,
+      ProposedDisruptiveNotificationRevocationMetricsNonPersistent);
+
+  // A revocation entry as stored in content settings
+  // (ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS).
+  struct RevocationEntry {
+    RevocationState revocation_state;
+    double site_engagement;
+    int daily_notification_count;
+    base::Time timestamp;
+
+    bool has_reported_proposal = false;
+    bool has_reported_false_positive = false;
+
+    base::Time created_at = base::Time::Now();
+
+    // If lifetime is 0, it doesn't expire.
+    base::TimeDelta lifetime;
+  };
+
+  // Helper class to manage content settings for
+  // ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS.
+  class ContentSettingHelper {
+   public:
+    explicit ContentSettingHelper(HostContentSettingsMap& hcsm);
+
+    // Get/store/delete the `REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS`
+    // setting.
+    std::optional<RevocationEntry> GetRevocationEntry(const GURL& url);
+    void PersistRevocationEntry(const GURL& url, const RevocationEntry& entry);
+    void DeleteRevocationEntry(const GURL& url);
+
+   private:
+    base::raw_ref<HostContentSettingsMap> hcsm_;
+  };
+
   // Process existing content setting value: record false positive, revoke
   // notifications or report the site as already in the proposed revocation
   // list. Returns `true` if notifications were actually revoked, `false`
   // otherwise.
   bool HandleExistingValueAndMaybeRevoke(
       const GURL& url,
-      base::Value stored_value,
-      const content_settings::SettingInfo& info);
-
-  // Updates the content setting to false positive and reports metrics.
-  void RecordFalsePositive(const GURL& url,
-                           base::Value::Dict dict,
-                           const content_settings::SettingInfo& info,
-                           double new_score);
+      const RevocationEntry& revocation_entry);
 
   // If the notifications should be revoked based on whether the metrics were
   // already reported or the cooldown period has run out.
-  bool CanRevokeNotifications(const GURL& url, const base::Value::Dict& dict);
+  bool CanRevokeNotifications(const GURL& url,
+                              const RevocationEntry& revocation_entry);
 
   // Revokes notification permission, updates the content setting value to
   // revoke and reports metrics.
-  void RevokeNotifications(const GURL& url, base::Value::Dict dict);
+  void RevokeNotifications(const GURL& url, RevocationEntry revocation_entry);
 
   // Whether the notification is disruptive based on the site engagement score
   // for the URL and the daily average notification count.
   bool IsNotificationDisruptive(const GURL& url, int daily_notification_count);
 
-  // Stores the URL in REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS content
-  // setting with |constraints|. The content setting value is a dictionary.
-  // "revoked_status" key value depends on whether the revocation will actually
-  // be performed or only proposed as part of shadow run.
-  void StoreRevokedDisruptiveNotificationPermission(
-      const GURL& url,
-      const content_settings::ContentSettingConstraints& constraints,
-      int daily_notification_count);
-
   // Displays the safety hub notification informing the users about revoked
   // notification permissions.
   void DisplayNotification();
diff --git a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc
index 05796182..7968804 100644
--- a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc
+++ b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h"
 
-#include "base/json/values_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/simple_test_clock.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -29,11 +28,18 @@
 
 using RevocationResult =
     DisruptiveNotificationPermissionsManager::RevocationResult;
-using testing::ElementsAre;
-using testing::IsEmpty;
 using FalsePositiveReason =
     DisruptiveNotificationPermissionsManager::FalsePositiveReason;
 
+using testing::_;
+using testing::ElementsAre;
+using testing::Eq;
+using testing::Field;
+using testing::IsEmpty;
+using testing::Not;
+using testing::Optional;
+using testing::Pair;
+
 constexpr char kRevocationResultHistogram[] =
     "Settings.SafetyHub.DisruptiveNotificationRevocations.RevocationResult";
 constexpr char kNotificationCountHistogram[] =
@@ -67,6 +73,13 @@
 
 class DisruptiveNotificationPermissionsManagerTest : public ::testing::Test {
  public:
+  using RevocationEntry =
+      DisruptiveNotificationPermissionsManager::RevocationEntry;
+  using ContentSettingHelper =
+      DisruptiveNotificationPermissionsManager::ContentSettingHelper;
+  using RevocationState =
+      DisruptiveNotificationPermissionsManager::RevocationState;
+
   void SetUp() override {
     manager_ = std::make_unique<DisruptiveNotificationPermissionsManager>(
         hcsm(), site_engagement_service());
@@ -121,21 +134,15 @@
   void SetupFalsePositiveRevocation(GURL url, int days_since_revocation) {
     const int kDailyNotificationCount = 4;
 
-    base::Value::Dict dict;
-    dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-    dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-    dict.Set(safety_hub::kDailyNotificationCountStr, kDailyNotificationCount);
-    dict.Set(safety_hub::kTimestampStr,
-             base::TimeToValue(base::Time::Now() -
-                               base::Days(days_since_revocation)));
-    auto constraint =
-        content_settings::ContentSettingConstraints(base::Time::Now());
-    constraint.set_lifetime(base::Days(30));
-    hcsm()->SetWebsiteSettingCustomScope(
-        ContentSettingsPattern::FromURLNoWildcard(url),
-        ContentSettingsPattern::Wildcard(),
-        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-        base::Value(std::move(dict)), constraint);
+    ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+        url,
+        RevocationEntry{
+            .revocation_state = RevocationState::kProposed,
+            .site_engagement = 0.0,
+            .daily_notification_count = kDailyNotificationCount,
+            .timestamp = base::Time::Now() - base::Days(days_since_revocation),
+            .lifetime = base::Days(30),
+        });
   }
 
   DisruptiveNotificationPermissionsManager* manager() { return manager_.get(); }
@@ -199,18 +206,14 @@
       CONTENT_SETTING_ALLOW,
       hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
 
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  EXPECT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  EXPECT_FALSE(
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false));
-  EXPECT_EQ(0.0, dict.FindDouble(safety_hub::kSiteEngagementStr).value_or(0));
-  EXPECT_EQ(3,
-            dict.FindInt(safety_hub::kDailyNotificationCountStr).value_or(0));
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::has_reported_proposal, false)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::site_engagement, 0)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::daily_notification_count, 3)));
 
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kProposedRevoke, 1);
@@ -266,14 +269,18 @@
       CONTENT_SETTING_ALLOW,
       hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
 
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  EXPECT_FALSE(
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false));
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::revocation_state,
+                             RevocationState::kProposed)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::has_reported_proposal, false)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::site_engagement, 0.0)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::daily_notification_count, 3)));
+
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kProposedRevoke, 1);
 
@@ -311,14 +318,10 @@
       CONTENT_SETTING_ALLOW,
       hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
 
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  EXPECT_FALSE(
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false));
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::has_reported_proposal, false)));
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kProposedRevoke, 1);
 
@@ -346,6 +349,46 @@
 }
 
 TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest,
+       DoNotRevokeProposedPermissionWhichIsNotAnymoreDisruptive) {
+  base::HistogramTester t;
+  GURL url("https://www.example.com");
+  SetNotificationPermission(url, CONTENT_SETTING_ALLOW);
+  SetDailyAverageNotificationCount(url, 3);
+  site_engagement_service()->ResetBaseScoreForURL(url, 0);
+
+  manager()->RevokeDisruptiveNotifications();
+  EXPECT_EQ(
+      CONTENT_SETTING_ALLOW,
+      hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
+
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(url),
+              Optional(Field(&RevocationEntry::revocation_state,
+                             RevocationState::kProposed)));
+
+  t.ExpectBucketCount(kRevocationResultHistogram,
+                      RevocationResult::kProposedRevoke, 1);
+  t.ExpectBucketCount(kRevokedWebsitesCountHistogram, 1, 1);
+  t.ExpectBucketCount(kNotificationCountHistogram, 3, 1);
+  EXPECT_THAT(GetDisplayNotificationFunctionCalledWith(), IsEmpty());
+
+  site_engagement_service()->ResetBaseScoreForURL(url, 10);
+
+  // On the next run, site stays proposed because it is not disruptive anymore.
+  manager()->RevokeDisruptiveNotifications();
+  EXPECT_EQ(
+      CONTENT_SETTING_ALLOW,
+      hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(url),
+              Optional(Field(&RevocationEntry::revocation_state,
+                             RevocationState::kProposed)));
+  t.ExpectBucketCount(kRevocationResultHistogram,
+                      RevocationResult::kProposedRevoke, 1);
+  t.ExpectBucketCount(kRevocationResultHistogram, RevocationResult::kRevoke, 0);
+  t.ExpectBucketCount(kRevocationResultHistogram,
+                      RevocationResult::kNotDisruptive, 1);
+}
+
+TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest,
        RevokedWebsitesCount) {
   base::HistogramTester t;
 
@@ -386,10 +429,8 @@
 
   manager()->RevokeDisruptiveNotifications();
 
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_TRUE(stored_value.is_none());
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(url),
+              Eq(std::nullopt));
 
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kNotDisruptive, 1);
@@ -405,10 +446,8 @@
 
   manager()->RevokeDisruptiveNotifications();
 
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_TRUE(stored_value.is_none());
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(url),
+              Eq(std::nullopt));
 
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kNotDisruptive, 1);
@@ -424,10 +463,8 @@
 
   manager()->RevokeDisruptiveNotifications();
 
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_TRUE(stored_value.is_none());
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(url),
+              Eq(std::nullopt));
 
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kNotDisruptive, 1);
@@ -520,18 +557,14 @@
   GURL url("https://chrome.test/");
   const int kDailyNotificationCount = 4;
 
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, kDailyNotificationCount);
-  auto constraint =
-      content_settings::ContentSettingConstraints(base::Time::Now());
-  constraint.set_lifetime(base::Days(30));
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)), constraint);
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      url, RevocationEntry{
+               .revocation_state = RevocationState::kProposed,
+               .site_engagement = 0.0,
+               .daily_notification_count = kDailyNotificationCount,
+               .created_at = base::Time::Now(),
+               .lifetime = base::Days(30),
+           });
 
   ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
   ukm_recorder.UpdateSourceURL(source_id, url);
@@ -548,17 +581,11 @@
                                  kDailyNotificationCount);
   ukm_recorder.ExpectEntryMetric(entries[0], "SiteEngagement", 0.0);
 
-  // After the metric is reported, has_reported_metrics flag is set.
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  ASSERT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  EXPECT_TRUE(stored_value.GetDict()
-                  .FindBool(safety_hub::kHasReportedMetricsStr)
-                  .value_or(false));
-  EXPECT_EQ(info.metadata.expiration(), constraint.expiration());
+  // After the metric is reported, has_reported_proposal flag is set.
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::has_reported_proposal, true)));
 
   // UKM is reported once per site.
   DisruptiveNotificationPermissionsManager::LogMetrics(profile(), url,
@@ -583,20 +610,13 @@
       hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
 
   // Set up a revoked content setting.
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 3);
-  dict.Set(safety_hub::kTimestampStr, base::TimeToValue(base::Time::Now()));
-
-  content_settings::ContentSettingConstraints constraint(base::Time::Now());
-  constraint.set_lifetime(safety_hub_util::GetCleanUpThreshold());
-
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)), constraint);
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      url, RevocationEntry{
+               .revocation_state = RevocationState::kRevoked,
+               .site_engagement = 0.0,
+               .daily_notification_count = 3,
+               .lifetime = safety_hub_util::GetCleanUpThreshold(),
+           });
 
   manager()->RegrantPermissionForUrl(url);
   // Notifications are again allowed.
@@ -610,18 +630,14 @@
   // The content setting was updated to "ignore" to prevent autorevoking in the
   // future.
   EXPECT_EQ(GetRevokedPermissionsCount(), 1);
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  EXPECT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  EXPECT_EQ(safety_hub::kIgnoreStr,
-            stored_value.GetDict()
-                .Find(safety_hub::kRevokedStatusDictKeyStr)
-                ->GetString());
-  // The constraint was also reset to not expire.
-  EXPECT_TRUE(info.metadata.lifetime().is_zero());
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
+
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::revocation_state,
+                             RevocationState::kIgnore)));
+  EXPECT_THAT(revocation_entry, Optional(Field(&RevocationEntry::lifetime,
+                                               Eq(base::TimeDelta()))));
 
   manager()->RevokeDisruptiveNotifications();
   // The site is reported as ignored for revocation and not revoked.
@@ -653,23 +669,19 @@
   site_engagement_service()->ResetBaseScoreForURL(url, 0);
 
   // Set up an ignored value.
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kIgnoreStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 3);
-  dict.Set(safety_hub::kTimestampStr, base::TimeToValue(base::Time::Now()));
-
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      url, RevocationEntry{
+               .revocation_state = RevocationState::kIgnore,
+               .site_engagement = 0.0,
+               .daily_notification_count = 3,
+               .timestamp = base::Time::Now(),
+           });
 
   // Undo the regrant (return to revoked state).
-  content_settings::ContentSettingConstraints constraint(base::Time::Now());
-  constraint.set_lifetime(safety_hub_util::GetCleanUpThreshold());
+  content_settings::ContentSettingConstraints constraints(base::Time::Now());
+  constraints.set_lifetime(safety_hub_util::GetCleanUpThreshold());
   manager()->UndoRegrantPermissionForUrl(
-      url, {ContentSettingsType::NOTIFICATIONS}, constraint.Clone());
+      url, {ContentSettingsType::NOTIFICATIONS}, std::move(constraints));
 
   // Notifications are again ask.
   EXPECT_EQ(
@@ -678,24 +690,21 @@
 
   // The content setting was updated to "revoke".
   EXPECT_EQ(GetRevokedPermissionsCount(), 1);
-  content_settings::SettingInfo info;
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info);
-  EXPECT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  dict = std::move(stored_value).TakeDict();
-  EXPECT_EQ(safety_hub::kRevokeStr,
-            dict.Find(safety_hub::kRevokedStatusDictKeyStr)->GetString());
-  EXPECT_EQ(0.0, dict.FindDouble(safety_hub::kSiteEngagementStr).value_or(0));
-  EXPECT_EQ(3,
-            dict.FindInt(safety_hub::kDailyNotificationCountStr).value_or(0));
-  const base::Value* stored_timestamp = dict.Find(safety_hub::kTimestampStr);
-  EXPECT_EQ(base::Time::Now(),
-            base::ValueToTime(stored_timestamp).value_or(base::Time()));
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
 
-  // The constraint was set.
-  EXPECT_EQ(info.metadata.lifetime(), safety_hub_util::GetCleanUpThreshold());
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::revocation_state,
+                             RevocationState::kRevoked)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::site_engagement, 0.0)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::daily_notification_count, 3)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::timestamp, base::Time::Now())));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::lifetime,
+                             safety_hub_util::GetCleanUpThreshold())));
 }
 
 TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest,
@@ -709,10 +718,10 @@
   site_engagement_service()->ResetBaseScoreForURL(url, 0);
 
   // Attempt to undo the regrant (return to revoked state).
-  content_settings::ContentSettingConstraints constraint(base::Time::Now());
-  constraint.set_lifetime(safety_hub_util::GetCleanUpThreshold());
+  content_settings::ContentSettingConstraints constraints(base::Time::Now());
+  constraints.set_lifetime(safety_hub_util::GetCleanUpThreshold());
   manager()->UndoRegrantPermissionForUrl(
-      url, {ContentSettingsType::NOTIFICATIONS}, constraint.Clone());
+      url, {ContentSettingsType::NOTIFICATIONS}, std::move(constraints));
 
   // Notifications are still allow because there were no "ignore" value stored
   // therefore no revocation to undo.
@@ -732,23 +741,19 @@
   site_engagement_service()->ResetBaseScoreForURL(url, 0);
 
   // Set up an ignored value.
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kIgnoreStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 3);
-  dict.Set(safety_hub::kTimestampStr, base::TimeToValue(base::Time::Now()));
-
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      url, RevocationEntry{
+               .revocation_state = RevocationState::kIgnore,
+               .site_engagement = 0.0,
+               .daily_notification_count = 3,
+               .timestamp = base::Time::Now(),
+           });
 
   // Attempt to undo the regrant (return to revoked state).
-  content_settings::ContentSettingConstraints constraint(base::Time::Now());
-  constraint.set_lifetime(safety_hub_util::GetCleanUpThreshold());
+  content_settings::ContentSettingConstraints constraints(base::Time::Now());
+  constraints.set_lifetime(safety_hub_util::GetCleanUpThreshold());
   manager()->UndoRegrantPermissionForUrl(
-      url, {ContentSettingsType::GEOLOCATION}, constraint.Clone());
+      url, {ContentSettingsType::GEOLOCATION}, std::move(constraints));
 
   // Notifications are still allow because there were no "ignore" value stored
   // therefore no revocation to undo.
@@ -763,87 +768,57 @@
 
   // Set up a revoked permission.
   GURL revoked_url("https://www.example1.com");
-  base::Value::Dict revoked_dict;
-  revoked_dict.Set(safety_hub::kRevokedStatusDictKeyStr,
-                   safety_hub::kRevokeStr);
-  revoked_dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  revoked_dict.Set(safety_hub::kDailyNotificationCountStr, 3);
-  revoked_dict.Set(safety_hub::kTimestampStr,
-                   base::TimeToValue(base::Time::Now()));
-
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(revoked_url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(revoked_dict)));
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      revoked_url, RevocationEntry{
+                       .revocation_state = RevocationState::kRevoked,
+                       .site_engagement = 0.0,
+                       .daily_notification_count = 3,
+                       .timestamp = base::Time::Now(),
+                   });
 
   // Set up a proposed permission.
   GURL proposed_url("https://www.example2.com");
-  base::Value::Dict proposed_dict;
-  proposed_dict.Set(safety_hub::kRevokedStatusDictKeyStr,
-                    safety_hub::kProposedStr);
-  proposed_dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  proposed_dict.Set(safety_hub::kDailyNotificationCountStr, 3);
-  proposed_dict.Set(safety_hub::kTimestampStr,
-                    base::TimeToValue(base::Time::Now()));
-
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(proposed_url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(proposed_dict)));
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      proposed_url, RevocationEntry{
+                        .revocation_state = RevocationState::kProposed,
+                        .site_engagement = 0.0,
+                        .daily_notification_count = 3,
+                        .timestamp = base::Time::Now(),
+                    });
 
   // Set up an ignored permission.
   GURL ignored_url("https://www.example3.com");
-  base::Value::Dict ignored_dict;
-  ignored_dict.Set(safety_hub::kRevokedStatusDictKeyStr,
-                   safety_hub::kIgnoreStr);
-  ignored_dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  ignored_dict.Set(safety_hub::kDailyNotificationCountStr, 3);
-  ignored_dict.Set(safety_hub::kTimestampStr,
-                   base::TimeToValue(base::Time::Now()));
-
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(ignored_url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(ignored_dict)));
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      ignored_url, RevocationEntry{
+                       .revocation_state = RevocationState::kIgnore,
+                       .site_engagement = 0.0,
+                       .daily_notification_count = 3,
+                       .timestamp = base::Time::Now(),
+                   });
 
   EXPECT_EQ(GetRevokedPermissionsCount(), 3);
   manager()->ClearRevokedPermissionsList();
   EXPECT_EQ(GetRevokedPermissionsCount(), 2);
 
   // Only revoked value is cleared, others are not affected.
-  base::Value revoked_stored_value = hcsm()->GetWebsiteSetting(
-      revoked_url, revoked_url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_TRUE(revoked_stored_value.is_none());
-
-  base::Value proposed_stored_value = hcsm()->GetWebsiteSetting(
-      proposed_url, proposed_url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(proposed_stored_value.is_none());
-
-  base::Value ignored_stored_value = hcsm()->GetWebsiteSetting(
-      ignored_url, ignored_url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(ignored_stored_value.is_none());
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(revoked_url),
+              Eq(std::nullopt));
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(proposed_url),
+              Not(Eq(std::nullopt)));
+  EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(ignored_url),
+              Not(Eq(std::nullopt)));
 }
 
 TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest,
        UpdateNotificationContentSettingsChanged) {
   GURL url("https://chrome.test/");
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 4);
-  dict.Set(safety_hub::kTimestampStr,
-           base::TimeToValue(base::Time::Now() - base::Days(3)));
-  hcsm()->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  ContentSettingHelper(*hcsm()).PersistRevocationEntry(
+      url, RevocationEntry{
+               .revocation_state = RevocationState::kRevoked,
+               .site_engagement = 0.0,
+               .daily_notification_count = 4,
+               .timestamp = base::Time::Now() - base::Days(3),
+           });
   EXPECT_THAT(GetUpdateNotificationFunctionCalledWith(), ElementsAre(1));
 }
 
@@ -872,17 +847,15 @@
   EXPECT_EQ(
       CONTENT_SETTING_ALLOW,
       hcsm()->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS));
-  base::Value stored_value = hcsm()->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  ASSERT_TRUE(stored_value.is_dict());
-  base::Value::Dict dict = std::move(stored_value).TakeDict();
-  EXPECT_FALSE(
-      dict.FindBool(safety_hub::kHasReportedMetricsStr).value_or(false));
-  EXPECT_EQ(0.0, dict.FindDouble(safety_hub::kSiteEngagementStr).value_or(0));
-  EXPECT_EQ(3,
-            dict.FindInt(safety_hub::kDailyNotificationCountStr).value_or(0));
+  std::optional<RevocationEntry> revocation_entry =
+      ContentSettingHelper(*hcsm()).GetRevocationEntry(url);
+
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::has_reported_proposal, false)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::site_engagement, 0)));
+  EXPECT_THAT(revocation_entry,
+              Optional(Field(&RevocationEntry::daily_notification_count, 3)));
 
   t.ExpectBucketCount(kRevocationResultHistogram,
                       RevocationResult::kProposedRevoke, 1);
@@ -915,7 +888,7 @@
   ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
   ukm_recorder.UpdateSourceURL(source_id, url);
 
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile(), url, FalsePositiveReason::kPageVisit, source_id);
 
   // Check that the correct metric is reported.
@@ -942,7 +915,7 @@
   ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
   ukm_recorder.UpdateSourceURL(source_id, url);
 
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile(), url, FalsePositiveReason::kPageVisit, source_id);
 
   // Check that the no metrics are reported.
@@ -962,7 +935,7 @@
   ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
   ukm_recorder.UpdateSourceURL(source_id, url);
 
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile(), url, FalsePositiveReason::kPageVisit, source_id);
 
   // Check that the no metrics are reported.
@@ -982,7 +955,7 @@
   ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
   ukm_recorder.UpdateSourceURL(source_id, url);
 
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile(), url, FalsePositiveReason::kPageVisit, source_id);
 
   // Check that the no metrics are reported.
diff --git a/chrome/browser/ui/safety_hub/revoked_permissions_service.cc b/chrome/browser/ui/safety_hub/revoked_permissions_service.cc
index 8350c1a..d44c0761 100644
--- a/chrome/browser/ui/safety_hub/revoked_permissions_service.cc
+++ b/chrome/browser/ui/safety_hub/revoked_permissions_service.cc
@@ -256,14 +256,13 @@
 }
 
 void RevokedPermissionsService::RevokedPermissionsResult::AddRevokedPermission(
-    const PermissionsData& permissions_data) {
+    PermissionsData permissions_data) {
   revoked_permissions_.push_back(std::move(permissions_data));
 }
 
-std::list<PermissionsData>
+const std::list<PermissionsData>&
 RevokedPermissionsService::RevokedPermissionsResult::GetRevokedPermissions() {
-  std::list<PermissionsData> result(revoked_permissions_);
-  return result;
+  return revoked_permissions_;
 }
 
 std::set<ContentSettingsPattern>
@@ -350,7 +349,7 @@
     content::Page& page) {
   Profile* profile =
       Profile::FromBrowserContext(web_contents()->GetBrowserContext());
-  DisruptiveNotificationPermissionsManager::CheckForFalsePositive(
+  DisruptiveNotificationPermissionsManager::MaybeReportFalsePositive(
       profile, page.GetMainDocument().GetLastCommittedURL(),
       DisruptiveNotificationPermissionsManager::FalsePositiveReason::kPageVisit,
       page.GetMainDocument().GetPageUkmSourceId());
@@ -876,8 +875,8 @@
       }
       permissions_data.revocation_type =
           PermissionsRevocationType::kUnusedPermissionsAndAbusiveNotifications;
-    } else if (safety_hub_util::IsUrlRevokedDisruptiveNotification(hcsm(),
-                                                                   url)) {
+    } else if (DisruptiveNotificationPermissionsManager::
+                   IsUrlRevokedDisruptiveNotification(hcsm(), url)) {
       // If the origin has a revoked disruptive notification, add
       // `NOTIFICATIONS` to the list of revoked permissions.
       CHECK(disruptive_notification_manager_);
diff --git a/chrome/browser/ui/safety_hub/revoked_permissions_service.h b/chrome/browser/ui/safety_hub/revoked_permissions_service.h
index f563a05..f919b88 100644
--- a/chrome/browser/ui/safety_hub/revoked_permissions_service.h
+++ b/chrome/browser/ui/safety_hub/revoked_permissions_service.h
@@ -103,17 +103,17 @@
     // Adds a revoked permission, defined by origin, a set of permission types
     // and the expiration until the user is made aware of the revoked
     // permission.
-    void AddRevokedPermission(const PermissionsData&);
+    void AddRevokedPermission(PermissionsData);
 
     void SetRecentlyUnusedPermissions(UnusedPermissionMap map) {
-      recently_unused_permissions_ = map;
+      recently_unused_permissions_ = std::move(map);
     }
 
-    UnusedPermissionMap GetRecentlyUnusedPermissions() {
+    const UnusedPermissionMap& GetRecentlyUnusedPermissions() {
       return recently_unused_permissions_;
     }
 
-    std::list<PermissionsData> GetRevokedPermissions();
+    const std::list<PermissionsData>& GetRevokedPermissions();
 
     std::set<ContentSettingsPattern> GetRevokedOrigins() const;
 
@@ -243,8 +243,7 @@
   void SetClockForTesting(base::Clock* clock);
   std::vector<ContentSettingEntry> GetTrackedUnusedPermissionsForTesting();
 
-  using UnusedPermissionMap =
-      std::map<std::string, std::list<ContentSettingEntry>>;
+  using UnusedPermissionMap = RevokedPermissionsResult::UnusedPermissionMap;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(RevokedPermissionsServiceTest,
diff --git a/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc b/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc
index 6f1eef8..2b81448 100644
--- a/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc
+++ b/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h"
 #include "chrome/browser/ui/safety_hub/mock_safe_browsing_database_manager.h"
 #include "chrome/browser/ui/safety_hub/revoked_permissions_service_factory.h"
 #include "chrome/browser/ui/safety_hub/safety_hub_test_util.h"
@@ -45,6 +46,11 @@
 
 namespace {
 
+using testing::Eq;
+using testing::Field;
+using testing::Not;
+using testing::Optional;
+
 const char histogram_name[] =
     "Settings.SafetyHub.UnusedSitePermissionsModule.AutoRevoked2";
 
@@ -52,6 +58,13 @@
 
 class RevokedPermissionsServiceBrowserTest : public InProcessBrowserTest {
  public:
+  using DisruptiveNotificationRevocationEntry =
+      DisruptiveNotificationPermissionsManager::RevocationEntry;
+  using DisruptiveNotificationContentSettingHelper =
+      DisruptiveNotificationPermissionsManager::ContentSettingHelper;
+  using DisruptiveNotificationRevocationState =
+      DisruptiveNotificationPermissionsManager::RevocationState;
+
   RevokedPermissionsServiceBrowserTest() {
     feature_list.InitWithFeatures(
         /*enabled_features=*/
@@ -590,20 +603,17 @@
   safety_hub_test_util::UpdateRevokedPermissionsServiceAsync(service);
 
   // The url was stored in the disruptive notification content setting.
-  base::Value stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
+  EXPECT_THAT(
+      DisruptiveNotificationContentSettingHelper(*hcsm).GetRevocationEntry(url),
+      Not(Eq(std::nullopt)));
 
   safety_hub_test_util::UpdateRevokedPermissionsServiceAsync(service);
-  stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  EXPECT_EQ(safety_hub::kProposedStr,
-            stored_value.GetDict()
-                .Find(safety_hub::kRevokedStatusDictKeyStr)
-                ->GetString());
+  std::optional<DisruptiveNotificationRevocationEntry> revocation_entry =
+      DisruptiveNotificationContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  EXPECT_THAT(
+      revocation_entry,
+      Optional(Field(&DisruptiveNotificationRevocationEntry::revocation_state,
+                     DisruptiveNotificationRevocationState::kProposed)));
   ASSERT_EQ(GetRevokedUnusedPermissions(hcsm).size(), 0u);
   std::optional<std::unique_ptr<SafetyHubService::Result>> opt_result =
       service->GetCachedResult();
@@ -677,27 +687,23 @@
   safety_hub_test_util::UpdateRevokedPermissionsServiceAsync(service);
 
   // The url was stored in the disruptive notification content setting.
-  base::Value stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  EXPECT_EQ(safety_hub::kProposedStr,
-            stored_value.GetDict()
-                .Find(safety_hub::kRevokedStatusDictKeyStr)
-                ->GetString());
+  std::optional<DisruptiveNotificationRevocationEntry> revocation_entry =
+      DisruptiveNotificationContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  EXPECT_THAT(
+      revocation_entry,
+      Optional(Field(&DisruptiveNotificationRevocationEntry::revocation_state,
+                     DisruptiveNotificationRevocationState::kProposed)));
 
   // Wait for the disruptive metrics cooldown to expire.
   clock.Advance(base::Days(8));
 
   safety_hub_test_util::UpdateRevokedPermissionsServiceAsync(service);
-  stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  EXPECT_EQ(safety_hub::kRevokeStr,
-            stored_value.GetDict()
-                .Find(safety_hub::kRevokedStatusDictKeyStr)
-                ->GetString());
+  revocation_entry =
+      DisruptiveNotificationContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  EXPECT_THAT(
+      revocation_entry,
+      Optional(Field(&DisruptiveNotificationRevocationEntry::revocation_state,
+                     DisruptiveNotificationRevocationState::kRevoked)));
 
   std::optional<std::unique_ptr<SafetyHubService::Result>> opt_result =
       service->GetCachedResult();
@@ -757,14 +763,12 @@
 
   // The url was stored in the disruptive notification content setting as
   // proposed revocation.
-  base::Value stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  EXPECT_EQ(safety_hub::kProposedStr,
-            stored_value.GetDict()
-                .Find(safety_hub::kRevokedStatusDictKeyStr)
-                ->GetString());
+  std::optional<DisruptiveNotificationRevocationEntry> revocation_entry =
+      DisruptiveNotificationContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  EXPECT_THAT(
+      revocation_entry,
+      Optional(Field(&DisruptiveNotificationRevocationEntry::revocation_state,
+                     DisruptiveNotificationRevocationState::kProposed)));
 
   // Wait for the disruptive metrics cooldown to expire.
   clock.Advance(base::Days(8));
@@ -780,14 +784,12 @@
           opt_result.value().get());
   EXPECT_EQ(result->GetRevokedPermissions().size(), 1u);
 
-  stored_value = hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-  EXPECT_FALSE(stored_value.is_none());
-  EXPECT_EQ(safety_hub::kRevokeStr,
-            stored_value.GetDict()
-                .Find(safety_hub::kRevokedStatusDictKeyStr)
-                ->GetString());
+  revocation_entry =
+      DisruptiveNotificationContentSettingHelper(*hcsm).GetRevocationEntry(url);
+  EXPECT_THAT(
+      revocation_entry,
+      Optional(Field(&DisruptiveNotificationRevocationEntry::revocation_state,
+                     DisruptiveNotificationRevocationState::kRevoked)));
 
   EXPECT_EQ(result->GetRevokedPermissions().size(), 1u);
   EXPECT_EQ(result->GetRevokedPermissions().front().permission_types.size(),
@@ -812,17 +814,14 @@
   GURL url = embedded_test_server()->GetURL("/title1.html");
 
   // Set up a proposed revoked notification.
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 5);
-  dict.Set(safety_hub::kTimestampStr,
-           base::TimeToValue(base::Time::Now() - base::Days(3)));
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  DisruptiveNotificationContentSettingHelper(*hcsm).PersistRevocationEntry(
+      url,
+      DisruptiveNotificationRevocationEntry{
+          .revocation_state = DisruptiveNotificationRevocationState::kProposed,
+          .site_engagement = 0.0,
+          .daily_notification_count = 5,
+          .timestamp = base::Time::Now() - base::Days(3),
+      });
 
   // Visit the site.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
@@ -849,17 +848,14 @@
   GURL url = embedded_test_server()->GetURL("/title1.html");
 
   // Set up a proposed revoked notification.
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 5);
-  dict.Set(safety_hub::kTimestampStr,
-           base::TimeToValue(base::Time::Now() - base::Days(3)));
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  DisruptiveNotificationContentSettingHelper(*hcsm).PersistRevocationEntry(
+      url,
+      DisruptiveNotificationRevocationEntry{
+          .revocation_state = DisruptiveNotificationRevocationState::kProposed,
+          .site_engagement = 0.0,
+          .daily_notification_count = 5,
+          .timestamp = base::Time::Now() - base::Days(3),
+      });
 
   // Visit the page.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
@@ -909,17 +905,14 @@
   hcsm->SetContentSettingDefaultScope(
       url, GURL(), ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_ALLOW);
 
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 5);
-  dict.Set(safety_hub::kTimestampStr,
-           base::TimeToValue(base::Time::Now() - base::Days(3)));
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  DisruptiveNotificationContentSettingHelper(*hcsm).PersistRevocationEntry(
+      url,
+      DisruptiveNotificationRevocationEntry{
+          .revocation_state = DisruptiveNotificationRevocationState::kProposed,
+          .site_engagement = 0.0,
+          .daily_notification_count = 5,
+          .timestamp = base::Time::Now() - base::Days(3),
+      });
 
   // Show a notification.
   blink::PlatformNotificationData data;
@@ -953,18 +946,15 @@
       HostContentSettingsMapFactory::GetForProfile(browser()->profile());
   GURL url = embedded_test_server()->GetURL("/title1.html");
 
-  // Set up a proposed revoked notification.
-  base::Value::Dict dict;
-  dict.Set(safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr);
-  dict.Set(safety_hub::kSiteEngagementStr, 0.0);
-  dict.Set(safety_hub::kDailyNotificationCountStr, 5);
-  dict.Set(safety_hub::kTimestampStr,
-           base::TimeToValue(base::Time::Now() - base::Days(3)));
-  hcsm->SetWebsiteSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(url),
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-      base::Value(std::move(dict)));
+  // Set up a revoked notification permission.
+  DisruptiveNotificationContentSettingHelper(*hcsm).PersistRevocationEntry(
+      url,
+      DisruptiveNotificationRevocationEntry{
+          .revocation_state = DisruptiveNotificationRevocationState::kRevoked,
+          .site_engagement = 0.0,
+          .daily_notification_count = 5,
+          .timestamp = base::Time::Now() - base::Days(3),
+      });
 
   // Visit the page.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
diff --git a/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc b/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc
index 4b26e44..b1b9153 100644
--- a/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc
+++ b/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc
@@ -64,10 +64,12 @@
 #include "chrome/test/base/scoped_testing_local_state.h"
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-using ::testing::UnorderedElementsAre;
-
 namespace {
 
+using ::testing::Field;
+using ::testing::Optional;
+using ::testing::UnorderedElementsAre;
+
 const char url1[] = "https://example1.com:443";
 const char url2[] = "https://example2.com:443";
 const char url3[] = "https://example3.com:443";
@@ -90,6 +92,10 @@
 // An arbitrary large number that doesn't match any ContentSettingsType;
 const int32_t unknown_type = 300000;
 
+constexpr std::string_view kRevokedStatus = "revoked_status";
+constexpr std::string_view kProposed = "proposed";
+constexpr std::string_view kRevoke = "revoke";
+
 std::set<ContentSettingsType> abusive_permission_types({notifications_type});
 std::set<ContentSettingsType> unused_permission_types({geolocation_type,
                                                        chooser_type});
@@ -399,8 +405,7 @@
     hcsm()->SetWebsiteSettingDefaultScope(
         GURL(url), GURL(url),
         ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-        base::Value(base::Value::Dict().Set(
-            safety_hub::kRevokedStatusDictKeyStr, safety_hub::kRevokeStr)),
+        base::Value(base::Value::Dict().Set(kRevokedStatus, kRevoke)),
         constraint);
   }
 
@@ -415,8 +420,7 @@
     hcsm()->SetWebsiteSettingDefaultScope(
         GURL(url), GURL(url),
         ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
-        base::Value(base::Value::Dict().Set(
-            safety_hub::kRevokedStatusDictKeyStr, safety_hub::kProposedStr)),
+        base::Value(base::Value::Dict().Set(kRevokedStatus, kProposed)),
         constraint);
   }
 
@@ -473,17 +477,8 @@
   }
 
   void ExpectRevokedDisruptiveNotificationSettingValues(std::string url) {
-    base::Value stored_value = hcsm()->GetWebsiteSetting(
-        GURL(url), GURL(url),
-        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-    EXPECT_FALSE(stored_value.is_none());
-    ASSERT_TRUE(stored_value.is_dict());
-    EXPECT_EQ(safety_hub::kRevokeStr,
-              stored_value.GetDict()
-                  .Find(safety_hub::kRevokedStatusDictKeyStr)
-                  ->GetString());
-    EXPECT_TRUE(
-        safety_hub_util::IsUrlRevokedDisruptiveNotification(hcsm(), GURL(url)));
+    EXPECT_TRUE(DisruptiveNotificationPermissionsManager::
+                    IsUrlRevokedDisruptiveNotification(hcsm(), GURL(url)));
     EXPECT_EQ(
         hcsm()->GetContentSetting(GURL(url), GURL(url), notifications_type),
         CONTENT_SETTING_ASK);
@@ -491,15 +486,13 @@
 
   void ExpectProposedRevokedDisruptiveNotificationSettingValues(
       std::string url) {
-    base::Value stored_value = hcsm()->GetWebsiteSetting(
-        GURL(url), GURL(url),
-        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS);
-    EXPECT_FALSE(stored_value.is_none());
-    ASSERT_TRUE(stored_value.is_dict());
-    EXPECT_EQ(safety_hub::kProposedStr,
-              stored_value.GetDict()
-                  .Find(safety_hub::kRevokedStatusDictKeyStr)
-                  ->GetString());
+    EXPECT_THAT(
+        DisruptiveNotificationPermissionsManager::ContentSettingHelper(*hcsm())
+            .GetRevocationEntry(GURL(url)),
+        Optional(Field(&DisruptiveNotificationPermissionsManager::
+                           RevocationEntry::revocation_state,
+                       DisruptiveNotificationPermissionsManager::
+                           RevocationState::kProposed)));
   }
 
   void ExpectCleanedUpDisruptiveNotificationSettingValues(
@@ -514,8 +507,8 @@
               stored_value.GetDict()
                   .Find(safety_hub::kRevokedStatusDictKeyStr)
                   ->GetString());
-    EXPECT_FALSE(
-        safety_hub_util::IsUrlRevokedDisruptiveNotification(hcsm(), GURL(url)));
+    EXPECT_FALSE(DisruptiveNotificationPermissionsManager::
+                     IsUrlRevokedDisruptiveNotification(hcsm(), GURL(url)));
     EXPECT_EQ(
         hcsm()->GetContentSetting(GURL(url), GURL(url), notifications_type),
         is_regranted ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_ASK);
diff --git a/chrome/browser/ui/safety_hub/safety_hub_constants.cc b/chrome/browser/ui/safety_hub/safety_hub_constants.cc
index fd400c06..691bc08 100644
--- a/chrome/browser/ui/safety_hub/safety_hub_constants.cc
+++ b/chrome/browser/ui/safety_hub/safety_hub_constants.cc
@@ -31,13 +31,6 @@
 const char kRevokedStatusDictKeyStr[] = "revoked_status";
 const char kIgnoreStr[] = "ignore";
 const char kRevokeStr[] = "revoke";
-const char kProposedStr[] = "proposed";
-const char kFalsePositiveStr[] = "false_positive";
-
-const char kSiteEngagementStr[] = "site_engagement";
-const char kDailyNotificationCountStr[] = "daily_notification_count";
-const char kHasReportedMetricsStr[] = "has_reported_metrics";
-const char kTimestampStr[] = "timestamp";
 
 const char kOrigin[] = "origin";
 const char kUsername[] = "username";
diff --git a/chrome/browser/ui/safety_hub/safety_hub_constants.h b/chrome/browser/ui/safety_hub/safety_hub_constants.h
index 8fce58f4..89b5c0f 100644
--- a/chrome/browser/ui/safety_hub/safety_hub_constants.h
+++ b/chrome/browser/ui/safety_hub/safety_hub_constants.h
@@ -45,23 +45,8 @@
 // so, we should ignore the origin in future auto revocations. To do this, we
 // will assign the REVOKED_ABUSIVE_NOTIFICATION_PERMISSION permission
 // base::Value to the "ignore" string. Otherwise, the value should be "revoke".
-// Same values are used for REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, with
-// the addition of "proposed", which indicates that the permission won't be
-// revoked, only proposed to be revoked to collect metrics and learn, and
-// "false_positive", which indicates that the user has interacted with the site,
-// therefore the revocation might have been a false positive.
 extern const char kIgnoreStr[];
 extern const char kRevokeStr[];
-extern const char kProposedStr[];
-extern const char kFalsePositiveStr[];
-
-// Keys of the base::Value dictionary for
-// REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, used to record metrics when a
-// notification is shown.
-extern const char kSiteEngagementStr[];
-extern const char kDailyNotificationCountStr[];
-extern const char kHasReportedMetricsStr[];
-extern const char kTimestampStr[];
 
 // Key to store origin for a detected compromised password in
 // PasswordStatusCheckResult.
diff --git a/chrome/browser/ui/safety_hub/safety_hub_util.cc b/chrome/browser/ui/safety_hub/safety_hub_util.cc
index 84581a6e..4784b93 100644
--- a/chrome/browser/ui/safety_hub/safety_hub_util.cc
+++ b/chrome/browser/ui/safety_hub/safety_hub_util.cc
@@ -106,24 +106,6 @@
   return false;
 }
 
-bool IsUrlRevokedDisruptiveNotification(HostContentSettingsMap* hcsm,
-                                        const GURL& url) {
-  CHECK(url.is_valid());
-  content_settings::SettingInfo info;
-  base::Value stored_value(hcsm->GetWebsiteSetting(
-      url, url,
-      ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info));
-  if (stored_value.is_none()) {
-    return false;
-  }
-  CHECK(stored_value.is_dict());
-  const std::string& setting_val =
-      stored_value.GetDict()
-          .Find(safety_hub::kRevokedStatusDictKeyStr)
-          ->GetString();
-  return setting_val == safety_hub::kRevokeStr;
-}
-
 void SetRevokedAbusiveNotificationPermission(
     HostContentSettingsMap* hcsm,
     GURL url,
diff --git a/chrome/browser/ui/safety_hub/safety_hub_util.h b/chrome/browser/ui/safety_hub/safety_hub_util.h
index a3d62e1..f4cd5da 100644
--- a/chrome/browser/ui/safety_hub/safety_hub_util.h
+++ b/chrome/browser/ui/safety_hub/safety_hub_util.h
@@ -24,11 +24,6 @@
 // `url` belongs to a site with revoked unused site permissions.
 bool IsUrlRevokedUnusedSite(HostContentSettingsMap* hcsm, const GURL& url);
 
-// Returns true if `url` belongs to a site with revoked disruptive
-// notifications.
-bool IsUrlRevokedDisruptiveNotification(HostContentSettingsMap* hcsm,
-                                        const GURL& url);
-
 // Returns the list of all `REVOKED_ABUSIVE_NOTIFICATION_PERMISSIONS` settings,
 // excluding settings that specify that they should be ignored.
 ContentSettingsForOneType GetRevokedAbusiveNotificationPermissions(
diff --git a/chrome/browser/ui/signin/signin_view_controller.cc b/chrome/browser/ui/signin/signin_view_controller.cc
index 71bc4c9..2333072 100644
--- a/chrome/browser/ui/signin/signin_view_controller.cc
+++ b/chrome/browser/ui/signin/signin_view_controller.cc
@@ -32,6 +32,7 @@
 #include "components/signin/public/base/signin_metrics.h"
 #include "components/signin/public/base/signin_pref_names.h"
 #include "components/signin/public/base/signin_prefs.h"
+#include "components/signin/public/base/signin_switches.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
@@ -441,6 +442,16 @@
       GetOnModalDialogClosedCallback());
 }
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+void SigninViewController::ShowModalHistorySyncOptInDialog() {
+  CHECK(base::FeatureList::IsEnabled(switches::kEnableHistorySyncOptin));
+  CloseModalSignin();
+  dialog_ = std::make_unique<SigninModalDialogImpl>(
+      SigninViewControllerDelegate::CreateSyncHistoryOptInDelegate(browser_),
+      GetOnModalDialogClosedCallback());
+}
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
 void SigninViewController::ShowModalManagedUserNoticeDialog(
     std::unique_ptr<signin::EnterpriseProfileCreationDialogParams>
         create_param) {
diff --git a/chrome/browser/ui/signin/signin_view_controller.h b/chrome/browser/ui/signin/signin_view_controller.h
index 19a3654..c525b81 100644
--- a/chrome/browser/ui/signin/signin_view_controller.h
+++ b/chrome/browser/ui/signin/signin_view_controller.h
@@ -149,6 +149,12 @@
   void ShowModalSyncConfirmationDialog(bool is_signin_intercept,
                                        bool is_sync_promo);
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  // Shows the modal history sync opt in dialog as a browser-modal dialog on top
+  // of the `browser_`'s window.
+  void ShowModalHistorySyncOptInDialog();
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
   // Shows the modal managed user notice dialog as a browser-modal dialog on
   // top of the `browser_`'s window. `domain_name` is the domain of the
   // enterprise account being shown. `callback` is called with the user's action
diff --git a/chrome/browser/ui/signin/signin_view_controller_delegate.h b/chrome/browser/ui/signin/signin_view_controller_delegate.h
index f0bffa83..8ab321d 100644
--- a/chrome/browser/ui/signin/signin_view_controller_delegate.h
+++ b/chrome/browser/ui/signin/signin_view_controller_delegate.h
@@ -48,6 +48,14 @@
       SyncConfirmationStyle style,
       bool is_sync_promo);
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  // Returns a platform-specific SigninViewControllerDelegate instance that
+  // displays the modal history sync opt in dialog. The returned object should
+  // delete itself when the window it's managing is closed.
+  static SigninViewControllerDelegate* CreateSyncHistoryOptInDelegate(
+      Browser* browser);
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
   // Returns a platform-specific SigninViewControllerDelegate instance that
   // displays the modal sign in error dialog. The returned object should delete
   // itself when the window it's managing is closed.
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
index 969da7d..efa1d97 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
@@ -36,6 +36,8 @@
 constexpr int kAverageBrowserHeight = 700;
 constexpr base::TimeDelta kMaxWaitTime = base::Seconds(30);
 
+// TODO(crbug.com/371041180): Refactor tests to remove these scripts and notify
+// from the notice components instead.
 std::string ScrollToBottomScript() {
   return R"```(
     (async () => {
@@ -78,6 +80,35 @@
   )```";
 }
 
+std::string WaitForPrivacyPolicyPageLoadScript() {
+  return R"(
+    (async () => {
+      return new Promise(async (resolve) => {
+        requestAnimationFrame(async () => {
+          dialogElement = document.querySelector("body > "+$1);
+          if($2 !== "") dialogElement = dialogElement.shadowRoot.querySelector($2);
+          waitForPrivacyPolicyResolve = (el) => new Promise(privacyPolicyResolve => {
+            let timeout = setTimeout(() => {
+              el.removeEventListener('privacy-policy-loaded', privacyPolicyLoadCallback);
+              privacyPolicyResolve();
+            }, 2000);
+            const privacyPolicyLoadCallback = () => {
+              clearTimeout(timeout);
+              el.removeEventListener('privacy-policy-loaded', privacyPolicyLoadCallback);
+              privacyPolicyResolve();
+            };
+            el.addEventListener('privacy-policy-loaded', privacyPolicyLoadCallback);
+          });
+          const privacyPolicyEl = dialogElement.shadowRoot.querySelector('privacy-sandbox-privacy-policy-dialog');
+          privacyPolicyEl.shadowRoot.querySelector('#privacyPolicy').src = "about:blank";
+          await waitForPrivacyPolicyResolve(privacyPolicyEl);
+          setTimeout(resolve,0);
+        });
+      });
+    })();
+  )";
+}
+
 std::string ClickLearnMoreButton3TimesScript() {
   return R"(
     (async () => {
@@ -123,10 +154,6 @@
   }
 
   void SetUpOnMainThread() override {
-    host_resolver()->AddRule("*", "127.0.0.1");
-    embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data");
-
-    ASSERT_TRUE(embedded_test_server()->Start());
     mock_service_ = static_cast<MockPrivacySandboxService*>(
         PrivacySandboxServiceFactory::GetInstance()->SetTestingFactoryAndUse(
             browser()->profile(),
@@ -318,7 +345,8 @@
                   privacy_sandbox_dialog_view->GetWebContentsForTesting()),
               nullptr);
 
-    // Click expand button.
+    // Privacy policy is initially not visible, click expand button and trigger
+    // visibility.
     EXPECT_TRUE(
         content::ExecJs(privacy_sandbox_dialog_view->GetWebContentsForTesting(),
                         "document.querySelector('body > "
@@ -327,6 +355,11 @@
                         "privacy-sandbox-dialog-learn-more').shadowRoot."
                         "querySelector('div > cr-expand-button').click()"));
 
+    EXPECT_TRUE(content::ExecJs(
+        privacy_sandbox_dialog_view->GetWebContentsForTesting(),
+        content::JsReplace(WaitForPrivacyPolicyPageLoadScript(),
+                           "privacy-sandbox-combined-dialog-app", "#consent")));
+
     // Click Privacy Policy link.
     EXPECT_TRUE(
         content::ExecJs(privacy_sandbox_dialog_view->GetWebContentsForTesting(),
@@ -337,17 +370,6 @@
                             GetPrivacyPolicyLinkElementId() +
                             "')"
                             ".click()"));
-
-    // Intentionally navigate to some blocked content to avoid flakiness.
-    auto script = content::JsReplace(
-        "document.querySelector('body > "
-        "privacy-sandbox-combined-dialog-app')"
-        ".shadowRoot.querySelector('#consent')"
-        ".shadowRoot.querySelector('privacy-sandbox-privacy-policy-dialog')"
-        ".shadowRoot.querySelector('#privacyPolicy').src = $1;",
-        embedded_test_server()->GetURL("/blue.html"));
-    EXPECT_TRUE(content::ExecJs(
-        privacy_sandbox_dialog_view->GetWebContentsForTesting(), script));
   }
 
  private:
@@ -356,7 +378,7 @@
 
 // TODO(https://crbug.com/415305952): High failure rate.
 IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewPrivacyPolicyBrowserTest,
-                       DISABLED_InvokeUi_PrivacyPolicy) {
+                       InvokeUi_PrivacyPolicy) {
   ShowAndVerifyUi();
 }
 
@@ -382,7 +404,7 @@
 // TODO(https://crbug.com/415305952): High failure rate.
 IN_PROC_BROWSER_TEST_F(
     PrivacySandboxDialogViewAdsApiUxEnhancementPrivacyPolicyBrowserTest,
-    DISABLED_InvokeUi_PrivacyPolicy) {
+    InvokeUi_PrivacyPolicy) {
   ShowAndVerifyUi();
 }
 
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc
index fab42a3..6ed86b8b 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -146,56 +146,38 @@
   }
 }
 
-std::u16string GetSyncPromoDescription(signin_metrics::AccessPoint access_point,
-                                       std::string_view email) {
-  switch (access_point) {
-    case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPillOnStartup:
-    case signin_metrics::AccessPoint::
-        kHistorySyncOptinExpansionPillOnInactivity:
+std::u16string GetSyncPromoDescription(std::string_view email) {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-      if (base::FeatureList::IsEnabled(
-              switches::kEnableHistorySyncOptinExpansionPill)) {
-        switch (switches::kHistorySyncOptinExpansionPillOption.Get()) {
-          case switches::HistorySyncOptinExpansionPillOption::
-              kBrowseAcrossDevices:
-            return l10n_util::GetStringFUTF16(
-                IDS_PROFILE_MENU_SYNC_PROMO_BROWSE_ACROSS_DEVICES_DESCRIPTION,
-                base::UTF8ToUTF16(email));
-          case switches::HistorySyncOptinExpansionPillOption::kSyncHistory:
-            return l10n_util::GetStringFUTF16(
-                IDS_PROFILE_MENU_SYNC_PROMO_SYNC_HISTORY_DESCRIPTION,
-                base::UTF8ToUTF16(email));
-          case switches::HistorySyncOptinExpansionPillOption::
-              kSeeTabsFromOtherDevices:
-            return l10n_util::GetStringFUTF16(
-                IDS_PROFILE_MENU_SYNC_PROMO_SEE_TABS_FROM_OTHER_DEVICES_DESCRIPTION,
-                base::UTF8ToUTF16(email));
-        }
-      }
-#endif
-      [[fallthrough]];
-    default:
-      return l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SYNC_PROMO);
+  if (base::FeatureList::IsEnabled(
+          switches::kEnableHistorySyncOptinExpansionPill)) {
+    switch (switches::kHistorySyncOptinExpansionPillOption.Get()) {
+      case switches::HistorySyncOptinExpansionPillOption::kBrowseAcrossDevices:
+        return l10n_util::GetStringFUTF16(
+            IDS_PROFILE_MENU_SYNC_PROMO_BROWSE_ACROSS_DEVICES_DESCRIPTION,
+            base::UTF8ToUTF16(email));
+      case switches::HistorySyncOptinExpansionPillOption::kSyncHistory:
+        return l10n_util::GetStringFUTF16(
+            IDS_PROFILE_MENU_SYNC_PROMO_SYNC_HISTORY_DESCRIPTION,
+            base::UTF8ToUTF16(email));
+      case switches::HistorySyncOptinExpansionPillOption::
+          kSeeTabsFromOtherDevices:
+        return l10n_util::GetStringFUTF16(
+            IDS_PROFILE_MENU_SYNC_PROMO_SEE_TABS_FROM_OTHER_DEVICES_DESCRIPTION,
+            base::UTF8ToUTF16(email));
+    }
   }
+#endif
+  return l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SYNC_PROMO);
 }
 
-std::u16string GetSyncPromoButtonLabel(
-    signin_metrics::AccessPoint access_point) {
-  switch (access_point) {
-    case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPillOnStartup:
-    case signin_metrics::AccessPoint::
-        kHistorySyncOptinExpansionPillOnInactivity:
+std::u16string GetSyncPromoButtonLabel() {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-      if (base::FeatureList::IsEnabled(
-              switches::kEnableHistorySyncOptinExpansionPill)) {
-        return l10n_util::GetStringUTF16(
-            IDS_PROFILE_MENU_SYNC_PROMO_BUTTON_LABEL);
-      }
-#endif
-      [[fallthrough]];
-    default:
-      return l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON);
+  if (base::FeatureList::IsEnabled(
+          switches::kEnableHistorySyncOptinExpansionPill)) {
+    return l10n_util::GetStringUTF16(IDS_PROFILE_MENU_SYNC_PROMO_BUTTON_LABEL);
   }
+#endif
+  return l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON);
 }
 
 }  // namespace
@@ -418,6 +400,14 @@
   }
   GetWidget()->CloseWithReason(views::Widget::ClosedReason::kUnspecified);
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  // TODO(crbug.com/404807488): Update the button and the dialog strings.
+  if (base::FeatureList::IsEnabled(switches::kEnableHistorySyncOptin)) {
+    browser()->signin_view_controller()->ShowModalHistorySyncOptInDialog();
+    return;
+  }
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
   if (button_type == ActionableItem::kSigninReauthButton) {
     // The reauth button does not trigger a sync opt in.
     signin_ui_util::ShowReauthForAccount(browser()->profile(), account.email,
@@ -740,11 +730,8 @@
       break;
     }
     case signin_util::SignedInState::kSignedIn:
-      params.subtitle = GetSyncPromoDescription(
-          explicit_signin_access_point_.value_or(access_point),
-          primary_account_info.email);
-      params.button_text = GetSyncPromoButtonLabel(
-          explicit_signin_access_point_.value_or(access_point));
+      params.subtitle = GetSyncPromoDescription(primary_account_info.email);
+      params.button_text = GetSyncPromoButtonLabel();
       signin_metrics::LogSyncOptInOffered(
           explicit_signin_access_point_.value_or(access_point));
       break;
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
index a350524..bde18a08 100644
--- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
+++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -63,6 +63,10 @@
 #include "chrome/browser/ui/webui/signin/signout_confirmation/signout_confirmation_ui.h"
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+#include "chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.h"
+#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+
 namespace {
 
 const int kModalDialogWidth = 448;
@@ -135,6 +139,28 @@
       kSyncConfirmationDialogWidth, InitializeSigninWebDialogUI(true));
 }
 
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+std::unique_ptr<views::WebView>
+SigninViewControllerDelegateViews::CreateHistorySyncOptInWebView(
+    Browser* browser) {
+  GURL url = GURL(chrome::kChromeUIHistorySyncOptinURL);
+  // TODO(crbug.com/404807488): Height to be adjusted dynamically on the dialog
+  // based on the contents' size.
+  int height = 300;
+  auto web_view = CreateDialogWebView(browser, url, height, kModalDialogWidth,
+                                      InitializeSigninWebDialogUI(false));
+
+  CHECK(web_view);
+  HistorySyncOptinUI* web_ui = web_view->GetWebContents()
+                                   ->GetWebUI()
+                                   ->GetController()
+                                   ->GetAs<HistorySyncOptinUI>();
+  DCHECK(web_ui);
+  web_ui->Initialize(browser);
+  return web_view;
+}
+#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+
 // static
 std::unique_ptr<views::WebView>
 SigninViewControllerDelegateViews::CreateSigninErrorWebView(Browser* browser) {
@@ -515,6 +541,21 @@
       /*animate_on_resize=*/true);
 }
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+// static
+SigninViewControllerDelegate*
+SigninViewControllerDelegate::CreateSyncHistoryOptInDelegate(Browser* browser) {
+  auto content_view =
+      SigninViewControllerDelegateViews::CreateHistorySyncOptInWebView(browser);
+  return new SigninViewControllerDelegateViews(
+      std::move(content_view), browser, ui::mojom::ModalType::kWindow,
+      // TODO(crbug.com/404807488): Update wait for size once dynamic sizing is
+      // implemented for the view.
+      /*wait_for_size=*/false, /*should_show_close_button=*/false,
+      /*animate_on_resize=*/true);
+}
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
 // static
 SigninViewControllerDelegate*
 SigninViewControllerDelegate::CreateSigninErrorDelegate(Browser* browser) {
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
index a2d82b8..85390141 100644
--- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
+++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
@@ -57,6 +57,11 @@
       SyncConfirmationStyle style,
       bool is_sync_promo);
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  static std::unique_ptr<views::WebView> CreateHistorySyncOptInWebView(
+      Browser* browser);
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
   static std::unique_ptr<views::WebView> CreateSigninErrorWebView(
       Browser* browser);
 
diff --git a/chrome/browser/ui/webui/BUILD.gn b/chrome/browser/ui/webui/BUILD.gn
index ac2af52b..6d3b7f5 100644
--- a/chrome/browser/ui/webui/BUILD.gn
+++ b/chrome/browser/ui/webui/BUILD.gn
@@ -39,6 +39,7 @@
     "//chrome/browser/optimization_guide:optimization_guide",
     "//chrome/browser/ui",
     "//chrome/browser/ui/webui/about",
+    "//chrome/browser/ui/webui/accessibility",
     "//components/compose:buildflags",
     "//components/lens:buildflags",
     "//components/security_interstitials/content:security_interstitial_page",
@@ -51,9 +52,14 @@
 
   if (!is_android) {
     deps += [
+      "//chrome/browser/ui/webui/access_code_cast",
       "//chrome/browser/ui/webui/new_tab_footer",
       "//chrome/browser/ui/webui/privacy_sandbox",
     ]
+
+    if (!is_chromeos) {
+      deps += [ "//chrome/browser/ui/webui/app_home" ]
+    }
   }
 
   if (safe_browsing_mode != 0) {
diff --git a/chrome/browser/ui/webui/access_code_cast/BUILD.gn b/chrome/browser/ui/webui/access_code_cast/BUILD.gn
index 95df3bd..5c6f93a7 100644
--- a/chrome/browser/ui/webui/access_code_cast/BUILD.gn
+++ b/chrome/browser/ui/webui/access_code_cast/BUILD.gn
@@ -15,3 +15,113 @@
 
   disable_variants = true
 }
+
+source_set("access_code_cast") {
+  sources = [
+    "access_code_cast_dialog.cc",
+    "access_code_cast_dialog.h",
+    "access_code_cast_handler.cc",
+    "access_code_cast_handler.h",
+    "access_code_cast_ui.cc",
+    "access_code_cast_ui.h",
+  ]
+
+  public_deps = [
+    ":mojo_bindings",
+    "//base",
+    "//chrome/browser:browser_public_dependencies",
+    "//chrome/browser/media/router/discovery",
+    "//chrome/browser/media/router/discovery/access_code:access_code_sink_service",
+    "//chrome/browser/media/router/discovery/access_code:discovery_resources_proto",
+    "//chrome/browser/profiles:profile",
+    "//chrome/browser/ui/media_router",
+    "//chrome/common",
+    "//components/access_code_cast/common:metrics",
+    "//components/media_router/browser",
+    "//components/media_router/common",
+    "//components/signin/public/identity_manager",
+    "//components/sync/service",
+    "//content/public/browser",
+    "//content/public/common",
+    "//mojo/public/cpp/bindings",
+    "//ui/gfx",
+    "//ui/views",
+    "//ui/web_dialogs",
+    "//ui/webui/resources/cr_components/color_change_listener:mojom",
+    "//url",
+  ]
+
+  deps = [
+    "//chrome/app:generated_resources",
+    "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
+    "//chrome/browser/media/webrtc",
+    "//chrome/browser/resources/access_code_cast:resources",
+    "//chrome/browser/sync",
+    "//chrome/browser/sync:factories",
+    "//components/prefs",
+    "//components/sessions",
+    "//components/strings:components_strings",
+    "//components/web_modal",
+    "//ui/base",
+    "//ui/display",
+    "//ui/webui",
+  ]
+}
+
+source_set("interactive_ui_tests") {
+  testonly = true
+  sources = [
+    "access_code_cast_dialog_browsertest.cc",
+    "access_code_cast_handler_browsertest.cc",
+  ]
+
+  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
+
+  deps = [
+    ":access_code_cast",
+    "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
+    "//chrome/browser/profiles:profile",
+    "//chrome/browser/ui",
+    "//chrome/test:test_support",
+    "//chrome/test/media_router/access_code_cast:access_code_cast_integration_base",
+    "//components/prefs",
+    "//components/sessions",
+    "//content/public/browser",
+    "//content/test:test_support",
+    "//services/network:test_support",
+    "//testing/gtest",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [ "access_code_cast_handler_unittest.cc" ]
+
+  deps = [
+    ":access_code_cast",
+    "//base",
+    "//base/test:test_support",
+    "//chrome/browser",
+    "//chrome/browser/media/router",
+    "//chrome/browser/media/router:test_support",
+    "//chrome/browser/media/router/discovery",
+    "//chrome/browser/media/router/discovery/access_code:access_code_sink_service",
+    "//chrome/browser/search_engines",
+    "//chrome/browser/ui/global_media_controls:test_support",
+    "//chrome/browser/ui/media_router",
+    "//chrome/test:test_support",
+    "//components/media_router/browser",
+    "//components/media_router/browser:test_support",
+    "//components/media_router/common",
+    "//components/media_router/common/providers/cast/channel",
+    "//components/media_router/common/providers/cast/channel:test_support",
+    "//components/sessions",
+    "//components/signin/public/identity_manager",
+    "//components/signin/public/identity_manager:test_support",
+    "//components/sync:test_support",
+    "//content/test:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+    "//url",
+  ]
+}
diff --git a/chrome/browser/ui/webui/accessibility/BUILD.gn b/chrome/browser/ui/webui/accessibility/BUILD.gn
new file mode 100644
index 0000000..56a027b
--- /dev/null
+++ b/chrome/browser/ui/webui/accessibility/BUILD.gn
@@ -0,0 +1,37 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+assert(is_win || is_mac || is_linux || is_chromeos || is_android)
+
+source_set("accessibility") {
+  sources = [
+    "accessibility_ui.cc",
+    "accessibility_ui.h",
+  ]
+
+  public_deps = [
+    "//base",
+    "//chrome/browser:browser_public_dependencies",
+    "//content/public/browser",
+    "//ui/accessibility/platform",
+  ]
+
+  deps = [
+    "//base/tracing/protos:chrome_track_event_zero",
+    "//chrome/browser/profiles:profile",
+    "//chrome/browser/resources/accessibility:resources",
+    "//chrome/common",
+    "//components/pref_registry",
+    "//components/prefs",
+    "//ui/accessibility:ax_base",
+    "//ui/base",
+  ]
+
+  if (!is_android) {
+    deps += [
+      "//chrome/browser/ui:browser_list",
+      "//ui/views",
+    ]
+  }
+}
diff --git a/chrome/browser/ui/webui/app_home/BUILD.gn b/chrome/browser/ui/webui/app_home/BUILD.gn
index 7aa8e1d..8f1488ef 100644
--- a/chrome/browser/ui/webui/app_home/BUILD.gn
+++ b/chrome/browser/ui/webui/app_home/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//extensions/buildflags/buildflags.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 
 assert(is_win || is_mac || is_linux)
@@ -38,3 +39,86 @@
     },
   ]
 }
+
+source_set("app_home") {
+  sources = [
+    "app_home_page_handler.cc",
+    "app_home_page_handler.h",
+    "app_home_ui.cc",
+    "app_home_ui.h",
+  ]
+
+  public_deps = [
+    ":mojo_bindings",
+    "//base",
+    "//chrome/browser:browser_public_dependencies",
+    "//chrome/browser/extensions",
+    "//chrome/browser/profiles:profile",
+    "//chrome/browser/web_applications",
+    "//chrome/browser/web_applications/mojom:mojom_web_apps_enum",
+    "//chrome/common",
+    "//chrome/common/extensions",
+    "//components/webapps/common",
+    "//content/public/browser",
+    "//extensions/browser",
+    "//extensions/common:common_constants",
+    "//mojo/public/cpp/bindings",
+    "//ui/base",
+    "//ui/webui",
+  ]
+
+  deps = [
+    ":mojo_bindings_shared_cpp_sources",
+    "//chrome/app:generated_resources",
+    "//chrome/app/theme:theme_resources",
+    "//chrome/browser/apps/app_service",
+    "//chrome/browser/apps/app_service:constants",
+    "//chrome/browser/resources/app_home:resources",
+    "//chrome/browser/resources/app_home:resources_grit",
+    "//chrome/browser/web_applications/proto",
+    "//chrome/common:chrome_features",
+    "//components/webapps/browser:constants",
+    "//net",
+    "//url",
+  ]
+}
+
+if (enable_extensions) {
+  source_set("browser_tests") {
+    testonly = true
+    sources = [
+      "app_home_page_handler_browsertest.cc",
+      "mock_app_home_page.cc",
+      "mock_app_home_page.h",
+    ]
+
+    public_deps = [
+      ":mojo_bindings",
+      "//mojo/public/cpp/bindings",
+      "//testing/gmock",
+    ]
+
+    deps = [
+      ":app_home",
+      "//base",
+      "//base/test:test_support",
+      "//chrome/browser/extensions:test_support",
+      "//chrome/browser/ui/tabs:tab_strip",
+      "//chrome/browser/web_applications",
+      "//chrome/browser/web_applications:web_applications_test_support",
+      "//chrome/common",
+      "//chrome/test:test_support",
+      "//chrome/test:test_support_ui",
+      "//components/webapps/browser",
+      "//content/public/browser",
+      "//content/test:test_support",
+      "//extensions:test_support",
+      "//extensions/browser",
+      "//extensions/common",
+      "//ui/views",
+      "//ui/views:test_support",
+    ]
+
+    defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
+  }
+}
diff --git a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom
index a4ec78a..c14b96c 100644
--- a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom
+++ b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom
@@ -15,7 +15,13 @@
 };
 
 // Called from TS side of chrome://history-sync-optin (Renderer -> Browser)
-interface PageHandler {};
+interface PageHandler {
+
+  // The user accepts the history sync optin screen by clicking the `Yes I'am in` button.
+  Accept();
+  // The user rejects the history sync optin by clicking the `No thanks` button.
+  Reject();
+};
 
 // Called from C++ side of chrome://history-sync-optin (Browser -> Renderer)
 interface Page {};
diff --git a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.cc b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.cc
index 83667fcf..2f276e7c 100644
--- a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.cc
+++ b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.cc
@@ -6,11 +6,57 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/sync/sync_service_factory.h"
 #include "chrome/browser/ui/browser.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/sync/protocol/user_consent_types.pb.h"
+#include "components/sync/service/sync_service.h"
+#include "components/sync/service/sync_user_settings.h"
 
 HistorySyncOptinHandler::HistorySyncOptinHandler(
     mojo::PendingReceiver<history_sync_optin::mojom::PageHandler> receiver,
-    mojo::PendingRemote<history_sync_optin::mojom::Page> page)
-    : receiver_(this, std::move(receiver)), page_(std::move(page)) {}
+    mojo::PendingRemote<history_sync_optin::mojom::Page> page,
+    Browser* browser,
+    Profile* profile)
+    : receiver_(this, std::move(receiver)),
+      page_(std::move(page)),
+      browser_(browser ? browser->AsWeakPtr() : nullptr),
+      profile_(profile) {
+  CHECK(profile_);
+}
 
 HistorySyncOptinHandler::~HistorySyncOptinHandler() = default;
+
+void HistorySyncOptinHandler::Accept() {
+  AddHistorySyncConsent();
+  FinishAndCloseDialog();
+}
+
+void HistorySyncOptinHandler::Reject() {
+  FinishAndCloseDialog();
+}
+
+void HistorySyncOptinHandler::FinishAndCloseDialog() {
+  // TODO(crbug.com/404806506): Add metrics.
+  if (browser_) {
+    browser_->signin_view_controller()->CloseModalSignin();
+  }
+}
+
+void HistorySyncOptinHandler::AddHistorySyncConsent() {
+  sync_pb::UserConsentTypes::SyncConsent sync_consent;
+  syncer::SyncService* sync_service =
+      SyncServiceFactory::GetForProfile(profile_);
+  CHECK(sync_service);
+  auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
+  CHECK(identity_manager);
+  CHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
+  // TODO(crbug.com/404806988): As we add the invocation points check if additional actions
+  // are needed to enable sync for history.
+  // The invocation below works for an already syncing user. It enables the syncing for history
+  // if it's not already turned on.
+  sync_service->GetUserSettings()->SetSelectedType(
+      syncer::UserSelectableType::kHistory, /*is_type_on=*/true);
+}
diff --git a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.h b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.h
index c5f1f0e..fd1899a7 100644
--- a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.h
+++ b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.h
@@ -7,27 +7,45 @@
 
 #include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 
+class Browser;
+class Profile;
+
 class HistorySyncOptinHandler : public history_sync_optin::mojom::PageHandler {
  public:
   // Initializes the handler with the mojo handlers and the needed information
   // to be displayed as well as callbacks to the main native view.
   HistorySyncOptinHandler(
       mojo::PendingReceiver<history_sync_optin::mojom::PageHandler> receiver,
-      mojo::PendingRemote<history_sync_optin::mojom::Page> page);
+      mojo::PendingRemote<history_sync_optin::mojom::Page> page,
+      Browser* browser,
+      Profile* profile);
   ~HistorySyncOptinHandler() override;
 
   HistorySyncOptinHandler(const HistorySyncOptinHandler&) = delete;
   HistorySyncOptinHandler& operator=(const HistorySyncOptinHandler&) = delete;
 
+  // history_sync_optin::mojom::PageHandler:
+  void Accept() override;
+  void Reject() override;
+
  private:
+  // Closes the modal dialog, if one is open.
+  void FinishAndCloseDialog();
+  // Adds sync consent to the history data type.
+  void AddHistorySyncConsent();
+
   // Allows handling received messages from the web ui page.
   mojo::Receiver<history_sync_optin::mojom::PageHandler> receiver_;
   // Interface to send information to the web ui page.
   mojo::Remote<history_sync_optin::mojom::Page> page_;
+
+  base::WeakPtr<Browser> browser_;
+  raw_ptr<Profile> profile_;
 };
 
 #endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_HISTORY_SYNC_OPTIN_HISTORY_SYNC_OPTIN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.cc b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.cc
index 7c1117a..aa1ffcf 100644
--- a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.cc
+++ b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
+#include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_handler.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
@@ -24,10 +25,11 @@
 }
 
 HistorySyncOptinUI::HistorySyncOptinUI(content::WebUI* web_ui)
-    : ui::MojoWebUIController(web_ui, true) {
+    : ui::MojoWebUIController(web_ui, true),
+      profile_(Profile::FromWebUI(web_ui)) {
   // Set up the chrome://history-sync-optin source.
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
-      Profile::FromWebUI(web_ui), chrome::kChromeUIHistorySyncOptinHost);
+      profile_, chrome::kChromeUIHistorySyncOptinHost);
 
   // Add required resources.
   webui::SetupWebUIDataSource(
@@ -39,9 +41,11 @@
       {"historySyncOptInSubtitle", IDS_HISTORY_SYNC_OPT_IN_SUBTITLE},
       {"historySyncOptInAcceptButtonLabel",
        IDS_HISTORY_SYNC_OPT_IN_ACCEPT_BUTTON},
-      {"historySyncOptInCancelButtonLabel",
-       IDS_HISTORY_SYNC_OPT_IN_CANCEL_BUTTON},
-      {"historySyncOptInDescription", IDS_HISTORY_SYNC_OPT_IN_DESCRIPTION}};
+      {"historySyncOptInRejectButtonLabel",
+       IDS_HISTORY_SYNC_OPT_IN_REJECT_BUTTON},
+      {"historySyncOptInDescription", IDS_HISTORY_SYNC_OPT_IN_DESCRIPTION},
+  };
+
   source->AddLocalizedStrings(kLocalizedStrings);
   // Add avatar fallback value.
   source->AddString("accountPictureUrl",
@@ -59,10 +63,27 @@
   page_factory_receiver_.Bind(std::move(receiver));
 }
 
+void HistorySyncOptinUI::Initialize(Browser* browser) {
+  initialize_handler_callback_ =
+      base::BindOnce(&HistorySyncOptinUI::OnMojoHandlersReady,
+                     weak_ptr_factory_.GetWeakPtr(), browser);
+}
+
 void HistorySyncOptinUI::CreateHistorySyncOptinHandler(
     mojo::PendingRemote<history_sync_optin::mojom::Page> page,
     mojo::PendingReceiver<history_sync_optin::mojom::PageHandler> receiver) {
-  DCHECK(page);
-  page_handler_ = std::make_unique<HistorySyncOptinHandler>(std::move(receiver),
-                                                            std::move(page));
+  CHECK(page);
+  CHECK(receiver);
+  CHECK(initialize_handler_callback_);
+  std::move(initialize_handler_callback_)
+      .Run(std::move(page), std::move(receiver));
+}
+
+void HistorySyncOptinUI::OnMojoHandlersReady(
+    Browser* browser,
+    mojo::PendingRemote<history_sync_optin::mojom::Page> page,
+    mojo::PendingReceiver<history_sync_optin::mojom::PageHandler> receiver) {
+  CHECK(!page_handler_);
+  page_handler_ = std::make_unique<HistorySyncOptinHandler>(
+      std::move(receiver), std::move(page), browser, profile_);
 }
diff --git a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.h b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.h
index 05d9fe6..ddbf07aab 100644
--- a/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.h
+++ b/chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_WEBUI_SIGNIN_HISTORY_SYNC_OPTIN_HISTORY_SYNC_OPTIN_UI_H_
 
 #include "base/functional/callback.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom.h"
 #include "chrome/common/webui_url_constants.h"
 #include "content/public/browser/webui_config.h"
@@ -14,6 +15,8 @@
 
 class HistorySyncOptinHandler;
 class HistorySyncOptinUI;
+class Browser;
+class Profile;
 
 class HistorySyncOptinUIConfig
     : public content::DefaultWebUIConfig<HistorySyncOptinUI> {
@@ -43,6 +46,9 @@
       mojo::PendingReceiver<history_sync_optin::mojom::PageHandlerFactory>
           receiver);
 
+  // Prepares the information to be given to the handler once ready.
+  void Initialize(Browser* browser);
+
  private:
   // history_sync_optin::mojom::PageHandlerFactory:
   void CreateHistorySyncOptinHandler(
@@ -50,11 +56,25 @@
       mojo::PendingReceiver<history_sync_optin::mojom::PageHandler> receiver)
       override;
 
-  std::unique_ptr<HistorySyncOptinHandler> page_handler_;
+  // Callback awaiting `CreateHistorySyncOptinHandler` to create the handlers
+  // with all the needed information to display.
+  void OnMojoHandlersReady(
+      Browser* browser,
+      mojo::PendingRemote<history_sync_optin::mojom::Page> page,
+      mojo::PendingReceiver<history_sync_optin::mojom::PageHandler> receiver);
 
+  // Callback that temporarily holds the information to be passed onto the
+  // handler. The callback is called once the mojo handlers are available.
+  base::OnceCallback<void(
+      mojo::PendingRemote<history_sync_optin::mojom::Page>,
+      mojo::PendingReceiver<history_sync_optin::mojom::PageHandler>)>
+      initialize_handler_callback_;
+  std::unique_ptr<HistorySyncOptinHandler> page_handler_;
   mojo::Receiver<history_sync_optin::mojom::PageHandlerFactory>
       page_factory_receiver_{this};
+  raw_ptr<Profile> profile_;
 
+  base::WeakPtrFactory<HistorySyncOptinUI> weak_ptr_factory_{this};
   WEB_UI_CONTROLLER_TYPE_DECL();
 };
 
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
index 7672d48..62b09d2 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
@@ -912,6 +912,8 @@
 
 TEST_F(ChromeAuthenticatorRequestDelegateTest, DiscoverPasswords) {
   for (const auto enable_password : {false, true}) {
+    content::WebContentsTester::For(web_contents())
+        ->NavigateAndCommit(GURL(kOrigin));
     ChromeAuthenticatorRequestDelegate delegate(main_rfh());
     auto password_controller =
         std::make_unique<testing::NiceMock<MockPasswordCredentialController>>(
@@ -942,6 +944,8 @@
 
 TEST_F(ChromeAuthenticatorRequestDelegateTest,
        TryToShowUiNoImmediateCredentials) {
+  content::WebContentsTester::For(web_contents())
+      ->NavigateAndCommit(GURL(kOrigin));
   ChromeAuthenticatorRequestDelegate delegate(main_rfh());
   auto password_controller =
       std::make_unique<testing::NiceMock<MockPasswordCredentialController>>(
@@ -984,6 +988,8 @@
 
 TEST_F(ChromeAuthenticatorRequestDelegateTest,
        TryToShowUiHasImmediateCredentials) {
+  content::WebContentsTester::For(web_contents())
+      ->NavigateAndCommit(GURL(kOrigin));
   ChromeAuthenticatorRequestDelegate delegate(main_rfh());
   auto password_controller =
       std::make_unique<testing::NiceMock<MockPasswordCredentialController>>(
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 0b44c9f..dd60c13b 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1747094145-8f652eb0e1e9b4791125a2d246b16f28edb9c197-209588d432611f8cc26421bf48c42a09ceab9742.profdata
+chrome-android32-main-1747137314-3709e2060febeef396fac45d2da47dfc464f0491-a072337580a64495dd16caf299d4415ae81ce129.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 24c98f3..45db691 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1747109191-51d45c99a07cf92d2efc89b7e47754a39ec391dd-808e7d0e55827e67e1b8ac4fedf2421924286870.profdata
+chrome-android64-main-1747135594-24b03d90ce459c6d0a03c3249d879cac3ae1b08a-cbc5a48b38834a03bed921472baa699012ed6432.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index fb2fb11..f85c1be4 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1747108348-c8fc5cc54f66c2ff3e579d4e1460f808581ba0d2-170aba132ccbc47ed73b59df164cd5f8c98876dd.profdata
+chrome-mac-arm-main-1747137314-3f497042de8a0e07f7096122d87d023157d38feb-a072337580a64495dd16caf299d4415ae81ce129.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 66d8d1a..e369019 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1747094145-fd7a62aa350711bb2fb5316bf7c7673c8c0769fe-209588d432611f8cc26421bf48c42a09ceab9742.profdata
+chrome-mac-main-1747115973-cd5e90b2e372d8a02e0b17d8b895c7ddf0ebca31-80cb2d193db7515d8f2a457cbdac343bf0167588.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index c794eef..c93286e3 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1747094145-e6da7e174a41773946cc319a8bd4c312e9c7b2ad-209588d432611f8cc26421bf48c42a09ceab9742.profdata
+chrome-win-arm64-main-1747115973-db58c355db51678e5539d76d29005ccbe5845a89-80cb2d193db7515d8f2a457cbdac343bf0167588.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 52c3ef3..2ee6a7b 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1747094145-91fdc4a66a639fcf28cfdc8ade8437f45a1d4ac8-209588d432611f8cc26421bf48c42a09ceab9742.profdata
+chrome-win32-main-1747115973-15acb1bf2ff9ca0fb5651e97404bede1e1b67f82-80cb2d193db7515d8f2a457cbdac343bf0167588.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 7f8f121..e9b98d9 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1747072790-18acbccf4e3e885a0f8078d6455f3a45dcd8ea9b-3e3a70932389e905ada855eaffe5580962c75b77.profdata
+chrome-win64-main-1747105179-de824badbf474a7d983514592cb6004a9ca98ff3-5c7a6b5a0eda8452c2ac423a66d9cf275ae0e663.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 6a440e1..58a22b4 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -1727,7 +1727,7 @@
 // go/cros-eventbasedlogcollection-dd.
 BASE_FEATURE(kEventBasedLogUpload,
              "EventBasedLogUpload",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // A feature to enable periodic log upload migration. This includes using new
 // mechanism for collecting, exporting and uploading logs. See
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 90d540e5..da005b3 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4513,10 +4513,9 @@
           "../browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc",
           "../browser/supervised_user/supervised_user_pending_state_navigation_browsertest.cc",
           "../browser/ui/views/web_apps/file_handler_launch_dialog_browsertest.cc",
-          "../browser/ui/webui/app_home/app_home_page_handler_browsertest.cc",
-          "../browser/ui/webui/app_home/mock_app_home_page.cc",
-          "../browser/ui/webui/app_home/mock_app_home_page.h",
         ]
+
+        deps += [ "//chrome/browser/ui/webui/app_home:browser_tests" ]
       }
 
       if (enterprise_cloud_content_analysis || is_android) {
@@ -4886,6 +4885,8 @@
           "../browser/ui/views/web_apps/deprecated_apps_dialog_view_browsertest.cc",
           "../browser/ui/views/web_apps/force_installed_deprecated_apps_dialog_view_browsertest.cc",
         ]
+
+        deps += [ "//chrome/browser/ui/webui/app_home" ]
       }
       if (is_chromeos) {
         sources += [ "../browser/ui/views/frame/system_web_app_non_client_frame_view_browsertest.cc" ]
@@ -7955,7 +7956,6 @@
       "../browser/ui/webauthn/sheet_models_unittest.cc",
       "../browser/ui/webid/identity_dialog_controller_unittest.cc",
       "../browser/ui/webid/identity_ui_utils_unittest.cc",
-      "../browser/ui/webui/access_code_cast/access_code_cast_handler_unittest.cc",
       "../browser/ui/webui/app_management/app_management_page_handler_unittest.cc",
       "../browser/ui/webui/browser_command/browser_command_handler_unittest.cc",
       "../browser/ui/webui/commerce/price_tracking_handler_unittest.cc",
@@ -8086,6 +8086,7 @@
       "//chrome/browser/ui/views/page_action:unit_tests",
       "//chrome/browser/ui/views/webid:test_support",
       "//chrome/browser/ui/webui:webui_util",
+      "//chrome/browser/ui/webui/access_code_cast:unit_tests",
       "//chrome/browser/ui/webui/new_tab_footer:unit_tests",
       "//chrome/browser/ui/webui/privacy_sandbox:unit_tests",
       "//chrome/browser/ui/webui/settings",
@@ -10763,6 +10764,8 @@
         "../browser/password_manager/password_manager_signin_intercept_test_helper.cc",
         "../browser/password_manager/password_manager_signin_intercept_test_helper.h",
       ]
+
+      public_deps += [ "//chrome/browser/ui/webui/app_home" ]
     }
     if (enable_dice_support) {
       sources += [
@@ -10941,8 +10944,6 @@
       "../browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc",
       "../browser/ui/views/web_dialog_view_browsertest.cc",
       "../browser/ui/web_applications/web_app_interactive_uitest.cc",
-      "../browser/ui/webui/access_code_cast/access_code_cast_dialog_browsertest.cc",
-      "../browser/ui/webui/access_code_cast/access_code_cast_handler_browsertest.cc",
       "../browser/ui/webui/cr_components/history_embeddings/history_embeddings_interactive_uitest.cc",
       "../browser/ui/webui/downloads/downloads_page_interactive_uitest.cc",
       "../browser/ui/webui/settings/performance_settings_interactive_uitest.cc",
@@ -11031,6 +11032,7 @@
       "//chrome/browser/prefs",
       "//chrome/browser/prefs:util",
       "//chrome/browser/privacy_sandbox:interactive_ui_tests",
+      "//chrome/browser/ui/webui/access_code_cast:interactive_ui_tests",
 
       # TODO(413315837): Remove this dependency when
       # c/b/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc
diff --git a/chrome/test/data/webui/settings/geolocation_page_test.ts b/chrome/test/data/webui/settings/geolocation_page_test.ts
index 8ba6e110..fef1f3d1 100644
--- a/chrome/test/data/webui/settings/geolocation_page_test.ts
+++ b/chrome/test/data/webui/settings/geolocation_page_test.ts
@@ -4,9 +4,10 @@
 
 // clang-format off
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import type {GeolocationPageElement} from 'chrome://settings/lazy_load.js';
 import {ContentSetting, ContentSettingsTypes, SiteSettingsPrefsBrowserProxyImpl, SettingsState} from 'chrome://settings/lazy_load.js';
-import type {SettingsPrefsElement, SettingsPrivacyPageElement} from 'chrome://settings/settings.js';
-import {CrSettingsPrefs, Router, routes} from 'chrome://settings/settings.js';
+import type {SettingsPrefsElement} from 'chrome://settings/settings.js';
+import {CrSettingsPrefs} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {isChildVisible, isVisible} from 'chrome://webui-test/test_util.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
@@ -31,7 +32,7 @@
 }
 
 suite(`GeolocationPage`, function() {
-  let page: SettingsPrivacyPageElement;
+  let page: GeolocationPageElement;
   let settingsPrefs: SettingsPrefsElement;
   let siteSettingsBrowserProxy: TestSiteSettingsPrefsBrowserProxy;
 
@@ -41,7 +42,7 @@
   });
 
   function createPage() {
-    page = document.createElement('settings-privacy-page');
+    page = document.createElement('settings-geolocation-page');
     page.prefs = settingsPrefs.prefs!;
     document.body.appendChild(page);
     return flushTasks();
@@ -59,30 +60,32 @@
     page.remove();
   });
 
+  test('LocationPage', function() {
+    assertTrue(isChildVisible(page, '#locationDefaultRadioGroup'));
+    const categorySettingExceptions =
+        page.shadowRoot!.querySelector('category-setting-exceptions');
+    assertTrue(!!categorySettingExceptions);
+    assertTrue(isVisible(categorySettingExceptions));
+    assertEquals(
+        ContentSettingsTypes.GEOLOCATION, categorySettingExceptions.category);
+  });
+
   test('locationCPSS', async function() {
     siteSettingsBrowserProxy.setPrefs(
         createPref(ContentSettingsTypes.GEOLOCATION, ContentSetting.ALLOW));
 
-    Router.getInstance().navigateTo(routes.SITE_SETTINGS_LOCATION);
-    await flushTasks();
-    const settingsSubpage = page.shadowRoot!.querySelector('settings-subpage');
-    assertTrue(!!settingsSubpage);
-    assertTrue(isVisible(settingsSubpage));
-
     const radioGroup = page.shadowRoot!.querySelector<HTMLElement>(
         'settings-category-default-radio-group');
     assertTrue(!!radioGroup);
     assertTrue(isVisible(radioGroup));
-    assertTrue(
-        isChildVisible(settingsSubpage, '#locationCpssRadioGroup', true));
+    assertTrue(isChildVisible(page, '#locationCpssRadioGroup'));
 
     const blockLocation = radioGroup.shadowRoot!.querySelector<HTMLElement>(
         '#disabledRadioOption');
     assertTrue(!!blockLocation);
     blockLocation.click();
     await flushTasks();
-    assertFalse(
-        isChildVisible(settingsSubpage, '#locationCpssRadioGroup', true));
+    assertFalse(isChildVisible(page, '#locationCpssRadioGroup'));
     assertEquals(
         SettingsState.BLOCK, page.get('prefs.generated.geolocation.value'));
 
@@ -91,8 +94,7 @@
     assertTrue(!!allowLocation);
     allowLocation.click();
     await flushTasks();
-    assertTrue(
-        isChildVisible(settingsSubpage, '#locationCpssRadioGroup', true));
+    assertTrue(isChildVisible(page, '#locationCpssRadioGroup'));
     assertEquals(
         SettingsState.CPSS, page.get('prefs.generated.geolocation.value'));
   });
@@ -101,7 +103,7 @@
 // TODO(crbug.com/340743074): Remove tests after
 // `PermissionSiteSettingsRadioButton` launched.
 suite(`GeolocationPageWithNestedRadioButton`, function() {
-  let page: SettingsPrivacyPageElement;
+  let page: GeolocationPageElement;
   let settingsPrefs: SettingsPrefsElement;
   let siteSettingsBrowserProxy: TestSiteSettingsPrefsBrowserProxy;
 
@@ -114,7 +116,7 @@
   });
 
   function createPage() {
-    page = document.createElement('settings-privacy-page');
+    page = document.createElement('settings-geolocation-page');
     page.prefs = settingsPrefs.prefs!;
     document.body.appendChild(page);
     return flushTasks();
@@ -132,15 +134,20 @@
     page.remove();
   });
 
+  test('LocationPage', function() {
+    assertTrue(isChildVisible(page, '#locationRadioGroup'));
+    const categorySettingExceptions =
+        page.shadowRoot!.querySelector('category-setting-exceptions');
+    assertTrue(!!categorySettingExceptions);
+    assertTrue(isVisible(categorySettingExceptions));
+    assertEquals(
+        ContentSettingsTypes.GEOLOCATION, categorySettingExceptions.category);
+  });
+
   test('locationCPSS', async function() {
     siteSettingsBrowserProxy.setPrefs(
         createPref(ContentSettingsTypes.GEOLOCATION, ContentSetting.ALLOW));
 
-    Router.getInstance().navigateTo(routes.SITE_SETTINGS_LOCATION);
-    await flushTasks();
-    const settingsSubpage = page.shadowRoot!.querySelector('settings-subpage');
-    assertTrue(!!settingsSubpage);
-    assertTrue(isVisible(settingsSubpage));
     assertTrue(isChildVisible(page, '#locationRadioGroup'));
     assertTrue(isChildVisible(page, '#locationCpssRadioGroup'));
 
diff --git a/chrome/test/data/webui/settings/privacy_page_test.ts b/chrome/test/data/webui/settings/privacy_page_test.ts
index 6693a62f..deb4ec8 100644
--- a/chrome/test/data/webui/settings/privacy_page_test.ts
+++ b/chrome/test/data/webui/settings/privacy_page_test.ts
@@ -214,40 +214,13 @@
     assertTrue(isChildVisible(page, 'settings-notifications-page'));
   });
 
-  test('LocationPage', async function() {
-    loadTimeData.overrideValues({
-      enablePermissionSiteSettingsRadioButton: false,
-    });
+  test('GeolocationPage', async function() {
     await createPage();
 
     Router.getInstance().navigateTo(routes.SITE_SETTINGS_LOCATION);
     await flushTasks();
 
-    assertTrue(isChildVisible(page, '#locationRadioGroup'));
-    const categorySettingExceptions =
-        page.shadowRoot!.querySelector('category-setting-exceptions');
-    assertTrue(!!categorySettingExceptions);
-    assertTrue(isVisible(categorySettingExceptions));
-    assertEquals(
-        ContentSettingsTypes.GEOLOCATION, categorySettingExceptions.category);
-  });
-
-  test('LocationPage2', async function() {
-    loadTimeData.overrideValues({
-      enablePermissionSiteSettingsRadioButton: true,
-    });
-    await createPage();
-
-    Router.getInstance().navigateTo(routes.SITE_SETTINGS_LOCATION);
-    await flushTasks();
-
-    assertTrue(isChildVisible(page, '#locationDefaultRadioGroup'));
-    const categorySettingExceptions =
-        page.shadowRoot!.querySelector('category-setting-exceptions');
-    assertTrue(!!categorySettingExceptions);
-    assertTrue(isVisible(categorySettingExceptions));
-    assertEquals(
-        ContentSettingsTypes.GEOLOCATION, categorySettingExceptions.category);
+    assertTrue(isChildVisible(page, 'settings-geolocation-page'));
   });
 
   test('privacySandboxRestricted', function() {
diff --git a/chrome/test/media_router/access_code_cast/BUILD.gn b/chrome/test/media_router/access_code_cast/BUILD.gn
index 476ed5e2..5c3304b5 100644
--- a/chrome/test/media_router/access_code_cast/BUILD.gn
+++ b/chrome/test/media_router/access_code_cast/BUILD.gn
@@ -13,7 +13,10 @@
     "access_code_cast_integration_browsertest.h",
   ]
 
-  public_deps = [ "//chrome/browser/ui:ui_features" ]
+  public_deps = [
+    "//chrome/browser/ui:ui_features",
+    "//chrome/browser/ui/webui/access_code_cast",
+  ]
 
   deps = [
     "//base/test:test_support",
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index b0c694c..8529cda 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-138-7137.0-1746414666-benchmark-138.0.7171.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-138-7151.8-1747020746-benchmark-138.0.7171.0-r1-redacted.afdo.xz
diff --git a/clank b/clank
index 24dba409..bdbf680 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 24dba4094427e89cdb21ff38df13ac54ce2bb238
+Subproject commit bdbf6803cc84244212889ace086086cab20c18c6
diff --git a/components/android_autofill/browser/android_autofill_manager.cc b/components/android_autofill/browser/android_autofill_manager.cc
index f88fdf5..fe102234 100644
--- a/components/android_autofill/browser/android_autofill_manager.cc
+++ b/components/android_autofill/browser/android_autofill_manager.cc
@@ -93,7 +93,8 @@
     const FormData& form,
     const FieldGlobalId& field_id,
     const gfx::Rect& caret_bounds,
-    AutofillSuggestionTriggerSource trigger_source) {
+    AutofillSuggestionTriggerSource trigger_source,
+    base::optional_ref<const PasswordSuggestionRequest> password_request) {
   auto* provider = GetAutofillProvider();
   if (!provider) {
     return;
diff --git a/components/android_autofill/browser/android_autofill_manager.h b/components/android_autofill/browser/android_autofill_manager.h
index dd844ee..b5749e8a 100644
--- a/components/android_autofill/browser/android_autofill_manager.h
+++ b/components/android_autofill/browser/android_autofill_manager.h
@@ -90,7 +90,9 @@
       const FormData& form,
       const FieldGlobalId& field_id,
       const gfx::Rect& caret_bounds,
-      AutofillSuggestionTriggerSource trigger_source) override;
+      AutofillSuggestionTriggerSource trigger_source,
+      base::optional_ref<const PasswordSuggestionRequest> password_request)
+      override;
 
   void OnFocusOnFormFieldImpl(const FormData& form,
                               const FieldGlobalId& field_id) override;
diff --git a/components/android_autofill/browser/android_autofill_provider_unittest.cc b/components/android_autofill/browser/android_autofill_provider_unittest.cc
index 6c34acf..0235fc5 100644
--- a/components/android_autofill/browser/android_autofill_provider_unittest.cc
+++ b/components/android_autofill/browser/android_autofill_provider_unittest.cc
@@ -170,7 +170,7 @@
     gfx::Rect caret_bounds(gfx::Point(p.x(), p.y()), gfx::Size(0, 10));
     OnAskForValuesToFillImpl(
         form, field.global_id(), caret_bounds,
-        AutofillSuggestionTriggerSource::kTextFieldValueChanged);
+        AutofillSuggestionTriggerSource::kTextFieldValueChanged, std::nullopt);
   }
 
   void SimulateOnFocusOnFormField(const FormData& form,
diff --git a/components/attribution_reporting/trigger_config.h b/components/attribution_reporting/trigger_config.h
index 10fc23b..c1fdfa2f 100644
--- a/components/attribution_reporting/trigger_config.h
+++ b/components/attribution_reporting/trigger_config.h
@@ -138,10 +138,6 @@
       return a.it_ == b.it_;
     }
 
-    friend bool operator!=(const Iterator& a, const Iterator& b) {
-      return a.it_ != b.it_;
-    }
-
    private:
     friend TriggerSpecs;
 
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 6b33be9..87c8a04 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -338,6 +338,7 @@
     "integrators/optimization_guide/autofill_optimization_guide.cc",
     "integrators/optimization_guide/autofill_optimization_guide.h",
     "integrators/password_form_classification.h",
+    "integrators/password_manager/autofill_password_manager_delegate.h",
     "integrators/plus_addresses/autofill_plus_address_delegate.h",
     "integrators/touch_to_fill/touch_to_fill_delegate.h",
     "logging/log_buffer_submitter.cc",
@@ -1042,6 +1043,8 @@
     "integrators/identity_credential/mock_identity_credential_delegate.h",
     "integrators/optimization_guide/mock_autofill_optimization_guide.cc",
     "integrators/optimization_guide/mock_autofill_optimization_guide.h",
+    "integrators/password_manager/mock_autofill_password_manager_delegate.cc",
+    "integrators/password_manager/mock_autofill_password_manager_delegate.h",
     "integrators/plus_addresses/mock_autofill_plus_address_delegate.cc",
     "integrators/plus_addresses/mock_autofill_plus_address_delegate.h",
     "logging/stub_log_manager.cc",
diff --git a/components/autofill/core/browser/foundations/autofill_client.cc b/components/autofill/core/browser/foundations/autofill_client.cc
index e3f49a7..5a4c500 100644
--- a/components/autofill/core/browser/foundations/autofill_client.cc
+++ b/components/autofill/core/browser/foundations/autofill_client.cc
@@ -15,6 +15,7 @@
 #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/compose/autofill_compose_delegate.h"
 #include "components/autofill/core/browser/integrators/identity_credential/identity_credential_delegate.h"
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
 #include "components/autofill/core/browser/integrators/plus_addresses/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/payments/credit_card_access_manager.h"
 #include "components/autofill/core/browser/studies/autofill_ablation_study.h"
@@ -92,6 +93,10 @@
   return nullptr;
 }
 
+AutofillPasswordManagerDelegate* AutofillClient::GetPasswordManagerDelegate() {
+  return nullptr;
+}
+
 void AutofillClient::GetAiPageContent(GetAiPageContentCallback callback) {
   std::move(callback).Run(std::nullopt);
 }
diff --git a/components/autofill/core/browser/foundations/autofill_client.h b/components/autofill/core/browser/foundations/autofill_client.h
index ee512b8..684807c 100644
--- a/components/autofill/core/browser/foundations/autofill_client.h
+++ b/components/autofill/core/browser/foundations/autofill_client.h
@@ -27,6 +27,7 @@
 #include "components/autofill/core/browser/integrators/fast_checkout/fast_checkout_client.h"
 #include "components/autofill/core/browser/integrators/identity_credential/identity_credential_delegate.h"
 #include "components/autofill/core/browser/integrators/password_form_classification.h"
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
 #include "components/autofill/core/browser/suggestions/suggestion.h"
 #include "components/autofill/core/browser/suggestions/suggestion_hiding_reason.h"
 #include "components/autofill/core/browser/suggestions/suggestion_type.h"
@@ -325,6 +326,9 @@
   // the window of this tab.
   virtual AutofillPlusAddressDelegate* GetPlusAddressDelegate();
 
+  // Returns the `AutofillPasswordManagerDelegate`.
+  virtual AutofillPasswordManagerDelegate* GetPasswordManagerDelegate();
+
   // TODO(crbug.com/365494310): Move these methods to a plus-address-specific
   // client class.
 
diff --git a/components/autofill/core/browser/foundations/autofill_manager.cc b/components/autofill/core/browser/foundations/autofill_manager.cc
index c174136..baff47db 100644
--- a/components/autofill/core/browser/foundations/autofill_manager.cc
+++ b/components/autofill/core/browser/foundations/autofill_manager.cc
@@ -398,7 +398,7 @@
   ParseFormAsync(
       form,
       ParsingCallback(&AutofillManager::OnAskForValuesToFillImpl, field_id,
-                      caret_bounds, trigger_source)
+                      caret_bounds, trigger_source, password_request)
           .Then(NotifyObserversCallback(&Observer::OnAfterAskForValuesToFill,
                                         form.global_id(), field_id)));
 }
diff --git a/components/autofill/core/browser/foundations/autofill_manager.h b/components/autofill/core/browser/foundations/autofill_manager.h
index 4d1334cf..8ce43e3b 100644
--- a/components/autofill/core/browser/foundations/autofill_manager.h
+++ b/components/autofill/core/browser/foundations/autofill_manager.h
@@ -384,7 +384,8 @@
       const FormData& form,
       const FieldGlobalId& field_id,
       const gfx::Rect& caret_bounds,
-      AutofillSuggestionTriggerSource trigger_source) = 0;
+      AutofillSuggestionTriggerSource trigger_source,
+      base::optional_ref<const PasswordSuggestionRequest> password_request) = 0;
   virtual void OnDidFillAutofillFormDataImpl(
       const FormData& form,
       const base::TimeTicks timestamp) = 0;
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
index d98240f44..a583400 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -96,6 +96,7 @@
 #include "components/autofill/core/browser/geo/phone_number_i18n.h"
 #include "components/autofill/core/browser/integrators/compose/autofill_compose_delegate.h"
 #include "components/autofill/core/browser/integrators/optimization_guide/autofill_optimization_guide.h"
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/metrics/autofill_in_devtools_metrics.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
@@ -1097,7 +1098,19 @@
     const FormData& form,
     const FieldGlobalId& field_id,
     const gfx::Rect& caret_bounds,
-    AutofillSuggestionTriggerSource trigger_source) {
+    AutofillSuggestionTriggerSource trigger_source,
+    base::optional_ref<const PasswordSuggestionRequest> password_request) {
+  if (client().GetPasswordManagerDelegate() && password_request.has_value()) {
+#if !BUILDFLAG(IS_ANDROID)
+    client().GetPasswordManagerDelegate()->ShowSuggestions(
+        password_request->field);
+#else
+    client().GetPasswordManagerDelegate()->ShowKeyboardReplacingSurface(
+        password_request.value());
+#endif  // !BUILDFLAG(IS_ANDROID)
+    return;
+  }
+
   if (base::FeatureList::IsEnabled(features::kAutofillDisableFilling)) {
     return;
   }
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.h b/components/autofill/core/browser/foundations/browser_autofill_manager.h
index 380025bb..ccefbad 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager.h
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager.h
@@ -37,6 +37,7 @@
 #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/fast_checkout/fast_checkout_delegate.h"
 #include "components/autofill/core/browser/integrators/password_form_classification.h"
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
 #include "components/autofill/core/browser/integrators/plus_addresses/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/integrators/touch_to_fill/touch_to_fill_delegate.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
@@ -315,7 +316,9 @@
       const FormData& form,
       const FieldGlobalId& field_id,
       const gfx::Rect& caret_bounds,
-      AutofillSuggestionTriggerSource trigger_source) override;
+      AutofillSuggestionTriggerSource trigger_source,
+      base::optional_ref<const PasswordSuggestionRequest> password_request)
+      override;
   void OnSelectControlSelectionChangedImpl(
       const FormData& form,
       const FieldGlobalId& field_id) override;
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
index a83f69c9f..21d5793 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
@@ -78,6 +78,8 @@
 #include "components/autofill/core/browser/integrators/identity_credential/mock_identity_credential_delegate.h"
 #include "components/autofill/core/browser/integrators/optimization_guide/mock_autofill_optimization_guide.h"
 #include "components/autofill/core/browser/integrators/password_form_classification.h"
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
+#include "components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.h"
 #include "components/autofill/core/browser/integrators/plus_addresses/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/integrators/plus_addresses/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/metrics/form_events/form_events.h"
@@ -1183,10 +1185,12 @@
       const FormData& form,
       const FormFieldData& field,
       AutofillSuggestionTriggerSource trigger_source =
-          AutofillSuggestionTriggerSource::kTextFieldValueChanged) {
+          AutofillSuggestionTriggerSource::kTextFieldValueChanged,
+      base::optional_ref<const PasswordSuggestionRequest> password_request =
+          std::nullopt) {
     manager().OnAskForValuesToFill(form, field.global_id(),
                                    GetFakeCaretBounds(field), trigger_source,
-                                   std::nullopt);
+                                   password_request);
   }
 
   void DidShowSuggestions(const FormData& form,
@@ -2093,7 +2097,8 @@
       {Suggestion("1234", "Deutsche Bahn", Suggestion::Icon::kNoIcon,
                   SuggestionType::kLoyaltyCardEntry),
        CreateSeparator(),
-       Suggestion("Manage loyalty cards...", "", Suggestion::Icon::kSettings,
+       Suggestion(l10n_util::GetStringUTF8(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
+                  "", Suggestion::Icon::kSettings,
                   SuggestionType::kManageLoyaltyCard)});
 }
 
@@ -8856,5 +8861,54 @@
       external_delegate()->suggestions().front(), {});
 }
 
+// Fixture setting the BAM's `AutofillPasswordManagerDelegate` to a mock instead
+// of the default `nullptr`. Enables any features if necessary.
+class BrowserAutofillManagerUsingPasswordDelegateTest
+    : public BrowserAutofillManagerTest {
+ protected:
+  void SetUp() override {
+    BrowserAutofillManagerTest::SetUp();
+    client().set_password_manager_delegate(CreatePasswordDelegate());
+  }
+
+  void TearDown() override {
+    delegate_ = nullptr;
+    BrowserAutofillManagerTest::TearDown();
+  }
+
+  MockAutofillPasswordManagerDelegate& password_delegate() {
+    return *delegate_;
+  }
+
+ private:
+  std::unique_ptr<AutofillPasswordManagerDelegate> CreatePasswordDelegate() {
+    auto password_delegate =
+        std::make_unique<MockAutofillPasswordManagerDelegate>();
+    delegate_ = password_delegate.get();
+    return password_delegate;
+  }
+
+  raw_ptr<MockAutofillPasswordManagerDelegate> delegate_ = nullptr;
+};
+
+// Test that the BAM queries the password delegate as soon as it's present.
+TEST_F(BrowserAutofillManagerUsingPasswordDelegateTest,
+       QueriesDelegateWhenGeneratingSuggestions) {
+  FormData form = CreateTestAddressFormData();
+  FormsSeen({form});
+
+#if !BUILDFLAG(IS_ANDROID)
+  EXPECT_CALL(password_delegate(), ShowSuggestions);
+#else   // BUILDFLAG(IS_ANDROID)
+  EXPECT_CALL(password_delegate(), ShowKeyboardReplacingSurface);
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+  OnAskForValuesToFill(form, form.fields()[0],
+                       AutofillSuggestionTriggerSource::kTextFieldValueChanged,
+                       PasswordSuggestionRequest({}, form,
+                                                 /*username_field_index=*/0,
+                                                 /*password_field_index=*/0));
+}
+
 }  // namespace
 }  // namespace autofill
diff --git a/components/autofill/core/browser/foundations/mock_autofill_manager.h b/components/autofill/core/browser/foundations/mock_autofill_manager.h
index 224ace0..1e73167 100644
--- a/components/autofill/core/browser/foundations/mock_autofill_manager.h
+++ b/components/autofill/core/browser/foundations/mock_autofill_manager.h
@@ -71,13 +71,15 @@
               OnTextFieldDidScrollImpl,
               (const FormData& form, const FieldGlobalId& field_id),
               (override));
-  MOCK_METHOD(void,
-              OnAskForValuesToFillImpl,
-              (const FormData& form,
-               const FieldGlobalId& field_id,
-               const gfx::Rect& caret_bounds,
-               AutofillSuggestionTriggerSource trigger_source),
-              (override));
+  MOCK_METHOD(
+      void,
+      OnAskForValuesToFillImpl,
+      (const FormData& form,
+       const FieldGlobalId& field_id,
+       const gfx::Rect& caret_bounds,
+       AutofillSuggestionTriggerSource trigger_source,
+       base::optional_ref<const PasswordSuggestionRequest> password_request),
+      (override));
   MOCK_METHOD(void,
               OnFocusOnFormFieldImpl,
               (const FormData& form, const FieldGlobalId& field_id),
diff --git a/components/autofill/core/browser/foundations/test_autofill_client.h b/components/autofill/core/browser/foundations/test_autofill_client.h
index e7a14518..950e3e5 100644
--- a/components/autofill/core/browser/foundations/test_autofill_client.h
+++ b/components/autofill/core/browser/foundations/test_autofill_client.h
@@ -36,6 +36,7 @@
 #include "components/autofill/core/browser/integrators/fast_checkout/mock_fast_checkout_client.h"
 #include "components/autofill/core/browser/integrators/identity_credential/identity_credential_delegate.h"
 #include "components/autofill/core/browser/integrators/optimization_guide/mock_autofill_optimization_guide.h"
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
 #include "components/autofill/core/browser/integrators/plus_addresses/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/logging/log_router.h"
@@ -193,6 +194,10 @@
     return identity_credential_delegate_.get();
   }
 
+  AutofillPasswordManagerDelegate* GetPasswordManagerDelegate() override {
+    return password_manager_delegate_.get();
+  }
+
   test::AutofillTestingPrefService* GetPrefs() override {
     if (!prefs_) {
       prefs_ = autofill::test::PrefServiceForTesting();
@@ -592,6 +597,12 @@
     identity_credential_delegate_ = std::move(identity_credential_delegate);
   }
 
+  void set_password_manager_delegate(
+      std::unique_ptr<AutofillPasswordManagerDelegate>
+          password_manager_delegate) {
+    password_manager_delegate_ = std::move(password_manager_delegate);
+  }
+
   void set_suggestion_ui_session_id(
       std::optional<AutofillClient::SuggestionUiSessionId> session_id) {
     suggestion_ui_session_id_ = session_id;
@@ -612,6 +623,7 @@
   raw_ptr<syncer::SyncService> test_sync_service_ = nullptr;
   std::unique_ptr<AutofillPlusAddressDelegate> plus_address_delegate_;
   std::unique_ptr<IdentityCredentialDelegate> identity_credential_delegate_;
+  std::unique_ptr<AutofillPasswordManagerDelegate> password_manager_delegate_;
   TestAddressNormalizer test_address_normalizer_;
   std::unique_ptr<::testing::NiceMock<MockAutofillOptimizationGuide>>
       mock_autofill_optimization_guide_ =
diff --git a/components/autofill/core/browser/integrators/README.md b/components/autofill/core/browser/integrators/README.md
new file mode 100644
index 0000000..f9d10f63
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README.md
@@ -0,0 +1,31 @@
+# Component Autofill Integrators
+
+Interfaces in this folder are used for dependency injection from directories
+that depend on `//components/autofill`.
+
+## Class relationship of integrators to the BrowserAutofillManager
+
+The following diagram describes how the `BrowserAutofillManager` uses different
+delegates to compose suggestions from various sources into the autofill
+dropdown.
+
+![image](README_class.png)
+
+Eventually, the `PasswordAutofillManager` shouldn't need to implement the
+`AutofillSuggestionDelegate` because the BrowserAutofillManager will request and
+dispatch suggestions through the delegate.
+
+## BrowserAutofillManager composes suggestions from delegates
+
+As shown in the diagram below, the `BrowserAutofillManager` will request for
+each delegate whether suggestions are available. Each delegate assembles
+information from the available feature sources and forwards a collection of
+suggestion to the `BrowserAutofillManager`. The latter orders suggestions and
+sends them out for display.
+![image](README_seq_generate.png)
+
+For some specific surfaces (and in the transitioning period), the
+`BrowserAutofillManager` delegates the suggestion handling to the specific
+delegate entirely. E.g. on Android, the password delegate handles the showing
+of a keyboard-replacing surface when the `BrowserAutofillManager` invokes it:
+![image](README_obj_suggestions.png)
diff --git a/components/autofill/core/browser/integrators/README_class.plantuml b/components/autofill/core/browser/integrators/README_class.plantuml
new file mode 100644
index 0000000..db0a647
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README_class.plantuml
@@ -0,0 +1,48 @@
+' Copyright 2025 The Chromium Authors
+' Use of this source code is governed by a BSD-style license that can be
+' found in the LICENSE file.
+
+/'
+ ' This class diagram is used in the README of this directory.
+ ' Generated diagrams are by default located in
+ ' `out/components/autofill/core/browser/integrators/README_class/*`.
+ '
+ ' The diagram describes how the `BrowserAutofillManager` uses different
+ ' delegates to composite suggestions from various sources into the autofill
+ ' dropdown.
+ '/
+@startuml
+interface "TouchToFillDelegate" as ttfd
+interface "FastCheckoutDelegate" as fcod
+interface "AutofillPasswordManagerDelegate" as pmd
+interface "AutofillSuggestionDelegate" as asd
+class "AutofillExternalDelegate" as aed
+class "AutofillPasswordManagerDelegateImpl" as pmdi
+class "PasswordAutofillManager" as pam
+class "BrowserAutofillManager" as bam {
+  + set_fast_checkout_delegate
+  + set_touch_to_fill_delegate
+  # fast_checkout_delegate
+  # client().GetPasswordManagerDelegate()
+  # touch_to_fill_delegate
+}
+
+'The BrowserAutofillManager has numerous delegates to different components.
+pmd "1" -* "1" bam
+bam "1" *- "1" ttfd
+bam "1" *-- "1" fcod
+aed "1" ---o "1" bam
+
+'Pwd Autofill manager and external delegate implement the same interface.
+'Eventually, the pam should not implement the aed anymore but purely communicate
+'with the bam.
+pam . aed
+asd <|.. (pam, aed)
+
+'Each delegate is implemented by a respective impl class in its component.
+pam "many" --o "1" pmdi
+pmdi ..|> pmd
+ttfd <|.. TouchToFillDelegateImpl
+fcod <|.. FastCheckoutDelegateImpl
+
+@enduml
diff --git a/components/autofill/core/browser/integrators/README_class.png b/components/autofill/core/browser/integrators/README_class.png
new file mode 100644
index 0000000..7bdd15f
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README_class.png
Binary files differ
diff --git a/components/autofill/core/browser/integrators/README_obj_suggestions.plantuml b/components/autofill/core/browser/integrators/README_obj_suggestions.plantuml
new file mode 100644
index 0000000..ab8f1f5
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README_obj_suggestions.plantuml
@@ -0,0 +1,79 @@
+@startuml
+!pragma useVerticalIf on
+<style>
+activityDiagram {
+  FontSize 14
+  FontName arial
+}
+</style>
+start
+skinparam ConditionEndStyle hline
+
+:Some text field interaction; <<input>>
+  -> via RenderFrameObserver;
+  #CFC:AutofillAgent;
+if (uses PasswordAutofillAgent?) then
+  -> ShowSuggestions;
+  #CFC:PasswordAutofillAgent;
+  -> ShowPasswordSuggestions;
+  #CFC:ContentPasswordManagerDriver;
+  if (is Android?) then (no)
+  else (yes)
+    -> ShowKeyboardReplacingSurface;
+    #CCF:PasswordManagerClient;
+    if (is Chrome?) then (yes)
+      if (replaces Keyboard?) then (no)
+      else (yes)
+        if (has Passkeys?) then (yes)
+          #CCF:CredManController;
+          :Defer to CredMan; <<output>>
+          stop
+        else (no)
+          -> Show;
+          #CCF:TouchToFillController;
+          :Show BottomSheet; <<output>>
+          stop
+        endif
+      endif
+    endif
+  endif
+  -> OnShowPasswordSuggestions;
+  #CFC:PasswordAutofillManager;
+  split
+  'if (uses Fallback Flow?) then (yes)
+    -> needs fallback;
+    #CFC:PwManualFallbackFlow;
+  split again
+  'elseif (has Passkeys) then (yes)
+    -> has Passkeys;
+    #CFC:WebAuthnCredentialDelegate;
+  'endif
+  split again
+    -> always;
+  end split
+else
+  -> AskForValuesToFill;
+  #CFC:ContentAutofillDriver;
+  -> OnAskForValuesToFillImpl;
+  #CFC:BrowserAutofillManager;
+  -> OnSuggestionsReturned;
+  #CFC:AutofillExternalDelegate;
+endif
+
+-> ShowAutofillSuggestions;
+#CCF: ContentAutofillClient;
+
+if (is Android?) then (yes)
+  #CCF:AndroidAutofillClient;
+  if (uses 3P?) then (yes)
+    :Defer to AutofillService; <<output>>
+  else (no)
+    :Show Keyboard Accessory; <<output>>
+  endif
+else (no)
+  #CCF:ChromeAutofillClient;
+  :Show Popup UI; <<output>>
+endif
+
+stop
+@enduml
diff --git a/components/autofill/core/browser/integrators/README_obj_suggestions.png b/components/autofill/core/browser/integrators/README_obj_suggestions.png
new file mode 100644
index 0000000..69aabef
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README_obj_suggestions.png
Binary files differ
diff --git a/components/autofill/core/browser/integrators/README_seq_generate.plantuml b/components/autofill/core/browser/integrators/README_seq_generate.plantuml
new file mode 100644
index 0000000..7214cfd
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README_seq_generate.plantuml
@@ -0,0 +1,36 @@
+' Copyright 2025 The Chromium Authors
+' Use of this source code is governed by a BSD-style license that can be
+' found in the LICENSE file.
+
+/'
+ ' This sequence diagram is used in the README of this directory.
+ ' Generated diagrams are by default located in
+ ' `out/components/autofill/core/browser/integrators/README_seq_generate/*`.
+ '
+ ' It describes how the `BrowserAutofillManager` requests for each delegate
+ ' whether suggestions are available. Each delegate assembles information from
+ ' the available feature sources and forwards a collection of suggestion to the
+ ' `BrowserAutofillManager`. The latter orders suggestions and sends them out
+ ' for display.
+ '/
+@startuml
+Title: Generating suggestions with AutofillPasswordManagerDelegate
+
+participant BrowserAutofillManager as bam
+participant AutofillClient as afc
+participant AutofillPasswordManagerDelegate as apmd
+participant PasswordAutofillManager_Frame_1 as pam1
+participant PasswordAutofillManager_Frame_2 as pam2
+
+bam -> afc:  getPasswordManagerDelegate()
+afc --> bam:  AutofillPasswordManagerDelegate
+bam -> apmd:  GetSuggestions(TriggeringField)
+apmd -> apmd: for (apm : all_apm) GetSuggestionsForField(TriggeringField)
+apmd -> pam1: GetSuggestionsForField(TriggeringField)
+note right of pam1: No frame-specific suggestions!
+pam1 --> apmd: {fallbacks?}
+apmd -> pam2: GetSuggestionsForField(TriggeringField)
+note right of pam2: Found frame-\nspecific suggestions!
+pam2 --> apmd: {credentials, fallbacks}
+apmd --> bam: {credentials, fallbacks}
+@enduml
diff --git a/components/autofill/core/browser/integrators/README_seq_generate.png b/components/autofill/core/browser/integrators/README_seq_generate.png
new file mode 100644
index 0000000..896c187
--- /dev/null
+++ b/components/autofill/core/browser/integrators/README_seq_generate.png
Binary files differ
diff --git a/components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h b/components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h
new file mode 100644
index 0000000..d42673eb
--- /dev/null
+++ b/components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h
@@ -0,0 +1,31 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_PASSWORD_MANAGER_AUTOFILL_PASSWORD_MANAGER_DELEGATE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_PASSWORD_MANAGER_AUTOFILL_PASSWORD_MANAGER_DELEGATE_H_
+
+#include "components/autofill/core/common/password_form_fill_data.h"
+
+namespace autofill {
+
+// This delegate is queried for PWM suggestions for a given field. It injects
+// Password Manager logic into `AutofillManager::OnAskForForValuesToFill`.
+// If password suggestions are required, the work is performed by the underlying
+// `PasswordAutofillManager`.
+class AutofillPasswordManagerDelegate {
+ public:
+  virtual ~AutofillPasswordManagerDelegate() = default;
+
+  virtual void ShowSuggestions(
+      const autofill::TriggeringField& triggering_field) = 0;
+
+#if BUILDFLAG(IS_ANDROID)
+  virtual void ShowKeyboardReplacingSurface(
+      const autofill::PasswordSuggestionRequest& request) = 0;
+#endif  // BUILDFLAG(IS_ANDROID)
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_PASSWORD_MANAGER_AUTOFILL_PASSWORD_MANAGER_DELEGATE_H_
diff --git a/components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.cc b/components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.cc
new file mode 100644
index 0000000..8e69fd347
--- /dev/null
+++ b/components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.cc
@@ -0,0 +1,15 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.h"
+
+namespace autofill {
+
+MockAutofillPasswordManagerDelegate::MockAutofillPasswordManagerDelegate() =
+    default;
+
+MockAutofillPasswordManagerDelegate::~MockAutofillPasswordManagerDelegate() =
+    default;
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.h b/components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.h
new file mode 100644
index 0000000..18cf125
--- /dev/null
+++ b/components/autofill/core/browser/integrators/password_manager/mock_autofill_password_manager_delegate.h
@@ -0,0 +1,39 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_PASSWORD_MANAGER_MOCK_AUTOFILL_PASSWORD_MANAGER_DELEGATE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_PASSWORD_MANAGER_MOCK_AUTOFILL_PASSWORD_MANAGER_DELEGATE_H_
+
+#include "components/autofill/core/browser/integrators/password_manager/autofill_password_manager_delegate.h"
+#include "components/autofill/core/common/password_form_fill_data.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace autofill {
+
+class MockAutofillPasswordManagerDelegate
+    : public AutofillPasswordManagerDelegate {
+ public:
+  MockAutofillPasswordManagerDelegate();
+  MockAutofillPasswordManagerDelegate(
+      const MockAutofillPasswordManagerDelegate&) = delete;
+  MockAutofillPasswordManagerDelegate& operator=(
+      const MockAutofillPasswordManagerDelegate&) = delete;
+  ~MockAutofillPasswordManagerDelegate() override;
+
+  MOCK_METHOD((void),
+              ShowSuggestions,
+              (const autofill::TriggeringField&),
+              (override));
+
+#if BUILDFLAG(IS_ANDROID)
+  MOCK_METHOD((void),
+              ShowKeyboardReplacingSurface,
+              (const autofill::PasswordSuggestionRequest&),
+              (override));
+#endif  // BUILDFLAG(IS_ANDROID)
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_PASSWORD_MANAGER_MOCK_AUTOFILL_PASSWORD_MANAGER_DELEGATE_H_
diff --git a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc
index f5f61e3..b075f26 100644
--- a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc
+++ b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc
@@ -12,8 +12,9 @@
 #include "components/autofill/core/browser/suggestions/suggestion.h"
 #include "components/autofill/core/browser/suggestions/suggestion_type.h"
 #include "components/feature_engagement/public/feature_constants.h"
+#include "components/strings/grit/components_strings.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "url/origin.h"
-
 namespace autofill {
 
 namespace {
@@ -35,10 +36,9 @@
 }
 
 Suggestion CreateManageLoyaltyCardsSuggestion() {
-  // TODO(crbug.com/404436027): Add i18n, replace with:
-  // l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS)
-  Suggestion suggestion(u"Manage loyalty cards...",
-                        SuggestionType::kManageLoyaltyCard);
+  Suggestion suggestion(
+      l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
+      SuggestionType::kManageLoyaltyCard);
   suggestion.icon = Suggestion::Icon::kSettings;
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   suggestion.trailing_icon = Suggestion::Icon::kGoogleWallet;
@@ -143,7 +143,8 @@
 
   // TODO(crbug.com/404436027): Replace with i18n string.
   Suggestion submenu_suggestion =
-      Suggestion(u"Loyalty cards", SuggestionType::kLoyaltyCardEntry);
+      Suggestion(l10n_util::GetStringUTF16(IDS_AUTOFILL_LOYALTY_CARD_GENERIC),
+                 SuggestionType::kLoyaltyCardEntry);
   submenu_suggestion.acceptability = Suggestion::Acceptability::kUnacceptable;
   submenu_suggestion.children = loyalty_card_suggestions;
 
diff --git a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc
index c8cb14c5..564c2dd 100644
--- a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc
+++ b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc
@@ -13,8 +13,10 @@
 #include "components/autofill/core/browser/suggestions/suggestion_test_helpers.h"
 #include "components/autofill/core/browser/suggestions/suggestion_type.h"
 #include "components/feature_engagement/public/feature_constants.h"
+#include "components/strings/grit/components_strings.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/image/image_unittest_util.h"
 
 namespace autofill {
@@ -81,54 +83,58 @@
   test_api(valuables_data_manager()).SetLoyaltyCards(loyalty_cards);
 
   // No matching domains.
-  EXPECT_THAT(GetLoyaltyCardSuggestions(
-                  valuables_data_manager(),
-                  GURL("https://not-existing-domain.example/test")),
-              testing::ElementsAre(
-                  EqualsSuggestion(
-                      SuggestionType::kLoyaltyCardEntry, u"987654321987654321",
-                      /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
-                      {{Suggestion::Text(u"CVS Pharmacy")}},
-                      Suggestion::Guid("loyalty_card_id_1")),
-                  EqualsSuggestion(
-                      SuggestionType::kLoyaltyCardEntry, u"37262999281",
-                      /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
-                      {{Suggestion::Text(u"Ticket Maester")}},
-                      Suggestion::Guid("loyalty_card_id_2")),
-                  EqualsSuggestion(
-                      SuggestionType::kLoyaltyCardEntry, u"998766823",
-                      /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
-                      {{Suggestion::Text(u"Walgreens")}},
-                      Suggestion::Guid("loyalty_card_id_3")),
-                  EqualsSuggestion(SuggestionType::kSeparator),
-                  EqualsSuggestion(SuggestionType::kManageLoyaltyCard,
-                                   u"Manage loyalty cards...",
-                                   Suggestion::Icon::kSettings)));
+  EXPECT_THAT(
+      GetLoyaltyCardSuggestions(
+          valuables_data_manager(),
+          GURL("https://not-existing-domain.example/test")),
+      testing::ElementsAre(
+          EqualsSuggestion(
+              SuggestionType::kLoyaltyCardEntry, u"987654321987654321",
+              /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
+              {{Suggestion::Text(u"CVS Pharmacy")}},
+              Suggestion::Guid("loyalty_card_id_1")),
+          EqualsSuggestion(SuggestionType::kLoyaltyCardEntry, u"37262999281",
+                           /*is_main_text_primary=*/true,
+                           Suggestion::Icon::kNoIcon,
+                           {{Suggestion::Text(u"Ticket Maester")}},
+                           Suggestion::Guid("loyalty_card_id_2")),
+          EqualsSuggestion(SuggestionType::kLoyaltyCardEntry, u"998766823",
+                           /*is_main_text_primary=*/true,
+                           Suggestion::Icon::kNoIcon,
+                           {{Suggestion::Text(u"Walgreens")}},
+                           Suggestion::Guid("loyalty_card_id_3")),
+          EqualsSuggestion(SuggestionType::kSeparator),
+          EqualsSuggestion(
+              SuggestionType::kManageLoyaltyCard,
+              l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
+              Suggestion::Icon::kSettings)));
 
   // A couple of matching domains.
-  EXPECT_THAT(GetLoyaltyCardSuggestions(valuables_data_manager(),
-                                        GURL("https://domain2.example/test")),
-              testing::ElementsAre(
-                  EqualsSuggestion(
-                      SuggestionType::kLoyaltyCardEntry, u"37262999281",
-                      /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
-                      {{Suggestion::Text(u"Ticket Maester")}},
-                      Suggestion::Guid("loyalty_card_id_2")),
-                  EqualsSuggestion(
-                      SuggestionType::kLoyaltyCardEntry, u"998766823",
-                      /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
-                      {{Suggestion::Text(u"Walgreens")}},
-                      Suggestion::Guid("loyalty_card_id_3")),
-                  EqualsSuggestion(SuggestionType::kSeparator),
-                  EqualsSuggestion(
-                      SuggestionType::kLoyaltyCardEntry, u"987654321987654321",
-                      /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
-                      {{Suggestion::Text(u"CVS Pharmacy")}},
-                      Suggestion::Guid("loyalty_card_id_1")),
-                  EqualsSuggestion(SuggestionType::kSeparator),
-                  EqualsSuggestion(SuggestionType::kManageLoyaltyCard,
-                                   u"Manage loyalty cards...",
-                                   Suggestion::Icon::kSettings)));
+  EXPECT_THAT(
+      GetLoyaltyCardSuggestions(valuables_data_manager(),
+                                GURL("https://domain2.example/test")),
+      testing::ElementsAre(
+          EqualsSuggestion(SuggestionType::kLoyaltyCardEntry, u"37262999281",
+                           /*is_main_text_primary=*/true,
+                           Suggestion::Icon::kNoIcon,
+                           {{Suggestion::Text(u"Ticket Maester")}},
+                           Suggestion::Guid("loyalty_card_id_2")),
+          EqualsSuggestion(SuggestionType::kLoyaltyCardEntry, u"998766823",
+                           /*is_main_text_primary=*/true,
+                           Suggestion::Icon::kNoIcon,
+                           {{Suggestion::Text(u"Walgreens")}},
+                           Suggestion::Guid("loyalty_card_id_3")),
+          EqualsSuggestion(SuggestionType::kSeparator),
+          EqualsSuggestion(
+              SuggestionType::kLoyaltyCardEntry, u"987654321987654321",
+              /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon,
+              {{Suggestion::Text(u"CVS Pharmacy")}},
+              Suggestion::Guid("loyalty_card_id_1")),
+          EqualsSuggestion(SuggestionType::kSeparator),
+          EqualsSuggestion(
+              SuggestionType::kManageLoyaltyCard,
+              l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
+              Suggestion::Icon::kSettings)));
   // All matching domains.
   EXPECT_THAT(
       GetLoyaltyCardSuggestions(valuables_data_manager(),
@@ -150,9 +156,10 @@
                            {{Suggestion::Text(u"Walgreens")}},
                            Suggestion::Guid("loyalty_card_id_3")),
           EqualsSuggestion(SuggestionType::kSeparator),
-          EqualsSuggestion(SuggestionType::kManageLoyaltyCard,
-                           u"Manage loyalty cards...",
-                           Suggestion::Icon::kSettings)));
+          EqualsSuggestion(
+              SuggestionType::kManageLoyaltyCard,
+              l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
+              Suggestion::Icon::kSettings)));
 }
 
 TEST_F(ValuableSuggestionGeneratorTest,
@@ -183,7 +190,8 @@
                       Suggestion::Guid("loyalty_card_id_1")),
                   EqualsSuggestion(SuggestionType::kSeparator),
                   EqualsSuggestion(SuggestionType::kManageLoyaltyCard,
-                                   u"Manage loyalty cards...",
+                                   l10n_util::GetStringUTF16(
+                                       IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
                                    Suggestion::Icon::kSettings)));
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   EXPECT_THAT(suggestions.back(),
@@ -211,7 +219,8 @@
       Suggestion(u"test-email1@domain1.example", SuggestionType::kAddressEntry),
       Suggestion(u"test-email2@domain2.example", SuggestionType::kAddressEntry),
       Suggestion(SuggestionType::kSeparator),
-      Suggestion(u"Manage addresses...", SuggestionType::kManageAddress)};
+      Suggestion(l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_ADDRESSES),
+                 SuggestionType::kManageAddress)};
 
   ExtendEmailSuggestionsWithLoyaltyCardSuggestions(
       email_suggestions, valuables_data_manager(),
@@ -225,10 +234,13 @@
           EqualsSuggestion(SuggestionType::kAddressEntry,
                            u"test-email2@domain2.example"),
           EqualsSuggestion(SuggestionType::kSeparator),
-          EqualsSuggestion(SuggestionType::kLoyaltyCardEntry, u"Loyalty cards"),
+          EqualsSuggestion(
+              SuggestionType::kLoyaltyCardEntry,
+              l10n_util::GetStringUTF16(IDS_AUTOFILL_LOYALTY_CARD_GENERIC)),
           EqualsSuggestion(SuggestionType::kSeparator),
-          EqualsSuggestion(SuggestionType::kManageAddress,
-                           u"Manage addresses...")));
+          EqualsSuggestion(
+              SuggestionType::kManageAddress,
+              l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_ADDRESSES))));
 
   const Suggestion& lc_submenu_suggestion = email_suggestions[3];
   EXPECT_EQ(lc_submenu_suggestion.acceptability,
@@ -242,7 +254,8 @@
                       Suggestion::Guid("loyalty_card_id_1")),
                   EqualsSuggestion(SuggestionType::kSeparator),
                   EqualsSuggestion(SuggestionType::kManageLoyaltyCard,
-                                   u"Manage loyalty cards...",
+                                   l10n_util::GetStringUTF16(
+                                       IDS_AUTOFILL_MANAGE_LOYALTY_CARDS),
                                    Suggestion::Icon::kSettings)));
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   EXPECT_THAT(lc_submenu_suggestion.children.back(),
@@ -258,21 +271,23 @@
       Suggestion(u"test-email1@domain1.example", SuggestionType::kAddressEntry),
       Suggestion(u"test-email2@domain2.example", SuggestionType::kAddressEntry),
       Suggestion(SuggestionType::kSeparator),
-      Suggestion(u"Manage addresses...", SuggestionType::kManageAddress)};
+      Suggestion(l10n_util::GetStringUTF16(IDS_AUTOFILL_MANAGE_ADDRESSES),
+                 SuggestionType::kManageAddress)};
 
   ExtendEmailSuggestionsWithLoyaltyCardSuggestions(
       email_suggestions, valuables_data_manager(),
       GURL("https://common-domain.example/test"));
 
-  EXPECT_THAT(
-      email_suggestions,
-      testing::ElementsAre(EqualsSuggestion(SuggestionType::kAddressEntry,
-                                            u"test-email1@domain1.example"),
-                           EqualsSuggestion(SuggestionType::kAddressEntry,
-                                            u"test-email2@domain2.example"),
-                           EqualsSuggestion(SuggestionType::kSeparator),
-                           EqualsSuggestion(SuggestionType::kManageAddress,
-                                            u"Manage addresses...")));
+  EXPECT_THAT(email_suggestions,
+              testing::ElementsAre(
+                  EqualsSuggestion(SuggestionType::kAddressEntry,
+                                   u"test-email1@domain1.example"),
+                  EqualsSuggestion(SuggestionType::kAddressEntry,
+                                   u"test-email2@domain2.example"),
+                  EqualsSuggestion(SuggestionType::kSeparator),
+                  EqualsSuggestion(SuggestionType::kManageAddress,
+                                   l10n_util::GetStringUTF16(
+                                       IDS_AUTOFILL_MANAGE_ADDRESSES))));
 }
 
 #if !BUILDFLAG(IS_ANDROID)
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index 6d2ea0c..a19ac92dd 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -261,6 +261,13 @@
              "AutofillEnableLoyaltyCardsFilling",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// When enabled, Autofill will display joined email and loyalty card Autofill
+// suggestions.
+// TODO(crbug.com/416664590): Remove once launched.
+BASE_FEATURE(kAutofillEnableEmailOrLoyaltyCardsFilling,
+             "AutofillEnableEmailOrLoyaltyCardsFilling",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // When enabled, extracts <input type=date>, which may be filled by Autofill AI.
 // This is a kill switch.
 // TODO(crbug.com/396325496): Clean up after M137 branch (April 28, 2025).
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index 369c111..d4d89cc 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -98,6 +98,8 @@
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableLoyaltyCardsFilling);
 COMPONENT_EXPORT(AUTOFILL)
+BASE_DECLARE_FEATURE(kAutofillEnableEmailOrLoyaltyCardsFilling);
+COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableSupportForHomeAndWork);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillEnableSupportForParsingWithSharedLabels);
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp
index f062593..a19437e 100644
--- a/components/autofill_strings.grdp
+++ b/components/autofill_strings.grdp
@@ -212,6 +212,11 @@
     <message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill.">
       Manage passwords...
     </message>
+
+    <!-- TODO(crbug.com/404436027): Enable translatation after UX review is completed. -->
+    <message name="IDS_AUTOFILL_MANAGE_LOYALTY_CARDS" translateable="false" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage loyalty cards that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Wallet page." meaning="Manage loyalty cards in the user wallet that can be used by Chrome Autofill.">
+      Manage loyalty cards...
+    </message>
   </if>
   <if expr="use_titlecase">
     <message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Chrome Autofill.">
@@ -225,6 +230,11 @@
     <message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill.">
       Manage Passwords...
     </message>
+
+    <!-- TODO(crbug.com/404436027): Enable translatation after UX review is completed. -->
+    <message name="IDS_AUTOFILL_MANAGE_LOYALTY_CARDS" translateable="false" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage loyalty cards that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Wallet page." meaning="Manage loyalty cards in the user wallet that can be used by Chrome Autofill.">
+      Manage Loyalty Cards...
+    </message>
   </if>
 
   <message name="IDS_AUTOFILL_SCAN_CREDIT_CARD" desc="An item in the autofill popup that triggers a new credit card to be scanned using the camera on the device." formatter_data="android_java">
@@ -619,4 +629,11 @@
   <message name="IDS_AUTOFILL_ADDRESS_EDIT_DIALOG_JAPANESE_ALTERNATIVE_NAME" desc="The label for the phonetic name field in japanese autofill profile. In Japanese it should be translated to 'ふりがな'.">
     Phonetic name
   </message>
+
+  <!-- Used on Android: -->
+  <if expr="is_android">
+  <message name="IDS_AUTOFILL_ADDRESS_EDIT_DIALOG_REQUIRED_FIELD_CONTENT_DESCRIPTION" desc="Content description for text edit field that is marked as 'required'. It is built from the label and a string that explicitly states that the field is required." formatter_data="android_java">
+    <ph name="FIELD_LABEL">%1$s<ex>City</ex></ph>, required
+  </message>
+  </if>
 </grit-part>
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_ADDRESS_EDIT_DIALOG_REQUIRED_FIELD_CONTENT_DESCRIPTION.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_ADDRESS_EDIT_DIALOG_REQUIRED_FIELD_CONTENT_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..f1f96c0
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_ADDRESS_EDIT_DIALOG_REQUIRED_FIELD_CONTENT_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+d3716153d3111c6c7063d8ed6f93b60fdbd97cbd
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_LOYALTY_CARDS.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_LOYALTY_CARDS.png.sha1
new file mode 100644
index 0000000..84a6d752
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_MANAGE_LOYALTY_CARDS.png.sha1
@@ -0,0 +1 @@
+2867dfe7da7180ff9de42c2648312acf9ad11fce
\ No newline at end of file
diff --git a/components/cronet/gn2bp/gen_android_bp.py b/components/cronet/gn2bp/gen_android_bp.py
index 5265f93..501d92cc 100755
--- a/components/cronet/gn2bp/gen_android_bp.py
+++ b/components/cronet/gn2bp/gen_android_bp.py
@@ -2833,7 +2833,7 @@
             module_target.shared_libs.update(dep_module.shared_libs)
           else:
             raise Exception(
-                f"Trying to add an unknown type {dep_module.type} to a type of {module.type}"
+                f"Cannot add {dep_module.name} ({dep_module.type}) to {module.name} ({module.type})"
             )
         elif dep_module.type == "rust_bindgen":
           module.srcs.add(":" + dep_module.name)
diff --git a/components/input/render_input_router.mojom b/components/input/render_input_router.mojom
index 4ed9c16..68d34e5 100644
--- a/components/input/render_input_router.mojom
+++ b/components/input/render_input_router.mojom
@@ -62,11 +62,6 @@
   // Viz needs this to do input handling on it's side.
   StateOnTouchTransfer(TouchTransferState state);
 
-  // Notifies RenderInputRouter on the VizCompositor thread (corresponding to
-  // |frame_sink_id|), of changes to a page being mobile site optimized.
-  NotifySiteIsMobileOptimized(bool is_mobile_optimized,
-                              viz.mojom.FrameSinkId frame_sink_id);
-
   // Notifies RenderInputRouters corresponding to |frame_sink_ids| on the
   // VizCompositor thread of changes to |force_enable_zoom| state for
   // Accessibility.
diff --git a/components/memory_pressure/system_memory_pressure_evaluator_win.cc b/components/memory_pressure/system_memory_pressure_evaluator_win.cc
index 9849bd7..d488be9 100644
--- a/components/memory_pressure/system_memory_pressure_evaluator_win.cc
+++ b/components/memory_pressure/system_memory_pressure_evaluator_win.cc
@@ -55,6 +55,16 @@
                    "CommitAvailableModerateThresholdMB",
                    kDefaultCommitAvailableModerateThresholdMb);
 
+// Controls the frequency at which memory pressure is evaluated on Windows.
+BASE_FEATURE(kWindowsMemoryPressurePeriod,
+             "WinMemoryPressurePeriod",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE_PARAM(base::TimeDelta,
+                   kWinMemoryPressurePeriodParam,
+                   &kWindowsMemoryPressurePeriod,
+                   "period",
+                   SystemMemoryPressureEvaluator::kDefaultPeriod);
+
 static const DWORDLONG kMBBytes = 1024 * 1024;
 
 // Constant for early exit commit threshold. Represents 2GB in MB. Used for the
@@ -115,10 +125,6 @@
 
 }  // namespace
 
-// Check the amount of RAM left every 5 seconds.
-const base::TimeDelta SystemMemoryPressureEvaluator::kMemorySamplingPeriod =
-    base::Seconds(5);
-
 // The following constants have been lifted from similar values in the ChromeOS
 // memory pressure monitor. The values were determined experimentally to ensure
 // sufficient responsiveness of the memory pressure subsystem, and minimal
@@ -164,7 +170,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   timer_.Start(
-      FROM_HERE, kMemorySamplingPeriod,
+      FROM_HERE, kWinMemoryPressurePeriodParam.Get(),
       BindRepeating(&SystemMemoryPressureEvaluator::CheckMemoryPressure,
                     weak_ptr_factory_.GetWeakPtr()));
 }
@@ -200,7 +206,7 @@
         // Already in moderate pressure, only notify if sustained over the
         // cooldown period.
         const int kModeratePressureCooldownCycles =
-            kModeratePressureCooldown / kMemorySamplingPeriod;
+            kModeratePressureCooldown / kWinMemoryPressurePeriodParam.Get();
         if (++moderate_pressure_repeat_count_ ==
             kModeratePressureCooldownCycles) {
           moderate_pressure_repeat_count_ = 0;
diff --git a/components/memory_pressure/system_memory_pressure_evaluator_win.h b/components/memory_pressure/system_memory_pressure_evaluator_win.h
index 1ce36e4..d82e77f 100644
--- a/components/memory_pressure/system_memory_pressure_evaluator_win.h
+++ b/components/memory_pressure/system_memory_pressure_evaluator_win.h
@@ -29,7 +29,7 @@
   using MemoryPressureLevel = base::MemoryPressureListener::MemoryPressureLevel;
 
   // The memory sampling period, currently 5s.
-  static const base::TimeDelta kMemorySamplingPeriod;
+  static constexpr base::TimeDelta kDefaultPeriod = base::Seconds(5);
 
   // Constants governing the polling and hysteresis behaviour of the observer.
   // The time which should pass between 2 successive moderate memory pressure
diff --git a/components/memory_pressure/system_memory_pressure_evaluator_win_unittest.cc b/components/memory_pressure/system_memory_pressure_evaluator_win_unittest.cc
index 9554e473..423d603 100644
--- a/components/memory_pressure/system_memory_pressure_evaluator_win_unittest.cc
+++ b/components/memory_pressure/system_memory_pressure_evaluator_win_unittest.cc
@@ -219,7 +219,7 @@
 
   // Check that the event gets reposted after a while.
   const int kModeratePressureCooldownCycles =
-      evaluator.kModeratePressureCooldown / evaluator.kMemorySamplingPeriod;
+      evaluator.kModeratePressureCooldown / evaluator.kDefaultPeriod;
 
   for (int i = 0; i < kModeratePressureCooldownCycles; ++i) {
     if (i + 1 == kModeratePressureCooldownCycles) {
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.cc b/components/page_load_metrics/browser/page_load_metrics_observer.cc
index 748f9893..03c5d0e 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_observer.cc
@@ -53,9 +53,11 @@
 FailedProvisionalLoadInfo::FailedProvisionalLoadInfo(
     base::TimeDelta interval,
     net::Error error,
+    int net_extended_error_code,
     content::NavigationDiscardReason discard_reason)
     : time_to_failed_provisional_load(interval),
       error(error),
+      net_extended_error_code(net_extended_error_code),
       discard_reason(discard_reason) {}
 
 FailedProvisionalLoadInfo::~FailedProvisionalLoadInfo() = default;
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_interface.h b/components/page_load_metrics/browser/page_load_metrics_observer_interface.h
index a47aa52..f07a16ad9 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer_interface.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer_interface.h
@@ -108,11 +108,13 @@
 struct FailedProvisionalLoadInfo {
   FailedProvisionalLoadInfo(base::TimeDelta interval,
                             net::Error error,
+                            int net_extended_error_code,
                             content::NavigationDiscardReason discard_reason);
   ~FailedProvisionalLoadInfo();
 
   base::TimeDelta time_to_failed_provisional_load;
   net::Error error;
+  int net_extended_error_code;
   content::NavigationDiscardReason discard_reason;
 };
 
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc
index bdad0ad..cd600d9 100644
--- a/components/page_load_metrics/browser/page_load_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -686,6 +686,7 @@
   failed_provisional_load_info_ = std::make_unique<FailedProvisionalLoadInfo>(
       failed_load_time - navigation_handle->NavigationStart(),
       navigation_handle->GetNetErrorCode(),
+      navigation_handle->GetNetExtendedErrorCode(),
       navigation_handle->GetNavigationDiscardReason().value());
 }
 
diff --git a/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.cc b/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.cc
index ef42aa3..5c8ce52 100644
--- a/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.cc
@@ -57,6 +57,11 @@
   auto navigation_handle_timing =
       navigation_handle->GetNavigationHandleTiming();
 
+  if (navigation_handle->GetNetErrorCode() < 0) {
+    CHECK(!net_error_.has_value());
+    net_error_ = navigation_handle->GetNetErrorCode();
+  }
+
   // Set the request / response time of the second redirect by checking:
   // 1) We have not yet recorded second redirect
   // 2) The first request / response has already passed
@@ -113,6 +118,11 @@
     const page_load_metrics::FailedProvisionalLoadInfo&
         failed_provisional_load_info) {
   CHECK(!is_committed_);
+  // Record network error code in case we abort the navigation without going
+  // through `OnNavigationHandleTimingUpdated`.
+  if (!net_error_.has_value()) {
+    net_error_ = failed_provisional_load_info.error;
+  }
   AbandonedPageLoadMetricsObserver::OnFailedProvisionalLoad(
       failed_provisional_load_info);
 }
@@ -202,6 +212,11 @@
     }
   }
 
+  if (net_error_.has_value()) {
+    builder.SetNet_ErrorCode(
+        std::abs(static_cast<int64_t>(net_error_.value())));
+  }
+
   LogUKMHistogramsForAbandonMetrics(builder, abandon_reason, milestone,
                                     event_time, relative_start_time);
   builder.Record(ukm::UkmRecorder::Get());
diff --git a/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h b/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h
index 283640a1..7ea3d72 100644
--- a/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h
+++ b/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h
@@ -70,6 +70,7 @@
   uint64_t redirect_num_ = 0;
   std::optional<blink::Impression> impression_;
   bool is_committed_ = false;
+  std::optional<net::Error> net_error_;
 
   base::TimeTicks second_redirect_request_start_time_;
   base::TimeTicks second_redirect_response_start_time_;
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index 82efff37..417ced84 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -484,6 +484,7 @@
     "password_form_manager_unittest.cc",
     "password_form_metrics_recorder_unittest.cc",
     "password_form_prediction_waiter_unittest.cc",
+    "password_form_unittest.cc",
     "password_generation_frame_helper_unittest.cc",
     "password_generation_manager_unittest.cc",
     "password_hash_data_unittest.cc",
diff --git a/components/password_manager/core/browser/password_form.cc b/components/password_manager/core/browser/password_form.cc
index bb30a6f..00501a8 100644
--- a/components/password_manager/core/browser/password_form.cc
+++ b/components/password_manager/core/browser/password_form.cc
@@ -249,15 +249,17 @@
                                     &PasswordNote::unique_display_name);
   // if the old note doesn't exist, the note is just created.
   if (note_itr == notes.end()) {
-    notes.emplace_back(new_note_value, base::Time::Now());
+    notes.emplace_back(unique_display_name, new_note_value, base::Time::Now(),
+                       /*hide_by_default=*/false);
     return;
   }
-  // Note existed, but it was empty.
+
+  // Note existed, but it was empty, so set date_created in addition to
+  // changing the value.
   if (note_itr->value.empty()) {
-    note_itr->value = new_note_value;
     note_itr->date_created = base::Time::Now();
-    return;
   }
+
   note_itr->value = new_note_value;
 }
 
diff --git a/components/password_manager/core/browser/password_form_unittest.cc b/components/password_manager/core/browser/password_form_unittest.cc
new file mode 100644
index 0000000..ea29278
--- /dev/null
+++ b/components/password_manager/core/browser/password_form_unittest.cc
@@ -0,0 +1,48 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/password_manager/core/browser/password_form.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace password_manager {
+namespace {
+
+// Unittests for small pieces of logic in `PasswordForm`.
+TEST(PasswordFormTest, PasswordBackupNote) {
+  PasswordForm form;
+  form.SetPasswordBackupNote(u"backuppassword");
+  EXPECT_EQ(form.notes[0].unique_display_name,
+            PasswordNote::kPasswordChangeBackupNoteName);
+  EXPECT_EQ(form.GetPasswordBackupNote(), u"backuppassword");
+}
+
+TEST(PasswordFormTest, RegularNote) {
+  PasswordForm form;
+  form.SetNoteWithEmptyUniqueDisplayName(u"test note");
+  EXPECT_EQ(form.notes[0].unique_display_name, u"");
+  EXPECT_EQ(form.GetNoteWithEmptyUniqueDisplayName(), u"test note");
+}
+
+TEST(PasswordFormTest, MixedNotes) {
+  PasswordForm form;
+  form.SetNoteWithEmptyUniqueDisplayName(u"test note");
+  form.SetPasswordBackupNote(u"backuppassword");
+
+  EXPECT_EQ(form.GetNoteWithEmptyUniqueDisplayName(), u"test note");
+  EXPECT_EQ(form.GetPasswordBackupNote(), u"backuppassword");
+}
+
+TEST(PasswordFormTest, UpdatesExistingNote) {
+  PasswordForm form;
+  form.SetNoteWithEmptyUniqueDisplayName(u"test note");
+  ASSERT_EQ(form.GetNoteWithEmptyUniqueDisplayName(), u"test note");
+
+  form.SetNoteWithEmptyUniqueDisplayName(u"updated note");
+  EXPECT_EQ(form.GetNoteWithEmptyUniqueDisplayName(), u"updated note");
+}
+
+}  // namespace
+
+}  // namespace password_manager
diff --git a/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklist.yaml b/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklist.yaml
index fa7b3637..2d081418 100644
--- a/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklist.yaml
+++ b/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklist.yaml
@@ -12,8 +12,8 @@
 features:
   dynamic_refresh: true
   per_profile: true
-future_on:
-- chrome_os
+supported_on:
+- chrome_os:138-
 owners:
 - andreydav@google.com
 - mpetrisor@chromium.org
diff --git a/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklistExceptions.yaml b/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklistExceptions.yaml
index d2225ef..61f1659 100644
--- a/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklistExceptions.yaml
+++ b/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoDomainBlocklistExceptions.yaml
@@ -11,8 +11,8 @@
 features:
   dynamic_refresh: true
   per_profile: true
-future_on:
-- chrome_os
+supported_on:
+- chrome_os:138-
 owners:
 - andreydav@google.com
 - mpetrisor@chromium.org
diff --git a/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoEnabled.yaml b/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoEnabled.yaml
index d9c0eeb..efb2147 100644
--- a/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoEnabled.yaml
+++ b/components/policy/resources/templates/policy_definitions/FloatingSso/FloatingSsoEnabled.yaml
@@ -12,8 +12,8 @@
 features:
   dynamic_refresh: true
   per_profile: true
-future_on:
-- chrome_os
+supported_on:
+- chrome_os:138-
 items:
 - caption: Enable Floating SSO and move the user's web service authentications to new device
   value: true
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/FloatingWorkspaceV2Enabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/FloatingWorkspaceV2Enabled.yaml
index 2426214..d6d24ae 100644
--- a/components/policy/resources/templates/policy_definitions/Miscellaneous/FloatingWorkspaceV2Enabled.yaml
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/FloatingWorkspaceV2Enabled.yaml
@@ -1,7 +1,7 @@
-caption: Enable <ph name="PRODUCT_NAME">$1<ex>Floating Workspace</ex></ph> V2 Service
+caption: Enable <ph name="PRODUCT_NAME">$1<ex>Floating Workspace</ex></ph> Service
 default: false
 desc: |-
-  When a user switches between <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices, <ph name="PRODUCT_NAME">$1<ex>Floating Workspace</ex></ph> V2 Service V2 Service will launch browser and app windows from the previous device onto the new device.
+  When a user switches between <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices, <ph name="PRODUCT_NAME">$1<ex>Floating Workspace</ex></ph> Service will launch browser and app windows from the previous device onto the new device.
   Setting the policy to Enabled will launch browser and app windows from current user's last used <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> device automatically upon login.
   Setting the policy to Disabled or leaving it unset will let full restore settings determine what to be launched upon login.
 example_value: true
@@ -15,11 +15,11 @@
     login
   value: false
 owners:
-- ligeng@chromium.org
-- yzd@chromium.org
+- andreydav@google.com
+- slutskii@google.com
 schema:
   type: boolean
-future_on:
-- chrome_os
+supported_on:
+- chrome_os:138-
 tags: []
 type: main
diff --git a/components/policy/resources/templates/policy_definitions/Startup/ShowHomeButton.yaml b/components/policy/resources/templates/policy_definitions/Startup/ShowHomeButton.yaml
index e0b7aef5..98b1c85 100644
--- a/components/policy/resources/templates/policy_definitions/Startup/ShowHomeButton.yaml
+++ b/components/policy/resources/templates/policy_definitions/Startup/ShowHomeButton.yaml
@@ -9,6 +9,7 @@
   dynamic_refresh: true
   per_profile: true
 future_on:
+- android
 - fuchsia
 items:
 - caption: Show the Home button on the toolbar
diff --git a/components/policy/test/data/pref_mapping/ShowHomeButton.json b/components/policy/test/data/pref_mapping/ShowHomeButton.json
index 15d88834..8a18136 100644
--- a/components/policy/test/data/pref_mapping/ShowHomeButton.json
+++ b/components/policy/test/data/pref_mapping/ShowHomeButton.json
@@ -2,6 +2,7 @@
   {
     "can_be_recommended": true,
     "os": [
+      "android",
       "win",
       "linux",
       "mac",
diff --git a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc
index 477d8e7..84e8238 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc
@@ -62,6 +62,7 @@
   trimmed_account_specifics.clear_guid();
   trimmed_account_specifics.clear_collaboration_id();
   trimmed_account_specifics.clear_update_time_windows_epoch_micros();
+  trimmed_account_specifics.clear_version();
 
   if (trimmed_account_specifics.has_shared_tab_details()) {
     sync_pb::SharedTabDetails* tab =
@@ -113,6 +114,7 @@
   sync_pb::SharedTabGroupAccountDataSpecifics specifics;
   specifics.set_guid(tab.saved_tab_guid().AsLowercaseString());
   specifics.set_collaboration_id(collaboration_id->value());
+  specifics.set_version(kCurrentSharedTabGroupAccountDataSpecificsProtoVersion);
 
   sync_pb::SharedTabDetails* tab_group_details =
       specifics.mutable_shared_tab_details();
diff --git a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge_unittest.cc b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge_unittest.cc
index 4bd3060..972007d 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge_unittest.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge_unittest.cc
@@ -35,9 +35,18 @@
 using testing::Matcher;
 using testing::Not;
 using testing::Return;
+using testing::SaveArgPointee;
 using testing::Sequence;
 using testing::UnorderedElementsAre;
 
+// Action SaveArgPointeeMove<k>(pointer) saves the value pointed to by the k-th
+// (0-based) argument of the mock function by moving it to *pointer.
+ACTION_TEMPLATE(SaveArgPointeeMove,
+                HAS_1_TEMPLATE_PARAMS(int, k),
+                AND_1_VALUE_PARAMS(pointer)) {
+  *pointer = std::move(*testing::get<k>(args));
+}
+
 MATCHER_P3(HasAccountMetadata, title, color, collaboration_id, "") {
   return base::UTF16ToUTF8(arg.title()) == title && arg.color() == color &&
          arg.collaboration_id() == CollaborationId(collaboration_id);
@@ -668,10 +677,24 @@
   base::Time last_seen_time3 = base::Time::Now() + base::Seconds(55);
   base::Time last_seen_time4 = base::Time::Now() + base::Seconds(99);
 
-  EXPECT_CALL(mock_processor(), Put(Eq(storage_key1), _, _)).Times(1);
+  syncer::EntityData entity_data;
+  EXPECT_CALL(mock_processor(), Put(Eq(storage_key1), _, _))
+      .WillOnce(SaveArgPointeeMove<1>(&entity_data));
   model().UpdateTabLastSeenTime(group_id, tab_id1, last_seen_time3,
                                 TriggerSource::LOCAL);
 
+  // Verify the written specifics.
+  const sync_pb::SharedTabGroupAccountDataSpecifics& specifics =
+      entity_data.specifics.shared_tab_group_account_data();
+  EXPECT_EQ(kCurrentSharedTabGroupDataSpecificsProtoVersion,
+            specifics.version());
+  EXPECT_EQ(tab_id1.AsLowercaseString(), specifics.guid());
+  EXPECT_TRUE(specifics.has_shared_tab_details());
+  EXPECT_EQ(group_id.AsLowercaseString(),
+            specifics.shared_tab_details().shared_tab_group_guid());
+  EXPECT_EQ(last_seen_time3.ToDeltaSinceWindowsEpoch().InMicroseconds(),
+            specifics.shared_tab_details().last_seen_timestamp_windows_epoch());
+
   // Update the last seen timestamp for tab2 from sync. The updated timestamp
   // should not be sent back to sync.
   EXPECT_CALL(mock_processor(), Put(Eq(storage_key2), _, _)).Times(0);
@@ -814,6 +837,7 @@
   account_data_specifics2->set_update_time_windows_epoch_micros(1234567890);
   account_data_specifics2->mutable_shared_tab_group_details()
       ->set_pinned_position(11);
+  account_data_specifics2->set_version(999);
 
   EXPECT_THAT(bridge().TrimAllSupportedFieldsFromRemoteSpecifics(
                   remote_account_data_specifics2),
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
index 226db09..7446799 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
@@ -135,6 +135,8 @@
             .value()
             .AsLowercaseString());
   }
+
+  pb_specifics.set_version(kCurrentSharedTabGroupDataSpecificsProtoVersion);
   return pb_specifics;
 }
 
@@ -233,6 +235,8 @@
   pb_tab->set_shared_tab_group_guid(tab.saved_group_guid().AsLowercaseString());
   pb_tab->set_title(base::UTF16ToUTF8(tab.title()));
   *pb_tab->mutable_unique_position() = std::move(unique_position);
+
+  specifics.set_version(kCurrentSharedTabGroupDataSpecificsProtoVersion);
   return specifics;
 }
 
@@ -912,6 +916,7 @@
       entity_specifics.shared_tab_group_data();
   trimmed_specifics.clear_guid();
   trimmed_specifics.clear_update_time_windows_epoch_micros();
+  trimmed_specifics.clear_version();
 
   if (trimmed_specifics.has_tab()) {
     sync_pb::SharedTab* tab = trimmed_specifics.mutable_tab();
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
index fc39f72..5428c97 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
@@ -107,11 +107,14 @@
 }
 
 MATCHER_P3(HasGroupEntityData, title, color, collaboration_id, "") {
-  const sync_pb::SharedTabGroup& arg_tab_group =
-      arg.specifics.shared_tab_group_data().tab_group();
+  const sync_pb::SharedTabGroupDataSpecifics& arg_specifics =
+      arg.specifics.shared_tab_group_data();
+  const sync_pb::SharedTabGroup& arg_tab_group = arg_specifics.tab_group();
   const std::optional<syncer::CollaborationMetadata>& collab_metadata =
       arg.collaboration_metadata;
-  return arg_tab_group.title() == title && arg_tab_group.color() == color &&
+  return arg_specifics.version() ==
+             kCurrentSharedTabGroupDataSpecificsProtoVersion &&
+         arg_tab_group.title() == title && arg_tab_group.color() == color &&
          collab_metadata.has_value() &&
          CollaborationId(collab_metadata->collaboration_id()) ==
              CollaborationId(collaboration_id);
@@ -129,16 +132,36 @@
 }
 
 MATCHER_P3(HasTabEntityData, title, url, collaboration_id, "") {
-  const sync_pb::SharedTab& arg_tab =
-      arg.specifics.shared_tab_group_data().tab();
+  const sync_pb::SharedTabGroupDataSpecifics& arg_specifics =
+      arg.specifics.shared_tab_group_data();
+  const sync_pb::SharedTab& arg_tab = arg_specifics.tab();
   const std::optional<syncer::CollaborationMetadata>& collab_metadata =
       arg.collaboration_metadata;
-  return arg_tab.title() == title && arg_tab.url() == url &&
+  return arg_specifics.version() ==
+             kCurrentSharedTabGroupDataSpecificsProtoVersion &&
+         arg_tab.title() == title && arg_tab.url() == url &&
          collab_metadata.has_value() &&
          CollaborationId(collab_metadata->collaboration_id()) ==
              CollaborationId(collaboration_id);
 }
 
+MATCHER_P4(HasTabEntityDataWithVersion,
+           title,
+           url,
+           collaboration_id,
+           version,
+           "") {
+  const sync_pb::SharedTabGroupDataSpecifics& arg_specifics =
+      arg.specifics.shared_tab_group_data();
+  const sync_pb::SharedTab& arg_tab = arg_specifics.tab();
+  const std::optional<syncer::CollaborationMetadata>& collab_metadata =
+      arg.collaboration_metadata;
+  return arg_specifics.version() == version && arg_tab.title() == title &&
+         arg_tab.url() == url && collab_metadata.has_value() &&
+         CollaborationId(collab_metadata->collaboration_id()) ==
+             CollaborationId(collaboration_id);
+}
+
 MATCHER_P2(HasTabEntityDataWithPosition, title, unique_position, "") {
   const sync_pb::SharedTab& arg_tab =
       arg.specifics.shared_tab_group_data().tab();
@@ -2251,6 +2274,7 @@
   sync_pb::SharedTabGroupDataSpecifics tab_specifics =
       MakeTabSpecifics("tab title", GURL("http://google.com/1"),
                        kMissingGroupGuid, GenerateRandomUniquePosition());
+
   syncer::EntityChangeList change_list;
   change_list.push_back(
       CreateAddEntityChange(tab_specifics, kCollaborationId, kCreationTime));
@@ -2261,8 +2285,8 @@
       ExtractEntityDataFromBatch(bridge()->GetAllDataForDebugging());
 
   EXPECT_THAT(entity_data_list,
-              UnorderedElementsAre(HasTabEntityData(
-                  "tab title", "http://google.com/1", kCollaborationId)));
+              UnorderedElementsAre(HasTabEntityDataWithVersion(
+                  "tab title", "http://google.com/1", kCollaborationId, 0)));
 
   // Simulate browser restart and verify that the tab missing group is loaded.
   StoreMetadataAndReset();
@@ -2274,8 +2298,8 @@
   entity_data_list =
       ExtractEntityDataFromBatch(bridge()->GetAllDataForDebugging());
   EXPECT_THAT(entity_data_list,
-              UnorderedElementsAre(HasTabEntityData(
-                  "tab title", "http://google.com/1", kCollaborationId)));
+              UnorderedElementsAre(HasTabEntityDataWithVersion(
+                  "tab title", "http://google.com/1", kCollaborationId, 0)));
 }
 
 TEST_F(SharedTabGroupDataSyncBridgeTest, UntrackEntitiesForCollaboration) {
@@ -2343,6 +2367,8 @@
   sync_pb::SharedTabGroupDataSpecifics tab_specifics =
       MakeTabSpecifics("tab title", GURL("http://google.com/1"),
                        kMissingGroupGuid, GenerateRandomUniquePosition());
+  tab_specifics.set_version(999);
+
   ApplySingleEntityChange(
       CreateAddEntityChange(tab_specifics, kCollaborationId));
 
@@ -2351,8 +2377,8 @@
 
   // Verify that the model is still empty but the tab missing group is stored.
   ASSERT_THAT(entity_data_list,
-              UnorderedElementsAre(HasTabEntityData(
-                  "tab title", "http://google.com/1", kCollaborationId)));
+              UnorderedElementsAre(HasTabEntityDataWithVersion(
+                  "tab title", "http://google.com/1", kCollaborationId, 999)));
   ASSERT_THAT(model()->saved_tab_groups(), IsEmpty());
 
   // Add the missing group entry remotely.
diff --git a/components/saved_tab_groups/public/types.h b/components/saved_tab_groups/public/types.h
index 47d0894c..acce646b 100644
--- a/components/saved_tab_groups/public/types.h
+++ b/components/saved_tab_groups/public/types.h
@@ -202,6 +202,12 @@
   GaiaId updated_by;
 };
 
+// The current proto version for SharedTabGroupDataSpecifics.
+inline constexpr int kCurrentSharedTabGroupDataSpecificsProtoVersion = 1;
+
+// The current proto version for SharedTabGroupAccountDataSpecifics.
+inline constexpr int kCurrentSharedTabGroupAccountDataSpecificsProtoVersion = 1;
+
 }  // namespace tab_groups
 
 #endif  // COMPONENTS_SAVED_TAB_GROUPS_PUBLIC_TYPES_H_
diff --git a/components/services/app_service/public/cpp/app.cc b/components/services/app_service/public/cpp/app.cc
index a8392bbd..531d7074 100644
--- a/components/services/app_service/public/cpp/app.cc
+++ b/components/services/app_service/public/cpp/app.cc
@@ -122,10 +122,6 @@
   return true;
 }
 
-bool App::operator!=(const App& other) const {
-  return !(*this == other);
-}
-
 AppPtr App::Clone() const {
   auto app = std::make_unique<App>(app_type, app_id);
 
diff --git a/components/services/app_service/public/cpp/app.h b/components/services/app_service/public/cpp/app.h
index 8a0ab35..5c2b4356 100644
--- a/components/services/app_service/public/cpp/app.h
+++ b/components/services/app_service/public/cpp/app.h
@@ -32,7 +32,6 @@
   ~App();
 
   bool operator==(const App& other) const;
-  bool operator!=(const App& other) const;
 
   std::unique_ptr<App> Clone() const;
 
diff --git a/components/services/app_service/public/cpp/file_handler.cc b/components/services/app_service/public/cpp/file_handler.cc
index 866105f..84f8929 100644
--- a/components/services/app_service/public/cpp/file_handler.cc
+++ b/components/services/app_service/public/cpp/file_handler.cc
@@ -91,12 +91,6 @@
   return file_extensions;
 }
 
-bool operator==(const FileHandler::AcceptEntry& accept_entry1,
-                const FileHandler::AcceptEntry& accept_entry2) {
-  return std::tie(accept_entry1.mime_type, accept_entry1.file_extensions) ==
-         std::tie(accept_entry2.mime_type, accept_entry2.file_extensions);
-}
-
 bool operator==(const FileHandler& file_handler1,
                 const FileHandler& file_handler2) {
   return std::tie(file_handler1.action, file_handler1.accept,
@@ -105,14 +99,4 @@
                   file_handler2.display_name, file_handler2.launch_type);
 }
 
-bool operator!=(const FileHandler::AcceptEntry& accept_entry1,
-                const FileHandler::AcceptEntry& accept_entry2) {
-  return !(accept_entry1 == accept_entry2);
-}
-
-bool operator!=(const FileHandler& file_handler1,
-                const FileHandler& file_handler2) {
-  return !(file_handler1 == file_handler2);
-}
-
 }  // namespace apps
diff --git a/components/services/app_service/public/cpp/file_handler.h b/components/services/app_service/public/cpp/file_handler.h
index 04d7cda2..b836c00 100644
--- a/components/services/app_service/public/cpp/file_handler.h
+++ b/components/services/app_service/public/cpp/file_handler.h
@@ -29,6 +29,8 @@
     ~AcceptEntry();
     AcceptEntry(const AcceptEntry& accept_entry);
 
+    friend bool operator==(const AcceptEntry&, const AcceptEntry&) = default;
+
     base::Value AsDebugValue() const;
 
     // A MIME type that can be handled by the file handler.
@@ -87,16 +89,9 @@
 std::set<std::string> GetFileExtensionsFromFileHandler(
     const FileHandler& file_handler);
 
-bool operator==(const FileHandler::AcceptEntry& accept_entry1,
-                const FileHandler::AcceptEntry& accept_entry2);
 bool operator==(const FileHandler& file_handler1,
                 const FileHandler& file_handler2);
 
-bool operator!=(const FileHandler::AcceptEntry& accept_entry1,
-                const FileHandler::AcceptEntry& accept_entry2);
-bool operator!=(const FileHandler& file_handler1,
-                const FileHandler& file_handler2);
-
 }  // namespace apps
 
 #endif  // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_FILE_HANDLER_H_
diff --git a/components/services/app_service/public/cpp/icon_types.cc b/components/services/app_service/public/cpp/icon_types.cc
index a142f6b..40306249 100644
--- a/components/services/app_service/public/cpp/icon_types.cc
+++ b/components/services/app_service/public/cpp/icon_types.cc
@@ -20,15 +20,6 @@
 
 IconKey::~IconKey() = default;
 
-bool IconKey::operator==(const IconKey& other) const {
-  return update_version == other.update_version &&
-         resource_id == other.resource_id && icon_effects == other.icon_effects;
-}
-
-bool IconKey::operator!=(const IconKey& other) const {
-  return !(*this == other);
-}
-
 IconKeyPtr IconKey::Clone() const {
   auto icon_key = std::make_unique<IconKey>(resource_id, icon_effects);
   icon_key->update_version = update_version;
diff --git a/components/services/app_service/public/cpp/icon_types.h b/components/services/app_service/public/cpp/icon_types.h
index f9bb4ec9..84401a8f 100644
--- a/components/services/app_service/public/cpp/icon_types.h
+++ b/components/services/app_service/public/cpp/icon_types.h
@@ -33,8 +33,7 @@
 
   ~IconKey();
 
-  bool operator==(const IconKey& other) const;
-  bool operator!=(const IconKey& other) const;
+  friend bool operator==(const IconKey&, const IconKey&) = default;
 
   std::unique_ptr<IconKey> Clone() const;
 
diff --git a/components/services/app_service/public/cpp/intent.cc b/components/services/app_service/public/cpp/intent.cc
index c499e39..f34b0b8 100644
--- a/components/services/app_service/public/cpp/intent.cc
+++ b/components/services/app_service/public/cpp/intent.cc
@@ -17,17 +17,6 @@
 
 IntentFile::~IntentFile() = default;
 
-bool IntentFile::operator==(const IntentFile& other) const {
-  return url == other.url && mime_type == other.mime_type &&
-         file_name == other.file_name && file_size == other.file_size &&
-         is_directory == other.is_directory &&
-         dlp_source_url == other.dlp_source_url;
-}
-
-bool IntentFile::operator!=(const IntentFile& other) const {
-  return !(*this == other);
-}
-
 std::unique_ptr<IntentFile> IntentFile::Clone() const {
   auto intent_file = std::make_unique<IntentFile>(url);
   if (mime_type.has_value()) {
@@ -101,10 +90,6 @@
          extras == other.extras;
 }
 
-bool Intent::operator!=(const Intent& other) const {
-  return !(*this == other);
-}
-
 std::unique_ptr<Intent> Intent::Clone() const {
   auto intent = std::make_unique<Intent>(action);
 
diff --git a/components/services/app_service/public/cpp/intent.h b/components/services/app_service/public/cpp/intent.h
index 292bddb..b496191 100644
--- a/components/services/app_service/public/cpp/intent.h
+++ b/components/services/app_service/public/cpp/intent.h
@@ -24,8 +24,7 @@
   IntentFile& operator=(const IntentFile&) = delete;
   ~IntentFile();
 
-  bool operator==(const IntentFile& other) const;
-  bool operator!=(const IntentFile& other) const;
+  friend bool operator==(const IntentFile&, const IntentFile&) = default;
 
   std::unique_ptr<IntentFile> Clone() const;
 
@@ -76,7 +75,6 @@
   ~Intent();
 
   bool operator==(const Intent& other) const;
-  bool operator!=(const Intent& other) const;
 
   std::unique_ptr<Intent> Clone() const;
 
diff --git a/components/services/app_service/public/cpp/intent_filter.cc b/components/services/app_service/public/cpp/intent_filter.cc
index 811e279..d89850e 100644
--- a/components/services/app_service/public/cpp/intent_filter.cc
+++ b/components/services/app_service/public/cpp/intent_filter.cc
@@ -24,14 +24,6 @@
 
 ConditionValue::~ConditionValue() = default;
 
-bool ConditionValue::operator==(const ConditionValue& other) const {
-  return value == other.value && match_type == other.match_type;
-}
-
-bool ConditionValue::operator!=(const ConditionValue& other) const {
-  return !(*this == other);
-}
-
 std::string ConditionValue::ToString() const {
   std::stringstream out;
   if (match_type == PatternMatchType::kSuffix) {
@@ -65,10 +57,6 @@
   return condition_type == other.condition_type;
 }
 
-bool Condition::operator!=(const Condition& other) const {
-  return !(*this == other);
-}
-
 ConditionPtr Condition::Clone() const {
   ConditionValues values;
   for (const auto& condition_value : condition_values) {
@@ -106,10 +94,6 @@
          activity_label == other.activity_label;
 }
 
-bool IntentFilter::operator!=(const IntentFilter& other) const {
-  return !(*this == other);
-}
-
 IntentFilterPtr IntentFilter::Clone() const {
   IntentFilterPtr intent_filter = std::make_unique<IntentFilter>();
 
diff --git a/components/services/app_service/public/cpp/intent_filter.h b/components/services/app_service/public/cpp/intent_filter.h
index 01727bf6..3ecfab8 100644
--- a/components/services/app_service/public/cpp/intent_filter.h
+++ b/components/services/app_service/public/cpp/intent_filter.h
@@ -107,8 +107,8 @@
   ConditionValue& operator=(const ConditionValue&) = delete;
   ~ConditionValue();
 
-  bool operator==(const ConditionValue& other) const;
-  bool operator!=(const ConditionValue& other) const;
+  friend bool operator==(const ConditionValue&,
+                         const ConditionValue&) = default;
 
   std::string ToString() const;
 
@@ -130,7 +130,6 @@
   ~Condition();
 
   bool operator==(const Condition& other) const;
-  bool operator!=(const Condition& other) const;
 
   std::unique_ptr<Condition> Clone() const;
 
@@ -154,7 +153,6 @@
   ~IntentFilter();
 
   bool operator==(const IntentFilter& other) const;
-  bool operator!=(const IntentFilter& other) const;
 
   std::unique_ptr<IntentFilter> Clone() const;
 
diff --git a/components/services/app_service/public/cpp/package_id.cc b/components/services/app_service/public/cpp/package_id.cc
index d6aae0f..2d35e34 100644
--- a/components/services/app_service/public/cpp/package_id.cc
+++ b/components/services/app_service/public/cpp/package_id.cc
@@ -83,30 +83,6 @@
 PackageId::PackageId(const PackageId&) = default;
 PackageId& PackageId::operator=(const PackageId&) = default;
 
-bool PackageId::operator<(const PackageId& rhs) const {
-  if (this->package_type_ < rhs.package_type_) {
-    return true;
-  } else if (this->package_type_ > rhs.package_type_) {
-    return false;
-  }
-  // If we're here, it's because package_type_ == rhs.package_type_.
-  if (this->identifier_ < rhs.identifier_) {
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool PackageId::operator==(const PackageId& rhs) const {
-  return this->package_type_ == rhs.package_type_ &&
-         this->identifier_ == rhs.identifier_;
-}
-
-bool PackageId::operator!=(const PackageId& rhs) const {
-  return this->package_type_ != rhs.package_type_ ||
-         this->identifier_ != rhs.identifier_;
-}
-
 // static
 std::optional<PackageId> PackageId::FromString(
     std::string_view package_id_string) {
diff --git a/components/services/app_service/public/cpp/package_id.h b/components/services/app_service/public/cpp/package_id.h
index 32d3ff7..c025c4ad 100644
--- a/components/services/app_service/public/cpp/package_id.h
+++ b/components/services/app_service/public/cpp/package_id.h
@@ -46,9 +46,9 @@
 
   PackageId(const PackageId&);
   PackageId& operator=(const PackageId&);
-  bool operator<(const PackageId&) const;
-  bool operator==(const PackageId&) const;
-  bool operator!=(const PackageId&) const;
+
+  friend bool operator==(const PackageId&, const PackageId&) = default;
+  friend auto operator<=>(const PackageId&, const PackageId&) = default;
 
   // Parses a package ID from the canonical string format. Returns
   // std::nullopt if parsing failed. This method will never parse an "unknown"
diff --git a/components/services/app_service/public/cpp/permission.cc b/components/services/app_service/public/cpp/permission.cc
index f079f218..e3c99e9 100644
--- a/components/services/app_service/public/cpp/permission.cc
+++ b/components/services/app_service/public/cpp/permission.cc
@@ -44,15 +44,6 @@
 
 Permission::~Permission() = default;
 
-bool Permission::operator==(const Permission& other) const {
-  return permission_type == other.permission_type && value == other.value &&
-         is_managed == other.is_managed && details == other.details;
-}
-
-bool Permission::operator!=(const Permission& other) const {
-  return !(*this == other);
-}
-
 PermissionPtr Permission::Clone() const {
   return std::make_unique<Permission>(permission_type, value, is_managed,
                                       details);
diff --git a/components/services/app_service/public/cpp/permission.h b/components/services/app_service/public/cpp/permission.h
index 8f6585e..055d608a 100644
--- a/components/services/app_service/public/cpp/permission.h
+++ b/components/services/app_service/public/cpp/permission.h
@@ -52,8 +52,7 @@
   Permission& operator=(const Permission&) = delete;
   ~Permission();
 
-  bool operator==(const Permission& other) const;
-  bool operator!=(const Permission& other) const;
+  friend bool operator==(const Permission&, const Permission&) = default;
 
   std::unique_ptr<Permission> Clone() const;
 
diff --git a/components/services/app_service/public/cpp/preferred_app.cc b/components/services/app_service/public/cpp/preferred_app.cc
index d6a38deb..ca77829 100644
--- a/components/services/app_service/public/cpp/preferred_app.cc
+++ b/components/services/app_service/public/cpp/preferred_app.cc
@@ -16,10 +16,6 @@
   return *intent_filter == *other.intent_filter && app_id == other.app_id;
 }
 
-bool PreferredApp::operator!=(const PreferredApp& other) const {
-  return !(*this == other);
-}
-
 std::unique_ptr<PreferredApp> PreferredApp::Clone() const {
   return std::make_unique<PreferredApp>(intent_filter->Clone(), app_id);
 }
diff --git a/components/services/app_service/public/cpp/preferred_app.h b/components/services/app_service/public/cpp/preferred_app.h
index 326aab7..e891caa 100644
--- a/components/services/app_service/public/cpp/preferred_app.h
+++ b/components/services/app_service/public/cpp/preferred_app.h
@@ -20,8 +20,9 @@
   PreferredApp& operator=(const PreferredApp&) = delete;
   ~PreferredApp();
 
+  // Not defaulted to enforce comparing the content of `intent_filter` (instead
+  // of just the pointer address).
   bool operator==(const PreferredApp& other) const;
-  bool operator!=(const PreferredApp& other) const;
 
   std::unique_ptr<PreferredApp> Clone() const;
 
diff --git a/components/services/app_service/public/cpp/protocol_handler_info.cc b/components/services/app_service/public/cpp/protocol_handler_info.cc
index b5958e33..1ebdc84 100644
--- a/components/services/app_service/public/cpp/protocol_handler_info.cc
+++ b/components/services/app_service/public/cpp/protocol_handler_info.cc
@@ -13,16 +13,6 @@
 
 ProtocolHandlerInfo::~ProtocolHandlerInfo() = default;
 
-bool operator==(const ProtocolHandlerInfo& handler1,
-                const ProtocolHandlerInfo& handler2) {
-  return handler1.protocol == handler2.protocol && handler1.url == handler2.url;
-}
-
-bool operator!=(const ProtocolHandlerInfo& handler1,
-                const ProtocolHandlerInfo& handler2) {
-  return !(handler1 == handler2);
-}
-
 base::Value ProtocolHandlerInfo::AsDebugValue() const {
   base::Value::Dict root;
   root.Set("protocol", protocol);
diff --git a/components/services/app_service/public/cpp/protocol_handler_info.h b/components/services/app_service/public/cpp/protocol_handler_info.h
index 97147cd..8c8f9f3 100644
--- a/components/services/app_service/public/cpp/protocol_handler_info.h
+++ b/components/services/app_service/public/cpp/protocol_handler_info.h
@@ -19,6 +19,9 @@
   ProtocolHandlerInfo(const ProtocolHandlerInfo& other);
   ~ProtocolHandlerInfo();
 
+  friend bool operator==(const ProtocolHandlerInfo&,
+                         const ProtocolHandlerInfo&) = default;
+
   base::Value AsDebugValue() const;
 
   std::string protocol;
@@ -26,12 +29,6 @@
 };
 using ProtocolHandlers = std::vector<ProtocolHandlerInfo>;
 
-bool operator==(const ProtocolHandlerInfo& handler1,
-                const ProtocolHandlerInfo& handler2);
-
-bool operator!=(const ProtocolHandlerInfo& handler1,
-                const ProtocolHandlerInfo& handler2);
-
 }  // namespace apps
 
 #endif  // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PROTOCOL_HANDLER_INFO_H_
diff --git a/components/services/app_service/public/cpp/run_on_os_login_types.cc b/components/services/app_service/public/cpp/run_on_os_login_types.cc
index 96969db..f60796e 100644
--- a/components/services/app_service/public/cpp/run_on_os_login_types.cc
+++ b/components/services/app_service/public/cpp/run_on_os_login_types.cc
@@ -22,14 +22,6 @@
 
 RunOnOsLogin::~RunOnOsLogin() = default;
 
-bool RunOnOsLogin::operator==(const RunOnOsLogin& other) const {
-  return login_mode == other.login_mode && is_managed == other.is_managed;
-}
-
-bool RunOnOsLogin::operator!=(const RunOnOsLogin& other) const {
-  return !(*this == other);
-}
-
 base::Value::Dict ConvertRunOnOsLoginToDict(
     const RunOnOsLogin& run_on_os_login) {
   base::Value::Dict dict;
@@ -60,4 +52,4 @@
                       is_managed.value());
 }
 
-}  // namespace apps
\ No newline at end of file
+}  // namespace apps
diff --git a/components/services/app_service/public/cpp/run_on_os_login_types.h b/components/services/app_service/public/cpp/run_on_os_login_types.h
index b8dbaea..6daf561f 100644
--- a/components/services/app_service/public/cpp/run_on_os_login_types.h
+++ b/components/services/app_service/public/cpp/run_on_os_login_types.h
@@ -32,8 +32,7 @@
   RunOnOsLogin(RunOnOsLogin&&) = default;
   RunOnOsLogin& operator=(RunOnOsLogin&&) = default;
 
-  bool operator==(const RunOnOsLogin& other) const;
-  bool operator!=(const RunOnOsLogin& other) const;
+  friend bool operator==(const RunOnOsLogin&, const RunOnOsLogin&) = default;
 
   ~RunOnOsLogin();
 
diff --git a/components/services/app_service/public/cpp/share_target.cc b/components/services/app_service/public/cpp/share_target.cc
index ee1f1f9..befe8ff 100644
--- a/components/services/app_service/public/cpp/share_target.cc
+++ b/components/services/app_service/public/cpp/share_target.cc
@@ -99,39 +99,4 @@
   return base::Value(std::move(root));
 }
 
-bool operator==(const ShareTarget& share_target1,
-                const ShareTarget& share_target2) {
-  return std::tie(share_target1.action, share_target1.method,
-                  share_target1.enctype, share_target1.params) ==
-         std::tie(share_target2.action, share_target2.method,
-                  share_target2.enctype, share_target2.params);
-}
-
-bool operator==(const ShareTarget::Params& params1,
-                const ShareTarget::Params& params2) {
-  return std::tie(params1.title, params1.text, params1.url, params1.files) ==
-         std::tie(params2.title, params2.text, params2.url, params2.files);
-}
-
-bool operator==(const ShareTarget::Files& files1,
-                const ShareTarget::Files& files2) {
-  return std::tie(files1.name, files1.accept) ==
-         std::tie(files2.name, files2.accept);
-}
-
-bool operator!=(const ShareTarget& share_target1,
-                const ShareTarget& share_target2) {
-  return !(share_target1 == share_target2);
-}
-
-bool operator!=(const ShareTarget::Params& params1,
-                const ShareTarget::Params& params2) {
-  return !(params1 == params2);
-}
-
-bool operator!=(const ShareTarget::Files& files1,
-                const ShareTarget::Files& files2) {
-  return !(files1 == files2);
-}
-
 }  // namespace apps
diff --git a/components/services/app_service/public/cpp/share_target.h b/components/services/app_service/public/cpp/share_target.h
index 07b799a..9239f9d 100644
--- a/components/services/app_service/public/cpp/share_target.h
+++ b/components/services/app_service/public/cpp/share_target.h
@@ -37,6 +37,8 @@
     Files& operator=(Files&&);
     ~Files();
 
+    friend bool operator==(const Files&, const Files&) = default;
+
     base::Value AsDebugValue() const;
 
     std::string name;
@@ -51,6 +53,8 @@
     Params& operator=(Params&&);
     ~Params();
 
+    friend bool operator==(const Params&, const Params&) = default;
+
     base::Value AsDebugValue() const;
 
     std::string title;
@@ -66,6 +70,8 @@
   ShareTarget& operator=(ShareTarget&&);
   ~ShareTarget();
 
+  friend bool operator==(const ShareTarget&, const ShareTarget&) = default;
+
   static const char* MethodToString(Method);
   static const char* EnctypeToString(Enctype);
 
@@ -79,21 +85,6 @@
 
   Params params;
 };
-
-bool operator==(const ShareTarget& share_target1,
-                const ShareTarget& share_target2);
-bool operator==(const ShareTarget::Params& params1,
-                const ShareTarget::Params& params2);
-bool operator==(const ShareTarget::Files& files1,
-                const ShareTarget::Files& files2);
-
-bool operator!=(const ShareTarget& share_target1,
-                const ShareTarget& share_target2);
-bool operator!=(const ShareTarget::Params& params1,
-                const ShareTarget::Params& params2);
-bool operator!=(const ShareTarget::Files& files1,
-                const ShareTarget::Files& files2);
-
 }  // namespace apps
 
 #endif  // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_SHARE_TARGET_H_
diff --git a/components/services/storage/dom_storage/async_dom_storage_database.cc b/components/services/storage/dom_storage/async_dom_storage_database.cc
index c173270..bb11ef8 100644
--- a/components/services/storage/dom_storage/async_dom_storage_database.cc
+++ b/components/services/storage/dom_storage/async_dom_storage_database.cc
@@ -76,14 +76,17 @@
 }
 
 void AsyncDomStorageDatabase::RunBatchDatabaseTasks(
+    RunBatchTasksContext context,
     std::vector<BatchDatabaseTask> tasks,
     base::OnceCallback<void(leveldb::Status)> callback) {
   RunDatabaseTask(base::BindOnce(
-                      [](std::vector<BatchDatabaseTask> tasks,
+                      [](RunBatchTasksContext context,
+                         std::vector<BatchDatabaseTask> tasks,
                          const DomStorageDatabase& db) {
                         leveldb::WriteBatch batch;
                         // TODO(crbug.com/40245293): Remove this after debugging
                         // is complete.
+                        base::debug::Alias(&context);
                         size_t batch_task_count = tasks.size();
                         size_t iteration_count = 0;
                         size_t current_batch_size = 0;
@@ -115,7 +118,7 @@
                         }
                         return db.Commit(&batch);
                       },
-                      std::move(tasks)),
+                      context, std::move(tasks)),
                   std::move(callback));
 }
 
diff --git a/components/services/storage/dom_storage/async_dom_storage_database.h b/components/services/storage/dom_storage/async_dom_storage_database.h
index 542b58f5..55b64d7 100644
--- a/components/services/storage/dom_storage/async_dom_storage_database.h
+++ b/components/services/storage/dom_storage/async_dom_storage_database.h
@@ -28,6 +28,21 @@
 struct DatabaseTaskTraits;
 }  // namespace internal
 
+// Describes the context in which RunBatchDatabaseTasks is called, for
+// debugging.
+// TODO(crbug.com/40245293): Remove this debug enum once the investigation is
+// complete.
+enum class RunBatchTasksContext {
+  kScavengeUnusedNamespaces,
+  kDeleteStorage,
+  kCloneNamespace,
+  kRegisterNewAreaMap,
+  kRegisterShallowClonedNamespace,
+  kDoDatabaseDelete,
+  kParseNamespaces,
+  kTest,
+};
+
 // A wrapper around DomStorageDatabase which simplifies usage by queueing
 // database operations until the database is opened.
 class AsyncDomStorageDatabase {
@@ -122,6 +137,7 @@
   using BatchDatabaseTask =
       base::OnceCallback<void(leveldb::WriteBatch*, const DomStorageDatabase&)>;
   void RunBatchDatabaseTasks(
+      RunBatchTasksContext context,
       std::vector<BatchDatabaseTask> tasks,
       base::OnceCallback<void(leveldb::Status)> callback);
 
diff --git a/components/services/storage/dom_storage/session_storage_area_impl_unittest.cc b/components/services/storage/dom_storage/session_storage_area_impl_unittest.cc
index 8b27b79..35aa38d 100644
--- a/components/services/storage/dom_storage/session_storage_area_impl_unittest.cc
+++ b/components/services/storage/dom_storage/session_storage_area_impl_unittest.cc
@@ -76,8 +76,8 @@
         metadata_.GetOrCreateNamespaceEntry(test_namespace_id1_),
         test_storage_key1_, &save_tasks);
     DCHECK(map_id->KeyPrefix() == StdStringToUint8Vector("map-0-"));
-    leveldb_database_->RunBatchDatabaseTasks(std::move(save_tasks),
-                                             base::DoNothing());
+    leveldb_database_->RunBatchDatabaseTasks(
+        RunBatchTasksContext::kTest, std::move(save_tasks), base::DoNothing());
   }
   ~SessionStorageAreaImplTest() override = default;
 
@@ -87,8 +87,8 @@
     std::vector<AsyncDomStorageDatabase::BatchDatabaseTask> save_tasks;
     auto map_data =
         metadata_.RegisterNewMap(namespace_entry, storage_key, &save_tasks);
-    leveldb_database_->RunBatchDatabaseTasks(std::move(save_tasks),
-                                             base::DoNothing());
+    leveldb_database_->RunBatchDatabaseTasks(
+        RunBatchTasksContext::kTest, std::move(save_tasks), base::DoNothing());
     return map_data;
   }
 
@@ -227,8 +227,8 @@
   metadata_.RegisterShallowClonedNamespace(
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id1_),
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id2_), &save_tasks);
-  leveldb_database_->RunBatchDatabaseTasks(std::move(save_tasks),
-                                           base::DoNothing());
+  leveldb_database_->RunBatchDatabaseTasks(
+      RunBatchTasksContext::kTest, std::move(save_tasks), base::DoNothing());
   auto ss_leveldb_impl2 = ss_leveldb_impl1->Clone(
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id2_));
 
@@ -332,8 +332,8 @@
   metadata_.RegisterShallowClonedNamespace(
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id1_),
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id2_), &save_tasks);
-  leveldb_database_->RunBatchDatabaseTasks(std::move(save_tasks),
-                                           base::DoNothing());
+  leveldb_database_->RunBatchDatabaseTasks(
+      RunBatchTasksContext::kTest, std::move(save_tasks), base::DoNothing());
   auto ss_leveldb_impl2 = ss_leveldb_impl1->Clone(
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id2_));
 
@@ -421,8 +421,8 @@
   metadata_.RegisterShallowClonedNamespace(
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id1_),
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id2_), &save_tasks);
-  leveldb_database_->RunBatchDatabaseTasks(std::move(save_tasks),
-                                           base::DoNothing());
+  leveldb_database_->RunBatchDatabaseTasks(
+      RunBatchTasksContext::kTest, std::move(save_tasks), base::DoNothing());
   auto ss_leveldb_impl2 = ss_leveldb_impl1->Clone(
       metadata_.GetOrCreateNamespaceEntry(test_namespace_id2_));
 
diff --git a/components/services/storage/dom_storage/session_storage_impl.cc b/components/services/storage/dom_storage/session_storage_impl.cc
index 12526c2e..487d6cf 100644
--- a/components/services/storage/dom_storage/session_storage_impl.cc
+++ b/components/services/storage/dom_storage/session_storage_impl.cc
@@ -244,7 +244,7 @@
                                                  namespace_entry, &save_tasks);
         if (database_) {
           database_->RunBatchDatabaseTasks(
-              std::move(save_tasks),
+              RunBatchTasksContext::kCloneNamespace, std::move(save_tasks),
               base::BindOnce(&SessionStorageImpl::OnCommitResult,
                              weak_ptr_factory_.GetWeakPtr()));
         }
@@ -348,7 +348,7 @@
     metadata_.DeleteArea(namespace_id, storage_key, &tasks);
     if (database_) {
       database_->RunBatchDatabaseTasks(
-          std::move(tasks),
+          RunBatchTasksContext::kDeleteStorage, std::move(tasks),
           base::BindOnce(&SessionStorageImpl::OnCommitResultWithCallback,
                          weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
     } else {
@@ -494,7 +494,7 @@
 
   if (database_) {
     database_->RunBatchDatabaseTasks(
-        std::move(save_tasks),
+        RunBatchTasksContext::kScavengeUnusedNamespaces, std::move(save_tasks),
         base::BindOnce(&SessionStorageImpl::OnCommitResult,
                        weak_ptr_factory_.GetWeakPtr()));
   }
@@ -576,7 +576,7 @@
 
   if (database_) {
     database_->RunBatchDatabaseTasks(
-        std::move(save_tasks),
+        RunBatchTasksContext::kRegisterNewAreaMap, std::move(save_tasks),
         base::BindOnce(&SessionStorageImpl::OnCommitResult,
                        weak_ptr_factory_.GetWeakPtr()));
   }
@@ -665,6 +665,7 @@
                                            namespace_entry, &save_tasks);
   if (database_) {
     database_->RunBatchDatabaseTasks(
+        RunBatchTasksContext::kRegisterShallowClonedNamespace,
         std::move(save_tasks),
         base::BindOnce(&SessionStorageImpl::OnCommitResult,
                        weak_ptr_factory_.GetWeakPtr()));
@@ -701,8 +702,9 @@
   metadata_.DeleteNamespace(namespace_id, &tasks);
   if (database_) {
     database_->RunBatchDatabaseTasks(
-        std::move(tasks), base::BindOnce(&SessionStorageImpl::OnCommitResult,
-                                         weak_ptr_factory_.GetWeakPtr()));
+        RunBatchTasksContext::kDoDatabaseDelete, std::move(tasks),
+        base::BindOnce(&SessionStorageImpl::OnCommitResult,
+                       weak_ptr_factory_.GetWeakPtr()));
   }
 }
 
@@ -920,7 +922,7 @@
     // initialized. There's no harm in deferring in other situations, so we just
     // always defer here.
     database_->RunBatchDatabaseTasks(
-        std::move(migration_tasks),
+        RunBatchTasksContext::kParseNamespaces, std::move(migration_tasks),
         base::BindOnce(
             [](base::OnceCallback<void(leveldb::Status)> callback,
                scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
diff --git a/components/services/storage/dom_storage/session_storage_metadata_unittest.cc b/components/services/storage/dom_storage/session_storage_metadata_unittest.cc
index 67e85ee2..85cb84c 100644
--- a/components/services/storage/dom_storage/session_storage_metadata_unittest.cc
+++ b/components/services/storage/dom_storage/session_storage_metadata_unittest.cc
@@ -167,7 +167,7 @@
                 base::OnceCallback<void(leveldb::Status)> callback) {
     base::RunLoop loop;
     database_->RunBatchDatabaseTasks(
-        std::move(tasks),
+        RunBatchTasksContext::kTest, std::move(tasks),
         base::BindLambdaForTesting([&](leveldb::Status status) {
           std::move(callback).Run(status);
           loop.Quit();
diff --git a/components/services/storage/dom_storage/session_storage_namespace_impl_unittest.cc b/components/services/storage/dom_storage/session_storage_namespace_impl_unittest.cc
index 4c60ce5..102d79d6 100644
--- a/components/services/storage/dom_storage/session_storage_namespace_impl_unittest.cc
+++ b/components/services/storage/dom_storage/session_storage_namespace_impl_unittest.cc
@@ -64,7 +64,7 @@
   void RunBatch(std::vector<AsyncDomStorageDatabase::BatchDatabaseTask> tasks) {
     base::RunLoop loop(base::RunLoop::Type::kNestableTasksAllowed);
     database_->RunBatchDatabaseTasks(
-        std::move(tasks),
+        RunBatchTasksContext::kTest, std::move(tasks),
         base::BindLambdaForTesting([&](leveldb::Status) { loop.Quit(); }));
     loop.Run();
   }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
index 7c7b984..2200f83 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
@@ -170,8 +170,7 @@
                     @Override
                     public AccessTokenData run() throws AuthException {
                         return mDelegate.getAccessToken(
-                                AccountUtils.createAccountFromName(coreAccountInfo.getEmail()),
-                                scope);
+                                CoreAccountInfo.getAndroidAccountFrom(coreAccountInfo), scope);
                     }
 
                     @Override
@@ -258,7 +257,7 @@
         new AsyncTask<Boolean>() {
             @Override
             public Boolean doInBackground() {
-                Account account = AccountUtils.createAccountFromName(coreAccountInfo.getEmail());
+                Account account = CoreAccountInfo.getAndroidAccountFrom(coreAccountInfo);
                 return mDelegate.hasFeature(account, FEATURE_IS_USM_ACCOUNT_KEY);
             }
 
@@ -277,7 +276,7 @@
         new AsyncTask<Boolean>() {
             @Override
             public Boolean doInBackground() {
-                Account account = AccountUtils.createAccountFromName(coreAccountInfo.getEmail());
+                Account account = CoreAccountInfo.getAndroidAccountFrom(coreAccountInfo);
                 @CapabilityResponse
                 int capability =
                         mDelegate.hasCapability(
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
index bd1d7dd9..1103505 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
@@ -13,7 +13,6 @@
 import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccountManagerFacade.ChildAccountStatusListener;
 import org.chromium.components.signin.base.AccountInfo;
-import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.base.GaiaId;
 
 import java.util.Arrays;
@@ -36,9 +35,7 @@
 
     /**
      * Creates an Account object for the given {@param name}. Only used in places where we need to
-     * talk to Android which is very rare. Non-signin code should not use this method and should use
-     * {@link CoreAccountInfo} instead. TODO(crbug.com/40065164): Rename this method to
-     * createAccountFromEmail.
+     * talk to Android which is very rare.
      */
     public static Account createAccountFromName(String name) {
         return new Account(name, GOOGLE_ACCOUNT_TYPE);
@@ -55,22 +52,6 @@
     }
 
     /**
-     * Finds the first {@link CoreAccountInfo} of the given {@param coreAccountInfos} whose
-     * canonical name equal the given {@param accountEmail}'s canonical name; null if there is no
-     * match.
-     */
-    public static @Nullable CoreAccountInfo findCoreAccountInfoByEmail(
-            final List<CoreAccountInfo> coreAccountInfos, String accountEmail) {
-        String canonicalEmail = AccountUtils.canonicalizeEmail(accountEmail);
-        for (CoreAccountInfo coreAccountInfo : coreAccountInfos) {
-            if (AccountUtils.canonicalizeEmail(coreAccountInfo.getEmail()).equals(canonicalEmail)) {
-                return coreAccountInfo;
-            }
-        }
-        return null;
-    }
-
-    /**
      * Finds the first {@link AccountInfo} among `accounts` whose canonical email is equal to
      * `accountEmail`; `null` if there is no match.
      */
@@ -86,20 +67,6 @@
     }
 
     /**
-     * Finds the first {@link CoreAccountInfo} of the given {@param coreAccountInfos} whose Gaia ID
-     * equals the given {@param accountGaiaId}; null if there is no match.
-     */
-    public static @Nullable CoreAccountInfo findCoreAccountInfoByGaiaId(
-            final List<CoreAccountInfo> coreAccountInfos, GaiaId accountGaiaId) {
-        for (CoreAccountInfo coreAccountInfo : coreAccountInfos) {
-            if (coreAccountInfo.getGaiaId().equals(accountGaiaId)) {
-                return coreAccountInfo;
-            }
-        }
-        return null;
-    }
-
-    /**
      * Finds the first {@link AccountInfo} among `accounts` whose Gaia ID is equal to
      * `accountGaiaId`; null if there is no match.
      */
@@ -114,26 +81,6 @@
     }
 
     /**
-     * Gets the cached list of {@link CoreAccountInfo} from the given {@link Promise}. If the cache
-     * is not yet populated, return an empty list.
-     */
-    public static List<CoreAccountInfo> getCoreAccountInfosIfFulfilledOrEmpty(
-            Promise<List<CoreAccountInfo>> promise) {
-        return promise.isFulfilled() ? promise.getResult() : Collections.emptyList();
-    }
-
-    /**
-     * Gets the cached default {@link CoreAccountInfo} from the given {@link Promise}.
-     * If the cache is not yet populated or no accounts exist, return null.
-     */
-    public static @Nullable CoreAccountInfo getDefaultCoreAccountInfoIfFulfilled(
-            Promise<List<CoreAccountInfo>> promise) {
-        final List<CoreAccountInfo> coreAccountInfos =
-                getCoreAccountInfosIfFulfilledOrEmpty(promise);
-        return coreAccountInfos.isEmpty() ? null : coreAccountInfos.get(0);
-    }
-
-    /**
      * Gets the cached list of {@link AccountInfo} from the given `promise`. If the cache is not yet
      * populated, return an empty list.
      */
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
index d10e2e59..1e8a728 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
@@ -11,7 +11,6 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
-import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
@@ -23,8 +22,6 @@
 import org.chromium.google_apis.gaia.GoogleServiceAuthError;
 import org.chromium.google_apis.gaia.GoogleServiceAuthErrorState;
 
-import java.util.List;
-
 /**
  * Java instance for the native ProfileOAuth2TokenServiceDelegate.
  *
@@ -60,12 +57,11 @@
             String accountEmail, String scope, final long nativeCallback) {
         assert accountEmail != null : "Account email cannot be null!";
         mAccountManagerFacade
-                .getCoreAccountInfos()
+                .getAccounts()
                 .then(
-                        coreAccountInfos -> {
+                        accounts -> {
                             final @Nullable CoreAccountInfo coreAccountInfo =
-                                    AccountUtils.findCoreAccountInfoByEmail(
-                                            coreAccountInfos, accountEmail);
+                                    AccountUtils.findAccountByEmail(accounts, accountEmail);
                             getAccessToken(coreAccountInfo, scope, nativeCallback);
                         });
     }
@@ -132,10 +128,9 @@
     @VisibleForTesting
     @CalledByNative
     boolean hasOAuth2RefreshToken(String accountEmail) {
-        Promise<List<CoreAccountInfo>> promise = mAccountManagerFacade.getCoreAccountInfos();
+        var promise = mAccountManagerFacade.getAccounts();
         return promise.isFulfilled()
-                && AccountUtils.findCoreAccountInfoByEmail(promise.getResult(), accountEmail)
-                        != null;
+                && AccountUtils.findAccountByEmail(promise.getResult(), accountEmail) != null;
     }
 
     @NativeMethods
diff --git a/components/signin/public/android/junit/src/org/chromium/components/signin/AccountManagerFacadeImplTest.java b/components/signin/public/android/junit/src/org/chromium/components/signin/AccountManagerFacadeImplTest.java
index d59c31ef..baeb1eb 100644
--- a/components/signin/public/android/junit/src/org/chromium/components/signin/AccountManagerFacadeImplTest.java
+++ b/components/signin/public/android/junit/src/org/chromium/components/signin/AccountManagerFacadeImplTest.java
@@ -167,16 +167,12 @@
     @Test
     public void testCanonicalAccount() throws Exception {
         addTestAccount("test@gmail.com");
-        List<CoreAccountInfo> coreAccountInfos = mFacade.getCoreAccountInfos().getResult();
+        var coreAccountInfos = mFacade.getAccounts().getResult();
 
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "test@gmail.com"));
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "Test@gmail.com"));
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "te.st@gmail.com"));
-        Assert.assertNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "te@googlemail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(coreAccountInfos, "test@gmail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(coreAccountInfos, "Test@gmail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(coreAccountInfos, "te.st@gmail.com"));
+        Assert.assertNull(AccountUtils.findAccountByEmail(coreAccountInfos, "te@googlemail.com"));
     }
 
     @Test
@@ -298,16 +294,12 @@
     @Test
     public void testNonCanonicalAccount() throws Exception {
         addTestAccount("test.me@gmail.com");
-        List<CoreAccountInfo> coreAccountInfos = mFacade.getCoreAccountInfos().getResult();
+        var accounts = mFacade.getAccounts().getResult();
 
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "test.me@gmail.com"));
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "testme@gmail.com"));
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "Testme@gmail.com"));
-        Assert.assertNotNull(
-                AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, "te.st.me@gmail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(accounts, "test.me@gmail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(accounts, "testme@gmail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(accounts, "Testme@gmail.com"));
+        Assert.assertNotNull(AccountUtils.findAccountByEmail(accounts, "te.st.me@gmail.com"));
     }
 
     @Test
diff --git a/components/supervised_user/core/browser/supervised_user_metrics_service.cc b/components/supervised_user/core/browser/supervised_user_metrics_service.cc
index 6f16ec2..70bedd5 100644
--- a/components/supervised_user/core/browser/supervised_user_metrics_service.cc
+++ b/components/supervised_user/core/browser/supervised_user_metrics_service.cc
@@ -6,6 +6,7 @@
 
 #include "base/check.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -17,6 +18,26 @@
 
 namespace {
 
+// UMA histogram FamilyUser.WebFilterType
+// Reports WebFilterType which indicates web filter behaviour are used for
+// current Family Link user.
+constexpr char kWebFilterTypeHistogramName[] = "FamilyUser.WebFilterType";
+
+// UMA histogram FamilyUser.ManualSiteListType
+// Reports ManualSiteListType which indicates approved list and blocked list
+// usage for current Family Link user.
+constexpr char kManagedSiteListHistogramName[] = "FamilyUser.ManagedSiteList";
+
+// UMA histogram FamilyUser.ManagedSiteListCount.Approved
+// Reports the number of approved urls and domains for current Family Link user.
+constexpr char kApprovedSitesCountHistogramName[] =
+    "FamilyUser.ManagedSiteListCount.Approved";
+
+// UMA histogram FamilyUser.ManagedSiteListCount.Blocked
+// Reports the number of blocked urls and domains for current Family Link user.
+constexpr char kBlockedSitesCountHistogramName[] =
+    "FamilyUser.ManagedSiteListCount.Blocked";
+
 constexpr base::TimeDelta kTimerInterval = base::Minutes(10);
 
 // Returns the number of days since the origin.
@@ -39,14 +60,14 @@
 
 SupervisedUserMetricsService::SupervisedUserMetricsService(
     PrefService* pref_service,
-    supervised_user::SupervisedUserURLFilter* url_filter,
+    SupervisedUserService& supervised_user_service,
     std::unique_ptr<SupervisedUserMetricsServiceExtensionDelegate>
         extensions_metrics_delegate)
     : pref_service_(pref_service),
-      url_filter_(url_filter),
+      supervised_user_service_(supervised_user_service),
       extensions_metrics_delegate_(std::move(extensions_metrics_delegate)) {
   DCHECK(pref_service_);
-  DCHECK(url_filter_);
+  supervised_user_service_observation_.Observe(&supervised_user_service);
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   CHECK(extensions_metrics_delegate_)
       << "Extensions metrics delegate must exist on Win/Linux/Mac";
@@ -71,7 +92,15 @@
   // The OnNewDay() event can fire sooner or later than 24 hours due to clock or
   // time zone changes.
   if (day_id < current_day_id) {
-    bool should_update_day_id = url_filter_->EmitURLFilterMetrics();
+    bool should_update_day_id = false;
+    // Since this service runs independently from the SupervisedUserService, do
+    // not emit if the filtering is inactive (for non-supervised users).
+    if (supervised_user_service_->GetURLFilter()->IsFilterInitialized()) {
+      ClearMetricsCache();
+      EmitMetrics();
+      should_update_day_id = true;
+    }
+
     if (extensions_metrics_delegate_ &&
         extensions_metrics_delegate_->RecordExtensionsMetrics()) {
       should_update_day_id = true;
@@ -83,4 +112,42 @@
   }
 }
 
+void SupervisedUserMetricsService::OnURLFilterChanged() {
+  EmitMetrics();
+}
+
+void SupervisedUserMetricsService::EmitMetrics() {
+  if (!last_recorded_web_filter_type_.has_value() ||
+      *last_recorded_web_filter_type_ !=
+          supervised_user_service_->GetURLFilter()->GetWebFilterType()) {
+    WebFilterType web_filter_type =
+        supervised_user_service_->GetURLFilter()->GetWebFilterType();
+
+    base::UmaHistogramEnumeration(kWebFilterTypeHistogramName, web_filter_type);
+    last_recorded_web_filter_type_ = web_filter_type;
+  }
+
+  if (!last_recorded_statistics_.has_value() ||
+      *last_recorded_statistics_ !=
+          supervised_user_service_->GetURLFilter()->GetFilteringStatistics()) {
+    SupervisedUserURLFilter::Statistics statistics =
+        supervised_user_service_->GetURLFilter()->GetFilteringStatistics();
+
+    base::UmaHistogramCounts1000(
+        kApprovedSitesCountHistogramName,
+        statistics.allowed_hosts_count + statistics.allowed_urls_count);
+    base::UmaHistogramCounts1000(
+        kBlockedSitesCountHistogramName,
+        statistics.blocked_hosts_count + statistics.blocked_urls_count);
+    base::UmaHistogramEnumeration(kManagedSiteListHistogramName,
+                                  statistics.GetManagedSiteList());
+    last_recorded_statistics_ = statistics;
+  }
+}
+
+void SupervisedUserMetricsService::ClearMetricsCache() {
+  last_recorded_statistics_ = std::nullopt;
+  last_recorded_web_filter_type_ = std::nullopt;
+}
+
 }  // namespace supervised_user
diff --git a/components/supervised_user/core/browser/supervised_user_metrics_service.h b/components/supervised_user/core/browser/supervised_user_metrics_service.h
index f1b5b524..95588f8a 100644
--- a/components/supervised_user/core/browser/supervised_user_metrics_service.h
+++ b/components/supervised_user/core/browser/supervised_user_metrics_service.h
@@ -6,10 +6,13 @@
 #define COMPONENTS_SUPERVISED_USER_CORE_BROWSER_SUPERVISED_USER_METRICS_SERVICE_H_
 
 #include <memory>
+#include <optional>
 
 #include "base/memory/raw_ptr.h"
 #include "base/timer/timer.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/supervised_user/core/browser/supervised_user_service_observer.h"
+#include "supervised_user_service.h"
 
 class PrefRegistrySimple;
 class PrefService;
@@ -22,7 +25,9 @@
 class SupervisedUserURLFilter;
 
 // Service to initialize and control metric recorders of supervised users.
-class SupervisedUserMetricsService : public KeyedService {
+// Records metrics daily, or when the SupervisedUserService changes.
+class SupervisedUserMetricsService : public KeyedService,
+                                     public SupervisedUserServiceObserver {
  public:
   // Delegate for recording metrics relating to extensions for supervised users
   // such as metrics that should be recorded daily.
@@ -40,7 +45,7 @@
 
   SupervisedUserMetricsService(
       PrefService* pref_service,
-      supervised_user::SupervisedUserURLFilter* url_filter,
+      SupervisedUserService& supervised_user_service,
       std::unique_ptr<SupervisedUserMetricsServiceExtensionDelegate>
           extensions_metrics_delegate);
   SupervisedUserMetricsService(const SupervisedUserMetricsService&) = delete;
@@ -51,16 +56,32 @@
   // KeyedService:
   void Shutdown() override;
 
+  // SupervisedUserServiceObserver:
+  void OnURLFilterChanged() override;
+
  private:
   // Helper function to check if a new day has arrived.
   void CheckForNewDay();
 
+  void EmitMetrics();
+  // Clears cache of last recorded metrics. Subsequent `::EmitMetrics` will emit
+  // all metrics.
+  void ClearMetricsCache();
+
   const raw_ptr<PrefService> pref_service_;
-  const raw_ptr<supervised_user::SupervisedUserURLFilter> url_filter_;
+  raw_ref<SupervisedUserService> supervised_user_service_;
   std::unique_ptr<SupervisedUserMetricsServiceExtensionDelegate>
       extensions_metrics_delegate_;
   // A periodic timer that checks if a new day has arrived.
   base::RepeatingTimer timer_;
+
+  // Cache of last recorded values of SupervisedUserURLFilter to avoid
+  // duplicated emissions.
+  std::optional<WebFilterType> last_recorded_web_filter_type_;
+  std::optional<SupervisedUserURLFilter::Statistics> last_recorded_statistics_;
+
+  base::ScopedObservation<SupervisedUserService, SupervisedUserServiceObserver>
+      supervised_user_service_observation_{this};
 };
 
 }  // namespace supervised_user
diff --git a/components/supervised_user/core/browser/supervised_user_metrics_service_unittest.cc b/components/supervised_user/core/browser/supervised_user_metrics_service_unittest.cc
index f08c86c..254209e 100644
--- a/components/supervised_user/core/browser/supervised_user_metrics_service_unittest.cc
+++ b/components/supervised_user/core/browser/supervised_user_metrics_service_unittest.cc
@@ -28,6 +28,14 @@
 
 namespace supervised_user {
 
+namespace {
+constexpr char kWebFilterTypeHistogramName[] = "FamilyUser.WebFilterType";
+constexpr char kManagedSiteListHistogramName[] = "FamilyUser.ManagedSiteList";
+constexpr char kApprovedSitesCountHistogramName[] =
+    "FamilyUser.ManagedSiteListCount.Approved";
+constexpr char kBlockedSitesCountHistogramName[] =
+    "FamilyUser.ManagedSiteListCount.Blocked";
+
 class MockSupervisedUserMetricsServiceExtensionDelegateImpl
     : public SupervisedUserMetricsService::
           SupervisedUserMetricsServiceExtensionDelegate {
@@ -69,7 +77,7 @@
   void CreateMetricsService() {
     supervised_user_metrics_service_ =
         std::make_unique<SupervisedUserMetricsService>(
-            &pref_service_, GetURLFilter(),
+            &pref_service_, *supervised_user_service_,
             std::make_unique<
                 MockSupervisedUserMetricsServiceExtensionDelegateImpl>());
   }
@@ -140,12 +148,10 @@
        MetricsNotRecordedForSignedOutSupervisedUser) {
   DisableParentalControls(pref_service_);
   CreateMetricsService();
-  histogram_tester_.ExpectTotalCount(
-      SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest(),
-      /*expected_count=*/0);
-  histogram_tester_.ExpectTotalCount(
-      SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest(),
-      /*expected_count=*/0);
+  histogram_tester_.ExpectTotalCount(kWebFilterTypeHistogramName,
+                                     /*expected_count=*/0);
+  histogram_tester_.ExpectTotalCount(kManagedSiteListHistogramName,
+                                     /*expected_count=*/0);
 }
 
 // Tests that default metrics are recorded for supervised users whose parent has
@@ -155,22 +161,22 @@
   // should be subject to default mature sites blocking.
   EnableParentalControls(pref_service_);
   CreateMetricsService();
+  histogram_tester_.ExpectUniqueSample(kWebFilterTypeHistogramName,
+                                       /*sample=*/
+                                       WebFilterType::kTryToBlockMatureSites,
+                                       /*expected_bucket_count=*/1);
   histogram_tester_.ExpectUniqueSample(
-      SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest(),
-      /*sample=*/
-      WebFilterType::kTryToBlockMatureSites,
-      /*expected_bucket_count=*/1);
-  histogram_tester_.ExpectUniqueSample(
-      SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest(),
+      kManagedSiteListHistogramName,
       /*sample=*/
       SupervisedUserURLFilter::ManagedSiteList::kEmpty,
       /*expected_bucket_count=*/1);
-  histogram_tester_.ExpectUniqueSample(
-      SupervisedUserURLFilter::GetApprovedSitesCountHistogramNameForTest(),
-      /*sample=*/0, /*expected_bucket_count=*/1);
-  histogram_tester_.ExpectUniqueSample(
-      SupervisedUserURLFilter::GetBlockedSitesCountHistogramNameForTest(),
-      /*sample=*/0, /*expected_bucket_count=*/1);
+  histogram_tester_.ExpectUniqueSample(kApprovedSitesCountHistogramName,
+                                       /*sample=*/0,
+                                       /*expected_bucket_count=*/1);
+  histogram_tester_.ExpectUniqueSample(kBlockedSitesCountHistogramName,
+                                       /*sample=*/0,
+                                       /*expected_bucket_count=*/1);
 }
 
+}  // namespace
 }  // namespace supervised_user
diff --git a/components/supervised_user/core/browser/supervised_user_service.cc b/components/supervised_user/core/browser/supervised_user_service.cc
index 4291bf4..18e9299 100644
--- a/components/supervised_user/core/browser/supervised_user_service.cc
+++ b/components/supervised_user/core/browser/supervised_user_service.cc
@@ -236,7 +236,6 @@
     UpdateManualHosts();
     UpdateManualURLs();
     GetURLFilter()->SetFilterInitialized(true);
-    current_web_filter_type_ = url_filter_->GetWebFilterType();
   } else {
     // 5. Destroy filter.
     url_filter_->Clear();
@@ -299,40 +298,26 @@
   for (SupervisedUserServiceObserver& observer : observer_list_) {
     observer.OnURLFilterChanged();
   }
-
-  WebFilterType filter_type = url_filter_->GetWebFilterType();
-  if (current_web_filter_type_ != filter_type) {
-    url_filter_->ReportWebFilterTypeMetrics();
-    current_web_filter_type_ = filter_type;
-  }
 }
 
 void SupervisedUserService::OnSafeSitesSettingChanged() {
   for (SupervisedUserServiceObserver& observer : observer_list_) {
     observer.OnURLFilterChanged();
   }
-
-  WebFilterType filter_type = url_filter_->GetWebFilterType();
-  if (current_web_filter_type_ != filter_type) {
-    url_filter_->ReportWebFilterTypeMetrics();
-    current_web_filter_type_ = filter_type;
-  }
 }
 
 void SupervisedUserService::UpdateManualHosts() {
   const base::Value::Dict& dict =
       user_prefs_->GetDict(prefs::kSupervisedUserManualHosts);
   std::map<std::string, bool> host_map;
-  for (auto it : dict) {
-    DCHECK(it.second.is_bool());
-    host_map[it.first] = it.second.GetIfBool().value_or(false);
+  for (auto&& [host, value] : dict) {
+    DCHECK(value.is_bool());
+    host_map[host] = value.GetIfBool().value_or(false);
   }
 
-  if (url_filter_->SetManualHosts(std::move(host_map))) {
-    for (SupervisedUserServiceObserver& observer : observer_list_) {
-      observer.OnURLFilterChanged();
-    }
-    url_filter_->ReportManagedSiteListMetrics();
+  url_filter_->SetManualHosts(std::move(host_map));
+  for (SupervisedUserServiceObserver& observer : observer_list_) {
+    observer.OnURLFilterChanged();
   }
 }
 
@@ -340,16 +325,14 @@
   const base::Value::Dict& dict =
       user_prefs_->GetDict(prefs::kSupervisedUserManualURLs);
   std::map<GURL, bool> url_map;
-  for (auto it : dict) {
-    DCHECK(it.second.is_bool());
-    url_map[GURL(it.first)] = it.second.GetIfBool().value_or(false);
+  for (auto&& [url, value] : dict) {
+    DCHECK(value.is_bool());
+    url_map[GURL(url)] = value.GetIfBool().value_or(false);
   }
 
-  if (url_filter_->SetManualURLs(std::move(url_map))) {
-    for (SupervisedUserServiceObserver& observer : observer_list_) {
-      observer.OnURLFilterChanged();
-    }
-    url_filter_->ReportManagedSiteListMetrics();
+  url_filter_->SetManualURLs(std::move(url_map));
+  for (SupervisedUserServiceObserver& observer : observer_list_) {
+    observer.OnURLFilterChanged();
   }
 }
 
diff --git a/components/supervised_user/core/browser/supervised_user_service.h b/components/supervised_user/core/browser/supervised_user_service.h
index 373749a..4ef79592 100644
--- a/components/supervised_user/core/browser/supervised_user_service.h
+++ b/components/supervised_user/core/browser/supervised_user_service.h
@@ -241,15 +241,6 @@
   bool signout_required_after_supervision_enabled_ = false;
 #endif
 
-  // When there is change between WebFilterType::kTryToBlockMatureSites and
-  // WebFilterType::kCertainSites, both
-  // prefs::kDefaultSupervisedUserFilteringBehavior and
-  // prefs::kSupervisedUserSafeSites change. Uses this member to avoid duplicate
-  // reports. Initialized in the SetActive(). This default value is derived from
-  // default value of both prefs.
-  WebFilterType current_web_filter_type_ =
-      WebFilterType::kTryToBlockMatureSites;
-
   base::WeakPtrFactory<SupervisedUserService> weak_ptr_factory_{this};
 };
 
diff --git a/components/supervised_user/core/browser/supervised_user_service_unittest.cc b/components/supervised_user/core/browser/supervised_user_service_unittest.cc
index b4c2a17..882d3ee 100644
--- a/components/supervised_user/core/browser/supervised_user_service_unittest.cc
+++ b/components/supervised_user/core/browser/supervised_user_service_unittest.cc
@@ -26,6 +26,7 @@
 #include "components/signin/public/identity_manager/account_capabilities_test_mutator.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "components/supervised_user/core/browser/supervised_user_metrics_service.h"
 #include "components/supervised_user/core/browser/supervised_user_preferences.h"
 #include "components/supervised_user/core/browser/supervised_user_settings_service.h"
 #include "components/supervised_user/core/browser/supervised_user_sync_data_fake.h"
@@ -38,15 +39,28 @@
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_url_loader_factory.h"
+#include "supervised_user_metrics_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace supervised_user {
 namespace {
 
+constexpr char kWebFilterTypeHistogramName[] = "FamilyUser.WebFilterType";
+constexpr char kManagedSiteListHistogramName[] = "FamilyUser.ManagedSiteList";
+constexpr char kApprovedSitesCountHistogramName[] =
+    "FamilyUser.ManagedSiteListCount.Approved";
+constexpr char kBlockedSitesCountHistogramName[] =
+    "FamilyUser.ManagedSiteListCount.Blocked";
+
 const char kExampleUrl0[] = "http://www.example0.com";
 const char kExampleUrl1[] = "http://www.example1.com/123";
 
+class SupervisedUserMetricsServiceExtensionDelegateFake
+    : public SupervisedUserMetricsService::
+          SupervisedUserMetricsServiceExtensionDelegate {
+  bool RecordExtensionsMetrics() override { return false; }
+};
 
 class SupervisedUserServiceTestBase : public ::testing::Test {
  public:
@@ -68,8 +82,13 @@
         settings_service_, &sync_service_,
         std::make_unique<FakeURLFilterDelegate>(),
         std::make_unique<FakePlatformDelegate>());
-
     service_->Init();
+
+    SupervisedUserMetricsService::RegisterProfilePrefs(
+        syncable_pref_service_.registry());
+    metrics_service_ = std::make_unique<SupervisedUserMetricsService>(
+        &syncable_pref_service_, *service_,
+        std::make_unique<SupervisedUserMetricsServiceExtensionDelegateFake>());
   }
 
   void TearDown() override {
@@ -87,8 +106,8 @@
   sync_preferences::TestingPrefServiceSyncable syncable_pref_service_;
   SupervisedUserSyncDataFake supervised_user_sync_data_fake_;
   SupervisedUserSettingsService settings_service_;
-
   std::unique_ptr<SupervisedUserService> service_;
+  std::unique_ptr<SupervisedUserMetricsService> metrics_service_;
 };
 
 class SupervisedUserServiceTest : public SupervisedUserServiceTestBase {
@@ -138,33 +157,29 @@
 
   // This should not increase since setting user pref `kSupervisedUserSafeSites`
   // true won't take precedence over SupervisedUserPrefStore.
-  histogram_tester.ExpectUniqueSample(
-      SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest(),
-      /*sample=*/
-      WebFilterType::kTryToBlockMatureSites,
-      /*expected_bucket_count=*/0);
+  histogram_tester.ExpectUniqueSample(kWebFilterTypeHistogramName,
+                                      /*sample=*/
+                                      WebFilterType::kTryToBlockMatureSites,
+                                      /*expected_bucket_count=*/0);
 
   // This configuration sets URL Filter in WebFilterType::kAllowAllSites mode.
   syncable_pref_service_.SetSupervisedUserPref(prefs::kSupervisedUserSafeSites,
                                                base::Value(false));
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest(),
-      /*sample=*/
-      WebFilterType::kAllowAllSites,
-      /*expected_count=*/1);
+  histogram_tester.ExpectBucketCount(kWebFilterTypeHistogramName,
+                                     /*sample=*/
+                                     WebFilterType::kAllowAllSites,
+                                     /*expected_count=*/1);
 
   // Tests filter "only allow certain sites".
   syncable_pref_service_.SetSupervisedUserPref(
       prefs::kDefaultSupervisedUserFilteringBehavior,
       base::Value(static_cast<int>(FilteringBehavior::kBlock)));
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest(),
-      /*sample=*/
-      WebFilterType::kCertainSites,
-      /*expected_count=*/1);
-  histogram_tester.ExpectTotalCount(
-      SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest(),
-      /*expected_count=*/2);
+  histogram_tester.ExpectBucketCount(kWebFilterTypeHistogramName,
+                                     /*sample=*/
+                                     WebFilterType::kCertainSites,
+                                     /*expected_count=*/1);
+  histogram_tester.ExpectTotalCount(kWebFilterTypeHistogramName,
+                                    /*expected_count=*/2);
 }
 
 // Tests that changes to the allow or blocklist of the parent configuration are
@@ -188,16 +203,14 @@
   }
 
   histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest(),
+      kManagedSiteListHistogramName,
       /*sample=*/
       SupervisedUserURLFilter::ManagedSiteList::kBlockedListOnly,
       /*expected_count=*/1);
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetApprovedSitesCountHistogramNameForTest(),
-      /*sample=*/0, /*expected_count=*/1);
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetBlockedSitesCountHistogramNameForTest(),
-      /*sample=*/1, /*expected_count=*/1);
+  histogram_tester.ExpectBucketCount(kApprovedSitesCountHistogramName,
+                                     /*sample=*/0, /*expected_count=*/1);
+  histogram_tester.ExpectBucketCount(kBlockedSitesCountHistogramName,
+                                     /*sample=*/1, /*expected_count=*/1);
 
   // Approves `kExampleUrl0`.
   {
@@ -208,16 +221,14 @@
   }
 
   histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest(),
+      kManagedSiteListHistogramName,
       /*sample=*/
       SupervisedUserURLFilter::ManagedSiteList::kApprovedListOnly,
       /*expected_count=*/1);
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetApprovedSitesCountHistogramNameForTest(),
-      /*sample=*/1, /*expected_count=*/1);
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetBlockedSitesCountHistogramNameForTest(),
-      /*sample=*/0, /*expected_count=*/1);
+  histogram_tester.ExpectBucketCount(kApprovedSitesCountHistogramName,
+                                     /*sample=*/1, /*expected_count=*/1);
+  histogram_tester.ExpectBucketCount(kBlockedSitesCountHistogramName,
+                                     /*sample=*/0, /*expected_count=*/1);
 
   // Blocks `kExampleURL1`.
   {
@@ -228,26 +239,21 @@
   }
 
   histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest(),
+      kManagedSiteListHistogramName,
       /*sample=*/
       SupervisedUserURLFilter::ManagedSiteList::kBoth,
       /*expected_count=*/1);
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetApprovedSitesCountHistogramNameForTest(),
-      /*sample=*/1, /*expected_count=*/2);
-  histogram_tester.ExpectBucketCount(
-      SupervisedUserURLFilter::GetBlockedSitesCountHistogramNameForTest(),
-      /*sample=*/1, /*expected_count=*/2);
+  histogram_tester.ExpectBucketCount(kApprovedSitesCountHistogramName,
+                                     /*sample=*/1, /*expected_count=*/2);
+  histogram_tester.ExpectBucketCount(kBlockedSitesCountHistogramName,
+                                     /*sample=*/1, /*expected_count=*/2);
 
-  histogram_tester.ExpectTotalCount(
-      SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest(),
-      /*expected_count=*/3);
-  histogram_tester.ExpectTotalCount(
-      SupervisedUserURLFilter::GetApprovedSitesCountHistogramNameForTest(),
-      /*expected_count=*/3);
-  histogram_tester.ExpectTotalCount(
-      SupervisedUserURLFilter::GetBlockedSitesCountHistogramNameForTest(),
-      /*expected_count=*/3);
+  histogram_tester.ExpectTotalCount(kManagedSiteListHistogramName,
+                                    /*expected_count=*/3);
+  histogram_tester.ExpectTotalCount(kApprovedSitesCountHistogramName,
+                                    /*expected_count=*/3);
+  histogram_tester.ExpectTotalCount(kBlockedSitesCountHistogramName,
+                                    /*expected_count=*/3);
 }
 
 class SupervisedUserServiceTestUnsupervised
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.cc b/components/supervised_user/core/browser/supervised_user_url_filter.cc
index c1164be..0a2a1a4 100644
--- a/components/supervised_user/core/browser/supervised_user_url_filter.cc
+++ b/components/supervised_user/core/browser/supervised_user_url_filter.cc
@@ -4,7 +4,6 @@
 
 #include "components/supervised_user/core/browser/supervised_user_url_filter.h"
 
-#include <algorithm>
 #include <memory>
 #include <optional>
 #include <string>
@@ -163,7 +162,6 @@
   return lhs.size() == rhs.size() &&
          std::equal(lhs.begin(), lhs.end(), rhs.begin());
 }
-}  // namespace
 
 supervised_user::FilteringBehavior GetBehaviorFromSafeSearchClassification(
     safe_search_api::Classification classification) {
@@ -232,8 +230,6 @@
            std::string_view::npos));
 }
 
-namespace {
-
 // UMA histogram FamilyUser.ManagedSiteList.Conflict
 // Reports conflict when the user tries to access a url that has a match in
 // both of the allow list and the block list.
@@ -247,26 +243,6 @@
 const char kManagedSiteListSubdomainConflictTypeHistogramName[] =
     "FamilyUser.ManagedSiteList.SubdomainConflictType";
 
-// UMA histogram FamilyUser.WebFilterType
-// Reports WebFilterType which indicates web filter behaviour are used for
-// current Family Link user.
-constexpr char kWebFilterTypeHistogramName[] = "FamilyUser.WebFilterType";
-
-// UMA histogram FamilyUser.ManualSiteListType
-// Reports ManualSiteListType which indicates approved list and blocked list
-// usage for current Family Link user.
-constexpr char kManagedSiteListHistogramName[] = "FamilyUser.ManagedSiteList";
-
-// UMA histogram FamilyUser.ManagedSiteListCount.Approved
-// Reports the number of approved urls and domains for current Family Link user.
-constexpr char kApprovedSitesCountHistogramName[] =
-    "FamilyUser.ManagedSiteListCount.Approved";
-
-// UMA histogram FamilyUser.ManagedSiteListCount.Blocked
-// Reports the number of blocked urls and domains for current Family Link user.
-constexpr char kBlockedSitesCountHistogramName[] =
-    "FamilyUser.ManagedSiteListCount.Blocked";
-
 constexpr std::string_view kHttpProtocol = "http://";
 constexpr std::string_view kHttpsProtocol = "https://";
 constexpr std::string_view kWwwSubdomain = "www.";
@@ -367,28 +343,6 @@
 }
 
 // static
-const char* SupervisedUserURLFilter::GetWebFilterTypeHistogramNameForTest() {
-  return kWebFilterTypeHistogramName;
-}
-
-// static
-const char* SupervisedUserURLFilter::GetManagedSiteListHistogramNameForTest() {
-  return kManagedSiteListHistogramName;
-}
-
-// static
-const char*
-SupervisedUserURLFilter::GetApprovedSitesCountHistogramNameForTest() {
-  return kApprovedSitesCountHistogramName;
-}
-
-// static
-const char*
-SupervisedUserURLFilter::GetBlockedSitesCountHistogramNameForTest() {
-  return kBlockedSitesCountHistogramName;
-}
-
-// static
 const char*
 SupervisedUserURLFilter::GetManagedSiteListConflictHistogramNameForTest() {
   return kManagedSiteListConflictHistogramName;
@@ -411,6 +365,22 @@
       << "SupervisedUserURLFilter value not supported: " << behavior_value;
   return static_cast<FilteringBehavior>(behavior_value);
 }
+SupervisedUserURLFilter::ManagedSiteList
+SupervisedUserURLFilter::Statistics::GetManagedSiteList() const {
+  if (allowed_hosts_count + blocked_hosts_count + allowed_urls_count +
+          blocked_urls_count ==
+      0) {
+    return ManagedSiteList::kEmpty;
+  }
+  if (allowed_hosts_count + allowed_urls_count > 0 &&
+      blocked_hosts_count + blocked_urls_count > 0) {
+    return ManagedSiteList::kBoth;
+  }
+  if (allowed_hosts_count + allowed_urls_count > 0) {
+    return ManagedSiteList::kApprovedListOnly;
+  }
+  return ManagedSiteList::kBlockedListOnly;
+}
 
 // static
 // Note: The transformations applied to pattern (e.g. protocol/subdomain
@@ -649,7 +619,7 @@
   return default_behavior_;
 }
 
-bool SupervisedUserURLFilter::SetManualHosts(
+void SupervisedUserURLFilter::SetManualHosts(
     std::map<std::string, bool> host_map) {
   // TODO(b/305229682): Update this method to received the two
   // parental lists.
@@ -666,29 +636,31 @@
     }
   }
 
-  if (ContainersAreEqual(blocked_host_list_, new_blocked_host_list) &&
-      ContainersAreEqual(allowed_host_list_, new_allowed_host_list)) {
-    return false;
-  }
-
   blocked_host_list_ = std::move(new_blocked_host_list);
   allowed_host_list_ = std::move(new_allowed_host_list);
-  return true;
+
+  statistics_.blocked_hosts_count = blocked_host_list_.size();
+  statistics_.allowed_hosts_count = allowed_host_list_.size();
 }
 
-bool SupervisedUserURLFilter::IsManualHostsEmpty() const {
-  return allowed_host_list_.empty() && blocked_host_list_.empty();
-}
-
-bool SupervisedUserURLFilter::SetManualURLs(std::map<GURL, bool> url_map) {
+void SupervisedUserURLFilter::SetManualURLs(std::map<GURL, bool> url_map) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (ContainersAreEqual(url_map_, url_map)) {
-    return false;
-  }
-
   url_map_ = std::move(url_map);
-  return true;
+
+  statistics_.blocked_urls_count = 0;
+  statistics_.allowed_urls_count = 0;
+  for (auto&& [gurl, is_allowed] : url_map_) {
+    if (is_allowed) {
+      statistics_.allowed_urls_count++;
+    } else {
+      statistics_.blocked_urls_count++;
+    }
+  }
+}
+
+SupervisedUserURLFilter::Statistics
+SupervisedUserURLFilter::GetFilteringStatistics() const {
+  return statistics_;
 }
 
 void SupervisedUserURLFilter::Clear() {
@@ -720,63 +692,6 @@
              : WebFilterType::kAllowAllSites;
 }
 
-bool SupervisedUserURLFilter::EmitURLFilterMetrics() const {
-  // Do not record metrics if the parent web filter configuration is not
-  // applied to the user.
-  if (!is_filter_initialized_) {
-    return false;
-  }
-
-  ReportWebFilterTypeMetrics();
-  ReportManagedSiteListMetrics();
-  return true;
-}
-
-void SupervisedUserURLFilter::ReportWebFilterTypeMetrics() const {
-  base::UmaHistogramEnumeration(kWebFilterTypeHistogramName,
-                                GetWebFilterType());
-}
-
-void SupervisedUserURLFilter::ReportManagedSiteListMetrics() const {
-  if (url_map_.empty() && allowed_host_list_.empty() &&
-      blocked_host_list_.empty()) {
-    base::UmaHistogramEnumeration(kManagedSiteListHistogramName,
-                                  ManagedSiteList::kEmpty);
-    base::UmaHistogramCounts1000(kApprovedSitesCountHistogramName, 0);
-    base::UmaHistogramCounts1000(kBlockedSitesCountHistogramName, 0);
-    return;
-  }
-
-  ManagedSiteList managed_site_list = ManagedSiteList::kMaxValue;
-  int approved_count = 0;
-  int blocked_count = 0;
-  for (const auto& it : url_map_) {
-    if (it.second) {
-      approved_count++;
-    } else {
-      blocked_count++;
-    }
-  }
-
-  approved_count += allowed_host_list_.size();
-  blocked_count += blocked_host_list_.size();
-
-  if (approved_count > 0 && blocked_count > 0) {
-    managed_site_list = ManagedSiteList::kBoth;
-  } else if (approved_count > 0) {
-    managed_site_list = ManagedSiteList::kApprovedListOnly;
-  } else {
-    managed_site_list = ManagedSiteList::kBlockedListOnly;
-  }
-
-  base::UmaHistogramCounts1000(kApprovedSitesCountHistogramName,
-                               approved_count);
-  base::UmaHistogramCounts1000(kBlockedSitesCountHistogramName, blocked_count);
-
-  base::UmaHistogramEnumeration(kManagedSiteListHistogramName,
-                                managed_site_list);
-}
-
 void SupervisedUserURLFilter::SetFilterInitialized(bool is_filter_initialized) {
   is_filter_initialized_ = is_filter_initialized;
 }
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.h b/components/supervised_user/core/browser/supervised_user_url_filter.h
index b8b3496f..4b90ba9 100644
--- a/components/supervised_user/core/browser/supervised_user_url_filter.h
+++ b/components/supervised_user/core/browser/supervised_user_url_filter.h
@@ -120,6 +120,17 @@
     }
   };
 
+  // Encapsulates statistics about this URL filter.
+  struct Statistics {
+    bool operator==(const Statistics& other) const = default;
+    ManagedSiteList GetManagedSiteList() const;
+
+    std::size_t allowed_hosts_count;
+    std::size_t blocked_hosts_count;
+    std::size_t allowed_urls_count;
+    std::size_t blocked_urls_count;
+  };
+
   // Provides access to functionality from services on which we don't want
   // to depend directly.
   class Delegate {
@@ -144,10 +155,6 @@
 
   virtual ~SupervisedUserURLFilter();
 
-  static const char* GetWebFilterTypeHistogramNameForTest();
-  static const char* GetManagedSiteListHistogramNameForTest();
-  static const char* GetApprovedSitesCountHistogramNameForTest();
-  static const char* GetBlockedSitesCountHistogramNameForTest();
   static const char* GetManagedSiteListConflictHistogramNameForTest();
   static const char* GetManagedSiteListConflictTypeHistogramNameForTest();
 
@@ -206,19 +213,14 @@
 
   FilteringBehavior GetDefaultFilteringBehavior() const;
 
-  // Sets the set of manually allowed or blocked hosts. Returns true if new
-  // value held different value from existing values.
-  // TODO(crbug.com/413654322): change name to reflect that the operation is
-  // no-op if new value is equal to current one.
-  bool SetManualHosts(std::map<std::string, bool> host_map);
+  // Sets the set of manually allowed or blocked hosts.
+  void SetManualHosts(std::map<std::string, bool> host_map);
 
-  bool IsManualHostsEmpty() const;
+  // Sets or gets the set of manually allowed or blocked URLs.
+  void SetManualURLs(std::map<GURL, bool> url_map);
 
-  // Sets the set of manually allowed or blocked URLs. Returns true if new value
-  // held different value from existing values.
-  // TODO(crbug.com/413654322): change name to reflect that the operation is
-  // no-op if new value is equal to current one.
-  bool SetManualURLs(std::map<GURL, bool> url_map);
+  // Returns summary of url filtering settings.
+  Statistics GetFilteringStatistics() const;
 
   // Removes all filter entries, clears the async checker if present, and resets
   // the default behavior to "allow".
@@ -229,20 +231,8 @@
 
   WebFilterType GetWebFilterType() const;
 
-  // Emits URL filter metrics based on the parent web filter configuration
-  // applied to the supervised user. Returns true if one or more metrics were
-  // emitted.
-  bool EmitURLFilterMetrics() const;
-
-  // Reports FamilyUser.WebFilterType metrics based on parent web filter type
-  // configuration.
-  void ReportWebFilterTypeMetrics() const;
-
-  // Reports FamilyUser.ManagedSiteList metrics based on parent web filter allow
-  // and blocklist configuration.
-  void ReportManagedSiteListMetrics() const;
-
-  // Set value for `is_filter_initialized_`.
+  // Set or get the value for `is_filter_initialized_`.
+  bool IsFilterInitialized() const { return is_filter_initialized_; }
   void SetFilterInitialized(bool is_filter_initialized);
 
   // Sets safe_search_api::URLCheckerClient for SafeSites classification.
@@ -287,6 +277,9 @@
   std::set<std::string> blocked_host_list_;
   std::set<std::string> allowed_host_list_;
 
+  // Statistics about this filter configuration
+  Statistics statistics_;
+
   const raw_ref<PrefService> user_prefs_;
 
   std::unique_ptr<Delegate> delegate_;
diff --git a/components/supervised_user/test_support/family_link_settings_state_management.cc b/components/supervised_user/test_support/family_link_settings_state_management.cc
index 2d0c2a8..501dab8 100644
--- a/components/supervised_user/test_support/family_link_settings_state_management.cc
+++ b/components/supervised_user/test_support/family_link_settings_state_management.cc
@@ -204,7 +204,10 @@
 }
 
 bool UrlFiltersAreEmpty(const FamilyLinkSettingsState::Services& services) {
-  return services.supervised_user_service->GetURLFilter()->IsManualHostsEmpty();
+  return services.supervised_user_service->GetURLFilter()
+             ->GetFilteringStatistics()
+             .GetManagedSiteList() ==
+         SupervisedUserURLFilter::ManagedSiteList::kEmpty;
 }
 
 bool ToggleHasExpectedValue(const FamilyLinkSettingsState::Services& services,
diff --git a/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java b/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java
index 4139552..0b835a4a 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/SyncServiceImpl.java
@@ -14,13 +14,13 @@
 import org.json.JSONException;
 
 import org.chromium.base.Callback;
-import org.chromium.base.Promise;
 import org.chromium.base.ThreadUtils.ThreadChecker;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountsChangeObserver;
+import org.chromium.components.signin.base.AccountInfo;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.google_apis.gaia.GoogleServiceAuthError;
 
@@ -59,8 +59,7 @@
         mSyncServiceAndroidBridge = ptr;
         AccountManagerFacade accountManagerFacade = AccountManagerFacadeProvider.getInstance();
         accountManagerFacade.addObserver(this);
-        Promise<List<CoreAccountInfo>> accountsPromise =
-                AccountManagerFacadeProvider.getInstance().getCoreAccountInfos();
+        var accountsPromise = AccountManagerFacadeProvider.getInstance().getAccounts();
         if (accountsPromise.isFulfilled()) {
             // The promise is already fulfilled - call immediately. If the promise is not fulfilled,
             // `keepSettingsOnlyForAccountManagerAccounts` will be invoked by
@@ -450,13 +449,12 @@
     @Override
     /* AccountsChangeObserver implementation. */
     public void onCoreAccountInfosChanged() {
-        Promise<List<CoreAccountInfo>> accountsPromise =
-                AccountManagerFacadeProvider.getInstance().getCoreAccountInfos();
+        var accountsPromise = AccountManagerFacadeProvider.getInstance().getAccounts();
         assert accountsPromise.isFulfilled();
         keepSettingsOnlyForAccountManagerAccounts(accountsPromise.getResult());
     }
 
-    private void keepSettingsOnlyForAccountManagerAccounts(List<CoreAccountInfo> accounts) {
+    private void keepSettingsOnlyForAccountManagerAccounts(List<AccountInfo> accounts) {
         int size = accounts.size();
         String[] gaiaIds = new String[size];
         for (int i = 0; i < size; ++i) {
diff --git a/components/sync/engine/sync_scheduler_impl.cc b/components/sync/engine/sync_scheduler_impl.cc
index 5f3c654..cf2dc78 100644
--- a/components/sync/engine/sync_scheduler_impl.cc
+++ b/components/sync/engine/sync_scheduler_impl.cc
@@ -61,17 +61,15 @@
     case CLIENT_DATA_OBSOLETE:
     case DISABLED_BY_ADMIN:
     case ENCRYPTION_OBSOLETE:
-      // If we send terminate sync early then `sync_cycle_ended` notification
-      // would not be sent. If there were no actions then `ACTIONABLE_ERROR`
-      // notification wouldn't be sent either. Then the UI layer would be left
-      // waiting forever. So assert we would send something.
-      DCHECK_NE(error.action, UNKNOWN_ACTION);
       return true;
     case CONFLICT:
     case INVALID_MESSAGE:
-      NOTREACHED();
+      // These cases should not occur here, but since the error ultimately comes
+      // from the server, handle them gracefully (by not doing anything in
+      // particular).
+      return false;
   }
-  return false;
+  NOTREACHED();
 }
 
 bool IsActionableProtocolError(const SyncProtocolError& error) {
diff --git a/components/sync/protocol/shared_tab_group_account_data_specifics.proto b/components/sync/protocol/shared_tab_group_account_data_specifics.proto
index 313eead..ce0dcba 100644
--- a/components/sync/protocol/shared_tab_group_account_data_specifics.proto
+++ b/components/sync/protocol/shared_tab_group_account_data_specifics.proto
@@ -33,6 +33,13 @@
 
   // Timestamp when the message is updated.
   optional int64 update_time_windows_epoch_micros = 5;
+
+  // A mechanism to identify the client version that wrote this specifics.
+  // Designed to aid business logic when reading newly added fields that
+  // didn't exist in older clients.
+  // The client version must be incremented whenever a new field is added to the
+  // specifics.
+  optional int32 version = 6;
 }
 
 // Stores account-specific metadata about a shared tab.
diff --git a/components/sync/protocol/shared_tab_group_data_specifics.proto b/components/sync/protocol/shared_tab_group_data_specifics.proto
index ba0ada94..af2b419 100644
--- a/components/sync/protocol/shared_tab_group_data_specifics.proto
+++ b/components/sync/protocol/shared_tab_group_data_specifics.proto
@@ -30,6 +30,13 @@
 
   optional int64 update_time_windows_epoch_micros = 5;
 
+  // A mechanism to identify the client version that wrote this specifics.
+  // Designed to aid business logic when reading newly added fields that
+  // didn't exist in older clients.
+  // The client version must be incremented whenever a new field is added to the
+  // specifics.
+  optional int32 version = 6;
+
   reserved 2;
 }
 
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc
index 55ef7007..2645d02 100644
--- a/components/sync/service/sync_service_impl.cc
+++ b/components/sync/service/sync_service_impl.cc
@@ -352,17 +352,6 @@
   sync_prefs_.MaybeMigrateCustomPassphrasePref(
       signin::GaiaIdHash::FromGaiaId(GetAccountInfo().gaia));
 
-  if (!IsLocalSyncEnabled()) {
-    const bool account_info_fully_loaded =
-        auth_manager_->IsActiveAccountInfoFullyLoaded();
-    base::UmaHistogramBoolean("Sync.Startup.AccountInfoFullyLoaded2",
-                              account_info_fully_loaded);
-    if (!account_info_fully_loaded) {
-      base::UmaHistogramBoolean("Sync.Startup.SignedInWithoutAccountInfo2",
-                                IsSignedIn());
-    }
-  }
-
   // Update selected types prefs if a policy is applied.
   sync_prefs_policy_handler_ = std::make_unique<SyncPrefsPolicyHandler>(this);
 
@@ -792,21 +781,10 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
   user_settings_->ClearSyncFeatureDisabledViaDashboard();
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
-  // If the Sync engine was already initialized (probably running in transport
-  // mode), just reconfigure.
-  if (engine_ && engine_->IsInitialized()) {
-    ConfigureDataTypeManager(CONFIGURE_REASON_RECONFIGURATION,
-                             /*bypass_setup_in_progress_check=*/false);
-  } else {
-    // Otherwise try to start up. Note that there might still be other disable
-    // reasons remaining, in which case this will effectively do nothing.
-    TryStart();
-  }
 
   DVLOG(2) << "Notify observers on SetSyncFeatureRequested";
   NotifyObservers();
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 SyncUserSettings* SyncServiceImpl::GetUserSettings() {
diff --git a/components/sync_preferences/README.md b/components/sync_preferences/README.md
index 2c51c46..d822c10 100644
--- a/components/sync_preferences/README.md
+++ b/components/sync_preferences/README.md
@@ -30,7 +30,14 @@
   * Specify the matching pref type (browser or OS, priority or not).
   * Consider whether your pref is particularly privacy-sensitive, and if so,
     point this out to the reviewer. The most common case of this is when a pref
-    records URLs or other history-like data.
+    records URLs or other history-like data. Such prefs should be marked with
+    `PrefSensitivity::kSensitiveRequiresHistory`.
+    * [For priority prefs only] There exists functionality to exempt the
+       priority pref from any sync user toggle, i.e. pref is synced even with
+       sync toggle for preferences turned off, via
+       `PrefSensitivity::kExemptFromUserControlWhileSignedIn`. This should be
+       extremely rare, reach out to chrome-sync-dev@google.com if you really
+       think the pref needs this exemption.
 * Add an entry to the `SyncablePref` enum in
   tools/metrics/histograms/metadata/sync/enums.xml.
 
@@ -40,12 +47,15 @@
   **responsibility of the code reviewer** to ensure that new syncable prefs
   don't have undue privacy impact. In particular:
 * If the pref contains URLs (example: site permissions), it **must** be marked
-  as `is_history_opt_in_required = true`, and it will only be synced if the
-  user has opted in to history sync (in addition to preferences sync).
+  with `PrefSensitivity::kSensitiveRequiresHistory`, and it will only be synced
+  if the user has opted in to history sync (in addition to preferences sync).
 * If the pref is marked as "priority" (`syncer::PRIORITY_PREFERENCES` or
   `syncer::OS_PRIORITY_PREFERENCES`), then it will not be encrypted. Carefully
   consider if it actually needs to be "priority". (The most common reason for
   this is when the pref needs to be consumed on the server side.)
+* Marking pref with `PrefSensitivity::kExemptFromUserControlWhileSignedIn`
+  decouples the pref from sync user toggles. Carefully consider/discuss if this
+  is desired. Note that this is only available for priority prefs.
 * In any other cases that are unclear or questionable, reach out to
   chrome-privacy-core@google.com, or to rainhard@ directly.
 
diff --git a/components/sync_preferences/common_syncable_prefs_database.cc b/components/sync_preferences/common_syncable_prefs_database.cc
index 09626e0..3f00c298 100644
--- a/components/sync_preferences/common_syncable_prefs_database.cc
+++ b/components/sync_preferences/common_syncable_prefs_database.cc
@@ -354,7 +354,8 @@
           MergeBehavior::kNone}},
         {kSyncableAlwaysSyncingPriorityPrefForTesting,
          {syncable_prefs_ids::kSyncableAlwaysSyncingPriorityPrefForTesting,
-          syncer::PRIORITY_PREFERENCES, PrefSensitivity::kNone,
+          syncer::PRIORITY_PREFERENCES,
+          PrefSensitivity::kExemptFromUserControlWhileSignedIn,
           MergeBehavior::kNone}},
     });
 
@@ -376,18 +377,4 @@
           kCommonSyncablePrefsAllowlist.end()};
 }
 
-bool CommonSyncablePrefsDatabase::IsPreferenceAlwaysSyncing(
-    std::string_view pref_name) const {
-  CHECK(base::FeatureList::IsEnabled(
-      syncer::kSyncSupportAlwaysSyncingPriorityPreferences));
-  // TODO(crbug.com/412602018): Consider renaming and using the
-  // `PrefSensitivity` enum instead, since it currently helps with something
-  // similar in regards to history opt-in and the options would be mutually
-  // exclusive.
-  static constexpr auto kAlwaysSyncingPrefsAllowlist =
-      base::MakeFixedFlatSet<std::string_view>(
-          {kSyncableAlwaysSyncingPriorityPrefForTesting});
-  return kAlwaysSyncingPrefsAllowlist.contains(pref_name);
-}
-
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/common_syncable_prefs_database.h b/components/sync_preferences/common_syncable_prefs_database.h
index 2c3520b..8f9f478 100644
--- a/components/sync_preferences/common_syncable_prefs_database.h
+++ b/components/sync_preferences/common_syncable_prefs_database.h
@@ -37,8 +37,6 @@
 
   std::map<std::string_view, SyncablePrefMetadata> GetAllSyncablePrefsForTest()
       const;
-
-  bool IsPreferenceAlwaysSyncing(std::string_view pref_name) const override;
 };
 
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
index 9d77fd1..a4f0894e 100644
--- a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
+++ b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
@@ -68,16 +68,14 @@
     {kCustomMergePref,
      {0, syncer::PREFERENCES, PrefSensitivity::kNone, MergeBehavior::kCustom}},
     {kAlwaysSyncingPriorityPrefName,
-     {0, syncer::PRIORITY_PREFERENCES, PrefSensitivity::kNone,
+     {0, syncer::PRIORITY_PREFERENCES,
+      PrefSensitivity::kExemptFromUserControlWhileSignedIn,
       MergeBehavior::kNone}},
 };
 
 constexpr char kUserSelectedTypesPrefName[] =
     "dual_layer_user_pref_store.user_selected_sync_types";
 
-const std::set<std::string_view> kAlwaysSyncingPrefs = {
-    kAlwaysSyncingPriorityPrefName};
-
 base::Value MakeDict(
     const std::vector<std::pair<std::string, std::string>>& values) {
   base::Value::Dict dict;
@@ -148,10 +146,7 @@
 class TestPrefModelAssociatorClient : public PrefModelAssociatorClient {
  public:
   TestPrefModelAssociatorClient()
-      : syncable_prefs_database_(kSyncablePrefsDatabase) {
-    syncable_prefs_database_.SetAlwaysSyncingPrefs(
-        {kAlwaysSyncingPriorityPrefName});
-  }
+      : syncable_prefs_database_(kSyncablePrefsDatabase) {}
 
   // PrefModelAssociatorClient implementation.
   base::Value MaybeMergePreferenceValues(
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc
index ec795024..282d36d 100644
--- a/components/sync_preferences/pref_service_syncable_unittest.cc
+++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -111,7 +111,8 @@
       MergeBehavior::kNone}},
 #endif
     {kAlwaysSyncingPriorityPrefName,
-     {11, syncer::PRIORITY_PREFERENCES, PrefSensitivity::kNone,
+     {11, syncer::PRIORITY_PREFERENCES,
+      PrefSensitivity::kExemptFromUserControlWhileSignedIn,
       MergeBehavior::kNone}},
 };
 
@@ -406,10 +407,7 @@
 class TestPrefModelAssociatorClient : public PrefModelAssociatorClient {
  public:
   TestPrefModelAssociatorClient()
-      : syncable_prefs_database_(kSyncablePrefsDatabase) {
-    syncable_prefs_database_.SetAlwaysSyncingPrefs(
-        {kAlwaysSyncingPriorityPrefName});
-  }
+      : syncable_prefs_database_(kSyncablePrefsDatabase) {}
 
   TestPrefModelAssociatorClient(const TestPrefModelAssociatorClient&) = delete;
   TestPrefModelAssociatorClient& operator=(
diff --git a/components/sync_preferences/syncable_prefs_database.cc b/components/sync_preferences/syncable_prefs_database.cc
index 9c97b08..9f6fb12 100644
--- a/components/sync_preferences/syncable_prefs_database.cc
+++ b/components/sync_preferences/syncable_prefs_database.cc
@@ -7,6 +7,7 @@
 #include <string_view>
 
 #include "base/logging.h"
+#include "components/sync/base/features.h"
 
 namespace sync_preferences {
 
@@ -23,4 +24,15 @@
   return metadata->merge_behavior() != MergeBehavior::kNone;
 }
 
+bool SyncablePrefsDatabase::IsPreferenceAlwaysSyncing(
+    std::string_view pref_name) const {
+  CHECK(base::FeatureList::IsEnabled(
+      syncer::kSyncSupportAlwaysSyncingPriorityPreferences));
+  std::optional<SyncablePrefMetadata> metadata =
+      GetSyncablePrefMetadata(pref_name);
+  CHECK(metadata.has_value());
+  return metadata->pref_sensitivity() ==
+         PrefSensitivity::kExemptFromUserControlWhileSignedIn;
+}
+
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/syncable_prefs_database.h b/components/sync_preferences/syncable_prefs_database.h
index b66bb35..941a4a1 100644
--- a/components/sync_preferences/syncable_prefs_database.h
+++ b/components/sync_preferences/syncable_prefs_database.h
@@ -12,15 +12,22 @@
 #include "base/check.h"
 #include "build/build_config.h"
 #include "components/sync/base/data_type.h"
+#include "components/sync/base/user_selectable_type.h"
 
 namespace sync_preferences {
 
+// TODO(crbug.com/412602018): Rename enum and enum values to better reflect
+// their purpose.
 enum class PrefSensitivity {
-  // The pref is not sensitive and does not require any additional opt-ins.
+  // The pref is not sensitive and requires only the preference sync toggle to
+  // be enabled for syncing.
   kNone,
   // The pref contains sensitive information and requires history opt-in to
   // allow syncing.
   kSensitiveRequiresHistory,
+  // The pref is exempt from user control and hence, decoupled from any user
+  // toggle. Note that this is only supported for priority prefs.
+  kExemptFromUserControlWhileSignedIn,
 };
 
 enum class MergeBehavior {
@@ -62,6 +69,10 @@
           )
         << "Invalid type " << data_type_
         << " for syncable pref with id=" << syncable_pref_id_;
+    CHECK(pref_sensitivity_ !=
+              PrefSensitivity::kExemptFromUserControlWhileSignedIn ||
+          data_type_ == syncer::PRIORITY_PREFERENCES)
+        << "Always syncing prefs must be priority prefs.";
   }
 
   // Returns the unique ID corresponding to the syncable preference.
@@ -115,7 +126,7 @@
 
   // Returns whether `pref_name` is part of the allowlist of preferences that
   // are always synced, irrespective of the preference sync user toggle.
-  virtual bool IsPreferenceAlwaysSyncing(std::string_view pref_name) const = 0;
+  bool IsPreferenceAlwaysSyncing(std::string_view pref_name) const;
 };
 
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/test_syncable_prefs_database.cc b/components/sync_preferences/test_syncable_prefs_database.cc
index 34be0a5..0354a8b 100644
--- a/components/sync_preferences/test_syncable_prefs_database.cc
+++ b/components/sync_preferences/test_syncable_prefs_database.cc
@@ -24,14 +24,4 @@
   return std::nullopt;
 }
 
-bool TestSyncablePrefsDatabase::IsPreferenceAlwaysSyncing(
-    std::string_view pref_name) const {
-  return always_syncing_prefs_.contains(pref_name);
-}
-
-void TestSyncablePrefsDatabase::SetAlwaysSyncingPrefs(
-    const std::set<std::string_view>& always_syncing_prefs) {
-  always_syncing_prefs_ = always_syncing_prefs;
-}
-
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/test_syncable_prefs_database.h b/components/sync_preferences/test_syncable_prefs_database.h
index a8779de..8f08aed 100644
--- a/components/sync_preferences/test_syncable_prefs_database.h
+++ b/components/sync_preferences/test_syncable_prefs_database.h
@@ -26,11 +26,6 @@
   std::optional<sync_preferences::SyncablePrefMetadata> GetSyncablePrefMetadata(
       std::string_view pref_name) const override;
 
-  bool IsPreferenceAlwaysSyncing(std::string_view pref_name) const override;
-
-  void SetAlwaysSyncingPrefs(
-      const std::set<std::string_view>& always_syncing_prefs);
-
  private:
   PrefsMap syncable_prefs_map_;
   std::set<std::string_view> always_syncing_prefs_;
diff --git a/components/test/data/viz/yuv_stripes_offset_graphite.png b/components/test/data/viz/yuv_stripes_offset_graphite.png
index 76e85bfd..6fcd762 100644
--- a/components/test/data/viz/yuv_stripes_offset_graphite.png
+++ b/components/test/data/viz/yuv_stripes_offset_graphite.png
Binary files differ
diff --git a/components/trusted_vault/features.cc b/components/trusted_vault/features.cc
index 2fe5f9ba..7e80153 100644
--- a/components/trusted_vault/features.cc
+++ b/components/trusted_vault/features.cc
@@ -21,4 +21,8 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
 
+BASE_FEATURE(kEnableRegistrationStateSecurityDomainFiltering,
+             "EnableRegistrationStateSecurityDomainFiltering",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 }  // namespace trusted_vault
diff --git a/components/trusted_vault/features.h b/components/trusted_vault/features.h
index cedeb98..11b4468 100644
--- a/components/trusted_vault/features.h
+++ b/components/trusted_vault/features.h
@@ -21,6 +21,8 @@
 BASE_DECLARE_FEATURE(kEnableICloudKeychainRecoveryFactor);
 #endif
 
+BASE_DECLARE_FEATURE(kEnableRegistrationStateSecurityDomainFiltering);
+
 }  // namespace trusted_vault
 
 #endif  // COMPONENTS_TRUSTED_VAULT_FEATURES_H_
diff --git a/components/trusted_vault/icloud_keychain_recovery_factor.cc b/components/trusted_vault/icloud_keychain_recovery_factor.cc
index ac0f8f1a..e223cf25 100644
--- a/components/trusted_vault/icloud_keychain_recovery_factor.cc
+++ b/components/trusted_vault/icloud_keychain_recovery_factor.cc
@@ -11,6 +11,7 @@
 #include "base/strings/strcat.h"
 #include "base/task/bind_post_task.h"
 #include "components/trusted_vault/icloud_recovery_key_mac.h"
+#include "components/trusted_vault/proto/vault.pb.h"
 #include "components/trusted_vault/securebox.h"
 #include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_crypto.h"
@@ -111,6 +112,7 @@
   ongoing_download_registration_state_request_for_recovery_ =
       connection->DownloadAuthenticationFactorsRegistrationState(
           *primary_account_,
+          {trusted_vault_pb::SecurityDomainMember::MEMBER_TYPE_ICLOUD_KEYCHAIN},
           base::BindOnce(&ICloudKeychainRecoveryFactor::
                              OnRecoveryFactorStateDownloadedForRecovery,
                          // `this` outlives `ongoing_request_for_recovery_`.
@@ -288,6 +290,7 @@
   ongoing_download_registration_state_request_for_registration_ =
       connection->DownloadAuthenticationFactorsRegistrationState(
           *primary_account_,
+          {trusted_vault_pb::SecurityDomainMember::MEMBER_TYPE_ICLOUD_KEYCHAIN},
           base::BindOnce(&ICloudKeychainRecoveryFactor::
                              OnRecoveryFactorStateDownloadedForRegistration,
                          // `this` outlives `ongoing_request_for_registration_`.
diff --git a/components/trusted_vault/icloud_keychain_recovery_factor_unittest.mm b/components/trusted_vault/icloud_keychain_recovery_factor_unittest.mm
index a3c3d8f5..29e9ffb 100644
--- a/components/trusted_vault/icloud_keychain_recovery_factor_unittest.mm
+++ b/components/trusted_vault/icloud_keychain_recovery_factor_unittest.mm
@@ -205,8 +205,6 @@
       DownloadAuthenticationFactorsRegistrationStateResult&&
           download_registration_state_result,
       LocalRecoveryFactor::AttemptRecoveryCallback recovery_callback) {
-    EXPECT_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState);
-
     base::RunLoop run_loop;
     TrustedVaultConnection::
         DownloadAuthenticationFactorsRegistrationStateCallback
@@ -215,10 +213,12 @@
       // A dedicated, nested run loop is required for fetching keys from the
       // iCloud Keychain.
       base::RunLoop fetch_icloud_key_run_loop;
-      ON_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState(
-                                 account_info(), _, _))
-          .WillByDefault(
+      EXPECT_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState(
+                                     account_info(), _, _, _))
+          .WillOnce(
               [&](const CoreAccountInfo& account_info,
+                  std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+                      recovery_factor_filter,
                   TrustedVaultConnection::
                       DownloadAuthenticationFactorsRegistrationStateCallback
                           callback,
@@ -257,19 +257,22 @@
     // Keychain.
     base::RunLoop fetch_icloud_key_run_loop;
     EXPECT_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState(
-                                   account_info(), _, _))
-        .WillOnce([&](const CoreAccountInfo& account_info,
-                      TrustedVaultConnection::
-                          DownloadAuthenticationFactorsRegistrationStateCallback
-                              callback,
-                      base::RepeatingClosure keep_alive_callback) {
-          download_state_callback = std::move(callback);
-          // Note: Quitting the iCloud Keychain run loop here is ok-ish,
-          // because DownloadAuthenticationFactorsRegistrationState is
-          // expected to be called after fetching iCloud Keychain keys.
-          fetch_icloud_key_run_loop.Quit();
-          return std::make_unique<TrustedVaultConnection::Request>();
-        });
+                                   account_info(), _, _, _))
+        .WillOnce(
+            [&](const CoreAccountInfo& account_info,
+                std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+                    recovery_factor_filter,
+                TrustedVaultConnection::
+                    DownloadAuthenticationFactorsRegistrationStateCallback
+                        callback,
+                base::RepeatingClosure keep_alive_callback) {
+              download_state_callback = std::move(callback);
+              // Note: Quitting the iCloud Keychain run loop here is ok-ish,
+              // because DownloadAuthenticationFactorsRegistrationState is
+              // expected to be called after fetching iCloud Keychain keys.
+              fetch_icloud_key_run_loop.Quit();
+              return std::make_unique<TrustedVaultConnection::Request>();
+            });
     TrustedVaultDeviceRegistrationStateForUMA status =
         recovery_factor()->MaybeRegister(connection(),
                                          std::move(registration_callback));
@@ -446,7 +449,8 @@
 TEST_F(ICloudKeychainRecoveryFactorTest,
        ShouldNotAttemptKeyRecoveryWithNonConstantKeys) {
   StoreKeys(account_info(), kVaultKeys, kLastKeyVersion);
-  EXPECT_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState)
+  EXPECT_CALL(*connection(),
+              DownloadAuthenticationFactorsRegistrationState(_, _, _, _))
       .Times(0);
 
   base::MockCallback<LocalRecoveryFactor::AttemptRecoveryCallback>
@@ -472,7 +476,8 @@
 
 TEST_F(ICloudKeychainRecoveryFactorTest,
        ShouldNotAttemptKeyRecoveryWithNoICloudKeys) {
-  EXPECT_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState)
+  EXPECT_CALL(*connection(),
+              DownloadAuthenticationFactorsRegistrationState(_, _, _, _))
       .Times(0);
 
   base::MockCallback<LocalRecoveryFactor::AttemptRecoveryCallback>
@@ -499,7 +504,8 @@
 TEST_F(ICloudKeychainRecoveryFactorTest,
        ShouldNotAttemptKeyRecoveryWhenThrottled) {
   EXPECT_CALL(*connection(), AreRequestsThrottled).WillOnce(Return(true));
-  EXPECT_CALL(*connection(), DownloadAuthenticationFactorsRegistrationState)
+  EXPECT_CALL(*connection(),
+              DownloadAuthenticationFactorsRegistrationState(_, _, _, _))
       .Times(0);
 
   CreateICloudKey(SecurityDomainId::kChromeSync);
diff --git a/components/trusted_vault/icloud_recovery_key_mac.mm b/components/trusted_vault/icloud_recovery_key_mac.mm
index 5faac9f..e1f8c8d 100644
--- a/components/trusted_vault/icloud_recovery_key_mac.mm
+++ b/components/trusted_vault/icloud_recovery_key_mac.mm
@@ -81,8 +81,6 @@
     CFToNSPtrCast(kSecAttrType) : @(kSecAttrTypeFolsom),
     CFToNSPtrCast(kSecAttrAccessGroup) :
         base::SysUTF8ToNSString(keychain_access_group),
-    CFToNSPtrCast(kSecAttrAccessible) :
-        CFToNSPtrCast(kSecAttrAccessibleWhenUnlocked),
   }];
 }
 
@@ -189,6 +187,8 @@
   NSMutableDictionary* attributes = GetDefaultQuery(
       keychain_access_group, GetKeychainService(security_domain_id));
   [attributes setValuesForKeysWithDictionary:@{
+    CFToNSPtrCast(kSecAttrAccessible) :
+        CFToNSPtrCast(kSecAttrAccessibleAfterFirstUnlock),
     CFToNSPtrCast(kSecAttrAccount) : EncodePublicKey(key->public_key()),
     CFToNSPtrCast(kSecValueData) : EncodePrivateKey(key->private_key()),
   }];
diff --git a/components/trusted_vault/icloud_recovery_key_mac_unittest.mm b/components/trusted_vault/icloud_recovery_key_mac_unittest.mm
index 7a77b70..3d99346 100644
--- a/components/trusted_vault/icloud_recovery_key_mac_unittest.mm
+++ b/components/trusted_vault/icloud_recovery_key_mac_unittest.mm
@@ -9,15 +9,16 @@
 #import <Security/Security.h>
 
 #include <memory>
+#include <optional>
 #include <vector>
 
+#include "base/apple/bridging.h"
 #include "base/apple/foundation_util.h"
 #include "base/apple/scoped_cftyperef.h"
-#include "base/functional/callback.h"
-#include "base/run_loop.h"
+#include "base/base64.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/test/bind.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "components/trusted_vault/securebox.h"
 #include "components/trusted_vault/trusted_vault_server_constants.h"
 #include "crypto/apple_keychain_v2.h"
@@ -30,24 +31,47 @@
 
 namespace {
 
+using ::base::apple::CFToNSPtrCast;
+using ::base::apple::NSToCFPtrCast;
+using ::testing::ElementsAre;
+using ::testing::IsEmpty;
+using ::testing::IsNull;
+using ::testing::Ne;
+using ::testing::NotNull;
+using ::testing::Optional;
+using ::testing::SizeIs;
+using ::testing::UnorderedElementsAre;
+
 constexpr char kKeychainAccessGroup[] = "keychain-access-group";
 constexpr uint8_t kHeader[]{'h', 'e', 'a', 'd', 'e', 'r'};
 constexpr uint8_t kPlaintext[]{'h', 'e', 'l', 'l', 'o'};
 
+MATCHER_P(HasId, id, "") {
+  if (!arg) {
+    *result_listener << "Got null key.";
+    return false;
+  }
+  return arg->id() == id;
+}
+
 class ICloudRecoveryKeyTest : public testing::Test {
  public:
   std::unique_ptr<ICloudRecoveryKey> CreateKey(
       const trusted_vault::SecurityDomainId security_domain_id) {
-    std::unique_ptr<ICloudRecoveryKey> new_key;
-    base::RunLoop run_loop;
-    ICloudRecoveryKey::Create(
-        base::BindLambdaForTesting([&](std::unique_ptr<ICloudRecoveryKey> ret) {
-          new_key = std::move(ret);
-          run_loop.Quit();
-        }),
-        security_domain_id, kKeychainAccessGroup);
-    run_loop.Run();
-    return new_key;
+    base::test::TestFuture<std::unique_ptr<ICloudRecoveryKey>> new_key;
+    ICloudRecoveryKey::Create(new_key.GetCallback(), security_domain_id,
+                              kKeychainAccessGroup);
+    return new_key.Take();
+  }
+
+  std::vector<std::unique_ptr<ICloudRecoveryKey>> RetrieveKeys(
+      trusted_vault::SecurityDomainId security_domain_id,
+      std::string_view keychain_access_group) {
+    base::test::TestFuture<std::vector<std::unique_ptr<ICloudRecoveryKey>>>
+        keys;
+    ICloudRecoveryKey::Retrieve(keys.GetCallback(), security_domain_id,
+                                keychain_access_group);
+    return keys.Take();
   }
 
  protected:
@@ -61,64 +85,32 @@
   std::optional<std::vector<uint8_t>> encrypted =
       key->key()->public_key().Encrypt(base::span<uint8_t>(), kHeader,
                                        kPlaintext);
-  ASSERT_TRUE(encrypted);
+  ASSERT_THAT(encrypted, Ne(std::nullopt));
 
-  std::unique_ptr<ICloudRecoveryKey> retrieved;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            ASSERT_EQ(ret.size(), 1u);
-            retrieved = std::move(ret.at(0));
-            run_loop.Quit();
-          }),
+  std::vector<std::unique_ptr<ICloudRecoveryKey>> keys = RetrieveKeys(
       trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-  run_loop.Run();
+  ASSERT_THAT(keys, SizeIs(1u));
 
   std::optional<std::vector<uint8_t>> decrypted =
-      retrieved->key()->private_key().Decrypt(base::span<uint8_t>(), kHeader,
-                                              *encrypted);
-  ASSERT_TRUE(decrypted);
-  EXPECT_EQ(base::span<const uint8_t>(*decrypted),
-            base::span<const uint8_t>(kPlaintext));
+      keys[0]->key()->private_key().Decrypt(base::span<uint8_t>(), kHeader,
+                                            *encrypted);
+  EXPECT_THAT(decrypted, Optional(base::span<const uint8_t>(kPlaintext)));
 }
 
 TEST_F(ICloudRecoveryKeyTest, CreateAndRetrieve) {
   std::unique_ptr<ICloudRecoveryKey> key1 =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(key1);
-  ASSERT_TRUE(key1->key());
+  ASSERT_THAT(key1, NotNull());
+  ASSERT_THAT(key1->key(), NotNull());
 
   std::unique_ptr<ICloudRecoveryKey> key2 =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(key2);
-  ASSERT_TRUE(key2->key());
+  ASSERT_THAT(key2, NotNull());
+  ASSERT_THAT(key2->key(), NotNull());
 
-  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            keys = std::move(ret);
-            run_loop.Quit();
-          }),
-      trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-  run_loop.Run();
-
-  ASSERT_TRUE(keys);
-  ASSERT_EQ(keys->size(), 2u);
-
-  auto key1it = std::ranges::find_if(
-      *keys, [&](const std::unique_ptr<ICloudRecoveryKey>& key) {
-        return key->id() == key1->id();
-      });
-  EXPECT_NE(key1it, keys->end());
-
-  auto key2it = std::ranges::find_if(
-      *keys, [&](const std::unique_ptr<ICloudRecoveryKey>& key) {
-        return key->id() == key2->id();
-      });
-  EXPECT_NE(key2it, keys->end());
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              UnorderedElementsAre(HasId(key1->id()), HasId(key2->id())));
 }
 
 // Verify that keys are stored using the new .hw_protected kSecAttrService, but
@@ -126,13 +118,13 @@
 TEST_F(ICloudRecoveryKeyTest, RetrieveWithLegacyAttributes) {
   std::unique_ptr<ICloudRecoveryKey> key1 =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(key1);
-  ASSERT_TRUE(key1->key());
+  ASSERT_THAT(key1, NotNull());
+  ASSERT_THAT(key1->key(), NotNull());
 
   std::unique_ptr<ICloudRecoveryKey> key2 =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(key2);
-  ASSERT_TRUE(key2->key());
+  ASSERT_THAT(key2, NotNull());
+  ASSERT_THAT(key2->key(), NotNull());
 
   CFMutableDictionaryRef key1_dict = const_cast<CFMutableDictionaryRef>(
       fake_keychain_.keychain()->items().at(0).get());
@@ -143,146 +135,79 @@
   CFDictionarySetValue(
       key1_dict, kSecAttrService,
       base::SysUTF8ToCFStringRef("com.google.common.folsom.cloud.private")
-          .release());
+          .get());
 
-  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            keys = std::move(ret);
-            run_loop.Quit();
-          }),
-      trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-  run_loop.Run();
-
-  ASSERT_TRUE(keys);
-  EXPECT_EQ(keys->size(), 2u);
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              UnorderedElementsAre(HasId(key1->id()), HasId(key2->id())));
 }
 
 // Tests that keys belonging to other security domains are not retrieved.
 TEST_F(ICloudRecoveryKeyTest, IgnoreOtherSecurityDomains) {
   std::unique_ptr<ICloudRecoveryKey> key1 =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(key1);
-  ASSERT_TRUE(key1->key());
+  ASSERT_THAT(key1, NotNull());
+  ASSERT_THAT(key1->key(), NotNull());
 
   CFMutableDictionaryRef key1_dict = const_cast<CFMutableDictionaryRef>(
       fake_keychain_.keychain()->items().at(0).get());
   CFDictionarySetValue(key1_dict, kSecAttrService,
                        base::SysUTF8ToCFStringRef(
                            "com.google.common.folsom.cloud.private.folsom")
-                           .release());
+                           .get());
 
-  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            keys = std::move(ret);
-            run_loop.Quit();
-          }),
-      trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-  run_loop.Run();
-
-  ASSERT_TRUE(keys);
-  EXPECT_TRUE(keys->empty());
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              IsEmpty());
 }
 
 TEST_F(ICloudRecoveryKeyTest, MultipleSecurityDomains) {
   std::unique_ptr<ICloudRecoveryKey> passkeys_key =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(passkeys_key);
-  ASSERT_TRUE(passkeys_key->key());
+  ASSERT_THAT(passkeys_key, NotNull());
+  ASSERT_THAT(passkeys_key->key(), NotNull());
 
   std::unique_ptr<ICloudRecoveryKey> chromesync_key =
       CreateKey(trusted_vault::SecurityDomainId::kChromeSync);
-  ASSERT_TRUE(chromesync_key);
-  ASSERT_TRUE(chromesync_key->key());
+  ASSERT_THAT(chromesync_key, NotNull());
+  ASSERT_THAT(chromesync_key->key(), NotNull());
 
-  {
-    std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-    base::RunLoop run_loop;
-    ICloudRecoveryKey::Retrieve(
-        base::BindLambdaForTesting(
-            [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-              keys = std::move(ret);
-              run_loop.Quit();
-            }),
-        trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-    run_loop.Run();
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              ElementsAre(HasId(passkeys_key->id())));
 
-    ASSERT_TRUE(keys);
-    ASSERT_EQ(keys->size(), 1u);
-    EXPECT_EQ((*keys)[0]->id(), passkeys_key->id());
-  }
-
-  {
-    std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-    base::RunLoop run_loop;
-    ICloudRecoveryKey::Retrieve(
-        base::BindLambdaForTesting(
-            [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-              keys = std::move(ret);
-              run_loop.Quit();
-            }),
-        trusted_vault::SecurityDomainId::kChromeSync, kKeychainAccessGroup);
-    run_loop.Run();
-
-    ASSERT_TRUE(keys);
-    ASSERT_EQ(keys->size(), 1u);
-    EXPECT_EQ((*keys)[0]->id(), chromesync_key->id());
-  }
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kChromeSync,
+                           kKeychainAccessGroup),
+              ElementsAre(HasId(chromesync_key->id())));
 }
 
 TEST_F(ICloudRecoveryKeyTest, CreateKeychainError) {
   // Force a keychain error by setting the wrong access group.
-  std::unique_ptr<ICloudRecoveryKey> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Create(
-      base::BindLambdaForTesting([&](std::unique_ptr<ICloudRecoveryKey> ret) {
-        keys = std::move(ret);
-        run_loop.Quit();
-      }),
-      trusted_vault::SecurityDomainId::kPasskeys, "wrong keychain group");
-  run_loop.Run();
-  EXPECT_FALSE(keys);
+  base::test::TestFuture<std::unique_ptr<ICloudRecoveryKey>> keys;
+  ICloudRecoveryKey::Create(keys.GetCallback(),
+                            trusted_vault::SecurityDomainId::kPasskeys,
+                            "wrong keychain group");
+  EXPECT_THAT(keys.Take(), IsNull());
 }
 
 TEST_F(ICloudRecoveryKeyTest, RetrieveKeychainError) {
   // Force a keychain error by setting the wrong access group.
-  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            keys = std::move(ret);
-            run_loop.Quit();
-          }),
-      trusted_vault::SecurityDomainId::kPasskeys, "wrong keychain group");
-  run_loop.Run();
-  EXPECT_TRUE(keys->empty());
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           "wrong keychain group"),
+              IsEmpty());
 }
 
 TEST_F(ICloudRecoveryKeyTest, RetrieveEmpty) {
-  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            keys = std::move(ret);
-            run_loop.Quit();
-          }),
-      trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-  run_loop.Run();
-  EXPECT_TRUE(keys->empty());
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              IsEmpty());
 }
 
 TEST_F(ICloudRecoveryKeyTest, RetrieveCorrupted) {
   std::unique_ptr<ICloudRecoveryKey> key1 =
       CreateKey(trusted_vault::SecurityDomainId::kPasskeys);
-  ASSERT_TRUE(key1);
-  ASSERT_TRUE(key1->key());
+  ASSERT_THAT(key1, NotNull());
+  ASSERT_THAT(key1->key(), NotNull());
 
   base::apple::ScopedCFTypeRef<CFDataRef> corrupted_key(
       CFDataCreate(kCFAllocatorDefault, nullptr, 0));
@@ -290,17 +215,73 @@
                            fake_keychain_.keychain()->items().at(0).get()),
                        kSecValueData, corrupted_key.get());
 
-  std::optional<std::vector<std::unique_ptr<ICloudRecoveryKey>>> keys;
-  base::RunLoop run_loop;
-  ICloudRecoveryKey::Retrieve(
-      base::BindLambdaForTesting(
-          [&](std::vector<std::unique_ptr<ICloudRecoveryKey>> ret) {
-            keys = std::move(ret);
-            run_loop.Quit();
-          }),
-      trusted_vault::SecurityDomainId::kPasskeys, kKeychainAccessGroup);
-  run_loop.Run();
-  EXPECT_TRUE(keys->empty());
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              IsEmpty());
+}
+
+TEST_F(ICloudRecoveryKeyTest, RetrieveIOSKey) {
+  std::unique_ptr<trusted_vault::SecureBoxKeyPair> key =
+      trusted_vault::SecureBoxKeyPair::GenerateRandom();
+  std::vector<uint8_t> private_key_bytes = key->private_key().ExportToBytes();
+
+  // Manually create a key in exactly the way the iOS implementation creates it.
+  // See crbug.com/416633274 for details and more background.
+  NSDictionary* attributes = @{
+    CFToNSPtrCast(kSecClass) : CFToNSPtrCast(kSecClassGenericPassword),
+    CFToNSPtrCast(kSecAttrType) : @(static_cast<uint>('flsm')),
+    CFToNSPtrCast(kSecAttrSynchronizable) : @YES,
+    CFToNSPtrCast(kSecAttrService) :
+        @"com.google.common.folsom.cloud.private.hw_protected",
+    CFToNSPtrCast(kSecAttrAccessGroup) : @(kKeychainAccessGroup),
+    CFToNSPtrCast(kSecAttrAccessible) :
+        CFToNSPtrCast(kSecAttrAccessibleAfterFirstUnlock),
+    CFToNSPtrCast(kSecAttrAccount) : base::SysUTF8ToNSString(
+        base::Base64Encode((key->public_key().ExportToBytes()))),
+    CFToNSPtrCast(kSecValueData) :
+        [NSData dataWithBytes:private_key_bytes.data()
+                       length:private_key_bytes.size()],
+  };
+
+  ASSERT_EQ(fake_keychain_.keychain()->ItemAdd(NSToCFPtrCast(attributes),
+                                               /*result=*/nil),
+            errSecSuccess);
+
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              ElementsAre(HasId(key->public_key().ExportToBytes())));
+}
+
+TEST_F(ICloudRecoveryKeyTest, RetrieveOldSecAttrAccessibleKey) {
+  std::unique_ptr<trusted_vault::SecureBoxKeyPair> key =
+      trusted_vault::SecureBoxKeyPair::GenerateRandom();
+  std::vector<uint8_t> private_key_bytes = key->private_key().ExportToBytes();
+
+  // Prior to crbug.com/416633274, keys were created slightly differently.
+  // Verify that those keys can still be read.
+  NSDictionary* attributes = @{
+    CFToNSPtrCast(kSecClass) : CFToNSPtrCast(kSecClassGenericPassword),
+    CFToNSPtrCast(kSecAttrType) : @(static_cast<uint>('flsm')),
+    CFToNSPtrCast(kSecAttrSynchronizable) : @YES,
+    CFToNSPtrCast(kSecAttrService) :
+        @"com.google.common.folsom.cloud.private.hw_protected",
+    CFToNSPtrCast(kSecAttrAccessGroup) : @(kKeychainAccessGroup),
+    CFToNSPtrCast(kSecAttrAccessible) :
+        CFToNSPtrCast(kSecAttrAccessibleWhenUnlocked),
+    CFToNSPtrCast(kSecAttrAccount) : base::SysUTF8ToNSString(
+        base::Base64Encode((key->public_key().ExportToBytes()))),
+    CFToNSPtrCast(kSecValueData) :
+        [NSData dataWithBytes:private_key_bytes.data()
+                       length:private_key_bytes.size()],
+  };
+
+  ASSERT_EQ(fake_keychain_.keychain()->ItemAdd(NSToCFPtrCast(attributes),
+                                               /*result=*/nil),
+            errSecSuccess);
+
+  EXPECT_THAT(RetrieveKeys(trusted_vault::SecurityDomainId::kPasskeys,
+                           kKeychainAccessGroup),
+              ElementsAre(HasId(key->public_key().ExportToBytes())));
 }
 
 }  // namespace
diff --git a/components/trusted_vault/standalone_trusted_vault_server_constants.cc b/components/trusted_vault/standalone_trusted_vault_server_constants.cc
index a4309bd..921c1782 100644
--- a/components/trusted_vault/standalone_trusted_vault_server_constants.cc
+++ b/components/trusted_vault/standalone_trusted_vault_server_constants.cc
@@ -16,9 +16,26 @@
   return std::vector<uint8_t>(16, 0);
 }
 
-GURL GetGetSecurityDomainMembersURL(const GURL& server_url) {
+GURL GetGetSecurityDomainMembersURL(
+    const GURL& server_url,
+    const std::set<SecurityDomainId>& security_domain_filter,
+    const std::set<trusted_vault_pb::SecurityDomainMember_MemberType>&
+        member_filter) {
   // View three is `SECURITY_DOMAIN_MEMBER_METADATA`.
-  return GURL(server_url.spec() + kSecurityDomainMemberNamePrefix + "?view=3");
+  GURL request_url =
+      GURL(server_url.spec() + kSecurityDomainMemberNamePrefix + "?view=3");
+
+  for (const auto& security_domain : security_domain_filter) {
+    request_url =
+        net::AppendQueryParameter(request_url, "include_security_domains",
+                                  GetSecurityDomainPath(security_domain));
+  }
+  for (const auto& member_type : member_filter) {
+    request_url = net::AppendQueryParameter(request_url, "include_member_types",
+                                            base::NumberToString(member_type));
+  }
+
+  return request_url;
 }
 
 GURL GetGetSecurityDomainMemberURL(const GURL& server_url,
@@ -46,8 +63,12 @@
 
 GURL GetGetSecurityDomainMembersURLForTesting(
     const std::optional<std::string>& next_page_token,
-    const GURL& server_url) {
-  GURL url = GetGetSecurityDomainMembersURL(server_url);
+    const GURL& server_url,
+    const std::set<SecurityDomainId>& security_domain_filter,
+    const std::set<trusted_vault_pb::SecurityDomainMember_MemberType>&
+        member_filter) {
+  GURL url = GetGetSecurityDomainMembersURL(server_url, security_domain_filter,
+                                            member_filter);
   if (next_page_token) {
     url = net::AppendQueryParameter(url, "page_token", *next_page_token);
   }
diff --git a/components/trusted_vault/standalone_trusted_vault_server_constants.h b/components/trusted_vault/standalone_trusted_vault_server_constants.h
index 84e706f..c12637e 100644
--- a/components/trusted_vault/standalone_trusted_vault_server_constants.h
+++ b/components/trusted_vault/standalone_trusted_vault_server_constants.h
@@ -6,10 +6,12 @@
 #define COMPONENTS_TRUSTED_VAULT_STANDALONE_TRUSTED_VAULT_SERVER_CONSTANTS_H_
 
 #include <optional>
+#include <set>
 #include <string>
 #include <vector>
 
 #include "base/containers/span.h"
+#include "components/trusted_vault/proto/vault.pb.h"
 #include "components/trusted_vault/trusted_vault_server_constants.h"
 #include "url/gurl.h"
 
@@ -27,7 +29,11 @@
 inline constexpr char kQueryParameterAlternateOutputProto[] = "proto";
 
 std::vector<uint8_t> GetConstantTrustedVaultKey();
-GURL GetGetSecurityDomainMembersURL(const GURL& server_url);
+GURL GetGetSecurityDomainMembersURL(
+    const GURL& server_url,
+    const std::set<SecurityDomainId>& security_domain_filter,
+    const std::set<trusted_vault_pb::SecurityDomainMember_MemberType>&
+        member_filter);
 GURL GetGetSecurityDomainMemberURL(const GURL& server_url,
                                    base::span<const uint8_t> public_key);
 GURL GetGetSecurityDomainURL(const GURL& server_url,
@@ -38,7 +44,10 @@
 // Computes full URL, including alternate proto param.
 GURL GetGetSecurityDomainMembersURLForTesting(
     const std::optional<std::string>& next_page_token,
-    const GURL& server_url);
+    const GURL& server_url,
+    const std::set<SecurityDomainId>& security_domain_filter,
+    const std::set<trusted_vault_pb::SecurityDomainMember_MemberType>&
+        member_filter);
 GURL GetFullJoinSecurityDomainsURLForTesting(const GURL& server_url,
                                              SecurityDomainId security_domain);
 GURL GetFullGetSecurityDomainMemberURLForTesting(
diff --git a/components/trusted_vault/test/mock_trusted_vault_throttling_connection.h b/components/trusted_vault/test/mock_trusted_vault_throttling_connection.h
index 475820a..e3cac64e 100644
--- a/components/trusted_vault/test/mock_trusted_vault_throttling_connection.h
+++ b/components/trusted_vault/test/mock_trusted_vault_throttling_connection.h
@@ -54,6 +54,14 @@
                DownloadAuthenticationFactorsRegistrationStateCallback callback,
                base::RepeatingClosure keep_alive_callback),
               (override));
+  MOCK_METHOD(std::unique_ptr<Request>,
+              DownloadAuthenticationFactorsRegistrationState,
+              (const CoreAccountInfo& account_info,
+               std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+                   recovery_factor_filter,
+               DownloadAuthenticationFactorsRegistrationStateCallback callback,
+               base::RepeatingClosure keep_alive_callback),
+              (override));
   MOCK_METHOD(bool,
               AreRequestsThrottled,
               (const CoreAccountInfo& account_info),
diff --git a/components/trusted_vault/trusted_vault_connection.h b/components/trusted_vault/trusted_vault_connection.h
index af2fc60..1a7cbe71 100644
--- a/components/trusted_vault/trusted_vault_connection.h
+++ b/components/trusted_vault/trusted_vault_connection.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 #include <optional>
+#include <set>
 #include <variant>
 #include <vector>
 
@@ -16,6 +17,10 @@
 
 struct CoreAccountInfo;
 
+namespace trusted_vault_pb {
+enum SecurityDomainMember_MemberType : int;
+}  // namespace trusted_vault_pb
+
 namespace trusted_vault {
 
 class SecureBoxKeyPair;
@@ -329,6 +334,23 @@
       const CoreAccountInfo& account_info,
       DownloadAuthenticationFactorsRegistrationStateCallback callback,
       base::RepeatingClosure keep_alive_callback) = 0;
+
+  // Enumerates the members of the security domain and determines the
+  // recoverability of the security domain. (See the values of
+  // `DownloadAuthenticationFactorsRegistrationStateResult`.)
+  // If |AuthenticationFactorType| is non-empty, then only information from the
+  // authentication factor types in that set is fetched and taken into account
+  // when constructing the result. |keep_alive_callback| will be called whenever
+  // there's a partial response from the server, i.e. we got a response but we
+  // still need more data.
+  // TODO(crbug.com/406191378): Rename to ...RecoveryFactor.
+  [[nodiscard]] virtual std::unique_ptr<Request>
+  DownloadAuthenticationFactorsRegistrationState(
+      const CoreAccountInfo& account_info,
+      std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+          recovery_factor_filter,
+      DownloadAuthenticationFactorsRegistrationStateCallback callback,
+      base::RepeatingClosure keep_alive_callback) = 0;
 };
 
 }  // namespace trusted_vault
diff --git a/components/trusted_vault/trusted_vault_connection_impl.cc b/components/trusted_vault/trusted_vault_connection_impl.cc
index a07d46a..2217d6a 100644
--- a/components/trusted_vault/trusted_vault_connection_impl.cc
+++ b/components/trusted_vault/trusted_vault_connection_impl.cc
@@ -18,6 +18,7 @@
 #include "base/time/time.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/trusted_vault/download_keys_response_handler.h"
+#include "components/trusted_vault/features.h"
 #include "components/trusted_vault/proto/vault.pb.h"
 #include "components/trusted_vault/proto_string_bytes_conversion.h"
 #include "components/trusted_vault/securebox.h"
@@ -589,7 +590,10 @@
     : security_domain_(security_domain),
       pending_url_loader_factory_(std::move(pending_url_loader_factory)),
       access_token_fetcher_(std::move(access_token_fetcher)),
-      trusted_vault_service_url_(trusted_vault_service_url) {
+      trusted_vault_service_url_(trusted_vault_service_url),
+      enable_registration_state_security_domain_filtering_(
+          base::FeatureList::IsEnabled(
+              kEnableRegistrationStateSecurityDomainFiltering)) {
   DCHECK(trusted_vault_service_url_.is_valid());
 }
 
@@ -679,13 +683,36 @@
     const CoreAccountInfo& account_info,
     DownloadAuthenticationFactorsRegistrationStateCallback callback,
     base::RepeatingClosure keep_alive_callback) {
+  return DownloadAuthenticationFactorsRegistrationState(
+      account_info, {}, std::move(callback), std::move(keep_alive_callback));
+}
+
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultConnectionImpl::DownloadAuthenticationFactorsRegistrationState(
+    const CoreAccountInfo& account_info,
+    std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+        recovery_factor_filter_param,
+    DownloadAuthenticationFactorsRegistrationStateCallback callback,
+    base::RepeatingClosure keep_alive_callback) {
+  // Use empty filters (which disables server side filtering) unless the
+  // `kEnableRegistrationStateSecurityDomainFiltering` flag is enabled.
+  std::set<SecurityDomainId> security_domain_filter;
+  std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+      recovery_factor_filter;
+  if (enable_registration_state_security_domain_filtering_) {
+    security_domain_filter.insert(security_domain_);
+    recovery_factor_filter = recovery_factor_filter_param;
+  }
+
+  GURL request_url = GetGetSecurityDomainMembersURL(trusted_vault_service_url_,
+                                                    security_domain_filter,
+                                                    recovery_factor_filter);
+
   return std::make_unique<
       DownloadAuthenticationFactorsRegistrationStateRequest>(
-      security_domain_,
-      GetGetSecurityDomainMembersURL(trusted_vault_service_url_),
-      account_info.account_id, GetOrCreateURLLoaderFactory(),
-      access_token_fetcher_->Clone(), std::move(callback),
-      std::move(keep_alive_callback));
+      security_domain_, request_url, account_info.account_id,
+      GetOrCreateURLLoaderFactory(), access_token_fetcher_->Clone(),
+      std::move(callback), std::move(keep_alive_callback));
 }
 
 std::unique_ptr<TrustedVaultConnection::Request>
diff --git a/components/trusted_vault/trusted_vault_connection_impl.h b/components/trusted_vault/trusted_vault_connection_impl.h
index f152379..719e4fdb 100644
--- a/components/trusted_vault/trusted_vault_connection_impl.h
+++ b/components/trusted_vault/trusted_vault_connection_impl.h
@@ -78,6 +78,13 @@
       DownloadAuthenticationFactorsRegistrationStateCallback callback,
       base::RepeatingClosure keep_alive_callback) override;
 
+  std::unique_ptr<Request> DownloadAuthenticationFactorsRegistrationState(
+      const CoreAccountInfo& account_info,
+      std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+          recovery_factor_filter,
+      DownloadAuthenticationFactorsRegistrationStateCallback callback,
+      base::RepeatingClosure keep_alive_callback) override;
+
  private:
   std::unique_ptr<Request> SendJoinSecurityDomainsRequest(
       const CoreAccountInfo& account_info,
@@ -101,6 +108,8 @@
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   GURL trusted_vault_service_url_;
+
+  const bool enable_registration_state_security_domain_filtering_;
 };
 
 }  // namespace trusted_vault
diff --git a/components/trusted_vault/trusted_vault_connection_impl_unittest.cc b/components/trusted_vault/trusted_vault_connection_impl_unittest.cc
index 4d29a0cf..54d8cca1 100644
--- a/components/trusted_vault/trusted_vault_connection_impl_unittest.cc
+++ b/components/trusted_vault/trusted_vault_connection_impl_unittest.cc
@@ -16,10 +16,12 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/types/expected.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
 #include "components/signin/public/identity_manager/account_info.h"
+#include "components/trusted_vault/features.h"
 #include "components/trusted_vault/proto/vault.pb.h"
 #include "components/trusted_vault/proto_string_bytes_conversion.h"
 #include "components/trusted_vault/securebox.h"
@@ -201,16 +203,7 @@
 class TrustedVaultConnectionImplTest
     : public testing::TestWithParam<SecurityDomainId> {
  public:
-  TrustedVaultConnectionImplTest()
-      : connection_(
-            security_domain(),
-            kTestURL,
-            base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
-                &test_url_loader_factory_)
-                ->Clone(),
-            std::make_unique<FakeTrustedVaultAccessTokenFetcher>(
-                MakeAccessTokenInfo(kAccessToken))) {}
-
+  TrustedVaultConnectionImplTest() = default;
   ~TrustedVaultConnectionImplTest() override = default;
 
   SecurityDomainId security_domain() { return GetParam(); }
@@ -219,7 +212,18 @@
     return GetSecurityDomainNameForUma(security_domain());
   }
 
-  TrustedVaultConnectionImpl* connection() { return &connection_; }
+  TrustedVaultConnectionImpl* connection() {
+    if (!connection_) {
+      connection_ = std::make_unique<TrustedVaultConnectionImpl>(
+          security_domain(), kTestURL,
+          base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+              &test_url_loader_factory_)
+              ->Clone(),
+          std::make_unique<FakeTrustedVaultAccessTokenFetcher>(
+              MakeAccessTokenInfo(kAccessToken)));
+    }
+    return connection_.get();
+  }
 
   // Allows overloading of FakeTrustedVaultAccessTokenFetcher behavior, doesn't
   // overwrite connection().
@@ -284,15 +288,21 @@
   }
 
   bool RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
+      const std::set<SecurityDomainId>& security_domain_filter,
+      const std::set<trusted_vault_pb::SecurityDomainMember_MemberType>&
+          recovery_factor_filter,
       const std::optional<std::string>& next_page_token,
       net::HttpStatusCode response_http_code,
       const std::string& response_body) {
     // Allow request to reach |test_url_loader_factory_|.
     base::RunLoop().RunUntilIdle();
+
+    GURL request_url = GetGetSecurityDomainMembersURLForTesting(
+        next_page_token, kTestURL, security_domain_filter,
+        recovery_factor_filter);
+
     return test_url_loader_factory_.SimulateResponseForPendingRequest(
-        GetGetSecurityDomainMembersURLForTesting(next_page_token, kTestURL)
-            .spec(),
-        response_body, response_http_code);
+        request_url.spec(), response_body, response_http_code);
   }
 
   base::test::SingleThreadTaskEnvironment& task_environment() {
@@ -313,13 +323,29 @@
 
   base::HistogramTester histogram_tester_;
 
-  TrustedVaultConnectionImpl connection_;
+  std::unique_ptr<TrustedVaultConnectionImpl> connection_;
+};
+
+class TrustedVaultConnectionImplTestNoSecurityDomainFilter
+    : public TrustedVaultConnectionImplTest {
+ public:
+  TrustedVaultConnectionImplTestNoSecurityDomainFilter() {
+    feature_list_.InitAndDisableFeature(
+        kEnableRegistrationStateSecurityDomainFiltering);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
 };
 
 INSTANTIATE_TEST_SUITE_P(ForSecurityDomain,
                          TrustedVaultConnectionImplTest,
                          testing::ValuesIn(kAllSecurityDomainIdValues.begin(),
                                            kAllSecurityDomainIdValues.end()));
+INSTANTIATE_TEST_SUITE_P(ForSecurityDomain,
+                         TrustedVaultConnectionImplTestNoSecurityDomainFilter,
+                         testing::ValuesIn(kAllSecurityDomainIdValues.begin(),
+                                           kAllSecurityDomainIdValues.end()));
 
 TEST_P(TrustedVaultConnectionImplTest,
        ShouldSendJoinSecurityDomainsRequestWithoutKeys) {
@@ -1128,7 +1154,7 @@
 }
 
 TEST_P(TrustedVaultConnectionImplTest,
-       DownloadAuthenticationFactorsRegistrationState_Basic) {
+       DownloadAuthenticationFactorsRegistrationState_Basic_ServerFiltering) {
   base::MockCallback<TrustedVaultConnection::
                          DownloadAuthenticationFactorsRegistrationStateCallback>
       callback;
@@ -1145,6 +1171,70 @@
                       kRecoverable)));
 
   ASSERT_TRUE(RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
+      /*security_domain_filter=*/{security_domain()},
+      /*recovery_factor_filter=*/{},
+      /*next_page_token=*/std::nullopt, net::HTTP_OK,
+      /*response_body=*/
+      MakeSecurityDomainMembers(
+          security_domain(),
+          {Member::kPhysical, Member::kOtherSecurityDomain,
+           Member::kUsableVirtual},
+          /*next_page_token=*/std::nullopt)
+          .SerializeAsString()));
+}
+
+TEST_P(TrustedVaultConnectionImplTestNoSecurityDomainFilter,
+       DownloadAuthenticationFactorsRegistrationState_Basic_NoServerFiltering) {
+  base::MockCallback<TrustedVaultConnection::
+                         DownloadAuthenticationFactorsRegistrationStateCallback>
+      callback;
+
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      connection()->DownloadAuthenticationFactorsRegistrationState(
+          /*account_info=*/CoreAccountInfo(), callback.Get(),
+          base::NullCallback());
+  ASSERT_THAT(request, NotNull());
+
+  EXPECT_CALL(callback,
+              Run(HasRecoveryState(
+                  DownloadAuthenticationFactorsRegistrationStateResult::State::
+                      kRecoverable)));
+
+  ASSERT_TRUE(RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
+      /*security_domain_filter=*/{},
+      /*recovery_factor_filter=*/{},
+      /*next_page_token=*/std::nullopt, net::HTTP_OK,
+      /*response_body=*/
+      MakeSecurityDomainMembers(
+          security_domain(),
+          {Member::kPhysical, Member::kOtherSecurityDomain,
+           Member::kUsableVirtual},
+          /*next_page_token=*/std::nullopt)
+          .SerializeAsString()));
+}
+
+TEST_P(TrustedVaultConnectionImplTest,
+       DownloadAuthenticationFactorsRegistrationState_RecoveryFactorFilter) {
+  base::MockCallback<TrustedVaultConnection::
+                         DownloadAuthenticationFactorsRegistrationStateCallback>
+      callback;
+
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      connection()->DownloadAuthenticationFactorsRegistrationState(
+          /*account_info=*/CoreAccountInfo(),
+          {trusted_vault_pb::SecurityDomainMember::MEMBER_TYPE_PHYSICAL_DEVICE},
+          callback.Get(), base::NullCallback());
+  ASSERT_THAT(request, NotNull());
+
+  EXPECT_CALL(callback,
+              Run(HasRecoveryState(
+                  DownloadAuthenticationFactorsRegistrationStateResult::State::
+                      kRecoverable)));
+
+  ASSERT_TRUE(RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
+      /*security_domain_filter=*/{security_domain()},
+      /*recovery_factor_filter=*/
+      {trusted_vault_pb::SecurityDomainMember::MEMBER_TYPE_PHYSICAL_DEVICE},
       /*next_page_token=*/std::nullopt, net::HTTP_OK,
       /*response_body=*/
       MakeSecurityDomainMembers(
@@ -1330,7 +1420,8 @@
       }
       ASSERT_TRUE(
           RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
-              prev_next_page_token, net::HTTP_OK,
+              /*security_domain_filter=*/{security_domain()},
+              /*recovery_factor_filter=*/{}, prev_next_page_token, net::HTTP_OK,
               /*response_body=*/
               MakeSecurityDomainMembers(security_domain(), test.responses[i],
                                         next_page_token)
@@ -1379,6 +1470,8 @@
                       kError)));
 
   ASSERT_TRUE(RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
+      /*security_domain_filter=*/{security_domain()},
+      /*recovery_factor_filter=*/{},
       /*next_page_token=*/std::nullopt, net::HTTP_INTERNAL_SERVER_ERROR,
       /*response_body=*/""));
 }
@@ -1401,6 +1494,8 @@
                       kError)));
 
   ASSERT_TRUE(RespondToDownloadAuthenticationFactorsRegistrationStateRequest(
+      /*security_domain_filter=*/{security_domain()},
+      /*recovery_factor_filter=*/{},
       /*next_page_token=*/std::nullopt, net::HTTP_OK,
       /*response_body=*/"not a valid protobuf"));
 }
diff --git a/components/trusted_vault/trusted_vault_throttling_connection_impl.cc b/components/trusted_vault/trusted_vault_throttling_connection_impl.cc
index 1aaa476..8f1272c 100644
--- a/components/trusted_vault/trusted_vault_throttling_connection_impl.cc
+++ b/components/trusted_vault/trusted_vault_throttling_connection_impl.cc
@@ -124,4 +124,17 @@
       account_info, std::move(callback), keep_alive_callback);
 }
 
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultThrottlingConnectionImpl::
+    DownloadAuthenticationFactorsRegistrationState(
+        const CoreAccountInfo& account_info,
+        std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+            recovery_factor_filter,
+        DownloadAuthenticationFactorsRegistrationStateCallback callback,
+        base::RepeatingClosure keep_alive_callback) {
+  return delegate_->DownloadAuthenticationFactorsRegistrationState(
+      account_info, recovery_factor_filter, std::move(callback),
+      keep_alive_callback);
+}
+
 }  // namespace trusted_vault
diff --git a/components/trusted_vault/trusted_vault_throttling_connection_impl.h b/components/trusted_vault/trusted_vault_throttling_connection_impl.h
index d6f1c10..2de9a9c 100644
--- a/components/trusted_vault/trusted_vault_throttling_connection_impl.h
+++ b/components/trusted_vault/trusted_vault_throttling_connection_impl.h
@@ -9,6 +9,7 @@
 
 #include "base/time/clock.h"
 #include "components/signin/public/identity_manager/account_info.h"
+#include "components/trusted_vault/proto/vault.pb.h"
 #include "components/trusted_vault/standalone_trusted_vault_storage.h"
 #include "components/trusted_vault/trusted_vault_access_token_fetcher.h"
 #include "components/trusted_vault/trusted_vault_connection.h"
@@ -65,6 +66,13 @@
       DownloadAuthenticationFactorsRegistrationStateCallback callback,
       base::RepeatingClosure keep_alive_callback) override;
 
+  std::unique_ptr<Request> DownloadAuthenticationFactorsRegistrationState(
+      const CoreAccountInfo& account_info,
+      std::set<trusted_vault_pb::SecurityDomainMember_MemberType>
+          recovery_factor_filter,
+      DownloadAuthenticationFactorsRegistrationStateCallback callback,
+      base::RepeatingClosure keep_alive_callback) override;
+
   // Specifies how long requests shouldn't be retried after encountering
   // transient error. Note, that this doesn't affect requests related to
   // degraded recoverability.
diff --git a/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc b/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc
index 8a1b825..ddbd7ba3 100644
--- a/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc
+++ b/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc
@@ -8,15 +8,18 @@
 
 #include "base/functional/callback_helpers.h"
 #include "base/test/simple_test_clock.h"
+#include "components/trusted_vault/local_recovery_factor.h"
 #include "components/trusted_vault/standalone_trusted_vault_storage.h"
 #include "components/trusted_vault/test/fake_file_access.h"
 #include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
+#include "components/trusted_vault/trusted_vault_connection.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace trusted_vault {
 
 namespace {
 
+using testing::_;
 using testing::InvokeWithoutArgs;
 using testing::NiceMock;
 using testing::NotNull;
@@ -196,7 +199,8 @@
 
 TEST_F(TrustedVaultThrottlingConnectionImplTest,
        ShouldCallDownloadAuthenticationFactorsRegistrationState) {
-  EXPECT_CALL(*delegate(), DownloadAuthenticationFactorsRegistrationState)
+  EXPECT_CALL(*delegate(),
+              DownloadAuthenticationFactorsRegistrationState(_, _, _))
       .WillOnce(InvokeWithoutArgs([]() {
         return std::make_unique<TrustedVaultConnection::Request>();
       }));
@@ -206,6 +210,21 @@
   EXPECT_THAT(request, NotNull());
 }
 
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldCallDownloadAuthenticationFactorsRegistrationStateWithFilter) {
+  EXPECT_CALL(*delegate(),
+              DownloadAuthenticationFactorsRegistrationState(_, _, _, _))
+      .WillOnce(InvokeWithoutArgs([]() {
+        return std::make_unique<TrustedVaultConnection::Request>();
+      }));
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      throttling_connection()->DownloadAuthenticationFactorsRegistrationState(
+          account_info(),
+          {trusted_vault_pb::SecurityDomainMember::MEMBER_TYPE_PHYSICAL_DEVICE},
+          base::DoNothing(), base::DoNothing());
+  EXPECT_THAT(request, NotNull());
+}
+
 }  // namespace
 
 }  // namespace trusted_vault
diff --git a/components/viz/common/quads/compositor_frame_metadata.cc b/components/viz/common/quads/compositor_frame_metadata.cc
index 1472e77..05e8d51 100644
--- a/components/viz/common/quads/compositor_frame_metadata.cc
+++ b/components/viz/common/quads/compositor_frame_metadata.cc
@@ -44,6 +44,7 @@
       top_controls_visible_height(other.top_controls_visible_height),
       preferred_frame_interval(other.preferred_frame_interval),
       display_transform_hint(other.display_transform_hint),
+      is_mobile_optimized(other.is_mobile_optimized),
       transition_directives(other.transition_directives),
       has_shared_element_resources(other.has_shared_element_resources),
       screenshot_destination(other.screenshot_destination),
diff --git a/components/viz/common/quads/compositor_frame_metadata.h b/components/viz/common/quads/compositor_frame_metadata.h
index 358d0a86..14059a1 100644
--- a/components/viz/common/quads/compositor_frame_metadata.h
+++ b/components/viz/common/quads/compositor_frame_metadata.h
@@ -184,6 +184,9 @@
   // applicable to frames of the root surface.
   gfx::OverlayTransform display_transform_hint = gfx::OVERLAY_TRANSFORM_NONE;
 
+  // Please refer RenderFrameMetadata::is_mobile_optimized for detailed comment.
+  bool is_mobile_optimized = false;
+
   // Contains the metadata required for drawing a delegated ink trail onto the
   // end of a rendered ink stroke. This should only be present when two
   // conditions are met:
diff --git a/components/viz/service/display/overlay_unittest.cc b/components/viz/service/display/overlay_unittest.cc
index cd90b95..66084938d 100644
--- a/components/viz/service/display/overlay_unittest.cc
+++ b/components/viz/service/display/overlay_unittest.cc
@@ -736,7 +736,6 @@
       AggregatedRenderPass* render_pass,
       const gfx::Rect& rect,
       bool needs_blending,
-      bool premultiplied_alpha,
       bool low_latency_rendering,
       gfx::ProtectedVideoType protected_video_type,
       SharedImageFormat format,
@@ -758,7 +757,6 @@
                          resource_id, kUVTopLeft, kUVBottomRight,
                          SkColors::kTransparent, nearest_neighbor,
                          /*secure_output=*/false, protected_video_type);
-    overlay_quad->premultiplied_alpha = premultiplied_alpha;
 
     return overlay_quad;
   }
@@ -772,12 +770,11 @@
       const gfx::Size& resource_size_in_pixels,
       SurfaceId test_surface_id = SurfaceId()) {
     bool needs_blending = false;
-    bool premultiplied_alpha = true;
     bool low_latency_rendering = false;
-    return CreateCandidateQuadAt(
-        shared_quad_state, render_pass, rect, needs_blending,
-        premultiplied_alpha, low_latency_rendering, protected_video_type,
-        format, resource_size_in_pixels, test_surface_id);
+    return CreateCandidateQuadAt(shared_quad_state, render_pass, rect,
+                                 needs_blending, low_latency_rendering,
+                                 protected_video_type, format,
+                                 resource_size_in_pixels, test_surface_id);
   }
 
   TextureDrawQuad* CreateCandidateQuadAt(
@@ -788,13 +785,12 @@
       SharedImageFormat format,
       SurfaceId test_surface_id = SurfaceId()) {
     bool needs_blending = false;
-    bool premultiplied_alpha = true;
     bool low_latency_rendering = false;
     gfx::Size resource_size_in_pixels = rect.size();
-    return CreateCandidateQuadAt(
-        shared_quad_state, render_pass, rect, needs_blending,
-        premultiplied_alpha, low_latency_rendering, protected_video_type,
-        format, resource_size_in_pixels, test_surface_id);
+    return CreateCandidateQuadAt(shared_quad_state, render_pass, rect,
+                                 needs_blending, low_latency_rendering,
+                                 protected_video_type, format,
+                                 resource_size_in_pixels, test_surface_id);
   }
 
   TextureDrawQuad* CreateCandidateQuadAt(
@@ -813,17 +809,16 @@
       const gfx::Rect& rect,
       SurfaceId test_surface_id = SurfaceId()) {
     bool needs_blending = false;
-    bool premultiplied_alpha = true;
     bool low_latency_rendering = true;
     gfx::Size resource_size_in_pixels = rect.size();
     gfx::ProtectedVideoType protected_video_type =
         gfx::ProtectedVideoType::kClear;
     SharedImageFormat format = SinglePlaneFormat::kRGBA_8888;
 
-    return CreateCandidateQuadAt(
-        shared_quad_state, render_pass, rect, needs_blending,
-        premultiplied_alpha, low_latency_rendering, protected_video_type,
-        format, resource_size_in_pixels, test_surface_id);
+    return CreateCandidateQuadAt(shared_quad_state, render_pass, rect,
+                                 needs_blending, low_latency_rendering,
+                                 protected_video_type, format,
+                                 resource_size_in_pixels, test_surface_id);
   }
 
   TextureDrawQuad* CreateTransparentCandidateQuadAt(
@@ -831,15 +826,13 @@
       AggregatedRenderPass* render_pass,
       const gfx::Rect& rect) {
     bool needs_blending = true;
-    bool premultiplied_alpha = true;
     bool low_latency_rendering = false;
     gfx::Size resource_size_in_pixels = rect.size();
 
     return CreateCandidateQuadAt(
         shared_quad_state, render_pass, rect, needs_blending,
-        premultiplied_alpha, low_latency_rendering,
-        gfx::ProtectedVideoType::kClear, SinglePlaneFormat::kRGBA_8888,
-        resource_size_in_pixels);
+        low_latency_rendering, gfx::ProtectedVideoType::kClear,
+        SinglePlaneFormat::kRGBA_8888, resource_size_in_pixels);
   }
 
   TextureDrawQuad* CreateFullscreenCandidateQuad(
@@ -855,15 +848,13 @@
       const gfx::Rect& rect,
       const RoundedDisplayMasksInfo& rounded_display_masks_info) {
     bool needs_blending = true;
-    bool premultiplied_alpha = true;
     bool low_latency_rendering = false;
     gfx::Size resource_size_in_pixels;
 
     auto* overlay_quad = CreateCandidateQuadAt(
         shared_quad_state, render_pass, rect, needs_blending,
-        premultiplied_alpha, low_latency_rendering,
-        gfx::ProtectedVideoType::kClear, SinglePlaneFormat::kRGBA_8888,
-        resource_size_in_pixels);
+        low_latency_rendering, gfx::ProtectedVideoType::kClear,
+        SinglePlaneFormat::kRGBA_8888, resource_size_in_pixels);
 
     overlay_quad->rounded_display_masks_info = rounded_display_masks_info;
 
diff --git a/components/viz/service/display/renderer_perftest.cc b/components/viz/service/display/renderer_perftest.cc
index b35beb1d..1763699 100644
--- a/components/viz/service/display/renderer_perftest.cc
+++ b/components/viz/service/display/renderer_perftest.cc
@@ -154,14 +154,10 @@
 TransferableResource CreateTestTexture(
     const gfx::Size& size,
     SkColor4f texel_color,
-    bool premultiplied_alpha,
     ClientResourceProvider* child_resource_provider,
     scoped_refptr<RasterContextProvider> child_context_provider) {
   using SkPMColor4f = SkRGBA4f<kPremul_SkAlphaType>;
-  const SkPMColor4f pixel_color =
-      premultiplied_alpha ? texel_color.premul()
-                          : SkPMColor4f{texel_color.fR, texel_color.fG,
-                                        texel_color.fB, texel_color.fA};
+  const SkPMColor4f pixel_color = texel_color.premul();
 
   size_t num_pixels = static_cast<size_t>(size.width()) * size.height();
   std::vector<SkPMColor4f> pixels(num_pixels, pixel_color);
@@ -190,7 +186,6 @@
 void CreateTestTextureDrawQuad(ResourceId resource_id,
                                const gfx::Rect& rect,
                                SkColor4f background_color,
-                               bool premultiplied_alpha,
                                const SharedQuadState* shared_state,
                                CompositorRenderPass* render_pass) {
   const bool needs_blending = true;
@@ -202,7 +197,6 @@
   quad->SetNew(shared_state, rect, rect, needs_blending, resource_id,
                uv_top_left, uv_bottom_right, background_color, nearest_neighbor,
                /*secure_output=*/false, gfx::ProtectedVideoType::kClear);
-  quad->premultiplied_alpha = premultiplied_alpha;
 }
 
 void CreateTestTileDrawQuad(ResourceId resource_id,
@@ -343,14 +337,13 @@
   ResourceId MapResourceId(base::flat_map<ResourceId, ResourceId>* resource_map,
                            ResourceId recorded_id,
                            const gfx::Size& texture_size,
-                           SkColor4f texel_color,
-                           bool premultiplied_alpha) {
+                           SkColor4f texel_color) {
     DCHECK(resource_map);
     ResourceId actual_id;
     if (resource_map->find(recorded_id) == resource_map->end()) {
-      resource_list_.push_back(CreateTestTexture(
-          texture_size, texel_color, premultiplied_alpha,
-          child_resource_provider_.get(), child_context_provider_));
+      resource_list_.push_back(CreateTestTexture(texture_size, texel_color,
+                                                 child_resource_provider_.get(),
+                                                 child_context_provider_));
       actual_id = resource_list_.back().id;
       (*resource_map)[recorded_id] = actual_id;
     } else {
@@ -373,8 +366,7 @@
             ResourceId recorded_id = tile_quad->resource_id;
             ResourceId actual_id = this->MapResourceId(
                 &resource_map, recorded_id, tile_quad->texture_size,
-                SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-                /*premultiplied_alpha=*/true);
+                SkColor4f{0.0f, 1.0f, 0.0f, 0.5f});
             tile_quad->resource_id = actual_id;
           } break;
           case DrawQuad::Material::kTextureContent: {
@@ -383,8 +375,7 @@
             ResourceId recorded_id = texture_quad->resource_id;
             ResourceId actual_id = this->MapResourceId(
                 &resource_map, recorded_id, texture_quad->rect.size(),
-                SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-                texture_quad->premultiplied_alpha);
+                SkColor4f{0.0f, 1.0f, 0.0f, 0.5f});
             texture_quad->resource_id = actual_id;
           } break;
           default:
@@ -398,8 +389,7 @@
     resource_list_.push_back(CreateTestTexture(
         kSurfaceSize,
         /*texel_color=*/SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-        /*premultiplied_alpha=*/false, child_resource_provider_.get(),
-        child_context_provider_));
+        child_resource_provider_.get(), child_context_provider_));
 
     timer_.Reset();
     do {
@@ -410,8 +400,7 @@
 
       CreateTestTextureDrawQuad(resource_list_.back().id, kSurfaceRect,
                                 /*background_color=*/SkColors::kTransparent,
-                                /*premultiplied_alpha=*/false, shared_state,
-                                pass.get());
+                                shared_state, pass.get());
 
       CompositorRenderPassList pass_list;
       pass_list.push_back(std::move(pass));
@@ -431,8 +420,7 @@
         resource_list_.push_back(CreateTestTexture(
             kTextureSize,
             /*texel_color=*/SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-            /*premultiplied_alpha=*/false, child_resource_provider_.get(),
-            child_context_provider_));
+            child_resource_provider_.get(), child_context_provider_));
         resource_ids[i][j] = resource_list_.back().id;
       }
     }
@@ -449,8 +437,8 @@
               resource_ids[i][j],
               gfx::Rect(i * kTextureSize.width(), j * kTextureSize.height(),
                         kTextureSize.width(), kTextureSize.height()),
-              /*background_color=*/SkColors::kTransparent,
-              /*premultiplied_alpha=*/false, shared_state, pass.get());
+              /*background_color=*/SkColors::kTransparent, shared_state,
+              pass.get());
         }
       }
 
@@ -470,8 +458,7 @@
     resource_list_.push_back(CreateTestTexture(
         kTextureSize,
         /*texel_color=*/SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-        /*premultiplied_alpha=*/false, child_resource_provider_.get(),
-        child_context_provider_));
+        child_resource_provider_.get(), child_context_provider_));
     resource_id = resource_list_.back().id;
 
     timer_.Reset();
@@ -486,8 +473,8 @@
               resource_id,
               gfx::Rect(i * kTextureSize.width(), j * kTextureSize.height(),
                         kTextureSize.width(), kTextureSize.height()),
-              /*background_color=*/SkColors::kTransparent,
-              /*premultiplied_alpha=*/false, shared_state, pass.get());
+              /*background_color=*/SkColors::kTransparent, shared_state,
+              pass.get());
         }
       }
 
@@ -515,16 +502,14 @@
       resource_list_.push_back(CreateTestTexture(
           kTextureSize,
           /*texel_color=*/SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-          /*premultiplied_alpha=*/false, child_resource_provider_.get(),
-          child_context_provider_));
+          child_resource_provider_.get(), child_context_provider_));
     } else {
       // Each TileDrawQuad gets its own resource
       for (int i = 0; i < tile_count; ++i) {
         resource_list_.push_back(CreateTestTexture(
             kTextureSize,
             /*texel_color=*/SkColor4f{0.0f, 1.0f, 0.0f, 0.5f},
-            /*premultiplied_alpha=*/false, child_resource_provider_.get(),
-            child_context_provider_));
+            child_resource_provider_.get(), child_context_provider_));
       }
     }
 
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
index 6a9b434..1e17cc6 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -298,8 +298,9 @@
   if (pending_surfaces_.empty())
     UpdateNeedsBeginFramesInternal();
 
-  for (const auto& directive :
-       surface->GetActiveFrameMetadata().transition_directives) {
+  const CompositorFrameMetadata& active_frame_metadata =
+      surface->GetActiveFrameMetadata();
+  for (const auto& directive : active_frame_metadata.transition_directives) {
     ProcessCompositorFrameTransitionDirective(directive, surface);
   }
 
@@ -343,13 +344,18 @@
   MaybeEvictSurfaces();
 
   // Update |device_scale_factor_| if it changes with latest activated surface.
-  float new_device_scale_factor =
-      surface->GetActiveFrameMetadata().device_scale_factor;
+  float new_device_scale_factor = active_frame_metadata.device_scale_factor;
   if (device_scale_factor_ != new_device_scale_factor) {
     frame_sink_manager_->OnFrameSinkDeviceScaleFactorChanged(
         surface->surface_id().frame_sink_id(), new_device_scale_factor);
     device_scale_factor_ = new_device_scale_factor;
   }
+
+  if (is_mobile_optimized_ != active_frame_metadata.is_mobile_optimized) {
+    is_mobile_optimized_ = active_frame_metadata.is_mobile_optimized;
+    frame_sink_manager_->OnFrameSinkMobileOptimizedChanged(
+        frame_sink_id_, is_mobile_optimized_);
+  }
 }
 
 void CompositorFrameSinkSupport::OnSurfaceWillDraw(Surface* surface) {
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.h b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
index b95c3719..c3cc8e4c 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.h
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
@@ -419,6 +419,8 @@
   // Default value is 1.0.
   float device_scale_factor_ = 1.0;
 
+  bool is_mobile_optimized_ = false;
+
   // By default, this is equivalent to |is_root_|, but may be overridden for
   // testing. Generally, for non-roots, there must not be any CopyOutputRequests
   // contained within submitted CompositorFrames. Otherwise, unprivileged
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
index 330092f..d614bfb 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -854,6 +854,15 @@
   }
 }
 
+void FrameSinkManagerImpl::OnFrameSinkMobileOptimizedChanged(
+    const FrameSinkId& frame_sink_id,
+    bool is_mobile_optimized) {
+  for (auto& observer : observer_list_) {
+    observer.OnFrameSinkMobileOptimizedChanged(frame_sink_id,
+                                               is_mobile_optimized);
+  }
+}
+
 void FrameSinkManagerImpl::AddObserver(FrameSinkObserver* obs) {
   observer_list_.AddObserver(obs);
 }
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
index 2a0bf1f..83ddb185 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -298,6 +298,9 @@
   void OnFrameSinkDeviceScaleFactorChanged(const FrameSinkId& frame_sink_id,
                                            float device_scale_factor);
 
+  void OnFrameSinkMobileOptimizedChanged(const FrameSinkId& frame_sink_id,
+                                         bool is_mobile_optimized);
+
   void AddObserver(FrameSinkObserver* obs);
   void RemoveObserver(FrameSinkObserver* obs);
 
diff --git a/components/viz/service/frame_sinks/frame_sink_observer.h b/components/viz/service/frame_sinks/frame_sink_observer.h
index 1173442..6a7db64a 100644
--- a/components/viz/service/frame_sinks/frame_sink_observer.h
+++ b/components/viz/service/frame_sinks/frame_sink_observer.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_OBSERVER_H_
 #define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_OBSERVER_H_
 
+#include "components/viz/common/quads/compositor_frame_metadata.h"
+
 namespace viz {
 
 class FrameSinkId;
@@ -54,6 +56,12 @@
       const FrameSinkId& frame_sink_id,
       float device_scale_factor) {}
 
+  // Called when the |is_mobile_optimized| related to |frame_sink_id| changes
+  // with latest activated frame.
+  virtual void OnFrameSinkMobileOptimizedChanged(
+      const FrameSinkId& frame_sink_id,
+      bool is_mobile_optimized) {}
+
   // Called when capturing is started for `frame_sink_id`.
   virtual void OnCaptureStarted(const FrameSinkId& frame_sink_id) {}
 };
diff --git a/components/viz/service/input/input_manager.cc b/components/viz/service/input/input_manager.cc
index 31f9d8aa..dfee82c 100644
--- a/components/viz/service/input/input_manager.cc
+++ b/components/viz/service/input/input_manager.cc
@@ -339,6 +339,25 @@
   rir_iter->second->SetDeviceScaleFactor(device_scale_factor);
 }
 
+void InputManager::OnFrameSinkMobileOptimizedChanged(
+    const FrameSinkId& frame_sink_id,
+    bool is_mobile_optimized) {
+  auto rir_itr = rir_map_.find(frame_sink_id);
+  if (rir_itr == rir_map_.end()) {
+    return;
+  }
+  rir_itr->second->input_router()->NotifySiteIsMobileOptimized(
+      is_mobile_optimized);
+
+  auto metadata_itr = frame_sink_metadata_map_.find(frame_sink_id);
+  CHECK(metadata_itr != frame_sink_metadata_map_.end());
+  FrameSinkMetadata& frame_sink_metadata = metadata_itr->second;
+  CHECK(frame_sink_metadata.is_mobile_optimized != is_mobile_optimized);
+  frame_sink_metadata.is_mobile_optimized = is_mobile_optimized;
+  frame_sink_metadata.rir_support->NotifySiteIsMobileOptimized(
+      is_mobile_optimized);
+}
+
 input::TouchEmulator* InputManager::GetTouchEmulator(bool create_if_necessary) {
   return nullptr;
 }
@@ -533,22 +552,6 @@
 #endif
 }
 
-void InputManager::NotifySiteIsMobileOptimized(
-    bool is_mobile_optimized,
-    const FrameSinkId& frame_sink_id) {
-  auto itr = rir_map_.find(frame_sink_id);
-  if (itr == rir_map_.end()) {
-    return;
-  }
-  itr->second->input_router()->NotifySiteIsMobileOptimized(is_mobile_optimized);
-
-  auto metadata_itr = frame_sink_metadata_map_.find(frame_sink_id);
-  CHECK(metadata_itr != frame_sink_metadata_map_.end());
-  metadata_itr->second.is_mobile_optimized = is_mobile_optimized;
-  metadata_itr->second.rir_support->NotifySiteIsMobileOptimized(
-      is_mobile_optimized);
-}
-
 void InputManager::ForceEnableZoomStateChanged(
     bool force_enable_zoom,
     const std::vector<FrameSinkId>& frame_sink_ids) {
diff --git a/components/viz/service/input/input_manager.h b/components/viz/service/input/input_manager.h
index 8f26d0d2..a90c2d2 100644
--- a/components/viz/service/input/input_manager.h
+++ b/components/viz/service/input/input_manager.h
@@ -89,6 +89,8 @@
       const FrameSinkId& child_frame_sink_id) override;
   void OnFrameSinkDeviceScaleFactorChanged(const FrameSinkId& frame_sink_id,
                                            float device_scale_factor) override;
+  void OnFrameSinkMobileOptimizedChanged(const FrameSinkId& frame_sink_id,
+                                         bool is_mobile_optimized) override;
 
   // RenderWidgetHostInputEventRouter::Delegate implementation.
   input::TouchEmulator* GetTouchEmulator(bool create_if_necessary) override;
@@ -141,8 +143,6 @@
 
   // input::mojom::RenderInputRouterDelegate implementation.
   void StateOnTouchTransfer(input::mojom::TouchTransferStatePtr state) override;
-  void NotifySiteIsMobileOptimized(bool is_mobile_optimized,
-                                   const FrameSinkId& frame_sink_id) override;
   void ForceEnableZoomStateChanged(
       bool force_enable_zoom,
       const std::vector<FrameSinkId>& frame_sink_ids) override;
diff --git a/components/viz/test/compositor_frame_helpers.cc b/components/viz/test/compositor_frame_helpers.cc
index bfd8cb32..b7c6264f 100644
--- a/components/viz/test/compositor_frame_helpers.cc
+++ b/components/viz/test/compositor_frame_helpers.cc
@@ -217,7 +217,6 @@
                gfx::PointF(0.0f, 0.0f), gfx::PointF(1.0f, 1.0f),
                params.background_color, params.nearest_neighbor,
                params.secure_output_only, params.protected_video_type);
-  quad->premultiplied_alpha = params.premultiplied_alpha;
   return *this;
 }
 
diff --git a/components/viz/test/compositor_frame_helpers.h b/components/viz/test/compositor_frame_helpers.h
index 8b36c0d2..2fb2ec4 100644
--- a/components/viz/test/compositor_frame_helpers.h
+++ b/components/viz/test/compositor_frame_helpers.h
@@ -47,7 +47,6 @@
 
 struct TextureQuadParams {
   bool needs_blending = false;
-  bool premultiplied_alpha = false;
   SkColor4f background_color = SkColors::kGreen;
   bool nearest_neighbor = false;
   bool secure_output_only = false;
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.cc b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
index 809de94..aaaa7481 100644
--- a/content/browser/accessibility/dump_accessibility_browsertest_base.cc
+++ b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
@@ -440,27 +440,6 @@
   ui::AccessibilityState::ForceRespectDisplayedPasswordTextForTesting();
 #endif
 
-  // If there are unwanted AXMode flags already set, skip the test.
-  // TODO(crbug.com/371230119): This condition is mostly needed because the
-  // Android Automotive bot is enabling accessibility with kAXModeComplete,
-  // which causes form controls tests to fail, but it could also help prevent
-  // future failures where bots turn on the wrong flags for a test.
-  ui::AXMode initial_ax_mode =
-      BrowserAccessibilityState::GetInstance()->GetAccessibilityMode();
-  // Perform a bitwise AND between initial_ax_mode and the bitwise NOT of
-  // ax_mode_for_test. If the result is non-zero, it means there are flags set
-  // in initial_ax_mode that are NOT set in ax_mode_for_test.
-  ui::AXMode unwanted_mode_flags = ~ax_mode_for_test;
-  if ((initial_ax_mode & unwanted_mode_flags).is_mode_off() == false) {
-    // There were extra AXMode flags present, so the test cannot continue.
-    GTEST_SKIP() << "The initial AXMode contained more flags than the test is "
-                    "designed for."
-                 << "\n* Test requires: " << ax_mode_for_test
-                 << "\n* Initial AXMode: " << initial_ax_mode
-                 << "\n* Extra, unwanted flags: "
-                 << (initial_ax_mode & unwanted_mode_flags);
-  }
-
   // Normally some accessibility events that would be fired are suppressed or
   // delayed, depending on what has focus or the type of event. For testing,
   // we want all events to fire immediately to make tests predictable and not
diff --git a/content/browser/browsing_instance.cc b/content/browser/browsing_instance.cc
index 3d6bc8e..3fd633d 100644
--- a/content/browser/browsing_instance.cc
+++ b/content/browser/browsing_instance.cc
@@ -41,6 +41,7 @@
               browser_context)),
       active_contents_count_(0u),
       default_site_instance_(nullptr),
+      default_site_instance_group_(nullptr),
       web_exposed_isolation_info_(web_exposed_isolation_info),
       is_fixed_storage_partition_(is_fixed_storage_partition) {
   DCHECK(browser_context);
@@ -231,6 +232,7 @@
   DCHECK(site_instance_map_.empty());
   DCHECK_EQ(0u, active_contents_count_);
   DCHECK(!default_site_instance_);
+  DCHECK(!default_site_instance_group_);
 
   // Remove any origin isolation opt-ins related to this instance.
   ChildProcessSecurityPolicyImpl* policy =
diff --git a/content/browser/browsing_instance.h b/content/browser/browsing_instance.h
index e8b90bf1..01d9e14 100644
--- a/content/browser/browsing_instance.h
+++ b/content/browser/browsing_instance.h
@@ -17,6 +17,7 @@
 #include "content/browser/isolation_context.h"
 #include "content/browser/web_exposed_isolation_info.h"
 #include "content/common/content_export.h"
+#include "content/common/content_navigation_policy.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/storage_partition_config.h"
@@ -220,9 +221,26 @@
   void IncrementActiveContentsCount();
   void DecrementActiveContentsCount();
 
-  bool HasDefaultSiteInstance() const {
+  SiteInstanceImpl* default_site_instance() {
+    DCHECK(!ShouldUseDefaultSiteInstanceGroup());
+    return default_site_instance_;
+  }
+  SiteInstanceGroup* default_site_instance_group() {
+    DCHECK(ShouldUseDefaultSiteInstanceGroup());
+    return default_site_instance_group_.get();
+  }
+  bool has_default_site_instance() const {
+    DCHECK(!ShouldUseDefaultSiteInstanceGroup());
     return default_site_instance_ != nullptr;
   }
+  bool has_default_site_instance_group() const {
+    DCHECK(ShouldUseDefaultSiteInstanceGroup());
+    return default_site_instance_group_ != nullptr;
+  }
+  void set_default_site_instance_group(base::WeakPtr<SiteInstanceGroup> group) {
+    DCHECK(ShouldUseDefaultSiteInstanceGroup());
+    default_site_instance_group_ = group;
+  }
 
   // Helper function used by other methods in this class to ensure consistent
   // mapping between |url_info| and SiteInfo. This method will never return a
@@ -247,8 +265,6 @@
     return web_exposed_isolation_info_;
   }
 
-  SiteInstanceImpl* default_site_instance() { return default_site_instance_; }
-
   size_t active_contents_count() { return active_contents_count_; }
 
   // The next available browser-global BrowsingInstance ID.
@@ -286,6 +302,15 @@
   // cross-origin isolated pages.
   raw_ptr<SiteInstanceImpl> default_site_instance_;
 
+  // SiteInstanceGroup to be used for sites that do not require a dedicated
+  // process. Each site will have its own SiteInstance, but they will share a
+  // process by all being in this group.
+  // This is a WeakPtr since SiteInstanceGroup is kept alive by SiteInstances in
+  // the group that refcount it. Since this pointer exists to track a particular
+  // SiteInstanceGroup for a BrowsingInstance, `this` should not modify the
+  // lifetime of the SiteInstanceGroup.
+  base::WeakPtr<SiteInstanceGroup> default_site_instance_group_;
+
   // The cross-origin isolation status of the BrowsingInstance. This indicates
   // whether this BrowsingInstance is hosting only cross-origin isolated pages
   // and if so, from which top level origin.
diff --git a/content/browser/child_process_security_policy_unittest.cc b/content/browser/child_process_security_policy_unittest.cc
index 981fc0d..9cb0357 100644
--- a/content/browser/child_process_security_policy_unittest.cc
+++ b/content/browser/child_process_security_policy_unittest.cc
@@ -3294,13 +3294,19 @@
                        StoragePartitionConfig::CreateDefault(&context),
                        WebExposedIsolationInfo::CreateNonIsolated()));
 
-    EXPECT_TRUE(foo_instance->IsDefaultSiteInstance());
     EXPECT_TRUE(foo_instance->HasSite());
-    EXPECT_EQ(foo_instance->GetSiteInfo(),
-              SiteInfo::CreateForDefaultSiteInstance(
-                  foo_instance->GetIsolationContext(),
-                  StoragePartitionConfig::CreateDefault(&context),
-                  WebExposedIsolationInfo::CreateNonIsolated()));
+    if (ShouldUseDefaultSiteInstanceGroup()) {
+      EXPECT_EQ(foo_instance->group(),
+                foo_instance->DefaultSiteInstanceGroupForBrowsingInstance());
+      EXPECT_EQ(foo_instance->GetSiteURL(), foo_url);
+    } else {
+      EXPECT_TRUE(foo_instance->IsDefaultSiteInstance());
+      EXPECT_EQ(foo_instance->GetSiteInfo(),
+                SiteInfo::CreateForDefaultSiteInstance(
+                    foo_instance->GetIsolationContext(),
+                    StoragePartitionConfig::CreateDefault(&context),
+                    WebExposedIsolationInfo::CreateNonIsolated()));
+    }
     EXPECT_FALSE(foo_instance->RequiresDedicatedProcess());
   }
   // At this point foo_instance has gone away, and all BrowsingInstanceIDs
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index a3da30a5..5273cd66 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -1370,6 +1370,17 @@
         gfx::ScaleToRoundedSize(requested_image_size, scale);
   }
 
+  // TODO(crbug.com/377715191): this should check RenderWidgetHostViewBase
+  // instead, but there is no easy way to do this today. Once that's possible,
+  // this check should move inside RenderWidetHostImpl::GetSnapshotFromBrowser.
+  if (base::FeatureList::IsEnabled(features::kCDPScreenshotNewSurface)) {
+    if (auto* wc = WebContentsImpl::FromRenderFrameHostImpl(host_)) {
+      // When view is completely hidden, capturing a surface snapshot
+      // will stall because the surface is never presented.
+      CHECK(wc->GetPageVisibilityState() != PageVisibilityState::kHidden);
+    }
+  }
+
   widget_host->GetSnapshotFromBrowser(
       base::BindOnce(&PageHandler::ScreenshotCaptured,
                      weak_factory_.GetWeakPtr(), std::move(pending_request)),
diff --git a/content/browser/preloading/prefetch/prefetch_scheduler.cc b/content/browser/preloading/prefetch/prefetch_scheduler.cc
index e39b49a..2b69d41 100644
--- a/content/browser/preloading/prefetch/prefetch_scheduler.cc
+++ b/content/browser/preloading/prefetch/prefetch_scheduler.cc
@@ -210,7 +210,8 @@
 }
 
 void PrefetchScheduler::RemoveAndProgressAsync(
-    PrefetchContainer& prefetch_container) {
+    PrefetchContainer& prefetch_container,
+    bool should_progress) {
   [&]() {
     for (auto it = active_set_.cbegin(); it != active_set_.cend(); ++it) {
       if (it->get() == &prefetch_container) {
@@ -222,6 +223,10 @@
     queue_.Remove(prefetch_container.GetWeakPtr());
   }();
 
+  if (!should_progress) {
+    return;
+  }
+
   // This method can be called in `PrefetechService::EvictPrefetch()` called in
   // `ProcessOne()`. Don't call `ProcessAsync()` to prevent infinite loop in
   // that case.
@@ -231,7 +236,12 @@
 }
 
 void PrefetchScheduler::NotifyAttributeMightChangedAndProgressAsync(
-    PrefetchContainer& prefetch_container) {
+    PrefetchContainer& prefetch_container,
+    bool should_progress) {
+  if (!should_progress) {
+    return;
+  }
+
   const bool is_changed = queue_.MaybeUpdatePriority(
       prefetch_container, CalculatePriority(prefetch_container));
   if (is_changed) {
diff --git a/content/browser/preloading/prefetch/prefetch_scheduler.h b/content/browser/preloading/prefetch/prefetch_scheduler.h
index a5d2e2b..4660a102 100644
--- a/content/browser/preloading/prefetch/prefetch_scheduler.h
+++ b/content/browser/preloading/prefetch/prefetch_scheduler.h
@@ -169,11 +169,15 @@
   // can't detect changes of `PrefetchDocumentManager` and
   // `PrefetchDocumentManager::CanPrefetchNow()`. So, `PrefetchService` must
   // explicitly call `Progress()`.
+  //
+  // If `should_progress` is false, doesn't call `ProgressAsync()`.
   void PushAndProgressAsync(PrefetchContainer& prefetch_container);
   // Note that this doesn't call `PrefetchService::ResetPrefetchContainer()`.
-  void RemoveAndProgressAsync(PrefetchContainer& prefetch_container);
+  void RemoveAndProgressAsync(PrefetchContainer& prefetch_container,
+                              bool should_progress = true);
   void NotifyAttributeMightChangedAndProgressAsync(
-      PrefetchContainer& prefetch_container);
+      PrefetchContainer& prefetch_container,
+      bool should_proggress = true);
 
   // Progress scheduling
   //
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc
index ed57c75..cf1c25c 100644
--- a/content/browser/preloading/prefetch/prefetch_service.cc
+++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -470,11 +470,12 @@
           std::move(owned_prefetch_container));
       if (UsePrefetchScheduler()) {
         scheduler_->NotifyAttributeMightChangedAndProgressAsync(
-            *prefetch_iter->second);
+            *prefetch_iter->second, /*should_progress=*/false);
       }
       break;
     case Action::kReplaceOldWithNew:
-      ResetPrefetchContainer(prefetch_iter->second->GetWeakPtr());
+      ResetPrefetchContainer(prefetch_iter->second->GetWeakPtr(),
+                             /*should_progress=*/false);
       owned_prefetches_[prefetch_container_key] =
           std::move(owned_prefetch_container);
       owned_prefetches_[prefetch_container_key]->OnAddedToPrefetchService();
@@ -1434,7 +1435,8 @@
 }
 
 void PrefetchService::ResetPrefetchContainer(
-    base::WeakPtr<PrefetchContainer> prefetch_container) {
+    base::WeakPtr<PrefetchContainer> prefetch_container,
+    bool should_progress) {
   CHECK(prefetch_container);
 
   if (!UsePrefetchScheduler()) {
@@ -1444,7 +1446,7 @@
   } else {
     // Remove before calling `PrefetchContainer::dtor()` as `PrefetchScheduler`
     // manages them with weak pointers.
-    scheduler_->RemoveAndProgressAsync(*prefetch_container);
+    scheduler_->RemoveAndProgressAsync(*prefetch_container, should_progress);
   }
 
   auto it = owned_prefetches_.find(prefetch_container->key());
diff --git a/content/browser/preloading/prefetch/prefetch_service.h b/content/browser/preloading/prefetch/prefetch_service.h
index ec2afd40..de3d3dc 100644
--- a/content/browser/preloading/prefetch/prefetch_service.h
+++ b/content/browser/preloading/prefetch/prefetch_service.h
@@ -445,8 +445,11 @@
   void RecordExistingPrefetchWithMatchingURL(
       base::WeakPtr<PrefetchContainer> prefetch_container) const;
 
+  // If `should_progress` is true, calls `PrefetchScheduler::ProgressAsync()`
+  // (implicitly). This argument is meaningful only if `UsePrefetchScheduler()`.
   void ResetPrefetchContainer(
-      base::WeakPtr<PrefetchContainer> prefetch_container);
+      base::WeakPtr<PrefetchContainer> prefetch_container,
+      bool should_progress = true);
 
   // Methods for scheduling
   void ScheduleAndProgress(base::WeakPtr<PrefetchContainer> prefetch_container);
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc
index 1fd69fc..971a0ab 100644
--- a/content/browser/preloading/prerender/prerender_browsertest.cc
+++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -2798,6 +2798,48 @@
   EXPECT_EQ(web_contents()->GetLastCommittedURL(), kInitialUrl);
 }
 
+// Tests that clicking a link annotated with "target=_blank" does not activate a
+// mismatched prerender url whose target_hint is "_blank" and the navigation
+// does not cancel the prerender.
+IN_PROC_BROWSER_TEST_F(
+    PrerenderTargetHintEnabledBrowserTest,
+    DoesNotActivateOnMismatchedLinkClick_TargetBlank_WithTargetHintBlank) {
+  const GURL initial_url = GetUrl("/simple_links.html");
+  const GURL prerendering_url = GetUrl("/title2.html?different");
+
+  // Navigate to an initial page which has a link other than `prerendering_url`.
+  ASSERT_TRUE(NavigateToURL(shell(), initial_url));
+
+  // Start prerendering `prerendering_url`.
+  FrameTreeNodeId host_id = prerender_helper()->AddPrerender(
+      prerendering_url, /*eagerness=*/std::nullopt, "_blank");
+  auto* prerender_web_contents = WebContents::FromFrameTreeNodeId(host_id);
+  ASSERT_NE(prerender_web_contents, web_contents_impl());
+  ExpectWebContentsIsForNewTabPrerendering(*prerender_web_contents);
+
+  // Click the link annotated with "target=_blank" but different from the
+  // prerendered url. This should not activate the prerendered page.
+  TestNavigationObserver nav_observer(GetUrl("/title2.html"));
+  nav_observer.StartWatchingNewWebContents();
+  test::PrerenderHostObserver prerender_observer(*prerender_web_contents,
+                                                 host_id);
+  const std::string kLinkClickScript = R"(
+      clickSameSiteNewWindowLink();
+  )";
+  EXPECT_TRUE(ExecJs(web_contents(), kLinkClickScript));
+  nav_observer.WaitForNavigationFinished();
+  EXPECT_FALSE(prerender_observer.was_activated());
+  EXPECT_FALSE(HasHostForUrl(prerendering_url));
+
+  // Navigating a different url than the prerendered url into a new tab should
+  // not cancel the prerender.
+  EXPECT_TRUE(prerender_helper()->HasNewTabHandle(host_id));
+
+  // The navigation occurred in a new WebContents, so the original WebContents
+  // should still be showing the initial trigger page.
+  EXPECT_EQ(web_contents()->GetLastCommittedURL(), initial_url);
+}
+
 // Tests that clicking a link annotated with "target=_blank" can activate a
 // prerender whose target_hint is "_blank" where the initiator page is in the
 // background when the speculation rules were added.
diff --git a/content/browser/renderer_host/frame_tree_browsertest.cc b/content/browser/renderer_host/frame_tree_browsertest.cc
index 3a617df..1356bb98 100644
--- a/content/browser/renderer_host/frame_tree_browsertest.cc
+++ b/content/browser/renderer_host/frame_tree_browsertest.cc
@@ -2149,6 +2149,92 @@
                          "window.credentialless"));
 }
 
+class FrameTreeLastSuccessfulOriginBrowserTest : public FrameTreeBrowserTest {
+ public:
+  FrameTreeLastSuccessfulOriginBrowserTest() = default;
+};
+
+IN_PROC_BROWSER_TEST_F(FrameTreeLastSuccessfulOriginBrowserTest,
+                       SuccessfulNavigation) {
+  GURL main_url(embedded_test_server()->GetURL("a.test", "/hello.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  // After a successful navigation, the "last committed origin" and the
+  // "last successfully committed origin" should be the same.
+  EXPECT_FALSE(root->current_origin().opaque());
+  EXPECT_EQ(root->current_origin().GetTupleOrPrecursorTupleIfOpaque().host(),
+            "a.test");
+  EXPECT_EQ(root->last_successful_origin(), root->current_origin());
+}
+
+IN_PROC_BROWSER_TEST_F(FrameTreeLastSuccessfulOriginBrowserTest,
+                       FailedNavigationAfterSuccessfulNavigation) {
+  // First, perform a successful navigation, so that the root FrameTreeNode has
+  // a non-opaque `last_successful_origin()`.
+  GURL main_url(embedded_test_server()->GetURL("a.test", "/hello.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+  EXPECT_EQ(root->last_successful_origin(), root->current_origin());
+  url::Origin initial_successful_origin = root->last_successful_origin();
+
+  // Now, navigate to a malformed URL to force an error page.
+  TestFrameNavigationObserver navigation_observer(root);
+  EXPECT_TRUE(ExecJs(root, R"(location.href = 'https://hello';)"));
+  navigation_observer.Wait();
+
+  EXPECT_FALSE(navigation_observer.last_navigation_succeeded());
+  EXPECT_TRUE(root->current_frame_host()->IsErrorDocument());
+
+  // The new error document should have an opaque origin, but the frame's
+  // `last_successful_origin()` should remain the same as the initial origin
+  // from the first successful navigation.
+  EXPECT_TRUE(root->current_origin().opaque());
+  EXPECT_NE(root->last_successful_origin(), root->current_origin());
+  EXPECT_EQ(root->last_successful_origin(), initial_successful_origin);
+}
+
+IN_PROC_BROWSER_TEST_F(FrameTreeLastSuccessfulOriginBrowserTest,
+                       CorrectStateForNewMainFrame) {
+  // Don't navigate the root frame to anything. It should have an empty URL with
+  // an opaque origin.
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+  EXPECT_TRUE(root->current_frame_host()->GetLastCommittedURL().is_empty());
+  EXPECT_TRUE(root->current_origin().opaque());
+  EXPECT_EQ(root->last_successful_origin(), root->current_origin());
+}
+
+IN_PROC_BROWSER_TEST_F(FrameTreeLastSuccessfulOriginBrowserTest,
+                       CorrectStateForNewSubframe) {
+  GURL main_url(embedded_test_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,
+                     "let frame = document.createElement('iframe');"
+                     "document.body.appendChild(frame);"));
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* new_frame = root->child_at(0);
+
+  // Our new subframe hasn't been navigated yet, so its current URL is
+  // about:blank. It has also inherited the origin of its creator, and the
+  // last successful origin should be the same.
+  EXPECT_EQ(new_frame->current_url(), url::kAboutBlankURL);
+  EXPECT_EQ(new_frame->current_origin().host(), "a.test");
+  EXPECT_EQ(new_frame->last_successful_origin(), new_frame->current_origin());
+}
+
 INSTANTIATE_TEST_SUITE_P(
     ,
     FrameTreeBrowserWithDiscardTest,
diff --git a/content/browser/renderer_host/frame_tree_node.h b/content/browser/renderer_host/frame_tree_node.h
index 793ef79f..a4baf08 100644
--- a/content/browser/renderer_host/frame_tree_node.h
+++ b/content/browser/renderer_host/frame_tree_node.h
@@ -225,6 +225,21 @@
     return render_manager_.current_replication_state().origin;
   }
 
+  // Returns the origin of the last *successfully* committed page in this
+  // frame. This may be different from current_origin() if the current page is
+  // an error page.
+  // IMPORTANT: Use current_origin() instead, as all security-relevant decisions
+  // should be made using the current origin of the frame. The last successful
+  // origin is only relevant for specific abuse mitigations that require
+  // tracking the previous state of a frame before an error page navigation.
+  const url::Origin& last_successful_origin() const {
+    return last_successful_origin_;
+  }
+
+  void set_last_successful_origin(const url::Origin& origin) {
+    last_successful_origin_ = origin;
+  }
+
   // Returns the latest frame policy (sandbox flags and container policy) for
   // this frame. This includes flags inherited from parent frames and the latest
   // flags from the <iframe> element hosting this frame. The returned policies
@@ -949,6 +964,14 @@
   // See `CancelRestartingBackForwardCacheNavigation()`.
   base::CancelableTaskTracker restart_back_forward_cached_navigation_tracker_;
 
+  // The last successfully committed origin in this frame. Set in two scenarios:
+  // 1. By RenderFrameHostImpl::DidNavigate() when a navigation in this frame
+  //    succeeds.
+  // 2. By RenderFrameHostImpl::SetOriginDependentStateOfNewFrame() when a new
+  //    frame is first created, which will reflect the origin of the initial
+  //    about::blank document before any navigation has committed.
+  url::Origin last_successful_origin_;
+
   // Manages creation and swapping of RenderFrameHosts for this frame.
   //
   // This field needs to be declared last, because destruction of
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index b9dd475..55e159a7 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -302,13 +302,18 @@
       return "FAILED_DUE_TO_SHUTDOWN";
     case blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON:
       return "KILL_SWITCH_ON";
-    case blink::mojom::MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED:
-      return "SYSTEM_PERMISSION_DENIED";
+    case blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM:
+      return "PERMISSION_DENIED_BY_SYSTEM";
+    case blink::mojom::MediaStreamRequestResult::DEVICE_IN_USE:
+      return "DEVICE_IN_USE";
+    case blink::mojom::MediaStreamRequestResult::REQUEST_CANCELLED:
+      return "REQUEST_CANCELLED";
+    case blink::mojom::MediaStreamRequestResult::START_TIMEOUT:
+      return "START_TIMEOUT";
     case blink::mojom::MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS:
-      return "NUM_MEDIA_REQUEST_RESULTS";
-    default:
-      NOTREACHED();
+      break;  // Not a valid enum value.
   }
+  NOTREACHED();
 }
 
 std::string GetGenerateStreamsLogString(
diff --git a/content/browser/renderer_host/media/media_stream_metrics.cc b/content/browser/renderer_host/media/media_stream_metrics.cc
index 68322adf..6792809 100644
--- a/content/browser/renderer_host/media/media_stream_metrics.cc
+++ b/content/browser/renderer_host/media/media_stream_metrics.cc
@@ -72,7 +72,7 @@
       return MediaStreamRequestResult2::kFailedDueToShutdown;
     case MediaStreamRequestResult::KILL_SWITCH_ON:
       return MediaStreamRequestResult2::kKillSwitchOn;
-    case MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED:
+    case MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM:
       return MediaStreamRequestResult2::kSystemPermissionDenied;
     case MediaStreamRequestResult::DEVICE_IN_USE:
       return MediaStreamRequestResult2::kDeviceInUse;
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index e577637..e35fc05 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -9101,6 +9101,10 @@
   return net_error_;
 }
 
+int NavigationRequest::GetNetExtendedErrorCode() {
+  return extended_error_code_;
+}
+
 // The RenderFrameHost that will commit the navigation or an error page.
 // This is computed when the response is received, or when the navigation
 // fails and error page should be displayed.
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 1cf67402..ff3d3edb 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -393,6 +393,7 @@
   NavigationUIData* GetNavigationUIData() override;
   bool IsExternalProtocol() override;
   net::Error GetNetErrorCode() override;
+  int GetNetExtendedErrorCode() override;
   RenderFrameHostImpl* GetRenderFrameHost() const override;
   bool IsSameDocument() const override;
   bool IsHistory() const override;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index bfbbb55..db20a84 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -4903,8 +4903,11 @@
   // occurred.
   // TODO(creis): Remove this block and always set the URL.
   // See https://crbug.com/588314.
-  if (!navigation_request->DidEncounterError())
+  if (!navigation_request->DidEncounterError()) {
     last_successful_url_ = params.url;
+    navigation_request->frame_tree_node()->set_last_successful_origin(
+        GetLastCommittedOrigin());
+  }
 
   renderer_url_info_.last_document_url = GetLastDocumentURL(
       navigation_request, params, is_error_document_, renderer_url_info_);
@@ -5399,6 +5402,9 @@
                     : false;
   SetLastCommittedOrigin(new_frame_origin,
                          is_potentially_trustworthy_unique_origin);
+  if (!creator_frame || !creator_frame->is_error_document_) {
+    frame_tree_node()->set_last_successful_origin(new_frame_origin);
+  }
 
   if (creator_frame) {
     // If we're given a parent/opener frame, copy the
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
index 0009b0a..809e481 100644
--- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -1870,14 +1870,14 @@
   EXPECT_EQ(main_frame, child->GetBeforeUnloadInitiator());
   EXPECT_EQ(main_frame, main_frame->GetBeforeUnloadInitiator());
 
-  // When in a strict SiteInstances mode, LoadURL() should trigger two
-  // beforeunload IPCs for subframe and the main frame: the subframe has a
-  // beforeunload handler, and while the main frame does not, we always send the
-  // IPC to navigating frames, regardless of whether or not they have a handler.
+  // With full site isolation, LoadURL() should trigger two beforeunload IPCs
+  // for subframe and the main frame: the subframe has a beforeunload handler,
+  // and while the main frame does not, we always send the IPC to navigating
+  // frames, regardless of whether or not they have a handler.
   //
-  // Without strict SiteInstances, only one beforeunload IPC should be sent to
+  // Without full site isolation, only one beforeunload IPC should be sent to
   // the main frame, which will handle both (same-process) frames.
-  EXPECT_EQ(AreStrictSiteInstancesEnabled() ? 2u : 1u,
+  EXPECT_EQ(AreAllSitesIsolatedForTesting() ? 2u : 1u,
             main_frame->beforeunload_pending_replies_.size());
 
   // Wait for the beforeunload dialog to be shown from the subframe.
@@ -1890,12 +1890,12 @@
   EXPECT_TRUE(main_frame->is_waiting_for_beforeunload_completion());
   EXPECT_FALSE(child->is_waiting_for_beforeunload_completion());
 
-  // In a strict SiteInstances mode, the beforeunload completion callback should
-  // happen on the child RFH.  Without strict SiteInstances, it will come from
-  // the main frame RFH, which processes beforeunload for both main frame and
-  // child frame, since they are in the same process and SiteInstance.
+  // With full site isolation, the beforeunload completion callback should
+  // happen on the child RFH. Without full site isolation, it will come from the
+  // main frame RFH, which processes beforeunload for both main frame and child
+  // frame, since they are in the same process and SiteInstance.
   RenderFrameHostImpl* frame_that_sent_beforeunload_ipc =
-      AreStrictSiteInstancesEnabled() ? child : main_frame;
+      AreAllSitesIsolatedForTesting() ? child : main_frame;
   EXPECT_TRUE(main_frame->beforeunload_pending_replies_.count(
       frame_that_sent_beforeunload_ipc));
 
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index 0034cf61..ddc399e 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -320,7 +320,7 @@
       new_shell, embedded_test_server()->GetURL("foo.com", "/title1.html")));
   scoped_refptr<SiteInstance> new_site_instance(
       new_shell->web_contents()->GetSiteInstance());
-  if (AreAllSitesIsolatedForTesting()) {
+  if (AreStrictSiteInstancesEnabled()) {
     EXPECT_NE(orig_site_instance, new_site_instance);
   } else {
     EXPECT_EQ(orig_site_instance, new_site_instance);
@@ -571,10 +571,11 @@
   EXPECT_EQ("/title2.html",
             new_shell->web_contents()->GetLastCommittedURL().path());
 
-  // Should have the same SiteInstance unless we're in site-per-process mode.
+  // Should have the same SiteInstance unless we're in site-per-process mode, or
+  // default SiteInstanceGroups mode.
   scoped_refptr<SiteInstance> blank_site_instance(
       new_shell->web_contents()->GetSiteInstance());
-  if (AreAllSitesIsolatedForTesting()) {
+  if (AreStrictSiteInstancesEnabled()) {
     EXPECT_NE(orig_site_instance, blank_site_instance);
   } else {
     EXPECT_EQ(orig_site_instance, blank_site_instance);
@@ -3808,7 +3809,7 @@
   // unsuccessfully-navigated third instance of B with a blank URL.  When not in
   // strict SiteInstance mode, the FrameTreeVisualizer depicts all nodes as
   // referencing Site A because iframes are identified with their root site.
-  if (AreStrictSiteInstancesEnabled()) {
+  if (AreAllSitesIsolatedForTesting()) {
     EXPECT_EQ(
         " Site A ------------ proxies for B\n"
         "   +--Site B ------- proxies for A\n"
@@ -3818,6 +3819,18 @@
         "Where A = http://a.com/\n"
         "      B = http://b.com/",
         DepictFrameTree(*root));
+  } else if (ShouldUseDefaultSiteInstanceGroup()) {
+    // No proxies needed for different SiteInstance in the same
+    // SiteInstanceGroup.
+    EXPECT_EQ(
+        " Site A\n"
+        "   +--Site B\n"
+        "        +--Site A\n"
+        "             +--Site B\n"
+        "                  +--Site B\n"
+        "Where A = http://a.com/\n"
+        "      B = http://b.com/",
+        DepictFrameTree(*root));
   } else {
     const GURL kExpectedSiteURL = AreAllSitesIsolatedForTesting()
                                       ? GURL("http://a.com/")
@@ -3876,7 +3889,7 @@
 
   // The FrameTree contains two successful instances of the url plus an
   // unsuccessfully-navigated third instance with a blank URL.
-  const GURL kExpectedSiteURL = AreAllSitesIsolatedForTesting()
+  const GURL kExpectedSiteURL = AreStrictSiteInstancesEnabled()
                                     ? GURL("http://a.com/")
                                     : SiteInstanceImpl::GetDefaultSiteURL();
   EXPECT_EQ(std::string(" Site A\n"
@@ -3910,7 +3923,7 @@
 
   // The third navigation should fail and be cancelled, leaving a FrameTree with
   // a height of 2.
-  const GURL kExpectedSiteURL = AreAllSitesIsolatedForTesting()
+  const GURL kExpectedSiteURL = AreStrictSiteInstancesEnabled()
                                     ? GURL("http://a.com/")
                                     : SiteInstanceImpl::GetDefaultSiteURL();
   // The FrameTreeVisualizer test ensure that the childmost frame is not loaded.
@@ -4267,7 +4280,7 @@
   rfh = static_cast<WebContentsImpl*>(shell()->web_contents())
             ->GetPrimaryMainFrame();
   SiteInstanceImpl* a_site_instance = rfh->GetSiteInstance();
-  if (AreAllSitesIsolatedForTesting()) {
+  if (AreStrictSiteInstancesEnabled()) {
     EXPECT_EQ("http://a.com/", a_site_instance->GetSiteURL());
   } else {
     EXPECT_TRUE(a_site_instance->IsDefaultSiteInstance());
@@ -4279,7 +4292,7 @@
   EXPECT_EQ(1UL, rfh->child_count());
   SiteInstanceImpl* b_site_instance = static_cast<SiteInstanceImpl*>(
       rfh->child_at(0)->current_frame_host()->GetSiteInstance());
-  if (AreAllSitesIsolatedForTesting()) {
+  if (AreStrictSiteInstancesEnabled()) {
     EXPECT_EQ("http://b.com/", b_site_instance->GetSiteURL());
   } else {
     EXPECT_TRUE(b_site_instance->IsDefaultSiteInstance());
@@ -4911,6 +4924,10 @@
     if (AreAllSitesIsolatedForTesting()) {
       EXPECT_EQ("c.com", c_site_url.host());
       EXPECT_EQ(test_url.host(), c_site_url.host());
+    } else if (ShouldUseDefaultSiteInstanceGroup()) {
+      EXPECT_EQ(
+          child1_site_instance->group(),
+          child1_site_instance->DefaultSiteInstanceGroupForBrowsingInstance());
     } else {
       EXPECT_TRUE(child1_site_instance->IsDefaultSiteInstance());
     }
@@ -5068,23 +5085,23 @@
   // to a site for |url|. This triggers the creation of a new BrowsingInstance
   // and therefore a new SiteInstance.
   EXPECT_TRUE(NavigateToURL(shell(), url));
-  EXPECT_FALSE(HasErrorPageSiteInfo(
-      shell()->web_contents()->GetPrimaryMainFrame()->GetSiteInstance()));
+  SiteInstanceImpl* site_instance = static_cast<SiteInstanceImpl*>(
+      shell()->web_contents()->GetPrimaryMainFrame()->GetSiteInstance());
+  EXPECT_FALSE(HasErrorPageSiteInfo(site_instance));
+
+  // Verify that we get the default SiteInstance or SiteInstanceGroup because
+  // the original URL does not require a dedicated process.
   if (!AreAllSitesIsolatedForTesting()) {
-    // Verify that we get the default SiteInstance because the original URL does
-    // not require a dedicated process.
-    EXPECT_TRUE(
-        static_cast<SiteInstanceImpl*>(
-            shell()->web_contents()->GetPrimaryMainFrame()->GetSiteInstance())
-            ->IsDefaultSiteInstance());
+    if (ShouldUseDefaultSiteInstanceGroup()) {
+      EXPECT_EQ(site_instance->group(),
+                site_instance->DefaultSiteInstanceGroupForBrowsingInstance());
+    } else {
+      EXPECT_TRUE(site_instance->IsDefaultSiteInstance());
+    }
   }
-  EXPECT_EQ(success_site_instance->GetSiteURL(), shell()
-                                                     ->web_contents()
-                                                     ->GetPrimaryMainFrame()
-                                                     ->GetSiteInstance()
-                                                     ->GetSiteURL());
-  EXPECT_NE(success_site_instance,
-            shell()->web_contents()->GetPrimaryMainFrame()->GetSiteInstance());
+
+  EXPECT_EQ(success_site_instance->GetSiteURL(), site_instance->GetSiteURL());
+  EXPECT_NE(success_site_instance, site_instance);
 
   EXPECT_EQ(3, nav_controller.GetEntryCount());
 
@@ -6871,9 +6888,9 @@
     // GetFrameHostForNavigation is called twice for the navigation above.
     // The first call was when there's no associated RFH yet, then it will
     // create a speculative RFH. Then on the second call we keep using the same
-    // speculative RFH. Note that if all of Site Isolation, BFCache, and
-    // RenderDocument are turned off, we'll just reuse current RFH in both
-    // cases.
+    // speculative RFH. Note that if all of Site Isolation, BFCache,
+    // RenderDocument and default SiteInstanceGroup are turned off, we'll just
+    // reuse current RFH in both cases.
     EXPECT_THAT(
         histogram_tester.GetAllSamples(
             "Navigation.All.WastedSpeculativeRFHCase"),
@@ -6881,7 +6898,7 @@
             base::Bucket(WastedSpeculativeRFHCase::kNotWasted_WasUnassociated,
                          1),
             base::Bucket(
-                (AreAllSitesIsolatedForTesting() ||
+                (AreStrictSiteInstancesEnabled() ||
                  CanSameSiteMainFrameNavigationsChangeRenderFrameHosts())
                     ? WastedSpeculativeRFHCase::
                           kNotWasted_NowKeepSameSpeculativeRFH
@@ -6901,7 +6918,7 @@
 
     // GetFrameHostForNavigation is called twice for the navigation above.
     bool wasted_speculative_rfh = false;
-    if (AreAllSitesIsolatedForTesting() ||
+    if (AreStrictSiteInstancesEnabled() ||
         CanSameSiteMainFrameNavigationsChangeRenderFrameHosts()) {
       // First call created speculative RFH. Second call can reuse the
       // speculative RFH only if site isolation is turned off.
@@ -6912,7 +6929,7 @@
           testing::ElementsAre(
               base::Bucket(WastedSpeculativeRFHCase::kNotWasted_WasUnassociated,
                            1),
-              base::Bucket(AreAllSitesIsolatedForTesting()
+              base::Bucket(AreStrictSiteInstancesEnabled()
                                ? WastedSpeculativeRFHCase::
                                      kWasted_NowUseNewSpeculativeRFH
                                : WastedSpeculativeRFHCase::
@@ -6962,15 +6979,16 @@
 
     // GetFrameHostForNavigation is called twice for the navigation above.
     bool wasted_speculative_rfh = false;
-    // The first call will create a new process if site isolation is on, or
-    // BFCache-induced proactive BrowsingInstance swap happened.
+    // The first call will create a new process if strict SiteInstances are
+    // enabled (site isolation or default SiteInstanceGroups are enabled),
+    // or BFCache-induced proactive BrowsingInstance swap happened.
     // TODO(https://crbug.com/376777350): Reconsider if we really should do
     // process swap on BrowsingInstance swap when site isolation is turned off.
     bool first_call_created_new_process =
-        (AreAllSitesIsolatedForTesting() || IsBackForwardCacheEnabled());
-    if (AreAllSitesIsolatedForTesting() ||
+        (AreStrictSiteInstancesEnabled() || IsBackForwardCacheEnabled());
+    if (AreStrictSiteInstancesEnabled() ||
         CanSameSiteMainFrameNavigationsChangeRenderFrameHosts()) {
-      // First call created speculative RFH because of SiteIsolation,
+      // First call created speculative RFH because of strict SiteInstances,
       // RenderDocument, or proactive swap for BFCache. This speculative RFH
       // will never get used, see cases below.
       if (ShouldCreateNewHostForAllFrames() && first_call_created_new_process) {
@@ -7059,8 +7077,9 @@
     bool wasted_speculative_rfh = false;
     if (CanSameSiteMainFrameNavigationsChangeRenderFrameHosts()) {
       // First call created speculative RFH. Second call can reuse the
-      // speculative RFH only if site isolation is turned off.
-      wasted_speculative_rfh = AreAllSitesIsolatedForTesting();
+      // speculative RFH only if site isolation is turned off and default
+      // SiteInstanceGroups are not enabled.
+      wasted_speculative_rfh = AreStrictSiteInstancesEnabled();
       EXPECT_THAT(
           histogram_tester.GetAllSamples(
               "Navigation.All.WastedSpeculativeRFHCase"),
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 00583269..43174a96 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1490,12 +1490,12 @@
   SetView(nullptr);
 }
 
-bool RenderWidgetHostImpl::RequestRepaintForTesting() {
+bool RenderWidgetHostImpl::RequestRepaintOnNewSurface() {
   if (!view_) {
     return false;
   }
 
-  return view_->RequestRepaintForTesting();
+  return view_->RequestRepaintOnNewSurface();
 }
 
 void RenderWidgetHostImpl::RenderProcessBlockedStateChanged(bool blocked) {
@@ -2151,7 +2151,20 @@
   if (from_surface) {
     pending_surface_browser_snapshots_.insert(
         std::make_pair(snapshot_id, std::move(callback)));
-    RequestForceRedraw(snapshot_id);
+    if (base::FeatureList::IsEnabled(features::kCDPScreenshotNewSurface)) {
+      // 1. Force content redraw in the renderer.
+      blink_widget_->ForceRedraw(base::DoNothing());
+      // 2. Force a repaint to ensure that surface is updated.
+      RequestRepaintOnNewSurface();
+      // 3. Create a copy request from the newest surface. This
+      // should wait until the requested repaint has arrived.
+      GetView()->CopyFromSurface(
+          gfx::Rect(), gfx::Size(),
+          base::BindOnce(&RenderWidgetHostImpl::OnSnapshotFromSurfaceReceived,
+                         weak_factory_.GetWeakPtr(), snapshot_id, 0));
+    } else {
+      RequestForceRedraw(snapshot_id);
+    }
     return;
   }
 
@@ -3812,14 +3825,6 @@
 
   if (mobile_optimized_state_changed) {
     input_router()->NotifySiteIsMobileOptimized(is_mobile_optimized_);
-    // Notifies Viz only if the page's mobile optimized state has changed, since
-    // this is only used to set touch ack timeout delay for mobile sites in
-    // PassthroughTouchEventQueue.
-    if (auto* delegate_remote =
-            delegate()->GetRenderInputRouterDelegateRemote()) {
-      delegate_remote->NotifySiteIsMobileOptimized(is_mobile_optimized_,
-                                                   frame_sink_id_);
-    }
     if (auto* touch_emulator =
             GetTouchEmulator(/*create_if_necessary=*/false)) {
       touch_emulator->SetDoubleTapSupportForPageEnabled(!is_mobile_optimized_);
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 70acc7b..0bc94f22 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -547,10 +547,11 @@
     return visual_properties_ack_pending_;
   }
 
-  // Requests the generation of a new CompositorFrame from the renderer.
+  // Requests the generation of a new CompositorFrame from the renderer
+  // by forcing a new surface id.
   // It will return false if the renderer is not ready (e.g. there's an
   // in flight change).
-  bool RequestRepaintForTesting();
+  bool RequestRepaintOnNewSurface();
 
   // Called after every cross-document navigation. Note that for prerender
   // navigations, this is called before the renderer is shown.
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 4d50a88f..82c39f1 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1895,7 +1895,7 @@
     delegated_frame_host_->ResetFallbackToFirstNavigationSurface();
 }
 
-bool RenderWidgetHostViewAndroid::RequestRepaintForTesting() {
+bool RenderWidgetHostViewAndroid::RequestRepaintOnNewSurface() {
   return SynchronizeVisualProperties(cc::DeadlinePolicy::UseDefaultDeadline(),
                                      std::nullopt);
 }
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 599c68fd..1dca257 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -214,7 +214,7 @@
   void InvalidateLocalSurfaceIdAndAllocationGroup() override;
   void ClearFallbackSurfaceForCommitPending() override;
   void ResetFallbackToFirstNavigationSurface() override;
-  bool RequestRepaintForTesting() override;
+  bool RequestRepaintOnNewSurface() override;
   void DidOverscroll(const ui::DidOverscrollParams& params) override;
   bool CanSynchronizeVisualProperties() override;
   std::unique_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget()
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 5867fc3..e623561 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1086,7 +1086,7 @@
   delegated_frame_host_->ResetFallbackToFirstNavigationSurface();
 }
 
-bool RenderWidgetHostViewAura::RequestRepaintForTesting() {
+bool RenderWidgetHostViewAura::RequestRepaintOnNewSurface() {
   return SynchronizeVisualProperties(cc::DeadlinePolicy::UseDefaultDeadline(),
                                      std::nullopt);
 }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index 6f96b83..33d9c06 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -194,7 +194,7 @@
   void InvalidateLocalSurfaceIdAndAllocationGroup() override;
   void ClearFallbackSurfaceForCommitPending() override;
   void ResetFallbackToFirstNavigationSurface() override;
-  bool RequestRepaintForTesting() override;
+  bool RequestRepaintOnNewSurface() override;
   void DidStopFlinging() override;
   void OnOldViewDidNavigatePreCommit() override;
   void OnNewViewDidNavigatePostCommit() override;
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index bb7475f1..7caab47 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -415,7 +415,7 @@
   return false;
 }
 
-bool RenderWidgetHostViewBase::RequestRepaintForTesting() {
+bool RenderWidgetHostViewBase::RequestRepaintOnNewSurface() {
   return false;
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index 5627ee3..8a04a1f0 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -288,7 +288,7 @@
 
   // Requests a new CompositorFrame from the renderer. This is done by
   // allocating a new viz::LocalSurfaceId which forces a commit and draw.
-  virtual bool RequestRepaintForTesting();
+  virtual bool RequestRepaintOnNewSurface();
 
   // Subclass identifier for RenderWidgetHostViewChildFrames. This is useful
   // to be able to know if this RWHV is embedded within another RWHV. If
diff --git a/content/browser/renderer_host/render_widget_host_view_ios.h b/content/browser/renderer_host/render_widget_host_view_ios.h
index 6490c49..5df03f8b 100644
--- a/content/browser/renderer_host/render_widget_host_view_ios.h
+++ b/content/browser/renderer_host/render_widget_host_view_ios.h
@@ -118,7 +118,7 @@
   void DidEnterBackForwardCache() override;
   void ActivatedOrEvictedFromBackForwardCache() override;
   void DidNavigate() override;
-  bool RequestRepaintForTesting() override;
+  bool RequestRepaintOnNewSurface() override;
   void Destroy() override;
   bool IsSurfaceAvailableForCopy() override;
   void CopyFromSurface(
diff --git a/content/browser/renderer_host/render_widget_host_view_ios.mm b/content/browser/renderer_host/render_widget_host_view_ios.mm
index d72d7e4..4844a95 100644
--- a/content/browser/renderer_host/render_widget_host_view_ios.mm
+++ b/content/browser/renderer_host/render_widget_host_view_ios.mm
@@ -515,7 +515,7 @@
       ->ResetFallbackToFirstNavigationSurface();
 }
 
-bool RenderWidgetHostViewIOS::RequestRepaintForTesting() {
+bool RenderWidgetHostViewIOS::RequestRepaintOnNewSurface() {
   return browser_compositor_->ForceNewSurfaceId();
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 1b923f0..c8f64d6 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -161,7 +161,7 @@
   void InvalidateLocalSurfaceIdAndAllocationGroup() override;
   void ClearFallbackSurfaceForCommitPending() override;
   void ResetFallbackToFirstNavigationSurface() override;
-  bool RequestRepaintForTesting() override;
+  bool RequestRepaintOnNewSurface() override;
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override;
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessibleForWindow()
       override;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 27f481c..8b32428 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -1307,7 +1307,7 @@
       ->ResetFallbackToFirstNavigationSurface();
 }
 
-bool RenderWidgetHostViewMac::RequestRepaintForTesting() {
+bool RenderWidgetHostViewMac::RequestRepaintOnNewSurface() {
   return browser_compositor_->ForceNewSurfaceId();
 }
 
diff --git a/content/browser/site_instance_group_browsertest.cc b/content/browser/site_instance_group_browsertest.cc
index 9a649787..c3e5bdc 100644
--- a/content/browser/site_instance_group_browsertest.cc
+++ b/content/browser/site_instance_group_browsertest.cc
@@ -81,16 +81,16 @@
   EXPECT_TRUE(NavigateToURLFromRenderer(main_frame()->child_at(0), data_url));
 
   SiteInstanceGroup* root_group = main_frame_host()->GetSiteInstance()->group();
-  SiteInstanceImpl* child0_instance = main_frame()
-                                          ->child_at(0)
-                                          ->render_manager()
-                                          ->current_frame_host()
-                                          ->GetSiteInstance();
-  SiteInstanceImpl* child1_instance = main_frame()
-                                          ->child_at(1)
-                                          ->render_manager()
-                                          ->current_frame_host()
-                                          ->GetSiteInstance();
+  scoped_refptr<SiteInstanceImpl> child0_instance = main_frame()
+                                                        ->child_at(0)
+                                                        ->render_manager()
+                                                        ->current_frame_host()
+                                                        ->GetSiteInstance();
+  scoped_refptr<SiteInstanceImpl> child1_instance = main_frame()
+                                                        ->child_at(1)
+                                                        ->render_manager()
+                                                        ->current_frame_host()
+                                                        ->GetSiteInstance();
 
   // In both parameterization modes, the root is cross-site from the subframes
   // and should not share a process or SiteInstanceGroup.
@@ -211,7 +211,7 @@
     ASSERT_TRUE(WaitForLoadStop(web_contents()));
   }
   FrameTreeNode* child0 = main_frame()->child_at(0);
-  SiteInstanceImpl* child0_instance =
+  scoped_refptr<SiteInstanceImpl> child0_instance =
       child0->current_frame_host()->GetSiteInstance();
   EXPECT_TRUE(child0_instance->GetSiteInfo().is_sandboxed());
 
@@ -228,7 +228,7 @@
     ASSERT_TRUE(WaitForLoadStop(web_contents()));
   }
   FrameTreeNode* child1 = main_frame()->child_at(1);
-  SiteInstanceImpl* child1_instance =
+  scoped_refptr<SiteInstanceImpl> child1_instance =
       child1->current_frame_host()->GetSiteInstance();
   EXPECT_FALSE(child1_instance->GetSiteInfo().is_sandboxed());
   EXPECT_NE(child0_instance, child1_instance);
@@ -248,7 +248,7 @@
     ASSERT_TRUE(WaitForLoadStop(web_contents()));
   }
   FrameTreeNode* data = child1->child_at(0);
-  SiteInstanceImpl* data_instance =
+  scoped_refptr<SiteInstanceImpl> data_instance =
       data->current_frame_host()->GetSiteInstance();
 
   // The last committed URL is the data: URL, but because sandboxed data frames
@@ -288,9 +288,10 @@
     ASSERT_TRUE(WaitForLoadStop(web_contents()));
   }
 
-  SiteInstanceImpl* main_instance = main_frame_host()->GetSiteInstance();
+  scoped_refptr<SiteInstanceImpl> main_instance =
+      main_frame_host()->GetSiteInstance();
   FrameTreeNode* data = main_frame()->child_at(0);
-  SiteInstanceImpl* data_instance =
+  scoped_refptr<SiteInstanceImpl> data_instance =
       data->current_frame_host()->GetSiteInstance();
   EXPECT_NE(main_instance, data_instance);
 
@@ -345,10 +346,10 @@
   }
 
   FrameTreeNode* child0 = main_frame()->child_at(0);
-  SiteInstanceImpl* child0_instance =
+  scoped_refptr<SiteInstanceImpl> child0_instance =
       child0->current_frame_host()->GetSiteInstance();
   FrameTreeNode* child1 = main_frame()->child_at(1);
-  SiteInstanceImpl* child1_instance =
+  scoped_refptr<SiteInstanceImpl> child1_instance =
       child1->current_frame_host()->GetSiteInstance();
 
   if (ShouldCreateSiteInstanceForDataUrls()) {
@@ -398,10 +399,11 @@
     ASSERT_TRUE(WaitForLoadStop(web_contents()));
     EXPECT_EQ(data_url, observer.last_navigation_url());
   }
-  SiteInstanceImpl* a_instance = main_frame_host()->GetSiteInstance();
+  scoped_refptr<SiteInstanceImpl> a_instance =
+      main_frame_host()->GetSiteInstance();
 
   FrameTreeNode* data_frame = main_frame()->child_at(0);
-  SiteInstanceImpl* data_instance =
+  scoped_refptr<SiteInstanceImpl> data_instance =
       data_frame->current_frame_host()->GetSiteInstance();
 
   if (ShouldCreateSiteInstanceForDataUrls()) {
@@ -428,7 +430,7 @@
   }
 
   FrameTreeNode* b_frame = data_frame->child_at(0);
-  SiteInstanceImpl* b_instance =
+  scoped_refptr<SiteInstanceImpl> b_instance =
       b_frame->current_frame_host()->GetSiteInstance();
   EXPECT_NE(data_instance, b_instance);
   EXPECT_NE(data_instance->group(), b_instance->group());
@@ -460,11 +462,17 @@
     EXPECT_EQ(data_url, observer.last_navigation_url());
   }
 
-  SiteInstanceImpl* a_instance = main_frame_host()->GetSiteInstance();
-  EXPECT_TRUE(a_instance->IsDefaultSiteInstance());
+  scoped_refptr<SiteInstanceImpl> a_instance =
+      main_frame_host()->GetSiteInstance();
+  if (ShouldUseDefaultSiteInstanceGroup()) {
+    EXPECT_EQ(a_instance->group(),
+              a_instance->DefaultSiteInstanceGroupForBrowsingInstance());
+  } else {
+    EXPECT_TRUE(a_instance->IsDefaultSiteInstance());
+  }
 
   FrameTreeNode* data_frame = main_frame()->child_at(0);
-  SiteInstanceImpl* data_instance =
+  scoped_refptr<SiteInstanceImpl> data_instance =
       data_frame->current_frame_host()->GetSiteInstance();
 
   if (ShouldCreateSiteInstanceForDataUrls()) {
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index 4007e923..8db7e1a 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -405,6 +405,11 @@
   return default_site_instance_state_->ContainsSite(site_url);
 }
 
+SiteInstanceGroup*
+SiteInstanceImpl::DefaultSiteInstanceGroupForBrowsingInstance() const {
+  return browsing_instance()->default_site_instance_group();
+}
+
 // static
 BrowsingInstanceId SiteInstanceImpl::NextBrowsingInstanceId() {
   return BrowsingInstance::NextBrowsingInstanceId();
@@ -679,7 +684,7 @@
 void SiteInstanceImpl::ConvertToDefaultOrSetSite(const UrlInfo& url_info) {
   DCHECK(!has_site_);
 
-  if (!browsing_instance_->HasDefaultSiteInstance()) {
+  if (!browsing_instance_->has_default_site_instance()) {
     // We want to set a SiteInfo in this SiteInstance, from information in a
     // UrlInfo. The WebExposedIsolationInfo must be compatible for this function
     // to not violate WebExposedIsolationInfo isolation invariant within a
@@ -700,7 +705,7 @@
       SetSiteInfoToDefault(site_info.storage_partition_config());
       AddSiteInfoToDefault(site_info);
 
-      DCHECK(browsing_instance_->HasDefaultSiteInstance());
+      DCHECK(browsing_instance_->has_default_site_instance());
       return;
     }
   }
diff --git a/content/browser/site_instance_impl.h b/content/browser/site_instance_impl.h
index 577cc9a..802972bf 100644
--- a/content/browser/site_instance_impl.h
+++ b/content/browser/site_instance_impl.h
@@ -429,6 +429,9 @@
   // associated with its default SiteInstance.
   bool IsSiteInDefaultSiteInstance(const GURL& site_url) const;
 
+  // Returns the default SiteInstanceGroup of the BrowsingInstance `this` is in.
+  SiteInstanceGroup* DefaultSiteInstanceGroupForBrowsingInstance() const;
+
   // Returns true if the SiteInfo for |url_info| matches the SiteInfo for this
   // instance (i.e. GetSiteInfo()). Otherwise returns false.
   bool DoesSiteInfoForURLMatch(const UrlInfo& url_info);
@@ -586,7 +589,9 @@
       const SiteInfo& site_info);
 
   // This getter is only used to construct SiteInstanceGroups.
-  BrowsingInstance* browsing_instance() { return browsing_instance_.get(); }
+  BrowsingInstance* browsing_instance() const {
+    return browsing_instance_.get();
+  }
 
   // A unique ID for this SiteInstance.
   SiteInstanceId id_;
diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
index 7462763..8a971828 100644
--- a/content/browser/site_instance_impl_unittest.cc
+++ b/content/browser/site_instance_impl_unittest.cc
@@ -32,6 +32,7 @@
 #include "content/browser/web_exposed_isolation_info.h"
 #include "content/browser/webui/url_data_manager_backend.h"
 #include "content/browser/webui/web_ui_controller_factory_registry.h"
+#include "content/common/content_navigation_policy.h"
 #include "content/public/browser/browser_or_resource_context.h"
 #include "content/public/browser/site_isolation_policy.h"
 #include "content/public/browser/web_exposed_isolation_level.h"
@@ -603,6 +604,10 @@
 
 // Verifies some basic properties of default SiteInstances.
 TEST_F(SiteInstanceTest, DefaultSiteInstanceProperties) {
+  if (ShouldUseDefaultSiteInstanceGroup()) {
+    return;
+  }
+
   TestBrowserContext browser_context;
 
   base::test::ScopedCommandLine scoped_command_line;
@@ -630,6 +635,10 @@
 // Ensure that default SiteInstances are deleted when all references to them
 // are gone.
 TEST_F(SiteInstanceTest, DefaultSiteInstanceDestruction) {
+  if (ShouldUseDefaultSiteInstanceGroup()) {
+    return;
+  }
+
   TestBrowserContext browser_context;
   base::test::ScopedCommandLine scoped_command_line;
 
@@ -1934,7 +1943,7 @@
       SiteInstanceImpl::CreateForTesting(context(), GURL(url::kAboutBlankURL));
   auto instance5 = SiteInstanceImpl::CreateForTesting(context(), kCustomUrl);
 
-  if (AreAllSitesIsolatedForTesting()) {
+  if (AreStrictSiteInstancesEnabled()) {
     EXPECT_FALSE(instance1->IsDefaultSiteInstance());
     EXPECT_EQ(kNonIsolatedUrl, instance1->GetSiteURL());
   } else {
@@ -1968,7 +1977,7 @@
 
   // Test the standard effective URL case.
   EXPECT_TRUE(instance5->HasSite());
-  if (AreAllSitesIsolatedForTesting()) {
+  if (AreStrictSiteInstancesEnabled()) {
     EXPECT_FALSE(instance5->IsDefaultSiteInstance());
     EXPECT_EQ("custom-standard://custom/", instance5->GetSiteURL());
     EXPECT_EQ("http://foo.com/", instance5->GetSiteInfo().process_lock_url());
@@ -2294,9 +2303,9 @@
   const auto derived_instance = base_instance->GetRelatedSiteInstanceImpl(
       UrlInfo(UrlInfoInit(GURL("https://other-example.com"))));
 
-  // Without full Site Isolation, we'll group different sites in the default
-  // SiteInstance.
-  if (!AreAllSitesIsolatedForTesting()) {
+  // Without full Site Isolation or default SiteInstanceGroups, we'll group
+  // different sites in the default SiteInstance.
+  if (!AreStrictSiteInstancesEnabled()) {
     EXPECT_EQ(derived_instance.get(), base_instance.get());
     return;
   }
diff --git a/content/browser/web_contents/web_contents_view_aura_browsertest.cc b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
index 68fa40c..80f74bb28 100644
--- a/content/browser/web_contents/web_contents_view_aura_browsertest.cc
+++ b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
@@ -311,7 +311,7 @@
   }
 
   void WaitAFrame() {
-    while (!GetRenderWidgetHost()->RequestRepaintForTesting()) {
+    while (!GetRenderWidgetHost()->RequestRepaintOnNewSurface()) {
       GiveItSomeTime();
     }
     frame_observer_->WaitForAnyFrameSubmission();
diff --git a/content/browser/webid/flags.cc b/content/browser/webid/flags.cc
index c40b8e51..a5d5084 100644
--- a/content/browser/webid/flags.cc
+++ b/content/browser/webid/flags.cc
@@ -23,10 +23,6 @@
   return base::FeatureList::IsEnabled(features::kFedCmMetricsEndpoint);
 }
 
-bool IsFedCmSelectiveDisclosureEnabled() {
-  return base::FeatureList::IsEnabled(features::kFedCmSelectiveDisclosure);
-}
-
 bool IsFedCmDelegationEnabled() {
   return base::FeatureList::IsEnabled(features::kFedCmDelegation);
 }
diff --git a/content/browser/webid/flags.h b/content/browser/webid/flags.h
index 6a1cf6f3..8bc9da8 100644
--- a/content/browser/webid/flags.h
+++ b/content/browser/webid/flags.h
@@ -17,9 +17,6 @@
 // Whether metrics endpoint is enabled.
 bool IsFedCmMetricsEndpointEnabled();
 
-// Whether the Selective Disclosure API is enabled.
-bool IsFedCmSelectiveDisclosureEnabled();
-
 // Whether the Delegation API is enabled.
 bool IsFedCmDelegationEnabled();
 
diff --git a/content/browser/webrtc/resources/dump_creator.js b/content/browser/webrtc/resources/dump_creator.js
index 2dd21af..08bfec5 100644
--- a/content/browser/webrtc/resources/dump_creator.js
+++ b/content/browser/webrtc/resources/dump_creator.js
@@ -21,101 +21,69 @@
    * @param {Element} containerElement The parent element of the dump creation
    *     UI.
    */
-  constructor(containerElement) {
+  constructor(ignoredContainerElement) {
     /**
      * The root element of the dump creation UI.
      * @type {Element}
      * @private
      */
-    this.createDumpRoot(containerElement);
-    this.createAudioRecordingRoot(containerElement);
-    this.createPacketRecordingRoot(containerElement);
-  }
-
-  createDumpRoot(containerElement) {
-    this.dumpRoot_ = document.createElement('details');
-
-    this.dumpRoot_.className = 'peer-connection-dump-root';
-    containerElement.appendChild(this.dumpRoot_);
-    const summary = document.createElement('summary');
-    this.dumpRoot_.appendChild(summary);
-    summary.textContent = 'Create a WebRTC-Internals dump';
-    const content = document.createElement('div');
-    this.dumpRoot_.appendChild(content);
-    content.appendChild($('dump-template').content.cloneNode(true));
-    content.getElementsByTagName('a')[0].addEventListener(
-      'click', this.onDownloadData_.bind(this));
-  }
-
-  createAudioRecordingRoot(containerElement) {
-    this.audioRoot_ = document.createElement('details');
-
-    this.audioRoot_.className = 'peer-connection-dump-root';
-    containerElement.appendChild(this.audioRoot_);
-    const summary = document.createElement('summary');
-    this.audioRoot_.appendChild(summary);
-    summary.textContent = 'Create diagnostic audio recordings';
-    const content = document.createElement('div');
-    this.audioRoot_.appendChild(content);
-    content.appendChild($('audio-recording-template').content.cloneNode(true));
-    content.getElementsByTagName('input')[0].addEventListener(
-      'click', this.onAudioDebugRecordingsChanged_.bind(this));
-
-  }
-
-  createPacketRecordingRoot(containerElement) {
-    this.packetRoot_ = document.createElement('details');
-
-    this.packetRoot_.className = 'peer-connection-dump-root';
-    containerElement.appendChild(this.packetRoot_);
-    const summary = document.createElement('summary');
-    this.packetRoot_.appendChild(summary);
-    summary.textContent = 'Create diagnostic packet recordings';
-    const content = document.createElement('div');
-    this.packetRoot_.appendChild(content);
-    content.appendChild($('packet-recording-template').content.cloneNode(true));
-    content.getElementsByTagName('input')[0].addEventListener(
+    document.getElementById('dump-click-target').addEventListener(
+        'click', this.onDownloadData_.bind(this));
+    document.getElementById('audio-recording-click-target').addEventListener(
+        'click', this.onAudioDebugRecordingsChanged_.bind(this));
+    document.getElementById('packet-recording-click-target').addEventListener(
         'click', this.onEventLogRecordingsChanged_.bind(this));
+    document.getElementById('datachannel-recording-click-target')
+        .addEventListener(
+            'click', this.onDataChannelRecordingsChanged_.bind(this));
   }
 
   // Mark the diagnostic audio recording checkbox checked.
   setAudioDebugRecordingsCheckbox() {
-    this.audioRoot_.getElementsByTagName('input')[0].checked = true;
+    document.getElementById('audio-recording-checkbox').checked = true;
   }
 
   // Mark the diagnostic audio recording checkbox unchecked.
   clearAudioDebugRecordingsCheckbox() {
-    this.audioRoot_.getElementsByTagName('input')[0].checked = false;
+    document.getElementById('audio-recording-checkbox').checked = false;
   }
 
   // Mark the event log recording checkbox checked.
   setEventLogRecordingsCheckbox() {
-    this.packetRoot_.getElementsByTagName('input')[0].checked = true;
+    document.getElementById('packet-recording-checkbox').checked = true;
   }
 
   // Mark the event log recording checkbox unchecked.
   clearEventLogRecordingsCheckbox() {
-    this.packetRoot_.getElementsByTagName('input')[0].checked = false;
+    document.getElementById('packet-recording-checkbox').checked = false;
   }
 
   // Mark the event log recording checkbox as mutable/immutable.
   setEventLogRecordingsCheckboxMutability(mutable) {
-    this.packetRoot_.getElementsByTagName('input')[0].disabled = !mutable;
+    document.getElementById('packet-recording-checkbox').disabled = !mutable;
     if (!mutable) {
-      const label = this.packetRoot_.getElementsByTagName('label')[0];
+      const label = document.getElementById('packet-recording-label');
       label.style = 'color:red;';
       label.textContent =
           ' WebRTC event logging\'s state was set by a command line flag.';
     }
   }
 
+  setDataChannelRecordingsCheckbox() {
+    document.getElementById('datachannel-recording-checkbox').checked = true;
+  }
+
+  clearDataChannelRecordingsCheckbox() {
+    document.getElementById('datachannel-recording-checkbox').checked = false;
+  }
+
   /**
    * Downloads the PeerConnection updates and stats data as a file.
    *
    * @private
    */
   async onDownloadData_(event) {
-    const useCompression = this.dumpRoot_.getElementsByTagName('input')[0].checked;
+    const useCompression = document.getElementById('dump-checkbox').checked;
     const uaData = await navigator.userAgentData
         .getHighEntropyValues(['fullVersionList']);
     const dumpObject = {
@@ -141,10 +109,10 @@
       return;
     }
     url = URL.createObjectURL(textBlob);
-    const anchor = this.dumpRoot_.getElementsByTagName('a')[0];
+    const anchor = document.createElement('a');
     anchor.download = 'webrtc_internals_dump.txt'
     anchor.href = url;
-    // The default action of the anchor will download the url.
+    anchor.click();
   }
 
   /**
@@ -153,12 +121,8 @@
    * @private
    */
   onAudioDebugRecordingsChanged_() {
-    const enabled = this.audioRoot_.getElementsByTagName('input')[0].checked;
-    if (enabled) {
-      chrome.send('enableAudioDebugRecordings');
-    } else {
-      chrome.send('disableAudioDebugRecordings');
-    }
+    const checkbox = document.getElementById('audio-recording-checkbox');
+    chrome.send((checkbox.checked ? 'en' : 'dis') + 'ableAudioDebugRecordings');
   }
 
   /**
@@ -167,11 +131,18 @@
    * @private
    */
   onEventLogRecordingsChanged_() {
-    const enabled = this.packetRoot_.getElementsByTagName('input')[0].checked;
-    if (enabled) {
-      chrome.send('enableEventLogRecordings');
-    } else {
-      chrome.send('disableEventLogRecordings');
-    }
+    const checkbox = document.getElementById('packet-recording-checkbox');
+    chrome.send((checkbox.checked ? "en" : "dis") + 'ableEventLogRecordings');
+  }
+
+  /**
+   * Handles the event of toggling the event log recordings state.
+   *
+   * @private
+   */
+  onDataChannelRecordingsChanged_() {
+    const checkbox = document.getElementById('datachannel-recording-checkbox');
+    chrome.send(
+        (checkbox.checked ? 'en' : 'dis') + 'ableDataChannelRecordings');
   }
 }
diff --git a/content/browser/webrtc/resources/webrtc_internals.html b/content/browser/webrtc/resources/webrtc_internals.html
index 55bc72ef..f8c498a 100644
--- a/content/browser/webrtc/resources/webrtc_internals.html
+++ b/content/browser/webrtc/resources/webrtc_internals.html
@@ -1,58 +1,171 @@
-<!doctype html>
+<!DOCTYPE html>
 <html>
   <head>
-    <meta charset="utf-8">
+    <meta charset="utf-8" />
     <title>WebRTC Internals</title>
-    <link rel="stylesheet" href="webrtc_internals.css">
+    <link rel="stylesheet" href="webrtc_internals.css" />
     <script type="module" src="webrtc_internals.js"></script>
   </head>
   <body>
-    <p id="content-root"></p>
-    <template id="statsrow-template"><td></td><td></td><td><a></a></td></template>
-    <template id="summary-template"><td><details><summary></summary></details></td></template>
-    <template id="container-template"><div></div><div><canvas></canvas></div></template>
-    <template id="summary-span-template"><summary><span></span></summary></template>
-    <template id="checkbox-template"><input type=checkbox checked></template>
-    <template id="trth-template"><tbody><tr><th colspan=2></th></tr></tbody></template>
-    <template id="td-colspan-template"><td colspan=2></td></template>
-    <template id="time-event-template"><tbody><tr><th>Time</th><th class="update-log-header-event">Event</th></tr></tbody></template>
-    <template id="dump-template">
+    <details class="peer-connection-dump-root">
+      <summary>Create a WebRTC-Internals dump</summary>
       <div id="dump">
-        <a>
-          <button>Download the "webrtc-internals dump"</button>
-        </a>
+        <button id="dump-click-target">
+          Download the "webrtc-internals dump"
+        </button>
         <label>
-          <input type="checkbox">Compress result
+          <input type="checkbox" id="dump-checkbox" />
+          Compress result
         </label>
-        <p class="dumps-info">The "webrtc-internals" dump is a JSON file containing API calls, events and getStats-like information about RTCPeerConnection objects as well as getUsermedia/getDisplayMedia API calls.</p>
+        <p class="dumps-info">
+          The "webrtc-internals" dump is a JSON file containing API calls,
+          events and getStats-like information about RTCPeerConnection objects
+          as well as getUsermedia/getDisplayMedia API calls.
+        </p>
       </div>
-    </template>
-    <template id="audio-recording-template">
-      <div id="audio-recording">
-        <p>
+    </details>
+    <details class="peer-connection-dump-root">
+      <summary>Create diagnostic audio recordings</summary>
+      <div>
+        <p id="audio-recording-click-target">
           <label>
-            <input type="checkbox">Enable diagnostic audio recordings
+            <input type="checkbox" id="audio-recording-checkbox" />
+            Enable diagnostic audio recordings
           </label>
         </p>
-        <p class="dumps-info">A diagnostic audio recording is used for analyzing audio problems. It consists of several files and contains the audio played out to the speaker (output) and captured from the microphone (input). The data is saved locally. Checking this box will enable recordings of all ongoing input and output audio streams (including non-WebRTC streams) and for future audio streams. When the box is unchecked or this page is closed, all ongoing recordings will be stopped and this recording functionality disabled. Recording audio from multiple tabs is supported as well as multiple recordings from the same tab.</p>
-        <p>When enabling, select a base filename to which the following suffixes will be added:</p>
-        <div>&lt;base filename&gt;.&lt;render process ID&gt;.aec_dump.&lt;AEC dump recording ID&gt;</div>
+        <p class="dumps-info">
+          A diagnostic audio recording is used for analyzing audio problems. It
+          consists of several files and contains the audio played out to the
+          speaker (output) and captured from the microphone (input). The data
+          is saved locally. Checking this box will enable recordings of all
+          ongoing input and output audio streams (including non-WebRTC streams)
+          and for future audio streams. When the box is unchecked or this page
+          is closed, all ongoing recordings will be stopped and this recording
+          functionality disabled. Recording audio from multiple tabs is
+          supported as well as multiple recordings from the same tab.
+        </p>
+        <p>
+          When enabling, select a base filename to which the following suffixes
+          will be added:
+        </p>
+        <div>
+          &lt;base filename&gt;.&lt;render process ID&gt;.aec_dump.&lt;AEC dump
+          recording ID&gt;
+        </div>
         <div>&lt;base filename&gt;.input.&lt;stream recording ID&gt;.wav</div>
         <div>&lt;base filename&gt;.output.&lt;stream recording ID&gt;.wav</div>
-        <p class="dumps-info">It is recommended to choose a new base filename each time the feature is enabled to avoid ending up with partially overwritten or unusable audio files.</p>
+        <p class="dumps-info">
+          It is recommended to choose a new base filename each time the feature
+          is enabled to avoid ending up with partially overwritten or unusable
+          audio files.
+        </p>
       </div>
-    </template>
-    <template id="packet-recording-template">
+    </details>
+    <details class="peer-connection-dump-root">
+      <summary>Create diagnostic packet recordings</summary>
       <div id="packet-recording">
-        <p>
-          <label>
-            <input type="checkbox" disabled>Enable diagnostic packet and event recording
+        <p id="packet-recording-click-target">
+          <label id="packet-recording-label">
+            <input type="checkbox" id="packet-recording-checkbox" disabled />
+            Enable diagnostic packet and event recording
           </label>
         </p>
-        <p class="dumps-info">A diagnostic packet and event recording can be used for analyzing various issues related to thread starvation, jitter buffers or bandwidth estimation. Two types of data are logged. First, incoming and outgoing RTP headers and RTCP packets are logged. These do not include any audio or video information, nor any other types of personally identifiable information (so no IP addresses or URLs). Checking this box will enable the recording for ongoing WebRTC calls and for future WebRTC calls. When the box is unchecked or this page is closed, all ongoing recordings will be stopped and this recording functionality will be disabled for future WebRTC calls. Recording in multiple tabs or multiple recordings in the same tab will cause multiple log files to be created. When enabling, a filename for the recording can be entered. The entered filename is used as a base, to which the following suffixes will be appended.</p>
-        <p>&lt;base filename&gt;_&lt;date&gt;_&lt;timestamp&gt;_&lt;render process ID&gt;_&lt;recording ID&gt;</p>
-        <p class="dumps-info">If a file with the same name already exists, it will be overwritten. No more than 5 logfiles  will be created, and each of them is limited to 60MB of storage.  On Android these limits are 3 files of at most 10MB each.  When the limit is reached, the checkbox must be unchecked and  rechecked to resume logging.</p>
+        <p class="dumps-info">
+          A diagnostic packet and event recording can be used for analyzing
+          various issues related to thread starvation, jitter buffers or
+          bandwidth estimation. Two types of data are logged. First, incoming
+          and outgoing RTP headers and RTCP packets are logged. These do not
+          include any audio or video information, nor any other types of
+          personally identifiable information (so no IP addresses or URLs).
+          Checking this box will enable the recording for ongoing WebRTC calls
+          and for future WebRTC calls. When the box is unchecked or this page
+          is closed, all ongoing recordings will be stopped and this recording
+          functionality will be disabled for future WebRTC calls. Recording in
+          multiple tabs or multiple recordings in the same tab will cause
+          multiple log files to be created. When enabling, a filename for the
+          recording can be entered. The entered filename is used as a base, to
+          which the following suffixes will be appended.
+        </p>
+        <p>
+          &lt;base filename&gt;_&lt;date&gt;_&lt;timestamp&gt;_&lt;render
+          process ID&gt;_&lt;recording ID&gt;
+        </p>
+        <p class="dumps-info">
+          If a file with the same name already exists, it will be overwritten.
+          No more than 5 logfiles will be created, and each of them is limited
+          to 60MB of storage. On Android these limits are 3 files of at most
+          10MB each. When the limit is reached, the checkbox must be unchecked
+          and rechecked to resume logging.
+        </p>
       </div>
+    </details>
+    <details class="peer-connection-dump-root">
+      <summary>Create DataChannel message recordings</summary>
+      <div id="datachannel-recording">
+        <p id="datachannel-recording-click-target">
+          <label id="datachannel-recording-label">
+            <input type="checkbox" id="datachannel-recording-checkbox"/>
+            Enable DataChannel message recordings
+          </label>
+        </p>
+        <p class="dumps-info">
+          <b>
+            NOTE: DataChannel messages will also be recorded in incognito mode!
+          </b>
+        </p>
+        <p class="dumps-info">
+          A DataChannel message recording records all text and binary message
+          sent over a PeerConnection. Text messages are recorded in plain text,
+          and binary messages are recorded using base64 encoding. One file is
+          created per PeerConnection. Checking this box will enable recording
+          for ongoing and future PeerConnections. When the box is unchecked all
+          ongoing recordings will be stopped and this recording functionality
+          will be disabled for future PeerConnections. DataChannel message
+          recording use the following file format:
+        </p>
+        <p>
+          &lt;base filename&gt;_&lt;date&gt;_&lt;timestamp&gt;_&lt;render
+          process ID&gt;_&lt;recording ID&gt;
+        </p>
+        <p class="dumps-info">
+          If a file with the same name already exists, it will be overwritten.
+          No more than 5 logfiles  will be created, and each of them is limited
+          to 100MB of storage.  On Android these limits are 3 files of at most
+          10MB each.  When the limit is reached, the checkbox must be unchecked
+          and rechecked to resume logging.
+        </p>
+      </div>
+    </details>
+
+    <p id="content-root"></p>
+    <template id="statsrow-template">
+      <td></td>
+      <td></td>
+      <td><a></a></td>
     </template>
+    <template id="summary-template"><td><details><summary></summary></details></td></template>
+    <template id="container-template">
+      <div></div>
+      <div><canvas></canvas></div>
+    </template>
+    <template id="summary-span-template">
+      <summary><span></span></summary>
+    </template>
+    <template id="checkbox-template">
+      <input type="checkbox" checked />
+    </template>
+    <template id="trth-template">
+      <tbody>
+        <tr>
+          <th colspan=2></th>
+        </tr>
+      </tbody>
+    </template>
+    <template id="td-colspan-template">
+      <td colspan=2></td>
+    </template>
+    <template id="time-event-template"><tbody>
+      <tr><th>Time</th><th class="update-log-header-event">Event</th></tr>
+    </tbody></template>
   </body>
-</html>
+</html>
\ No newline at end of file
diff --git a/content/browser/webrtc/resources/webrtc_internals.js b/content/browser/webrtc/resources/webrtc_internals.js
index 6d9c81b..b893dc6d 100644
--- a/content/browser/webrtc/resources/webrtc_internals.js
+++ b/content/browser/webrtc/resources/webrtc_internals.js
@@ -130,6 +130,9 @@
   addWebUiListener(
       'audio-debug-recordings-file-selection-cancelled',
       audioDebugRecordingsFileSelectionCancelled);
+  addWebUiListener(
+      'data-channel-recordings-file-selection-cancelled',
+      dataChannelRecordingsFileSelectionCancelled);
 
   // Request initial startup parameters.
   sendWithPromise('finishedDOMLoad').then(params => {
@@ -139,6 +142,9 @@
     if (params.eventLogRecordingsEnabled) {
       dumpCreator.setEventLogRecordingsCheckbox();
     }
+    if (params.dataChannelRecordingsEnabled) {
+      dumpCreator.setDataChannelRecordingsCheckbox();
+    }
     dumpCreator.setEventLogRecordingsCheckboxMutability(
         params.eventLogRecordingsToggleable);
   });
@@ -477,3 +483,8 @@
 function eventLogRecordingsFileSelectionCancelled() {
   dumpCreator.clearEventLogRecordingsCheckbox();
 }
+
+
+function dataChannelRecordingsFileSelectionCancelled() {
+  dumpCreator.clearDataChannelRecordingsCheckbox();
+}
diff --git a/content/browser/webrtc/webrtc_internals.cc b/content/browser/webrtc/webrtc_internals.cc
index ad236fc..a7f3f1a 100644
--- a/content/browser/webrtc/webrtc_internals.cc
+++ b/content/browser/webrtc/webrtc_internals.cc
@@ -112,22 +112,21 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!g_webrtc_internals);
 
-  audio_debug_recordings_file_path_ =
+  const base::FilePath default_path =
       GetContentClient()->browser()->GetDefaultDownloadDirectory();
-  event_log_recordings_file_path_ = audio_debug_recordings_file_path_;
+  audio_debug_recordings_file_path_ = default_path;
+  event_log_recordings_file_path_ = default_path;
+  data_channel_recordings_file_path_ = default_path;
 
-  if (audio_debug_recordings_file_path_.empty()) {
-    // In this case the default path (|audio_debug_recordings_file_path_|) will
-    // be empty and the platform default path will be used in the file dialog
-    // (with no default file name). See SelectFileDialog::SelectFile. On Android
-    // where there's no dialog we'll fail to open the file.
-    VLOG(1) << "Could not get the download directory.";
-  } else {
+  if (!default_path.empty()) {
     audio_debug_recordings_file_path_ =
         audio_debug_recordings_file_path_.Append(
             FILE_PATH_LITERAL("audio_debug"));
     event_log_recordings_file_path_ =
         event_log_recordings_file_path_.Append(kEventLogFilename);
+    data_channel_recordings_file_path_ =
+        data_channel_recordings_file_path_.Append(
+            FILE_PATH_LITERAL("data_channel"));
   }
 
   // Allow command-line based setting of (local) WebRTC event logging.
@@ -606,11 +605,51 @@
   }
 }
 
+void WebRTCInternals::EnableDataChannelRecordings(
+    content::WebContents* web_contents) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+#if BUILDFLAG(IS_ANDROID)
+  WebRtcEventLogger* const logger = WebRtcEventLogger::Get();
+  if (logger) {
+    logger->EnableDataChannelLogging(data_channel_recordings_file_path_);
+  }
+#else
+  if (select_file_dialog_) {
+    return;
+  }
+  selection_type_ = SelectionType::kDataChannelRecordings;
+  select_file_dialog_ = ui::SelectFileDialog::Create(
+      this,
+      GetContentClient()->browser()->CreateSelectFilePolicy(web_contents));
+  select_file_dialog_->SelectFile(
+      ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(),
+      data_channel_recordings_file_path_, nullptr, 0,
+      base::FilePath::StringType(), web_contents->GetTopLevelNativeWindow());
+#endif
+}
+
+void WebRTCInternals::DisableDataChannelRecordings() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  data_channel_recording_active_ = false;
+  // Tear down the dialog since the user has unchecked the event log checkbox.
+  select_file_dialog_ = nullptr;
+  WebRtcEventLogger* const logger = WebRtcEventLogger::Get();
+  if (logger) {
+    logger->DisableDataChannelLogging();
+  }
+}
+
 bool WebRTCInternals::IsEventLogRecordingsEnabled() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return event_log_recordings_;
 }
 
+bool WebRTCInternals::IsDataChannelRecordingsEnabled() const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  return data_channel_recording_active_;
+}
+
 bool WebRTCInternals::CanToggleEventLogRecordings() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return command_line_derived_logging_path_.empty();
@@ -665,6 +704,15 @@
       EnableAudioDebugRecordingsOnAllRenderProcessHosts();
       break;
     }
+    case SelectionType::kDataChannelRecordings: {
+      data_channel_recordings_file_path_ = file.path();
+      data_channel_recording_active_ = true;
+      WebRtcEventLogger* const logger = WebRtcEventLogger::Get();
+      if (logger) {
+        logger->EnableDataChannelLogging(file.path());
+      }
+      break;
+    }
     default: {
       NOTREACHED();
     }
@@ -682,6 +730,10 @@
       SendUpdate("audio-debug-recordings-file-selection-cancelled",
                  base::Value());
       break;
+    case SelectionType::kDataChannelRecordings:
+      SendUpdate("data-channel-recordings-file-selection-cancelled",
+                 base::Value());
+      break;
     default:
       NOTREACHED();
   }
diff --git a/content/browser/webrtc/webrtc_internals.h b/content/browser/webrtc/webrtc_internals.h
index efcecaec..847b494 100644
--- a/content/browser/webrtc/webrtc_internals.h
+++ b/content/browser/webrtc/webrtc_internals.h
@@ -134,9 +134,14 @@
   void EnableLocalEventLogRecordings(content::WebContents* web_contents);
   void DisableLocalEventLogRecordings();
 
+  void EnableDataChannelRecordings(content::WebContents* web_contents);
+  void DisableDataChannelRecordings();
+
   bool IsEventLogRecordingsEnabled() const;
   bool CanToggleEventLogRecordings() const;
 
+  bool IsDataChannelRecordingsEnabled() const;
+
   int num_connected_connections() const { return num_connected_connections_; }
 
  protected:
@@ -179,6 +184,8 @@
   // |audio_debug_recordings_file_path_|.
   void EnableAudioDebugRecordingsOnAllRenderProcessHosts();
 
+  void EnableDataChannelRecordingsOnAllRenderProcessHosts();
+
   // Updates the number of open PeerConnections. Called when a PeerConnection
   // is stopped or removed.
   void MaybeClosePeerConnection(base::Value& record);
@@ -250,7 +257,8 @@
   scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
   enum class SelectionType {
     kRtcEventLogs,
-    kAudioDebugRecordings
+    kAudioDebugRecordings,
+    kDataChannelRecordings,
   } selection_type_;
 
   // Diagnostic audio recording state.
@@ -267,6 +275,13 @@
   bool event_log_recordings_;
   base::FilePath event_log_recordings_file_path_;
 
+  bool data_channel_recording_active_ = false;
+  // If `data_channel_recording_active_` is `true`, the following path indicates
+  // where logs are stored. If `data_channel_recording_active_` is `false`, then
+  // should it ever be turned on, a path picker will be shown to the user, and
+  // the following path indicates the initial path suggested by that picker.
+  base::FilePath data_channel_recordings_file_path_;
+
   // While |num_connected_connections_| is greater than zero, request a wake
   // lock service. This prevents the application from being suspended while
   // remoting.
diff --git a/content/browser/webrtc/webrtc_internals_message_handler.cc b/content/browser/webrtc/webrtc_internals_message_handler.cc
index f7d4121..8e7cbb4 100644
--- a/content/browser/webrtc/webrtc_internals_message_handler.cc
+++ b/content/browser/webrtc/webrtc_internals_message_handler.cc
@@ -62,6 +62,18 @@
           base::Unretained(this), false));
 
   web_ui()->RegisterMessageCallback(
+      "enableDataChannelRecordings",
+      base::BindRepeating(
+          &WebRTCInternalsMessageHandler::OnSetDataChannelRecordingsEnabled,
+          base::Unretained(this), true));
+
+  web_ui()->RegisterMessageCallback(
+      "disableDataChannelRecordings",
+      base::BindRepeating(
+          &WebRTCInternalsMessageHandler::OnSetDataChannelRecordingsEnabled,
+          base::Unretained(this), false));
+
+  web_ui()->RegisterMessageCallback(
       "finishedDOMLoad",
       base::BindRepeating(&WebRTCInternalsMessageHandler::OnDOMLoadDone,
                           base::Unretained(this)));
@@ -117,6 +129,16 @@
   }
 }
 
+void WebRTCInternalsMessageHandler::OnSetDataChannelRecordingsEnabled(
+    bool enable,
+    const base::Value::List& /* unused_list */) {
+  if (enable) {
+    webrtc_internals_->EnableDataChannelRecordings(web_ui()->GetWebContents());
+  } else {
+    webrtc_internals_->DisableDataChannelRecordings();
+  }
+}
+
 void WebRTCInternalsMessageHandler::OnDOMLoadDone(
     const base::Value::List& args_list) {
   CHECK_GE(args_list.size(), 1u);
@@ -133,6 +155,8 @@
              webrtc_internals_->IsEventLogRecordingsEnabled());
   params.Set("eventLogRecordingsToggleable",
              webrtc_internals_->CanToggleEventLogRecordings());
+  params.Set("dataChannelRecordingsEnabled",
+             webrtc_internals_->IsDataChannelRecordingsEnabled());
 
   for (auto* host : PeerConnectionTrackerHost::GetAllHosts()) {
     host->GetCurrentState();
diff --git a/content/browser/webrtc/webrtc_internals_message_handler.h b/content/browser/webrtc/webrtc_internals_message_handler.h
index df04a73..e0c1dc17 100644
--- a/content/browser/webrtc/webrtc_internals_message_handler.h
+++ b/content/browser/webrtc/webrtc_internals_message_handler.h
@@ -51,6 +51,8 @@
                                         const base::Value::List& list);
   void OnSetEventLogRecordingsEnabled(bool enable,
                                       const base::Value::List& list);
+  void OnSetDataChannelRecordingsEnabled(bool enable,
+                                         const base::Value::List& list);
   void OnDOMLoadDone(const base::Value::List& list);
 
   // WebRTCInternalsUIObserver override.
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 78972aa..873f4a0 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -221,8 +221,6 @@
           {wf::EnableFedCmMultipleIdentityProviders,
            raw_ref(features::kFedCmMultipleIdentityProviders),
            kSetOnlyIfOverridden},
-          {wf::EnableFedCmSelectiveDisclosure,
-           raw_ref(features::kFedCmSelectiveDisclosure), kDefault},
           {wf::EnableFencedFrames,
            raw_ref(features::kPrivacySandboxAdsAPIsOverride),
            kSetOnlyIfOverridden},
diff --git a/content/common/features.cc b/content/common/features.cc
index 201f17f3..12b3b51 100644
--- a/content/common/features.cc
+++ b/content/common/features.cc
@@ -121,6 +121,13 @@
 #endif
 );
 
+// When enabled, CDP method Page.captureScreenshot will increment
+// the LocalSurfaceId instead of waiting for ForceRedraw to complete.
+// This should avoid a possible stall due to frames not being presented.
+BASE_FEATURE(kCDPScreenshotNewSurface,
+             "CDPScreenshotNewSurface",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // When enabled, code cache does not use a browsing_data filter for deletions.
 BASE_FEATURE(kCodeCacheDeletionWithoutFilter,
              "CodeCacheDeletionWithoutFilter",
diff --git a/content/common/features.h b/content/common/features.h
index 4dc19d791..bf2059b 100644
--- a/content/common/features.h
+++ b/content/common/features.h
@@ -53,6 +53,7 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
     kBlockInsecurePrivateNetworkRequestsFromUnknown);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCanvas2DImageChromium);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kCDPScreenshotNewSurface);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCompositeClipPathAnimation);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCodeCacheDeletionWithoutFilter);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCommittedOriginEnforcements);
diff --git a/content/public/browser/navigation_handle.h b/content/public/browser/navigation_handle.h
index 540c16da..0e4dff7 100644
--- a/content/public/browser/navigation_handle.h
+++ b/content/public/browser/navigation_handle.h
@@ -305,6 +305,9 @@
   // be net::OK.
   virtual net::Error GetNetErrorCode() = 0;
 
+  // The details why `net::Error` was emitted.
+  virtual int GetNetExtendedErrorCode() = 0;
+
   // Returns the RenderFrameHost this navigation is committing in.  The
   // RenderFrameHost returned will be the final host for the navigation. (Use
   // WebContentsObserver::RenderFrameHostChanged() to observe RenderFrameHost
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 193728e..e2446ed 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -433,12 +433,6 @@
              "FedCmMultipleIdentityProviders",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enables usage of the FedCM API with the Selective Disclosure API at the same
-// time.
-BASE_FEATURE(kFedCmSelectiveDisclosure,
-             "FedCmSelectiveDisclosure",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Enables showing filtered out accounts in FedCM UI after the user attempts to
 // login to an account. These accounts are shown greyed out.
 BASE_FEATURE(kFedCmShowFilteredAccounts,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 415dae84..1ba07e8 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -111,7 +111,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdPRegistration);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmMetricsEndpoint);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmMultipleIdentityProviders);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmSelectiveDisclosure);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmShowFilteredAccounts);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmWithoutWellKnownEnforcement);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmLightweightMode);
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 110aedf3..a58b4f9 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -2810,7 +2810,7 @@
   return RenderWidgetHostImpl::From(web_contents->GetPrimaryMainFrame()
                                         ->GetRenderViewHost()
                                         ->GetWidget())
-      ->RequestRepaintForTesting();
+      ->RequestRepaintOnNewSurface();
 }
 
 RenderFrameSubmissionObserver::RenderFrameSubmissionObserver(
diff --git a/content/public/test/mock_navigation_handle.h b/content/public/test/mock_navigation_handle.h
index eef4605..a95be3cb 100644
--- a/content/public/test/mock_navigation_handle.h
+++ b/content/public/test/mock_navigation_handle.h
@@ -137,6 +137,7 @@
   MOCK_METHOD0(GetNavigationUIData, NavigationUIData*());
   MOCK_METHOD0(IsExternalProtocol, bool());
   net::Error GetNetErrorCode() override { return net_error_code_; }
+  int GetNetExtendedErrorCode() override { return net_extended_error_code_; }
   RenderFrameHost* GetRenderFrameHost() const override {
     return render_frame_host_;
   }
@@ -291,6 +292,9 @@
   void set_net_error_code(net::Error error_code) {
     net_error_code_ = error_code;
   }
+  void set_net_extended_error_code(int net_extended_error_code) {
+    net_extended_error_code_ = net_extended_error_code;
+  }
   void set_render_frame_host(RenderFrameHost* render_frame_host) {
     render_frame_host_ = render_frame_host;
   }
@@ -363,6 +367,7 @@
   blink::mojom::Referrer referrer_;
   ui::PageTransition page_transition_ = ui::PAGE_TRANSITION_LINK;
   net::Error net_error_code_ = net::OK;
+  int net_extended_error_code_ = 0;
   raw_ptr<RenderFrameHost, DanglingUntriaged> render_frame_host_ = nullptr;
   bool is_same_document_ = false;
   bool is_served_from_bfcache_ = false;
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index 2db59ba..5438460 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -7408,6 +7408,8 @@
 data/gpu/webgpu-stress-request-device-and-remove-loop.html
 data/gpu/webgpu-unittest-utils.js
 data/gpu/webgpu-unittest-worker.js
+data/gpu/webrtc/codec_loopback.html
+data/gpu/webrtc/webrtc_common.js
 data/gpu/worker-webgl-raf-after-gpu-crash.html
 data/green.html
 data/gtk_key_bindings_test_gtkrc
diff --git a/content/test/data/gpu/webrtc/codec_loopback.html b/content/test/data/gpu/webrtc/codec_loopback.html
new file mode 100644
index 0000000..e450a3d
--- /dev/null
+++ b/content/test/data/gpu/webrtc/codec_loopback.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <link rel="icon" href="data:;base64,="><!-- prevent request for favicon -->
+
+  <script src="webrtc_common.js"></script>
+  <script type="text/javascript">
+    'use strict';
+
+    async function pollGetStatsUntil(pc, condition, pollingMs = 100) {
+      return new Promise((resolve, reject) => {
+        const timeoutId = setTimeout(() => { reject(new Error('Timeout after 30s')) }, 30000);
+        const pollGetStats = async () => {
+          const report = await pc.getStats();
+          for (const stats of report.values()) {
+            if (condition(report, stats)) {
+              clearTimeout(timeoutId);
+              resolve(report);
+              return;
+            }
+          }
+          // No match, then set timeout and try again.
+          setTimeout(pollGetStats, pollingMs);
+        };
+        pollGetStats();
+      });
+    }
+
+    function isRtpWithCodec(report, stats, mimeType) {
+      if (stats.type !== 'outbound-rtp' && stats.type !== 'inbound-rtp') {
+        return false;  // Not an RTP stats object.
+      }
+      const codec = report.get(stats.codecId);
+      return codec && codec.mimeType == mimeType;
+    }
+
+    async function main(arg) {
+      const preferredCodec = arg.codec;
+      const sendCodec =
+        RTCRtpSender.getCapabilities('video').codecs.find(
+          codec => codec.mimeType == preferredCodec);
+      const canRecv =
+        RTCRtpReceiver.getCapabilities('video').codecs.find(
+          codec => codec.mimeType == preferredCodec) != undefined;
+      const canSend = sendCodec !== undefined;
+      if (!canSend || !canRecv) {
+        TEST.skip(`${preferredCodec} either does not support send(${canSend}) or receive (${canRecv})`);
+        return;
+      }
+
+      const pc1 = new RTCPeerConnection();
+      TEST.addCleanup(() => pc1.close());
+      const pc2 = new RTCPeerConnection();
+      TEST.addCleanup(() => pc2.close());
+      pc1.onicecandidate = (e) => pc2.addIceCandidate(e.candidate);
+      pc2.onicecandidate = (e) => pc1.addIceCandidate(e.candidate);
+
+      const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 640, height: 360 } });
+      const [track] = stream.getVideoTracks();
+      TEST.addCleanup(() => track.stop());
+      const transceiver = pc1.addTransceiver(track);
+      transceiver.setCodecPreferences([sendCodec]);
+      await pc1.setLocalDescription();
+      await pc2.setRemoteDescription(pc1.localDescription);
+      await pc2.setLocalDescription();
+      await pc1.setRemoteDescription(pc2.localDescription);
+
+      // Wait for frames to be encoded and sent.
+      await pollGetStatsUntil(pc1, (report, stats) => {
+        if (!isRtpWithCodec(report, stats, preferredCodec)) {
+          return false;
+        }
+        TEST.assert_equals(stats.type, 'outbound-rtp');
+        return stats.framesEncoded > 0 && stats.framesSent > 0;
+      });
+      // Wait for frames to be received and decoded.
+      await pollGetStatsUntil(pc2, (report, stats) => {
+        if (!isRtpWithCodec(report, stats, preferredCodec)) {
+          return false;
+        }
+        TEST.assert_equals(stats.type, 'inbound-rtp');
+        return stats.framesReceived > 0 && stats.framesDecoded > 0;
+      });
+    }
+  </script>
+</head>
+
+<body>
+  <p id="consoleId"></p>
+</body>
+
+</html>
diff --git a/content/test/data/gpu/webrtc/webrtc_common.js b/content/test/data/gpu/webrtc/webrtc_common.js
new file mode 100644
index 0000000..b6f5e836
--- /dev/null
+++ b/content/test/data/gpu/webrtc/webrtc_common.js
@@ -0,0 +1,93 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+class TestHarness {
+  finished = false;
+  success = false;
+  skipped = false;
+  message = 'ok';
+  logs = [];
+  logWindow = null;
+  cleanups = [];
+
+  constructor() {}
+
+  skip(message) {
+    this.skipped = true;
+    this.finished = true;
+    this.message = message;
+    this.log('Test skipped: ' + message);
+  }
+
+  reportSuccess() {
+    this.finished = true;
+    this.success = true;
+    this.log('Test completed');
+  }
+
+  reportFailure(error) {
+    this.finished = true;
+    this.success = false;
+    this.message = error.toString();
+    this.log(this.message);
+  }
+
+  assert(condition, msg) {
+    if (!condition)
+      this.reportFailure("Assertion failed: " + msg);
+  }
+
+  assert_equals(val1, val2, msg) {
+    if (val1 != val2) {
+      this.reportFailure(`Assertion failed: ${msg}. ${JSON.stringify(val1)} ` +
+                         `!= ${JSON.stringify(val2)}.`);
+    }
+  }
+
+  assert_not_equals(val1, val2, msg) {
+    if (val1 == val2) {
+      this.reportFailure(`Assertion failed: ${msg}. ${JSON.stringify(val1)} ` +
+                         `== ${JSON.stringify(val2)}.`);
+    }
+  }
+
+  summary() {
+    return this.message + "\n\n" + this.logs.join("\n");
+  }
+
+  log(msg) {
+    this.logs.push(msg);
+    console.log(msg);
+    if (this.logWindow === null)
+      this.logWindow = document.getElementById('consoleId');
+    if (this.logWindow)
+      this.logWindow.innerText += msg + '\n';
+  }
+
+  addCleanup(cb) {
+    this.cleanups.push(cb);
+  }
+
+  run(arg) {
+    main(arg).then(
+        _ => {
+          if (!this.finished)
+            this.reportSuccess();
+        },
+        error => {
+          if (!this.finished)
+            this.reportFailure(error);
+        }).finally(() => {
+          let cleanup = this.cleanups.pop()
+          while (cleanup) {
+            cleanup();
+            cleanup = this.cleanups.pop();
+          }
+        });
+  }
+};
+
+var TEST = new TestHarness();
diff --git a/content/test/gpu/gpu_tests/test_expectations/OWNERS b/content/test/gpu/gpu_tests/test_expectations/OWNERS
index 4aca645..bd4775fb 100644
--- a/content/test/gpu/gpu_tests/test_expectations/OWNERS
+++ b/content/test/gpu/gpu_tests/test_expectations/OWNERS
@@ -2,6 +2,7 @@
 file://gpu/GRAPHICS_TEAM_OWNERS
 
 per-file webcodecs_expectations.txt=file://third_party/blink/renderer/modules/webcodecs/OWNERS
+per-file webrtc_expectations.txt=file://third_party/blink/renderer/modules/peerconnection/OWNERS
 
 # Service accounts for automated expectation scripts.
 chrome-automated-expectation@chops-service-accounts.iam.gserviceaccount.com
diff --git a/content/test/gpu/gpu_tests/test_expectations/webrtc_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webrtc_expectations.txt
new file mode 100644
index 0000000..c4cd1017
--- /dev/null
+++ b/content/test/gpu/gpu_tests/test_expectations/webrtc_expectations.txt
@@ -0,0 +1,119 @@
+# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
+# OS
+# tags: [ android android-oreo android-pie android-r android-s android-t
+#             android-14 android-15 android-16
+#         chromeos
+#         fuchsia
+#         linux ubuntu
+#         mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
+#         win win8 win10 win11 ]
+# Devices
+# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
+#             android-pixel-6 android-shield-android-tv android-sm-a137f
+#             android-sm-a236b android-sm-s911u1
+#         android-brya
+#         chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
+#             chromeos-board-octopus chromeos-board-volteer
+#         fuchsia-board-astro fuchsia-board-nelson fuchsia-board-sherlock
+#             fuchsia-board-qemu-x64 ]
+# Platform
+# tags: [ desktop
+#         mobile ]
+# Browser
+# tags: [ android-chromium
+#         android-webview-instrumentation
+#         debug debug-x64
+#         release release-x64
+#         fuchsia-chrome
+#         web-engine-shell
+#         cros-chrome ]
+# GPU
+# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340 amd-0x7480
+#         amd64
+#         apple apple-apple-m1 apple-apple-m2 apple-apple-m3
+#             apple-angle-metal-renderer:-apple-m1
+#             apple-angle-metal-renderer:-apple-m2
+#             apple-angle-metal-renderer:-apple-m3
+#         arm
+#         google google-0xffff google-0xc0de
+#         imagination
+#         intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
+#             intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x46a8 intel-0x5912
+#             intel-0x9bc5
+#         microsoft microsoft-0xffff
+#         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
+#         qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
+# Architecture
+# tags: [ mac-arm64 mac-x86_64 ]
+# Decoder
+# tags: [ passthrough no-passthrough ]
+# Browser Target CPU
+# tags: [ target-cpu-64 target-cpu-32 target-cpu-31 ]
+# ANGLE Backend
+# tags: [ angle-disabled
+#         angle-d3d9 angle-d3d11
+#         angle-metal
+#         angle-opengl angle-opengles
+#         angle-swiftshader
+#         angle-vulkan ]
+# Skia Renderer
+# tags: [ renderer-skia-gl
+#         renderer-skia-vulkan
+#         renderer-software ]
+# Driver
+# tags: [ mesa_lt_19.1
+#         mesa_ge_21.0
+#         mesa_ge_23.2
+#         nvidia_ge_31.0.15.4601 nvidia_lt_31.0.15.4601
+#         nvidia_ge_535.183.01 nvidia_lt_535.183.01 ]
+# ASan
+# tags: [ asan no-asan ]
+# Display Server
+# tags: [ display-server-wayland display-server-x ]
+# WebGPU Backend Validation
+# tags: [ dawn-backend-validation dawn-no-backend-validation ]
+# WebGPU Adapter
+# tags: [ webgpu-adapter-default webgpu-adapter-swiftshader ]
+# WebGPU DXC
+# tags: [ webgpu-dxc-enabled webgpu-dxc-disabled ]
+# WebGPU worker usage
+# tags: [ webgpu-no-worker
+#         webgpu-service-worker
+#         webgpu-dedicated-worker
+#         webgpu-shared-worker ]
+# WebGPU Compat context
+# tags: [ compat-default compat-min-es31 ]
+# Clang coverage
+# tags: [ clang-coverage no-clang-coverage ]
+# Skia Graphite
+# tags: [ graphite-enabled graphite-disabled ]
+# Memory capacity
+# tags: [ memory_lt_16gb memory_ge_16gb ]
+# results: [ Failure RetryOnFailure Skip Slow ]
+# END TAG HEADER
+
+###############################
+# Permanent Skip Expectations #
+###############################
+# The "Skip" expectations in this section are expected to never be removed.
+# This is for things like tests that will never be supported on a particular
+# platform/configuration.
+
+###############################
+# Temporary Skip Expectations #
+###############################
+# The "Skip" expectations in this section are expected to be removable at some
+# point. This is for things like tests that fail in a way that negatively and
+# significantly impacts other tests, e.g. killing the test device.
+
+###################
+# Failures/Flakes #
+###################
+# Non-"Skip" expectations go here to suppress regular flakes/failures.
+crbug.com/415954245 [ android ] WebRTC_Codec_Loopback_H265 [ Failure ]
+crbug.com/417133858 [ win amd ] WebRTC_Codec_Loopback_H265 [ Failure ]
+
+
+#######################################################################
+# Automated Entries After This Point - Do Not Manually Add Below Here #
+#######################################################################
diff --git a/content/test/gpu/gpu_tests/webrtc_integration_test.py b/content/test/gpu/gpu_tests/webrtc_integration_test.py
new file mode 100644
index 0000000..dbd401d4
--- /dev/null
+++ b/content/test/gpu/gpu_tests/webrtc_integration_test.py
@@ -0,0 +1,85 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+import json
+import itertools
+from typing import Any, List
+import unittest
+
+import gpu_path_util
+from gpu_tests import common_browser_args as cba
+from gpu_tests import common_typing as ct
+from gpu_tests import gpu_integration_test
+
+html_path = os.path.join(gpu_path_util.CHROMIUM_SRC_DIR, 'content', 'test',
+                         'data', 'gpu', 'webrtc')
+
+
+class WebRTCIntegrationTest(gpu_integration_test.GpuIntegrationTest):
+
+  @classmethod
+  def Name(cls) -> str:
+    return 'webrtc'
+
+  @classmethod
+  def _SuiteSupportsParallelTests(cls) -> bool:
+    return True
+
+  @classmethod
+  def GenerateGpuTests(cls, options: ct.ParsedCmdArgs) -> ct.TestGenerator:
+    tests = itertools.chain(cls.GenerateWebRTCTests())
+    for test in tests:
+      yield test
+
+  @classmethod
+  def GenerateWebRTCTests(cls) -> ct.TestGenerator:
+    for codec in ['H265']:
+      yield ('WebRTC_Codec_Loopback_{}'.format(codec), 'codec_loopback.html', [{
+          'codec':
+          'video/{}'.format(codec)
+      }])
+
+  def RunActualGpuTest(self, test_path: str, args: ct.TestArgs) -> None:
+    url = self.UrlOfStaticFilePath(os.path.join(html_path, test_path))
+    tab = self.tab
+    arg_obj = args[0]
+    tab.Navigate(url)
+    tab.action_runner.WaitForJavaScriptCondition(
+        'document.readyState == "complete"')
+    tab.EvaluateJavaScript('TEST.run(' + json.dumps(arg_obj) + ')')
+    tab.action_runner.WaitForJavaScriptCondition('TEST.finished', timeout=60)
+    if tab.EvaluateJavaScript('TEST.skipped'):
+      self.skipTest('Skipping test:' + tab.EvaluateJavaScript('TEST.summary()'))
+    if not tab.EvaluateJavaScript('TEST.success'):
+      self.fail('Test failure:' + tab.EvaluateJavaScript('TEST.summary()'))
+
+  @classmethod
+  def SetUpProcess(cls) -> None:
+    super(WebRTCIntegrationTest, cls).SetUpProcess()
+    args = [
+        '--use-fake-device-for-media-stream',
+        '--use-fake-ui-for-media-stream',
+        cba.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES,
+    ] + cba.ENABLE_WEBGPU_FOR_TESTING
+
+    # If we don't call CustomizeBrowserArgs cls.platform is None
+    cls.CustomizeBrowserArgs(args)
+
+    cls.StartBrowser()
+    cls.SetStaticServerDirs([html_path])
+
+  @classmethod
+  def ExpectationsFiles(cls) -> List[str]:
+    return [
+        os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                     'test_expectations', 'webrtc_expectations.txt')
+    ]
+
+
+def load_tests(loader: unittest.TestLoader, tests: Any,
+               pattern: Any) -> unittest.TestSuite:
+  del loader, tests, pattern  # Unused.
+  return gpu_integration_test.LoadAllTestsInModule(sys.modules[__name__])
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index 0ffffbc..76b167d 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -708,10 +708,12 @@
       render_frame_host_->frame_tree_node()->current_frame_host()->GetWeakPtr();
 
   // RenderDocument: Do not dispatch UnloadACK if the navigation was committed
-  // in the same SiteInstance. This has already been dispatched during the
+  // in the same SiteInstanceGroup. This has already been dispatched during the
   // navigation in the renderer process.
-  if (previous_rfh->GetSiteInstance() == render_frame_host_->GetSiteInstance())
+  if (previous_rfh->GetSiteInstance()->group() ==
+      render_frame_host_->GetSiteInstance()->group()) {
     drop_unload_ack_ = true;
+  }
 
   // If the frame is not alive we do not displatch Unload ACK. CommitPending()
   // may be called immediately and delete the old RenderFrameHost, so we need to
@@ -876,10 +878,12 @@
       render_frame_host_->frame_tree_node()->current_frame_host();
 
   // RenderDocument: Do not dispatch UnloadACK if the navigation was committed
-  // in the same SiteInstance. This has already been dispatched during the
+  // in the same SiteInstanceGroup. This has already been dispatched during the
   // navigation in the renderer process.
-  if (previous_rfh->GetSiteInstance() == render_frame_host_->GetSiteInstance())
+  if (previous_rfh->GetSiteInstance()->group() ==
+      render_frame_host_->GetSiteInstance()->group()) {
     drop_unload_ack_ = true;
+  }
 
   // If the frame is not alive we do not displatch Unload ACK. CommitPending()
   // may be called immediately and delete the old RenderFrameHost, so we need to
diff --git a/content/web_test/browser/web_test_browser_main_runner.cc b/content/web_test/browser/web_test_browser_main_runner.cc
index e95b3cb..89e8015 100644
--- a/content/web_test/browser/web_test_browser_main_runner.cc
+++ b/content/web_test/browser/web_test_browser_main_runner.cc
@@ -276,20 +276,11 @@
     command_line.AppendSwitch(switches::kDisableGpuRasterization);
 
 #if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
-  if (base::mac::MacOSMajorVersion() == 14) {
-    // If Graphite is not explicitly disabled, enable it. This is to use
-    // Graphite as the renderer for web tests on all bots for this platform
-    // except those explicitly testing Ganesh.
-    if (!command_line.HasSwitch(switches::kDisableSkiaGraphite)) {
-      command_line.AppendSwitch(switches::kEnableSkiaGraphite);
-    }
-  } else {
-    // If Graphite is not explicitly enabled, disable it. This is to keep using
-    // Ganesh as renderer for web tests for now until we finish rebaselining all
-    // images for Graphite renderer.
-    if (!command_line.HasSwitch(switches::kEnableSkiaGraphite)) {
-      command_line.AppendSwitch(switches::kDisableSkiaGraphite);
-    }
+  // If Graphite is not explicitly disabled, enable it. This is to use
+  // Graphite as the renderer for web tests on all bots for this platform
+  // except those explicitly testing Ganesh.
+  if (!command_line.HasSwitch(switches::kDisableSkiaGraphite)) {
+    command_line.AppendSwitch(switches::kEnableSkiaGraphite);
   }
 #else
   // If Graphite is not explicitly enabled, disable it. This is to keep using
diff --git a/device/fido/features.cc b/device/fido/features.cc
index 82cd6d9a..de747a55 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -175,10 +175,11 @@
              "WebAuthenticationSignalApiHidePasskeys",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables rate limiting of immediate requests based on eTLD+1.
+// Enabled by default as part of the WebAuthenticationImmediateGet feature. Do
+// not remove before WebAuthenticationImmediateGet is removed.
 BASE_FEATURE(kWebAuthnImmediateRequestRateLimit,
              "WebAuthnImmediateRequestRateLimit",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE_PARAM(int,
                    kWebAuthnImmediateRequestRateLimitMaxRequests,
diff --git a/device/fido/features.h b/device/fido/features.h
index caeefb4..ba8f3ea 100644
--- a/device/fido/features.h
+++ b/device/fido/features.h
@@ -131,7 +131,7 @@
 COMPONENT_EXPORT(DEVICE_FIDO)
 BASE_DECLARE_FEATURE(kWebAuthnSignalApiHidePasskeys);
 
-// Enables rate limiting of immediate requests.
+// Enables rate limiting of immediate requests based on eTLD+1.
 COMPONENT_EXPORT(DEVICE_FIDO)
 BASE_DECLARE_FEATURE(kWebAuthnImmediateRequestRateLimit);
 
diff --git a/headless/test/data/protocol/sanity/window-open-popup-placement-expected.txt b/headless/test/data/protocol/sanity/window-open-popup-placement-expected.txt
new file mode 100644
index 0000000..ecedadc7
--- /dev/null
+++ b/headless/test/data/protocol/sanity/window-open-popup-placement-expected.txt
@@ -0,0 +1,2 @@
+Tests popup window open placement.
+Popup: {10,20 400x200}
\ No newline at end of file
diff --git a/headless/test/data/protocol/sanity/window-open-popup-placement.js b/headless/test/data/protocol/sanity/window-open-popup-placement.js
new file mode 100644
index 0000000..96e8f645
--- /dev/null
+++ b/headless/test/data/protocol/sanity/window-open-popup-placement.js
@@ -0,0 +1,44 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function(testRunner) {
+  const {session, dp} =
+      await testRunner.startBlank('Tests popup window open placement.');
+
+  const {sessionId} =
+      (await testRunner.browserP().Target.attachToBrowserTarget({})).result;
+  const bp = (new TestRunner.Session(testRunner, sessionId)).protocol;
+
+  const HttpInterceptor =
+      await testRunner.loadScriptAbsolute('../resources/http-interceptor.js');
+  const httpInterceptor = await (new HttpInterceptor(testRunner, bp)).init();
+  httpInterceptor.setDisableRequestedUrlsLogging(true);
+
+  httpInterceptor.addResponse('https://example.com/index.html', `
+      <script>
+          const popup = window.open('/page2.html', '_blank',
+              'popup, left=10, top=20, width=400, height=200');
+          popup.addEventListener('load', async () => {
+            console.log('Popup: ' +
+                '{' + popup.screenLeft + ',' + popup.screenTop +
+                ' ' + popup.innerWidth + 'x' + popup.innerHeight +
+                '}');
+          });
+      </script>`);
+
+  httpInterceptor.addResponse(
+      'https://example.com/page2.html', `<body>Page2</body>`);
+
+  await dp.Browser.grantPermissions({permissions: ['windowManagement']});
+
+  dp.Runtime.enable();
+  const readyPromise = dp.Runtime.onceConsoleAPICalled();
+
+  session.navigate('https://example.com/index.html');
+
+  const message = (await readyPromise).params.args[0].value;
+  testRunner.log(message);
+
+  testRunner.completeTest();
+})
diff --git a/headless/test/headless_protocol_browsertest.cc b/headless/test/headless_protocol_browsertest.cc
index 0683dfa0..b54b4765 100644
--- a/headless/test/headless_protocol_browsertest.cc
+++ b/headless/test/headless_protocol_browsertest.cc
@@ -776,4 +776,9 @@
     "sanity/multiple-screen-details.js",
     "--screen-info={label='#1'}{600x800 label='#2'}")
 
+HEADLESS_PROTOCOL_TEST_WITH_COMMAND_LINE_EXTRAS(
+    WindowOpenPopupPlacement,
+    "sanity/window-open-popup-placement.js",
+    "--screen-info={1600x1200}")
+
 }  // namespace headless
diff --git "a/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/targets/chromium.gpu.fyi.json"
index 204b98ab..985f84b 100644
--- "a/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Experimental Release \050Pixel 6\051/targets/chromium.gpu.fyi.json"
@@ -1092,6 +1092,84 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "AP1A.240405.002",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "AP1A.240405.002",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/targets/chromium.gpu.fyi.json"
index 2fb1f24..dd35fd8 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Nexus 5X\051/targets/chromium.gpu.fyi.json"
@@ -601,6 +601,45 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "OPR4.170623.020",
+            "device_os_flavor": "google",
+            "device_os_type": "userdebug",
+            "device_type": "bullhead",
+            "os": "Android",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/targets/chromium.gpu.fyi.json"
index 3dd6fdd..fded3a19 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 4\051/targets/chromium.gpu.fyi.json"
@@ -902,6 +902,44 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "RP1A.201105.002",
+            "device_os_type": "userdebug",
+            "device_type": "flame",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/targets/chromium.gpu.fyi.json"
index baf562f5..5e332aff 100644
--- "a/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Android FYI Release \050Pixel 6\051/targets/chromium.gpu.fyi.json"
@@ -1065,6 +1065,82 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/ChromeOS FYI Release \050amd64-generic\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/ChromeOS FYI Release \050amd64-generic\051/targets/chromium.gpu.fyi.json"
index 7e73e80f..2d6f40a8 100644
--- "a/infra/config/generated/builders/ci/ChromeOS FYI Release \050amd64-generic\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/ChromeOS FYI Release \050amd64-generic\051/targets/chromium.gpu.fyi.json"
@@ -666,6 +666,56 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=cros-chrome",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--remote=127.0.0.1",
+          "--remote-ssh-port=9222",
+          "--magic-vm-cache=magic_cros_vm_cache"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "kvm": "1",
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "named_caches": [
+            {
+              "name": "cros_vm",
+              "path": "magic_cros_vm_cache"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "cros_vm"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050volteer\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050volteer\051/targets/chromium.gpu.fyi.json"
index 2df3400..cd482cd 100644
--- "a/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050volteer\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050volteer\051/targets/chromium.gpu.fyi.json"
@@ -400,6 +400,35 @@
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
         "use_lkgm": true,
         "variant_id": "VOLTEER_PUBLIC_RELEASE_LKGM"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=cros-chrome",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--enforce-browser-version",
+          "--jobs=1"
+        ],
+        "autotest_name": "chromium_Graphics",
+        "bucket": "chromiumos-image-archive",
+        "cros_board": "volteer",
+        "cros_model": "voxel",
+        "dut_pool": "chromium",
+        "extra_browser_args": "--log-level=0 --js-flags=--expose-gc",
+        "name": "webrtc_tests VOLTEER_PUBLIC_RELEASE_LKGM",
+        "public_builder": "cros_test_platform_public",
+        "public_builder_bucket": "testplatform-public",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "use_lkgm": true,
+        "variant_id": "VOLTEER_PUBLIC_RELEASE_LKGM"
       }
     ]
   }
diff --git a/infra/config/generated/builders/ci/GPU FYI Android arm Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Android arm Builder/targets/chromium.gpu.fyi.json
index 8d059111..fcd2260e 100644
--- a/infra/config/generated/builders/ci/GPU FYI Android arm Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Android arm Builder/targets/chromium.gpu.fyi.json
@@ -1768,6 +1768,44 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "RP1A.201105.002",
+            "device_os_type": "userdebug",
+            "device_type": "flame",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/ci/GPU FYI Android arm64 Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Android arm64 Builder/targets/chromium.gpu.fyi.json
index 8deb500..b270669c 100644
--- a/infra/config/generated/builders/ci/GPU FYI Android arm64 Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Android arm64 Builder/targets/chromium.gpu.fyi.json
@@ -1092,6 +1092,84 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "AP1A.240405.002",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "AP1A.240405.002",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
@@ -1697,6 +1775,45 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "OPR4.170623.020",
+            "device_os_flavor": "google",
+            "device_os_type": "userdebug",
+            "device_type": "bullhead",
+            "os": "Android",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
@@ -2766,6 +2883,82 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/ci/GPU FYI Linux Wayland Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Linux Wayland Builder/targets/chromium.gpu.fyi.json
index e6040dd..012b13f 100644
--- a/infra/config/generated/builders/ci/GPU FYI Linux Wayland Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Linux Wayland Builder/targets/chromium.gpu.fyi.json
@@ -518,6 +518,45 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseOzonePlatform --ozone-platform=wayland",
+          "--enforce-browser-version",
+          "--jobs=4",
+          "--xvfb",
+          "--no-xvfb",
+          "--use-weston",
+          "--weston-use-gl"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/GPU FYI Mac Builder \050asan\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/GPU FYI Mac Builder \050asan\051/targets/chromium.gpu.fyi.json"
index c997bbcd9..f63b44b 100644
--- "a/infra/config/generated/builders/ci/GPU FYI Mac Builder \050asan\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/GPU FYI Mac Builder \050asan\051/targets/chromium.gpu.fyi.json"
@@ -1008,6 +1008,114 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -1501,6 +1609,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/ci/GPU FYI Mac Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Mac Builder/targets/chromium.gpu.fyi.json
index 4d8b2c6..8e2966e1 100644
--- a/infra/config/generated/builders/ci/GPU FYI Mac Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Mac Builder/targets/chromium.gpu.fyi.json
@@ -1155,6 +1155,117 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -2375,6 +2486,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -3264,6 +3492,114 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -4162,6 +4498,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -4764,6 +5214,44 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "10de:0fe9",
+            "hidpi": "1",
+            "os": "Mac-11.7.9",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json
index 6c04bfb..2c833391 100644
--- a/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json
@@ -1185,6 +1185,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -2414,6 +2528,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -3634,6 +3862,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -4854,6 +5199,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json
index c187760..cf608d5 100644
--- a/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json
@@ -827,6 +827,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/ci/GPU FYI Win arm64 Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Win arm64 Builder/targets/chromium.gpu.fyi.json
index 1e418fe6..0ef73f6 100644
--- a/infra/config/generated/builders/ci/GPU FYI Win arm64 Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Win arm64 Builder/targets/chromium.gpu.fyi.json
@@ -634,6 +634,44 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "qcom:043a-27.20.1870.0",
+            "os": "Windows-11-22631",
+            "pool": "chromium.tests",
+            "screen_scaling_percent": "100"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json
index ce4557d1..f42fa84 100644
--- a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json
@@ -916,6 +916,43 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-32.0.15.7602",
+            "os": "Windows-11-26100",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -1591,6 +1628,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "1002:7340-31.0.24002.92",
+            "os": "Windows-10-19045.3930",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -2292,6 +2365,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:4680-31.0.101.5333",
+            "os": "Windows-10-19045.3930",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -2992,6 +3101,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:9bc5-31.0.101.2127",
+            "os": "Windows-10",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -3822,6 +3967,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -4484,6 +4665,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "1002:7480-32.0.12033.1030",
+            "os": "Windows-11-26100",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -5402,6 +5619,43 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2783-32.0.15.6070",
+            "os": "Windows-11",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Linux Wayland FYI Release \050Intel\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Linux Wayland FYI Release \050Intel\051/targets/chromium.gpu.fyi.json"
index 982f8d5..965afeb0 100644
--- "a/infra/config/generated/builders/ci/Linux Wayland FYI Release \050Intel\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Linux Wayland FYI Release \050Intel\051/targets/chromium.gpu.fyi.json"
@@ -446,6 +446,45 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseOzonePlatform --ozone-platform=wayland",
+          "--enforce-browser-version",
+          "--jobs=4",
+          "--xvfb",
+          "--no-xvfb",
+          "--use-weston",
+          "--weston-use-gl"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/targets/chromium.gpu.fyi.json"
index b38b753..d3fad9c 100644
--- "a/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI ASAN \050Intel\051/targets/chromium.gpu.fyi.json"
@@ -1007,6 +1007,114 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
index ae00efd..703fe9d 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
@@ -1185,6 +1185,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/targets/chromium.gpu.fyi.json"
index c39f7e3..0f6a4b52 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Intel\051/targets/chromium.gpu.fyi.json"
@@ -1154,6 +1154,117 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/targets/chromium.gpu.fyi.json"
index c1072155..70cbdb3 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Retina Release \050AMD\051/targets/chromium.gpu.fyi.json"
@@ -1216,6 +1216,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
index 7ee4f83..ff258a6 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
@@ -1185,6 +1185,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/targets/chromium.gpu.fyi.json"
index e9da5bc9..6c48ea03 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Release \050Intel\051/targets/chromium.gpu.fyi.json"
@@ -846,6 +846,114 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/targets/chromium.gpu.fyi.json"
index 922729b7..4796b9e4 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina ASAN \050AMD\051/targets/chromium.gpu.fyi.json"
@@ -489,6 +489,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/targets/chromium.gpu.fyi.json"
index f7dcb8e..5a43c5ac 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050AMD\051/targets/chromium.gpu.fyi.json"
@@ -894,6 +894,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/targets/chromium.gpu.fyi.json"
index dcc3a59d..f8b051ee 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M2\051/targets/chromium.gpu.fyi.json"
@@ -1216,6 +1216,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M3\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M3\051/targets/chromium.gpu.fyi.json"
index cd3425d..b078e68 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M3\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050Apple M3\051/targets/chromium.gpu.fyi.json"
@@ -1216,6 +1216,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
index 211f264..e535c35 100644
--- "a/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Mac FYI Retina Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -598,6 +598,44 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "10de:0fe9",
+            "hidpi": "1",
+            "os": "Mac-11.7.9",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
index 8fd94006..e8d66dc 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -915,6 +915,43 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-32.0.15.7602",
+            "os": "Windows-11-26100",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/targets/chromium.gpu.fyi.json"
index 6d3e063a..2df4509 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050AMD RX 5500 XT\051/targets/chromium.gpu.fyi.json"
@@ -634,6 +634,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "1002:7340-31.0.24002.92",
+            "os": "Windows-10-19045.3930",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/targets/chromium.gpu.fyi.json"
index da6ff8f..351bbbbc 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel UHD 770\051/targets/chromium.gpu.fyi.json"
@@ -697,6 +697,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:4680-31.0.101.5333",
+            "os": "Windows-10-19045.3930",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/targets/chromium.gpu.fyi.json"
index 7cba7069..08bddca2 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050Intel\051/targets/chromium.gpu.fyi.json"
@@ -696,6 +696,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:9bc5-31.0.101.2127",
+            "os": "Windows-10",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
index 29a9276..7e55bc92 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -826,6 +826,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
index d2fef63..ba41655 100644
--- "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -826,6 +826,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/targets/chromium.gpu.fyi.json"
index 1e418fe6..0ef73f6 100644
--- "a/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win11 FYI arm64 Release \050Qualcomm Adreno 690\051/targets/chromium.gpu.fyi.json"
@@ -634,6 +634,44 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "qcom:043a-27.20.1870.0",
+            "os": "Windows-11-22631",
+            "pool": "chromium.tests",
+            "screen_scaling_percent": "100"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win11 FYI x64 Release \050AMD RX 7600\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win11 FYI x64 Release \050AMD RX 7600\051/targets/chromium.gpu.fyi.json"
index 21bfc51..f9e5387 100644
--- "a/infra/config/generated/builders/ci/Win11 FYI x64 Release \050AMD RX 7600\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win11 FYI x64 Release \050AMD RX 7600\051/targets/chromium.gpu.fyi.json"
@@ -658,6 +658,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "1002:7480-32.0.12033.1030",
+            "os": "Windows-11-26100",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git "a/infra/config/generated/builders/ci/Win11 FYI x64 Release \050NVIDIA RTX 4070 Super\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win11 FYI x64 Release \050NVIDIA RTX 4070 Super\051/targets/chromium.gpu.fyi.json"
index dd0965d7..409db8d 100644
--- "a/infra/config/generated/builders/ci/Win11 FYI x64 Release \050NVIDIA RTX 4070 Super\051/targets/chromium.gpu.fyi.json"
+++ "b/infra/config/generated/builders/ci/Win11 FYI x64 Release \050NVIDIA RTX 4070 Super\051/targets/chromium.gpu.fyi.json"
@@ -914,6 +914,43 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2783-32.0.15.6070",
+            "os": "Windows-11",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/android_optional_gpu_tests_rel/targets/tryserver.chromium.android.json b/infra/config/generated/builders/try/android_optional_gpu_tests_rel/targets/tryserver.chromium.android.json
index bcd51437..778bdb5 100644
--- a/infra/config/generated/builders/try/android_optional_gpu_tests_rel/targets/tryserver.chromium.android.json
+++ b/infra/config/generated/builders/try/android_optional_gpu_tests_rel/targets/tryserver.chromium.android.json
@@ -691,6 +691,41 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "device_os": "RP1A.201105.002",
+            "device_os_type": "userdebug",
+            "device_type": "flame",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-cq-android-arm64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-cq-android-arm64/targets/chromium.gpu.fyi.json
index 2cb95cc..e4f3129b 100644
--- a/infra/config/generated/builders/try/gpu-fyi-cq-android-arm64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-cq-android-arm64/targets/chromium.gpu.fyi.json
@@ -1065,6 +1065,82 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-64/targets/chromium.gpu.fyi.json
index d42d832..4df4f36 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-64/targets/chromium.gpu.fyi.json
@@ -601,6 +601,45 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "OPR4.170623.020",
+            "device_os_flavor": "google",
+            "device_os_type": "userdebug",
+            "device_type": "bullhead",
+            "os": "Android",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64-exp/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64-exp/targets/chromium.gpu.fyi.json
index 1fe8b80..755fcbf 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64-exp/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64-exp/targets/chromium.gpu.fyi.json
@@ -1092,6 +1092,84 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "AP1A.240405.002",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "AP1A.240405.002",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64/targets/chromium.gpu.fyi.json
index 2cb95cc..e4f3129b 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-android-pixel-6-64/targets/chromium.gpu.fyi.json
@@ -1065,6 +1065,82 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "TP1A.220624.021",
+            "device_os_type": "userdebug",
+            "device_type": "oriole",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-android-r-pixel-4-32/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-android-r-pixel-4-32/targets/chromium.gpu.fyi.json
index 89a9fa6..b930a5e 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-android-r-pixel-4-32/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-android-r-pixel-4-32/targets/chromium.gpu.fyi.json
@@ -902,6 +902,44 @@
         },
         "test": "telemetry_gpu_integration_test_android_chrome",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--initial-find-device-attempts=3"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "device_os": "RP1A.201105.002",
+            "device_os_type": "userdebug",
+            "device_type": "flame",
+            "os": "Android",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test_android_chrome",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       }
     ]
   },
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-chromeos-amd64-generic/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-chromeos-amd64-generic/targets/chromium.gpu.fyi.json
index 7e73e80f..2d6f40a8 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-chromeos-amd64-generic/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-chromeos-amd64-generic/targets/chromium.gpu.fyi.json
@@ -666,6 +666,56 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=cros-chrome",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=1",
+          "--remote=127.0.0.1",
+          "--remote-ssh-port=9222",
+          "--magic-vm-cache=magic_cros_vm_cache"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "kvm": "1",
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "named_caches": [
+            {
+              "name": "cros_vm",
+              "path": "magic_cros_vm_cache"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "cros_vm"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-chromeos-skylab-volteer/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-chromeos-skylab-volteer/targets/chromium.gpu.fyi.json
index 2df3400..cd482cd 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-chromeos-skylab-volteer/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-chromeos-skylab-volteer/targets/chromium.gpu.fyi.json
@@ -400,6 +400,35 @@
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
         "use_lkgm": true,
         "variant_id": "VOLTEER_PUBLIC_RELEASE_LKGM"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=cros-chrome",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--enforce-browser-version",
+          "--jobs=1"
+        ],
+        "autotest_name": "chromium_Graphics",
+        "bucket": "chromiumos-image-archive",
+        "cros_board": "volteer",
+        "cros_model": "voxel",
+        "dut_pool": "chromium",
+        "extra_browser_args": "--log-level=0 --js-flags=--expose-gc",
+        "name": "webrtc_tests VOLTEER_PUBLIC_RELEASE_LKGM",
+        "public_builder": "cros_test_platform_public",
+        "public_builder_bucket": "testplatform-public",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "use_lkgm": true,
+        "variant_id": "VOLTEER_PUBLIC_RELEASE_LKGM"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-linux-wayland-intel-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-linux-wayland-intel-rel/targets/chromium.gpu.fyi.json
index 982f8d5..965afeb0 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-linux-wayland-intel-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-linux-wayland-intel-rel/targets/chromium.gpu.fyi.json
@@ -446,6 +446,45 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseOzonePlatform --ozone-platform=wayland",
+          "--enforce-browser-version",
+          "--jobs=4",
+          "--xvfb",
+          "--no-xvfb",
+          "--use-weston",
+          "--weston-use-gl"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/targets/chromium.gpu.fyi.json
index 7df0de03b..031ae469 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/targets/chromium.gpu.fyi.json
@@ -490,6 +490,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/targets/chromium.gpu.fyi.json
index 807c2e5..2d58054 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/targets/chromium.gpu.fyi.json
@@ -1217,6 +1217,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:67ef",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/targets/chromium.gpu.fyi.json
index ec930be..2c1d289 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/targets/chromium.gpu.fyi.json
@@ -895,6 +895,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json
index ae00efd..703fe9d 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json
@@ -1185,6 +1185,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-15.4",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/targets/chromium.gpu.fyi.json
index 7ee4f83..ff258a6 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/targets/chromium.gpu.fyi.json
@@ -1185,6 +1185,120 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m1",
+            "mac_model": "Macmini9,1",
+            "os": "Mac-14.5",
+            "pool": "chromium.tests"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel/targets/chromium.gpu.fyi.json
index dcc3a59d..f8b051ee 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel/targets/chromium.gpu.fyi.json
@@ -1216,6 +1216,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m2",
+            "hidpi": "1",
+            "mac_model": "Mac14,7",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m3-retina-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m3-retina-rel/targets/chromium.gpu.fyi.json
index cd3425d..b078e68 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m3-retina-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m3-retina-rel/targets/chromium.gpu.fyi.json
@@ -1216,6 +1216,123 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "apple:m3",
+            "hidpi": "1",
+            "mac_model": "Mac15,3",
+            "os": "Mac-15.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/targets/chromium.gpu.fyi.json
index 1c31863..5833045 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/targets/chromium.gpu.fyi.json
@@ -1008,6 +1008,114 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/targets/chromium.gpu.fyi.json
index dcfcbfc..fffc565087 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/targets/chromium.gpu.fyi.json
@@ -1155,6 +1155,117 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-15.4"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/targets/chromium.gpu.fyi.json
index 3ea8c4f..327c69d5 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/targets/chromium.gpu.fyi.json
@@ -847,6 +847,114 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/targets/chromium.gpu.fyi.json
index 10949d2..b8ed5b5c 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/targets/chromium.gpu.fyi.json
@@ -599,6 +599,44 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "10de:0fe9",
+            "hidpi": "1",
+            "os": "Mac-11.7.9",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-amd-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-amd-rel-64/targets/chromium.gpu.fyi.json
index a1f51049..002ad84 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-amd-rel-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-amd-rel-64/targets/chromium.gpu.fyi.json
@@ -635,6 +635,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "1002:7340-31.0.24002.92",
+            "os": "Windows-10-19045.3930",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/targets/chromium.gpu.fyi.json
index 2a37666..036000a 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-rel-64/targets/chromium.gpu.fyi.json
@@ -697,6 +697,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:9bc5-31.0.101.2127",
+            "os": "Windows-10",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-uhd770-rel/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-uhd770-rel/targets/chromium.gpu.fyi.json
index 792ce2a..24e0b2c 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-uhd770-rel/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-intel-uhd770-rel/targets/chromium.gpu.fyi.json
@@ -698,6 +698,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:4680-31.0.101.5333",
+            "os": "Windows-10-19045.3930",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json
index babe764..5324db31 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json
@@ -916,6 +916,43 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-32.0.15.7602",
+            "os": "Windows-11-26100",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json
index c187760..cf608d5 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json
@@ -827,6 +827,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json
index 59a494b..52302d0 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json
@@ -827,6 +827,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win11-amd-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win11-amd-rel-64/targets/chromium.gpu.fyi.json
index 6a05ab0..c97abc1 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win11-amd-rel-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win11-amd-rel-64/targets/chromium.gpu.fyi.json
@@ -659,6 +659,42 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "1002:7480-32.0.12033.1030",
+            "os": "Windows-11-26100",
+            "pool": "chromium.tests.gpu"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win11-nvidia-4070-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win11-nvidia-4070-rel-64/targets/chromium.gpu.fyi.json
index 0713290..0a6bb08 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win11-nvidia-4070-rel-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win11-nvidia-4070-rel-64/targets/chromium.gpu.fyi.json
@@ -915,6 +915,43 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2783-32.0.15.6070",
+            "os": "Windows-11",
+            "pool": "chromium.tests.gpu"
+          },
+          "expiration": 21600,
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win11-qualcomm-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win11-qualcomm-rel-64/targets/chromium.gpu.fyi.json
index 1e418fe6..0ef73f6 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-win11-qualcomm-rel-64/targets/chromium.gpu.fyi.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-win11-qualcomm-rel-64/targets/chromium.gpu.fyi.json
@@ -634,6 +634,44 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "cpu": "arm64",
+            "display_attached": "1",
+            "gpu": "qcom:043a-27.20.1870.0",
+            "os": "Windows-11-22631",
+            "pool": "chromium.tests",
+            "screen_scaling_percent": "100"
+          },
+          "hard_timeout": 1800,
+          "idempotent": false,
+          "io_timeout": 1800,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/targets/tryserver.chromium.linux.json b/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/targets/tryserver.chromium.linux.json
index c31c64f0..dd54ce5 100644
--- a/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/targets/tryserver.chromium.linux.json
+++ b/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/targets/tryserver.chromium.linux.json
@@ -348,6 +348,72 @@
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
         "variant_id": "UHD 630"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests GTX 1660",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "gpu": "10de:2184-440.100",
+            "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "GTX 1660"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests UHD 630",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "gpu": "8086:9bc5-23.2.1",
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "UHD 630"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/targets/tryserver.chromium.mac.json b/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/targets/tryserver.chromium.mac.json
index 42b6c54..f9450b3 100644
--- a/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/targets/tryserver.chromium.mac.json
+++ b/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/targets/tryserver.chromium.mac.json
@@ -1674,6 +1674,252 @@
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
         "variant_id": "8086:3e9b"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests 1002:7340",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "1002:7340"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests 10de:0fe9",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "10de:0fe9",
+            "hidpi": "1",
+            "os": "Mac-11.7.9",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "10de:0fe9"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests 8086:3e9b",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "8086:3e9b"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests 1002:7340",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "1002:7340"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests 8086:3e9b",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "8086:3e9b"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests 1002:7340",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "1002:7340",
+            "hidpi": "1",
+            "os": "Mac-14.4.1",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "1002:7340"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests 8086:3e9b",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "8086:3e9b"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/win_optional_gpu_tests_rel/targets/tryserver.chromium.win.json b/infra/config/generated/builders/try/win_optional_gpu_tests_rel/targets/tryserver.chromium.win.json
index 4d3cd050c..566724df 100644
--- a/infra/config/generated/builders/try/win_optional_gpu_tests_rel/targets/tryserver.chromium.win.json
+++ b/infra/config/generated/builders/try/win_optional_gpu_tests_rel/targets/tryserver.chromium.win.json
@@ -734,6 +734,75 @@
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
         "variant_id": "8086:9bc5"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests 10de:2184",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "10de:2184"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests 8086:9bc5",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "containment_type": "AUTO",
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "8086:9bc5-31.0.101.2127",
+            "os": "Windows-10",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/",
+        "variant_id": "8086:9bc5"
       }
     ]
   }
diff --git a/infra/config/generated/testing/test_suites.pyl b/infra/config/generated/testing/test_suites.pyl
index 8804a46..2885db7 100644
--- a/infra/config/generated/testing/test_suites.pyl
+++ b/infra/config/generated/testing/test_suites.pyl
@@ -1720,6 +1720,63 @@
       },
     },
 
+    'gpu_webrtc_gl_passthrough_ganesh_telemetry_test': {
+      'webrtc_gl_passthrough_ganesh_tests': {
+        'test_common': {
+          'mixins': [
+            'has_native_resultdb_integration',
+            'gpu_force_command_decoder_passthrough',
+            'gpu_force_angle_gl',
+            'gpu_force_skia_ganesh',
+            'gpu_integration_test_common_args',
+          ],
+        },
+        'telemetry_test_name': 'webrtc',
+      },
+    },
+
+    'gpu_webrtc_metal_passthrough_ganesh_telemetry_test': {
+      'webrtc_metal_passthrough_ganesh_tests': {
+        'test_common': {
+          'mixins': [
+            'has_native_resultdb_integration',
+            'gpu_force_command_decoder_passthrough',
+            'gpu_force_angle_metal',
+            'gpu_force_skia_ganesh',
+            'gpu_integration_test_common_args',
+          ],
+        },
+        'telemetry_test_name': 'webrtc',
+      },
+    },
+
+    'gpu_webrtc_metal_passthrough_graphite_telemetry_test': {
+      'webrtc_metal_passthrough_graphite_tests': {
+        'test_common': {
+          'mixins': [
+            'has_native_resultdb_integration',
+            'gpu_force_command_decoder_passthrough',
+            'gpu_force_angle_metal',
+            'gpu_force_skia_graphite',
+            'gpu_integration_test_common_args',
+          ],
+        },
+        'telemetry_test_name': 'webrtc',
+      },
+    },
+
+    'gpu_webrtc_telemetry_test': {
+      'webrtc_tests': {
+        'test_common': {
+          'mixins': [
+            'has_native_resultdb_integration',
+            'gpu_integration_test_common_args',
+          ],
+        },
+        'telemetry_test_name': 'webrtc',
+      },
+    },
+
     'linux_chromeos_lacros_gtests': {
       'chromeos_unittests': {},
     },
@@ -2225,6 +2282,9 @@
       'gpu_webgl_conformance_metal_passthrough_ganesh_telemetry_tests',
       'gpu_webgl_conformance_metal_passthrough_graphite_telemetry_tests',
       'gpu_webgl_conformance_swangle_passthrough_representative_telemetry_tests',
+      'gpu_webrtc_gl_passthrough_ganesh_telemetry_test',
+      'gpu_webrtc_metal_passthrough_ganesh_telemetry_test',
+      'gpu_webrtc_metal_passthrough_graphite_telemetry_test',
     ],
 
     'gpu_fyi_win_release_telemetry_tests': [
@@ -2236,6 +2296,7 @@
       'gpu_webgl_conformance_d3d11_passthrough_telemetry_tests',
       'gpu_webgl_conformance_d3d9_passthrough_telemetry_tests',
       'gpu_webgl_conformance_vulkan_passthrough_telemetry_tests',
+      'gpu_webrtc_telemetry_test',
     ],
 
     'gpu_telemetry_tests_v8': [
diff --git a/infra/config/targets/basic_suites.star b/infra/config/targets/basic_suites.star
index ac7bac8..3ed814d 100644
--- a/infra/config/targets/basic_suites.star
+++ b/infra/config/targets/basic_suites.star
@@ -860,6 +860,34 @@
 )
 
 targets.legacy_basic_suite(
+    name = "gpu_webrtc_telemetry_test",
+    tests = {
+        "webrtc_tests": targets.legacy_test_config(),
+    },
+)
+
+targets.legacy_basic_suite(
+    name = "gpu_webrtc_gl_passthrough_ganesh_telemetry_test",
+    tests = {
+        "webrtc_gl_passthrough_ganesh_tests": targets.legacy_test_config(),
+    },
+)
+
+targets.legacy_basic_suite(
+    name = "gpu_webrtc_metal_passthrough_ganesh_telemetry_test",
+    tests = {
+        "webrtc_metal_passthrough_ganesh_tests": targets.legacy_test_config(),
+    },
+)
+
+targets.legacy_basic_suite(
+    name = "gpu_webrtc_metal_passthrough_graphite_telemetry_test",
+    tests = {
+        "webrtc_metal_passthrough_graphite_tests": targets.legacy_test_config(),
+    },
+)
+
+targets.legacy_basic_suite(
     name = "gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests",
     tests = {
         "webgl2_conformance_d3d11_passthrough_tests": targets.legacy_test_config(
diff --git a/infra/config/targets/bundles.star b/infra/config/targets/bundles.star
index 0c5a62c1..9494b13 100644
--- a/infra/config/targets/bundles.star
+++ b/infra/config/targets/bundles.star
@@ -4210,6 +4210,7 @@
     targets = [
         "gpu_common_and_optional_telemetry_tests",
         "gpu_passthrough_telemetry_tests",
+        "gpu_webrtc_telemetry_test",
         "gpu_webcodecs_telemetry_test",
         "gpu_webgl2_conformance_gles_passthrough_telemetry_tests",
         "gpu_webgl_conformance_gles_passthrough_telemetry_tests",
@@ -4238,6 +4239,12 @@
             ],
         ),
         targets.bundle(
+            targets = "gpu_webrtc_telemetry_test",
+            variants = [
+                "CROS_VOLTEER_PUBLIC_RELEASE_ASH_LKGM",
+            ],
+        ),
+        targets.bundle(
             targets = "gpu_webgl2_conformance_gles_passthrough_telemetry_tests",
             variants = [
                 "CROS_VOLTEER_PUBLIC_RELEASE_ASH_LKGM",
@@ -4268,6 +4275,7 @@
     targets = [
         "gpu_common_and_optional_telemetry_tests",
         "gpu_passthrough_telemetry_tests",
+        "gpu_webrtc_telemetry_test",
         "gpu_webcodecs_telemetry_test",
         "gpu_webgl2_conformance_gles_passthrough_telemetry_tests",
         "gpu_webgl_conformance_gles_passthrough_telemetry_tests",
@@ -4326,6 +4334,7 @@
     targets = [
         "gpu_common_and_optional_telemetry_tests",
         "gpu_gl_passthrough_ganesh_telemetry_tests",
+        "gpu_webrtc_gl_passthrough_ganesh_telemetry_test",
         "gpu_webcodecs_gl_passthrough_ganesh_telemetry_test",
         "gpu_webgl2_conformance_gl_passthrough_ganesh_telemetry_tests",
         "gpu_webgl_conformance_gl_passthrough_ganesh_telemetry_tests",
@@ -4359,8 +4368,11 @@
     targets = [
         "gpu_gl_passthrough_ganesh_telemetry_tests",
         "gpu_metal_passthrough_ganesh_telemetry_tests",
+        "gpu_webrtc_gl_passthrough_ganesh_telemetry_test",
         "gpu_webcodecs_gl_passthrough_ganesh_telemetry_test",
+        "gpu_webrtc_metal_passthrough_ganesh_telemetry_test",
         "gpu_webcodecs_metal_passthrough_ganesh_telemetry_test",
+        "gpu_webrtc_metal_passthrough_graphite_telemetry_test",
         "gpu_webcodecs_metal_passthrough_graphite_telemetry_test",
         "gpu_webgl2_conformance_gl_passthrough_ganesh_telemetry_tests",
         "gpu_webgl2_conformance_metal_passthrough_graphite_telemetry_tests",
@@ -4419,6 +4431,7 @@
         "gpu_common_and_optional_telemetry_tests",
         "gpu_passthrough_telemetry_tests",
         "gpu_webcodecs_telemetry_test",
+        "gpu_webrtc_telemetry_test",
         "gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests",
         "gpu_webgl_conformance_d3d11_passthrough_telemetry_tests",
         "gpu_webgl_conformance_d3d9_passthrough_telemetry_tests",
@@ -4455,6 +4468,7 @@
         "gpu_common_and_optional_telemetry_tests",
         "gpu_passthrough_telemetry_tests",
         "gpu_webcodecs_telemetry_test",
+        "gpu_webrtc_telemetry_test",
         "gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests",
         "gpu_webgl_conformance_d3d11_passthrough_telemetry_tests",
         "gpu_webgl_conformance_d3d9_passthrough_telemetry_tests",
@@ -4519,6 +4533,7 @@
     targets = [
         "gpu_common_and_optional_telemetry_tests",
         "gpu_validating_telemetry_tests",
+        "gpu_webrtc_validating_ganesh_telemetry_test",
         "gpu_webcodecs_validating_ganesh_telemetry_test",
         "gpu_webgl_conformance_gles_passthrough_ganesh_telemetry_tests",
         "gpu_webgl_conformance_validating_ganesh_telemetry_tests",
@@ -4552,6 +4567,7 @@
         "gpu_common_and_optional_telemetry_tests",
         "gpu_passthrough_ganesh_telemetry_tests",
         "gpu_validating_telemetry_tests",
+        "gpu_webrtc_validating_ganesh_telemetry_test",
         "gpu_webcodecs_validating_ganesh_telemetry_test",
         "gpu_webgl2_conformance_gles_passthrough_telemetry_tests",
         "gpu_webgl2_conformance_validating_telemetry_tests",
@@ -4567,7 +4583,9 @@
         "gpu_passthrough_ganesh_telemetry_tests",
         "gpu_passthrough_graphite_telemetry_tests",
         "gpu_validating_telemetry_tests",
+        "gpu_webrtc_validating_ganesh_telemetry_test",
         "gpu_webcodecs_validating_ganesh_telemetry_test",
+        "gpu_webrtc_validating_graphite_telemetry_test",
         "gpu_webcodecs_validating_graphite_telemetry_test",
         "gpu_webgl2_conformance_gles_passthrough_telemetry_tests",
         "gpu_webgl2_conformance_validating_telemetry_tests",
@@ -4756,6 +4774,29 @@
 )
 
 targets.bundle(
+    name = "gpu_webrtc_validating_ganesh_telemetry_test",
+    targets = [
+        "webrtc_tests",
+    ],
+    per_test_modifications = {
+        "webrtc_tests": [
+            targets.mixin(
+                args = [
+                    "--extra-browser-args=--use-cmd-decoder=validating --disable-features=SkiaGraphite",
+                ],
+            ),
+        ],
+    },
+)
+
+targets.bundle(
+    name = "gpu_webrtc_validating_graphite_telemetry_test",
+    targets = [
+        "webrtc_graphite_tests",
+    ],
+)
+
+targets.bundle(
     name = "gpu_win_gtests",
     targets = [
         "gpu_angle_unit_gtests",
@@ -5849,6 +5890,13 @@
             ],
         ),
         targets.bundle(
+            targets = "gpu_webrtc_telemetry_test",
+            variants = [
+                "LINUX_INTEL_UHD_630_STABLE",
+                "LINUX_NVIDIA_GTX_1660_STABLE",
+            ],
+        ),
+        targets.bundle(
             targets = "gpu_webgl2_conformance_gl_passthrough_telemetry_tests",
             variants = [
                 "LINUX_INTEL_UHD_630_STABLE",
@@ -5939,6 +5987,14 @@
             ],
         ),
         targets.bundle(
+            targets = "gpu_webrtc_gl_passthrough_ganesh_telemetry_test",
+            variants = [
+                "MAC_MINI_INTEL_GPU_STABLE",
+                "MAC_RETINA_AMD_GPU_STABLE",
+                "MAC_RETINA_NVIDIA_GPU_STABLE",
+            ],
+        ),
+        targets.bundle(
             targets = "gpu_webcodecs_metal_passthrough_ganesh_telemetry_test",
             variants = [
                 "MAC_MINI_INTEL_GPU_STABLE",
@@ -5946,6 +6002,13 @@
             ],
         ),
         targets.bundle(
+            targets = "gpu_webrtc_metal_passthrough_ganesh_telemetry_test",
+            variants = [
+                "MAC_MINI_INTEL_GPU_STABLE",
+                "MAC_RETINA_AMD_GPU_STABLE",
+            ],
+        ),
+        targets.bundle(
             targets = "gpu_webcodecs_metal_passthrough_graphite_telemetry_test",
             variants = [
                 "MAC_MINI_INTEL_GPU_STABLE",
@@ -5953,6 +6016,13 @@
             ],
         ),
         targets.bundle(
+            targets = "gpu_webrtc_metal_passthrough_graphite_telemetry_test",
+            variants = [
+                "MAC_MINI_INTEL_GPU_STABLE",
+                "MAC_RETINA_AMD_GPU_STABLE",
+            ],
+        ),
+        targets.bundle(
             targets = "gpu_webgl2_conformance_metal_passthrough_graphite_telemetry_tests",
             variants = [
                 "MAC_MINI_INTEL_GPU_STABLE",
@@ -7161,6 +7231,13 @@
             ],
         ),
         targets.bundle(
+            targets = "gpu_webrtc_telemetry_test",
+            variants = [
+                "WIN10_INTEL_UHD_630_STABLE",
+                "WIN10_NVIDIA_GTX_1660_STABLE",
+            ],
+        ),
+        targets.bundle(
             targets = "gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests",
             variants = [
                 "WIN10_INTEL_UHD_630_STABLE",
diff --git a/infra/config/targets/compound_suites.star b/infra/config/targets/compound_suites.star
index d0b6080..ed924397 100644
--- a/infra/config/targets/compound_suites.star
+++ b/infra/config/targets/compound_suites.star
@@ -64,6 +64,9 @@
         "gpu_webcodecs_gl_passthrough_ganesh_telemetry_test",
         "gpu_webcodecs_metal_passthrough_ganesh_telemetry_test",
         "gpu_webcodecs_metal_passthrough_graphite_telemetry_test",
+        "gpu_webrtc_gl_passthrough_ganesh_telemetry_test",
+        "gpu_webrtc_metal_passthrough_ganesh_telemetry_test",
+        "gpu_webrtc_metal_passthrough_graphite_telemetry_test",
         "gpu_webgl2_conformance_gl_passthrough_ganesh_telemetry_tests",
         "gpu_webgl2_conformance_metal_passthrough_graphite_telemetry_tests",
         "gpu_webgl_conformance_gl_passthrough_ganesh_telemetry_tests",
@@ -80,6 +83,7 @@
         "gpu_passthrough_graphite_telemetry_tests",
         "gpu_passthrough_telemetry_tests",
         "gpu_webcodecs_telemetry_test",
+        "gpu_webrtc_telemetry_test",
         "gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests",
         "gpu_webgl_conformance_d3d11_passthrough_telemetry_tests",
         "gpu_webgl_conformance_d3d9_passthrough_telemetry_tests",
diff --git a/infra/config/targets/tests.star b/infra/config/targets/tests.star
index 8793c1c..e0fec9f 100644
--- a/infra/config/targets/tests.star
+++ b/infra/config/targets/tests.star
@@ -2756,6 +2756,62 @@
     ],
 )
 
+targets.tests.gpu_telemetry_test(
+    name = "webrtc_gl_passthrough_ganesh_tests",
+    telemetry_test_name = "webrtc",
+    mixins = [
+        "has_native_resultdb_integration",
+        "gpu_force_command_decoder_passthrough",
+        "gpu_force_angle_gl",
+        "gpu_force_skia_ganesh",
+        "gpu_integration_test_common_args",
+    ],
+)
+
+targets.tests.gpu_telemetry_test(
+    name = "webrtc_metal_passthrough_ganesh_tests",
+    telemetry_test_name = "webrtc",
+    mixins = [
+        "has_native_resultdb_integration",
+        "gpu_force_command_decoder_passthrough",
+        "gpu_force_angle_metal",
+        "gpu_force_skia_ganesh",
+        "gpu_integration_test_common_args",
+    ],
+)
+
+targets.tests.gpu_telemetry_test(
+    name = "webrtc_metal_passthrough_graphite_tests",
+    telemetry_test_name = "webrtc",
+    mixins = [
+        "has_native_resultdb_integration",
+        "gpu_force_command_decoder_passthrough",
+        "gpu_force_angle_metal",
+        "gpu_force_skia_graphite",
+        "gpu_integration_test_common_args",
+    ],
+)
+
+targets.tests.gpu_telemetry_test(
+    name = "webrtc_graphite_tests",
+    telemetry_test_name = "webrtc",
+    mixins = [
+        "has_native_resultdb_integration",
+        "gpu_force_command_decoder_validating",
+        "gpu_force_skia_graphite",
+        "gpu_integration_test_common_args",
+    ],
+)
+
+targets.tests.gpu_telemetry_test(
+    name = "webrtc_tests",
+    telemetry_test_name = "webrtc",
+    mixins = [
+        "has_native_resultdb_integration",
+        "gpu_integration_test_common_args",
+    ],
+)
+
 targets.tests.isolated_script_test(
     name = "webdriver_wpt_tests",
     mixins = [
diff --git a/internal b/internal
index 2514606..70336560 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 2514606e5e8e4ce2af8ebbddaeff318b9a987568
+Subproject commit 7033656091f15c89917d3fd040c03dd346684c3b
diff --git a/ios/build/chrome_build.gni b/ios/build/chrome_build.gni
index c89ef51..bfcbf2b3 100644
--- a/ios/build/chrome_build.gni
+++ b/ios/build/chrome_build.gni
@@ -76,9 +76,6 @@
   # Enable background fetch mode for app refresh.
   ios_enable_background_mode = true
 
-  # Enable iOS 17 widgets improvements to support multi profile.
-  ios_enable_widgets_for_mim = false
-
   # Value of the encryption export compliance code. See "Cryptography and
   # U.S. Export Compliance" in "Submitting the App to App Review" in the
   # Apple developer documentation
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.mm b/ios/chrome/app/application_delegate/metrics_mediator.mm
index a894e174..8780ff0 100644
--- a/ios/chrome/app/application_delegate/metrics_mediator.mm
+++ b/ios/chrome/app/application_delegate/metrics_mediator.mm
@@ -549,7 +549,6 @@
 
 #if BUILDFLAG(ENABLE_WIDGET_KIT_EXTENSION)
   [WidgetMetricsUtil logInstalledWidgets];
-
 #endif
 
   // Create the first user action recorder and schedule a task to expire it
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
index d405c3e..2c47ca78 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
@@ -869,7 +869,8 @@
   [self continueFlow];
 }
 
-- (void)didAcceptManagedConfirmation:(BOOL)keepBrowsingDataSeparate {
+- (void)didAcceptManagedConfirmationWithBrowsingDataSeparate:
+    (BOOL)browsingDataSeparate {
   if (IsIdentityDiscAccountMenuEnabled()) {
     // Only show the dialog once per account.
     signin::GaiaIdHash gaiaIDHash =
@@ -881,7 +882,7 @@
 
   _shouldConvertPersonalProfileToManaged =
       AreSeparateProfilesForManagedAccountsEnabled() &&
-      (!keepBrowsingDataSeparate ||
+      (!browsingDataSeparate ||
        _accessPoint == signin_metrics::AccessPoint::kStartPage);
 
   // When we show the managed profile screen, the profile is a new one, ensure
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_in_profile.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_in_profile.mm
index 09ce69209..ea2c294 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_in_profile.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_in_profile.mm
@@ -468,7 +468,8 @@
   NOTREACHED();
 }
 
-- (void)didAcceptManagedConfirmation:(BOOL)keepBrowsingDataSeparate {
+- (void)didAcceptManagedConfirmationWithBrowsingDataSeparate:
+    (BOOL)browsingDataSeparate {
   NOTREACHED();
 }
 
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
index 1267420..9e314ca4 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
@@ -845,21 +845,21 @@
   _managedConfirmationAlertCoordinator = nil;
   [self managedConfirmationDidAccept:accepted
                              browser:browser
-            keepBrowsingDataSeparate:
-                AreSeparateProfilesForManagedAccountsEnabled()];
+                browsingDataSeparate:
+                    AreSeparateProfilesForManagedAccountsEnabled()];
 }
 
 // Called when the user accepted to continue to sign-in with a managed account.
 // `accepted` is YES when the user confirmed or NO if the user canceled.
-// If `keepBrowsingDataSeparate` is `YES`, the managed account gets signed in to
+// If `browsingDataSeparate` is `YES`, the managed account gets signed in to
 // a new empty work profile. This must only be specified if
 // AreSeparateProfilesForManagedAccountsEnabled() is true.
-// If `keepBrowsingDataSeparate` is `NO`, the account gets signed in to the
+// If `browsingDataSeparate` is `NO`, the account gets signed in to the
 // current profile. If AreSeparateProfilesForManagedAccountsEnabled() is true,
 // this involves converting the current profile into a work profile.
 - (void)managedConfirmationDidAccept:(BOOL)accepted
                              browser:(Browser*)browser
-            keepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate {
+                browsingDataSeparate:(BOOL)browsingDataSeparate {
   if (!accepted) {
     base::RecordAction(
         base::UserMetricsAction("Signin_AuthenticationFlowPerformer_"
@@ -868,7 +868,7 @@
     return;
   }
   CHECK(AreSeparateProfilesForManagedAccountsEnabled() ||
-        !keepBrowsingDataSeparate);
+        !browsingDataSeparate);
   base::RecordAction(
       base::UserMetricsAction("Signin_AuthenticationFlowPerformer_"
                               "ManagedConfirmationDialog_Confirmed"));
@@ -883,7 +883,8 @@
     // notification isn't needed anymore.
     [self updateUserPolicyNotificationStatusIfNeeded:prefService];
   }
-  [self.delegate didAcceptManagedConfirmation:keepBrowsingDataSeparate];
+  [self.delegate didAcceptManagedConfirmationWithBrowsingDataSeparate:
+                     browsingDataSeparate];
 }
 
 #pragma mark - ManagedProfileCreationCoordinatorDelegate
@@ -891,7 +892,7 @@
 - (void)managedProfileCreationCoordinator:
             (ManagedProfileCreationCoordinator*)coordinator
                                 didAccept:(BOOL)accepted
-                 keepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate {
+                     browsingDataSeparate:(BOOL)browsingDataSeparate {
   CHECK(!_managedConfirmationAlertCoordinator, base::NotFatalUntil::M136);
   CHECK(!_errorAlertCoordinator, base::NotFatalUntil::M136);
   CHECK_EQ(_managedConfirmationScreenCoordinator, coordinator);
@@ -900,7 +901,7 @@
   _managedConfirmationScreenCoordinator = nil;
   [self managedConfirmationDidAccept:accepted
                              browser:browser
-            keepBrowsingDataSeparate:keepBrowsingDataSeparate];
+                browsingDataSeparate:browsingDataSeparate];
 }
 
 @end
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_delegate.h b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_delegate.h
index 0fd8626..075900c 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_delegate.h
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_delegate.h
@@ -48,7 +48,14 @@
         profileSeparationDataMigrationSettings;
 
 // Indicates that the user accepted signing in to a managed account.
-- (void)didAcceptManagedConfirmation:(BOOL)keepBrowsingDataSeparate;
+// If `browsingDataSeparate` is `YES`, the managed account gets signed in to
+// a new empty work profile. This must only be specified if
+// AreSeparateProfilesForManagedAccountsEnabled() is true.
+// If `browsingDataSeparate` is `NO`, the account gets signed in to the
+// current profile. If AreSeparateProfilesForManagedAccountsEnabled() is true,
+// this involves converting the current profile into a work profile.
+- (void)didAcceptManagedConfirmationWithBrowsingDataSeparate:
+    (BOOL)browsingDataSeparate;
 
 // Indicates that the user cancelled signing in to a managed account.
 - (void)didCancelManagedConfirmation;
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm
index 9e8c632..7ef89b4 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_unittest.mm
@@ -319,7 +319,8 @@
       BOOL migrationDisabled = AreSeparateProfilesForManagedAccountsEnabled();
       auto showManagedConfirmationForHostedDomainCallback = ^(NSInvocation*) {
         managed_confirmation_dialog_shown_count_++;
-        [authentication_flow_ didAcceptManagedConfirmation:YES];
+        [authentication_flow_
+            didAcceptManagedConfirmationWithBrowsingDataSeparate:YES];
       };
       OCMStub([performer_mock_
                   showManagedConfirmationForHostedDomain:hosted_domain
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.h b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.h
index 13562d9..c9e2310 100644
--- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.h
+++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.h
@@ -11,7 +11,7 @@
 
 @protocol BrowsingDataMigrationViewControllerMutator
 
-- (void)updateShouldKeepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate;
+- (void)updateShouldKeepBrowsingDataSeparate:(BOOL)browsingDataSeparate;
 
 @end
 
@@ -21,10 +21,10 @@
 @property(nonatomic, weak) id<BrowsingDataMigrationViewControllerMutator>
     mutator;
 
-// `keepBrowsingDataSeparate` is the default value initially shown to the user
+// `browsingDataSeparate` is the default value initially shown to the user
 // as the selected value.
 - (instancetype)initWithUserEmail:(NSString*)userEmail
-         keepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate
+             browsingDataSeparate:(BOOL)browsingDataSeparate
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.mm b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.mm
index a281a68..4673d4ac 100644
--- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/browsing_data_migration_view_controller.mm
@@ -42,16 +42,16 @@
 @end
 
 @implementation BrowsingDataMigrationViewController {
-  BOOL _keepBrowsingDataSeparate;
+  BOOL _browsingDataSeparate;
   NSString* _userEmail;
   UITableViewDiffableDataSource<NSNumber*, NSNumber*>* _dataSource;
 }
 
 - (instancetype)initWithUserEmail:(NSString*)userEmail
-         keepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate {
+             browsingDataSeparate:(BOOL)browsingDataSeparate {
   self = [super initWithStyle:ChromeTableViewStyle()];
   if (self) {
-    _keepBrowsingDataSeparate = keepBrowsingDataSeparate;
+    _browsingDataSeparate = browsingDataSeparate;
     _userEmail = userEmail;
   }
   return self;
@@ -80,7 +80,7 @@
   [self.tableView
       selectRowAtIndexPath:
           [_dataSource indexPathForItemIdentifier:
-                           _keepBrowsingDataSeparate
+                           _browsingDataSeparate
                                ? @(ItemIdentifierKeepBrowsingDataSeparate)
                                : @(ItemIdentifierMergeBrowsingData)]
                   animated:YES
@@ -93,9 +93,9 @@
     willSelectRowAtIndexPath:(NSIndexPath*)indexPath {
   auto selectedItemIdentifier =
       [_dataSource itemIdentifierForIndexPath:indexPath];
-  _keepBrowsingDataSeparate = [selectedItemIdentifier
+  _browsingDataSeparate = [selectedItemIdentifier
       isEqual:@(ItemIdentifierKeepBrowsingDataSeparate)];
-  [self.mutator updateShouldKeepBrowsingDataSeparate:_keepBrowsingDataSeparate];
+  [self.mutator updateShouldKeepBrowsingDataSeparate:_browsingDataSeparate];
   [self updateSelection];
   return indexPath;
 }
@@ -190,7 +190,7 @@
       return [self
           createBrowsingDataMigrationCellItem:title
                                       details:details
-                                     selected:_keepBrowsingDataSeparate
+                                     selected:_browsingDataSeparate
                       accessibilityIdentifier:kKeepBrowsingDataSeparateCellId];
     }
     case ItemIdentifierMergeBrowsingData: {
@@ -202,7 +202,7 @@
       return
           [self createBrowsingDataMigrationCellItem:title
                                             details:details
-                                           selected:!_keepBrowsingDataSeparate
+                                           selected:!_browsingDataSeparate
                             accessibilityIdentifier:kMergeBrowsingDataCellId];
     }
   }
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.h b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.h
index 788e3a3..e80c3c6 100644
--- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.h
+++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.h
@@ -15,10 +15,18 @@
 
 @protocol ManagedProfileCreationCoordinatorDelegate <NSObject>
 
+// Called when the user accepted to continue to sign-in with a managed account.
+// `accepted` is YES when the user confirmed or NO if the user canceled.
+// If `browsingDataSeparate` is `YES`, the managed account gets signed in to
+// a new empty work profile. This must only be specified if
+// AreSeparateProfilesForManagedAccountsEnabled() is true.
+// If `browsingDataSeparate` is `NO`, the account gets signed in to the
+// current profile. If AreSeparateProfilesForManagedAccountsEnabled() is true,
+// this involves converting the current profile into a work profile.
 - (void)managedProfileCreationCoordinator:
             (ManagedProfileCreationCoordinator*)coordinator
                                 didAccept:(BOOL)didAccept
-                 keepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate;
+                     browsingDataSeparate:(BOOL)browsingDataSeparate;
 
 @end
 
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.mm
index f8cd217..2b701b6 100644
--- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.mm
@@ -116,18 +116,18 @@
 - (void)didTapPrimaryActionButton {
   // `dismissViewControllerAnimated` will release the mediator, so grab this
   // value first.
-  BOOL keepBrowsingDataSeparate = _mediator.keepBrowsingDataSeparate;
+  BOOL browsingDataSeparate = _mediator.browsingDataSeparate;
   [self dismissViewControllerAnimated:YES];
   [self.delegate managedProfileCreationCoordinator:self
                                          didAccept:YES
-                          keepBrowsingDataSeparate:keepBrowsingDataSeparate];
+                              browsingDataSeparate:browsingDataSeparate];
 }
 
 - (void)didTapSecondaryActionButton {
   [self dismissViewControllerAnimated:YES];
   [self.delegate managedProfileCreationCoordinator:self
                                          didAccept:NO
-                          keepBrowsingDataSeparate:NO];
+                              browsingDataSeparate:NO];
 }
 
 - (void)didTapURLInDisclaimer:(NSURL*)URL {
@@ -145,8 +145,8 @@
   CHECK(!_browsingDataMigrationViewController);
   _browsingDataMigrationViewController =
       [[BrowsingDataMigrationViewController alloc]
-                 initWithUserEmail:_identity.userEmail
-          keepBrowsingDataSeparate:_mediator.keepBrowsingDataSeparate];
+             initWithUserEmail:_identity.userEmail
+          browsingDataSeparate:_mediator.browsingDataSeparate];
   _browsingDataMigrationViewController.mutator = _mediator;
   [_navigationController pushViewController:_browsingDataMigrationViewController
                                    animated:YES];
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.h b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.h
index 1193048..ab00953c6 100644
--- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.h
+++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.h
@@ -36,7 +36,12 @@
 
 @property(nonatomic, weak) id<ManagedProfileCreationMediatorDelegate> delegate;
 
-@property(nonatomic, assign) BOOL keepBrowsingDataSeparate;
+// If `browsingDataSeparate` is `YES`, the managed account gets signed in to
+// a new empty work profile.
+// If `browsingDataSeparate` is `NO`, the account gets signed in to the
+// current profile. This involves converting the current profile into a work
+// profile.
+@property(nonatomic, assign) BOOL browsingDataSeparate;
 
 - (instancetype)initWithIdentityManager:
                     (signin::IdentityManager*)identityManager
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm
index ffea3ae..88c94f1 100644
--- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm
@@ -56,7 +56,7 @@
         !skipBrowsingDataMigration &&
         AreSeparateProfilesForManagedAccountsEnabled() &&
         !identityManager->HasPrimaryAccount(signin::ConsentLevel::kSignin);
-    _keepBrowsingDataSeparate = !mergeBrowsingDataByDefault;
+    _browsingDataSeparate = !mergeBrowsingDataByDefault;
     _browsingDataMigrationDisabledByPolicy =
         browsingDataMigrationDisabledByPolicy;
   }
@@ -72,7 +72,7 @@
 }
 
 - (void)setKeepBrowsingDataSeparate:(BOOL)keepSeparate {
-  _keepBrowsingDataSeparate = keepSeparate;
+  _browsingDataSeparate = keepSeparate;
   [self.consumer setKeepBrowsingDataSeparate:keepSeparate];
 }
 
@@ -84,14 +84,14 @@
   _consumer.canShowBrowsingDataMigration = _canShowBrowsingDataMigration;
   _consumer.browsingDataMigrationDisabledByPolicy =
       _browsingDataMigrationDisabledByPolicy;
-  [_consumer setKeepBrowsingDataSeparate:self.keepBrowsingDataSeparate];
+  [_consumer setKeepBrowsingDataSeparate:self.browsingDataSeparate];
 }
 
 #pragma mark - BrowsingDataMigrationViewControllerDelegate
 
-- (void)updateShouldKeepBrowsingDataSeparate:(BOOL)keepBrowsingDataSeparate {
-  self.keepBrowsingDataSeparate = keepBrowsingDataSeparate;
-  [self.consumer setKeepBrowsingDataSeparate:self.keepBrowsingDataSeparate];
+- (void)updateShouldKeepBrowsingDataSeparate:(BOOL)browsingDataSeparate {
+  self.browsingDataSeparate = browsingDataSeparate;
+  [self.consumer setKeepBrowsingDataSeparate:self.browsingDataSeparate];
 }
 
 #pragma mark - IdentityManagerObserverBridgeDelegate
diff --git a/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm b/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
index fa2c1f1..f94a89f 100644
--- a/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
@@ -314,16 +314,7 @@
 // Tests that signing in from a signed out state with a managed account shows
 // the enterprise onboarding only the first time. And the user cannot merge
 // existing browsing data because it is disabled by policy.
-// TODO(crbug.com/411035267): Fix this flaky test on simulator.
-#if TARGET_OS_SIMULATOR
-#define MAYBE_testSigninWithManagedAccountFromUnsignedStateWithDataMigrationDisabled \
-  FLAKY_testSigninWithManagedAccountFromUnsignedStateWithDataMigrationDisabled
-#else
-#define MAYBE_testSigninWithManagedAccountFromUnsignedStateWithDataMigrationDisabled \
-  testSigninWithManagedAccountFromUnsignedStateWithDataMigrationDisabled
-#endif
-- (void)
-    MAYBE_testSigninWithManagedAccountFromUnsignedStateWithDataMigrationDisabled {
+- (void)testSigninWithManagedAccountFromUnsignedStateWithDataMigrationDisabled {
   // Separate profiles are only available in iOS 17+.
   if (!@available(iOS 17, *)) {
     return;
@@ -388,7 +379,7 @@
              @"Profile name should be unchanged");
 
   // Sign out - this should cause a switch back to the personal profile.
-  [SigninEarlGreyUI signOut];
+  SignoutFromAccountMenu();
   NSString* personalProfileName = [ChromeEarlGrey currentProfileName];
   GREYAssert([personalProfileName isEqualToString:originalProfileName],
              @"Profile name should be the personal one");
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
index c401c28f..8b17868 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
+++ b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
@@ -233,6 +233,10 @@
 
   // Used to add or cancel a page placeholder for next navigation.
   raw_ptr<PagePlaceholderBrowserAgent> _pagePlaceholderBrowserAgent;
+
+  // Whether the Lens Overlay is currently active and visible for the browser
+  // view.
+  BOOL _lensOverlayVisible;
 }
 
 // Activates/deactivates the object. This will enable/disable the ability for
@@ -1590,6 +1594,41 @@
   self.visibilityState = BrowserViewVisibilityState::kVisible;
 }
 
+// Animates hiding and showing the typing shield.
+- (void)animateTypingShieldHidden:(BOOL)hidden {
+  if (self.typingShield.hidden == hidden) {
+    return;
+  }
+
+  CGFloat finalAlpha = hidden ? 0.0 : 1.0;
+
+  if (!hidden) {
+    [self.typingShield setAlpha:0.0];
+    [self.typingShield setHidden:NO];
+  }
+
+  [UIView animateWithDuration:0.3
+      animations:^{
+        [self.typingShield setAlpha:finalAlpha];
+      }
+      completion:^(BOOL finished) {
+        if (!hidden) {
+          // Already revealed before the animation started.
+          return;
+        }
+
+        // This can happen if one quickly resigns the omnibox and then taps
+        // on the omnibox again during this animation. If the animation is
+        // interrupted and the toolbar controller is first responder, it's safe
+        // to assume `self.typingShield` shouldn't be hidden here.
+        if (!finished && [self.toolbarCoordinator isOmniboxFirstResponder]) {
+          return;
+        }
+
+        [self.typingShield setHidden:YES];
+      }];
+}
+
 #pragma mark - Private Methods: UI Configuration, update and Layout
 
 // Starts or stops broadcasting the toolbar UI and main content UI depending on
@@ -1900,6 +1939,17 @@
   self.visibilityState = BrowserViewVisibilityState::kCoveredByOmniboxPopup;
   self.toolbarCoordinator.secondaryToolbarViewController.view
       .accessibilityElementsHidden = YES;
+
+  if (_lensOverlayVisible) {
+    // The typing shield has to be inserted right below the presented popup
+    // omnibox to avoid being ostructed by the Lens Overlay.
+    self.typingShield.frame = UIEdgeInsetsInsetRect(
+        self.contentArea.bounds,
+        UIEdgeInsetsMake([self expandedTopToolbarHeight], 0, 0, 0));
+    [self.view insertSubview:self.typingShield
+                belowSubview:presenter.popupContainerView];
+    [self animateTypingShieldHidden:NO];
+  }
 }
 
 - (void)popupDidCloseForPresenter:(OmniboxPopupPresenter*)presenter {
@@ -2141,13 +2191,11 @@
       ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
     // Tapping on web content area should dismiss the keyboard. Tapping on NTP
     // gesture should propagate to NTP view.
-    [self.view insertSubview:self.typingShield aboveSubview:self.contentArea];
-    [self.typingShield setAlpha:0.0];
-    [self.typingShield setHidden:NO];
-    [UIView animateWithDuration:0.3
-                     animations:^{
-                       [self.typingShield setAlpha:1.0];
-                     }];
+
+    if (self.typingShield.hidden) {
+      [self.view insertSubview:self.typingShield aboveSubview:self.contentArea];
+      [self animateTypingShieldHidden:NO];
+    }
   }
 
   [self.toolbarCoordinator transitionToLocationBarFocusedState:YES
@@ -2159,20 +2207,7 @@
 
   [self.ntpCoordinator locationBarWillResignFirstResponder];
 
-  [UIView animateWithDuration:0.3
-      animations:^{
-        [self.typingShield setAlpha:0.0];
-      }
-      completion:^(BOOL finished) {
-        // This can happen if one quickly resigns the omnibox and then taps
-        // on the omnibox again during this animation. If the animation is
-        // interrupted and the toolbar controller is first responder, it's safe
-        // to assume `self.typingShield` shouldn't be hidden here.
-        if (!finished && [self.toolbarCoordinator isOmniboxFirstResponder]) {
-          return;
-        }
-        [self.typingShield setHidden:YES];
-      }];
+  [self animateTypingShieldHidden:YES];
 
   ProceduralBlock completion = ^{
     // Show the NTP's fake toolbar after the defocus animation completes.
@@ -2735,10 +2770,12 @@
 
 - (void)lensOverlayWillAppear {
   [_sideSwipeCoordinator setEnabled:NO];
+  _lensOverlayVisible = YES;
 }
 
 - (void)lensOverlayWillDisappear {
   [_sideSwipeCoordinator setEnabled:YES];
+  _lensOverlayVisible = NO;
 }
 
 - (NSDirectionalEdgeInsets)presentationInsetsForLensOverlay {
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn
index 68b4fb5..f5410c3 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn
@@ -97,6 +97,7 @@
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/model/prefs",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
+    "//ios/chrome/browser/shared/model/profile:features",
     "//ios/chrome/browser/shared/model/utils",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_tile_saver.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_tile_saver.mm
index bc6fab5..801ba795 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_tile_saver.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_tile_saver.mm
@@ -16,6 +16,7 @@
 #import "components/signin/public/base/signin_pref_names.h"
 #import "ios/chrome/browser/favicon/ui_bundled/favicon_attributes_provider.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
+#import "ios/chrome/browser/shared/model/profile/features.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h"
 #import "ios/chrome/browser/signin/model/system_identity.h"
 #import "ios/chrome/browser/widget_kit/model/features.h"
@@ -142,26 +143,26 @@
                         NSURL* favicons_directory) {
   NSMutableSet<NSString*>* allowed_files_name = [[NSMutableSet alloc] init];
 
-#if BUILDFLAG(ENABLE_WIDGET_KIT_EXTENSION)
-  // Add in `allowed_files_name` information about all profiles.
-  NSUserDefaults* shared_defaults = app_group::GetGroupUserDefaults();
-  NSDictionary* suggested_items =
-      [shared_defaults objectForKey:app_group::kSuggestedItemsForMultiprofile];
-  NSArray<NSData*>* all_data = [suggested_items allValues];
-  for (NSData* data_for_account in all_data) {
-    NSArray<NTPTile*>* tiles = [DecodeData(data_for_account) allValues];
-    // Add urls to the set of allowed_files_name.
-    for (NTPTile* tile in tiles) {
-      [allowed_files_name addObject:tile.faviconFileName];
+  if (IsWidgetsForMultiprofileEnabled()) {
+    // Add in `allowed_files_name` information about all profiles.
+    NSUserDefaults* shared_defaults = app_group::GetGroupUserDefaults();
+    NSDictionary* suggested_items = [shared_defaults
+        objectForKey:app_group::kSuggestedItemsForMultiprofile];
+    NSArray<NSData*>* all_data = [suggested_items allValues];
+    for (NSData* data_for_account in all_data) {
+      NSArray<NTPTile*>* tiles = [DecodeData(data_for_account) allValues];
+      // Add urls to the set of allowed_files_name.
+      for (NTPTile* tile in tiles) {
+        [allowed_files_name addObject:tile.faviconFileName];
+      }
+    }
+  } else {
+    for (size_t i = 0; i < most_visited_data.size(); i++) {
+      const ntp_tiles::NTPTile& ntp_tile = most_visited_data[i];
+      NSString* favicon_file_name = GetFaviconFileName(ntp_tile.url);
+      [allowed_files_name addObject:favicon_file_name];
     }
   }
-#else
-  for (size_t i = 0; i < most_visited_data.size(); i++) {
-    const ntp_tiles::NTPTile& ntp_tile = most_visited_data[i];
-    NSString* favicon_file_name = GetFaviconFileName(ntp_tile.url);
-    [allowed_files_name addObject:favicon_file_name];
-  }
-#endif
 
   [[NSFileManager defaultManager] createDirectoryAtURL:favicons_directory
                            withIntermediateDirectories:YES
@@ -234,8 +235,8 @@
 
   NSUserDefaults* sharedDefaults = app_group::GetGroupUserDefaults();
 
-  // TODO(crbug.com/387971524): To be removed once ios_enable_widgets_for_mim is
-  // enabled by default.
+  // TODO(crbug.com/387971524): To be removed once
+  // IsWidgetsForMultiprofileEnabled() is enabled by default.
   [sharedDefaults setObject:data forKey:app_group::kSuggestedItems];
   [sharedDefaults setObject:last_modification_date
                      forKey:app_group::kSuggestedItemsLastModificationDate];
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 8c015e1a..992a41ff 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -2672,6 +2672,9 @@
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(password_manager::features::
                             kIOSEnablePasswordManagerTrustedVaultWidget)},
+    {"colorful-tab-group", flag_descriptions::kColorfulTabGroupName,
+     flag_descriptions::kColorfulTabGroupDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(kColorfulTabGroup)},
 
 };
 
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index e67c4e0..65d544bb 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -252,6 +252,10 @@
     "including features such as recent activity, dirty dots, and description "
     "action chips.";
 
+const char kColorfulTabGroupName[] = "Colorful tab groups";
+const char kColorfulTabGroupDescription[] =
+    "Display the tab group colors in additional surfaces.";
+
 const char kContainedTabGroupName[] = "Contained tab group";
 const char kContainedTabGroupDescription[] =
     "When enabled the tab group in the tab grid is not presented fullscreen.";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index a51d96ad..a29c0f97 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -141,6 +141,9 @@
 extern const char kCollaborationMessagingName[];
 extern const char kCollaborationMessagingDescription[];
 
+extern const char kColorfulTabGroupName[];
+extern const char kColorfulTabGroupDescription[];
+
 extern const char kContainedTabGroupName[];
 extern const char kContainedTabGroupDescription[];
 
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_presenter.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_presenter.mm
index 19c69dd..08c78da 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_presenter.mm
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_presenter.mm
@@ -158,17 +158,9 @@
 }
 
 - (void)fadeSelectionUIWithCompletion:(void (^)())completion {
-  __weak UIViewController* weakSelectionUI =
-      _containerViewController.selectionViewController;
-  [UIView animateWithDuration:kSelectionViewAnimationDuration
-      animations:^{
-        weakSelectionUI.view.alpha = 0;
-      }
-      completion:^(BOOL success) {
-        if (completion) {
-          completion();
-        }
-      }];
+  [_containerViewController
+      fadeSelectionUIWithDuration:kSelectionViewAnimationDuration
+                       completion:completion];
 }
 
 #pragma mark - LensOverlayContainerDelegate
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.h b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.h
index 186cb6b..05fcc800 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.h
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.h
@@ -41,6 +41,10 @@
 @property(nonatomic, readonly, getter=isSidePanelPresented)
     BOOL sidePanelPresented;
 
+// Animates fading the selection UI of the container.
+- (void)fadeSelectionUIWithDuration:(NSTimeInterval)duration
+                         completion:(void (^)())completion;
+
 /// Presents the given view controller in a side panel, optionally animated.
 - (void)presentViewControllerInSidePanel:(UIViewController*)viewController
                                 animated:(BOOL)animated
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
index e5d86d6f..1e981750 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
@@ -14,7 +14,7 @@
 namespace {
 
 // The width of the side panel.
-const CGFloat kSidePanelWidth = 400.0;
+const CGFloat kSidePanelWidth = 375.0;
 
 // The ammount padding from the side panel to the selection UI.
 const CGFloat kSidePannelSelectionPadding = 20.0;
@@ -26,17 +26,17 @@
 const CGFloat kSidePannelOutlineBorderWidth = 1.0;
 
 // The corner radius of the outline that surrounds the results page.
-const CGFloat kSidePannelOutlineCornerRadius = 10.0;
+const CGFloat kSidePannelOutlineCornerRadius = 8.0;
 
 // The lateral inset ammount of the border outlining the results page.
-const CGFloat kSidePannelOutlineLateralInset = 10.0;
+const CGFloat kSidePannelOutlineLateralInset = 8.0;
 
 // The bottom inset ammount of the border outlining the results page.
 const CGFloat kSidePannelOutlineBottomInset = 8.0;
 
 // The corner radius of the selection UI when presented in the side panel
 // presentation.
-const CGFloat kSelectionUICornerRadius = 16.0;
+const CGFloat kSelectionUICornerRadius = 14.0;
 
 }  // namespace
 
@@ -67,7 +67,6 @@
 
 - (void)viewDidLoad {
   [super viewDidLoad];
-  self.view.backgroundColor = [UIColor colorNamed:kBackgroundColor];
   _borderView = [self createBorderView];
   [self.view addSubview:_borderView];
   AddSameConstraintsWithInsets(_borderView, self.view,
@@ -154,7 +153,8 @@
 - (void)viewDidLoad {
   [super viewDidLoad];
 
-  self.view.backgroundColor = [UIColor clearColor];
+  self.view.backgroundColor = [UIColor colorNamed:kBackgroundColor];
+
   self.view.accessibilityIdentifier = kLenscontainerViewAccessibilityIdentifier;
 
   if (!self.selectionViewController) {
@@ -262,6 +262,20 @@
   _selectionInteractionBlockingView = blocker;
 }
 
+- (void)fadeSelectionUIWithDuration:(NSTimeInterval)duration
+                         completion:(void (^)())completion {
+  [UIView animateWithDuration:duration
+      animations:^{
+        self.view.backgroundColor = [UIColor clearColor];
+        self.selectionViewController.view.alpha = 0;
+      }
+      completion:^(BOOL success) {
+        if (completion) {
+          completion();
+        }
+      }];
+}
+
 - (void)presentViewControllerInSidePanel:(UIViewController*)viewController
                                 animated:(BOOL)animated
                               completion:(ProceduralBlock)completion {
@@ -279,10 +293,6 @@
   ]];
 
   self.selectionViewController.view.clipsToBounds = YES;
-  self.selectionViewController.view.layer.cornerRadius =
-      kSelectionUICornerRadius;
-  self.selectionViewController.view.layer.backgroundColor =
-      [UIColor colorNamed:kBackgroundColor].CGColor;
   self.selectionViewController.view.layer.maskedCorners =
       kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner;
 
@@ -291,6 +301,8 @@
                                           animated:animated];
   if (!animated) {
     self.sidePanelOpen = YES;
+    self.selectionViewController.view.layer.cornerRadius =
+        kSelectionUICornerRadius;
     if (completion) {
       completion();
     }
@@ -302,6 +314,8 @@
       delay:0
       options:UIViewAnimationCurveEaseInOut
       animations:^{
+        self.selectionViewController.view.layer.cornerRadius =
+            kSelectionUICornerRadius;
         self.sidePanelOpen = YES;
         [self.view layoutIfNeeded];
       }
diff --git a/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.h b/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.h
index a7c0fbe..b772b09 100644
--- a/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.h
+++ b/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.h
@@ -50,6 +50,9 @@
 /// Whether the popup is open
 @property(nonatomic, assign, getter=isOpen) BOOL open;
 
+/// The container view for the popup.
+@property(nonatomic, readonly) UIView* popupContainerView;
+
 /// Uses the popup's intrinsic content size to add or remove the popup view
 /// if necessary. The animation changes depending on:
 /// `isFocusingOmnibox`: Omnibox is being focused.
diff --git a/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.mm b/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.mm
index 7288ba70..1b391f7 100644
--- a/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.mm
+++ b/ios/chrome/browser/omnibox/ui/popup/omnibox_popup_presenter.mm
@@ -38,6 +38,7 @@
 
 @property(nonatomic, weak) id<OmniboxPopupPresenterDelegate> delegate;
 @property(nonatomic, weak) UIViewController<ContentProviding>* viewController;
+/// Readwrite internal redefinition.
 @property(nonatomic, strong) UIView* popupContainerView;
 /// Separator for the bottom edge of the popup on iPad.
 @property(nonatomic, strong) UIView* bottomSeparator;
diff --git a/ios/chrome/browser/page_info/ui_bundled/page_info_site_security_mediator.mm b/ios/chrome/browser/page_info/ui_bundled/page_info_site_security_mediator.mm
index 12d6a86..df19af59f 100644
--- a/ios/chrome/browser/page_info/ui_bundled/page_info_site_security_mediator.mm
+++ b/ios/chrome/browser/page_info/ui_bundled/page_info_site_security_mediator.mm
@@ -72,7 +72,7 @@
     (web::WebState*)webState {
   web::NavigationItem* navItem =
       webState->GetNavigationManager()->GetVisibleItem();
-  const GURL& URL = navItem->GetURL();
+  const GURL& URL = navItem->GetVirtualURL();
   web::SSLStatus& status = navItem->GetSSL();
   bool offlinePage =
       OfflinePageTabHelper::FromWebState(webState)->presenting_offline_page();
diff --git a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
index 1d3b5372..c214f86 100644
--- a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
+++ b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
@@ -174,6 +174,7 @@
     "//ios/chrome/browser/shared/model/paths",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile",
+    "//ios/chrome/browser/shared/model/profile:features",
     "//ios/chrome/browser/shared/model/url",
     "//ios/chrome/browser/shared/model/url:constants",
     "//ios/chrome/browser/shared/model/web_state_list",
@@ -200,7 +201,6 @@
     "//ios/chrome/browser/web_state_list/model:session_metrics",
     "//ios/chrome/browser/web_state_list/model/web_usage_enabler",
     "//ios/chrome/browser/whats_new/coordinator/promo",
-    "//ios/chrome/browser/widget_kit/model:features",
     "//ios/chrome/browser/window_activities/model",
     "//ios/chrome/browser/youtube_incognito/coordinator",
     "//ios/chrome/common/ui/reauthentication",
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index b8fd0490..e5995e2 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -143,6 +143,7 @@
 #import "ios/chrome/browser/shared/model/browser/browser_list_factory.h"
 #import "ios/chrome/browser/shared/model/browser/browser_provider_interface.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
+#import "ios/chrome/browser/shared/model/profile/features.h"
 #import "ios/chrome/browser/shared/model/profile/profile_attributes_storage_ios.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/chrome/browser/shared/model/profile/profile_manager_ios.h"
@@ -195,7 +196,6 @@
 #import "ios/chrome/browser/web_state_list/model/session_metrics.h"
 #import "ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h"
 #import "ios/chrome/browser/whats_new/coordinator/promo/whats_new_scene_agent.h"
-#import "ios/chrome/browser/widget_kit/model/features.h"
 #import "ios/chrome/browser/window_activities/model/window_activity_helpers.h"
 #import "ios/chrome/browser/youtube_incognito/coordinator/youtube_incognito_coordinator.h"
 #import "ios/chrome/browser/youtube_incognito/coordinator/youtube_incognito_coordinator_delegate.h"
@@ -218,10 +218,6 @@
 #import "services/network/public/cpp/shared_url_loader_factory.h"
 #import "ui/base/l10n/l10n_util.h"
 
-#if BUILDFLAG(ENABLE_WIDGETS_FOR_MIM)
-#import "ios/chrome/browser/widget_kit/model/model_swift.h"  // nogncheck
-#endif
-
 namespace {
 
 // Killswitch, can be removed around February 2024. If enabled,
@@ -843,43 +839,43 @@
   NSSet<UIOpenURLContext*>* contexts = self.sceneState.URLContextsToOpen;
   self.sceneState.URLContextsToOpen = nil;
 
-#if BUILDFLAG(ENABLE_WIDGETS_FOR_MIM)
-  // Find the first context that requires an account change.
-  WidgetContext* context = [self findContextRequiringAccountChange:contexts];
-  if (context) {
-    // Perform profile switching if needed.
-    id<ChangeProfileCommands> changeProfileHandler = HandlerForProtocol(
-        self.sceneState.profileState.appState.appCommandDispatcher,
-        ChangeProfileCommands);
+  if (IsWidgetsForMultiprofileEnabled()) {
+    // Find the first context that requires an account change.
+    WidgetContext* context = [self findContextRequiringAccountChange:contexts];
+    if (context) {
+      // Perform profile switching if needed.
+      id<ChangeProfileCommands> changeProfileHandler = HandlerForProtocol(
+          self.sceneState.profileState.appState.appCommandDispatcher,
+          ChangeProfileCommands);
 
-    std::optional<std::string> profileName;
+      std::optional<std::string> profileName;
 
-    if ([context.gaiaID isEqualToString:@"Default"]) {
-      // Use the personal profile name if there is no GaiaID (this happens in
-      // the sign-out scenario).
-      profileName = GetApplicationContext()
-                        ->GetProfileManager()
-                        ->GetProfileAttributesStorage()
-                        ->GetPersonalProfileName();
-    } else {
-      profileName = GetApplicationContext()
-                        ->GetAccountProfileMapper()
-                        ->FindProfileNameForGaiaID(GaiaId(context.gaiaID));
-    }
-    // TODO(crbug.com/388520520): Make sure that ENABLE_WIDGETS_FOR_MIM is
-    // enabled only when AreSeparateProfilesForManagedAccountsEnabled() is true.
-    // If not, add implementation.
-    if (profileName.has_value()) {
-      [changeProfileHandler
-          changeProfile:*profileName
-               forScene:self.sceneState
-                 reason:ChangeProfileReason::kSwitchAccountsFromWidget
-           continuation:CreateChangeProfileAuthenticationContinuation(
-                            context, contexts)];
-      return;
+      if ([context.gaiaID isEqualToString:@"Default"]) {
+        // Use the personal profile name if there is no GaiaID (this happens in
+        // the sign-out scenario).
+        profileName = GetApplicationContext()
+                          ->GetProfileManager()
+                          ->GetProfileAttributesStorage()
+                          ->GetPersonalProfileName();
+      } else {
+        profileName = GetApplicationContext()
+                          ->GetAccountProfileMapper()
+                          ->FindProfileNameForGaiaID(GaiaId(context.gaiaID));
+      }
+      // TODO(crbug.com/388520520): Make sure that ENABLE_WIDGETS_FOR_MIM is
+      // enabled only when AreSeparateProfilesForManagedAccountsEnabled() is
+      // true. If not, add implementation.
+      if (profileName.has_value()) {
+        [changeProfileHandler
+            changeProfile:*profileName
+                 forScene:self.sceneState
+                   reason:ChangeProfileReason::kSwitchAccountsFromWidget
+             continuation:CreateChangeProfileAuthenticationContinuation(
+                              context, contexts)];
+        return;
+      }
     }
   }
-#endif
 
   [self openURLContexts:contexts];
 }
diff --git a/ios/chrome/browser/shared/model/browser/browser_user_data.h b/ios/chrome/browser/shared/model/browser/browser_user_data.h
index 4e2c112..8aee815 100644
--- a/ios/chrome/browser/shared/model/browser/browser_user_data.h
+++ b/ios/chrome/browser/shared/model/browser/browser_user_data.h
@@ -6,7 +6,9 @@
 #define IOS_CHROME_BROWSER_SHARED_MODEL_BROWSER_BROWSER_USER_DATA_H_
 
 #include "base/check.h"
+#include "base/check_deref.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/raw_ref.h"
 #include "base/supports_user_data.h"
 #include "ios/chrome/browser/shared/model/browser/browser.h"
 
@@ -59,8 +61,10 @@
   }
 
  protected:
-  BrowserUserData() {}
-  explicit BrowserUserData(Browser* browser) {}
+  explicit BrowserUserData(Browser* browser) : browser_(CHECK_DEREF(browser)) {}
+
+  // The owning Browser.
+  const raw_ref<Browser> browser_;
 
  private:
   // Default factory for T that invoke T's constructor. Can be overloaded
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 81efbdf..872cad0 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -1048,6 +1048,12 @@
 // Whether the feature associated with contained tab group is enabled.
 bool IsContainedTabGroupEnabled();
 
+// Feature flag to have more color for the tab groups.
+BASE_DECLARE_FEATURE(kColorfulTabGroup);
+
+// Whether the feature associated with colorful tab group is enabled.
+bool IsColorfulTabGroupEnabled();
+
 // Feature flag to highlight the app's features during the FRE.
 BASE_DECLARE_FEATURE(kBestOfAppFRE);
 
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index ca72ced0..a401d22 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1259,6 +1259,14 @@
   return base::FeatureList::IsEnabled(kContainedTabGroup);
 }
 
+BASE_FEATURE(kColorfulTabGroup,
+             "ColorfulTabGroup",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsColorfulTabGroupEnabled() {
+  return base::FeatureList::IsEnabled(kColorfulTabGroup);
+}
+
 BASE_FEATURE(kBestOfAppFRE, "BestOfAppFRE", base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsBestOfAppFREEnabled() {
diff --git a/ios/chrome/browser/signin/model/BUILD.gn b/ios/chrome/browser/signin/model/BUILD.gn
index 5018f939..cc74c7e6a 100644
--- a/ios/chrome/browser/signin/model/BUILD.gn
+++ b/ios/chrome/browser/signin/model/BUILD.gn
@@ -95,7 +95,7 @@
     "//ios/chrome/browser/web/model",
     "//ios/chrome/browser/web_state_list/model",
     "//ios/chrome/browser/webdata_services/model",
-    "//ios/chrome/browser/widget_kit/model:features",
+    "//ios/chrome/browser/widget_kit/model:model_swift",
     "//ios/chrome/common",
     "//ios/chrome/common/app_group:app_group",
     "//ios/chrome/common/ui/table_view:cells_constants",
@@ -110,9 +110,6 @@
     "//url",
   ]
 
-  if (ios_enable_widget_kit_extension && ios_enable_widgets_for_mim) {
-    deps += [ "//ios/chrome/browser/widget_kit/model:model_swift" ]
-  }
   public_deps = [
     ":constants",
     ":signin_util",
@@ -155,12 +152,8 @@
     "//ios/chrome/browser/shared/model/profile:features",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/public/features:system_flags",
-    "//ios/chrome/browser/widget_kit/model:features",
     "//ios/chrome/common/app_group",
   ]
-  if (ios_enable_widget_kit_extension && ios_enable_widgets_for_mim) {
-    deps += [ "//ios/chrome/browser/widget_kit/model:model_swift" ]
-  }
 }
 
 source_set("authentication_service_factory") {
@@ -501,7 +494,6 @@
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/sync/model:test_support",
     "//ios/chrome/browser/web/model",
-    "//ios/chrome/browser/widget_kit/model:features",
     "//ios/chrome/common/app_group",
     "//ios/chrome/test:test_support",
     "//ios/net",
diff --git a/ios/chrome/browser/signin/model/DEPS b/ios/chrome/browser/signin/model/DEPS
index 94f7cfe..c547378 100644
--- a/ios/chrome/browser/signin/model/DEPS
+++ b/ios/chrome/browser/signin/model/DEPS
@@ -24,14 +24,6 @@
     "+ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h",
   ],
   "^system_account_updater.mm": [
-    "+ios/chrome/browser/widget_kit/model/features.h",
-    "+ios/chrome/browser/widget_kit/model/model_swift.h",
-  ],
-  "^system_account_updater_unittests.mm": [
-    "+ios/chrome/browser/widget_kit/model/features.h",
-  ],
-  "^authentication_service.mm": [
-    "+ios/chrome/browser/widget_kit/model/features.h",
     "+ios/chrome/browser/widget_kit/model/model_swift.h",
   ],
 }
diff --git a/ios/chrome/browser/signin/model/system_account_updater.mm b/ios/chrome/browser/signin/model/system_account_updater.mm
index 85f92d8..431af10 100644
--- a/ios/chrome/browser/signin/model/system_account_updater.mm
+++ b/ios/chrome/browser/signin/model/system_account_updater.mm
@@ -4,31 +4,28 @@
 
 #import "ios/chrome/browser/signin/model/system_account_updater.h"
 
+#import "base/check_is_test.h"
 #import "base/task/single_thread_task_runner.h"
 #import "base/task/task_traits.h"
 #import "base/task/thread_pool.h"
 #import "base/threading/scoped_blocking_call.h"
-#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
-#import "ios/chrome/browser/signin/model/constants.h"
-#import "ios/chrome/browser/signin/model/system_identity.h"
-#import "ios/chrome/browser/widget_kit/model/features.h"
-#import "ios/chrome/common/app_group/app_group_constants.h"
-
-#if BUILDFLAG(ENABLE_WIDGETS_FOR_MIM)
-#import "base/check_is_test.h"
 #import "components/prefs/pref_service.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
-#import "ios/chrome/browser/widget_kit/model/model_swift.h"  // nogncheck
-#endif
+#import "ios/chrome/browser/shared/model/profile/features.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/signin/model/constants.h"
+#import "ios/chrome/browser/signin/model/system_identity.h"
+#import "ios/chrome/browser/widget_kit/model/model_swift.h"
+#import "ios/chrome/common/app_group/app_group_constants.h"
 
 namespace {
 
 // Updates all widget timelines with the updated data.
 void ReloadAllTimelines() {
-#if BUILDFLAG(ENABLE_WIDGETS_FOR_MIM)
-  [WidgetTimelinesUpdater reloadAllTimelines];
-#endif
+  if (IsWidgetsForMultiprofileEnabled()) {
+    [WidgetTimelinesUpdater reloadAllTimelines];
+  }
 }
 
 // Save avatar info to disk.
@@ -160,7 +157,6 @@
 }
 
 void SystemAccountUpdater::HandleMigrationIfNeeded() {
-#if BUILDFLAG(ENABLE_WIDGETS_FOR_MIM)
   PrefService* local_state = GetApplicationContext()->GetLocalState();
 
   if (!local_state) {
@@ -177,5 +173,4 @@
   }
   local_state->SetBoolean(prefs::kMigrateWidgetsPrefs, true);
   UpdateLoadedAccounts();
-#endif
 }
diff --git a/ios/chrome/browser/signin/model/system_account_updater_unittests.mm b/ios/chrome/browser/signin/model/system_account_updater_unittests.mm
index 73380dc..42296ddf 100644
--- a/ios/chrome/browser/signin/model/system_account_updater_unittests.mm
+++ b/ios/chrome/browser/signin/model/system_account_updater_unittests.mm
@@ -10,12 +10,9 @@
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity_manager.h"
-#import "ios/chrome/browser/widget_kit/model/features.h"
 #import "ios/chrome/common/app_group/app_group_constants.h"
 #import "testing/platform_test.h"
 
-#if BUILDFLAG(ENABLE_WIDGETS_FOR_MIM)
-
 class SystemAccountUpdaterTest : public PlatformTest {
  public:
   SystemAccountUpdaterTest() {
@@ -184,5 +181,3 @@
     EXPECT_FALSE([[items allKeys] containsObject:fake_identity.gaiaID]);
   }
 }
-
-#endif
diff --git a/ios/chrome/browser/supervised_user/model/supervised_user_metrics_service_factory.mm b/ios/chrome/browser/supervised_user/model/supervised_user_metrics_service_factory.mm
index 07b60fd1..7386bf6 100644
--- a/ios/chrome/browser/supervised_user/model/supervised_user_metrics_service_factory.mm
+++ b/ios/chrome/browser/supervised_user/model/supervised_user_metrics_service_factory.mm
@@ -35,6 +35,6 @@
   ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
   return std::make_unique<supervised_user::SupervisedUserMetricsService>(
       profile->GetPrefs(),
-      SupervisedUserServiceFactory::GetForProfile(profile)->GetURLFilter(),
+      *SupervisedUserServiceFactory::GetForProfile(profile),
       /*extensions_metrics_delegate=*/nullptr);
 }
diff --git a/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.cc b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.cc
index cd938bd..12e84d5 100644
--- a/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.cc
+++ b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.cc
@@ -116,9 +116,4 @@
       std::inserter(syncable_prefs, syncable_prefs.end()));
   return syncable_prefs;
 }
-
-bool IOSChromeSyncablePrefsDatabase::IsPreferenceAlwaysSyncing(
-    std::string_view pref_name) const {
-  return common_syncable_prefs_database_.IsPreferenceAlwaysSyncing(pref_name);
-}
 }  // namespace browser_sync
diff --git a/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h
index 84363e46..b75dfc0 100644
--- a/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h
+++ b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h
@@ -24,8 +24,6 @@
   std::map<std::string_view, sync_preferences::SyncablePrefMetadata>
   GetAllSyncablePrefsForTest() const;
 
-  bool IsPreferenceAlwaysSyncing(std::string_view pref_name) const override;
-
  private:
   // This defines the list of preferences that are syncable across all
   // platforms.
diff --git a/ios/chrome/browser/widget_kit/model/BUILD.gn b/ios/chrome/browser/widget_kit/model/BUILD.gn
index 1d5397ba..ab6243a4 100644
--- a/ios/chrome/browser/widget_kit/model/BUILD.gn
+++ b/ios/chrome/browser/widget_kit/model/BUILD.gn
@@ -8,13 +8,9 @@
 import("//ios/build/chrome_build.gni")
 
 buildflag_header("features") {
-  _enable_widgets_for_mim =
-      ios_enable_widget_kit_extension && ios_enable_widgets_for_mim
   header = "features.h"
-  flags = [
-    "ENABLE_WIDGET_KIT_EXTENSION=" + "$ios_enable_widget_kit_extension",
-    "ENABLE_WIDGETS_FOR_MIM=" + "$_enable_widgets_for_mim",
-  ]
+  flags =
+      [ "ENABLE_WIDGET_KIT_EXTENSION=" + "$ios_enable_widget_kit_extension" ]
 }
 
 if (ios_enable_widget_kit_extension) {
diff --git a/ios/chrome/widget_kit_extension/BUILD.gn b/ios/chrome/widget_kit_extension/BUILD.gn
index 157a9f3..c4d46d4 100644
--- a/ios/chrome/widget_kit_extension/BUILD.gn
+++ b/ios/chrome/widget_kit_extension/BUILD.gn
@@ -17,10 +17,6 @@
   swiftflags = [ "-DIOS_ENABLE_LOCKSCREEN_WIDGET" ]
 }
 
-config("ios_enable_widgets_for_mim") {
-  swiftflags = [ "-DIOS_ENABLE_WIDGETS_FOR_MIM" ]
-}
-
 source_set("crash_helper") {
   sources = [
     "crash_helper.h",
@@ -41,10 +37,12 @@
     "quick_actions_widget.swift",
     "search_passwords_widget.swift",
     "search_widget.swift",
+    "select_profile_intent.swift",
     "shortcuts_widget.swift",
     "timeline_provider_util.swift",
     "widget_urls.swift",
   ]
+  generate_intents = true
   bridge_header = "widget_kit_swift_bridge.h"
 
   deps = [
@@ -66,12 +64,6 @@
     configs += [ ":ios_enable_lockscreen_widget" ]
   }
 
-  if (ios_enable_widgets_for_mim) {
-    configs += [ ":ios_enable_widgets_for_mim" ]
-    generate_intents = true
-    sources += [ "select_profile_intent.swift" ]
-  }
-
   frameworks = [
     "WidgetKit.framework",
     "Foundation.framework",
diff --git a/ios/chrome/widget_kit_extension/appex/BUILD.gn b/ios/chrome/widget_kit_extension/appex/BUILD.gn
index f6168d7..6476392 100644
--- a/ios/chrome/widget_kit_extension/appex/BUILD.gn
+++ b/ios/chrome/widget_kit_extension/appex/BUILD.gn
@@ -27,10 +27,8 @@
   info_plist_target = ":tweak_info_plist"
   bundle_identifier = "$ios_chromium_bundle_id.WidgetKitExtension"
   deps = [ "//ios/chrome/widget_kit_extension:widget_kit_extension_swift" ]
-  if (ios_enable_widgets_for_mim) {
-    intents_target =
-        "//ios/chrome/widget_kit_extension:widget_kit_extension_swift"
-  }
+  intents_target =
+      "//ios/chrome/widget_kit_extension:widget_kit_extension_swift"
   if (ios_app_extension_privacy_manifest != "") {
     deps += [ ":privacy_manifest" ]
   }
diff --git a/ios/chrome/widget_kit_extension/dino_game_widget.swift b/ios/chrome/widget_kit_extension/dino_game_widget.swift
index d9a4590..03d1290 100644
--- a/ios/chrome/widget_kit_extension/dino_game_widget.swift
+++ b/ios/chrome/widget_kit_extension/dino_game_widget.swift
@@ -25,29 +25,27 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  @available(iOS 17, *)
-  struct DinoGameWidgetConfigurable: Widget {
-    // Changing `kind` or deleting this widget will cause all installed instances of this widget to
-    // stop updating and show the placeholder state.
-    let kind: String = "DinoGameWidget"
-    var body: some WidgetConfiguration {
-      AppIntentConfiguration(
-        kind: kind, intent: SelectAccountIntent.self, provider: ConfigurableProvider()
-      ) { entry in
-        DinoGameWidgetEntryView(entry: entry)
-      }
-      .configurationDisplayName(
-        Text("IDS_IOS_WIDGET_KIT_EXTENSION_GAME_DISPLAY_NAME")
-      )
-      .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_GAME_DESCRIPTION"))
-      .supportedFamilies([.systemSmall])
-      .crDisfavoredLocations()
-      .crContentMarginsDisabled()
-      .crContainerBackgroundRemovable(false)
+@available(iOS 17, *)
+struct DinoGameWidgetConfigurable: Widget {
+  // Changing `kind` or deleting this widget will cause all installed instances of this widget to
+  // stop updating and show the placeholder state.
+  let kind: String = "DinoGameWidget"
+  var body: some WidgetConfiguration {
+    AppIntentConfiguration(
+      kind: kind, intent: SelectAccountIntent.self, provider: ConfigurableProvider()
+    ) { entry in
+      DinoGameWidgetEntryView(entry: entry)
     }
+    .configurationDisplayName(
+      Text("IDS_IOS_WIDGET_KIT_EXTENSION_GAME_DISPLAY_NAME")
+    )
+    .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_GAME_DESCRIPTION"))
+    .supportedFamilies([.systemSmall])
+    .crDisfavoredLocations()
+    .crContentMarginsDisabled()
+    .crContainerBackgroundRemovable(false)
   }
-#endif
+}
 
 struct DinoGameWidgetEntryView: View {
   let background = "widget_dino_background"
@@ -56,7 +54,7 @@
   @Environment(\.redactionReasons) var redactionReasons
   var body: some View {
     // The account to display was deleted (entry.deleted can only be true if
-    // IOS_ENABLE_WIDGETS_FOR_MIM is enabled).
+    // IsWidgetsForMultiprofileEnabled() is enabled).
     if entry.deleted && !entry.isPreview {
       SmallWidgetDeletedAccountView()
     } else {
@@ -78,9 +76,9 @@
                 .font(.subheadline)
                 .lineLimit(1)
               Spacer()
-              #if IOS_ENABLE_WIDGETS_FOR_MIM
+              if ChromeWidgetsMain.WidgetsForMultiprofile() {
                 AvatarForDinoGame(entry: entry)
-              #endif
+              }
             }
             .padding([.leading, .bottom], 16)
           }
@@ -96,25 +94,23 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  struct AvatarForDinoGame: View {
-    var entry: ConfigureWidgetEntry
-    var body: some View {
-      if entry.isPreview {
-        Circle()
-          .foregroundColor(Color("widget_text_color"))
-          .opacity(0.2)
-          .frame(width: 25, height: 25)
-          .padding(.trailing, 16)
-      } else if let avatar = entry.avatar {
-        avatar
-          .resizable()
-          .clipShape(Circle())
-          .unredacted()
-          .scaledToFill()
-          .frame(width: 25, height: 25)
-          .padding(.trailing, 16)
-      }
+struct AvatarForDinoGame: View {
+  var entry: ConfigureWidgetEntry
+  var body: some View {
+    if entry.isPreview {
+      Circle()
+        .foregroundColor(Color("widget_text_color"))
+        .opacity(0.2)
+        .frame(width: 25, height: 25)
+        .padding(.trailing, 16)
+    } else if let avatar = entry.avatar {
+      avatar
+        .resizable()
+        .clipShape(Circle())
+        .unredacted()
+        .scaledToFill()
+        .frame(width: 25, height: 25)
+        .padding(.trailing, 16)
     }
   }
-#endif
+}
diff --git a/ios/chrome/widget_kit_extension/main.swift b/ios/chrome/widget_kit_extension/main.swift
index 21e3dfc7..3c776ee 100644
--- a/ios/chrome/widget_kit_extension/main.swift
+++ b/ios/chrome/widget_kit_extension/main.swift
@@ -45,19 +45,11 @@
 struct ChromeWidgetsForMIM: WidgetBundle {
   @WidgetBundleBuilder
   var body: some Widget {
-    #if IOS_ENABLE_WIDGETS_FOR_MIM
-      QuickActionsWidgetConfigurable()
-      SearchWidgetConfigurable()
-      ShortcutsWidgetConfigurable()
-      SearchPasswordsWidgetConfigurable()
-      DinoGameWidgetConfigurable()
-    #else
-      QuickActionsWidget()
-      SearchWidget()
-      ShortcutsWidget()
-      SearchPasswordsWidget()
-      DinoGameWidget()
-    #endif
+    QuickActionsWidgetConfigurable()
+    SearchWidgetConfigurable()
+    ShortcutsWidgetConfigurable()
+    SearchPasswordsWidgetConfigurable()
+    DinoGameWidgetConfigurable()
     #if IOS_ENABLE_LOCKSCREEN_WIDGET
       #if IOS_AVAILABLE_LOCKSCREEN_WIDGET
         LockscreenLauncherSearchWidget()
diff --git a/ios/chrome/widget_kit_extension/quick_actions_widget.swift b/ios/chrome/widget_kit_extension/quick_actions_widget.swift
index 2193f3b..8ca5c69 100644
--- a/ios/chrome/widget_kit_extension/quick_actions_widget.swift
+++ b/ios/chrome/widget_kit_extension/quick_actions_widget.swift
@@ -81,83 +81,81 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  @available(iOS 17, *)
-  struct QuickActionsWidgetConfigurable: Widget {
-    // Changing 'kind' or deleting this widget will cause all installed instances of this widget to
-    // stop updating and show the placeholder state.
-    let kind: String = "QuickActionsWidget"
+@available(iOS 17, *)
+struct QuickActionsWidgetConfigurable: Widget {
+  // Changing 'kind' or deleting this widget will cause all installed instances of this widget to
+  // stop updating and show the placeholder state.
+  let kind: String = "QuickActionsWidget"
 
-    var body: some WidgetConfiguration {
-      AppIntentConfiguration(
-        kind: kind,
-        intent: SelectAccountIntent.self,
-        provider: ConfigurableQuickActionsWidgetEntryProvider()
-      ) { entry in
-        QuickActionsWidgetEntryView(entry: entry)
-      }
-      .configurationDisplayName(
-        Text("IDS_IOS_WIDGET_KIT_EXTENSION_QUICK_ACTIONS_DISPLAY_NAME")
-      )
-      .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_QUICK_ACTIONS_DESCRIPTION"))
-      .supportedFamilies([.systemMedium])
-      .crDisfavoredLocations()
-      .crContentMarginsDisabled()
-      .crContainerBackgroundRemovable(false)
+  var body: some WidgetConfiguration {
+    AppIntentConfiguration(
+      kind: kind,
+      intent: SelectAccountIntent.self,
+      provider: ConfigurableQuickActionsWidgetEntryProvider()
+    ) { entry in
+      QuickActionsWidgetEntryView(entry: entry)
     }
+    .configurationDisplayName(
+      Text("IDS_IOS_WIDGET_KIT_EXTENSION_QUICK_ACTIONS_DISPLAY_NAME")
+    )
+    .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_QUICK_ACTIONS_DESCRIPTION"))
+    .supportedFamilies([.systemMedium])
+    .crDisfavoredLocations()
+    .crContentMarginsDisabled()
+    .crContainerBackgroundRemovable(false)
+  }
+}
+
+// Advises WidgetKit when to update a widget’s display.
+@available(iOS 17, *)
+struct ConfigurableQuickActionsWidgetEntryProvider: AppIntentTimelineProvider {
+
+  func placeholder(in context: Context) -> ConfigureQuickActionsWidgetEntry {
+    ConfigureQuickActionsWidgetEntry(
+      date: Date(), useLens: false, useColorLensAndVoiceIcons: false, isPreview: true,
+      avatar: nil, gaiaID: nil, deleted: false)
   }
 
-  // Advises WidgetKit when to update a widget’s display.
-  @available(iOS 17, *)
-  struct ConfigurableQuickActionsWidgetEntryProvider: AppIntentTimelineProvider {
+  func snapshot(for configuration: SelectAccountIntent, in context: Context) async
+    -> ConfigureQuickActionsWidgetEntry
+  {
+    let avatar: Image? = configuration.avatar()
+    let gaiaID: String? = configuration.gaia()
+    let deleted: Bool = configuration.deleted()
 
-    func placeholder(in context: Context) -> ConfigureQuickActionsWidgetEntry {
-      ConfigureQuickActionsWidgetEntry(
-        date: Date(), useLens: false, useColorLensAndVoiceIcons: false, isPreview: true,
-        avatar: nil, gaiaID: nil, deleted: false)
-    }
-
-    func snapshot(for configuration: SelectAccountIntent, in context: Context) async
-      -> ConfigureQuickActionsWidgetEntry
-    {
-      let avatar: Image? = configuration.avatar()
-      let gaiaID: String? = configuration.gaia()
-      let deleted: Bool = configuration.deleted()
-
-      let entry = ConfigureQuickActionsWidgetEntry(
-        date: Date(),
-        useLens: shouldUseLens(),
-        useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(),
-        isPreview: context.isPreview,
-        avatar: avatar,
-        gaiaID: gaiaID,
-        deleted: deleted
-      )
-      return entry
-    }
-
-    func timeline(for configuration: SelectAccountIntent, in context: Context) async -> Timeline<
-      ConfigureQuickActionsWidgetEntry
-    > {
-      let avatar: Image? = configuration.avatar()
-      let gaiaID: String? = configuration.gaia()
-      let deleted: Bool = configuration.deleted()
-
-      let entry = ConfigureQuickActionsWidgetEntry(
-        date: Date(),
-        useLens: shouldUseLens(),
-        useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(),
-        isPreview: context.isPreview,
-        avatar: avatar,
-        gaiaID: gaiaID,
-        deleted: deleted
-      )
-      let entries: [ConfigureQuickActionsWidgetEntry] = [entry]
-      let timeline: Timeline = Timeline(entries: entries, policy: .never)
-      return timeline
-    }
+    let entry = ConfigureQuickActionsWidgetEntry(
+      date: Date(),
+      useLens: shouldUseLens(),
+      useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(),
+      isPreview: context.isPreview,
+      avatar: avatar,
+      gaiaID: gaiaID,
+      deleted: deleted
+    )
+    return entry
   }
-#endif
+
+  func timeline(for configuration: SelectAccountIntent, in context: Context) async -> Timeline<
+    ConfigureQuickActionsWidgetEntry
+  > {
+    let avatar: Image? = configuration.avatar()
+    let gaiaID: String? = configuration.gaia()
+    let deleted: Bool = configuration.deleted()
+
+    let entry = ConfigureQuickActionsWidgetEntry(
+      date: Date(),
+      useLens: shouldUseLens(),
+      useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(),
+      isPreview: context.isPreview,
+      avatar: avatar,
+      gaiaID: gaiaID,
+      deleted: deleted
+    )
+    let entries: [ConfigureQuickActionsWidgetEntry] = [entry]
+    let timeline: Timeline = Timeline(entries: entries, policy: .never)
+    return timeline
+  }
+}
 
 func shouldUseLens() -> Bool {
   let sharedDefaults: UserDefaults = AppGroupHelper.groupUserDefaults()
@@ -204,7 +202,7 @@
 
   var body: some View {
     // The account to display was deleted (entry.deleted can only be true if
-    // IOS_ENABLE_WIDGETS_FOR_MIM is enabled).
+    // IsWidgetsForMultiprofileEnabled() is true).
     if entry.deleted && !entry.isPreview {
       MediumWidgetDeletedAccountView()
     } else {
@@ -232,9 +230,9 @@
                     .font(.subheadline)
                     .foregroundColor(Color("widget_text_color"))
                   Spacer()
-                  #if IOS_ENABLE_WIDGETS_FOR_MIM
+                  if ChromeWidgetsMain.WidgetsForMultiprofile() {
                     Avatar(entry: entry)
-                  #endif
+                  }
                 }
               }
               .frame(minWidth: 0, maxWidth: .infinity)
diff --git a/ios/chrome/widget_kit_extension/search_passwords_widget.swift b/ios/chrome/widget_kit_extension/search_passwords_widget.swift
index 4a5737d..1e21a1e 100644
--- a/ios/chrome/widget_kit_extension/search_passwords_widget.swift
+++ b/ios/chrome/widget_kit_extension/search_passwords_widget.swift
@@ -25,36 +25,34 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  @available(iOS 17, *)
-  struct SearchPasswordsWidgetConfigurable: Widget {
-    // Changing `kind` or deleting this widget will cause all installed instances of this widget to
-    // stop updating and show the placeholder state.
-    let kind: String = "SearchPasswordsWidget"
-    var body: some WidgetConfiguration {
-      AppIntentConfiguration(
-        kind: kind, intent: SelectAccountIntent.self, provider: ConfigurableProvider()
-      ) { entry in
-        SearchPasswordsWidgetEntryView(entry: entry)
-      }
-      .configurationDisplayName(
-        Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_PASSWORDS_DISPLAY_NAME")
-      )
-      .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_PASSWORDS_DESCRIPTION"))
-      .supportedFamilies([.systemSmall])
-      .crDisfavoredLocations()
-      .crContentMarginsDisabled()
-      .crContainerBackgroundRemovable(false)
+@available(iOS 17, *)
+struct SearchPasswordsWidgetConfigurable: Widget {
+  // Changing `kind` or deleting this widget will cause all installed instances of this widget to
+  // stop updating and show the placeholder state.
+  let kind: String = "SearchPasswordsWidget"
+  var body: some WidgetConfiguration {
+    AppIntentConfiguration(
+      kind: kind, intent: SelectAccountIntent.self, provider: ConfigurableProvider()
+    ) { entry in
+      SearchPasswordsWidgetEntryView(entry: entry)
     }
+    .configurationDisplayName(
+      Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_PASSWORDS_DISPLAY_NAME")
+    )
+    .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_PASSWORDS_DESCRIPTION"))
+    .supportedFamilies([.systemSmall])
+    .crDisfavoredLocations()
+    .crContentMarginsDisabled()
+    .crContainerBackgroundRemovable(false)
   }
-#endif
+}
 
 struct SearchPasswordsWidgetEntryView: View {
   var entry: ConfigureWidgetEntry
 
   var body: some View {
     // The account to display was deleted (entry.deleted can only be true if
-    // IOS_ENABLE_WIDGETS_FOR_MIM is enabled).
+    // IsWidgetsForMultiprofileEnabled() is true).
     if entry.deleted && !entry.isPreview {
       SmallWidgetDeletedAccountView()
     } else {
diff --git a/ios/chrome/widget_kit_extension/search_widget.swift b/ios/chrome/widget_kit_extension/search_widget.swift
index 11765b18..8fa1172f 100644
--- a/ios/chrome/widget_kit_extension/search_widget.swift
+++ b/ios/chrome/widget_kit_extension/search_widget.swift
@@ -25,36 +25,34 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  @available(iOS 17, *)
-  struct SearchWidgetConfigurable: Widget {
-    // Changing 'kind' or deleting this widget will cause all installed instances of this widget to
-    // stop updating and show the placeholder state.
-    let kind: String = "SearchWidget"
-    var body: some WidgetConfiguration {
-      AppIntentConfiguration(
-        kind: kind, intent: SelectAccountIntent.self, provider: ConfigurableProvider()
-      ) { entry in
-        SearchWidgetEntryView(entry: entry)
-      }
-      .configurationDisplayName(
-        Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_DISPLAY_NAME")
-      )
-      .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_DESCRIPTION"))
-      .supportedFamilies([.systemSmall])
-      .crDisfavoredLocations()
-      .crContentMarginsDisabled()
-      .crContainerBackgroundRemovable(false)
+@available(iOS 17, *)
+struct SearchWidgetConfigurable: Widget {
+  // Changing 'kind' or deleting this widget will cause all installed instances of this widget to
+  // stop updating and show the placeholder state.
+  let kind: String = "SearchWidget"
+  var body: some WidgetConfiguration {
+    AppIntentConfiguration(
+      kind: kind, intent: SelectAccountIntent.self, provider: ConfigurableProvider()
+    ) { entry in
+      SearchWidgetEntryView(entry: entry)
     }
+    .configurationDisplayName(
+      Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_DISPLAY_NAME")
+    )
+    .description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_DESCRIPTION"))
+    .supportedFamilies([.systemSmall])
+    .crDisfavoredLocations()
+    .crContentMarginsDisabled()
+    .crContainerBackgroundRemovable(false)
   }
-#endif
+}
 
 struct SearchWidgetEntryView: View {
   var entry: ConfigureWidgetEntry
 
   var body: some View {
     // The account to display was deleted (entry.deleted can only be true if
-    // IOS_ENABLE_WIDGETS_FOR_MIM is enabled).
+    // IsWidgetsForMultiprofileEnabled() is true).
     if entry.deleted && !entry.isPreview {
       SmallWidgetDeletedAccountView()
     } else {
@@ -104,9 +102,9 @@
               .font(.subheadline)
               .padding([.leading, .bottom], 16)
             Spacer()
-            #if IOS_ENABLE_WIDGETS_FOR_MIM
+            if ChromeWidgetsMain.WidgetsForMultiprofile() {
               AvatarForSearch(entry: entry)
-            #endif
+            }
           }
         }
       }
diff --git a/ios/chrome/widget_kit_extension/shortcuts_widget.swift b/ios/chrome/widget_kit_extension/shortcuts_widget.swift
index 097d823..e8744052 100644
--- a/ios/chrome/widget_kit_extension/shortcuts_widget.swift
+++ b/ios/chrome/widget_kit_extension/shortcuts_widget.swift
@@ -96,80 +96,78 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  @available(iOS 17, *)
-  // Provides the configuration and content of a widget to display on the Home screen.
-  struct ShortcutsWidgetConfigurable: Widget {
-    // Changing 'kind' or deleting this widget will cause all installed instances of this widget to
-    // stop updating and show the placeholder state.
-    let kind: String = "ShortcutsWidget"
-    let deviceModel = UIDevice.current.model
-    var body: some WidgetConfiguration {
-      AppIntentConfiguration(
-        kind: kind,
-        intent: SelectAccountIntent.self,
-        provider: ConfigurableShortcutsWidgetEntryProvider()
-      ) { entry in
-        ShortcutsWidgetEntryView(entry: entry)
-      }
-      .configurationDisplayName(
-        Text("IDS_IOS_WIDGET_KIT_EXTENSION_SHORTCUTS_DISPLAY_NAME")
-      )
-      .description(
-        deviceModel == "iPhone"
-          ? Text("IDS_IOS_WIDGET_KIT_EXTENSION_SHORTCUTS_DESCRIPTION_IPHONE")
-          : Text("IDS_IOS_WIDGET_KIT_EXTENSION_SHORTCUTS_DESCRIPTION_IPAD")
-      )
-      .supportedFamilies([.systemMedium])
-      .crDisfavoredLocations()
-      .crContentMarginsDisabled()
-      .crContainerBackgroundRemovable(false)
+@available(iOS 17, *)
+// Provides the configuration and content of a widget to display on the Home screen.
+struct ShortcutsWidgetConfigurable: Widget {
+  // Changing 'kind' or deleting this widget will cause all installed instances of this widget to
+  // stop updating and show the placeholder state.
+  let kind: String = "ShortcutsWidget"
+  let deviceModel = UIDevice.current.model
+  var body: some WidgetConfiguration {
+    AppIntentConfiguration(
+      kind: kind,
+      intent: SelectAccountIntent.self,
+      provider: ConfigurableShortcutsWidgetEntryProvider()
+    ) { entry in
+      ShortcutsWidgetEntryView(entry: entry)
     }
+    .configurationDisplayName(
+      Text("IDS_IOS_WIDGET_KIT_EXTENSION_SHORTCUTS_DISPLAY_NAME")
+    )
+    .description(
+      deviceModel == "iPhone"
+        ? Text("IDS_IOS_WIDGET_KIT_EXTENSION_SHORTCUTS_DESCRIPTION_IPHONE")
+        : Text("IDS_IOS_WIDGET_KIT_EXTENSION_SHORTCUTS_DESCRIPTION_IPAD")
+    )
+    .supportedFamilies([.systemMedium])
+    .crDisfavoredLocations()
+    .crContentMarginsDisabled()
+    .crContainerBackgroundRemovable(false)
+  }
+}
+
+// Advises WidgetKit when to update a widget’s display.
+@available(iOS 17, *)
+struct ConfigurableShortcutsWidgetEntryProvider: AppIntentTimelineProvider {
+
+  // A type that specifies the entry of the configured timeline entry of the widget.
+  typealias Entry = ConfigureShortcutsWidgetEntry
+
+  // Provides a timeline entry representing a placeholder version of the widget.
+  func placeholder(in context: TimelineProviderContext) -> Entry {
+    return Entry(
+      date: Date(), mostVisitedSites: [:], isPreview: true, isExpired: false, expirationDate: nil,
+      avatar: nil, gaiaID: nil, deleted: false)
   }
 
-  // Advises WidgetKit when to update a widget’s display.
-  @available(iOS 17, *)
-  struct ConfigurableShortcutsWidgetEntryProvider: AppIntentTimelineProvider {
+  // Provides a timeline entry that represents the current time and state of a widget.
+  func snapshot(for configuration: SelectAccountIntent, in context: Context) async -> Entry {
 
-    // A type that specifies the entry of the configured timeline entry of the widget.
-    typealias Entry = ConfigureShortcutsWidgetEntry
+    let avatar: Image? = configuration.avatar()
+    let gaiaID: String? = configuration.gaia()
+    let deleted: Bool = configuration.deleted()
 
-    // Provides a timeline entry representing a placeholder version of the widget.
-    func placeholder(in context: TimelineProviderContext) -> Entry {
-      return Entry(
-        date: Date(), mostVisitedSites: [:], isPreview: true, isExpired: false, expirationDate: nil,
-        avatar: nil, gaiaID: nil, deleted: false)
-    }
-
-    // Provides a timeline entry that represents the current time and state of a widget.
-    func snapshot(for configuration: SelectAccountIntent, in context: Context) async -> Entry {
-
-      let avatar: Image? = configuration.avatar()
-      let gaiaID: String? = configuration.gaia()
-      let deleted: Bool = configuration.deleted()
-
-      let entry = loadMostVisitedSitesEntry(
-        isPreview: context.isPreview, avatar: avatar, gaia: gaiaID, deleted: deleted)
-      return entry
-    }
-
-    // Provides an array of timeline entries for the current time.
-    func timeline(for configuration: SelectAccountIntent, in context: Context) async -> Timeline<
-      Entry
-    > {
-      let avatar: Image? = configuration.avatar()
-      let gaiaID: String? = configuration.gaia()
-      let deleted: Bool = configuration.deleted()
-
-      let entry = loadMostVisitedSitesEntry(
-        isPreview: context.isPreview, avatar: avatar, gaia: gaiaID, deleted: deleted)
-      let entries = [entry]
-      let timeline = Timeline(
-        entries: entries, policy: entry.expirationDate.map { .after($0) } ?? .never)
-      return timeline
-    }
+    let entry = loadMostVisitedSitesEntry(
+      isPreview: context.isPreview, avatar: avatar, gaia: gaiaID, deleted: deleted)
+    return entry
   }
-#endif
+
+  // Provides an array of timeline entries for the current time.
+  func timeline(for configuration: SelectAccountIntent, in context: Context) async -> Timeline<
+    Entry
+  > {
+    let avatar: Image? = configuration.avatar()
+    let gaiaID: String? = configuration.gaia()
+    let deleted: Bool = configuration.deleted()
+
+    let entry = loadMostVisitedSitesEntry(
+      isPreview: context.isPreview, avatar: avatar, gaia: gaiaID, deleted: deleted)
+    let entries = [entry]
+    let timeline = Timeline(
+      entries: entries, policy: entry.expirationDate.map { .after($0) } ?? .never)
+    return timeline
+  }
+}
 
 // Return ConfigureShortcutsWidgetEntry with the most visited sites
 func loadMostVisitedSitesEntry(
@@ -206,27 +204,32 @@
   if isPreview {
     return emptyEntry
   }
+  guard let sharedDefaults = AppGroupHelper.groupUserDefaults() else { return emptyEntry }
+  var lastModificationDate: Date?
 
-  #if IOS_ENABLE_WIDGETS_FOR_MIM
-    guard let sharedDefaults: UserDefaults = AppGroupHelper.groupUserDefaults(),
+  if ChromeWidgetsMain.WidgetsForMultiprofile() {
+    guard
       let lastModificationDates = sharedDefaults.object(
         forKey: "SuggestedItemsLastModificationDateForMIM")
         as? [String: Date]
     else { return emptyEntry }
-    var date: Date?
     for (key, value) in lastModificationDates {
       if gaia == key {
-        date = value
+        lastModificationDate = value
       }
     }
-    guard let lastModificationDate = date
-    else { return emptyEntry }
-  #else
-    guard let sharedDefaults: UserDefaults = AppGroupHelper.groupUserDefaults(),
-      let lastModificationDate = sharedDefaults.object(forKey: "SuggestedItemsLastModificationDate")
+  } else {
+    guard
+      let date = sharedDefaults.object(forKey: "SuggestedItemsLastModificationDate")
         as? Date
     else { return emptyEntry }
-  #endif
+    lastModificationDate = date
+  }
+
+  // Make sure that lastModificationDate is not empty.
+  guard let lastModificationDate = lastModificationDate else {
+    return emptyEntry
+  }
 
   let extensionsFlags =
     sharedDefaults.object(forKey: "Extension.FieldTrial") as? [String: Any] ?? [:]
@@ -238,6 +241,7 @@
 
   // A constant to get the number of seconds of the last modification date of the installed widget.
   let numberOfSecondsSinceLastModification = Date.now.timeIntervalSince(lastModificationDate)
+
   // A constant to get the number of seconds to refresh the widget after it has been closed.
   let numberOfSecondsFromLastModificationToExpiration =
     fiveMinutestoRefreshTestValue ? Constants.secondsInFiveMinutes : Constants.secondsInFourWeeks
@@ -249,22 +253,28 @@
   if numberOfSecondsFromLastModificationToExpiration < numberOfSecondsSinceLastModification {
     return expiredEntry
   }
-  #if IOS_ENABLE_WIDGETS_FOR_MIM
+  var unarchiver: NSKeyedUnarchiver?
+  if ChromeWidgetsMain.WidgetsForMultiprofile() {
     guard let data = sharedDefaults.object(forKey: "SuggestedItemsForMIM") as? [String: Data]
     else { return emptyEntry }
-    var unarchiverForAccount: NSKeyedUnarchiver?
     for (key, value) in data {
       if gaia == key {
-        unarchiverForAccount = try? NSKeyedUnarchiver(forReadingFrom: value)
+        unarchiver = try? NSKeyedUnarchiver(forReadingFrom: value)
       }
     }
-    guard let unarchiver = unarchiverForAccount
+  } else {
+    guard let data = sharedDefaults.object(forKey: "SuggestedItems") as? Data
     else { return emptyEntry }
-  #else
-    guard let data = sharedDefaults.object(forKey: "SuggestedItems") as? Data,
-      let unarchiver = try? NSKeyedUnarchiver(forReadingFrom: data)
-    else { return emptyEntry }
-  #endif
+    unarchiver = try? NSKeyedUnarchiver(forReadingFrom: data)
+    if unarchiver == nil {
+      return emptyEntry
+    }
+  }
+
+  // Make sure that unarchiver is not empty.
+  guard let unarchiver = unarchiver else {
+    return emptyEntry
+  }
 
   unarchiver.requiresSecureCoding = false
 
@@ -363,9 +373,9 @@
             .font(.subheadline)
             .foregroundColor(Colors.widgetTextColor)
           Spacer()
-          #if IOS_ENABLE_WIDGETS_FOR_MIM
+          if ChromeWidgetsMain.WidgetsForMultiprofile() {
             AvatarForShortcuts(entry: entry)
-          #endif
+          }
         }
       }
       .frame(minWidth: 0, maxWidth: .infinity)
@@ -443,7 +453,7 @@
 
   var body: some View {
     // The account to display was deleted (entry.deleted can only be true if
-    // IOS_ENABLE_WIDGETS_FOR_MIM is enabled).
+    // IsWidgetsForMultiprofileEnabled() is true).
     if entry.deleted && !entry.isPreview {
       MediumWidgetDeletedAccountView()
     } else {
diff --git a/ios/chrome/widget_kit_extension/timeline_provider_util.swift b/ios/chrome/widget_kit_extension/timeline_provider_util.swift
index 150125b..01c7a92 100644
--- a/ios/chrome/widget_kit_extension/timeline_provider_util.swift
+++ b/ios/chrome/widget_kit_extension/timeline_provider_util.swift
@@ -40,39 +40,37 @@
   }
 }
 
-#if IOS_ENABLE_WIDGETS_FOR_MIM
-  @available(iOS 17, *)
-  struct ConfigurableProvider: AppIntentTimelineProvider {
-    typealias Entry = ConfigureWidgetEntry
+@available(iOS 17, *)
+struct ConfigurableProvider: AppIntentTimelineProvider {
+  typealias Entry = ConfigureWidgetEntry
 
-    func placeholder(in: Self.Context) -> Entry {
-      Entry(date: Date(), isPreview: true, avatar: nil, gaiaID: nil, deleted: false)
-    }
-    func snapshot(for configuration: SelectAccountIntent, in context: Context) async -> Entry {
-      let avatar: Image? = configuration.avatar()
-      let gaiaID: String? = configuration.gaia()
-      let deleted: Bool = configuration.deleted()
-
-      return Entry(
-        date: Date(), isPreview: context.isPreview, avatar: avatar, gaiaID: gaiaID,
-        deleted: deleted
-      )
-    }
-    func timeline(for configuration: SelectAccountIntent, in context: Context) async -> Timeline<
-      Entry
-    > {
-      let avatar: Image? = configuration.avatar()
-      let gaiaID: String? = configuration.gaia()
-      let deleted: Bool = configuration.deleted()
-
-      return Timeline(
-        entries: [
-          Entry(
-            date: Date(), isPreview: context.isPreview, avatar: avatar, gaiaID: gaiaID,
-            deleted: deleted)
-        ], policy: .never
-      )
-    }
-
+  func placeholder(in: Self.Context) -> Entry {
+    Entry(date: Date(), isPreview: true, avatar: nil, gaiaID: nil, deleted: false)
   }
-#endif
+  func snapshot(for configuration: SelectAccountIntent, in context: Context) async -> Entry {
+    let avatar: Image? = configuration.avatar()
+    let gaiaID: String? = configuration.gaia()
+    let deleted: Bool = configuration.deleted()
+
+    return Entry(
+      date: Date(), isPreview: context.isPreview, avatar: avatar, gaiaID: gaiaID,
+      deleted: deleted
+    )
+  }
+  func timeline(for configuration: SelectAccountIntent, in context: Context) async -> Timeline<
+    Entry
+  > {
+    let avatar: Image? = configuration.avatar()
+    let gaiaID: String? = configuration.gaia()
+    let deleted: Bool = configuration.deleted()
+
+    return Timeline(
+      entries: [
+        Entry(
+          date: Date(), isPreview: context.isPreview, avatar: avatar, gaiaID: gaiaID,
+          deleted: deleted)
+      ], policy: .never
+    )
+  }
+
+}
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index fda98b13..ea36759 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -564,9 +564,8 @@
   }
 }
 
-int HttpCache::CreateTransaction(
-    RequestPriority priority,
-    std::unique_ptr<HttpTransaction>* transaction) {
+std::unique_ptr<HttpTransaction> HttpCache::CreateTransaction(
+    RequestPriority priority) {
   // Do lazy initialization of disk cache if needed.
   if (!disk_cache_.get()) {
     // We don't care about the result.
@@ -585,8 +584,7 @@
     new_transaction->FailConditionalizationForTest();
   }
 
-  *transaction = std::move(new_transaction);
-  return OK;
+  return new_transaction;
 }
 
 HttpCache* HttpCache::GetCache() {
diff --git a/net/http/http_cache.h b/net/http/http_cache.h
index 465513a..6ca9c1a6 100644
--- a/net/http/http_cache.h
+++ b/net/http/http_cache.h
@@ -265,8 +265,8 @@
   }
 
   // HttpTransactionFactory implementation:
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* transaction) override;
+  std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) override;
   HttpCache* GetCache() override;
   HttpNetworkSession* GetSession() override;
 
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index d2251f0..8b7d201 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -1906,13 +1906,8 @@
   send_request_since_ = TimeTicks::Now();
 
   // Create a network transaction.
-  int rv =
-      cache_->network_layer_->CreateTransaction(priority_, &network_trans_);
-
-  if (rv != OK) {
-    TransitionToState(STATE_FINISH_HEADERS);
-    return rv;
-  }
+  network_trans_ = cache_->network_layer_->CreateTransaction(priority_);
+  CHECK(network_trans_);
 
   network_trans_->SetConnectedCallback(connected_callback_);
   network_trans_->SetRequestHeadersCallback(request_headers_callback_);
@@ -1942,7 +1937,7 @@
   }
 
   TransitionToState(STATE_SEND_REQUEST_COMPLETE);
-  rv = network_trans_->Start(request_, io_callback_, net_log_);
+  int rv = network_trans_->Start(request_, io_callback_, net_log_);
   if (rv != ERR_IO_PENDING && waiting_for_cache_io_) {
     // queue the state transition until the HttpCache transaction completes
     DCHECK(!pending_io_result_);
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index 74cb85e..0d6fcb2 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -56,6 +56,7 @@
 #include "net/base/net_errors.h"
 #include "net/base/network_anonymization_key.h"
 #include "net/base/network_isolation_partition.h"
+#include "net/base/request_priority.h"
 #include "net/base/schemeful_site.h"
 #include "net/base/tracing.h"
 #include "net/base/upload_bytes_element_reader.h"
@@ -231,12 +232,11 @@
 
   // write to the cache
 
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = cache->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      cache->CreateTransaction(DEFAULT_PRIORITY);
   ASSERT_TRUE(trans.get());
 
-  rv = trans->Start(&request, callback.callback(), net_log);
+  int rv = trans->Start(&request, callback.callback(), net_log);
   if (rv == ERR_IO_PENDING) {
     rv = callback.WaitForResult();
   }
@@ -869,8 +869,7 @@
 TEST_F(HttpCacheTest, CreateThenDestroy) {
   MockHttpCache cache;
 
-  std::unique_ptr<HttpTransaction> trans;
-  EXPECT_THAT(cache.CreateTransaction(&trans), IsOk());
+  std::unique_ptr<HttpTransaction> trans = cache.CreateTransaction();
   ASSERT_TRUE(trans.get());
 }
 
@@ -912,9 +911,8 @@
 
   ConnectedHandler connected_handler;
 
-  std::unique_ptr<HttpTransaction> transaction;
-  EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-  ASSERT_THAT(transaction, NotNull());
+  auto transaction = cache.CreateTransaction();
+  ASSERT_TRUE(transaction);
 
   transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -934,9 +932,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
   ConnectedHandler connected_handler;
 
-  std::unique_ptr<HttpTransaction> transaction;
-  EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-  ASSERT_THAT(transaction, NotNull());
+  auto transaction = cache.CreateTransaction();
+  ASSERT_TRUE(transaction);
 
   // The exact error code does not matter. We only care that it is passed to
   // the transaction's completion callback unmodified.
@@ -970,9 +967,8 @@
   ConnectedHandler connected_handler;
   MockHttpRequest request(kSimpleGET_Transaction);
 
-  std::unique_ptr<HttpTransaction> transaction;
-  EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-  ASSERT_THAT(transaction, NotNull());
+  auto transaction = cache.CreateTransaction();
+  ASSERT_TRUE(transaction);
 
   transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1011,9 +1007,8 @@
     ConnectedHandler connected_handler;
     connected_handler.set_result(ERR_FAILED);
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1032,9 +1027,8 @@
     // Request the same resource once more, observe that it is read from cache.
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1070,9 +1064,8 @@
     ConnectedHandler connected_handler;
     connected_handler.set_result(ERR_INCONSISTENT_IP_ADDRESS_SPACE);
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1093,9 +1086,8 @@
     // cache.
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1134,9 +1126,8 @@
     connected_handler.set_result(
         ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY);
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1159,9 +1150,8 @@
     // cache.
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1201,9 +1191,8 @@
   ConnectedHandler connected_handler;
   MockHttpRequest request(kSimpleGET_Transaction);
 
-  std::unique_ptr<HttpTransaction> transaction;
-  EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-  ASSERT_THAT(transaction, NotNull());
+  auto transaction = cache.CreateTransaction();
+  ASSERT_TRUE(transaction);
 
   transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -1389,8 +1378,8 @@
   RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction);
 
   MockHttpRequest request(kSimpleGET_Transaction);
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   const int kBufferSize = 10;
   auto buffer = base::MakeRefCounted<IOBufferWithSize>(kBufferSize);
@@ -1431,10 +1420,11 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   rv = c->callback.WaitForResult();
 
@@ -1478,10 +1468,11 @@
 
   // Now fail to read from the cache.
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(c->callback.GetResult(rv), IsOk());
 
   // Now verify that the entry was removed from the cache.
@@ -1575,8 +1566,8 @@
   MockHttpRequest request(transaction);
   TestCompletionCallback callback;
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
@@ -1715,11 +1706,9 @@
 
     MockHttpRequest request(transaction);
     TestCompletionCallback callback;
-    std::unique_ptr<HttpTransaction> trans;
-    int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-    EXPECT_THAT(rv, IsOk());
-    ASSERT_TRUE(trans.get());
-    rv = trans->Start(&request, callback.callback(), NetLogWithSource());
+    auto trans = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY);
+    ASSERT_TRUE(trans);
+    int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     EXPECT_THAT(callback.GetResult(rv), IsError(ERR_FAILED));
 
     const HttpResponseInfo* response_info = trans->GetResponseInfo();
@@ -1760,11 +1749,9 @@
     ScopedMockTransaction transaction(kSimpleGET_Transaction);
     MockHttpRequest request(transaction);
     TestCompletionCallback callback;
-    std::unique_ptr<HttpTransaction> trans;
-    int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-    EXPECT_THAT(rv, IsOk());
-    ASSERT_TRUE(trans.get());
-    rv = trans->Start(&request, callback.callback(), NetLogWithSource());
+    auto trans = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY);
+    ASSERT_TRUE(trans);
+    trans->Start(&request, callback.callback(), NetLogWithSource());
     // Now destroy the transaction so that RecordHistograms gets invoked.
     trans.reset();
   }
@@ -2104,10 +2091,10 @@
     MockHttpRequest request(transaction);
     Context c;
 
-    int rv = cache.CreateTransaction(&c.trans);
-    ASSERT_THAT(rv, IsOk());
+    c.trans = cache.CreateTransaction();
+    ASSERT_TRUE(c.trans);
 
-    rv = c.callback.GetResult(
+    int rv = c.callback.GetResult(
         c.trans->Start(&request, c.callback.callback(), NetLogWithSource()));
     ASSERT_THAT(rv, IsOk());
 
@@ -2132,13 +2119,13 @@
     MockHttpRequest request(transaction);
     Context c;
 
-    int rv = cache.CreateTransaction(&c.trans);
-    ASSERT_THAT(rv, IsOk());
+    c.trans = cache.CreateTransaction();
+    ASSERT_TRUE(c.trans);
     c.trans->SetConnectedCallback(base::BindRepeating(
         [](const TransportInfo& info, CompletionOnceCallback callback) -> int {
           return ERR_ABORTED;
         }));
-    rv = c.callback.GetResult(
+    int rv = c.callback.GetResult(
         c.trans->Start(&request, c.callback.callback(), NetLogWithSource()));
     EXPECT_EQ(ERR_ABORTED, rv);
 
@@ -2181,10 +2168,10 @@
     MockHttpRequest request(transaction);
     Context c;
 
-    int rv = cache.CreateTransaction(&c.trans);
-    ASSERT_THAT(rv, IsOk());
+    c.trans = cache.CreateTransaction();
+    ASSERT_TRUE(c.trans);
 
-    rv = c.callback.GetResult(
+    int rv = c.callback.GetResult(
         c.trans->Start(&request, c.callback.callback(), NetLogWithSource()));
     ASSERT_THAT(rv, IsOk());
 
@@ -2259,10 +2246,10 @@
     MockHttpRequest request(transaction);
     Context c;
 
-    int rv = cache.CreateTransaction(&c.trans);
-    ASSERT_THAT(rv, IsOk());
+    c.trans = cache.CreateTransaction();
+    ASSERT_TRUE(c.trans);
 
-    rv = c.callback.GetResult(
+    int rv = c.callback.GetResult(
         c.trans->Start(&request, c.callback.callback(), NetLogWithSource()));
     ASSERT_THAT(rv, IsOk());
 
@@ -2286,13 +2273,13 @@
     MockHttpRequest request(transaction);
     Context c;
 
-    int rv = cache.CreateTransaction(&c.trans);
-    ASSERT_THAT(rv, IsOk());
+    c.trans = cache.CreateTransaction();
+    ASSERT_TRUE(c.trans);
     c.trans->SetConnectedCallback(base::BindRepeating(
         [](const TransportInfo& info, CompletionOnceCallback callback) -> int {
           return ERR_ABORTED;
         }));
-    rv = c.callback.GetResult(
+    int rv = c.callback.GetResult(
         c.trans->Start(&request, c.callback.callback(), NetLogWithSource()));
     EXPECT_EQ(ERR_ABORTED, rv);
 
@@ -2388,8 +2375,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -2619,9 +2606,8 @@
 
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2688,9 +2674,8 @@
   {
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2720,9 +2705,8 @@
   {
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2775,9 +2759,8 @@
   {
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2807,9 +2790,8 @@
   {
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2867,9 +2849,8 @@
   {
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2902,9 +2883,8 @@
   {
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2956,9 +2936,8 @@
 
     ConnectedHandler connected_handler;
 
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
-    ASSERT_THAT(transaction, NotNull());
+    auto transaction = cache.CreateTransaction();
+    ASSERT_TRUE(transaction);
 
     transaction->SetConnectedCallback(connected_handler.Callback());
 
@@ -2991,8 +2970,8 @@
   MockHttpRequest request(transaction);
 
   auto c = std::make_unique<Context>();
-  c->result = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(c->result, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
   EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
   cache.disk_cache()->set_fail_requests(true);
@@ -3031,8 +3010,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3101,8 +3080,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     MockHttpRequest* this_request = &request;
@@ -3187,8 +3166,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     MockHttpRequest* this_request = &request;
@@ -3274,8 +3253,8 @@
   MockHttpRequest request1(transaction);
   {
     auto& c = context_list[0];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3301,8 +3280,8 @@
   MockHttpRequest request2(transaction);
   {
     auto& c = context_list[1];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3374,8 +3353,8 @@
   transaction.load_flags |= LOAD_SKIP_CACHE_VALIDATION;
   MockHttpRequest request(transaction);
   Context context;
-  context.result = cache.CreateTransaction(&context.trans);
-  ASSERT_THAT(context.result, IsOk());
+  context.trans = cache.CreateTransaction();
+  ASSERT_TRUE(context.trans);
   context.result = context.trans->Start(&request, context.callback.callback(),
                                         NetLogWithSource());
   base::RunLoop().RunUntilIdle();
@@ -3387,8 +3366,8 @@
   transaction.request_headers = "Range: bytes = 0-9\r\n" EXTRA_HEADER;
   MockHttpRequest range_request(transaction);
   Context range_context;
-  range_context.result = cache.CreateTransaction(&range_context.trans);
-  ASSERT_THAT(range_context.result, IsOk());
+  range_context.trans = cache.CreateTransaction();
+  ASSERT_TRUE(range_context.trans);
   range_context.result = range_context.trans->Start(
       &range_request, range_context.callback.callback(), NetLogWithSource());
   base::RunLoop().RunUntilIdle();
@@ -3417,8 +3396,8 @@
   MockHttpRequest request1(transaction);
   {
     auto& c = context_list[0];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3448,8 +3427,8 @@
   MockHttpRequest request2(transaction);
   {
     auto& c = context_list[1];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3513,8 +3492,8 @@
     ScopedMockTransaction transaction(mock_transaction);
     request1.url = GURL(kRangeGET_TransactionOK.url);
     auto& c = context_list[0];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3539,8 +3518,8 @@
   MockHttpRequest request2(range_transaction);
   {
     auto& c = context_list[1];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3600,8 +3579,8 @@
     ScopedMockTransaction transaction(mock_transaction);
     request1.url = GURL(kRangeGET_TransactionOK.url);
     auto& c = context_list[0];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3626,8 +3605,8 @@
   MockHttpRequest request2(range_transaction);
   {
     auto& c = context_list[1];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3674,8 +3653,8 @@
   MockHttpRequest request1(transaction);
   {
     auto& c = context_list[0];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3701,8 +3680,8 @@
   MockHttpRequest request2(transaction);
   {
     auto& c = context_list[1];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3778,8 +3757,8 @@
   MockHttpRequest request1(transaction);
   {
     auto& c = context_list[0];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3805,8 +3784,8 @@
   MockHttpRequest request2(transaction);
   {
     auto& c = context_list[1];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -3873,8 +3852,8 @@
 
   // Write to the cache.
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     if (rv == ERR_IO_PENDING) {
@@ -3904,8 +3883,8 @@
 
   // Read from the cache.
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     if (rv == ERR_IO_PENDING) {
@@ -3931,8 +3910,8 @@
   // Now read the full body. This normally would not be done for a 301 by
   // higher layers, but e.g. a 500 could hit a further bug here.
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     if (rv == ERR_IO_PENDING) {
@@ -3969,8 +3948,8 @@
   // Create and run the first, successful, transaction to prime the cache.
   context_list.push_back(std::make_unique<Context>());
   auto& c1 = context_list.back();
-  c1->result = cache.CreateTransaction(&c1->trans);
-  ASSERT_THAT(c1->result, IsOk());
+  c1->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c1->trans);
   EXPECT_EQ(LOAD_STATE_IDLE, c1->trans->GetLoadState());
   c1->result =
       c1->trans->Start(&request, c1->callback.callback(), NetLogWithSource());
@@ -3986,8 +3965,8 @@
   // during the call to RunUntilIdle().
   context_list.push_back(std::make_unique<Context>());
   auto& c2 = context_list.back();
-  c2->result = cache.CreateTransaction(&c2->trans);
-  ASSERT_THAT(c2->result, IsOk());
+  c2->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c2->trans);
   EXPECT_EQ(LOAD_STATE_IDLE, c2->trans->GetLoadState());
   c2->result =
       c2->trans->Start(&request, c2->callback.callback(), NetLogWithSource());
@@ -4031,8 +4010,8 @@
   for (int i = 0; i < kNumTransactions; ++i) {
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -4154,8 +4133,8 @@
   for (int i = 0; i < kNumTransactions; ++i) {
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     MockHttpRequest* this_request = &request;
@@ -4226,8 +4205,8 @@
       this_request = &delete_request;
     }
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result = c->trans->Start(this_request, c->callback.callback(),
@@ -4287,8 +4266,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* current_request = i == 1 ? &read_only_request : &request;
 
@@ -4338,8 +4317,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -4397,8 +4376,8 @@
       cache.SimulateCacheLockTimeoutAfterHeaders();
     }
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result = c->trans->Start(this_request, c->callback.callback(),
                                 NetLogWithSource());
@@ -4448,8 +4427,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 3) {
@@ -4490,8 +4469,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -4533,8 +4512,8 @@
   MockHttpCache mock_cache;
   MockHttpRequest request(kSimpleGET_Transaction);
 
-  std::unique_ptr<HttpTransaction> transaction;
-  mock_cache.CreateTransaction(&transaction);
+  auto transaction = mock_cache.CreateTransaction();
+  ASSERT_TRUE(transaction);
   TestCompletionCallback callback;
   int result =
       transaction->Start(&request, callback.callback(), NetLogWithSource());
@@ -4590,8 +4569,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 2) {
@@ -4683,8 +4662,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 0) {
@@ -4760,8 +4739,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 3) {
@@ -4870,8 +4849,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -4921,8 +4900,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 3) {
@@ -5007,8 +4986,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     c->result = c->trans->Start(this_request, c->callback.callback(),
@@ -5072,8 +5051,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5118,8 +5097,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
   Context c;
 
-  c.result = cache.CreateTransaction(&c.trans);
-  ASSERT_THAT(c.result, IsOk());
+  c.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c.trans);
 
   c.result =
       c.trans->Start(&request, c.callback.callback(), NetLogWithSource());
@@ -5162,8 +5141,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5226,8 +5205,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 1) {
@@ -5283,8 +5262,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 2) {
@@ -5345,8 +5324,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     if (i == 0) {
       c->trans->SetConnectedCallback(base::BindLambdaForTesting(
@@ -5400,8 +5379,8 @@
     context_list.push_back(std::make_unique<Context>());
     auto& c = context_list[i];
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
     EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
 
     c->result =
@@ -5479,8 +5458,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 1 || i == 2) {
@@ -5563,8 +5542,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     MockHttpRequest* this_request = &request;
     if (i == 3) {
@@ -5612,8 +5591,8 @@
   MockHttpRequest request1(transaction);
 
   Context c1;
-  c1.result = cache.CreateTransaction(&c1.trans);
-  ASSERT_THAT(c1.result, IsOk());
+  c1.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c1.trans);
   auto connected_future = ExpectConnected(*c1.trans);
   c1.result =
       c1.trans->Start(&request1, c1.callback.callback(), NetLogWithSource());
@@ -5629,8 +5608,8 @@
   request2.load_flags = LOAD_BYPASS_CACHE;
 
   Context c2;
-  c2.result = cache.CreateTransaction(&c2.trans);
-  ASSERT_THAT(c2.result, IsOk());
+  c2.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c2.trans);
   c2.result =
       c2.trans->Start(&request2, c2.callback.callback(), NetLogWithSource());
   ASSERT_THAT(c2.result, IsError(ERR_IO_PENDING));
@@ -5653,8 +5632,8 @@
   // cooperate with them, and is entirely driven by the state of the cache.
   MockHttpRequest request3(kSimpleGET_Transaction);
   Context context3;
-  context3.result = cache.CreateTransaction(&context3.trans);
-  ASSERT_THAT(context3.result, IsOk());
+  context3.trans = cache.CreateTransaction();
+  ASSERT_TRUE(context3.trans);
   context3.result = context3.trans->Start(
       &request3, context3.callback.callback(), NetLogWithSource());
   base::RunLoop().RunUntilIdle();
@@ -5685,8 +5664,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5732,8 +5711,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5789,8 +5768,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5834,8 +5813,8 @@
 
   auto c = std::make_unique<Context>();
 
-  c->result = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(c->result, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   c->result =
       c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5864,8 +5843,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -5900,10 +5879,12 @@
 
   MockHttpRequest request(kSimpleGET_Transaction);
   Context c1, c2;
-  ASSERT_THAT(cache.CreateTransaction(&c1.trans), IsOk());
+  c1.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c1.trans);
   ASSERT_EQ(ERR_IO_PENDING, c1.trans->Start(&request, c1.callback.callback(),
                                             NetLogWithSource()));
-  ASSERT_THAT(cache.CreateTransaction(&c2.trans), IsOk());
+  c2.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c2.trans);
   ASSERT_EQ(ERR_IO_PENDING, c2.trans->Start(&request, c2.callback.callback(),
                                             NetLogWithSource()));
 
@@ -5927,12 +5908,14 @@
 
   MockHttpRequest request(kSimpleGET_Transaction);
   Context c1, c2;
-  ASSERT_THAT(cache.CreateTransaction(&c1.trans), IsOk());
+  c1.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c1.trans);
   ASSERT_EQ(ERR_IO_PENDING, c1.trans->Start(&request, c1.callback.callback(),
                                             NetLogWithSource()));
 
   request.load_flags = LOAD_ONLY_FROM_CACHE;
-  ASSERT_THAT(cache.CreateTransaction(&c2.trans), IsOk());
+  c2.trans = cache.CreateTransaction();
+  ASSERT_TRUE(c2.trans);
   ASSERT_EQ(ERR_IO_PENDING, c2.trans->Start(&request, c2.callback.callback(),
                                             NetLogWithSource()));
 
@@ -5954,8 +5937,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
   TestCompletionCallback callback;
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
   int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = callback.WaitForResult();
@@ -5990,8 +5973,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache->CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache->CreateTransaction();
+    ASSERT_TRUE(c->trans);
 
     c->result =
         c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
@@ -6024,8 +6007,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
   }
 
   context_list[0]->result = context_list[0]->trans->Start(
@@ -6071,8 +6054,8 @@
     context_list.push_back(std::make_unique<Context>());
     Context* c = context_list[i].get();
 
-    c->result = cache.CreateTransaction(&c->trans);
-    ASSERT_THAT(c->result, IsOk());
+    c->trans = cache.CreateTransaction();
+    ASSERT_TRUE(c->trans);
   }
 
   context_list[0]->result = context_list[0]->trans->Start(
@@ -6114,8 +6097,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   auto c = std::make_unique<Context>();
-  c->result = cache->CreateTransaction(&c->trans);
-  ASSERT_THAT(c->result, IsOk());
+  c->trans = cache->CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
 
@@ -6153,8 +6136,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   auto c = std::make_unique<Context>();
-  c->result = cache_ptr->CreateTransaction(&c->trans);
-  ASSERT_THAT(c->result, IsOk());
+  c->trans = cache_ptr->CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
 
@@ -6175,7 +6158,6 @@
 
   // The cache should be gone by now.
   base::RunLoop().RunUntilIdle();
-  EXPECT_THAT(c->callback.GetResult(c->result), IsOk());
   EXPECT_FALSE(cb2.have_result());
 }
 
@@ -7120,9 +7102,8 @@
   MockHttpRequest request(transaction);
   TestCompletionCallback callback;
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
-  ASSERT_TRUE(trans.get());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   ASSERT_THAT(callback.GetResult(rv), IsError(ERR_CACHE_MISS));
@@ -7435,9 +7416,8 @@
   MockHttpRequest request(transaction);
   TestCompletionCallback callback;
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
-  ASSERT_TRUE(trans.get());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   ASSERT_THAT(callback.GetResult(rv), IsError(ERR_CACHE_MISS));
@@ -9696,10 +9676,11 @@
   MockHttpRequest request(kRangeGET_TransactionOK);
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -9735,11 +9716,11 @@
   MockHttpRequest request(kRangeGET_TransactionOK);
 
   auto context = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&context->trans);
-  ASSERT_THAT(rv, IsOk());
+  context->trans = cache.CreateTransaction();
+  ASSERT_TRUE(context->trans);
 
-  rv = context->trans->Start(&request, context->callback.callback(),
-                             NetLogWithSource());
+  int rv = context->trans->Start(&request, context->callback.callback(),
+                                 NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = context->callback.WaitForResult();
   }
@@ -9776,10 +9757,11 @@
   request.load_flags |= LOAD_VALIDATE_CACHE;
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -9822,10 +9804,11 @@
   request.load_flags |= LOAD_VALIDATE_CACHE;
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   rv = c->callback.WaitForResult();
 
@@ -9850,8 +9833,8 @@
   // active entry (no open or create).
 
   c = std::make_unique<Context>();
-  rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -10103,12 +10086,10 @@
   MockHttpRequest request(transaction);
   TestCompletionCallback callback;
 
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
-  ASSERT_TRUE(trans.get());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
-  rv = trans->Start(&request, callback.callback(), NetLogWithSource());
+  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = callback.WaitForResult();
   }
@@ -10180,10 +10161,11 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     c->result = c->callback.WaitForResult();
   }
@@ -10211,10 +10193,11 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -10256,10 +10239,11 @@
   MockHttpRequest request(transaction);
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -10300,10 +10284,11 @@
 
   auto c = std::make_unique<Context>();
 
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -10354,10 +10339,11 @@
 
   auto c = std::make_unique<Context>();
 
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -10412,10 +10398,11 @@
   MockHttpRequest request(transaction);
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(c->callback.GetResult(rv), IsOk());
 
   // Read everything.
@@ -10440,12 +10427,11 @@
 
   auto request = std::make_unique<MockHttpRequest>(transaction);
   std::unique_ptr<HttpTransaction> trans;
-
-  int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  trans = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY);
+  ASSERT_TRUE(trans);
 
   TestCompletionCallback cb;
-  rv = trans->Start(request.get(), cb.callback(), NetLogWithSource());
+  int rv = trans->Start(request.get(), cb.callback(), NetLogWithSource());
   EXPECT_EQ(0, cb.GetResult(rv));
 
   auto buf = base::MakeRefCounted<IOBufferWithSize>(10);
@@ -10467,12 +10453,11 @@
 
   auto request = std::make_unique<MockHttpRequest>(transaction);
   std::unique_ptr<HttpTransaction> trans;
-
-  int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  trans = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY);
+  ASSERT_TRUE(trans);
 
   TestCompletionCallback cb;
-  rv = trans->Start(request.get(), cb.callback(), NetLogWithSource());
+  int rv = trans->Start(request.get(), cb.callback(), NetLogWithSource());
   EXPECT_EQ(0, cb.GetResult(rv));
 
   auto buf = base::MakeRefCounted<IOBufferWithSize>(10);
@@ -10592,17 +10577,19 @@
   MockHttpRequest request(transaction);
   auto c = std::make_unique<Context>();
 
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   // Queue another request to this transaction. We have to start this request
   // before the first one gets the response from the server and dooms the entry,
   // otherwise it will just create a new entry without being queued to the first
   // request.
   auto pending = std::make_unique<Context>();
-  ASSERT_THAT(cache.CreateTransaction(&pending->trans), IsOk());
+  pending->trans = cache.CreateTransaction();
+  ASSERT_TRUE(pending->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_EQ(ERR_IO_PENDING,
             pending->trans->Start(&request, pending->callback.callback(),
                                   NetLogWithSource()));
@@ -10685,11 +10672,12 @@
   transaction.data = kFullRangeData;
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   MockHttpRequest request(transaction);
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(c->callback.GetResult(rv), IsOk());
 
   // We should have checked with the server before finishing Start().
@@ -10718,11 +10706,12 @@
   RangeTransactionServer handler;
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   MockHttpRequest request(transaction);
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(c->callback.GetResult(rv), IsOk());
 
   const HttpResponseInfo* response = c->trans->GetResponseInfo();
@@ -10767,12 +10756,13 @@
       "X-Require-Mock-Auth-Alt: dummy\r\n" EXTRA_HEADER;
 
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
   MockHttpRequest request(transaction);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = c->callback.WaitForResult();
   }
@@ -10830,10 +10820,11 @@
 
   MockHttpRequest request(transaction);
   auto c = std::make_unique<Context>();
-  int rv = cache.CreateTransaction(&c->trans);
-  ASSERT_THAT(rv, IsOk());
+  c->trans = cache.CreateTransaction();
+  ASSERT_TRUE(c->trans);
 
-  rv = c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
+  int rv =
+      c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
   EXPECT_THAT(c->callback.GetResult(rv), IsOk());
 
   // Read 20 bytes from the cache, and 10 from the net.
@@ -10944,8 +10935,8 @@
 
   // Write to the cache.
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     if (rv == ERR_IO_PENDING) {
@@ -10979,8 +10970,8 @@
 
   // Read from the cache.
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     if (rv == ERR_IO_PENDING) {
@@ -11174,8 +11165,8 @@
   MockHttpRequest request(transaction);
   TestCompletionCallback callback;
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
@@ -11188,8 +11179,8 @@
 TEST_F(HttpCacheTest, OutlivedTransactions) {
   auto cache = std::make_unique<MockHttpCache>();
 
-  std::unique_ptr<HttpTransaction> trans;
-  EXPECT_THAT(cache->CreateTransaction(&trans), IsOk());
+  std::unique_ptr<HttpTransaction> trans = cache->CreateTransaction();
+  EXPECT_TRUE(trans);
 
   cache.reset();
   trans.reset();
@@ -11981,8 +11972,8 @@
 
   {
     MockHttpRequest request(kSimpleGET_Transaction);
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     EXPECT_THAT(callback.GetResult(rv), IsOk());
@@ -12017,8 +12008,8 @@
   transaction.data = "";
   MockHttpRequest request(transaction);
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   EXPECT_THAT(callback.GetResult(rv), IsOk());
@@ -12044,8 +12035,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     EXPECT_THAT(callback.GetResult(rv), IsOk());
@@ -12082,8 +12073,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     EXPECT_THAT(callback.GetResult(rv), IsOk());
@@ -12124,8 +12115,8 @@
   MockHttpRequest request(mock_transaction);
 
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     EXPECT_THAT(callback.GetResult(rv), IsOk());
@@ -12151,8 +12142,8 @@
   MockHttpRequest request(kSimpleGET_Transaction);
 
   {
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     // Force a response that can be resumed.
     ScopedMockTransaction mock_transaction(kSimpleGET_Transaction);
@@ -12202,8 +12193,8 @@
 
   {
     // Now make a regular request.
-    std::unique_ptr<HttpTransaction> trans;
-    ASSERT_THAT(cache.CreateTransaction(&trans), IsOk());
+    auto trans = cache.CreateTransaction();
+    ASSERT_TRUE(trans);
 
     int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
     EXPECT_THAT(callback.GetResult(rv), IsOk());
@@ -12435,10 +12426,8 @@
 
   MockHttpRequest request(transaction);
   TestCompletionCallback callback;
-  std::unique_ptr<HttpTransaction> http_transaction;
-  int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY,
-                                                 &http_transaction);
-  ASSERT_EQ(OK, rv);
+  std::unique_ptr<HttpTransaction> http_transaction =
+      cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY);
   ASSERT_TRUE(http_transaction.get());
 
   bool network_transaction_started = false;
@@ -12450,8 +12439,8 @@
         }));
   }
 
-  rv = http_transaction->Start(&request, callback.callback(),
-                               NetLogWithSource());
+  int rv = http_transaction->Start(&request, callback.callback(),
+                                   NetLogWithSource());
   rv = callback.GetResult(rv);
   ASSERT_EQ(OK, rv);
 
@@ -12542,8 +12531,9 @@
   MockHttpCache cache;
 
   HttpRequestInfo info;
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.http_cache()->CreateTransaction(IDLE, &trans), IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      cache.http_cache()->CreateTransaction(IDLE);
+  ASSERT_TRUE(trans);
 
   // Shouldn't crash, but doesn't do anything either.
   trans->SetPriority(LOW);
@@ -12580,8 +12570,9 @@
   HttpRequestInfo info;
 
   FakeWebSocketHandshakeStreamCreateHelper create_helper;
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.http_cache()->CreateTransaction(IDLE, &trans), IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      cache.http_cache()->CreateTransaction(IDLE);
+  ASSERT_TRUE(trans);
 
   EXPECT_FALSE(cache.network_layer()->last_transaction());
 
@@ -12621,8 +12612,9 @@
   transaction.request_headers = EXTRA_HEADER;
   transaction.data = kFullRangeData;
 
-  std::unique_ptr<HttpTransaction> trans;
-  ASSERT_THAT(cache.http_cache()->CreateTransaction(MEDIUM, &trans), IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      cache.http_cache()->CreateTransaction(MEDIUM);
+  ASSERT_TRUE(trans);
   EXPECT_EQ(DEFAULT_PRIORITY,
             cache.network_layer()->last_create_transaction_priority());
 
@@ -12933,10 +12925,8 @@
   transaction.data = "rg: 00-09 ";
 
   TestCompletionCallback callback;
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
-  ASSERT_TRUE(trans.get());
+  auto trans = cache.CreateTransaction();
+  ASSERT_TRUE(trans);
 
   // Start our transaction.
   trans->Start(&request, callback.callback(), NetLogWithSource());
@@ -12979,11 +12969,10 @@
   TestCompletionCallback callback;
 
   std::unique_ptr<HttpTransaction> trans;
-  int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  trans = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY);
   ASSERT_TRUE(trans);
 
-  rv = trans->Start(&request, callback.callback(), NetLogWithSource());
+  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
   if (rv == ERR_IO_PENDING) {
     rv = callback.WaitForResult();
   }
@@ -13005,8 +12994,8 @@
   MockHttpRequest request(mock_transaction);
 
   auto first = std::make_unique<Context>();
-  first->result = cache.CreateTransaction(&first->trans);
-  ASSERT_THAT(first->result, IsOk());
+  first->trans = cache.CreateTransaction();
+  ASSERT_TRUE(first->trans);
   EXPECT_EQ(LOAD_STATE_IDLE, first->trans->GetLoadState());
   first->result = first->trans->Start(&request, first->callback.callback(),
                                       NetLogWithSource());
@@ -13021,8 +13010,8 @@
 
   // Let us create the second (read) transaction.
   auto second = std::make_unique<Context>();
-  second->result = cache.CreateTransaction(&second->trans);
-  ASSERT_THAT(second->result, IsOk());
+  second->trans = cache.CreateTransaction();
+  ASSERT_TRUE(second->trans);
   EXPECT_EQ(LOAD_STATE_IDLE, second->trans->GetLoadState());
   second->result = second->trans->Start(&request, second->callback.callback(),
                                         NetLogWithSource());
@@ -14312,9 +14301,7 @@
 
   auto create_and_start_transaction = [&](MockHttpRequest& request,
                                           TestCompletionCallback& callback) {
-    std::unique_ptr<HttpTransaction> transaction;
-    EXPECT_THAT(cache()->CreateTransaction(DEFAULT_PRIORITY, &transaction),
-                IsOk());
+    auto transaction = cache()->CreateTransaction(DEFAULT_PRIORITY);
     EXPECT_TRUE(transaction);
     // Avoid crashing even if CreateTransaction() failed for some reason.
     // ASSERT_TRUE() cannot be used here because the lambda doesn't return
diff --git a/net/http/http_cache_writers_unittest.cc b/net/http/http_cache_writers_unittest.cc
index a7c4cad..97d44536 100644
--- a/net/http/http_cache_writers_unittest.cc
+++ b/net/http/http_cache_writers_unittest.cc
@@ -114,10 +114,8 @@
   }
 
   std::unique_ptr<HttpTransaction> CreateNetworkTransaction() {
-    std::unique_ptr<HttpTransaction> transaction;
     MockNetworkLayer* network_layer = cache_.network_layer();
-    network_layer->CreateTransaction(DEFAULT_PRIORITY, &transaction);
-    return transaction;
+    return network_layer->CreateTransaction(DEFAULT_PRIORITY);
   }
 
   void CreateWritersAddTransaction(
diff --git a/net/http/http_network_layer.cc b/net/http/http_network_layer.cc
index d8878fad..0a5569dd 100644
--- a/net/http/http_network_layer.cc
+++ b/net/http/http_network_layer.cc
@@ -6,45 +6,22 @@
 
 #include <memory>
 
-#include "base/check_op.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "net/http/http_network_session.h"
 #include "net/http/http_network_transaction.h"
-#include "net/http/http_server_properties.h"
-#include "net/http/http_stream_factory_job.h"
-#include "net/spdy/spdy_session.h"
-#include "net/spdy/spdy_session_pool.h"
-#include "net/third_party/quiche/src/quiche/http2/core/spdy_framer.h"
 
 namespace net {
 
 HttpNetworkLayer::HttpNetworkLayer(HttpNetworkSession* session)
     : session_(session) {
   DCHECK(session_);
-#if BUILDFLAG(IS_WIN)
-  base::PowerMonitor::GetInstance()->AddPowerSuspendObserver(this);
-#endif
 }
 
 HttpNetworkLayer::~HttpNetworkLayer() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-#if BUILDFLAG(IS_WIN)
-  base::PowerMonitor::GetInstance()->RemovePowerSuspendObserver(this);
-#endif
 }
 
-int HttpNetworkLayer::CreateTransaction(
-    RequestPriority priority,
-    std::unique_ptr<HttpTransaction>* trans) {
-  if (suspended_)
-    return ERR_NETWORK_IO_SUSPENDED;
-
-  *trans = std::make_unique<HttpNetworkTransaction>(priority, GetSession());
-  return OK;
+std::unique_ptr<HttpTransaction> HttpNetworkLayer::CreateTransaction(
+    RequestPriority priority) {
+  return std::make_unique<HttpNetworkTransaction>(priority, GetSession());
 }
 
 HttpCache* HttpNetworkLayer::GetCache() {
@@ -55,13 +32,4 @@
   return session_;
 }
 
-void HttpNetworkLayer::OnSuspend() {
-  suspended_ = true;
-  session_->CloseIdleConnections("Entering suspend mode");
-}
-
-void HttpNetworkLayer::OnResume() {
-  suspended_ = false;
-}
-
 }  // namespace net
diff --git a/net/http/http_network_layer.h b/net/http/http_network_layer.h
index 4d0eccbe..fb9aab8 100644
--- a/net/http/http_network_layer.h
+++ b/net/http/http_network_layer.h
@@ -7,9 +7,7 @@
 
 #include <memory>
 
-#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
-#include "base/power_monitor/power_observer.h"
 #include "base/threading/thread_checker.h"
 #include "net/base/net_export.h"
 #include "net/http/http_transaction_factory.h"
@@ -18,8 +16,7 @@
 
 class HttpNetworkSession;
 
-class NET_EXPORT HttpNetworkLayer : public HttpTransactionFactory,
-                                    public base::PowerSuspendObserver {
+class NET_EXPORT HttpNetworkLayer : public HttpTransactionFactory {
  public:
   // Construct a HttpNetworkLayer with an existing HttpNetworkSession which
   // contains a valid ProxyResolutionService. The HttpNetworkLayer must be
@@ -32,18 +29,13 @@
   ~HttpNetworkLayer() override;
 
   // HttpTransactionFactory methods:
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* trans) override;
+  std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) override;
   HttpCache* GetCache() override;
   HttpNetworkSession* GetSession() override;
 
-  // base::PowerSuspendObserver methods:
-  void OnSuspend() override;
-  void OnResume() override;
-
  private:
   const raw_ptr<HttpNetworkSession> session_;
-  bool suspended_ = false;
 
   THREAD_CHECKER(thread_checker_);
 };
diff --git a/net/http/http_network_layer_unittest.cc b/net/http/http_network_layer_unittest.cc
index ebfb7bf..f427822 100644
--- a/net/http/http_network_layer_unittest.cc
+++ b/net/http/http_network_layer_unittest.cc
@@ -83,30 +83,29 @@
 };
 
 TEST_F(HttpNetworkLayerTest, CreateAndDestroy) {
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
-  EXPECT_TRUE(trans.get() != nullptr);
+  auto trans = factory_->CreateTransaction(DEFAULT_PRIORITY);
+  EXPECT_TRUE(trans);
 }
 
 TEST_F(HttpNetworkLayerTest, Suspend) {
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  TestCompletionCallback callback;
 
-  trans.reset();
+  HttpRequestInfo request_info;
+  request_info.url = GURL("http://www.google.com/");
+  request_info.method = "GET";
+  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
+                                       "Foo/1.0");
+  request_info.load_flags = LOAD_NORMAL;
+  request_info.traffic_annotation =
+      MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
 
-  factory_->OnSuspend();
+  std::unique_ptr<HttpTransaction> trans =
+      factory_->CreateTransaction(DEFAULT_PRIORITY);
+  ASSERT_TRUE(trans);
+  factory_->GetSession()->OnSuspend();
 
-  rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
+  int rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_NETWORK_IO_SUSPENDED));
-
-  ASSERT_TRUE(trans == nullptr);
-
-  factory_->OnResume();
-
-  rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
 }
 
 TEST_F(HttpNetworkLayerTest, GET) {
@@ -135,11 +134,11 @@
   request_info.traffic_annotation =
       MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
 
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      factory_->CreateTransaction(DEFAULT_PRIORITY);
+  ASSERT_TRUE(trans);
 
-  rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
+  int rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
   rv = callback.GetResult(rv);
   ASSERT_THAT(rv, IsOk());
 
@@ -175,11 +174,11 @@
   request_info.traffic_annotation =
       MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
 
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      factory_->CreateTransaction(DEFAULT_PRIORITY);
+  ASSERT_TRUE(trans);
 
-  rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
+  int rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
   ASSERT_THAT(callback.GetResult(rv), IsOk());
 
   EXPECT_TRUE(trans->GetResponseInfo()->network_accessed);
@@ -209,11 +208,11 @@
   request_info.traffic_annotation =
       MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
 
-  std::unique_ptr<HttpTransaction> trans;
-  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
-  EXPECT_THAT(rv, IsOk());
+  std::unique_ptr<HttpTransaction> trans =
+      factory_->CreateTransaction(DEFAULT_PRIORITY);
+  ASSERT_TRUE(trans);
 
-  rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
+  int rv = trans->Start(&request_info, callback.callback(), NetLogWithSource());
   ASSERT_THAT(callback.GetResult(rv), IsError(ERR_CONNECTION_RESET));
 
   // network_accessed is true; the HTTP stack did try to make a connection.
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index dc40618..af996d2 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -14,6 +14,7 @@
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
 #include "base/notreached.h"
+#include "base/power_monitor/power_monitor.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
@@ -237,10 +238,16 @@
   http_stream_pool_ = std::make_unique<HttpStreamPool>(
       this,
       /*cleanup_on_ip_address_change=*/!params.ignore_ip_address_changes);
+#if BUILDFLAG(IS_WIN)
+  base::PowerMonitor::GetInstance()->AddPowerSuspendObserver(this);
+#endif
 }
 
 HttpNetworkSession::~HttpNetworkSession() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+#if BUILDFLAG(IS_WIN)
+  base::PowerMonitor::GetInstance()->RemovePowerSuspendObserver(this);
+#endif
   if (http_stream_pool_) {
     http_stream_pool_->OnShuttingDown();
   }
@@ -464,4 +471,13 @@
   }
 }
 
+void HttpNetworkSession::OnSuspend() {
+  power_suspended_ = true;
+  CloseIdleConnections("Entering suspend mode");
+}
+
+void HttpNetworkSession::OnResume() {
+  power_suspended_ = false;
+}
+
 }  // namespace net
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 3a3b1f5..a68f6817 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -22,6 +22,7 @@
 #include "base/memory/memory_pressure_monitor.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/power_monitor/power_observer.h"
 #include "base/threading/thread_checker.h"
 #include "base/values.h"
 #include "build/buildflag.h"
@@ -208,7 +209,7 @@
 };
 
 // This class holds session objects used by HttpNetworkTransaction objects.
-class NET_EXPORT HttpNetworkSession {
+class NET_EXPORT HttpNetworkSession : public base::PowerSuspendObserver {
  public:
   enum SocketPoolType {
     NORMAL_SOCKET_POOL,
@@ -218,7 +219,11 @@
 
   HttpNetworkSession(const HttpNetworkSessionParams& params,
                      const HttpNetworkSessionContext& context);
-  ~HttpNetworkSession();
+  ~HttpNetworkSession() override;
+
+  // base::PowerSuspendObserver methods:
+  void OnSuspend() override;
+  void OnResume() override;
 
   HttpAuthCache* http_auth_cache() { return &http_auth_cache_; }
   SSLClientContext* ssl_client_context() { return &ssl_client_context_; }
@@ -317,6 +322,8 @@
   // Rewrite the port of `endpoint` when testing fixed port is specified.
   void ApplyTestingFixedPort(url::SchemeHostPort& endpoint) const;
 
+  bool power_suspended() const { return power_suspended_; }
+
  private:
   friend class HttpNetworkSessionPeer;
 
@@ -366,6 +373,8 @@
 
   std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
 
+  bool power_suspended_ = false;
+
   THREAD_CHECKER(thread_checker_);
 };
 
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 3ce8f81..1d1faf16 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -4,6 +4,8 @@
 
 #include "net/http/http_network_transaction.h"
 
+#include <deque>
+#include <queue>
 #include <set>
 #include <utility>
 #include <vector>
@@ -22,6 +24,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "net/base/address_family.h"
@@ -76,6 +79,7 @@
 #include "net/ssl/ssl_connection_status_flags.h"
 #include "net/ssl/ssl_info.h"
 #include "net/ssl/ssl_private_key.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 #include "url/scheme_host_port.h"
@@ -164,6 +168,156 @@
                                        connection_info));
 }
 
+// TODO(https://crbug.com/413557424): Remove DuplicateRequestLogger, calling
+// code, feature, and histograms once investigation is complete.
+
+// Tracks all the URLs requested in the last 10 seconds and emit an histogram if
+// any of them are repeated.
+class DuplicateRequestLogger final {
+ public:
+  DuplicateRequestLogger() = default;
+
+  DuplicateRequestLogger(const DuplicateRequestLogger&) = delete;
+  DuplicateRequestLogger& operator=(const DuplicateRequestLogger&) = delete;
+
+  // Adds `url` to the queue of recent requests. If it was already added within
+  // the last 10 seconds, log a histogram.
+  void AddAndMaybeLogRequest(const GURL& url, bool is_main_frame_navigation) {
+    if (!expiry_timer_.IsRunning()) {
+      StartTimer();
+    }
+    auto now = base::TimeTicks::Now();
+    Entry& entry = entry_queue_.emplace(now, url);
+    auto [hash_it, was_inserted] =
+        entry_map_.try_emplace(entry.url.possibly_invalid_spec(), &entry);
+    if (was_inserted) {
+      // No existing match was found.
+      return;
+    }
+
+    // There was a matching URL.
+    auto [_, old_entry_ptr] = *hash_it;
+    auto elapsed = now - old_entry_ptr->added_time;
+    if (elapsed <= kMaximumDetectionInterval) {
+      static constexpr std::string_view kBaseHistogramName =
+          "Net.NetworkTransaction.DuplicateRequestInterval";
+      DVLOG(3) << "Duplicate request for " << url << " after " << elapsed;
+      base::UmaHistogramTimes(kBaseHistogramName, elapsed);
+      if (is_main_frame_navigation) {
+        base::UmaHistogramTimes(
+            base::JoinString({kBaseHistogramName, "MainFrame"}, "."), elapsed);
+      }
+      if (IsGoogleHostWithAlpnH3(url.host_piece())) {
+        base::UmaHistogramTimes(
+            base::JoinString({kBaseHistogramName, "GoogleHost"}, "."), elapsed);
+        if (is_main_frame_navigation) {
+          base::UmaHistogramTimes(
+              base::JoinString({kBaseHistogramName, "GoogleHost", "MainFrame"},
+                               "."),
+              elapsed);
+        }
+      }
+    }
+
+    // Replace the entry. It is not sufficient just to assign it, because we
+    // need to change which string backs the string_view key.
+    entry_map_.erase(hash_it);
+    auto [ignored_it, emplace_succeeded] =
+        entry_map_.emplace(entry.url.possibly_invalid_spec(), &entry);
+    std::ignore = ignored_it;
+    CHECK(emplace_succeeded);
+  }
+
+ private:
+  // The maximum length of time between duplicate requests that will allow
+  // them to be logged.
+  static constexpr base::TimeDelta kMaximumDetectionInterval =
+      base::Seconds(10);
+
+  // The maximum time to wait between adding an entry to the queue and
+  // removing it again. By making this larger than kMaximumDetectionPeriod we
+  // can enable entries to be cleaned up in batches for greater efficiency.
+  static constexpr base::TimeDelta kCleanupInterval =
+      kMaximumDetectionInterval * 2;
+
+  struct Entry {
+    base::TimeTicks added_time;
+    GURL url;
+  };
+
+  // Starts `expiry_timer_`, setting up the callback on the first call.
+  void StartTimer() {
+    if (expiry_timer_.user_task().is_null()) {
+      // We need to set the callback on the first call. This use of
+      // base::Unretained() is safe because the callback will not be called
+      // after `expiry_timer_` is destroyed, and it is owned by this object.
+      expiry_timer_.Start(
+          FROM_HERE, kCleanupInterval,
+          base::BindRepeating(&DuplicateRequestLogger::OnExpiryTimer,
+                              base::Unretained(this)));
+    } else {
+      // Avoid calling Bind() again.
+      expiry_timer_.Reset();
+    }
+  }
+
+  // Cleans up old entries in `entry_queue_` and `entry_map_`.
+  void OnExpiryTimer() {
+    base::TimeTicks expiry_threshold =
+        base::TimeTicks::Now() - kMaximumDetectionInterval;
+    while (!entry_queue_.empty() &&
+           entry_queue_.front().added_time < expiry_threshold) {
+      const Entry& entry = entry_queue_.front();
+      auto it = entry_map_.find(entry.url.possibly_invalid_spec());
+      CHECK(it != entry_map_.end());
+      auto [key, entry_ptr] = *it;
+      CHECK(KeyUsesCorrectBackingStore(key, entry_ptr));
+      if (entry_ptr == &entry) {
+        entry_map_.erase(it);
+      }
+      entry_queue_.pop();
+    }
+    if (!entry_queue_.empty()) {
+      expiry_timer_.Reset();
+    }
+  }
+
+  // Keys in `entry_map_` must always be backed by a string owned by the value.
+  // This method checks that invariant.
+  bool KeyUsesCorrectBackingStore(std::string_view key, Entry* value) {
+    return key.data() == value->url.possibly_invalid_spec().data();
+  }
+
+  // `entry_queue_` is a std::deque and not a base::circular_deque because it
+  // requires pointer stability.
+  std::queue<Entry, std::deque<Entry>> entry_queue_;
+
+  // To avoid keeping duplicate strings in memory, the map from URL to Entry
+  // uses a string_view key. The keys in `entry_map_` point to memory owned by
+  // `entry_queue_`, so Entry objects in `entry_queue_` must always be inserted
+  // before `entry_map_` and removed afterwards. The backing storage for the key
+  // must always belong to the Entry pointed to by the value.
+  absl::flat_hash_map<std::string_view, raw_ptr<Entry>> entry_map_;
+
+  // The timer only runs when `entry_queue_` is non-empty.
+  base::RetainingOneShotTimer expiry_timer_;
+};
+
+// If an identical URL to `url` has been requested in the last 10 seconds,
+// record the time passed since it was last seen to the
+// "Net.NetworkTransaction.DuplicateRequestInterval" histogram.
+void LogIfDuplicateRequest(const GURL& url, bool is_main_frame_navigation) {
+  static base::NoDestructor<DuplicateRequestLogger> logger_;
+  logger_->AddAndMaybeLogRequest(url, is_main_frame_navigation);
+}
+
+// When this feature is enabled, GET requests with identical URLs within 10
+// seconds will result in the Net.NetworkTransaction.DuplicateRequestInterval
+// histogram being recorded.
+BASE_FEATURE(kLogDuplicateRequests,
+             "LogDuplicateRequests",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace
 
 const int HttpNetworkTransaction::kDrainBodyBufferSize;
@@ -208,8 +362,13 @@
   TRACE_EVENT("net", "HttpNetworkTransaction::Start",
               NetLogWithSourceToFlow(net_log), "url", request_info->url);
 
-  if (request_info->load_flags & LOAD_ONLY_FROM_CACHE)
+  if (session_->power_suspended()) {
+    return ERR_NETWORK_IO_SUSPENDED;
+  }
+
+  if (request_info->load_flags & LOAD_ONLY_FROM_CACHE) {
     return ERR_CACHE_MISS;
+  }
 
   DCHECK(request_info->traffic_annotation.is_valid());
   DCHECK(request_info->IsConsistent());
@@ -992,7 +1151,7 @@
             {"Net.NetworkTransaction.Create",
              (ForWebSocketHandshake() ? "WebSocketStreamTime."
                                       : "HttpStreamTime."),
-             (IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ""),
+             (IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ""),
              NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
         create_stream_end_time_ - create_stream_start_time_);
     if (!reset_connection_and_request_for_resend_start_time_.is_null()) {
@@ -1032,9 +1191,10 @@
     blocked_initialize_stream_start_time_ = initialize_stream_start_time_;
   }
   base::UmaHistogramBoolean(
-      base::StrCat({"Net.NetworkTransaction.InitializeStreamBlocked",
-                    IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".",
-                    NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
+      base::StrCat(
+          {"Net.NetworkTransaction.InitializeStreamBlocked",
+           IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".",
+           NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
       blocked);
   return rv;
 }
@@ -1050,7 +1210,7 @@
     base::UmaHistogramTimes(
         base::StrCat(
             {"Net.NetworkTransaction.InitializeStreamBlockTime",
-             IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".",
+             IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".",
              NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
         initialize_stream_end_time_ - blocked_initialize_stream_start_time_);
   }
@@ -1160,9 +1320,10 @@
     blocked_generate_proxy_auth_token_start_time_ = base::TimeTicks::Now();
   }
   base::UmaHistogramBoolean(
-      base::StrCat({"Net.NetworkTransaction.GenerateProxyAuthTokenBlocked",
-                    IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".",
-                    NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
+      base::StrCat(
+          {"Net.NetworkTransaction.GenerateProxyAuthTokenBlocked",
+           IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".",
+           NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
       blocked);
   return rv;
 }
@@ -1175,7 +1336,7 @@
     base::UmaHistogramTimes(
         base::StrCat(
             {"Net.NetworkTransaction.GenerateProxyAuthTokenBlockTime",
-             IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".",
+             IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".",
              NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
         base::TimeTicks::Now() - blocked_generate_proxy_auth_token_start_time_);
   }
@@ -1206,9 +1367,10 @@
     blocked_generate_server_auth_token_start_time_ = base::TimeTicks::Now();
   }
   base::UmaHistogramBoolean(
-      base::StrCat({"Net.NetworkTransaction.GenerateServerAuthTokenBlocked",
-                    IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".",
-                    NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
+      base::StrCat(
+          {"Net.NetworkTransaction.GenerateServerAuthTokenBlocked",
+           IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".",
+           NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
       blocked);
   return rv;
 }
@@ -1221,7 +1383,7 @@
     base::UmaHistogramTimes(
         base::StrCat(
             {"Net.NetworkTransaction.GenerateServerAuthTokenBlockTime",
-             IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".",
+             IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".",
              NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}),
         base::TimeTicks::Now() -
             blocked_generate_server_auth_token_start_time_);
@@ -1364,6 +1526,11 @@
   send_start_time_ = base::TimeTicks::Now();
   next_state_ = STATE_SEND_REQUEST_COMPLETE;
 
+  if (base::FeatureList::IsEnabled(kLogDuplicateRequests) &&
+      request_->method == "GET") {
+    LogIfDuplicateRequest(request_->url, request_->is_main_frame_navigation);
+  }
+
   stream_->SetRequestIdempotency(request_->idempotency);
   return stream_->SendRequest(request_headers_, &response_, io_callback_);
 }
@@ -2121,7 +2288,7 @@
   // TODO:(crbug.com/1495705): Remove this CHECK after fixing the bug.
   CHECK(request_);
   base::UmaHistogramEnumeration(
-      IsGoogleHostWithAlpnH3(url_.host())
+      IsGoogleHostWithAlpnH3(url_.host_piece())
           ? "Net.NetworkTransactionH3SupportedGoogleHost.RetryReason"
           : "Net.NetworkTransaction.RetryReason",
       retry_reason);
@@ -2286,9 +2453,10 @@
   if (num_restarts_ == 0) {
     base::TimeDelta elapsed = base::TimeTicks::Now() - start_timeticks_;
     base::UmaHistogramTimes(
-        base::StrCat({"Net.NetworkTransaction.StreamRequestCompleteTime.",
-                      IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : "",
-                      result == OK ? "Success" : "Failure"}),
+        base::StrCat(
+            {"Net.NetworkTransaction.StreamRequestCompleteTime.",
+             IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : "",
+             result == OK ? "Success" : "Failure"}),
         elapsed);
   }
 
@@ -2296,7 +2464,7 @@
     base::UmaHistogramEnumeration(
         base::StrCat({
             "Net.NetworkTransaction.NegotiatedProtocol.",
-            IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : "",
+            IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : "",
         }),
         negotiated_protocol_);
 
diff --git a/net/http/http_transaction_factory.h b/net/http/http_transaction_factory.h
index a9cfbc4..213f665 100644
--- a/net/http/http_transaction_factory.h
+++ b/net/http/http_transaction_factory.h
@@ -21,10 +21,9 @@
  public:
   virtual ~HttpTransactionFactory() = default;
 
-  // Creates a HttpTransaction object. On success, saves the new
-  // transaction to |*trans| and returns OK.
-  virtual int CreateTransaction(RequestPriority priority,
-                                std::unique_ptr<HttpTransaction>* trans) = 0;
+  // Creates a HttpTransaction object.
+  virtual std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) = 0;
 
   // Returns the associated cache if any (may be NULL).
   virtual HttpCache* GetCache() = 0;
diff --git a/net/http/http_transaction_test_util.cc b/net/http/http_transaction_test_util.cc
index d5dc49d..1ef7c21 100644
--- a/net/http/http_transaction_test_util.cc
+++ b/net/http/http_transaction_test_util.cc
@@ -257,10 +257,8 @@
 
 TestTransactionConsumer::TestTransactionConsumer(
     RequestPriority priority,
-    HttpTransactionFactory* factory) {
-  // Disregard the error code.
-  factory->CreateTransaction(priority, &trans_);
-}
+    HttpTransactionFactory* factory)
+    : trans_(factory->CreateTransaction(priority)) {}
 
 TestTransactionConsumer::~TestTransactionConsumer() = default;
 
@@ -785,16 +783,14 @@
   transaction_count_ = 0;
 }
 
-int MockNetworkLayer::CreateTransaction(
-    RequestPriority priority,
-    std::unique_ptr<HttpTransaction>* trans) {
+std::unique_ptr<HttpTransaction> MockNetworkLayer::CreateTransaction(
+    RequestPriority priority) {
   transaction_count_++;
   last_create_transaction_priority_ = priority;
   auto mock_transaction =
       std::make_unique<MockNetworkTransaction>(priority, this);
   last_transaction_ = mock_transaction->AsWeakPtr();
-  *trans = std::move(mock_transaction);
-  return OK;
+  return std::move(mock_transaction);
 }
 
 HttpCache* MockNetworkLayer::GetCache() {
diff --git a/net/http/http_transaction_test_util.h b/net/http/http_transaction_test_util.h
index 0ce00a9..8f3383f4 100644
--- a/net/http/http_transaction_test_util.h
+++ b/net/http/http_transaction_test_util.h
@@ -381,8 +381,8 @@
   }
 
   // HttpTransactionFactory:
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* trans) override;
+  std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) override;
   HttpCache* GetCache() override;
   HttpNetworkSession* GetSession() override;
 
diff --git a/net/http/http_transaction_test_util_unittest.cc b/net/http/http_transaction_test_util_unittest.cc
index 4a1ed47..a1be53c 100644
--- a/net/http/http_transaction_test_util_unittest.cc
+++ b/net/http/http_transaction_test_util_unittest.cc
@@ -61,9 +61,7 @@
 
  protected:
   std::unique_ptr<HttpTransaction> CreateNetworkTransaction() {
-    std::unique_ptr<HttpTransaction> network_transaction;
-    network_layer_->CreateTransaction(DEFAULT_PRIORITY, &network_transaction);
-    return network_transaction;
+    return network_layer_->CreateTransaction(DEFAULT_PRIORITY);
   }
 
   void RunUntilIdle() { task_environment_.RunUntilIdle(); }
diff --git a/net/http/mock_http_cache.cc b/net/http/mock_http_cache.cc
index 69b386e..ed49910 100644
--- a/net/http/mock_http_cache.cc
+++ b/net/http/mock_http_cache.cc
@@ -730,8 +730,8 @@
   return static_cast<MockDiskCache*>(backend());
 }
 
-int MockHttpCache::CreateTransaction(std::unique_ptr<HttpTransaction>* trans) {
-  return http_cache_.CreateTransaction(DEFAULT_PRIORITY, trans);
+std::unique_ptr<HttpTransaction> MockHttpCache::CreateTransaction() {
+  return http_cache_.CreateTransaction(DEFAULT_PRIORITY);
 }
 
 void MockHttpCache::SimulateCacheLockTimeout() {
diff --git a/net/http/mock_http_cache.h b/net/http/mock_http_cache.h
index dc406eb..9192cf0 100644
--- a/net/http/mock_http_cache.h
+++ b/net/http/mock_http_cache.h
@@ -302,8 +302,8 @@
   disk_cache::Backend* backend();
   MockDiskCache* disk_cache();
 
-  // Wrapper around http_cache()->CreateTransaction(DEFAULT_PRIORITY...)
-  int CreateTransaction(std::unique_ptr<HttpTransaction>* trans);
+  // Wrapper around http_cache()->CreateTransaction(DEFAULT_PRIORITY)
+  std::unique_ptr<HttpTransaction> CreateTransaction();
 
   // Wrapper to simulate cache lock timeout for new transactions.
   void SimulateCacheLockTimeout();
diff --git a/net/quic/quic_end_to_end_unittest.cc b/net/quic/quic_end_to_end_unittest.cc
index 2099141..069c112 100644
--- a/net/quic/quic_end_to_end_unittest.cc
+++ b/net/quic/quic_end_to_end_unittest.cc
@@ -72,10 +72,9 @@
   ~TestTransactionFactory() override = default;
 
   // HttpTransactionFactory methods
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* trans) override {
-    *trans = std::make_unique<HttpNetworkTransaction>(priority, session_.get());
-    return OK;
+  std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) override {
+    return std::make_unique<HttpNetworkTransaction>(priority, session_.get());
   }
 
   HttpCache* GetCache() override { return nullptr; }
diff --git a/net/shared_dictionary/shared_dictionary_network_transaction_factory.cc b/net/shared_dictionary/shared_dictionary_network_transaction_factory.cc
index b092215..66b4a91 100644
--- a/net/shared_dictionary/shared_dictionary_network_transaction_factory.cc
+++ b/net/shared_dictionary/shared_dictionary_network_transaction_factory.cc
@@ -19,17 +19,11 @@
 SharedDictionaryNetworkTransactionFactory::
     ~SharedDictionaryNetworkTransactionFactory() = default;
 
-int SharedDictionaryNetworkTransactionFactory::CreateTransaction(
-    RequestPriority priority,
-    std::unique_ptr<HttpTransaction>* trans) {
-  std::unique_ptr<HttpTransaction> network_transaction;
-  int rv = network_layer_->CreateTransaction(priority, &network_transaction);
-  if (rv != OK) {
-    return rv;
-  }
-  *trans = std::make_unique<SharedDictionaryNetworkTransaction>(
-      std::move(network_transaction), enable_shared_zstd_);
-  return OK;
+std::unique_ptr<HttpTransaction>
+SharedDictionaryNetworkTransactionFactory::CreateTransaction(
+    RequestPriority priority) {
+  return std::make_unique<SharedDictionaryNetworkTransaction>(
+      network_layer_->CreateTransaction(priority), enable_shared_zstd_);
 }
 
 HttpCache* SharedDictionaryNetworkTransactionFactory::GetCache() {
diff --git a/net/shared_dictionary/shared_dictionary_network_transaction_factory.h b/net/shared_dictionary/shared_dictionary_network_transaction_factory.h
index 7180661..ce1d1a3 100644
--- a/net/shared_dictionary/shared_dictionary_network_transaction_factory.h
+++ b/net/shared_dictionary/shared_dictionary_network_transaction_factory.h
@@ -27,8 +27,8 @@
   ~SharedDictionaryNetworkTransactionFactory() override;
 
   // HttpTransactionFactory methods:
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* trans) override;
+  std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) override;
   HttpCache* GetCache() override;
   HttpNetworkSession* GetSession() override;
 
diff --git a/net/shared_dictionary/shared_dictionary_network_transaction_factory_unittest.cc b/net/shared_dictionary/shared_dictionary_network_transaction_factory_unittest.cc
index 63386dc..02f09d0 100644
--- a/net/shared_dictionary/shared_dictionary_network_transaction_factory_unittest.cc
+++ b/net/shared_dictionary/shared_dictionary_network_transaction_factory_unittest.cc
@@ -24,13 +24,10 @@
   ~DummyHttpTransactionFactory() override = default;
 
   // HttpTransactionFactory methods:
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* trans) override {
+  std::unique_ptr<HttpTransaction> CreateTransaction(
+      RequestPriority priority) override {
     create_transaction_called_ = true;
-    if (is_broken_) {
-      return ERR_FAILED;
-    }
-    return network_layer_->CreateTransaction(priority, trans);
+    return network_layer_->CreateTransaction(priority);
   }
   HttpCache* GetCache() override {
     get_cache_called_ = true;
@@ -41,13 +38,11 @@
     return network_layer_->GetSession();
   }
 
-  void set_is_broken() { is_broken_ = true; }
   bool create_transaction_called() const { return create_transaction_called_; }
   bool get_cache_called() const { return get_cache_called_; }
   bool get_session_called() const { return get_session_called_; }
 
  private:
-  bool is_broken_ = false;
   bool create_transaction_called_ = false;
   bool get_cache_called_ = false;
   bool get_session_called_ = false;
@@ -62,24 +57,11 @@
                                                 /*enable_shared_zstd=*/true);
   std::unique_ptr<HttpTransaction> transaction;
   EXPECT_FALSE(dummy_factory_ptr->create_transaction_called());
-  EXPECT_EQ(OK, factory.CreateTransaction(DEFAULT_PRIORITY, &transaction));
+  transaction = factory.CreateTransaction(DEFAULT_PRIORITY);
   EXPECT_TRUE(dummy_factory_ptr->create_transaction_called());
   EXPECT_TRUE(transaction);
 }
 
-TEST(SharedDictionaryNetworkTransactionFactoryTest, CreateTransactionFailure) {
-  auto dummy_factory = std::make_unique<DummyHttpTransactionFactory>();
-  DummyHttpTransactionFactory* dummy_factory_ptr = dummy_factory.get();
-  SharedDictionaryNetworkTransactionFactory factory =
-      SharedDictionaryNetworkTransactionFactory(std::move(dummy_factory),
-                                                /*enable_shared_zstd=*/true);
-  dummy_factory_ptr->set_is_broken();
-  std::unique_ptr<HttpTransaction> transaction;
-  EXPECT_EQ(ERR_FAILED,
-            factory.CreateTransaction(DEFAULT_PRIORITY, &transaction));
-  EXPECT_FALSE(transaction);
-}
-
 TEST(SharedDictionaryNetworkTransactionFactoryTest, GetCache) {
   auto dummy_factory = std::make_unique<DummyHttpTransactionFactory>();
   DummyHttpTransactionFactory* dummy_factory_ptr = dummy_factory.get();
diff --git a/net/shared_dictionary/shared_dictionary_network_transaction_unittest.cc b/net/shared_dictionary/shared_dictionary_network_transaction_unittest.cc
index 50eb106..d3c99ba 100644
--- a/net/shared_dictionary/shared_dictionary_network_transaction_unittest.cc
+++ b/net/shared_dictionary/shared_dictionary_network_transaction_unittest.cc
@@ -240,9 +240,7 @@
 
  protected:
   std::unique_ptr<HttpTransaction> CreateNetworkTransaction() {
-    std::unique_ptr<HttpTransaction> network_transaction;
-    network_layer_->CreateTransaction(DEFAULT_PRIORITY, &network_transaction);
-    return network_transaction;
+    return network_layer_->CreateTransaction(DEFAULT_PRIORITY);
   }
 
   void RunUntilIdle() { task_environment_.RunUntilIdle(); }
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 3e68930..8781f09 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -702,7 +702,7 @@
   // If we already have a transaction, then we should restart the transaction
   // with auth provided by auth_credentials_.
 
-  int rv;
+  int rv = OK;
 
   // Notify NetworkQualityEstimator.
   NetworkQualityEstimator* network_quality_estimator =
@@ -717,11 +717,12 @@
     auth_credentials_ = AuthCredentials();
   } else {
     DCHECK(request_->context()->http_transaction_factory());
+    transaction_ =
+        request_->context()->http_transaction_factory()->CreateTransaction(
+            priority_);
+    CHECK(transaction_);
 
-    rv = request_->context()->http_transaction_factory()->CreateTransaction(
-        priority_, &transaction_);
-
-    if (rv == OK && request_info_.url.SchemeIsWSOrWSS()) {
+    if (request_info_.url.SchemeIsWSOrWSS()) {
       base::SupportsUserData::Data* data =
           request_->GetUserData(kWebSocketHandshakeUserDataKey);
       if (data) {
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index b2450ed..00a5057 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -8785,14 +8785,14 @@
 }
 
 // Check that creating a network request while entering/exiting suspend mode
-// fails as it should.  This is the only case where an HttpTransactionFactory
-// does not return an HttpTransaction.
+// fails as it should.  This is the only case where an HttpTransaction fails
+// with ERR_NETWORK_IO_SUSPENDED error.
 TEST_F(URLRequestTestHTTP, NetworkSuspendTest) {
   auto context_builder = CreateTestURLRequestContextBuilder();
   context_builder->SetWrapHttpNetworkLayerCallback(
       base::BindOnce([](std::unique_ptr<HttpNetworkLayer> network_layer) {
         // Make the HttpNetworkLayer think it's suspended.
-        network_layer->OnSuspend();
+        network_layer->GetSession()->OnSuspend();
         std::unique_ptr<HttpTransactionFactory> factory =
             std::make_unique<HttpCache>(std::move(network_layer),
                                         HttpCache::DefaultBackend::InMemory(0),
@@ -8812,81 +8812,6 @@
   EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, d.request_status());
 }
 
-namespace {
-
-// HttpTransactionFactory that synchronously fails to create transactions.
-class FailingHttpTransactionFactory : public HttpTransactionFactory {
- public:
-  explicit FailingHttpTransactionFactory(
-      std::unique_ptr<HttpTransactionFactory> network_layer)
-      : network_layer_(std::move(network_layer)) {}
-
-  FailingHttpTransactionFactory(const FailingHttpTransactionFactory&) = delete;
-  FailingHttpTransactionFactory& operator=(
-      const FailingHttpTransactionFactory&) = delete;
-
-  ~FailingHttpTransactionFactory() override = default;
-
-  // HttpTransactionFactory methods:
-  int CreateTransaction(RequestPriority priority,
-                        std::unique_ptr<HttpTransaction>* trans) override {
-    return ERR_FAILED;
-  }
-
-  HttpCache* GetCache() override { return nullptr; }
-
-  HttpNetworkSession* GetSession() override {
-    return network_layer_->GetSession();
-  }
-
- private:
-  std::unique_ptr<HttpTransactionFactory> network_layer_;
-};
-
-}  // namespace
-
-// Check that when a request that fails to create an HttpTransaction can be
-// cancelled while the failure notification is pending, and doesn't send two
-// failure notifications.
-//
-// This currently only happens when in suspend mode and there's no cache, but
-// just use a special HttpTransactionFactory, to avoid depending on those
-// behaviors.
-TEST_F(URLRequestTestHTTP, NetworkCancelAfterCreateTransactionFailsTest) {
-  auto context_builder = CreateTestURLRequestContextBuilder();
-  context_builder->SetWrapHttpNetworkLayerCallback(
-      base::BindOnce([](std::unique_ptr<HttpNetworkLayer> network_layer) {
-        std::unique_ptr<HttpTransactionFactory> factory =
-            std::make_unique<FailingHttpTransactionFactory>(
-                std::move(network_layer));
-        return factory;
-      }));
-  auto& network_delegate = *context_builder->set_network_delegate(
-      std::make_unique<TestNetworkDelegate>());
-  auto context = context_builder->Build();
-
-  TestDelegate d;
-  std::unique_ptr<URLRequest> req(
-      context->CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
-                             TRAFFIC_ANNOTATION_FOR_TESTS));
-  // Don't send cookies (Collecting cookies is asynchronous, and need request to
-  // try to create an HttpNetworkTransaction synchronously on start).
-  req->set_allow_credentials(false);
-  req->Start();
-  req->Cancel();
-  d.RunUntilComplete();
-  // Run pending error task, if there is one.
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(d.request_failed());
-  EXPECT_EQ(1, d.response_started_count());
-  EXPECT_EQ(ERR_ABORTED, d.request_status());
-
-  // NetworkDelegate should see the cancellation, but not the error.
-  EXPECT_EQ(1, network_delegate.canceled_requests());
-  EXPECT_EQ(0, network_delegate.error_count());
-}
-
 TEST_F(URLRequestTestHTTP, NetworkAccessedSetOnNetworkRequest) {
   ASSERT_TRUE(http_test_server()->Start());
 
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index a33ef73..c5f1326 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -4480,12 +4480,6 @@
   searchifier_->SchedulePage(page->index());
 }
 
-void PDFiumEngine::CancelPendingSearchify(int page_index) {
-  if (searchifier_) {
-    searchifier_->CancelPage(page_index);
-  }
-}
-
 void PDFiumEngine::OnSearchifyStateChange(bool busy) {
   client_->OnSearchifyStateChange(busy);
 }
@@ -4505,6 +4499,12 @@
   }
   return false;
 }
+
+void PDFiumEngine::MaybeUnloadPage(int page_index) {
+  if (!IsPageVisible(page_index)) {
+    pages_[page_index]->Unload();
+  }
+}
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
 void PDFiumEngine::UpdateLinkUnderCursor(const std::string& target_url) {
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h
index 5ae264f..e9e2607 100644
--- a/pdf/pdfium/pdfium_engine.h
+++ b/pdf/pdfium/pdfium_engine.h
@@ -517,10 +517,6 @@
   // and in an available state.
   void ScheduleSearchifyIfNeeded(PDFiumPage* page);
 
-  // Cancels a pending searchify if it has not started yet. Ignores the request
-  // if the page is not scheduled for searchify.
-  void CancelPendingSearchify(int page_index);
-
   // Notifies that PDF searchifier has switched between busy or not busy.
   // A busy state is when it has some queued pages to process or is processing a
   // page at the moment. It comes out of this state either when all tasks are
@@ -536,6 +532,9 @@
 
   // Tells if the page is in `progressive_paints_`
   bool IsPageScheduledForPaint(int page_index) const;
+
+  // Unloads the page if it is not visible or prevented from unloading.
+  void MaybeUnloadPage(int page_index);
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
   void UnsupportedFeature(const std::string& feature);
diff --git a/pdf/pdfium/pdfium_on_demand_searchifier.cc b/pdf/pdfium/pdfium_on_demand_searchifier.cc
index 6d8774f..bde34a75 100644
--- a/pdf/pdfium/pdfium_on_demand_searchifier.cc
+++ b/pdf/pdfium/pdfium_on_demand_searchifier.cc
@@ -134,14 +134,6 @@
   state_ = State::kWaitingForResults;
 }
 
-void PDFiumOnDemandSearchifier::CancelPage(int page_index) {
-  if (current_page_ && current_page_->index() == page_index) {
-    current_page_ = nullptr;
-    return;
-  }
-  base::Erase(pages_queue_, page_index);
-}
-
 void PDFiumOnDemandSearchifier::SearchifyNextPage() {
   // Do not proceed if OCR got disconnected.
   if (state_ == State::kFailed) {
@@ -157,8 +149,11 @@
   state_ = State::kWaitingForResults;
   current_page_ = engine_->GetPage(pages_queue_.front());
   CHECK(current_page_);
+  current_page_was_loaded_ = !!current_page_->page();
   pages_queue_.pop_front();
 
+  // Load the page if needed.
+  current_page_->GetPage();
   current_page_image_object_indices_ = current_page_->GetImageObjectIndices();
   current_page_ocr_results_.clear();
   current_page_ocr_results_.reserve(current_page_image_object_indices_.size());
@@ -203,9 +198,8 @@
       return;
     }
 
-    // It is expected that the page would be still loaded.
-    FPDF_PAGE page = current_page_->page();
-    CHECK(page);
+    // Reload page if needed.
+    FPDF_PAGE page = current_page_->GetPage();
     bool added_text = false;
     for (auto& result : current_page_ocr_results_) {
       FPDF_PAGEOBJECT image = FPDFPage_GetObject(page, result.image_index);
@@ -221,9 +215,14 @@
     }
   }
 
+  if (!current_page_was_loaded_) {
+    engine_->MaybeUnloadPage(current_page_->index());
+  }
   current_page_ = nullptr;
 
   // Searchify next page.
+  // TODO(crbug.com/402265433): Since OCR is CPU intensive, add heuristic to
+  // avoid using system resources continuously if possible.
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&PDFiumOnDemandSearchifier::SearchifyNextPage,
@@ -250,18 +249,7 @@
     const gfx::Size& image_size,
     screen_ai::mojom::VisualAnnotationPtr annotation) {
   CHECK_EQ(state_, State::kWaitingForResults);
-
-  // If current request got canceled while OCR was running, ignore the result
-  // and move to the next page.
-  if (!current_page_) {
-    current_page_ocr_results_.clear();
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
-        FROM_HERE,
-        base::BindOnce(&PDFiumOnDemandSearchifier::SearchifyNextPage,
-                       weak_factory_.GetWeakPtr()),
-        kSearchifyPageDelay);
-    return;
-  }
+  CHECK(current_page_);
 
   if (annotation) {
     current_page_ocr_results_.emplace_back(image_index, std::move(annotation),
diff --git a/pdf/pdfium/pdfium_on_demand_searchifier.h b/pdf/pdfium/pdfium_on_demand_searchifier.h
index 27e47e8..e5c36f8 100644
--- a/pdf/pdfium/pdfium_on_demand_searchifier.h
+++ b/pdf/pdfium/pdfium_on_demand_searchifier.h
@@ -41,10 +41,6 @@
   // starts.
   void SchedulePage(int page_index);
 
-  // If `page_index` in it the searchifying queue, it's removed. If it's
-  // currently being processed, the process gets stopped as soon as possible.
-  void CancelPage(int page_index);
-
   bool HasFailed() const { return state_ == State::kFailed; }
   bool IsIdleForTesting() const { return state_ == State::kIdle; }
 
@@ -98,6 +94,7 @@
 
   // The page that is currently OCRed.
   raw_ptr<PDFiumPage> current_page_ = nullptr;
+  bool current_page_was_loaded_ = false;
   std::vector<int> current_page_image_object_indices_;
   std::vector<OcrResult> current_page_ocr_results_;
 
diff --git a/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc b/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc
index d03c2b8..33bf106 100644
--- a/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc
+++ b/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc
@@ -410,19 +410,19 @@
   EXPECT_FALSE(page.IsPageSearchified());
   ASSERT_EQ(GetPageText(page), "");
 
-  // Unloading the page, resulting in canceling the task in `searchifier`.
+  // Unloading the page, doesn't result in canceling the task in `searchifier`.
   page.Unload();
-  ASSERT_FALSE(searchifier->IsPageScheduled(0));
+  ASSERT_TRUE(searchifier->IsPageScheduled(0));
 
   // Let `searchifier` finish.
   base::test::TestFuture<void> future;
   WaitUntilIdle(searchifier, future.GetCallback());
   ASSERT_TRUE(future.Wait());
 
-  // Searchify finished, but OCR results are not added to the page.
+  // Searchify finished, OCR results are added to the page.
   ASSERT_EQ(performed_ocrs(), 2);
-  EXPECT_FALSE(page.IsPageSearchified());
-  ASSERT_EQ(GetPageText(page), "");
+  EXPECT_TRUE(page.IsPageSearchified());
+  ASSERT_EQ(GetPageText(page), "OCR Text 0\r\nOCR Text 1");
 }
 
 TEST_P(PDFiumOnDemandSearchifierTest, MultiplePagesWithUnload) {
@@ -439,37 +439,43 @@
 
   PDFiumOnDemandSearchifier* searchifier = engine()->GetSearchifierForTesting();
   ASSERT_TRUE(searchifier);
-  ASSERT_FALSE(searchifier->IsPageScheduled(0));
+  for (int page = 0; page < kPageCount; page++) {
+    ASSERT_TRUE(searchifier->IsPageScheduled(page));
+  }
 
   StartSearchify(/*empty_results=*/false);
 
   base::test::TestFuture<void> future;
   WaitUntilIdle(searchifier, future.GetCallback());
   ASSERT_TRUE(future.Wait());
-  ASSERT_EQ(performed_ocrs(), kPageCount - 1);
+  ASSERT_EQ(performed_ocrs(), kPageCount);
 
-  // First page is not Searchified.
-  EXPECT_TRUE(GetPageText(page0).empty());
-  EXPECT_FALSE(page0.IsPageSearchified());
-  EXPECT_FALSE(page0.GetTextRunInfo(0).has_value());
+  // Pages 0 is still not loaded.
+  EXPECT_EQ(page0.page(), nullptr);
 
-  // Other pages are Searchified.
+  // All pages are searchified.
+  EXPECT_EQ(GetPageText(page0), "OCR Text 0");
+  EXPECT_TRUE(page0.IsPageSearchified());
+  std::optional<AccessibilityTextRunInfo> page0_info = page0.GetTextRunInfo(0);
+  ASSERT_TRUE(page0_info.has_value());
+  EXPECT_TRUE(page0_info.value().is_searchified);
+
   PDFiumPage& page1 = GetPDFiumPageForTest(*engine(), 1);
-  EXPECT_EQ(GetPageText(page1), "OCR Text 0");
+  EXPECT_EQ(GetPageText(page1), "OCR Text 1");
   EXPECT_TRUE(page1.IsPageSearchified());
   std::optional<AccessibilityTextRunInfo> page1_info = page1.GetTextRunInfo(0);
   ASSERT_TRUE(page1_info.has_value());
   EXPECT_TRUE(page1_info.value().is_searchified);
 
   PDFiumPage& page2 = GetPDFiumPageForTest(*engine(), 2);
-  EXPECT_EQ(GetPageText(page2), "OCR Text 1");
+  EXPECT_EQ(GetPageText(page2), "OCR Text 2");
   EXPECT_TRUE(page2.IsPageSearchified());
   std::optional<AccessibilityTextRunInfo> page2_info = page2.GetTextRunInfo(0);
   ASSERT_TRUE(page2_info.has_value());
   EXPECT_TRUE(page2_info.value().is_searchified);
 
   PDFiumPage& page3 = GetPDFiumPageForTest(*engine(), 3);
-  EXPECT_EQ(GetPageText(page3), "OCR Text 2");
+  EXPECT_EQ(GetPageText(page3), "OCR Text 3");
   EXPECT_TRUE(page3.IsPageSearchified());
   std::optional<AccessibilityTextRunInfo> page3_info = page3.GetTextRunInfo(0);
   ASSERT_TRUE(page3_info.has_value());
@@ -481,7 +487,7 @@
   // Get the text from the page, which reloads the page. It still has the
   // Searchified text because OCR finished and the text has been committed into
   // the page.
-  EXPECT_EQ(GetPageText(page3), "OCR Text 2");
+  EXPECT_EQ(GetPageText(page3), "OCR Text 3");
   EXPECT_TRUE(page3.IsPageSearchified());
 
   // Fetch `page3_info` again.
diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc
index d96780c3..9f80649 100644
--- a/pdf/pdfium/pdfium_page.cc
+++ b/pdf/pdfium/pdfium_page.cc
@@ -432,10 +432,6 @@
   text_page_.reset();
 
   if (page_) {
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-    // TODO(crbug.com/360803943): Keep objects added by searchify.
-    engine_->CancelPendingSearchify(index_);
-#endif
     if (engine_->form()) {
       FORM_OnBeforeClosePage(page(), engine_->form());
     }
diff --git a/printing/backend/print_backend_utils.cc b/printing/backend/print_backend_utils.cc
index 7093aae9..88090c67 100644
--- a/printing/backend/print_backend_utils.cc
+++ b/printing/backend/print_backend_utils.cc
@@ -129,10 +129,10 @@
                                         int* left_pwg,
                                         int* right_pwg,
                                         int* top_pwg) {
-  DCHECK(bottom_pwg);
-  DCHECK(left_pwg);
-  DCHECK(right_pwg);
-  DCHECK(top_pwg);
+  CHECK(bottom_pwg);
+  CHECK(left_pwg);
+  CHECK(right_pwg);
+  CHECK(top_pwg);
 
   // These values in microns were obtained in the first place by converting
   // from PWG units, so we can losslessly convert them back.
@@ -140,10 +140,10 @@
   int left_um = printable_area_um.x();
   int right_um = size_um.width() - printable_area_um.right();
   int top_um = size_um.height() - printable_area_um.bottom();
-  DCHECK_EQ(bottom_um % kMicronsPerPwgUnit, 0);
-  DCHECK_EQ(left_um % kMicronsPerPwgUnit, 0);
-  DCHECK_EQ(right_um % kMicronsPerPwgUnit, 0);
-  DCHECK_EQ(top_um % kMicronsPerPwgUnit, 0);
+  CHECK_EQ(bottom_um % kMicronsPerPwgUnit, 0);
+  CHECK_EQ(left_um % kMicronsPerPwgUnit, 0);
+  CHECK_EQ(right_um % kMicronsPerPwgUnit, 0);
+  CHECK_EQ(top_um % kMicronsPerPwgUnit, 0);
 
   *bottom_pwg = bottom_um / kMicronsPerPwgUnit;
   *left_pwg = left_um / kMicronsPerPwgUnit;
diff --git a/printing/printing_context_chromeos.cc b/printing/printing_context_chromeos.cc
index 0730c29..95ac433 100644
--- a/printing/printing_context_chromeos.cc
+++ b/printing/printing_context_chromeos.cc
@@ -50,7 +50,10 @@
          base::StartsWith(uri, "usb:") || base::StartsWith(uri, "ippusb:");
 }
 
-void MarginsMicronsToPWG(const PageMargins& margins_microns,
+// Convert margins from microns to PWG units.
+// Returns false if the margins are not divisible by kMicronsPerPwgUnit meaning
+// that the microns margins are not backwards convertible to PWG units.
+bool MarginsMicronsToPWG(const PageMargins& margins_microns,
                          int* bottom_pwg,
                          int* left_pwg,
                          int* right_pwg,
@@ -60,21 +63,18 @@
   CHECK(right_pwg);
   CHECK(top_pwg);
 
-  // These values in microns were obtained from media-col and it must possible
-  // to losslessly convert them back to PWG units.
-  int bottom_um = margins_microns.bottom;
-  int left_um = margins_microns.left;
-  int right_um = margins_microns.right;
-  int top_um = margins_microns.top;
-  CHECK_EQ(bottom_um % kMicronsPerPwgUnit, 0);
-  CHECK_EQ(left_um % kMicronsPerPwgUnit, 0);
-  CHECK_EQ(right_um % kMicronsPerPwgUnit, 0);
-  CHECK_EQ(top_um % kMicronsPerPwgUnit, 0);
+  if (margins_microns.bottom % kMicronsPerPwgUnit != 0 ||
+      margins_microns.left % kMicronsPerPwgUnit != 0 ||
+      margins_microns.right % kMicronsPerPwgUnit != 0 ||
+      margins_microns.top % kMicronsPerPwgUnit != 0) {
+    return false;
+  }
 
-  *bottom_pwg = bottom_um / kMicronsPerPwgUnit;
-  *left_pwg = left_um / kMicronsPerPwgUnit;
-  *right_pwg = right_um / kMicronsPerPwgUnit;
-  *top_pwg = top_um / kMicronsPerPwgUnit;
+  *bottom_pwg = margins_microns.bottom / kMicronsPerPwgUnit;
+  *left_pwg = margins_microns.left / kMicronsPerPwgUnit;
+  *right_pwg = margins_microns.right / kMicronsPerPwgUnit;
+  *top_pwg = margins_microns.top / kMicronsPerPwgUnit;
+  return true;
 }
 
 // Populates the 'client-info' attribute of the IPP collection `options`. Each
@@ -145,11 +145,29 @@
   int height = size_um.height() / kMicronsPerPwgUnit;
   int bottom_margin = 0, left_margin = 0, right_margin = 0, top_margin = 0;
   if (!settings.borderless()) {
+    CHECK_NE(settings.margin_type(), mojom::MarginType::kNoMargins);
+    // There are 2 ways how print settings are setup -
+    //   1) via print preview dialog, which allows to set any margins, but it
+    //      involves preprocessing the document as one cannot use any arbitrary
+    //      value for margins. Then, default printer margins must be used to
+    //      setup the print job. These custom margins are not backwards
+    //      convertible to PWG units.
+    //   2) via chrome.printing API, which allows to set only supported margins,
+    //      meaning that this custom margins are backwards convertible to PWG
+    //      units.
+    //
+    // It's unknown if the custom margins here are the ones that were announced
+    // by the printer. Thus, first try to convert the custom margins to PWG
+    // units and if that fails, use the default margins. This preserves the
+    // original behaviour for the print preview dialog and usage of custom
+    // margins.
+    bool uses_custom_margins = false;
     if (settings.margin_type() == mojom::MarginType::kCustomMargins) {
-      MarginsMicronsToPWG(settings.requested_custom_margins_in_microns(),
-                          &bottom_margin, &left_margin, &right_margin,
-                          &top_margin);
-    } else if (settings.margin_type() == mojom::MarginType::kDefaultMargins) {
+      uses_custom_margins = MarginsMicronsToPWG(
+          settings.requested_custom_margins_in_microns(), &bottom_margin,
+          &left_margin, &right_margin, &top_margin);
+    }
+    if (!uses_custom_margins) {
       PwgMarginsFromSizeAndPrintableArea(size_um, printable_area_um,
                                          &bottom_margin, &left_margin,
                                          &right_margin, &top_margin);
diff --git a/printing/printing_context_chromeos_unittest.cc b/printing/printing_context_chromeos_unittest.cc
index e0881869..32539c8 100644
--- a/printing/printing_context_chromeos_unittest.cc
+++ b/printing/printing_context_chromeos_unittest.cc
@@ -222,6 +222,19 @@
   TestMediaColValue(gfx::Size(29700, 42000), 6, 5, 3, 4);
 }
 
+// This test checks that if custom margins are provided, but they are not
+// obtained from media-col (in other words, they cannot be converted back to
+// PWG units), the default margins are used.
+TEST_F(PrintingContextTest,
+       SettingsToIPPOptions_MediaColUnsupportedCustomMargins) {
+  settings_.set_requested_media(
+      {gfx::Size(297000, 420000), "iso_a3_297x420mm"});
+  settings_.SetCustomMargins({0, 0, 123, 321, 231, 132});
+  printable_area_ =
+      gfx::Rect(2000, 1000, 297000 - (2000 + 3000), 420000 - (1000 + 4000));
+  TestMediaColValue(gfx::Size(29700, 42000), 100, 200, 300, 400);
+}
+
 TEST_F(PrintingContextTest, SettingsToIPPOptions_MediaColZeroMargins) {
   settings_.set_requested_media(
       {gfx::Size(297000, 420000), "iso_a3_297x420mm"});
diff --git a/services/network/public/cpp/integrity_policy_parser.cc b/services/network/public/cpp/integrity_policy_parser.cc
index e6b0f50..ba2be61 100644
--- a/services/network/public/cpp/integrity_policy_parser.cc
+++ b/services/network/public/cpp/integrity_policy_parser.cc
@@ -80,7 +80,8 @@
           net::structured_headers::ParseDictionary(integrity_policy_header);
   if (!integrity_policy_dictionary) {
     parsed_policy.parsing_errors.emplace_back(base::StringPrintf(
-        "The %s value is not a dictionary.", header_name.c_str()));
+        "The %s value \"%s\" is not a dictionary.", header_name.c_str(),
+        integrity_policy_header.c_str()));
     return parsed_policy;
   }
 
diff --git a/services/network/public/cpp/integrity_policy_parser_unittest.cc b/services/network/public/cpp/integrity_policy_parser_unittest.cc
index aefc2824..557b36d 100644
--- a/services/network/public/cpp/integrity_policy_parser_unittest.cc
+++ b/services/network/public/cpp/integrity_policy_parser_unittest.cc
@@ -54,12 +54,14 @@
        kEmptyDestination,
        kEmptySource,
        kEmptyVectorString,
-       {"The Integrity-Policy value is not a dictionary."}},
+       {"The Integrity-Policy value \"not a dictionary\" is not a "
+        "dictionary."}},
       {"not a dictionary",
        kEmptyDestination,
        kEmptySource,
        kEmptyVectorString,
-       {"The Integrity-Policy-Report-Only value is not a dictionary."},
+       {"The Integrity-Policy-Report-Only value \"not a dictionary\" is not a "
+        "dictionary."},
        IntegrityPolicyHeaderType::kReportOnly},
       {"wrongkey=(something)",
        kEmptyDestination,
@@ -119,7 +121,8 @@
        kEmptyDestination,
        kEmptySource,
        kEmptyVectorString,
-       {"The Integrity-Policy value is not a dictionary."}},
+       {"The Integrity-Policy value \"blocked-destinations=(script), "
+        "endpoints=(invalid1, invalid2)\" is not a dictionary."}},
       {"sources=(other), blocked-destinations=(script)",
        kScriptDestination,
        kEmptySource,
@@ -129,7 +132,8 @@
        kEmptyDestination,
        kEmptySource,
        kEmptyVectorString,
-       {"The Integrity-Policy value is not a dictionary."}},
+       {"The Integrity-Policy value \"sources=(inline), "
+        "blocked-destinations=[], endpoints=[]\" is not a dictionary."}},
 
   };
 
diff --git a/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.cc b/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.cc
index 9d908c86..8433b497 100644
--- a/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.cc
+++ b/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.cc
@@ -93,16 +93,6 @@
                                  network::CSPSourceContext::PermissionsPolicy);
 }
 
-bool operator==(const OriginWithPossibleWildcards& lhs,
-                const OriginWithPossibleWildcards& rhs) {
-  return lhs.csp_source == rhs.csp_source;
-}
-
-bool operator!=(const OriginWithPossibleWildcards& lhs,
-                const OriginWithPossibleWildcards& rhs) {
-  return lhs.csp_source != rhs.csp_source;
-}
-
 bool operator<(const OriginWithPossibleWildcards& lhs,
                const OriginWithPossibleWildcards& rhs) {
   return lhs.csp_source < rhs.csp_source;
diff --git a/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h b/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h
index 517ce40..739e07a 100644
--- a/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h
+++ b/services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h
@@ -75,19 +75,17 @@
     return csp_source;
   }
 
+  COMPONENT_EXPORT(NETWORK_CPP_WEB_PLATFORM)
+  friend bool operator==(const OriginWithPossibleWildcards&,
+                         const OriginWithPossibleWildcards&) = default;
+  COMPONENT_EXPORT(NETWORK_CPP_WEB_PLATFORM)
+  friend bool operator<(const OriginWithPossibleWildcards& lhs,
+                        const OriginWithPossibleWildcards& rhs);
+
  private:
   friend struct mojo::StructTraits<
       network::mojom::OriginWithPossibleWildcardsDataView,
       network::OriginWithPossibleWildcards>;
-  COMPONENT_EXPORT(NETWORK_CPP_WEB_PLATFORM)
-  friend bool operator==(const OriginWithPossibleWildcards& lhs,
-                         const OriginWithPossibleWildcards& rhs);
-  COMPONENT_EXPORT(NETWORK_CPP_WEB_PLATFORM)
-  friend bool operator!=(const OriginWithPossibleWildcards& lhs,
-                         const OriginWithPossibleWildcards& rhs);
-  COMPONENT_EXPORT(NETWORK_CPP_WEB_PLATFORM)
-  friend bool operator<(const OriginWithPossibleWildcards& lhs,
-                        const OriginWithPossibleWildcards& rhs);
 
   network::mojom::CSPSource csp_source;
 };
diff --git a/services/network/shared_dictionary/simple_url_pattern_matcher.h b/services/network/shared_dictionary/simple_url_pattern_matcher.h
index a87d48e..75cc3be0 100644
--- a/services/network/shared_dictionary/simple_url_pattern_matcher.h
+++ b/services/network/shared_dictionary/simple_url_pattern_matcher.h
@@ -69,7 +69,6 @@
     PatternInit& operator=(PatternInit&&);
 
     bool operator==(const PatternInit& other) const = default;
-    bool operator!=(const PatternInit& other) const = default;
 
     const std::optional<std::string>& protocol() const { return protocol_; }
     const std::optional<std::string>& username() const { return username_; }
diff --git a/services/network/throttling/throttling_controller_unittest.cc b/services/network/throttling/throttling_controller_unittest.cc
index 5e74873..381742c 100644
--- a/services/network/throttling/throttling_controller_unittest.cc
+++ b/services/network/throttling/throttling_controller_unittest.cc
@@ -68,9 +68,9 @@
         profile_id_(base::UnguessableToken::Create()) {
     mock_transaction_.test_mode = TEST_MODE_SYNC_NET_START;
 
-    std::unique_ptr<net::HttpTransaction> network_transaction;
-    network_layer_.CreateTransaction(net::DEFAULT_PRIORITY,
-                                     &network_transaction);
+    auto network_transaction =
+        network_layer_.CreateTransaction(net::DEFAULT_PRIORITY);
+    CHECK(network_transaction);
     transaction_ = std::make_unique<ThrottlingNetworkTransaction>(
         std::move(network_transaction));
   }
diff --git a/services/network/throttling/throttling_network_transaction_factory.cc b/services/network/throttling/throttling_network_transaction_factory.cc
index 0af6a02..16c6d03b 100644
--- a/services/network/throttling/throttling_network_transaction_factory.cc
+++ b/services/network/throttling/throttling_network_transaction_factory.cc
@@ -5,13 +5,8 @@
 #include "services/network/throttling/throttling_network_transaction_factory.h"
 
 #include <memory>
-#include <set>
-#include <string>
-#include <utility>
 
-#include "net/base/net_errors.h"
 #include "net/http/http_network_transaction.h"
-#include "services/network/throttling/throttling_controller.h"
 #include "services/network/throttling/throttling_network_transaction.h"
 
 namespace network {
@@ -22,17 +17,11 @@
 
 ThrottlingNetworkTransactionFactory::~ThrottlingNetworkTransactionFactory() {}
 
-int ThrottlingNetworkTransactionFactory::CreateTransaction(
-    net::RequestPriority priority,
-    std::unique_ptr<net::HttpTransaction>* trans) {
-  std::unique_ptr<net::HttpTransaction> network_transaction;
-  int rv = network_layer_->CreateTransaction(priority, &network_transaction);
-  if (rv != net::OK) {
-    return rv;
-  }
-  *trans = std::make_unique<ThrottlingNetworkTransaction>(
-      std::move(network_transaction));
-  return net::OK;
+std::unique_ptr<net::HttpTransaction>
+ThrottlingNetworkTransactionFactory::CreateTransaction(
+    net::RequestPriority priority) {
+  return std::make_unique<ThrottlingNetworkTransaction>(
+      network_layer_->CreateTransaction(priority));
 }
 
 net::HttpCache* ThrottlingNetworkTransactionFactory::GetCache() {
diff --git a/services/network/throttling/throttling_network_transaction_factory.h b/services/network/throttling/throttling_network_transaction_factory.h
index e523e1e..25978359 100644
--- a/services/network/throttling/throttling_network_transaction_factory.h
+++ b/services/network/throttling/throttling_network_transaction_factory.h
@@ -35,8 +35,8 @@
   ~ThrottlingNetworkTransactionFactory() override;
 
   // net::HttpTransactionFactory methods:
-  int CreateTransaction(net::RequestPriority priority,
-                        std::unique_ptr<net::HttpTransaction>* trans) override;
+  std::unique_ptr<net::HttpTransaction> CreateTransaction(
+      net::RequestPriority priority) override;
   net::HttpCache* GetCache() override;
   net::HttpNetworkSession* GetSession() override;
 
diff --git a/services/passage_embeddings/passage_embeddings_service.cc b/services/passage_embeddings/passage_embeddings_service.cc
index 56afc444..aa6b21f 100644
--- a/services/passage_embeddings/passage_embeddings_service.cc
+++ b/services/passage_embeddings/passage_embeddings_service.cc
@@ -21,9 +21,11 @@
 
 PassageEmbeddingsService::~PassageEmbeddingsService() = default;
 
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 void PassageEmbeddingsService::OnEmbedderDisconnect() {
   embedder_.reset();
 }
+#endif
 
 void PassageEmbeddingsService::LoadModels(
     mojom::PassageEmbeddingsLoadModelsParamsPtr model_params,
diff --git a/services/passage_embeddings/passage_embeddings_service.h b/services/passage_embeddings/passage_embeddings_service.h
index a7eded7..bfa711af 100644
--- a/services/passage_embeddings/passage_embeddings_service.h
+++ b/services/passage_embeddings/passage_embeddings_service.h
@@ -23,9 +23,6 @@
   ~PassageEmbeddingsService() override;
 
  private:
-  // Called when the embedder remote disconnects.
-  void OnEmbedderDisconnect();
-
   // mojom::PassageEmbeddingsService:
   void LoadModels(mojom::PassageEmbeddingsLoadModelsParamsPtr model_params,
                   mojom::PassageEmbedderParamsPtr embedder_params,
@@ -35,6 +32,9 @@
   mojo::Receiver<mojom::PassageEmbeddingsService> receiver_;
 
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+  // Called when the embedder remote disconnects.
+  void OnEmbedderDisconnect();
+
   std::unique_ptr<PassageEmbedder> embedder_;
 #endif
 };
diff --git a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
index 6627771..4fe243b 100644
--- a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
+++ b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
@@ -58,6 +58,7 @@
   out->is_handling_animation = data.is_handling_animation();
   out->send_frame_token_to_embedder = data.send_frame_token_to_embedder();
   out->min_page_scale_factor = data.min_page_scale_factor();
+  out->is_mobile_optimized = data.is_mobile_optimized();
   out->is_software = data.is_software();
   if (data.top_controls_visible_height_set()) {
     out->top_controls_visible_height.emplace(
diff --git a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
index 984d9c3c..170d4810 100644
--- a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
+++ b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
@@ -151,6 +151,11 @@
     return metadata.display_transform_hint;
   }
 
+  static bool is_mobile_optimized(
+      const viz::CompositorFrameMetadata& metadata) {
+    return metadata.is_mobile_optimized;
+  }
+
   static const std::unique_ptr<gfx::DelegatedInkMetadata>&
   delegated_ink_metadata(const viz::CompositorFrameMetadata& metadata) {
     return metadata.delegated_ink_metadata;
diff --git a/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom b/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom
index 0f259d9..103a167 100644
--- a/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom
+++ b/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom
@@ -58,6 +58,8 @@
 
   gfx.mojom.OverlayTransform display_transform_hint;
 
+  bool is_mobile_optimized;
+
   // Contains the metadata required for drawing a delegated ink trail onto the
   // end of a rendered ink stroke. This should only be present when two
   // conditions are met:
diff --git a/services/viz/public/mojom/compositing/layer.mojom b/services/viz/public/mojom/compositing/layer.mojom
index 159ceb3d..a3c4de22 100644
--- a/services/viz/public/mojom/compositing/layer.mojom
+++ b/services/viz/public/mojom/compositing/layer.mojom
@@ -189,7 +189,8 @@
   // Must be a valid index into the scroll tree.
   int32 scroll_ancestor;
 
-  // Additional fields derived from StickyPositionScrollingConstraints.
+  // Additional fields derived from StickyPositionConstraint (which itself is
+  // populated from StickyPositionScrollingConstraints).
   bool is_anchored_left;
   bool is_anchored_right;
   bool is_anchored_top;
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 8b8a989..185fae1 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1829,6 +1829,105 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=gl --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_gl_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --disable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_ganesh_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle --use-angle=metal --enable-features=SkiaGraphite",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_metal_passthrough_graphite_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cpu": "x86-64",
+            "display_attached": "1",
+            "gpu": "8086:3e9b",
+            "os": "Mac-14.5"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   },
@@ -3054,6 +3153,39 @@
         },
         "test": "telemetry_gpu_integration_test",
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
+          "webrtc",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--stable-jobs",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--enforce-browser-version",
+          "--jobs=4"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webrtc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "display_attached": "1",
+            "gpu": "10de:2184-31.0.15.4601",
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.gpu"
+          },
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "telemetry_gpu_integration_test",
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
       }
     ]
   }
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 322fe82..2bb0f8c8 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -13754,6 +13754,21 @@
             ]
         }
     ],
+    "MacICloudKeychainRecoveryFactor": [
+        {
+            "platforms": [
+                "mac"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "EnableICloudKeychainRecoveryFactor"
+                    ]
+                }
+            ]
+        }
+    ],
     "MahiEnabled": [
         {
             "platforms": [
@@ -19273,6 +19288,21 @@
             ]
         }
     ],
+    "ReduceUserAgentDataLinuxPlatformVersion": [
+        {
+            "platforms": [
+                "linux"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ReduceUserAgentDataLinuxPlatformVersion"
+                    ]
+                }
+            ]
+        }
+    ],
     "RefreshTokenV3Feature": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/BUILD.gn b/third_party/abseil-cpp/BUILD.gn
index 5fc7a60..3bd2ea4 100644
--- a/third_party/abseil-cpp/BUILD.gn
+++ b/third_party/abseil-cpp/BUILD.gn
@@ -179,6 +179,7 @@
     # the flag registration mechanism is problematic in component builds.
     "//third_party/abseil-cpp/absl/flags:config",
     "//third_party/abseil-cpp/absl/flags:flag",
+    "//third_party/abseil-cpp/absl/flags:marshalling",
     "//third_party/abseil-cpp/absl/flags:parse",
     "//third_party/abseil-cpp/absl/flags:reflection",
     "//third_party/abseil-cpp/absl/flags:usage",
@@ -315,9 +316,6 @@
         "absl/hash:hash_instantiated_test",
         "absl/hash:hash_test",
         "absl/hash:low_level_hash_test",
-        "absl/log/internal:fnmatch_test",
-        "absl/log/internal:stderr_log_sink_test",
-        "absl/log/internal:structured_proto_test",
         "absl/log:absl_check_test",
         "absl/log:absl_log_basic_test",
         "absl/log:die_if_null_test",
@@ -332,14 +330,17 @@
         "absl/log:scoped_mock_log_test",
         "absl/log:stripping_test",
         "absl/log:vlog_is_on_test",
+        "absl/log/internal:fnmatch_test",
+        "absl/log/internal:stderr_log_sink_test",
+        "absl/log/internal:structured_proto_test",
         "absl/memory:memory_test",
         "absl/meta:type_traits_test",
         "absl/numeric:int128_test",
         "absl/profiling:exponential_biased_test",
         "absl/profiling:periodic_sampler_test",
-        "absl/random/internal:nonsecure_base_test",
         "absl/random:distributions_test",
         "absl/random:mock_distributions_test",
+        "absl/random/internal:nonsecure_base_test",
         "absl/status:status_matchers_test",
         "absl/status:status_test",
         "absl/status:statusor_test",
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index c9515f4..622f327c 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache-2.0
 License File: LICENSE
 Version: N/A
-Revision: 4bf37d8e19bbea7e2ac4cd15d85615d6c803573e
+Revision: 9c8e8f948bc9bf13388d8ea2afdaadb311a71161
 Security Critical: yes
 Shipped: yes
 
diff --git a/third_party/abseil-cpp/absl/container/flat_hash_map_test.cc b/third_party/abseil-cpp/absl/container/flat_hash_map_test.cc
index 5c83c941..e1d9382a 100644
--- a/third_party/abseil-cpp/absl/container/flat_hash_map_test.cc
+++ b/third_party/abseil-cpp/absl/container/flat_hash_map_test.cc
@@ -116,15 +116,6 @@
 
 TEST(FlatHashMap, Relocatability) {
   static_assert(absl::is_trivially_relocatable<int>::value);
-#if ABSL_INTERNAL_CPLUSPLUS_LANG <= 202002L
-  // std::pair is not trivially copyable in C++23 in some standard
-  // library versions.
-  // See https://github.com/llvm/llvm-project/pull/95444 for instance.
-  // container_memory.h contains a workaround so what really matters
-  // is the transfer test below.
-  static_assert(
-      absl::is_trivially_relocatable<std::pair<const int, int>>::value);
-#endif
   static_assert(
       std::is_same<decltype(absl::container_internal::FlatHashMapPolicy<
                             int, int>::transfer<std::allocator<char>>(nullptr,
diff --git a/third_party/abseil-cpp/absl/hash/internal/hash.h b/third_party/abseil-cpp/absl/hash/internal/hash.h
index 63b35490..7c90ab4d 100644
--- a/third_party/abseil-cpp/absl/hash/internal/hash.h
+++ b/third_party/abseil-cpp/absl/hash/internal/hash.h
@@ -1252,20 +1252,11 @@
                                                size_t len);
 
   // Reads 9 to 16 bytes from p.
-  // The least significant 8 bytes are in .first, and the rest of the bytes are
-  // in .second along with duplicated bytes from .first if len<16.
+  // The first 8 bytes are in .first, and the rest of the bytes are in .second
+  // along with duplicated bytes from .first if len<16.
   static std::pair<uint64_t, uint64_t> Read9To16(const unsigned char* p,
                                                  size_t len) {
-    uint64_t low_mem = Read8(p);
-    uint64_t high_mem = Read8(p + len - 8);
-#ifdef ABSL_IS_LITTLE_ENDIAN
-    uint64_t most_significant = high_mem;
-    uint64_t least_significant = low_mem;
-#else
-    uint64_t most_significant = low_mem;
-    uint64_t least_significant = high_mem;
-#endif
-    return {least_significant, most_significant};
+    return {Read8(p), Read8(p + len - 8)};
   }
 
   // Reads 8 bytes from p.
diff --git a/third_party/abseil-cpp/absl/strings/cord.h b/third_party/abseil-cpp/absl/strings/cord.h
index 7afa419..5aa232e 100644
--- a/third_party/abseil-cpp/absl/strings/cord.h
+++ b/third_party/abseil-cpp/absl/strings/cord.h
@@ -755,7 +755,7 @@
   // NOTE: This routine is reasonably efficient. It is roughly
   // logarithmic based on the number of chunks that make up the cord. Still,
   // if you need to iterate over the contents of a cord, you should
-  // use a CharIterator/ChunkIterator rather than call operator[] or Get()
+  // use a CharIterator/ChunkIterator rather than call operator[]
   // repeatedly in a loop.
   char operator[](size_t i) const;
 
diff --git a/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt b/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt
index 9d4844d..ad45515c 100644
--- a/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt
@@ -113,7 +113,6 @@
     absl::raw_logging_internal
     absl::stacktrace
     absl::symbolize
-    absl::tracing_internal
     absl::time
     absl::tracing_internal
     Threads::Threads
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc b/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc
index 80f7319..e8f1d93 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc
@@ -33,24 +33,32 @@
 #endif
 
 #if defined(_WIN32)
-#include <sdkddkver.h>
-// Include only when the SDK is for Windows 10 (and later), and the binary is
-// targeted for Windows XP and later.
-// Note: The Windows SDK added windows.globalization.h file for Windows 10, but
-// MinGW did not add it until NTDDI_WIN10_NI (SDK version 10.0.22621.0).
-#if ((defined(_WIN32_WINNT_WIN10) && !defined(__MINGW32__)) ||        \
-     (defined(NTDDI_WIN10_NI) && NTDDI_VERSION >= NTDDI_WIN10_NI)) && \
-    (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
+// Include only when <icu.h> is available.
+// https://learn.microsoft.com/en-us/windows/win32/intl/international-components-for-unicode--icu-
+// https://devblogs.microsoft.com/oldnewthing/20210527-00/?p=105255
+#if defined(__has_include)
+#if __has_include(<icu.h>)
 #define USE_WIN32_LOCAL_TIME_ZONE
-#include <roapi.h>
-#include <tchar.h>
-#include <wchar.h>
-#include <windows.globalization.h>
 #include <windows.h>
-#include <winstring.h>
-#endif
-#endif
+#pragma push_macro("_WIN32_WINNT")
+#pragma push_macro("NTDDI_VERSION")
+// Minimum _WIN32_WINNT and NTDDI_VERSION to use ucal_getTimeZoneIDForWindowsID
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0A00  // == _WIN32_WINNT_WIN10
+#undef NTDDI_VERSION
+#define NTDDI_VERSION 0x0A000004  // == NTDDI_WIN10_RS3
+#include <icu.h>
+#pragma pop_macro("NTDDI_VERSION")
+#pragma pop_macro("_WIN32_WINNT")
+#include <timezoneapi.h>
 
+#include <atomic>
+#endif  // __has_include(<icu.h>)
+#endif  // __has_include
+#endif  // _WIN32
+
+#include <array>
+#include <cstdint>
 #include <cstdlib>
 #include <cstring>
 #include <string>
@@ -65,80 +73,78 @@
 
 namespace {
 #if defined(USE_WIN32_LOCAL_TIME_ZONE)
-// Calls the WinRT Calendar.GetTimeZone method to obtain the IANA ID of the
-// local time zone. Returns an empty vector in case of an error.
-std::string win32_local_time_zone(const HMODULE combase) {
-  std::string result;
-  const auto ro_activate_instance =
-      reinterpret_cast<decltype(&RoActivateInstance)>(
-          GetProcAddress(combase, "RoActivateInstance"));
-  if (!ro_activate_instance) {
-    return result;
-  }
-  const auto windows_create_string_reference =
-      reinterpret_cast<decltype(&WindowsCreateStringReference)>(
-          GetProcAddress(combase, "WindowsCreateStringReference"));
-  if (!windows_create_string_reference) {
-    return result;
-  }
-  const auto windows_delete_string =
-      reinterpret_cast<decltype(&WindowsDeleteString)>(
-          GetProcAddress(combase, "WindowsDeleteString"));
-  if (!windows_delete_string) {
-    return result;
-  }
-  const auto windows_get_string_raw_buffer =
-      reinterpret_cast<decltype(&WindowsGetStringRawBuffer)>(
-          GetProcAddress(combase, "WindowsGetStringRawBuffer"));
-  if (!windows_get_string_raw_buffer) {
-    return result;
+// True if we have already failed to load the API.
+static std::atomic_bool g_ucal_getTimeZoneIDForWindowsIDUnavailable;
+static std::atomic<decltype(ucal_getTimeZoneIDForWindowsID)*>
+    g_ucal_getTimeZoneIDForWindowsIDRef;
+
+std::string win32_local_time_zone() {
+  // If we have already failed to load the API, then just give up.
+  if (g_ucal_getTimeZoneIDForWindowsIDUnavailable.load()) {
+    return "";
   }
 
-  // The string returned by WindowsCreateStringReference doesn't need to be
-  // deleted.
-  HSTRING calendar_class_id;
-  HSTRING_HEADER calendar_class_id_header;
-  HRESULT hr = windows_create_string_reference(
-      RuntimeClass_Windows_Globalization_Calendar,
-      sizeof(RuntimeClass_Windows_Globalization_Calendar) / sizeof(wchar_t) - 1,
-      &calendar_class_id_header, &calendar_class_id);
-  if (FAILED(hr)) {
-    return result;
-  }
-
-  IInspectable* calendar;
-  hr = ro_activate_instance(calendar_class_id, &calendar);
-  if (FAILED(hr)) {
-    return result;
-  }
-
-  ABI::Windows::Globalization::ITimeZoneOnCalendar* time_zone;
-  hr = calendar->QueryInterface(IID_PPV_ARGS(&time_zone));
-  if (FAILED(hr)) {
-    calendar->Release();
-    return result;
-  }
-
-  HSTRING tz_hstr;
-  hr = time_zone->GetTimeZone(&tz_hstr);
-  if (SUCCEEDED(hr)) {
-    UINT32 wlen;
-    const PCWSTR tz_wstr = windows_get_string_raw_buffer(tz_hstr, &wlen);
-    if (tz_wstr) {
-      const int size =
-          WideCharToMultiByte(CP_UTF8, 0, tz_wstr, static_cast<int>(wlen),
-                              nullptr, 0, nullptr, nullptr);
-      result.resize(static_cast<size_t>(size));
-      WideCharToMultiByte(CP_UTF8, 0, tz_wstr, static_cast<int>(wlen),
-                          &result[0], size, nullptr, nullptr);
+  auto ucal_getTimeZoneIDForWindowsIDFunc =
+      g_ucal_getTimeZoneIDForWindowsIDRef.load();
+  if (ucal_getTimeZoneIDForWindowsIDFunc == nullptr) {
+    // If we have already failed to load the API, then just give up.
+    if (g_ucal_getTimeZoneIDForWindowsIDUnavailable.load()) {
+      return "";
     }
-    windows_delete_string(tz_hstr);
+
+    const HMODULE icudll =
+        ::LoadLibraryExW(L"icu.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
+
+    if (icudll == nullptr) {
+      g_ucal_getTimeZoneIDForWindowsIDUnavailable.store(true);
+      return "";
+    }
+
+    ucal_getTimeZoneIDForWindowsIDFunc =
+        reinterpret_cast<decltype(ucal_getTimeZoneIDForWindowsID)*>(
+            ::GetProcAddress(icudll, "ucal_getTimeZoneIDForWindowsID"));
+
+    if (ucal_getTimeZoneIDForWindowsIDFunc == nullptr) {
+      g_ucal_getTimeZoneIDForWindowsIDUnavailable.store(true);
+      return "";
+    }
+    // store-race is not a problem here, because ::GetProcAddress() returns the
+    // same address for the same function in the same DLL.
+    g_ucal_getTimeZoneIDForWindowsIDRef.store(
+        ucal_getTimeZoneIDForWindowsIDFunc);
+
+    // We intentionally do not call ::FreeLibrary() here to avoid frequent DLL
+    // loadings and unloading. As "icu.dll" is a system library, keeping it on
+    // memory is supposed to have no major drawback.
   }
-  time_zone->Release();
-  calendar->Release();
-  return result;
+
+  DYNAMIC_TIME_ZONE_INFORMATION info = {};
+  if (::GetDynamicTimeZoneInformation(&info) == TIME_ZONE_ID_INVALID) {
+    return "";
+  }
+
+  std::array<UChar, 128> buffer;
+  UErrorCode status = U_ZERO_ERROR;
+  const auto num_chars_in_buffer = ucal_getTimeZoneIDForWindowsIDFunc(
+      reinterpret_cast<const UChar*>(info.TimeZoneKeyName), -1, nullptr,
+      buffer.data(), static_cast<int32_t>(buffer.size()), &status);
+  if (status != U_ZERO_ERROR || num_chars_in_buffer <= 0 ||
+      num_chars_in_buffer > static_cast<int32_t>(buffer.size())) {
+    return "";
+  }
+
+  const int num_bytes_in_utf8 = ::WideCharToMultiByte(
+      CP_UTF8, 0, reinterpret_cast<const wchar_t*>(buffer.data()),
+      static_cast<int>(num_chars_in_buffer), nullptr, 0, nullptr, nullptr);
+  std::string local_time_str;
+  local_time_str.resize(static_cast<size_t>(num_bytes_in_utf8));
+  ::WideCharToMultiByte(
+      CP_UTF8, 0, reinterpret_cast<const wchar_t*>(buffer.data()),
+      static_cast<int>(num_chars_in_buffer), &local_time_str[0],
+      num_bytes_in_utf8, nullptr, nullptr);
+  return local_time_str;
 }
-#endif
+#endif  // USE_WIN32_LOCAL_TIME_ZONE
 }  // namespace
 
 std::string time_zone::name() const { return effective_impl().Name(); }
@@ -256,36 +262,9 @@
   }
 #endif
 #if defined(USE_WIN32_LOCAL_TIME_ZONE)
-  // Use the WinRT Calendar class to get the local time zone. This feature is
-  // available on Windows 10 and later. The library is dynamically linked to
-  // maintain binary compatibility with Windows XP - Windows 7. On Windows 8,
-  // The combase.dll API functions are available but the RoActivateInstance
-  // call will fail for the Calendar class.
-  std::string winrt_tz;
-  const HMODULE combase =
-      LoadLibraryEx(_T("combase.dll"), nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
-  if (combase) {
-    const auto ro_initialize = reinterpret_cast<decltype(&::RoInitialize)>(
-        GetProcAddress(combase, "RoInitialize"));
-    const auto ro_uninitialize = reinterpret_cast<decltype(&::RoUninitialize)>(
-        GetProcAddress(combase, "RoUninitialize"));
-    if (ro_initialize && ro_uninitialize) {
-      const HRESULT hr = ro_initialize(RO_INIT_MULTITHREADED);
-      // RPC_E_CHANGED_MODE means that a previous RoInitialize call specified
-      // a different concurrency model. The WinRT runtime is initialized and
-      // should work for our purpose here, but we should *not* call
-      // RoUninitialize because it's a failure.
-      if (SUCCEEDED(hr) || hr == RPC_E_CHANGED_MODE) {
-        winrt_tz = win32_local_time_zone(combase);
-        if (SUCCEEDED(hr)) {
-          ro_uninitialize();
-        }
-      }
-    }
-    FreeLibrary(combase);
-  }
-  if (!winrt_tz.empty()) {
-    zone = winrt_tz.c_str();
+  std::string win32_tz = win32_local_time_zone();
+  if (!win32_tz.empty()) {
+    zone = win32_tz.c_str();
   }
 #endif
 
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index 0ef7975..b2abbe1 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -304,7 +304,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/13482523/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/13484972/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/angle b/third_party/angle
index bf837e0..333395f 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit bf837e01756fdd934c0f6adb17e5e379dde0f74a
+Subproject commit 333395f96bfc371f267ce477efafee0695d2c7a1
diff --git a/third_party/blink/public/mojom/mediastream/media_stream.mojom b/third_party/blink/public/mojom/mediastream/media_stream.mojom
index f7364ef5..9e7a78d 100644
--- a/third_party/blink/public/mojom/mediastream/media_stream.mojom
+++ b/third_party/blink/public/mojom/mediastream/media_stream.mojom
@@ -71,7 +71,7 @@
   NOT_SUPPORTED,
   FAILED_DUE_TO_SHUTDOWN,
   KILL_SWITCH_ON,
-  SYSTEM_PERMISSION_DENIED,
+  PERMISSION_DENIED_BY_SYSTEM,
   DEVICE_IN_USE,
   REQUEST_CANCELLED,
   START_TIMEOUT,
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 89a2f93..e01bb34 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -630,8 +630,6 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_transaction_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_version_change_event_init.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_version_change_event_init.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_claim_requirement.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_claim_requirement.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error_init.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error_init.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_logout_r_ps_request.cc",
@@ -654,8 +652,6 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_request_provider.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_resolve_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_resolve_options.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_standard_claims.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_standard_claims.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_user_info.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_user_info.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idle_options.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index ea5b584..5a1ae04 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -195,7 +195,6 @@
   "//third_party/blink/renderer/modules/credentialmanagement/federated_credential.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/federated_credential_init.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/federated_credential_request_options.idl",
-  "//third_party/blink/renderer/modules/credentialmanagement/identity_claim_requirement.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/identity_credential.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/identity_credential_logout_r_ps_request.idl",
@@ -203,7 +202,6 @@
   "//third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/identity_provider_account.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl",
-  "//third_party/blink/renderer/modules/credentialmanagement/identity_standard_claims.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/navigator_credentials.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/navigator_identity.idl",
   "//third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl",
diff --git a/third_party/blink/renderer/core/animation/css_font_weight_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_font_weight_interpolation_type.cc
index f57ccfe..5507e0e8 100644
--- a/third_party/blink/renderer/core/animation/css_font_weight_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_font_weight_interpolation_type.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
+#include "third_party/blink/renderer/core/animation/tree_counting_checker.h"
 #include "third_party/blink/renderer/core/css/css_identifier_value.h"
 #include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
@@ -65,6 +66,7 @@
     ConversionCheckers& conversion_checkers) const {
   FontSelectionValue inherited_font_weight =
       state.ParentStyle()->GetFontWeight();
+  const CSSLengthResolver& length_resolver = state.CssToLengthConversionData();
   if (const auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
     CSSValueID keyword = identifier_value->GetValueID();
     if (keyword == CSSValueID::kBolder || keyword == CSSValueID::kLighter) {
@@ -72,15 +74,19 @@
           MakeGarbageCollected<InheritedFontWeightChecker>(
               inherited_font_weight));
     }
+  } else if (const auto* primitive_value =
+                 DynamicTo<CSSPrimitiveValue>(value)) {
+    if (primitive_value->IsElementDependent()) {
+      conversion_checkers.push_back(
+          TreeCountingChecker::Create(length_resolver));
+    }
   }
   // TODO(40946458): Should do a proper interpolation here instead of converting
   // relative units first.
-  // TODO(crbug.com/415626999): Create a TreeCountingChecker for sibling-index()
-  // and sibling-count() if necessary.
   // TODO(crbug.com/415572412): Create a LengthUnitsChecker for relative units
   // if necessary.
   return CreateFontWeightValue(StyleBuilderConverterBase::ConvertFontWeight(
-      state.CssToLengthConversionData(), value, inherited_font_weight));
+      length_resolver, value, inherited_font_weight));
 }
 
 InterpolationValue
diff --git a/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc
index 57533fe4..09e19cb 100644
--- a/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc
@@ -92,11 +92,11 @@
   if (!primitive_value || !primitive_value->IsNumber()) {
     return nullptr;
   }
+  const CSSLengthResolver& length_resolver = state.CssToLengthConversionData();
   if (primitive_value->IsElementDependent()) {
-    conversion_checkers.push_back(TreeCountingChecker::Create(state));
+    conversion_checkers.push_back(TreeCountingChecker::Create(length_resolver));
   }
-  return CreateNumberValue(
-      primitive_value->ComputeNumber(state.CssToLengthConversionData()));
+  return CreateNumberValue(primitive_value->ComputeNumber(length_resolver));
 }
 
 InterpolationValue
diff --git a/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc
index dc1be7d..bc343e2d 100644
--- a/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc
@@ -92,11 +92,12 @@
   }
   // TODO(crbug.com/415572412): Create a LengthUnitsChecker for relative units
   // if necessary.
+  const CSSLengthResolver& length_resolver = state.CssToLengthConversionData();
   if (primitive_value->IsElementDependent()) {
-    conversion_checkers.push_back(TreeCountingChecker::Create(state));
+    conversion_checkers.push_back(TreeCountingChecker::Create(length_resolver));
   }
   return CreatePercentageValue(
-      primitive_value->ComputePercentage(state.CssToLengthConversionData()));
+      primitive_value->ComputePercentage(length_resolver));
 }
 
 InterpolationValue
diff --git a/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc
index 07af7cf..d0d630c6 100644
--- a/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc
@@ -9,6 +9,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/animation/interpolable_value.h"
+#include "third_party/blink/renderer/core/animation/tree_counting_checker.h"
 #include "third_party/blink/renderer/core/animation/underlying_value_owner.h"
 #include "third_party/blink/renderer/core/css/css_math_function_value.h"
 #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
@@ -26,10 +27,6 @@
     const CSSValue& value,
     const CSSLengthResolver& length_resolver) {
   const auto& primitive_value = To<CSSPrimitiveValue>(value);
-  // TODO(crbug.com/415626999): Create a TreeCountingChecker for sibling-index()
-  // and sibling-count() if necessary.
-  // TODO(crbug.com/415572412): Create a LengthUnitsChecker for relative units
-  // if necessary.
   // TODO(crbug.com/41494232): Don't resolve it here, once we can divide units.
   // The problem now is when we end up with kNumber for neutral keyframe
   // and kPercentage for non-neutral keyframe, we have to sum number and
@@ -196,7 +193,7 @@
 InterpolationValue CSSScaleInterpolationType::MaybeConvertValue(
     const CSSValue& value,
     const StyleResolverState& state,
-    ConversionCheckers&) const {
+    ConversionCheckers& conversion_checkers) const {
   if (!value.IsBaseValueList())
     return CreateInterpolationValue();
 
@@ -204,6 +201,16 @@
   DCHECK(list.length() >= 1 && list.length() <= 3);
 
   CSSToLengthConversionData conversion_data = state.CssToLengthConversionData();
+
+  // TODO(crbug.com/415572412): Create a LengthUnitsChecker for relative units
+  // if necessary.
+  for (const auto& scale_value : list) {
+    if (To<CSSPrimitiveValue>(*scale_value).IsElementDependent()) {
+      conversion_checkers.push_back(
+          TreeCountingChecker::Create(conversion_data));
+      break;
+    }
+  }
   if (list.length() == 1) {
     InterpolableNumber* scale =
         CSSValueToInterpolableNumber(list.Item(0), conversion_data);
diff --git a/third_party/blink/renderer/core/animation/tree_counting_checker.cc b/third_party/blink/renderer/core/animation/tree_counting_checker.cc
index c24c10f..bc038f9 100644
--- a/third_party/blink/renderer/core/animation/tree_counting_checker.cc
+++ b/third_party/blink/renderer/core/animation/tree_counting_checker.cc
@@ -4,14 +4,14 @@
 
 #include "third_party/blink/renderer/core/animation/tree_counting_checker.h"
 
-#include "third_party/blink/renderer/core/css/resolver/style_resolver_state.h"
+#include "third_party/blink/renderer/core/css/css_length_resolver.h"
 #include "third_party/blink/renderer/core/dom/nth_index_cache.h"
 
 namespace blink {
 
 TreeCountingChecker* TreeCountingChecker::Create(
-    const StyleResolverState& state) {
-  const Element* element = state.CssToLengthConversionData().GetElement();
+    const CSSLengthResolver& length_resolver) {
+  const Element* element = length_resolver.GetElement();
   CHECK(element);
   unsigned nth_child_index =
       NthIndexCache::NthChildIndex(const_cast<Element&>(*element),
diff --git a/third_party/blink/renderer/core/animation/tree_counting_checker.h b/third_party/blink/renderer/core/animation/tree_counting_checker.h
index 67a77091..2703ea7b 100644
--- a/third_party/blink/renderer/core/animation/tree_counting_checker.h
+++ b/third_party/blink/renderer/core/animation/tree_counting_checker.h
@@ -19,7 +19,7 @@
       : nth_child_index_(nth_child_index),
         nth_last_child_index_(nth_last_child_index) {}
 
-  static TreeCountingChecker* Create(const StyleResolverState& state);
+  static TreeCountingChecker* Create(const CSSLengthResolver& length_resolver);
 
   bool IsValid(const StyleResolverState& state,
                const InterpolationValue& underlying) const final;
diff --git a/third_party/blink/renderer/core/css/style_rule_font_palette_values.cc b/third_party/blink/renderer/core/css/style_rule_font_palette_values.cc
index fa436f1..46cda67 100644
--- a/third_party/blink/renderer/core/css/style_rule_font_palette_values.cc
+++ b/third_party/blink/renderer/core/css/style_rule_font_palette_values.cc
@@ -85,7 +85,8 @@
   // TODO(yosin): Should we use ` ThreadState::NoAllocationScope` for main
   // thread? Font threads hit `DCHECK` because they don't have `ThreadState'.
 
-  auto ConvertToColor = [](const CSSValuePair& override_pair) -> Color {
+  auto ConvertToColor =
+      [](const CSSValuePair& override_pair) -> std::optional<Color> {
     if (override_pair.Second().IsIdentifierValue()) {
       const CSSIdentifierValue& color_identifier =
           To<CSSIdentifierValue>(override_pair.Second());
@@ -96,9 +97,15 @@
           color_identifier.GetValueID(), mojom::blink::ColorScheme::kLight,
           /*color_provider=*/nullptr, /*is_in_web_app_scope=*/false);
     }
-    const cssvalue::CSSColor& css_color =
-        To<cssvalue::CSSColor>(override_pair.Second());
-    return css_color.Value();
+    if (const cssvalue::CSSColor* css_color =
+            DynamicTo<cssvalue::CSSColor>(override_pair.Second())) {
+      return css_color->Value();
+    }
+    // TODO(crbug.com/417398613): The code above needs to call
+    // ResolveColorValue() with an appropriate context to resolve all kinds of
+    // absolute colors here.
+    // Ignore complex colors for now to avoid crashing.
+    return std::nullopt;
   };
 
   MediaValues* media_values =
@@ -113,11 +120,14 @@
         To<CSSPrimitiveValue>(override_pair.First());
     DCHECK(palette_index.IsInteger());
 
-    const Color override_color = ConvertToColor(override_pair);
-
+    std::optional<const Color> override_color = ConvertToColor(override_pair);
+    if (!override_color.has_value()) {
+      // See comment in ConvertToColor() above.
+      continue;
+    }
     FontPalette::FontPaletteOverride palette_override{
         ClampTo<uint16_t>(palette_index.ComputeInteger(*media_values)),
-        override_color};
+        override_color.value()};
     return_overrides.push_back(palette_override);
   }
 
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index d4ca981..3e4576d 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -10808,6 +10808,7 @@
 }
 
 void Element::ChangeInterestState(Element* target, InterestState new_state) {
+  DCHECK_NE(this, target);
   EnsureElementRareData().EnsureInvokerData().SetInterestState(new_state);
   PseudoStateChanged(CSSSelector::kPseudoHasInterest);
   PseudoStateChanged(CSSSelector::kPseudoHasPartialInterest);
@@ -11010,6 +11011,13 @@
       // an interest invoker), even if the interesttarget attribute
       // has been removed.
       invoker_data->CancelInterestLostTask();
+      // If the invoker is at partial interest (it was keyboard-activated) but
+      // it just got mouse-hovered, upgrade it to full interest.
+      if (invoker_data->GetInterestState() == InterestState::kPartialInterest &&
+          source == InterestTargetSource::kHover) {
+        ChangeInterestState(InterestTargetElement(),
+                            InterestState::kFullInterest);
+      }
     }
     if (upstream_invoker) [[unlikely]] {
       // Cancel (unconditionally) any InterestLost tasks on the interest
@@ -11026,10 +11034,14 @@
                                               InterestState::kFullInterest);
       }
     }
-    if (auto* target = InterestTargetElement()) [[unlikely]] {
-      // This is an interest invoker that was just hovered or focused. Schedule
-      // an InterestGained task, with a new state of "full interest" (for
-      // hover), or "potential partial interest" (for focus).
+    if (auto* target = InterestTargetElement();
+        target && (!invoker_data || invoker_data->GetInterestState() ==
+                                        InterestState::kNoInterest))
+        [[unlikely]] {
+      // This is an interest invoker that doesn't already have interest, and was
+      // just hovered or focused. Schedule an InterestGained task, with a new
+      // state of "full interest" (for hover), or "potential partial interest"
+      // (for focus).
       auto* target_popover = DynamicTo<HTMLElement>(target);
       bool might_need_partial_interest =
           source == InterestTargetSource::kFocusElementChain &&
diff --git a/third_party/blink/renderer/core/editing/commands/composite_edit_command.h b/third_party/blink/renderer/core/editing/commands/composite_edit_command.h
index 04811b78..632adbe6 100644
--- a/third_party/blink/renderer/core/editing/commands/composite_edit_command.h
+++ b/third_party/blink/renderer/core/editing/commands/composite_edit_command.h
@@ -116,7 +116,7 @@
                         Node* ref_child,
                         EditingState*,
                         ShouldAssumeContentIsAlwaysEditable =
-                            kDoNotAssumeContentIsAlwaysEditable);
+                            ShouldAssumeContentIsAlwaysEditable(false));
   void InsertParagraphSeparator(
       EditingState*,
       bool use_default_paragraph_element = false,
@@ -135,21 +135,23 @@
   void RemoveCSSProperty(Element*, CSSPropertyID);
   void RemoveElementAttribute(Element*, const QualifiedName& attribute);
   // Remove all children if possible
-  void RemoveAllChildrenIfPossible(ContainerNode*,
-                                   EditingState*,
-                                   ShouldAssumeContentIsAlwaysEditable =
-                                       kDoNotAssumeContentIsAlwaysEditable);
+  void RemoveAllChildrenIfPossible(
+      ContainerNode*,
+      EditingState*,
+      ShouldAssumeContentIsAlwaysEditable =
+          ShouldAssumeContentIsAlwaysEditable(false));
   void RemoveChildrenInRange(Node*, unsigned from, unsigned to, EditingState*);
   virtual void RemoveNode(Node*,
                           EditingState*,
                           ShouldAssumeContentIsAlwaysEditable =
-                              kDoNotAssumeContentIsAlwaysEditable);
+                              ShouldAssumeContentIsAlwaysEditable(false));
   HTMLSpanElement* ReplaceElementWithSpanPreservingChildrenAndAttributes(
       HTMLElement*);
-  void RemoveNodePreservingChildren(Node*,
-                                    EditingState*,
-                                    ShouldAssumeContentIsAlwaysEditable =
-                                        kDoNotAssumeContentIsAlwaysEditable);
+  void RemoveNodePreservingChildren(
+      Node*,
+      EditingState*,
+      ShouldAssumeContentIsAlwaysEditable =
+          ShouldAssumeContentIsAlwaysEditable(false));
   void RemoveNodeAndPruneAncestors(Node*,
                                    EditingState*,
                                    Node* exclude_node = nullptr);
diff --git a/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc b/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc
index 6218e5b..bfa0a126 100644
--- a/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc
+++ b/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc
@@ -26,7 +26,7 @@
                         Node* ref_child,
                         EditingState*,
                         ShouldAssumeContentIsAlwaysEditable =
-                            kDoNotAssumeContentIsAlwaysEditable);
+                            ShouldAssumeContentIsAlwaysEditable(false));
   void InsertNodeAfter(Node*, Node*, EditingState*);
 
   void MoveParagraphContentsToNewBlockIfNecessary(const Position&,
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
index 5e6b8a1..b50545b 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
@@ -624,11 +624,9 @@
         });
   }
 
-  const ShouldAssumeContentIsAlwaysEditable always_editable =
+  const ShouldAssumeContentIsAlwaysEditable always_editable(
       RuntimeEnabledFeatures::EditingFastDeleteEnabled() &&
-              EnclosingTextControl(node)
-          ? kAssumeContentIsAlwaysEditable
-          : kDoNotAssumeContentIsAlwaysEditable;
+      EnclosingTextControl(node));
   // Actually remove the nodes in |nodes_to_be_removed|.
   for (Node* node_to_be_removed : nodes_to_be_removed) {
     if (!downstream_end_.AnchorNode()->IsDescendantOf(node_to_be_removed)) {
@@ -650,7 +648,7 @@
         // clear them.
         RemoveAllChildrenIfPossible(To<ContainerNode>(node_to_be_removed),
                                     editing_state,
-                                    kDoNotAssumeContentIsAlwaysEditable);
+                                    ShouldAssumeContentIsAlwaysEditable(false));
         if (editing_state->IsAborted())
           return;
 
@@ -664,7 +662,7 @@
       // Likewise for the root editable element.
       RemoveAllChildrenIfPossible(To<ContainerNode>(node_to_be_removed),
                                   editing_state,
-                                  kDoNotAssumeContentIsAlwaysEditable);
+                                  ShouldAssumeContentIsAlwaysEditable(false));
       if (editing_state->IsAborted())
         return;
 
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.h b/third_party/blink/renderer/core/editing/commands/delete_selection_command.h
index b9565e0..fec876b5 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.h
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.h
@@ -73,7 +73,7 @@
   void RemoveNode(Node*,
                   EditingState*,
                   ShouldAssumeContentIsAlwaysEditable =
-                      kDoNotAssumeContentIsAlwaysEditable) override;
+                      ShouldAssumeContentIsAlwaysEditable(false)) override;
   void RemoveCompletelySelectedNodes(Node* start_node,
                                      EditingState* editing_state);
   void DeleteTextFromNode(Text*, unsigned, unsigned) override;
diff --git a/third_party/blink/renderer/core/editing/commands/edit_command.h b/third_party/blink/renderer/core/editing/commands/edit_command.h
index fab95c8..39d4f14 100644
--- a/third_party/blink/renderer/core/editing/commands/edit_command.h
+++ b/third_party/blink/renderer/core/editing/commands/edit_command.h
@@ -26,6 +26,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_EDIT_COMMAND_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_EDIT_COMMAND_H_
 
+#include "base/types/strong_alias.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/events/input_event.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
@@ -75,10 +76,8 @@
   bool selection_is_directional_ = false;
 };
 
-enum ShouldAssumeContentIsAlwaysEditable {
-  kAssumeContentIsAlwaysEditable,
-  kDoNotAssumeContentIsAlwaysEditable,
-};
+using ShouldAssumeContentIsAlwaysEditable =
+    base::StrongAlias<class ShouldAssumeContentIsAlwaysEditableTag, bool>;
 
 class CORE_EXPORT SimpleEditCommand : public EditCommand {
  public:
diff --git a/third_party/blink/renderer/core/editing/commands/insert_node_before_command.cc b/third_party/blink/renderer/core/editing/commands/insert_node_before_command.cc
index 3058437..acc884e 100644
--- a/third_party/blink/renderer/core/editing/commands/insert_node_before_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/insert_node_before_command.cc
@@ -54,10 +54,10 @@
 void InsertNodeBeforeCommand::DoApply(EditingState* editing_state) {
   ContainerNode* parent = ref_child_->parentNode();
   GetDocument().UpdateStyleAndLayoutTree();
-  if (!parent || (should_assume_content_is_always_editable_ ==
-                      kDoNotAssumeContentIsAlwaysEditable &&
-                  !IsEditable(*parent)))
+  if (!parent ||
+      (!should_assume_content_is_always_editable_ && !IsEditable(*parent))) {
     return;
+  }
   DCHECK(IsEditable(*parent)) << parent;
 
   DummyExceptionStateForTesting exception_state;
diff --git a/third_party/blink/renderer/core/editing/commands/remove_node_command.cc b/third_party/blink/renderer/core/editing/commands/remove_node_command.cc
index 0f53a8f4..3d3884cb 100644
--- a/third_party/blink/renderer/core/editing/commands/remove_node_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/remove_node_command.cc
@@ -51,8 +51,7 @@
     return;
   }
   if (RuntimeEnabledFeatures::EditingFastDeleteEnabled()) {
-    if (should_assume_content_is_always_editable_ ==
-        kDoNotAssumeContentIsAlwaysEditable) {
+    if (!should_assume_content_is_always_editable_) {
       GetDocument().UpdateStyleAndLayoutTree();
       if (!IsEditable(*parent) && parent->InActiveDocument()) {
         return;
@@ -60,9 +59,8 @@
     }
   } else {
     GetDocument().UpdateStyleAndLayoutTree();
-    if (should_assume_content_is_always_editable_ ==
-            kDoNotAssumeContentIsAlwaysEditable &&
-        !IsEditable(*parent) && parent->InActiveDocument()) {
+    if (!should_assume_content_is_always_editable_ && !IsEditable(*parent) &&
+        parent->InActiveDocument()) {
       return;
     }
   }
diff --git a/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc b/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc
index 9a53a42e..5e31403 100644
--- a/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc
@@ -110,7 +110,7 @@
     if (num_pruned_ancestors < 0)
       continue;
     RemoveNodePreservingChildren(nodes_to_remove[i], editing_state,
-                                 kAssumeContentIsAlwaysEditable);
+                                 ShouldAssumeContentIsAlwaysEditable(true));
     if (editing_state->IsAborted())
       return;
     i += num_pruned_ancestors;
@@ -141,16 +141,16 @@
     return 0;
 
   RemoveNode(nodes_to_remove[start_node_index], editing_state,
-             kAssumeContentIsAlwaysEditable);
+             ShouldAssumeContentIsAlwaysEditable(true));
   if (editing_state->IsAborted())
     return -1;
   InsertNodeBefore(nodes_to_remove[start_node_index],
                    highest_ancestor_to_remove, editing_state,
-                   kAssumeContentIsAlwaysEditable);
+                   ShouldAssumeContentIsAlwaysEditable(true));
   if (editing_state->IsAborted())
     return -1;
   RemoveNode(highest_ancestor_to_remove, editing_state,
-             kAssumeContentIsAlwaysEditable);
+             ShouldAssumeContentIsAlwaysEditable(true));
   if (editing_state->IsAborted())
     return -1;
 
diff --git a/third_party/blink/renderer/core/editing/selection_editor.cc b/third_party/blink/renderer/core/editing/selection_editor.cc
index 99064251..d2fda25e 100644
--- a/third_party/blink/renderer/core/editing/selection_editor.cc
+++ b/third_party/blink/renderer/core/editing/selection_editor.cc
@@ -165,14 +165,12 @@
   selection_.ResetDirectionCache();
 
   // See: https://w3c.github.io/selection-api/#selectionchange-event
-  if (RuntimeEnabledFeatures::ScheduleSelectionChangeOnBackspaceEnabled()) {
-    TextControlElement* text_control =
-        EnclosingTextControl(GetSelectionInDOMTree().Anchor());
-    if (text_control && !text_control->IsInShadowTree()) {
-      text_control->ScheduleSelectionchangeEvent();
-    } else {
-      GetDocument().ScheduleSelectionchangeEvent();
-    }
+  TextControlElement* text_control =
+      EnclosingTextControl(GetSelectionInDOMTree().Anchor());
+  if (text_control && !text_control->IsInShadowTree()) {
+    text_control->ScheduleSelectionchangeEvent();
+  } else {
+    GetDocument().ScheduleSelectionchangeEvent();
   }
 
   MarkCacheDirty();
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
index 4d4a115..2c23e7f 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
@@ -79,9 +79,9 @@
 class ImageBitmap;
 class ScriptState;
 class StaticBitmapImage;
-class
+using V8RenderingContext = class
     V8UnionCanvasRenderingContext2DOrGPUCanvasContextOrImageBitmapRenderingContextOrWebGL2RenderingContextOrWebGLRenderingContext;
-class
+using V8OffscreenRenderingContext = class
     V8UnionGPUCanvasContextOrImageBitmapRenderingContextOrOffscreenCanvasRenderingContext2DOrWebGL2RenderingContextOrWebGLRenderingContext;
 class WebGraphicsContext3DVideoFramePool;
 
@@ -209,12 +209,8 @@
   virtual bool isContextLost() const { return true; }
   bool IsContextBeingRestored() const { return is_context_being_restored_; }
   // TODO(fserb): remove AsV8RenderingContext and AsV8OffscreenRenderingContext.
-  virtual V8UnionCanvasRenderingContext2DOrGPUCanvasContextOrImageBitmapRenderingContextOrWebGL2RenderingContextOrWebGLRenderingContext*
-  AsV8RenderingContext() {
-    NOTREACHED();
-  }
-  virtual V8UnionGPUCanvasContextOrImageBitmapRenderingContextOrOffscreenCanvasRenderingContext2DOrWebGL2RenderingContextOrWebGLRenderingContext*
-  AsV8OffscreenRenderingContext() {
+  virtual V8RenderingContext* AsV8RenderingContext() { NOTREACHED(); }
+  virtual V8OffscreenRenderingContext* AsV8OffscreenRenderingContext() {
     NOTREACHED();
   }
   virtual bool IsPaintable() const = 0;
diff --git a/third_party/blink/renderer/modules/canvas/BUILD.gn b/third_party/blink/renderer/modules/canvas/BUILD.gn
index 51ad545..9b5c305 100644
--- a/third_party/blink/renderer/modules/canvas/BUILD.gn
+++ b/third_party/blink/renderer/modules/canvas/BUILD.gn
@@ -5,6 +5,17 @@
 import("//testing/libfuzzer/fuzzer_test.gni")
 import("//third_party/blink/renderer/modules/modules.gni")
 
+blink_modules_sources("canvas_proxy_headers") {
+  sources = [
+    "htmlcanvas/v8_rendering_context.h",
+    "offscreencanvas/v8_offscreen_rendering_context.h",
+  ]
+
+  if (is_win) {
+    arflags = [ "/llvmlibempty" ]
+  }
+}
+
 blink_modules_sources("canvas") {
   sources = [
     "canvas2d/base_rendering_context_2d.cc",
@@ -61,6 +72,8 @@
     "testing/canvas_test_utils.cc",
   ]
 
+  public_deps =
+      [ "//third_party/blink/renderer/modules/canvas:canvas_proxy_headers" ]
   deps = [
     "//third_party/blink/renderer/modules/webcodecs",
     "//third_party/blink/renderer/modules/webgpu",
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
index fe4d813..a6d75361 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -58,8 +58,6 @@
 #include "third_party/blink/public/mojom/scroll/scroll_enums.mojom-blink.h"
 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
 #include "third_party/blink/public/platform/task_type.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/css/css_property_names.h"
 #include "third_party/blink/renderer/core/css/css_property_value_set.h"
@@ -90,6 +88,7 @@
 #include "third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h"
 #include "third_party/blink/renderer/modules/canvas/canvas2d/path_2d.h"
 #include "third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.h"
+#include "third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h"
 #include "third_party/blink/renderer/platform/fonts/font.h"
 #include "third_party/blink/renderer/platform/geometry/layout_unit.h"
 #include "third_party/blink/renderer/platform/geometry/path.h"
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
index 13e692c..75b977f 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
@@ -35,7 +35,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "cc/paint/paint_record.h"
 #include "third_party/blink/public/common/privacy_budget/identifiable_token.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h"
 #include "third_party/blink/renderer/core/canvas_interventions/canvas_interventions_enums.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.h"
diff --git a/third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h b/third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h
new file mode 100644
index 0000000..cfa8ac67
--- /dev/null
+++ b/third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h
@@ -0,0 +1,13 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_HTMLCANVAS_V8_RENDERING_CONTEXT_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_HTMLCANVAS_V8_RENDERING_CONTEXT_H_
+
+// This is just a forwarding header to avoid including an enormous filename in
+// each file that needs the declaration of the union that is used for
+// RenderingContext.
+#include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h"
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_HTMLCANVAS_V8_RENDERING_CONTEXT_H_
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
index 8ff3abe..2dceeed 100644
--- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
+++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
@@ -6,9 +6,9 @@
 
 #include <utility>
 
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h"
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
+#include "third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h"
+#include "third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h b/third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h
new file mode 100644
index 0000000..b44bacfe
--- /dev/null
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h
@@ -0,0 +1,13 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_OFFSCREENCANVAS_V8_OFFSCREEN_RENDERING_CONTEXT_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_OFFSCREENCANVAS_V8_OFFSCREEN_RENDERING_CONTEXT_H_
+
+// This is just a forwarding header to avoid including an enormous filename in
+// each file that needs the declaration of the union that is used for
+// OffscreenRenderingContext.
+#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h"
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_OFFSCREENCANVAS_V8_OFFSCREEN_RENDERING_CONTEXT_H_
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
index e3e7390..9dfae0e 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -9,7 +9,6 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_canvas_font_stretch.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_canvas_text_rendering.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h"
 #include "third_party/blink/renderer/core/css/offscreen_font_selector.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser.h"
 #include "third_party/blink/renderer/core/css/resolver/font_style_resolver.h"
@@ -23,6 +22,7 @@
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/core/workers/worker_settings.h"
 #include "third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.h"
+#include "third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h"
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
index b6ec7e0..9c1135a7 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_CANVAS_OFFSCREENCANVAS2D_OFFSCREEN_CANVAS_RENDERING_CONTEXT_2D_H_
 
 #include "base/notreached.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h"
 #include "third_party/blink/renderer/core/canvas_interventions/canvas_interventions_enums.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_2d_color_params.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h"
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_claim_requirement.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_claim_requirement.idl
deleted file mode 100644
index f19cedd..0000000
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_claim_requirement.idl
+++ /dev/null
@@ -1,21 +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.
-
-dictionary IdentityClaimRequirement {
-  // Controls the optionality of the attribute.
-  // NOTE: "required" is a reserved WebIDL keyword, so we prefix it with
-  // the _ character to use it.
-  // https://webidl.spec.whatwg.org/#:~:text=escape%20an%20identifier
-  boolean _required;
-
-  // TODO(crbug.com/1400878): introduce the other requirement types as needed.
-  // Requires the attribute to be verified.
-  // boolean verified;
-  // Requires the attribute to be over a certain number.
-  // long over;
-  // Requires the attribute to be under a certain number.
-  // long under;
-  // Requires the attribute to be equal to certain value.
-  // any value;
-};
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
index d0942cd..56180b39 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
@@ -21,8 +21,6 @@
     IdentityCredentialRequestOptionsContext context = "signin";
     // Allows an RP to select between the two modes of operation: active or passive.
     [MeasureAs=FedCmButtonMode] IdentityCredentialRequestOptionsMode mode = "passive";
-    // A querying language that allows an RP to ask what it wants from the IdPs.
-    [RuntimeEnabled=FedCmSelectiveDisclosure] IdentityStandardClaims claims;
     // This is a debugging aid string instead of an actual member of this dictionary.
     // `mediation` could be accidentally set by web developers here and this helps
     // with showing debugging info to developers when it happens.
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_standard_claims.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_standard_claims.idl
deleted file mode 100644
index 4eff1f8..0000000
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_standard_claims.idl
+++ /dev/null
@@ -1,37 +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.
-
-dictionary IdentityStandardClaims {
-  // The standard identity claims is derived and kept consistent with the <form>
-  // autocomplete spec.
-  // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-autocomplete
-  // We are starting with the attributes that are currently supported, so many
-  // of the attributes are left commented out to allow us to introduce them
-  // incrementally, while still testing if the generalization will hold.
-  // TODO(crbug.com/1400878): introduce the other attributes as needed.
-  IdentityClaimRequirement name;
-  IdentityClaimRequirement givenName;
-  // IdentityClaimRequirement familyName;
-  // IdentityClaimRequirement nickname;
-  // IdentityClaimRequirement username;
-  IdentityClaimRequirement email;
-  // IdentityClaimRequirement sex;
-  // IdentityClaimRequirement bday;
-  // IdentityClaimRequirement language;
-  // IdentityClaimRequirement phoneNumber;
-  // IdentityClaimRequirement streetAddress;
-  // IdentityClaimRequirement country;
-  // IdentityClaimRequirement url;
-  // IdentityClaimRequirement tel;
-  // Age is neither in the OIDC Standard Claims nor in HTML, but maps better
-  // than bday (HTML) / birthday (OIDC).
-  // IdentityClaimRequirement age;
-  // Picture currently follows the OIDC Standard Claims
-  // https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims
-  // Which we take as equivalent to photo from the HTML standard.
-  // We use both to keep backwards compatibility with the AccountList
-  // dictionary.
-  IdentityClaimRequirement picture;
-  // IdentityClaimRequirement photo;
-};
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc
index dde7c17..39b4aab 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc
@@ -264,7 +264,7 @@
         MediaStreamRequestResult result;
         switch (run_state) {
           case VideoCaptureRunState::kSystemPermissionsError:
-            result = MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED;
+            result = MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM;
             break;
           case VideoCaptureRunState::kCameraBusyError:
             result = MediaStreamRequestResult::DEVICE_IN_USE;
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
index 8e15b27..9459b0b7 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
@@ -416,7 +416,8 @@
       StartSource(VideoTrackAdapterSettings(), std::nullopt, false, 0.0);
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(source_stopped_);
-  EXPECT_EQ(start_result_, MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED);
+  EXPECT_EQ(start_result_,
+            MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM);
 }
 
 TEST_F(MediaStreamVideoCapturerSourceTest, FailStartCamInUse) {
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
index a70b46a..e6249a8 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -111,8 +111,8 @@
       return "FAILED_DUE_TO_SHUTDOWN";
     case MediaStreamRequestResult::KILL_SWITCH_ON:
       return "KILL_SWITCH_ON";
-    case MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED:
-      return "SYSTEM_PERMISSION_DENIED";
+    case MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM:
+      return "PERMISSION_DENIED_BY_SYSTEM";
     case MediaStreamRequestResult::DEVICE_IN_USE:
       return "DEVICE_IN_USE";
     case MediaStreamRequestResult::REQUEST_CANCELLED:
@@ -120,10 +120,9 @@
     case MediaStreamRequestResult::START_TIMEOUT:
       return "START_TIMEOUT";
     case MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS:
-      return "NUM_MEDIA_REQUEST_RESULTS";
-    default:
-      NOTREACHED();
+      break;
   }
+  NOTREACHED();
 }
 
 void SendLogMessage(const std::string& message) {
@@ -254,6 +253,8 @@
 
 String ErrorCodeToString(MediaStreamRequestResult result) {
   switch (result) {
+    case MediaStreamRequestResult::OK:
+      return "OK";
     case MediaStreamRequestResult::PERMISSION_DENIED:
       return "Permission denied";
     case MediaStreamRequestResult::PERMISSION_DISMISSED:
@@ -279,8 +280,8 @@
     case MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN:
       return "Failed due to shutdown";
     case MediaStreamRequestResult::KILL_SWITCH_ON:
-      return "";
-    case MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED:
+      return "Killswitch on";
+    case MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM:
       return "Permission denied by system";
     case MediaStreamRequestResult::DEVICE_IN_USE:
       return "Device in use";
@@ -288,9 +289,12 @@
       return "Request was cancelled";
     case MediaStreamRequestResult::START_TIMEOUT:
       return "Timeout starting video source";
-    default:
-      NOTREACHED();
+    case MediaStreamRequestResult::CONSTRAINT_NOT_SATISFIED:
+      return "Constraint not satisfied";
+    case MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS:
+      break;  // Not a valid enum value.
   }
+  NOTREACHED();
 }
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_FUCHSIA)
@@ -2166,7 +2170,7 @@
     auto error = MediaStreamAudioSource::From(source)->ErrorCode();
     switch (error.value_or(AudioSourceErrorCode::kUnknown)) {
       case AudioSourceErrorCode::kSystemPermissions:
-        result = MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED;
+        result = MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM;
         message = "System Permssions prevented access to audio capture device";
         break;
       case AudioSourceErrorCode::kDeviceInUse:
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
index 911e3aee..037e320 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -850,16 +850,21 @@
 
 void UserMediaRequest::Fail(Result error, const String& message) {
   DCHECK(!is_resolved_);
-  if (!GetExecutionContext())
+
+  if (!GetExecutionContext()) {
     return;
-  DOMExceptionCode exception_code = DOMExceptionCode::kNotSupportedError;
-  UserMediaRequestResult result_enum =
-      UserMediaRequestResult::kNotSupportedError;
+  }
+
+  std::optional<DOMExceptionCode> exception_code;
+  std::optional<UserMediaRequestResult> result_enum;
+
   switch (error) {
+    case Result::OK:
+      NOTREACHED();  // Not a failure.
     case Result::PERMISSION_DENIED:
+    case Result::PERMISSION_DENIED_BY_SYSTEM:
     case Result::PERMISSION_DISMISSED:
     case Result::KILL_SWITCH_ON:
-    case Result::SYSTEM_PERMISSION_DENIED:
       exception_code = DOMExceptionCode::kNotAllowedError;
       result_enum = UserMediaRequestResult::kNotAllowedError;
       break;
@@ -890,20 +895,28 @@
       exception_code = DOMExceptionCode::kSecurityError;
       result_enum = UserMediaRequestResult::kSecurityError;
       break;
-    default:
+    case Result::CONSTRAINT_NOT_SATISFIED:
+    case Result::REQUEST_CANCELLED:
+      // TODO(crbug.com/416456028): Either handle these or document why
+      // they cannot be encountered by this method.
       NOTREACHED();
+    case Result::NUM_MEDIA_REQUEST_RESULTS:
+      NOTREACHED();  // Not a valid enum value.
   }
+  CHECK(exception_code.has_value());
+  CHECK(result_enum.has_value());
+
   RecordIdentifiabilityMetric(surface_, GetExecutionContext(),
                               IdentifiabilityBenignStringToken(message));
 
   if (auto* window = GetWindow()) {
     if (media_type_ == UserMediaRequestType::kUserMedia) {
       PeerConnectionTracker::From(*window).TrackGetUserMediaFailure(
-          this, DOMException::GetErrorName(exception_code), message);
+          this, DOMException::GetErrorName(*exception_code), message);
     } else if (media_type_ == UserMediaRequestType::kDisplayMedia ||
                media_type_ == UserMediaRequestType::kAllScreensMedia) {
       PeerConnectionTracker::From(*window).TrackGetDisplayMediaFailure(
-          this, DOMException::GetErrorName(exception_code), message);
+          this, DOMException::GetErrorName(*exception_code), message);
     } else {
       NOTREACHED();
     }
@@ -913,8 +926,8 @@
   callbacks_->OnError(
       nullptr,
       MakeGarbageCollected<V8MediaStreamError>(
-          MakeGarbageCollected<DOMException>(exception_code, message)),
-      capture_controller_, result_enum);
+          MakeGarbageCollected<DOMException>(*exception_code, message)),
+      capture_controller_, *result_enum);
   is_resolved_ = true;
 }
 
diff --git a/third_party/blink/renderer/modules/webgl/BUILD.gn b/third_party/blink/renderer/modules/webgl/BUILD.gn
index fcf44281..bd1f629 100644
--- a/third_party/blink/renderer/modules/webgl/BUILD.gn
+++ b/third_party/blink/renderer/modules/webgl/BUILD.gn
@@ -187,8 +187,9 @@
   public_deps = [ "//device/vr/public/mojom:vr_service_blink" ]
   deps = [
     "//device/vr/buildflags:buildflags",
+    "//third_party/blink/renderer/modules/canvas:canvas_proxy_headers",
+    "//third_party/blink/renderer/modules/webcodecs:webcodecs",
     "//third_party/blink/renderer/modules/xr:xr",
   ]
-  deps += [ "//third_party/blink/renderer/modules/webcodecs:webcodecs" ]
   allow_circular_includes_from = deps
 }
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
index ca931ab..877b0d0 100644
--- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
@@ -9,13 +9,13 @@
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h"
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
+#include "third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h"
+#include "third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/ext_clip_control.h"
 #include "third_party/blink/renderer/modules/webgl/ext_color_buffer_float.h"
 #include "third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.h"
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
index 2e47412c..08369da9 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
@@ -31,13 +31,13 @@
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h"
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
+#include "third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h"
+#include "third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h"
 #include "third_party/blink/renderer/modules/webgl/ext_blend_min_max.h"
 #include "third_party/blink/renderer/modules/webgl/ext_clip_control.h"
diff --git a/third_party/blink/renderer/modules/webgpu/BUILD.gn b/third_party/blink/renderer/modules/webgpu/BUILD.gn
index 95caaa2..d429879a 100644
--- a/third_party/blink/renderer/modules/webgpu/BUILD.gn
+++ b/third_party/blink/renderer/modules/webgpu/BUILD.gn
@@ -110,6 +110,7 @@
     "//services/metrics/public/cpp:ukm_builders",
     "//skia",
     "//skia:skcms",
+    "//third_party/blink/renderer/modules/canvas:canvas_proxy_headers",
     "//third_party/blink/renderer/modules/webcodecs:webcodecs",
   ]
 
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
index 93a6a59..803ae29 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -12,12 +12,12 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_configuration.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_tone_mapping.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_tone_mapping_mode.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/html/canvas/predefined_color_space.h"
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
 #include "third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h"
+#include "third_party/blink/renderer/modules/canvas/htmlcanvas/v8_rendering_context.h"
+#include "third_party/blink/renderer/modules/canvas/offscreencanvas/v8_offscreen_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h"
 #include "third_party/blink/renderer/modules/webgpu/gpu.h"
 #include "third_party/blink/renderer/modules/webgpu/gpu_adapter.h"
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
index 8fe2224..aaae1a0 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
@@ -8,7 +8,6 @@
 #include "base/containers/heap_array.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_alpha_mode.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_tone_mapping_mode.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_rendering_context_factory.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index a446c03..3660469b 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2009,12 +2009,6 @@
       origin_trial_allows_third_party: true,
     },
     {
-      name: "FedCmSelectiveDisclosure",
-      depends_on: ["FedCm"],
-      public: true,
-      base_feature: "none",
-    },
-    {
       name: "FencedFrames",
       base_feature: "none",
       // This helps enable and expose the <fencedframe> element, but note that
@@ -4019,11 +4013,6 @@
       status: "stable",
     },
     {
-      // See crbug.com/41321247
-      name: "ScheduleSelectionChangeOnBackspace",
-      status: "stable",
-    },
-    {
       // https://wicg.github.io/webcomponents/proposals/Scoped-Custom-Element-Registries
       // https://github.com/whatwg/html/issues/10854
       // Spec PRs:
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/mac.py b/third_party/blink/tools/blinkpy/web_tests/port/mac.py
index 1717b02e..8d2d572 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/mac.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/mac.py
@@ -130,5 +130,10 @@
                                target=target)
 
     def path_to_smoke_tests_file(self):
+        config_name = self.flag_specific_config_name()
+        if config_name:
+            _, smoke_file = self.flag_specific_configs()[config_name]
+            return self._filesystem.join(self.web_tests_dir(), smoke_file)
+
         return self._filesystem.join(self.web_tests_dir(), 'TestLists',
                                      'MacOld.txt')
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 1cb7dbe..52037d3a 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -60,15 +60,39 @@
 # *** BEGIN Graphite failures on Mac-ARM ***
 
 # Reftest failures with off-by-1 color values
+crbug.com/395915411 [ Mac11-arm64 ] external/wpt/css/css-masking/mask-image/mask-opacity-1e.html [ Failure ]
+crbug.com/395915411 [ Mac12-arm64 ] external/wpt/css/css-masking/mask-image/mask-opacity-1e.html [ Failure ]
+crbug.com/395915411 [ Mac13-arm64 ] external/wpt/css/css-masking/mask-image/mask-opacity-1e.html [ Failure ]
 crbug.com/395915411 [ Mac14-arm64 ] external/wpt/css/css-masking/mask-image/mask-opacity-1e.html [ Failure ]
+crbug.com/395915411 [ Mac15-arm64 ] external/wpt/css/css-masking/mask-image/mask-opacity-1e.html [ Failure ]
+crbug.com/395915411 [ Mac11-arm64 ] external/wpt/css/filter-effects/backdrop-filter-backdrop-root-opacity.html [ Failure ]
+crbug.com/395915411 [ Mac12-arm64 ] external/wpt/css/filter-effects/backdrop-filter-backdrop-root-opacity.html [ Failure ]
+crbug.com/395915411 [ Mac13-arm64 ] external/wpt/css/filter-effects/backdrop-filter-backdrop-root-opacity.html [ Failure ]
 crbug.com/395915411 [ Mac14-arm64 ] external/wpt/css/filter-effects/backdrop-filter-backdrop-root-opacity.html [ Failure ]
+crbug.com/395915411 [ Mac15-arm64 ] external/wpt/css/filter-effects/backdrop-filter-backdrop-root-opacity.html [ Failure ]
+crbug.com/395915411 [ Mac11-arm64 ] external/wpt/css/filter-effects/drop-shadow-currentcolor-dynamic-003.html [ Failure ]
+crbug.com/395915411 [ Mac12-arm64 ] external/wpt/css/filter-effects/drop-shadow-currentcolor-dynamic-003.html [ Failure ]
+crbug.com/395915411 [ Mac13-arm64 ] external/wpt/css/filter-effects/drop-shadow-currentcolor-dynamic-003.html [ Failure ]
 crbug.com/395915411 [ Mac14-arm64 ] external/wpt/css/filter-effects/drop-shadow-currentcolor-dynamic-003.html [ Failure ]
+crbug.com/395915411 [ Mac15-arm64 ] external/wpt/css/filter-effects/drop-shadow-currentcolor-dynamic-003.html [ Failure ]
 crbug.com/395915411 [ Mac14-arm64 ] virtual/gpu-rasterization/external/wpt/css/css-images/cross-fade-premultiplied-alpha.html [ Failure ]
 # Reftest failures from MSAA vs. analytic AA code paths
+crbug.com/395914611 [ Mac11-arm64 ] external/wpt/css/filter-effects/backdrop-filter-clip-rect-2.html [ Failure ]
+crbug.com/395914611 [ Mac12-arm64 ] external/wpt/css/filter-effects/backdrop-filter-clip-rect-2.html [ Failure ]
+crbug.com/395914611 [ Mac13-arm64 ] external/wpt/css/filter-effects/backdrop-filter-clip-rect-2.html [ Failure ]
 crbug.com/395914611 [ Mac14-arm64 ] external/wpt/css/filter-effects/backdrop-filter-clip-rect-2.html [ Failure ]
+crbug.com/395914611 [ Mac15-arm64 ] external/wpt/css/filter-effects/backdrop-filter-clip-rect-2.html [ Failure ]
+crbug.com/395914611 [ Mac11-arm64 ] external/wpt/css/filter-effects/backdrop-filter-transform.html [ Failure ]
+crbug.com/395914611 [ Mac12-arm64 ] external/wpt/css/filter-effects/backdrop-filter-transform.html [ Failure ]
+crbug.com/395914611 [ Mac13-arm64 ] external/wpt/css/filter-effects/backdrop-filter-transform.html [ Failure ]
 crbug.com/395914611 [ Mac14-arm64 ] external/wpt/css/filter-effects/backdrop-filter-transform.html [ Failure ]
+crbug.com/395914611 [ Mac15-arm64 ] external/wpt/css/filter-effects/backdrop-filter-transform.html [ Failure ]
 # YUV edge sampling bug
+crbug.com/329041548 [ Mac11-arm64 ] media/video-colorspace-yuv422.html [ Failure ]
+crbug.com/329041548 [ Mac12-arm64 ] media/video-colorspace-yuv422.html [ Failure ]
+crbug.com/329041548 [ Mac13-arm64 ] media/video-colorspace-yuv422.html [ Failure ]
 crbug.com/329041548 [ Mac14-arm64 ] media/video-colorspace-yuv422.html [ Failure ]
+crbug.com/329041548 [ Mac15-arm64 ] media/video-colorspace-yuv422.html [ Failure ]
 
 # *** END Graphite suppressions ***
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-palette-relative-color-crash.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-palette-relative-color-crash.html
new file mode 100644
index 0000000..1dc973a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-palette-relative-color-crash.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Fonts: override-colors with relative color crashing Chrome</title>
+<link rel="help" href="https://crbug.com/417172068">
+<style>
+  @font-face {
+    font-family: Foo;
+    src: url(notfound.ttf);
+  }
+  @font-palette-values --foo {
+    font-family: Foo;
+    override-colors: 0 lch(from blue calc(0.5 * l) c h);
+  }
+  #target {
+    font-family: Foo;
+    font-palette: --foo;
+  }
+</style>
+<div id="target">Foo</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-font-weight-dynamic.html b/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-font-weight-dynamic.html
new file mode 100644
index 0000000..99fe0b3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-font-weight-dynamic.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() changing font-weight during @keyframes animation</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  @keyframes --anim {
+    from {
+      font-weight: calc(100 * sibling-index());
+    }
+    to {
+      font-weight: 600;
+    }
+  }
+  #target {
+    animation: --anim 1000s step-end;
+  }
+</style>
+<div>
+  <div id="rm"></div>
+  <div></div>
+  <div id="target"></div>
+</div>
+<script>
+  test(() => {
+    assert_equals(getComputedStyle(target).fontWeight, "300");
+  }, "Initially, the sibling-index() is 3 for #target");
+
+  test(() => {
+    rm.remove();
+    assert_equals(getComputedStyle(target).fontWeight, "200");
+  }, "Removing a preceding sibling of #target reduces the sibling-index()");
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-scale-dynamic.html b/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-scale-dynamic.html
new file mode 100644
index 0000000..5f8a64e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-scale-dynamic.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() changing scale() during @keyframes animation</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  @keyframes --anim {
+    from {
+      scale: 0.7 calc(0.2 * sibling-index());
+    }
+    to {
+      scale: 0.3 2;
+    }
+  }
+  #target {
+    animation: --anim 1000s step-end;
+  }
+</style>
+<div>
+  <div id="rm"></div>
+  <div></div>
+  <div id="target"></div>
+</div>
+<script>
+  test(() => {
+    assert_equals(getComputedStyle(target).scale, "0.7 0.6");
+  }, "Initially, the sibling-index() is 3 for #target");
+
+  test(() => {
+    rm.remove();
+    assert_equals(getComputedStyle(target).scale, "0.7 0.4");
+  }, "Removing a preceding sibling of #target reduces the sibling-index()");
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative.html
index 7cd50eb..67d4def 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative.html
@@ -128,6 +128,28 @@
 promise_test(async (t) => {
   checkPseudos(invoker,target,false,false,false,false,'initial');
   await focusOn(invoker);
+  checkPseudos(invoker,target,true,true,true,true,'focusing invoker shows partial interest');
+  invoker.setAttribute('style',`interest-target-delay: 10000s`);
+  await hoverOver(target);
+  checkPseudos(invoker,target,false,true,false,true,'invoker now has full interest');
+  assert_equals(document.activeElement,invoker,'focus does not move in this case');
+  await do_cleanup();
+},'Hovering the popover confers "full interest", without any delays');
+
+promise_test(async (t) => {
+  checkPseudos(invoker,target,false,false,false,false,'initial');
+  await focusOn(invoker);
+  checkPseudos(invoker,target,true,true,true,true,'focusing invoker shows partial interest');
+  invoker.setAttribute('style',`interest-target-delay: 10000s`);
+  await hoverOver(invoker);
+  checkPseudos(invoker,target,false,true,false,true,'invoker now has full interest');
+  assert_equals(document.activeElement,invoker,'focus does not move in this case');
+  await do_cleanup();
+},'Hovering the invoker confers "full interest", without any delays');
+
+promise_test(async (t) => {
+  checkPseudos(invoker,target,false,false,false,false,'initial');
+  await focusOn(invoker);
   await sendShowInterestHotkey();
   checkPseudos(invoker,target,false,true,false,true,'invoker now has full interest');
   await sendTab();
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png
deleted file mode 100644
index efc474e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png
deleted file mode 100644
index 26436aa1..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-transition-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-transition-expected.png
deleted file mode 100644
index 970fe9c6..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-transition-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png
deleted file mode 100644
index 3bb7d33..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/canvas-composite-expected.png
deleted file mode 100644
index 8749545..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/canvas-composite-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/image-object-in-canvas-expected.png
deleted file mode 100644
index ec996b6..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/image-object-in-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/ua-client-hints/useragentdata.https.tentative.any-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/ua-client-hints/useragentdata.https.tentative.any-expected.txt
deleted file mode 100644
index f1f8b58f..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/ua-client-hints/useragentdata.https.tentative.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Platform version and wow64-ness on Linux should be fixed values
-  assert_true: expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/ua-client-hints/useragentdata.https.tentative.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/ua-client-hints/useragentdata.https.tentative.any.worker-expected.txt
deleted file mode 100644
index f1f8b58f..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/ua-client-hints/useragentdata.https.tentative.any.worker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Platform version and wow64-ness on Linux should be fixed values
-  assert_true: expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/workers/WorkerNavigator_userAgentData.https.tentative-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/workers/WorkerNavigator_userAgentData.https.tentative-expected.txt
deleted file mode 100644
index aed4c2e5..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/workers/WorkerNavigator_userAgentData.https.tentative-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Platform version and wow64-ness on Linux should contain fixed values
-  assert_true: expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/media/color-profile-video-seek-expected.png
index 39b2099..62c86dc 100644
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/media/color-profile-video-seek-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-ruby-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-ruby-expected.png
index cda8f63..d5a00f7 100644
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
deleted file mode 100644
index 8bd187f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-corners-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-corners-expected.png
index 695e948..1a0a2a0 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-corners-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-corners-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-cube-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-cube-expected.png
index a5edc98..43c874fb 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-cube-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/3d-cube-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/backface-visibility-transformed-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/backface-visibility-transformed-expected.png
index e567ea2..bb1a1154 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/backface-visibility-transformed-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/backface-visibility-transformed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-expected.png
index 62271fbb..fc45e78 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-large-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-large-expected.png
index 345971d..b20f4e3 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-large-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/filter-occlusion-blur-large-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/tile-occlusion-boundaries-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/tile-occlusion-boundaries-expected.png
index d4ba03e0..98cfbd2 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/tile-occlusion-boundaries-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/culling/tile-occlusion-boundaries-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/direct-image-compositing-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/direct-image-compositing-expected.png
index ce8d1ef1..aa1c0df5 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/direct-image-compositing-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/direct-image-compositing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/flat-with-transformed-child-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/flat-with-transformed-child-expected.png
index ca2b09c..924a443 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/flat-with-transformed-child-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/flat-with-transformed-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png
index e85819f..805afcf 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png
index e63b30f..69cd9251c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png
index 0703829..80f1d6d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-expected.png
index 5f0904cc..3d1ba5c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/layer-due-to-layer-children-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/vertical-scroll-composited-expected.png
index f168869..ed9fd96 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/vertical-scroll-composited-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/vertical-scroll-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/video-opacity-overlay-expected.png
deleted file mode 100644
index 69d374b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/geometry/video-opacity-overlay-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png
index e074d33..852119c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png
index 98b40b5..8dd253a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/img-layer-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/img-layer-object-fit-expected.png
index 24d3f30..ee5649d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/img-layer-object-fit-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/img-layer-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/layers-inside-overflow-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/layers-inside-overflow-scroll-expected.png
index 189ddf5..7710e67 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/layers-inside-overflow-scroll-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/layers-inside-overflow-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-expected.png
index 83b0760..b6c5c67 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
index 5a10b74..ecc30e1 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png
index 1cd282c..f3ca7fc 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png
index 1d78e715..f801f52c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/mask-with-filter-expected.png
index 6167415..7221eef 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/mask-with-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/mask-with-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-expected.png
index f3a2a33..b74c8806 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png
index 6c03902..8b9d397 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png
index d3631d2..4893458 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-clip-expected.png
index b0d1758f..b8a22b8 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-clip-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png
index 8ccebb9..9b0eb63 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-expected.png
index b0d1758f..b8a22b8 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
index 79dbc4b..bd26650f 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png
index 3afc1716..65ccbc64 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/tiled-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/tiled-mask-expected.png
index 56254bf3..5a1e769 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/tiled-mask-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overflow/tiled-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-huge-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-huge-expected.png
index 3b849ae..28c8ff9 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-huge-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-huge-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perpendicular-layer-sorting-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perpendicular-layer-sorting-expected.png
index 6d9a942..7c0ff4b9 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perpendicular-layer-sorting-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perpendicular-layer-sorting-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perspective-interest-rect-expected.png
index 542f0977..d460adf 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perspective-interest-rect-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/perspective-interest-rect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/animation-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/animation-inside-reflection-expected.png
index 235e5191..930e9ed 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/animation-inside-reflection-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/animation-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png
index 3f8c2c3..752a222 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-animated-expected.png
deleted file mode 100644
index 8c38cf1..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-animated-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-transition-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-transition-expected.png
index 58944d6..26a16eb 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-transition-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/nested-reflection-transition-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/transform-inside-reflection-expected.png
index dbfdb4e..d10704a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/transform-inside-reflection-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/reflections/transform-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/self-painting-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/self-painting-layers-expected.png
index a2e21b7..96e8560 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/self-painting-layers-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/self-painting-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/transform-3d-scales-different-x-y-expected.png
index 876591172..ae7211e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/transform-3d-scales-different-x-y-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/transform-3d-scales-different-x-y-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/video/video-controls-squashing-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/video/video-controls-squashing-expected.png
index 598ae24..58ccdc0 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/video/video-controls-squashing-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/video/video-controls-squashing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-image-layers-expected.png
index 49a8efc..d7f3386 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-image-layers-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-image-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-simple-video-layer-expected.png
index 8884701..7183c76 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-simple-video-layer-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
index 99126ed..01541f5 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png
index d342c83..0333e6a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-all-on-background-hw-expected.png
index 7e06e15..e152e05 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-all-on-background-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-all-on-background-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-blur-hw-expected.png
index 67565e1..2e165f07 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-blur-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-blur-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-clamping-hw-expected.png
index 93d7571d..ebc92c8 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-clamping-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-clamping-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-hw-expected.png
index 15e7f452..2acb94c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-brightness-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-combined-hw-expected.png
index 8ce45086..30200e6 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-combined-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-combined-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-contrast-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-contrast-hw-expected.png
index 2ce4f77..249250cf 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-contrast-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-contrast-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-drop-shadow-hw-expected.png
index 6cd545b1..951168a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-drop-shadow-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-drop-shadow-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-colorspace-hw-expected.png
index fbccd37..00927df 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-colorspace-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-colorspace-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hidpi-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hidpi-hw-expected.png
index 4c2f59c..783ea5b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hidpi-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hidpi-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hw-expected.png
index e0781993..f8ec85b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-ordering-hw-expected.png
index 3f7191f..5ef3bf05 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-ordering-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-ordering-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-subregion-hw-expected.png
index 5557e72..70f396d2 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-subregion-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-subregion-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-zoom-hw-expected.png
index 8ed4a33..406263c9 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-zoom-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/effect-reference-zoom-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-composited-expected.png
index 48575ee..22e941e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-composited-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-expected.png
index 9cccec93..7705e24 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-change-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png
index c5d90dc..bde1292 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-expected.png
index c5d90dc..bde1292 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/css3/filters/filter-repaint-composited-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-radius-with-composited-child-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-radius-with-composited-child-expected.png
index a20ea27..12572f54 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-radius-with-composited-child-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-radius-with-composited-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-incremental-repaint-expected.png
index 7ce93aa..3e248d7 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-incremental-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
index 04b90217..1de28738 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-webp-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-webp-expected.png
index 1f2864c..b865c8b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-webp-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/canvas/canvas-toDataURL-webp-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/nestedTransparencyClip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/nestedTransparencyClip-expected.png
index f45168c..9526ff3 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/nestedTransparencyClip-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/nestedTransparencyClip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-expected.png
index ee592a9..2792d98 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png
index 1ccda21..c3247a6f 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-centered-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-centered-expected.png
index 035fef4a..e2d4584 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-centered-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-centered-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-expected.png
index 862a7e4..33ce204e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-rotate-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-rotate-expected.png
index 37f8dd6..36d07fe2 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-rotate-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-rotate-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-skew-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-skew-expected.png
index b3fe19b..0f2e67b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-skew-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/frames/frame-set-scaling-skew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png
index 13bc332c..492e008 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/http/tests/media/video-frame-size-change-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/http/tests/media/video-frame-size-change-expected.png
index ae149ca2..8031b793 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/http/tests/media/video-frame-size-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/http/tests/media/video-frame-size-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png
index 8ec5ca5..e8528c7b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
index 8a5403f2..1021c4ec 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-expected.png
index 9a51697..37b81322 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-expected.png
index 39b2099..62c86dc 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-filter-expected.png
index 0eb1d21..410cc8f5 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-object-fit-expected.png
index 544e84c..09e8ba9b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-object-fit-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png
index 716e947..6c30db1e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/track/track-cue-rendering-ruby-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/track/track-cue-rendering-ruby-expected.png
index 5b735ee..2c3dfd2 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/track/track-cue-rendering-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/track/track-cue-rendering-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv420-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv420-expected.png
index f3d0e11..4258b55 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv420-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv420-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv422-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv422-expected.png
deleted file mode 100644
index 050178a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-colorspace-yuv422-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-replaces-poster-expected.png
index 40163b5..61de8b7 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-replaces-poster-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-zoom-controls-expected.png
index db010f7f..0ca5d68 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-zoom-controls-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/overflow/overflow-transform-perspective-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/overflow/overflow-transform-perspective-expected.png
index 91b9a775..b9252bb 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/overflow/overflow-transform-perspective-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/overflow/overflow-transform-perspective-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/transform/caret-with-transformation-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/transform/caret-with-transformation-expected.png
index fbe7368..53a8ad0 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/transform/caret-with-transformation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/transform/caret-with-transformation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png
index 7a7f2049..8e43720 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/perspective-units-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/perspective-units-expected.png
index 78db371..ca1396a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/perspective-units-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/perspective-units-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/transform-origin-z-change-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/transform-origin-z-change-expected.png
index 07c2365ec..e5ade18 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/transform-origin-z-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/general/transform-origin-z-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png
index 857a263..ec76f5b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
index e551cd4c..f2bfef9d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png
index a6578e56..c985fdb 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png
index 0eefe0b..9537d448 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
index 374c78d..1660084 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/scale-transform-composited-descendants-changed-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/scale-transform-composited-descendants-changed-expected.png
index 071ca6e..a7a77ce 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/scale-transform-composited-descendants-changed-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/scale-transform-composited-descendants-changed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-caret-expected.png
index a2c40ff..9b71266 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-caret-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-caret-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-focused-text-input-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-focused-text-input-expected.png
index 3051ba87..b8a18bb0 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-focused-text-input-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transforms/transformed-focused-text-input-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png
index 76486e9..2ee7bb1 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/vertical-scroll-composited-expected.png
index f168869..ed9fd96 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/vertical-scroll-composited-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/vertical-scroll-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/transform-3d-scales-different-x-y-expected.png
index 876591172..ae7211e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/transform-3d-scales-different-x-y-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/compositing/transform-3d-scales-different-x-y-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/paint/invalidation/transform/caret-with-transformation-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/paint/invalidation/transform/caret-with-transformation-expected.png
index fbe7368..53a8ad0 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/paint/invalidation/transform/caret-with-transformation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/disable-raster-inducing-scroll/paint/invalidation/transform/caret-with-transformation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png
index 1f1f831..ffd0747 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
index 511c62f..d9f8cff 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/2-dht-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/2-dht-expected.png
index 9353c37..bf15b0d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/2-dht-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/2-dht-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png
index 4ca919f25..125d53f 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
index 0177c1c7..ec0dbfd 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png
index 4b0dd91..269859e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png
index cda8a9e..0680ac76 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png
index 6c0c48b..086e28c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png
index 9bf2617..de33bde 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png
index 873ce1a..da782a1 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png
index 8546523..c0803c3e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png
index e00f91b7..2899a6ae 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png
index e35d0e7..84055fc2 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
index 2f731a29..a096119 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
index 8aa3d28a..9df33fc 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
index d4ab3afd..ed051f6 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png
index 7f579b6..4656b7a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png
index ceb2eeb..2125db9 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png
index 410d4a7..e033e89 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png
index 6f036ec..6134d47 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
index dc879bb..cb3b338 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
index e01539d9..08568c5e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png
index 0693d5b..da1f47d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png
index becefff0..0fafa02 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png
index fb35e1c..54272b30 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png
index 8e0eb11..634362e1 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png
index 8c1a8e1..cb82861 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png
index acf3c73..a44f534 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png
index a8543cf..2691f18 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png
index 185e245..fe8f59ec4 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
index a9ef12b..f68dcb24 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
index 91b80fa4..28018da 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png
index b949fbf..945556e 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png
index 0899ff3..b997a2d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png
index f929a9fb..6ea3d4ba 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
index ae58ce61..db89e387 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png
index 1d35a9c..06d74cc 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png
index 8c00f01..9ceb5e5 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png
index 17e65fc0..49f7188 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png
index 0833138..2401c1a 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png
index 1cedcc3..6749d29 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png
index 20f8a134..899c749 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
index 55208be..7282153 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png
index 23e09bf..6799a07 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
index 9ac0f97e..5ed5e8c2 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png
index b673b24e7..14d90fc 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
index 9790866..a951a2c 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png
index ba333a4..8899ed649 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png
index 6476d8a..ce8d2105 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png
index 59aa57b..0cb3dcc 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png
index 6686dcc1..7d9252f 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png
index c3b4933..9e1e8d8 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png
index 271e5a0..0ef3292 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png
index 597df444..01b3ea36 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png
index b18d737..891865f 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png
index 2bb084b..a230d931 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png
index c901df75..e86b96d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png
index dcb2f99e..8b82a39 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png
index 7ad68fe..b8ece26 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png
index e8d0cea..a91430d 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png
index d0a89c9..58b90265 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png
index 24032507..aa06911 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png
index 1a6d4fd..cc9778b 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png
index 965b570..5027dea 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png
index 965b570..5027dea 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/3d-corners-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/3d-corners-expected.png
new file mode 100644
index 0000000..1a0a2a0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/3d-corners-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/3d-cube-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/3d-cube-expected.png
new file mode 100644
index 0000000..43c874fb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/3d-cube-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/backface-visibility-transformed-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/backface-visibility-transformed-expected.png
new file mode 100644
index 0000000..bb1a1154
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/backface-visibility-transformed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/filter-occlusion-blur-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/filter-occlusion-blur-expected.png
new file mode 100644
index 0000000..fc45e78
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/filter-occlusion-blur-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/filter-occlusion-blur-large-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/filter-occlusion-blur-large-expected.png
new file mode 100644
index 0000000..b20f4e3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/filter-occlusion-blur-large-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/tile-occlusion-boundaries-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/tile-occlusion-boundaries-expected.png
new file mode 100644
index 0000000..98cfbd2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/culling/tile-occlusion-boundaries-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/direct-image-compositing-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/direct-image-compositing-expected.png
index 72cdf4c..aa1c0df5 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/direct-image-compositing-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/direct-image-compositing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/flat-with-transformed-child-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/flat-with-transformed-child-expected.png
new file mode 100644
index 0000000..924a443
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/flat-with-transformed-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png
new file mode 100644
index 0000000..805afcf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-down-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png
new file mode 100644
index 0000000..69cd9251c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png
new file mode 100644
index 0000000..80f1d6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/layer-due-to-layer-children-deep-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/layer-due-to-layer-children-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/layer-due-to-layer-children-expected.png
new file mode 100644
index 0000000..3d1ba5c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/layer-due-to-layer-children-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/vertical-scroll-composited-expected.png
new file mode 100644
index 0000000..ed9fd96
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/vertical-scroll-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/video-opacity-overlay-expected.png
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-mac14-arm64/compositing/geometry/video-opacity-overlay-expected.png
rename to third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png
new file mode 100644
index 0000000..852119c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-div-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png
new file mode 100644
index 0000000..8dd253a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/img-layer-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/img-layer-object-fit-expected.png
new file mode 100644
index 0000000..ee5649d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/img-layer-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/layers-inside-overflow-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/layers-inside-overflow-scroll-expected.png
new file mode 100644
index 0000000..7710e67
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/layers-inside-overflow-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-expected.png
new file mode 100644
index 0000000..b6c5c67
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
index b71f70d..ecc30e1 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/masks/mask-with-added-filters-expected.png
new file mode 100644
index 0000000..f3ca7fc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/masks/mask-with-added-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png
new file mode 100644
index 0000000..f801f52c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/border-radius-styles-with-composited-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/mask-with-filter-expected.png
new file mode 100644
index 0000000..7221eef
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/mask-with-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-expected.png
new file mode 100644
index 0000000..b74c8806
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png
new file mode 100644
index 0000000..8b9d397
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-with-intervening-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png
new file mode 100644
index 0000000..4893458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/nested-render-surfaces-with-rotation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-clip-expected.png
new file mode 100644
index 0000000..b8a22b8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png
new file mode 100644
index 0000000..9b0eb63
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-effect-interleave-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-expected.png
new file mode 100644
index 0000000..b8a22b8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
new file mode 100644
index 0000000..bd26650f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png
new file mode 100644
index 0000000..65ccbc64
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/tiled-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/tiled-mask-expected.png
new file mode 100644
index 0000000..5a1e769
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overflow/tiled-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overlap-blending/children-opacity-huge-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overlap-blending/children-opacity-huge-expected.png
new file mode 100644
index 0000000..28c8ff9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overlap-blending/children-opacity-huge-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-mac14-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png
rename to third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/perpendicular-layer-sorting-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/perpendicular-layer-sorting-expected.png
new file mode 100644
index 0000000..7c0ff4b9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/perpendicular-layer-sorting-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/perspective-interest-rect-expected.png
new file mode 100644
index 0000000..d460adf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/perspective-interest-rect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/animation-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/animation-inside-reflection-expected.png
new file mode 100644
index 0000000..930e9ed
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/animation-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png
new file mode 100644
index 0000000..752a222
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-anchor-point-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-animated-expected.png
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-mac14-arm64/compositing/reflections/nested-reflection-animated-expected.png
rename to third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-animated-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-transition-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-transition-expected.png
new file mode 100644
index 0000000..26a16eb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/nested-reflection-transition-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/transform-inside-reflection-expected.png
new file mode 100644
index 0000000..d10704a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/reflections/transform-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/self-painting-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/self-painting-layers-expected.png
new file mode 100644
index 0000000..96e8560
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/self-painting-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/transform-3d-scales-different-x-y-expected.png
new file mode 100644
index 0000000..ae7211e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/transform-3d-scales-different-x-y-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/video/video-controls-squashing-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/video/video-controls-squashing-expected.png
new file mode 100644
index 0000000..58ccdc0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/video/video-controls-squashing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/visibility/visibility-image-layers-expected.png
new file mode 100644
index 0000000..d7f3386
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/visibility/visibility-image-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7183c76
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
new file mode 100644
index 0000000..01541f5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png
new file mode 100644
index 0000000..0333e6a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/backdrop-filter-browser-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-all-on-background-hw-expected.png
new file mode 100644
index 0000000..e152e05
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-all-on-background-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-blur-hw-expected.png
new file mode 100644
index 0000000..2e165f07
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-blur-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-brightness-clamping-hw-expected.png
new file mode 100644
index 0000000..ebc92c8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-brightness-clamping-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-brightness-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-brightness-hw-expected.png
new file mode 100644
index 0000000..2acb94c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-brightness-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-combined-hw-expected.png
new file mode 100644
index 0000000..30200e6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-combined-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-contrast-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-contrast-hw-expected.png
new file mode 100644
index 0000000..249250cf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-contrast-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-drop-shadow-hw-expected.png
new file mode 100644
index 0000000..951168a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-drop-shadow-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-colorspace-hw-expected.png
new file mode 100644
index 0000000..00927df
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-colorspace-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-hidpi-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-hidpi-hw-expected.png
new file mode 100644
index 0000000..783ea5b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-hidpi-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-hw-expected.png
new file mode 100644
index 0000000..f8ec85b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-ordering-hw-expected.png
new file mode 100644
index 0000000..5ef3bf05
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-ordering-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-subregion-hw-expected.png
new file mode 100644
index 0000000..70f396d2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-subregion-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-zoom-hw-expected.png
new file mode 100644
index 0000000..406263c9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/effect-reference-zoom-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-change-repaint-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-change-repaint-composited-expected.png
new file mode 100644
index 0000000..22e941e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-change-repaint-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-change-repaint-expected.png
new file mode 100644
index 0000000..7705e24
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-change-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png
new file mode 100644
index 0000000..bde1292
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-repaint-composited-fallback-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-repaint-composited-fallback-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-repaint-composited-fallback-expected.png
new file mode 100644
index 0000000..bde1292
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/css3/filters/filter-repaint-composited-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/webcodecs/per-frame-qp-encoding.https.any.worker_vp9_p2-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/webcodecs/per-frame-qp-encoding.https.any.worker_vp9_p2-expected.txt
deleted file mode 100644
index d5474979..0000000
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/webcodecs/per-frame-qp-encoding.https.any.worker_vp9_p2-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Frame QP encoding, full range
-  assert_equals: corrupted_frames: 0,1,2,3,4,5,6,7,8,9,10,11 expected 0 but got 12
-[FAIL] Frame QP encoding, good range with validation
-  assert_equals: corrupted_frames: 0,1,2,3,4,5,6,7,8,9,10,11 expected 0 but got 12
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/webcodecs/per-frame-qp-encoding.https.any_vp9_p2-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/webcodecs/per-frame-qp-encoding.https.any_vp9_p2-expected.txt
deleted file mode 100644
index d5474979..0000000
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/webcodecs/per-frame-qp-encoding.https.any_vp9_p2-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Frame QP encoding, full range
-  assert_equals: corrupted_frames: 0,1,2,3,4,5,6,7,8,9,10,11 expected 0 but got 12
-[FAIL] Frame QP encoding, good range with validation
-  assert_equals: corrupted_frames: 0,1,2,3,4,5,6,7,8,9,10,11 expected 0 but got 12
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/borders/border-radius-with-composited-child-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/borders/border-radius-with-composited-child-expected.png
new file mode 100644
index 0000000..12572f54
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/borders/border-radius-with-composited-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-incremental-repaint-expected.png
index 7ce93aa..3e248d7 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-incremental-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
new file mode 100644
index 0000000..1de28738
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-toDataURL-webp-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-toDataURL-webp-expected.png
new file mode 100644
index 0000000..b865c8b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/canvas/canvas-toDataURL-webp-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/nestedTransparencyClip-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/nestedTransparencyClip-expected.png
new file mode 100644
index 0000000..9526ff3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/nestedTransparencyClip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/overflow-border-radius-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/overflow-border-radius-composited-expected.png
new file mode 100644
index 0000000..2792d98
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/overflow-border-radius-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png
new file mode 100644
index 0000000..c3247a6f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/clip/overflow-border-radius-composited-parent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-centered-expected.png
similarity index 60%
rename from third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png
rename to third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-centered-expected.png
index aacf11c..e2d4584 100644
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/overlap-blending/children-opacity-no-overlap-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-centered-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-expected.png
new file mode 100644
index 0000000..33ce204e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-rotate-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-rotate-expected.png
new file mode 100644
index 0000000..36d07fe2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-rotate-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-skew-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-skew-expected.png
new file mode 100644
index 0000000..0f2e67b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/frames/frame-set-scaling-skew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png
new file mode 100644
index 0000000..492e008
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/fast/sub-pixel/transformed-iframe-copy-on-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/http/tests/media/video-frame-size-change-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/http/tests/media/video-frame-size-change-expected.png
index ae149ca2..8031b793 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/http/tests/media/video-frame-size-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/http/tests/media/video-frame-size-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png
new file mode 100644
index 0000000..e8528c7b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/yuv-decode-eligible/color-profile-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
new file mode 100644
index 0000000..1021c4ec
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-expected.png
index 795ad4a..37b81322 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-expected.png
index f4716cf..62c86dc 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-filter-expected.png
index 0eb1d21..410cc8f5 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..09e8ba9b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png
new file mode 100644
index 0000000..6c30db1e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/controls/paint-controls-webkit-appearance-none-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/track/track-cue-rendering-ruby-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/track/track-cue-rendering-ruby-expected.png
index 62f1865..3dbca3c 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/track/track-cue-rendering-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/track/track-cue-rendering-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-colorspace-yuv420-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-colorspace-yuv420-expected.png
new file mode 100644
index 0000000..4258b55
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-colorspace-yuv420-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..61de8b7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..0ca5d68
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/overflow/overflow-transform-perspective-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/overflow/overflow-transform-perspective-expected.png
new file mode 100644
index 0000000..b9252bb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/overflow/overflow-transform-perspective-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/paint/invalidation/transform/caret-with-transformation-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/paint/invalidation/transform/caret-with-transformation-expected.png
new file mode 100644
index 0000000..53a8ad0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/paint/invalidation/transform/caret-with-transformation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png
new file mode 100644
index 0000000..8e43720
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/cssmatrix-3d-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/perspective-units-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/perspective-units-expected.png
new file mode 100644
index 0000000..ca1396a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/perspective-units-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/transform-origin-z-change-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/transform-origin-z-change-expected.png
new file mode 100644
index 0000000..e5ade18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/general/transform-origin-z-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png
new file mode 100644
index 0000000..ec76f5b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
new file mode 100644
index 0000000..f2bfef9d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png
new file mode 100644
index 0000000..c985fdb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png
new file mode 100644
index 0000000..9537d448
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
new file mode 100644
index 0000000..1660084
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/scale-transform-composited-descendants-changed-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/scale-transform-composited-descendants-changed-expected.png
new file mode 100644
index 0000000..a7a77ce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/scale-transform-composited-descendants-changed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/transformed-caret-expected.png
new file mode 100644
index 0000000..9b71266
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/transformed-caret-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/transformed-focused-text-input-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/transformed-focused-text-input-expected.png
new file mode 100644
index 0000000..b8a18bb0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transforms/transformed-focused-text-input-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png
new file mode 100644
index 0000000..2ee7bb1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/transitions/opacity-transform-transitions-inside-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/video-opacity-overlay-expected.png
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/video-opacity-overlay-expected.png
rename to third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/disable-raster-inducing-scroll/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png
new file mode 100644
index 0000000..ffd0747
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/optimize-contrast-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
index 511c62f..d9f8cff 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/2-dht-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/2-dht-expected.png
new file mode 100644
index 0000000..bf15b0d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/2-dht-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png
new file mode 100644
index 0000000..125d53f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/alt-text-wrapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
new file mode 100644
index 0000000..ec0dbfd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png
new file mode 100644
index 0000000..269859e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png
index 5939eed..0680ac76 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/color-profile-border-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png
new file mode 100644
index 0000000..086e28c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/cross-fade-invalidation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png
new file mode 100644
index 0000000..de33bde
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/cross-fade-overflow-position-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png
new file mode 100644
index 0000000..da782a1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/image-in-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png
new file mode 100644
index 0000000..c0803c3e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png
new file mode 100644
index 0000000..2899a6ae
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png
new file mode 100644
index 0000000..84055fc2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
new file mode 100644
index 0000000..a096119
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
new file mode 100644
index 0000000..9df33fc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
new file mode 100644
index 0000000..ed051f6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png
new file mode 100644
index 0000000..4656b7a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png
new file mode 100644
index 0000000..2125db9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png
new file mode 100644
index 0000000..e033e89
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png
new file mode 100644
index 0000000..6134d47
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
new file mode 100644
index 0000000..cb3b338
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
new file mode 100644
index 0000000..08568c5e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png
new file mode 100644
index 0000000..da1f47d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png
new file mode 100644
index 0000000..0fafa02
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png
new file mode 100644
index 0000000..54272b30
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-10px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png
new file mode 100644
index 0000000..634362e1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-16px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png
new file mode 100644
index 0000000..cb82861
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-1px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png
new file mode 100644
index 0000000..a44f534
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-block-flow-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png
new file mode 100644
index 0000000..2691f18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-images-empty-alt-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png
new file mode 100644
index 0000000..fe8f59ec4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rendering-broken-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
new file mode 100644
index 0000000..f68dcb24
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
new file mode 100644
index 0000000..28018da
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png
new file mode 100644
index 0000000..945556e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png
new file mode 100644
index 0000000..b997a2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png
new file mode 100644
index 0000000..6ea3d4ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/jpeg-missing-eoi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
new file mode 100644
index 0000000..db89e387
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png
index 1d35a9c..06d74cc 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/yuv-decode-eligible/webp-no-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png
new file mode 100644
index 0000000..9ceb5e5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-arc-circumference-fill-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png
new file mode 100644
index 0000000..49f7188
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png
new file mode 100644
index 0000000..2401c1a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-composite-transformclip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png
new file mode 100644
index 0000000..6749d29
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-drawImage-antiAlias-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png
new file mode 100644
index 0000000..899c749
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
new file mode 100644
index 0000000..7282153
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png
new file mode 100644
index 0000000..6799a07
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
new file mode 100644
index 0000000..5ed5e8c2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png
new file mode 100644
index 0000000..14d90fc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/fillrect_gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
index 9790866..a951a2c 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png
new file mode 100644
index 0000000..8899ed649
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu/fast/canvas/quadraticCurveTo-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png
new file mode 100644
index 0000000..ce8d2105
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/off-main-thread-css-paint/http/tests/csspaint/border-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png
new file mode 100644
index 0000000..0cb3dcc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/backdrop-filter-browser-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png
index 6686dcc1..7d9252f 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png
new file mode 100644
index 0000000..9e1e8d8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png
index 271e5a0..0ef3292 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png
new file mode 100644
index 0000000..01b3ea36
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png
new file mode 100644
index 0000000..891865f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png
new file mode 100644
index 0000000..a230d931
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png
new file mode 100644
index 0000000..e86b96d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png
new file mode 100644
index 0000000..8b82a39
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png
new file mode 100644
index 0000000..b8ece26
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png
index e8d0cea..a91430d 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png
new file mode 100644
index 0000000..58b90265
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png
index 24032507..aa06911 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png
new file mode 100644
index 0000000..cc9778b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png
new file mode 100644
index 0000000..5027dea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png
new file mode 100644
index 0000000..5027dea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt
index f0f3859..250d90e 100644
--- a/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt
+++ b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt
@@ -5,6 +5,10 @@
   assert_equals: initial: :has-interest mismatch expected false but got true
 [FAIL] Show interest hotkey confers "full interest", without any delays
   assert_equals: initial: :has-interest mismatch expected false but got true
+[FAIL] Hovering the popover confers "full interest", without any delays
+  assert_equals: initial: :has-interest mismatch expected false but got true
+[FAIL] Hovering the invoker confers "full interest", without any delays
+  assert_equals: initial: :has-interest mismatch expected false but got true
 [FAIL] With full interest, contents are keyboard focusable
   assert_equals: initial: :has-interest mismatch expected false but got true
 [FAIL] Lose interest hotkey works
diff --git a/third_party/crossbench b/third_party/crossbench
index 4713630..b237086 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 4713630a70ba7a976468b5db45206e085640784e
+Subproject commit b2370868e5c8e20bc99d386e4f675e1ea6ced3fe
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 5822117..90051cb 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 58221174205b00e188e181a3cbb1d63e05d23331
+Subproject commit 90051cb4b9ad9818b9c00643752370be66deaa50
diff --git a/third_party/fuzztest/BUILD.gn b/third_party/fuzztest/BUILD.gn
index 9223060..79d9d68 100644
--- a/third_party/fuzztest/BUILD.gn
+++ b/third_party/fuzztest/BUILD.gn
@@ -270,6 +270,7 @@
     "src/fuzztest/internal/domains/in_grammar_impl.cc",
     "src/fuzztest/internal/domains/in_grammar_impl.h",
     "src/fuzztest/internal/domains/in_range_impl.h",
+    "src/fuzztest/internal/domains/in_regexp_impl.cc",
     "src/fuzztest/internal/domains/in_regexp_impl.h",
     "src/fuzztest/internal/domains/map_impl.h",
     "src/fuzztest/internal/domains/one_of_impl.h",
diff --git a/third_party/fuzztest/src b/third_party/fuzztest/src
index 9c1ffdc..1f21600 160000
--- a/third_party/fuzztest/src
+++ b/third_party/fuzztest/src
@@ -1 +1 @@
-Subproject commit 9c1ffdc7fb3d8db64e42c7a9662d8b9906625b77
+Subproject commit 1f21600f675e2bb8972acf57bfae6ff3416d37bb
diff --git a/third_party/googletest/src b/third_party/googletest/src
index 90a4152..8b8ef3f 160000
--- a/third_party/googletest/src
+++ b/third_party/googletest/src
@@ -1 +1 @@
-Subproject commit 90a41521142c978131f38c6da07b4eb96a9f1ff6
+Subproject commit 8b8ef3ff0d1f7a1739e0d7c3dd46ab37104fcd9a
diff --git a/third_party/skia b/third_party/skia
index 6205201..d2c201c 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 6205201c6b92d4a5492815049257c588fb1cd2a5
+Subproject commit d2c201cb1a599d6d06985b27d45add4190d56e0f
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index cd7971b..3bb9a2c 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit cd7971b83f29d029d06895f39630cffa5ec421f1
+Subproject commit 3bb9a2c5d2ef0dc54ae9697f8a6e628cc06b9fd3
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index f74722e..76473009 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit f74722ee649f9c9cc7daa7d13d434febc424e7a4
+Subproject commit 7647300983abe4aa095dd74c2544c2cbe5906a7c
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src
index 71e9fad..f5816ba 160000
--- a/third_party/webgpu-cts/src
+++ b/third_party/webgpu-cts/src
@@ -1 +1 @@
-Subproject commit 71e9fad6cf757c1d6ce2ec56c5201dd42eec0aa3
+Subproject commit f5816ba68bc2ec4a0c30ef4dcea0b104f81ceb9e
diff --git a/third_party/webpagereplay b/third_party/webpagereplay
index 2c5049a..18172a3 160000
--- a/third_party/webpagereplay
+++ b/third_party/webpagereplay
@@ -1 +1 @@
-Subproject commit 2c5049abfc2cf36ece82f7f84ebdcb786659eaf7
+Subproject commit 18172a359f6dab8e3f70b6c5c8c7c55d3e97537a
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 8fd3c98..cc07c3e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2752,9 +2752,9 @@
   <int value="41" label="Save page"/>
   <int value="42" label="Share page"/>
   <int value="43" label="Print page"/>
-  <int value="44" label="Navigate back"/>
-  <int value="45" label="Navigate forward"/>
-  <int value="46" label="Reload page"/>
+  <int value="44" label="(Obsolete) Navigate back"/>
+  <int value="45" label="(Obsolete) Navigate forward"/>
+  <int value="46" label="(Obsolete) Reload page"/>
   <int value="47" label="Inspect"/>
 </enum>
 
@@ -12386,7 +12386,6 @@
   <int value="-630256330" label="EnableDrDc:enabled"/>
   <int value="-629084845" label="UseToastManager:disabled"/>
   <int value="-629041881" label="MuteNotificationsDuringScreenShare:disabled"/>
-  <int value="-628675321" label="FedCmSelectiveDisclosure:disabled"/>
   <int value="-628535358"
       label="AutofillPreventOverridingPrefilledValues:enabled"/>
   <int value="-626329144" label="SyncSupportTrustedVaultPassphrase:enabled"/>
@@ -13221,7 +13220,6 @@
   <int value="-304886342" label="QuickAnswersTranslation:disabled"/>
   <int value="-304841801" label="AccessibilityFlashScreenFeature:enabled"/>
   <int value="-304777110" label="PreconnectToSearch:disabled"/>
-  <int value="-304594674" label="FedCmSelectiveDisclosure:enabled"/>
   <int value="-304502255" label="DiscardRingImprovements:enabled"/>
   <int value="-304329578" label="OmniboxContextualSearchActionsAtTop:enabled"/>
   <int value="-303992327" label="SwipeToMoveCursor:disabled"/>
@@ -14301,6 +14299,8 @@
   <int value="106235373" label="LauncherSystemInfoAnswerCards:enabled"/>
   <int value="106596969" label="HideIncognitoMediaMetadata:disabled"/>
   <int value="106744400" label="OmniboxModernizeVisualUpdate:enabled"/>
+  <int value="106789059"
+      label="ReduceUserAgentDataLinuxPlatformVersion:disabled"/>
   <int value="106840653" label="mus"/>
   <int value="107358678" label="GalleryAppPdfEditNotification:enabled"/>
   <int value="107900612" label="ChromeHomePersistentIph:disabled"/>
@@ -15198,6 +15198,8 @@
   <int value="436980707" label="ContextualSearchForceCaption:enabled"/>
   <int value="437371666"
       label="AutofillEnableCardInfoRuntimeRetrieval:enabled"/>
+  <int value="438220199"
+      label="ReduceUserAgentDataLinuxPlatformVersion:enabled"/>
   <int value="438307192" label="FirstPartySets:disabled"/>
   <int value="438398886"
       label="AutofillEnableStickyManualFallbackForCards:enabled"/>
@@ -20141,6 +20143,8 @@
   <int value="14" label="Kill Switch On (NotAllowedError)"/>
   <int value="15" label="Permission Denied By System (NotAllowedError)"/>
   <int value="16" label="Device In Use (NotReadableError)"/>
+  <int value="17" label="Request cancelled (?)"/>
+  <int value="18" label="Start timeout (AbortError)"/>
 </enum>
 
 <enum name="MediaStreamType">
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index 5a6129e6c..aebd24e 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -69,7 +69,7 @@
 </variants>
 
 <histogram name="Accessibility.ActiveTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>aleventhal@chromium.org</owner>
   <owner>janewman@microsoft.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -81,7 +81,7 @@
 
 <histogram
     name="Accessibility.Android.AutoDisableV2.{CurrentState}Time.{CallType}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>dtseng@google.com</owner>
@@ -110,7 +110,7 @@
 
 <histogram
     name="Accessibility.Android.AutoDisableV2.{MethodCall}Called.{CallType}"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>dtseng@google.com</owner>
@@ -136,7 +136,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.Cache.MaxNodesInCache" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -146,7 +146,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.Cache.PercentageRetrievedFromCache"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -157,7 +157,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.FindElementType.Usage2.{RunningATs}"
-    enum="AccessibilityPredicateType" expires_after="2025-09-07">
+    enum="AccessibilityPredicateType" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>lucasradaelli@google.com</owner>
   <owner>chrome-a11y-core@chromium.org</owner>
@@ -187,7 +187,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.InlineTextBoxes.Bundle.{CallLocation}"
-    enum="AccessibilityModeBundleEnum" expires_after="2025-09-07">
+    enum="AccessibilityModeBundleEnum" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aleventhal@chromium.org</owner>
   <owner>chrome-a11y-core@chromium.org</owner>
@@ -206,7 +206,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.InlineTextBoxes.DuplicateRequest"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aleventhal@chromium.org</owner>
   <owner>chrome-a11y-core@chromium.org</owner>
@@ -239,7 +239,7 @@
 <!-- LINT.ThenChange(//chrome/android/java/src/org/chromium/chrome/browser/KeyboardShortcuts.java:KeyboardShortcutsSemanticMeaning, //tools/metrics/histograms/metadata/accessibility/enums.xml:KeyboardShortcutsSemanticMeaning) -->
 
 <histogram name="Accessibility.Android.OnDemand.EventsDropped" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>abigailbklein@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -250,7 +250,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.OnDemand.OneHundredPercentEventsDropped"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>abigailbklein@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -263,7 +263,7 @@
 
 <histogram
     name="Accessibility.Android.OnDemand.OneHundredPercentEventsDropped.{AXMode}"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>abigailbklein@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -288,7 +288,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.OnDemand.PercentageDropped" units="%"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>abigailbklein@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -299,7 +299,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.OnDemand.PercentageDropped.{AXMode}"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>abigailbklein@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -323,7 +323,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.AppMenuEnabledState"
-    enum="AccessibilityPageZoomAppMenuEnabledState" expires_after="2025-09-07">
+    enum="AccessibilityPageZoomAppMenuEnabledState" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -338,7 +338,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.AppMenuSliderOpened"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -349,7 +349,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.AppMenuSliderZoomLevelChanged"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -361,7 +361,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.AppMenuSliderZoomLevelValue"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -387,7 +387,7 @@
 
 <histogram
     name="Accessibility.Android.PageZoom.SettingsDefaultZoomLevelChanged"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -400,7 +400,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.SettingsDefaultZoomLevelValue"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -414,7 +414,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.Usage"
-    enum="AccessibilityPageZoomUsageType" expires_after="2025-09-07">
+    enum="AccessibilityPageZoomUsageType" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -433,7 +433,7 @@
 
 <histogram
     name="Accessibility.Android.Performance.CreateAccessibilityNodeInfo.TotalTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>lucasradaelli@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -450,7 +450,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.Performance.OneShotTreeSearch"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>lucasradaelli@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -469,7 +469,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.Performance.SpannableCreationTime2"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -485,7 +485,7 @@
 
 <histogram
     name="Accessibility.Android.Performance.TimeUntilFirstAccessibilityFocus"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>lucasradaelli@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -510,7 +510,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.UpdateAccessibilityServices.PollCount"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -535,7 +535,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.UpdateAccessibilityServices.Runtime"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -547,7 +547,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.Usage.A11yAlwaysOn" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -563,7 +563,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.Usage.{UsageType}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -581,7 +581,7 @@
 </histogram>
 
 <histogram name="Accessibility.AndroidServiceInfo.{RunningApps}"
-    enum="AccessibilityAndroidServiceInfoEnum" expires_after="2025-09-07">
+    enum="AccessibilityAndroidServiceInfoEnum" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aldietz@google.com</owner>
   <owner>dtseng@chromium.org</owner>
@@ -856,7 +856,7 @@
 </histogram>
 
 <histogram name="Accessibility.ChromeVox.PerformGestureType"
-    enum="ChromeVoxGestureType" expires_after="2025-09-07">
+    enum="ChromeVoxGestureType" expires_after="2025-11-09">
   <owner>dtseng@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -1054,7 +1054,7 @@
 </histogram>
 
 <histogram name="Accessibility.CrosLargeCursorSize2" units="dip"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>katie@chromium.org</owner>
   <owner>dtseng@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -1303,7 +1303,7 @@
 </histogram>
 
 <histogram name="Accessibility.CrosStatusArea.{FeatureName}"
-    enum="BooleanToggled" expires_after="2025-09-07">
+    enum="BooleanToggled" expires_after="2025-11-09">
   <owner>anastasi@google.com</owner>
   <owner>katie@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -1400,7 +1400,7 @@
 </histogram>
 
 <histogram name="Accessibility.Cros{FeatureName}.SessionDuration"
-    units="seconds" expires_after="2025-09-07">
+    units="seconds" expires_after="2025-11-09">
   <owner>katie@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -1429,7 +1429,7 @@
 even if they fit the naming pattern. -->
 
 <histogram name="Accessibility.Cros{SettingType}" enum="BooleanEnabled"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>dtseng@chromium.org</owner>
   <owner>katie@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -1556,7 +1556,7 @@
 </histogram>
 
 <histogram name="Accessibility.DlcInstallerFaceGazeAssetsSuccess"
-    enum="BooleanSuccess" expires_after="2025-09-07">
+    enum="BooleanSuccess" expires_after="2025-11-09">
   <owner>akihiroota@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -1621,7 +1621,7 @@
 </histogram>
 
 <histogram name="Accessibility.ExperimentalModeFlag.FormControls"
-    enum="BooleanEnabled" expires_after="2025-09-07">
+    enum="BooleanEnabled" expires_after="2025-11-09">
   <owner>aldietz@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -1664,7 +1664,7 @@
 </histogram>
 
 <histogram name="Accessibility.ImageLabels.Android" enum="BooleanEnabled"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>dtseng@chromium.org</owner>
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -1777,7 +1777,7 @@
 </histogram>
 
 <histogram name="Accessibility.ImageLabels2" enum="BooleanEnabled"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>katie@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -2181,7 +2181,7 @@
 </histogram>
 
 <histogram name="Accessibility.ModeFlag" enum="AccessibilityModeFlagEnum"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>aleventhal@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -2288,7 +2288,7 @@
 </histogram>
 
 <histogram name="Accessibility.PdfOcr.ActiveWhenInaccessiblePdfOpened"
-    enum="BooleanExists" expires_after="2025-09-07">
+    enum="BooleanExists" expires_after="2025-11-09">
   <owner>kyungjunlee@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -2439,7 +2439,7 @@
 </histogram>
 
 <histogram name="Accessibility.Performance.AXTree.Destroy2"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>olivierli@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -2569,7 +2569,7 @@
 </histogram>
 
 <histogram name="Accessibility.Performance.HandleAXEvents2"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>mschillaci@google.com</owner>
   <owner>aleventhal@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -2587,7 +2587,7 @@
 </histogram>
 
 <histogram name="Accessibility.Performance.MergeAXTreeUpdates"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>dtseng@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -2662,7 +2662,7 @@
 </histogram>
 
 <histogram name="Accessibility.Performance.SerializeLifecycleStage"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>lucasradaelli@google.com</owner>
   <owner>mschillaci@google.com</owner>
   <owner>aleventhal@chromium.org</owner>
@@ -2703,7 +2703,7 @@
 
 <histogram
     name="Accessibility.Performance.TotalAccessibilityCleanLayoutLifecycleStages"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>lucasradaelli@google.com</owner>
   <owner>mschillaci@google.com</owner>
   <owner>aleventhal@chromium.org</owner>
@@ -2723,7 +2723,7 @@
 </histogram>
 
 <histogram name="Accessibility.Performance.Tree.Unserialize2"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>aleventhal@chromium.org</owner>
   <owner>janewman@microsoft.com</owner>
   <owner>janewman@microsoft.com</owner>
@@ -2978,7 +2978,7 @@
 </histogram>
 
 <histogram name="Accessibility.ReadAnything.NewPage" enum="ReadAnythingNewPage"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kristislee@google.com</owner>
   <owner>komo-eng@google.com</owner>
   <summary>
@@ -3006,7 +3006,7 @@
 </histogram>
 
 <histogram name="Accessibility.ReadAnything.ReadAloud.HighlightState"
-    enum="ReadAnythingHighlightState" expires_after="2025-09-07">
+    enum="ReadAnythingHighlightState" expires_after="2025-11-09">
   <owner>kristislee@google.com</owner>
   <owner>komo-eng@google.com</owner>
   <summary>
@@ -3016,7 +3016,7 @@
 </histogram>
 
 <histogram name="Accessibility.ReadAnything.ReadAloud.Language"
-    enum="LocaleCodeBCP47" expires_after="2025-09-07">
+    enum="LocaleCodeBCP47" expires_after="2025-11-09">
   <owner>kristislee@google.com</owner>
   <owner>komo-eng@google.com</owner>
   <summary>
@@ -3026,7 +3026,7 @@
 </histogram>
 
 <histogram name="Accessibility.ReadAnything.ReadAloud.SettingsChange"
-    enum="ReadAnythingReadAloudSettingsChange" expires_after="2025-09-07">
+    enum="ReadAnythingReadAloudSettingsChange" expires_after="2025-11-09">
   <owner>lwinston@google.com</owner>
   <owner>komo-eng@google.com</owner>
   <summary>
@@ -3036,7 +3036,7 @@
 </histogram>
 
 <histogram name="Accessibility.ReadAnything.ReadAloud.Voice"
-    enum="ReadAnythingReadAloudVoice2" expires_after="2025-09-07">
+    enum="ReadAnythingReadAloudVoice2" expires_after="2025-11-09">
   <owner>kristislee@google.com</owner>
   <owner>komo-eng@google.com</owner>
   <summary>
@@ -3047,7 +3047,7 @@
 </histogram>
 
 <histogram name="Accessibility.ReadAnything.ReadAloud.VoiceSpeed"
-    units="speech rate %" expires_after="2025-09-07">
+    units="speech rate %" expires_after="2025-11-09">
   <owner>kristislee@google.com</owner>
   <owner>komo-eng@google.com</owner>
   <summary>
@@ -3175,7 +3175,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.Component.Available2"
-    enum="ComponentAvailability" expires_after="2025-09-07">
+    enum="ComponentAvailability" expires_after="2025-11-09">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -3186,7 +3186,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.Component.InstallRetries" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -3214,7 +3214,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.LibraryLoadDetailedResultOnWindows"
-    enum="WinGetLastError" expires_after="2025-09-07">
+    enum="WinGetLastError" expires_after="2025-11-09">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -3243,7 +3243,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.MainContentExtraction.Latency.{result}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>rhalavati@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -3285,7 +3285,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.OCR.Failed.ClientType"
-    enum="OCRClientType" expires_after="2025-09-07">
+    enum="OCRClientType" expires_after="2025-11-09">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>Records the client type of each failed OCR request.</summary>
@@ -3368,7 +3368,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.Screen2xDistillationTime.{Result}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>abigailbklein@google.com</owner>
   <owner>rhalavati@google.com</owner>
   <owner>kyungjunlee@google.com</owner>
@@ -3423,7 +3423,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.{Step}.Initialized"
-    enum="BooleanSuccess" expires_after="2025-09-07">
+    enum="BooleanSuccess" expires_after="2025-11-09">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -3513,7 +3513,7 @@
 </histogram>
 
 <histogram name="Accessibility.WinAPIs" enum="AccessibilityWinAPIEnum"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>aleventhal@chromium.org</owner>
   <owner>nektar@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -3521,7 +3521,7 @@
 </histogram>
 
 <histogram name="Accessibility.WinAPIs.GetPropertyValue"
-    enum="AccessibilityWinAPIGetPropertyValueEnum" expires_after="2025-09-07">
+    enum="AccessibilityWinAPIGetPropertyValueEnum" expires_after="2025-11-09">
   <owner>aleventhal@chromium.org</owner>
   <owner>nektar@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 1a3ee13..510e0953 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1897,7 +1897,7 @@
 </histogram>
 
 <histogram name="Android.DynamicTopChrome.WindowResize.DesktopWindowModeState"
-    enum="DesktopWindowModeState" expires_after="2025-09-07">
+    enum="DesktopWindowModeState" expires_after="2025-11-09">
   <owner>aishwaryarj@google.com</owner>
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -2776,7 +2776,7 @@
 </histogram>
 
 <histogram name="Android.MaybeCopyContentAreaAsBitmap.Time" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <owner>clank-app-team@google.com</owner>
@@ -3033,7 +3033,7 @@
 </histogram>
 
 <histogram name="Android.Messages.TimeToFullyShow{MessageIdentifier}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/components/messages/OWNERS</owner>
   <summary>
@@ -3086,7 +3086,7 @@
 </histogram>
 
 <histogram name="Android.MultiInstance.NumActivities.DesktopWindow"
-    units="activities" expires_after="2025-09-07">
+    units="activities" expires_after="2025-11-09">
   <owner>aishwaryarj@google.com</owner>
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -3137,7 +3137,7 @@
 </histogram>
 
 <histogram name="Android.MultiInstance.NumInstances.DesktopWindow"
-    units="instances" expires_after="2025-09-07">
+    units="instances" expires_after="2025-11-09">
   <owner>aishwaryarj@google.com</owner>
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -3173,7 +3173,7 @@
 </histogram>
 
 <histogram name="Android.MultiInstance.WindowManager.DesktopWindowModeState"
-    enum="DesktopWindowModeState" expires_after="2025-09-07">
+    enum="DesktopWindowModeState" expires_after="2025-11-09">
   <owner>aishwaryarj@google.com</owner>
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -4196,7 +4196,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DocumentLoad" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4207,7 +4207,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DocumentLoadResult.Detail"
-    enum="AndroidPdfLoadResult" expires_after="2025-09-07">
+    enum="AndroidPdfLoadResult" expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4242,7 +4242,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DownloadUrlDecoded" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4253,7 +4253,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DownloadUrlEncoded" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4263,7 +4263,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.FindInPageCounts" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4275,7 +4275,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.IsFrozenWhenDisplayed" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4671,7 +4671,7 @@
 </histogram>
 
 <histogram name="Android.RequestDesktopSite.Changed" enum="SiteLayout"
-    expires_after="2025-08-24">
+    expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -4682,7 +4682,7 @@
 </histogram>
 
 <histogram name="Android.RequestDesktopSite.DomainSettingChanged"
-    enum="Boolean" expires_after="2025-08-24">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -5401,7 +5401,7 @@
 </histogram>
 
 <histogram name="Android.TabStrip.TabGroupCollapsed" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>nemco@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <owner>zheliooo@google.com</owner>
@@ -5591,7 +5591,7 @@
 </histogram>
 
 <histogram name="Android.TopToolbar.BlockCaptureReason"
-    enum="TopToolbarBlockCaptureReason" expires_after="2025-09-07">
+    enum="TopToolbarBlockCaptureReason" expires_after="2025-11-09">
   <owner>skym@chromium.org</owner>
   <owner>fredmello@chromium.org</owner>
   <summary>
@@ -5650,7 +5650,7 @@
 </histogram>
 
 <histogram name="Android.UIDialogShown" enum="AndroidDialogType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>alexmitra@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -8053,7 +8053,9 @@
 
 <histogram
     name="Android.WebView.Startup.CreationTime.StartChromiumLocked{StartupMode}"
-    units="ms" expires_after="2025-12-31">
+    units="ms" expires_after="never">
+<!-- expires-never: Guardrail metric for WebView startup performance. -->
+
   <owner>torne@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -8072,6 +8074,9 @@
     This histogram is recorded in the last step of chromium init and so, is not
     recorded when init does not complete for any reason or if init had been
     completed in previous runs.
+
+    This histogram is of special interest, do not change its semantics or retire
+    it without talking to the owners first.
   </summary>
   <token key="StartupMode" variants="WebViewChromiumStartupMode"/>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 7ef8414..c95ca7f6 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -229,7 +229,7 @@
 </histogram>
 
 <histogram name="AppPreloadService.ServerResponseCodes"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-09-07">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-11-09">
   <owner>ovn@google.com</owner>
   <owner>cros-web-apps-team@google.com</owner>
   <summary>
@@ -412,7 +412,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.AnnotationStorage.DatabaseSize" units="MB"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>chenjih@google.com</owner>
   <owner>ypitsishin@google.com</owner>
   <owner>chromeos-launcher-search@google.com</owner>
@@ -460,7 +460,7 @@
 
 <histogram
     name="Apps.AppList.AnnotationStorage.ImageAnnotationWorker.IndexingStatus"
-    enum="ImageAnnotationWorkerIndexingStatus" expires_after="2025-09-07">
+    enum="ImageAnnotationWorkerIndexingStatus" expires_after="2025-11-09">
   <owner>chenjih@google.com</owner>
   <owner>ypitsishin@google.com</owner>
   <owner>chromeos-launcher-search@google.com</owner>
@@ -497,7 +497,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.AnnotationStorage.ImageAnnotationWorker.Status"
-    enum="ImageAnnotationWorkerStatus" expires_after="2025-09-07">
+    enum="ImageAnnotationWorkerStatus" expires_after="2025-11-09">
   <owner>chenjih@google.com</owner>
   <owner>ypitsishin@google.com</owner>
   <owner>chromeos-launcher-search@google.com</owner>
@@ -1103,7 +1103,7 @@
 
 <histogram
     name="Apps.AppList.Search.Continue.FileSuggestionType.{SearchAction}"
-    enum="AppListContinueFileSuggestionType" expires_after="2025-09-07">
+    enum="AppListContinueFileSuggestionType" expires_after="2025-11-09">
   <owner>tbarzic@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -1636,7 +1636,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.UserAction.{TabletOrClamshell}"
-    enum="LauncherUserAction" expires_after="2025-09-07">
+    enum="LauncherUserAction" expires_after="2025-11-09">
   <owner>tbarzic@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index f3fb3eab..275979c5 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -451,7 +451,7 @@
 </histogram>
 
 <histogram name="Arc.AppCount.{AppType}" units="apps"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>khmel@google.com</owner>
   <owner>arcvm-eng@google.com</owner>
   <summary>
@@ -2971,7 +2971,7 @@
 </histogram>
 
 <histogram name="Arc.{MuteType}AudioSuccess" enum="BooleanSuccess"
-    expires_after="2025-09-04">
+    expires_after="2025-11-09">
   <owner>vshenvi@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index d5e935d..2de32181 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1335,7 +1335,7 @@
 </histogram>
 
 <histogram name="Ash.Boca.PollingResult" enum="BocaPollingResult"
-    expires_after="2025-09-04">
+    expires_after="2025-11-09">
   <owner>aprilzhou@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -2193,7 +2193,7 @@
 
 <histogram
     name="Ash.CaptureModeController.SearchResultsPanelShown.{TabletOrClamshellMode}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>hewer@chromium.org</owner>
   <owner>chromeos-wm@google.com</owner>
   <summary>
@@ -3382,7 +3382,7 @@
 </histogram>
 
 <histogram name="Ash.DozeMode.{PowerStatus}.Duration" units="ms"
-    expires_after="2025-09-10">
+    expires_after="2025-11-09">
   <owner>yichenz@google.com</owner>
   <owner>xiyuan@google.com</owner>
   <summary>
@@ -3500,7 +3500,7 @@
 </histogram>
 
 <histogram name="Ash.EventLatency.{EventType}.TotalLatency"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>xiyuan@chromium.org</owner>
   <owner>yichenz@chromium.org</owner>
   <owner>cros-sw-perf@google.com</owner>
@@ -3543,7 +3543,7 @@
 </histogram>
 
 <histogram name="Ash.EventLatency.{EventType}.TotalLatency.1MinAfterResume"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>kawasin@google.com</owner>
   <owner>baseos-perf@google.com</owner>
   <summary>
@@ -4177,7 +4177,7 @@
 </histogram>
 
 <histogram name="Ash.GameDashboard.ToggleMainMenu.{OnOrOff}"
-    enum="GameDashboardMainMenuToggleMethod" expires_after="2025-09-07">
+    enum="GameDashboardMainMenuToggleMethod" expires_after="2025-11-09">
   <owner>cuicuiruan@google.com</owner>
   <owner>phshah@chromium.org</owner>
   <summary>
@@ -5205,7 +5205,7 @@
 </histogram>
 
 <histogram name="Ash.MagicBoost.DisclaimerView.{OptInFeatures}"
-    enum="DisclaimerViewAction" expires_after="2025-09-07">
+    enum="DisclaimerViewAction" expires_after="2025-11-09">
   <owner>leandre@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -5261,7 +5261,7 @@
 </histogram>
 
 <histogram name="Ash.Mahi.QuestionCountPerMahiSession" units="count"
-    expires_after="2025-08-10">
+    expires_after="2025-11-09">
   <owner>andrewxu@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -5271,7 +5271,7 @@
 </histogram>
 
 <histogram name="Ash.Mahi.QuestionSource" enum="MahiQuestionSource"
-    expires_after="2025-08-10">
+    expires_after="2025-11-09">
   <owner>andrewxu@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -5281,7 +5281,7 @@
 </histogram>
 
 <histogram name="Ash.Mahi.Summary.LoadingTime" units="ms"
-    expires_after="2025-08-10">
+    expires_after="2025-11-09">
   <owner>leandre@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -5724,7 +5724,7 @@
 </histogram>
 
 <histogram name="Ash.NotificationResource.ImageMemorySizeInKB" units="KB"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>andrewxu@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -6106,7 +6106,7 @@
 </histogram>
 
 <histogram name="Ash.OSAuth.Login.ConfiguredAuthFactors.{AuthFactor}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>antrim@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -6153,7 +6153,7 @@
 
 <histogram
     name="Ash.OSAuth.{AuthenticationSurface}.NbPasswordAttempts.{AuthenticationOutcome}"
-    units="attempts" expires_after="2025-09-07">
+    units="attempts" expires_after="2025-11-09">
   <owner>emaamari@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -6222,7 +6222,7 @@
 </histogram>
 
 <histogram name="Ash.Overview.DelayedDeskBar.PresentationTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>esum@google.com</owner>
   <owner>chromeos-wm@google.com</owner>
   <summary>
@@ -7647,7 +7647,7 @@
 </histogram>
 
 <histogram name="Ash.SeaPen.Api.Thumbnails.Count" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>cowmoo@google.com</owner>
   <owner>cros-p13n-eng@google.com</owner>
   <summary>
@@ -7679,7 +7679,7 @@
 </histogram>
 
 <histogram name="Ash.SeaPen.Api.{Type}.Latency" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>cowmoo@google.com</owner>
   <owner>cros-p13n-eng@google.com</owner>
   <summary>
@@ -7709,7 +7709,7 @@
 </histogram>
 
 <histogram name="Ash.SeaPen.CreateButton" enum="SeaPenTemplateId"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ericamlee@google.com</owner>
   <owner>cros-p13n-eng@google.com</owner>
   <summary>
@@ -9550,7 +9550,7 @@
 </histogram>
 
 <histogram name="Ash.WindowCycleController.Enter.PresentationTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>xdai@chromium.org</owner>
   <owner>chromeos-wm@google.com</owner>
   <summary>
@@ -9648,7 +9648,7 @@
 </histogram>
 
 <histogram name="Ash.WindowCycleView.AnimationSmoothness.Container" units="%"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yichenz@chromium.org</owner>
   <owner>chromeos-wm@google.com</owner>
   <summary>
@@ -9663,7 +9663,7 @@
 </histogram>
 
 <histogram name="Ash.WindowCycleView.AnimationSmoothness.Show" units="%"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yichenz@chromium.org</owner>
   <owner>chromeos-wm@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash_growth/histograms.xml b/tools/metrics/histograms/metadata/ash_growth/histograms.xml
index c090f723..cec5afc8 100644
--- a/tools/metrics/histograms/metadata/ash_growth/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash_growth/histograms.xml
@@ -116,7 +116,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.Ui.ButtonPressed.Button{ButtonId}.Campaigns500"
-    units="int" expires_after="2025-09-07">
+    units="int" expires_after="2025-11-09">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.Ui.Dismissed.Campaigns500" units="int"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -138,7 +138,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.Ui.Impression.Campaigns500" units="int"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
index 959417f5c..b91ccde7 100644
--- a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
+++ b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
@@ -84,7 +84,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableFilteringIdMaxBytesValue"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -279,7 +279,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableReport.{ContextType}ExtraReportDelay"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -378,7 +378,7 @@
 </histogram>
 
 <histogram name="Conversions.AttributionSrcRequestStatus.{Type}"
-    enum="ConversionAttributionSrcRequestStatus" expires_after="2025-09-07">
+    enum="ConversionAttributionSrcRequestStatus" expires_after="2025-11-09">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -677,7 +677,7 @@
 </histogram>
 
 <histogram name="Conversions.GoogleAmpViewer.{Type}" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -718,7 +718,7 @@
 </histogram>
 
 <histogram name="Conversions.HttpResponseOrNetErrorCode.{AppState}"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-09-07">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-11-09">
   <owner>tquintanilla@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -838,7 +838,7 @@
 
 <histogram name="Conversions.NavigationSourceScopesLimitOutcome"
     enum="ConversionNavigationSourceScopesLimitOutcome"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tquintanilla@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -879,7 +879,7 @@
 </histogram>
 
 <histogram name="Conversions.NonDefaultAggregatableFilteringId" enum="Boolean"
-    expires_after="2025-07-06">
+    expires_after="2025-11-09">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1546,7 +1546,7 @@
 </histogram>
 
 <histogram name="Conversions.{ReportType}.ReportBodySize" units="bytes"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 9214d9af..2f2d9cd 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1105,7 +1105,7 @@
 
 <histogram
     name="Autofill.AmountExtraction.Latency{AmountExtractionLatencyResult}"
-    units="ms" expires_after="2025-07-01">
+    units="ms" expires_after="2025-11-09">
   <owner>yiwenqian@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1165,7 +1165,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.NotOff.FillingAcceptance.{FormType}"
-    enum="BooleanAutofillFillingAcceptance" expires_after="2025-09-07">
+    enum="BooleanAutofillFillingAcceptance" expires_after="2025-11-09">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1629,7 +1629,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.PopupWindowLatency.{Issuer}.{Result}" units="ms"
-    expires_after="2025-07-01">
+    expires_after="2025-11-09">
   <owner>longsheng@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1647,7 +1647,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.PopupWindowResult.{Issuer}"
-    enum="BnplPopupWindowResult" expires_after="2025-07-01">
+    enum="BnplPopupWindowResult" expires_after="2025-11-09">
   <owner>wilsonlow@google.com</owner>
   <owner>vinnypersky@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1659,7 +1659,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.PopupWindowShown.{Issuer}" enum="BooleanShown"
-    expires_after="2025-07-01">
+    expires_after="2025-11-09">
   <owner>wilsonlow@google.com</owner>
   <owner>vinnypersky@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1671,7 +1671,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.SelectionDialogIssuerSelected"
-    enum="BnplIssuerId" expires_after="2025-07-01">
+    enum="BnplIssuerId" expires_after="2025-11-09">
   <owner>yishuil@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1681,7 +1681,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.SelectionDialogResult"
-    enum="SelectBnplIssuerDialogResult" expires_after="2025-07-01">
+    enum="SelectBnplIssuerDialogResult" expires_after="2025-11-09">
   <owner>yishuil@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1715,7 +1715,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.TosDialogResult.{Issuer}"
-    enum="BnplTosDialogResult" expires_after="2025-07-01">
+    enum="BnplTosDialogResult" expires_after="2025-11-09">
   <owner>longsheng@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1726,7 +1726,7 @@
 </histogram>
 
 <histogram name="Autofill.Bnpl.TosDialogShown.{Issuer}" enum="BooleanShown"
-    expires_after="2025-07-01">
+    expires_after="2025-11-09">
   <owner>longsheng@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1737,7 +1737,7 @@
 </histogram>
 
 <histogram name="Autofill.CardholderNameFixFlowPrompt.Events"
-    enum="AutofillCardholderNameFixFlowPromptEvent" expires_after="2025-07-01">
+    enum="AutofillCardholderNameFixFlowPromptEvent" expires_after="2025-11-09">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1990,7 +1990,7 @@
 
 <histogram
     name="Autofill.CreditCard.SelectionLatencySinceShown.{CardMetadataVisible}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3079,7 +3079,7 @@
 </histogram>
 
 <histogram name="Autofill.FormEvents.CreditCard.WithBenefits.{CardIssuerId}"
-    enum="AutofillFormEvent" expires_after="2025-09-07">
+    enum="AutofillFormEvent" expires_after="2025-11-09">
   <owner>alexandertekle@google.com</owner>
   <owner>yishuil@google.com</owner>
   <summary>
@@ -3599,7 +3599,7 @@
 </histogram>
 
 <histogram name="Autofill.iOS.FormActivity.SendRatio" units="%"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>vincb@google.com</owner>
   <owner>eic@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -3611,7 +3611,7 @@
 </histogram>
 
 <histogram name="Autofill.iOS.FormActivity.{Outcome}Count" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>vincb@google.com</owner>
   <owner>eic@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -4709,7 +4709,7 @@
 
 <histogram
     name="Autofill.PaymentsNetworkInterface.RequestLatency.GetCardUploadDetails{Result}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>darwinyang@google.com</owner>
   <owner>chrome-payments-team@google.com</owner>
   <summary>
@@ -4793,7 +4793,7 @@
 
 <histogram
     name="Autofill.PopupInteraction.PopupLevel.{AutofillPopupInteractionLevel}"
-    enum="AutofillPopupInteraction" expires_after="2025-09-07">
+    enum="AutofillPopupInteraction" expires_after="2025-11-09">
   <owner>brunobraga@google.com</owner>
   <owner>jkeitel@google.com</owner>
   <summary>
@@ -4807,7 +4807,7 @@
 
 <histogram
     name="Autofill.PopupInteraction.PopupLevel.{AutofillPopupInteractionLevel}.{FillingProduct}"
-    enum="AutofillPopupInteraction" expires_after="2025-09-07">
+    enum="AutofillPopupInteraction" expires_after="2025-11-09">
   <owner>brunobraga@google.com</owner>
   <owner>jkeitel@google.com</owner>
   <summary>
@@ -5167,7 +5167,7 @@
 
 <histogram name="Autofill.ProfileTokenQuality.StoredObservationTypes.{Type}"
     enum="AutofillProfileTokenQualityObservationType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -6402,7 +6402,7 @@
 
 <histogram name="Autofill.TestAddressSelected"
     enum="AutofillInDevtoolsAvailableTestAddressesCountries"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>brunobraga@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 989cc9e..9cb70d9 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -2337,7 +2337,7 @@
 </histogram>
 
 <histogram name="Blink.Fetch.RequestResourceTime2{SchemeOrPreload}"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>cduvall@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
@@ -3134,7 +3134,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.CrossOriginLcpImage" enum="Boolean"
-    expires_after="2025-09-09">
+    expires_after="2025-11-09">
   <owner>alexnj@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3332,7 +3332,7 @@
 
 <histogram
     name="Blink.LCPP.NavigationToStartPreload.MainFrame.{SubresourceType}.Time"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>chikamune@chromium.org</owner>
   <owner>yyanagisawa@chromium.org</owner>
   <owner>kouhei@chromium.org</owner>
@@ -3368,7 +3368,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PreconnectPredictionCount" units="count"
-    expires_after="2025-07-27">
+    expires_after="2025-11-09">
   <owner>alexnj@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3382,7 +3382,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PreconnectPredictionMatchCount" units="count"
-    expires_after="2025-09-09">
+    expires_after="2025-11-09">
   <owner>alexnj@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3399,7 +3399,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PreconnectPredictionMatchPercent" units="%"
-    expires_after="2025-09-09">
+    expires_after="2025-11-09">
   <owner>alexnj@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3522,7 +3522,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PrewarmHttpDiskCacheURL.Count.SameSiteRatio"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3536,7 +3536,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PrewarmHttpDiskCacheURL.Count.{Site}" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
index 07dd254..6266408 100644
--- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml
+++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -81,7 +81,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.DeviceConnected.{ConnectionType}"
-    enum="BluetoothDeviceType" expires_after="2025-09-07">
+    enum="BluetoothDeviceType" expires_after="2025-11-09">
   <owner>khorimoto@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -1208,7 +1208,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.FastPair.Passkey.Write.PairFailure"
-    enum="FastPairPairFailure" expires_after="2025-08-31">
+    enum="FastPairPairFailure" expires_after="2025-11-09">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -1266,7 +1266,7 @@
 
 <histogram
     name="Bluetooth.ChromeOS.FastPair.RetroactiveEngagementFunnel.Steps.{FastPairDeviceType}.{FastPairNotificationType}"
-    enum="FastPairRetroactiveEngagementFlowEvent" expires_after="2025-09-07">
+    enum="FastPairRetroactiveEngagementFlowEvent" expires_after="2025-11-09">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -1961,7 +1961,7 @@
 </histogram>
 
 <histogram name="Bluetooth.Web.Characteristic.StartNotifications.Outcome"
-    enum="WebBluetoothGATTOperationOutcome" expires_after="2025-09-07">
+    enum="WebBluetoothGATTOperationOutcome" expires_after="2025-11-09">
   <owner>alvinji@chromium.org</owner>
   <owner>deviceapi-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
index 136fdf2..740b7445 100644
--- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml
+++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -59,7 +59,7 @@
 </histogram>
 
 <histogram name="Bookmarks.AddBookmarkType" enum="BookmarkType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="Bookmarks.AverageNodeSize" units="Bytes"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -390,7 +390,7 @@
 </histogram>
 
 <histogram name="Bookmarks.OpenBookmarkType" enum="BookmarkType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -400,7 +400,7 @@
 </histogram>
 
 <histogram name="Bookmarks.Opened.TimeSinceAdded" units="days"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -435,7 +435,7 @@
 </histogram>
 
 <histogram name="Bookmarks.ReadingList.NumberOfItems" units="items"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -519,7 +519,7 @@
 </histogram>
 
 <histogram name="Bookmarks.Storage.FileSizeAtStartup2" units="KB"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -701,7 +701,7 @@
 </histogram>
 
 <histogram name="Bookmarks.Utilization.OnProfileLoad.PercentageUsed"
-    units="Percentage (0-100)" expires_after="2025-09-07">
+    units="Percentage (0-100)" expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -721,7 +721,7 @@
 </histogram>
 
 <histogram name="Bookmarks.Utilization.OnProfileLoad.TotalUsed"
-    units="Bookmarks" expires_after="2025-09-07">
+    units="Bookmarks" expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 854437d..5bb96b9 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -108,7 +108,7 @@
 </histogram>
 
 <histogram name="Browser.DarkModeStatus" enum="DarkModeStatus"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>lgrey@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -1489,7 +1489,7 @@
 
 <histogram
     name="BrowserRenderProcessHost.SpareRendererTakenInSameNavigation.ForCOOP"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>gjc@google.com</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1897,7 +1897,7 @@
 </histogram>
 
 <histogram name="SidePanel.OpenOrChangeEntryTrigger"
-    enum="SidePanelOpenTrigger" expires_after="2025-09-07">
+    enum="SidePanelOpenTrigger" expires_after="2025-11-09">
   <owner>corising@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chrome/histograms.xml b/tools/metrics/histograms/metadata/chrome/histograms.xml
index 6d692208..316e4343 100644
--- a/tools/metrics/histograms/metadata/chrome/histograms.xml
+++ b/tools/metrics/histograms/metadata/chrome/histograms.xml
@@ -293,7 +293,7 @@
 </histogram>
 
 <histogram name="Chrome.Tabs.AnimationSmoothness.TabLoading" units="%"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yichenz@chromium.org</owner>
   <owner>chromeos-wmp@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index af66af80..2322668 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1489,7 +1489,7 @@
 
 <histogram
     name="ChromeOS.Display.TimeUntilFirstBrightnessChange.{Time}.{BrightnessAction}Brightness.{PowerSource}Power"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>cambickel@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -1556,7 +1556,7 @@
 </histogram>
 
 <histogram name="ChromeOS.FirmwareUpdateUi.InstallFailedWithStatus"
-    enum="FirmwareUpdateFwupdStatus" expires_after="2025-08-31">
+    enum="FirmwareUpdateFwupdStatus" expires_after="2025-11-09">
   <owner>cambickel@google.com</owner>
   <owner>jimmyxgong@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -2735,7 +2735,7 @@
 </histogram>
 
 <histogram name="ChromeOS.LockScreenReauth.LockScreenReauthReason"
-    enum="LoginReauthReasons" expires_after="2025-09-07">
+    enum="LoginReauthReasons" expires_after="2025-11-09">
   <owner>ayag@chromium.org</owner>
   <owner>cros-3pidp@google.com</owner>
   <summary>
@@ -3117,7 +3117,7 @@
 </histogram>
 
 <histogram name="ChromeOS.PrivacyHub.{SensorName}Subpage.UserAction"
-    enum="PrivacyHubSensorSubpageUserAction" expires_after="2025-09-07">
+    enum="PrivacyHubSensorSubpageUserAction" expires_after="2025-11-09">
   <owner>shahinmd@google.com</owner>
   <owner>cros-privacy-features-dev@google.com</owner>
   <summary>
@@ -4453,7 +4453,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sharesheet.UserAction"
-    enum="ChromeOSSharesheetAction" expires_after="2025-09-07">
+    enum="ChromeOSSharesheetAction" expires_after="2025-11-09">
   <owner>ovn@google.com</owner>
   <owner>cros-web-apps-team@google.com</owner>
   <summary>Records user action on sharesheet invocations.</summary>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index 05866ae..bf5b610 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -193,7 +193,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.BlurredWindowDuration" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wesokuhara@google.com</owner>
   <owner>xiaohuic@chromium.org</owner>
   <owner>cros-settings@google.com</owner>
@@ -327,7 +327,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Display.Internal.BrightnessSliderAdjusted"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>cambickel@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -352,7 +352,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Display.MirrorModeStatus"
-    enum="DisplaySettingsBoolean" expires_after="2025-09-07">
+    enum="DisplaySettingsBoolean" expires_after="2025-11-09">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -680,7 +680,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.NumClicksUntilChange{OsSettingsChangeType}"
-    units="clicks" expires_after="2025-09-07">
+    units="clicks" expires_after="2025-11-09">
   <owner>wesokuhara@google.com</owner>
   <owner>xiaohuic@chromium.org</owner>
   <owner>cros-settings@google.com</owner>
@@ -1036,7 +1036,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.WindowTotalActiveDuration" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>moteva@google.com</owner>
   <owner>wesokuhara@google.com</owner>
   <owner>cros-settings@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/commerce/histograms.xml b/tools/metrics/histograms/metadata/commerce/histograms.xml
index b130cffa..019ba4ae 100644
--- a/tools/metrics/histograms/metadata/commerce/histograms.xml
+++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -42,7 +42,7 @@
 </variants>
 
 <histogram name="Commerce.BottomSheet.BrowsingTime" units="ms"
-    expires_after="2025-07-27">
+    expires_after="2025-11-09">
   <owner>qib@google.com</owner>
   <owner>meiliang@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml
index 7d52884..e17c4f6 100644
--- a/tools/metrics/histograms/metadata/compositing/histograms.xml
+++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -489,7 +489,7 @@
 </histogram>
 
 <histogram name="Compositing.Display.OverlayProcessorOzone.MaxPlanesSupported"
-    units="units" expires_after="2025-09-07">
+    units="units" expires_after="2025-11-09">
   <owner>harthuang@google.com</owner>
   <owner>fangzhoug@chromium.org</owner>
   <owner>petermcneeley@chromium.org</owner>
@@ -574,7 +574,7 @@
 
 <histogram
     name="Compositing.Display.OverlayProcessorUsingStrategy.ShouldAttemptMultipleOverlays"
-    enum="AttemptingMultipleOverlays" expires_after="2025-09-07">
+    enum="AttemptingMultipleOverlays" expires_after="2025-11-09">
   <owner>harthuang@google.com</owner>
   <owner>fangzhoug@chromium.org</owner>
   <owner>petermcneeley@chromium.org</owner>
@@ -1146,7 +1146,7 @@
 </histogram>
 
 <histogram name="Graphics.Exo.Smoothness.BeginFrameArrivalToSubmission"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>jonross@chromium.org</owner>
   <owner>yzshen@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 9944a9a..1ac4084 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -57,7 +57,7 @@
 </variants>
 
 <histogram name="Content.Classification" enum="ContentClassification"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>sophey@chromium.org</owner>
   <owner>chrome-sherlock@google.com</owner>
   <summary>
@@ -388,7 +388,7 @@
 </histogram>
 
 <histogram name="ContentSettings.RegularProfile.DefaultAutoVerifySetting"
-    enum="ContentSetting" expires_after="2025-08-31">
+    enum="ContentSetting" expires_after="2025-11-09">
   <owner>ryankalla@google.com</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index e07be9f..b927737 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -193,7 +193,7 @@
 
 <histogram
     name="Cookie.CrossSiteRedirectDowngradeChangesInclusion2.{AccessType}"
-    enum="CookieSameSite2" expires_after="2025-09-07">
+    enum="CookieSameSite2" expires_after="2025-11-09">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -507,7 +507,7 @@
 </histogram>
 
 <histogram name="Cookie.FromStorageWithValidLength" enum="BooleanValid"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>bingler@chromium.org</owner>
   <owner>awillia@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cros_ml/histograms.xml b/tools/metrics/histograms/metadata/cros_ml/histograms.xml
index d37b457..a9e4454 100644
--- a/tools/metrics/histograms/metadata/cros_ml/histograms.xml
+++ b/tools/metrics/histograms/metadata/cros_ml/histograms.xml
@@ -87,7 +87,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.GrammarChecker.Check.Event"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>jiwan@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>The result of grammar check, which can be OK or ERROR.</summary>
@@ -236,7 +236,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.NumWorkerProcess" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -292,7 +292,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.TotalMemoryKb" units="KB"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -303,7 +303,7 @@
 
 <histogram
     name="MachineLearningService.WebPlatformHandwritingModel.GetPrediction.Event"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -326,7 +326,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.WorkerProcessAcceptMojoConnectionTime"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -383,7 +383,7 @@
 
 <histogram name="MachineLearningService.{ModelName}.LoadModelResult.Event"
     enum="MachineLearningServiceLoadModelResultEvent"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
index 9b64e7e..5a0650b 100644
--- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -117,7 +117,7 @@
 </histogram>
 
 <histogram name="Cryptohome.DownloadsBindMountMigration.{Operation}"
-    enum="PopularOSErrno" expires_after="2025-09-07">
+    enum="PopularOSErrno" expires_after="2025-11-09">
   <owner>wenbojie@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -140,7 +140,7 @@
 </histogram>
 
 <histogram name="Cryptohome.DownloadsBindMountMigrationStatus"
-    enum="CryptohomeDownloadsMigrationStatus" expires_after="2025-09-07">
+    enum="CryptohomeDownloadsMigrationStatus" expires_after="2025-11-09">
   <owner>wenbojie@chromium.org</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -799,7 +799,7 @@
 
 <histogram
     name="Cryptohome.{ErrorOperation}{AuthFactorType}.DevUnexpectedState"
-    enum="CryptohomeErrorLocation" expires_after="2025-09-07">
+    enum="CryptohomeErrorLocation" expires_after="2025-11-09">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -871,7 +871,7 @@
 </histogram>
 
 <histogram name="Cryptohome.{ErrorOperation}{AuthFactorType}.LeafErrorWithTPM"
-    enum="CryptohomeErrorLocationWithTPMError" expires_after="2025-09-07">
+    enum="CryptohomeErrorLocationWithTPMError" expires_after="2025-11-09">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
index ba9264ec..c1393a02 100644
--- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
+++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -181,7 +181,7 @@
 </histogram>
 
 <histogram name="CustomTabs.ClientAppId.Incognito" enum="ClientAppId"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>zalmashni@google.com</owner>
   <owner>chrome-incognito@google.com</owner>
   <owner>cct-team@google.com</owner>
@@ -616,7 +616,7 @@
 
 <histogram
     name="CustomTabs.PostMessage.RequestPostMessageChannelWithTargetOrigin"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>elabadysayed@chromium.org</owner>
   <owner>chrome-connective-tissue@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 1954d25..85f6e25 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -111,7 +111,7 @@
 </histogram>
 
 <histogram name="Download.Android.OpenDialog.Events"
-    enum="OpenDownloadDialogEvent" expires_after="2025-09-07">
+    enum="OpenDownloadDialogEvent" expires_after="2025-11-09">
   <owner>qinmin@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <summary>
@@ -169,7 +169,7 @@
 </histogram>
 
 <histogram name="Download.BandwidthOverallBytesPerSecond2" units="bytes/second"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Overall bandwidth seen for a completed download. This includes all file
@@ -762,7 +762,7 @@
 </histogram>
 
 <histogram name="Download.OpenDownloads.OpenWithExternalAppsSource"
-    enum="OpenDownloadWithExternalAppsSource" expires_after="2025-09-07">
+    enum="OpenDownloadWithExternalAppsSource" expires_after="2025-11-09">
   <owner>shuyng@google.com</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -1207,7 +1207,7 @@
 </histogram>
 
 <histogram name="Download.Start.PerProfileType" enum="BrowserProfileType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 427db70..335cfc736 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -532,7 +532,7 @@
 
 <histogram
     name="Enterprise.ClientCertificate.{Level}.{UploadScenario}.UploadCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-08-10">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-11-09">
   <owner>seblalancette@chromium.org</owner>
   <owner>cbe-device-trust-eng@google.com</owner>
   <summary>
@@ -676,7 +676,7 @@
 </histogram>
 
 <histogram name="Enterprise.DevicePolicyDeviceIdValidity2.{EnrollmentType}"
-    enum="EnterprisePolicyDeviceIdValidity" expires_after="2025-09-07">
+    enum="EnterprisePolicyDeviceIdValidity" expires_after="2025-11-09">
   <owner>igorcov@chromium.org</owner>
   <owner>emaxx@chromium.org</owner>
   <summary>
@@ -1676,7 +1676,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.ReportedWarnLevelRestriction"
-    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-09-01">
+    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-11-09">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1697,7 +1697,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.RestrictionConfigured"
-    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-09-07">
+    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-11-09">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -2107,7 +2107,7 @@
 </histogram>
 
 <histogram name="Enterprise.EnrollmentNudge.PolicyFetchResult"
-    enum="EnrollmentNudgePolicyFetchResult" expires_after="2025-09-07">
+    enum="EnrollmentNudgePolicyFetchResult" expires_after="2025-11-09">
   <owner>andreydav@google.com</owner>
   <owner>rodmartin@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
@@ -3775,7 +3775,7 @@
 
 <histogram
     name="Enterprise.{ContentAnalysisProtocol}Request.{ContentAnalysisRequestType}.Duration"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>nancylanxiao@google.com</owner>
   <owner>domfc@chromium.org</owner>
   <owner>cbe-cep-eng@google.com</owner>
@@ -3859,7 +3859,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.InvalidPolicies" enum="EnterprisePolicies"
-    expires_after="2025-07-01">
+    expires_after="2025-11-09">
   <owner>pastarmovj@chromium.org</owner>
   <owner>ydago@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml
index 4ac97b2..3c92e64d 100644
--- a/tools/metrics/histograms/metadata/event/histograms.xml
+++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -119,7 +119,7 @@
 </histogram>
 
 <histogram name="Event.GestureScrollEnd.BrowserCompositorFrame.Count"
-    units="counts" expires_after="2025-09-07">
+    units="counts" expires_after="2025-11-09">
   <owner>peilinwang@google.com</owner>
   <owner>woa-performance-team@google.com</owner>
   <summary>
@@ -1071,7 +1071,7 @@
 </histogram>
 
 <histogram name="EventLatency.{ScrollEventType}.GenerationToBrowserMain"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1121,7 +1121,7 @@
 </histogram>
 
 <histogram name="EventLatency.{ScrollEventType}.{TopControls}"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index d8eec06..aa386160 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -266,7 +266,7 @@
 </histogram>
 
 <histogram name="Extensions.ActiveScriptController.PermittedExtensions"
-    units="Extension Count" expires_after="2025-09-07">
+    units="Extension Count" expires_after="2025-11-09">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3948,7 +3948,7 @@
 
 <histogram
     name="Extensions.MessagePipeline.OpenChannelDispatchOnConnectStatus{DispatchTarget}{ChannelType}"
-    enum="OpenChannelMessagePipelineResult" expires_after="2025-09-07">
+    enum="OpenChannelMessagePipelineResult" expires_after="2025-11-09">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3971,7 +3971,7 @@
 
 <histogram
     name="Extensions.MessagePipeline.OpenChannelStatus{WorkerStatus}{ChannelType}"
-    enum="OpenChannelMessagePipelineResult" expires_after="2025-09-07">
+    enum="OpenChannelMessagePipelineResult" expires_after="2025-11-09">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4002,7 +4002,7 @@
 
 <histogram
     name="Extensions.MessagePipeline.OpenChannelWorkerDispatchStatus{ChannelType}"
-    enum="OpenChannelMessagePipelineResult" expires_after="2025-09-07">
+    enum="OpenChannelMessagePipelineResult" expires_after="2025-11-09">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4020,7 +4020,7 @@
 
 <histogram
     name="Extensions.MessagePipeline.OpenChannelWorkerWakeUpStatus{ChannelType}"
-    enum="OpenChannelMessagePipelineResult" expires_after="2025-09-07">
+    enum="OpenChannelMessagePipelineResult" expires_after="2025-11-09">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4193,7 +4193,7 @@
 
 <histogram
     name="Extensions.NonWebstoreLocationWith{DeveloperModeState}{ExtensionState}3"
-    enum="ExtensionLocation" expires_after="2025-09-07">
+    enum="ExtensionLocation" expires_after="2025-11-09">
   <owner>richche@google.com</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/facilitated_payments/histograms.xml b/tools/metrics/histograms/metadata/facilitated_payments/histograms.xml
index 55ea66e5..9fc043b 100644
--- a/tools/metrics/histograms/metadata/facilitated_payments/histograms.xml
+++ b/tools/metrics/histograms/metadata/facilitated_payments/histograms.xml
@@ -434,7 +434,7 @@
 </histogram>
 
 <histogram name="FacilitatedPayments.SettingsPage.Shown" enum="BooleanShown"
-    expires_after="2025-07-01">
+    expires_after="2025-11-09">
   <owner>siashah@google.com</owner>
   <owner>vishwasuppoor@google.com</owner>
   <owner>rouslan@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/families/histograms.xml b/tools/metrics/histograms/metadata/families/histograms.xml
index 0987b42d..93aa62f 100644
--- a/tools/metrics/histograms/metadata/families/histograms.xml
+++ b/tools/metrics/histograms/metadata/families/histograms.xml
@@ -803,7 +803,7 @@
 
 <histogram
     name="SupervisedUsers.ClassifyUrlThrottle.EarlierThanContentResponse"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -839,7 +839,7 @@
 </histogram>
 
 <histogram name="SupervisedUsers.ClassifyUrlThrottle.LaterThanContentResponse"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -1062,7 +1062,7 @@
 
 <histogram
     name="SupervisedUsers.SkipParentApprovalToInstallExtensions.PerRecord"
-    enum="SupervisedUserToggleState" expires_after="2025-09-07">
+    enum="SupervisedUserToggleState" expires_after="2025-11-09">
   <owner>anthie@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <owner>cros-families-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/favicons/histograms.xml b/tools/metrics/histograms/metadata/favicons/histograms.xml
index 53b2e0001..6f2c972 100644
--- a/tools/metrics/histograms/metadata/favicons/histograms.xml
+++ b/tools/metrics/histograms/metadata/favicons/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Favicons.DefaultResponse" enum="BooleanSuccess"
-    expires_after="2025-08-10">
+    expires_after="2025-11-09">
   <owner>mfacey@chromium.org</owner>
   <owner>romanarora@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index 1a713c41..16cb430 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -1444,7 +1444,7 @@
 </histogram>
 
 <histogram name="FileBrowser.QuickView.DialogType" enum="FileDialogType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1453,7 +1453,7 @@
 </histogram>
 
 <histogram name="FileBrowser.QuickView.FileType" enum="ViewFileType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>File types that were tried to be opened with quick view.</summary>
@@ -1467,7 +1467,7 @@
 </histogram>
 
 <histogram name="FileBrowser.QuickView.VolumeType" enum="FileManagerVolumeType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>The volume type where quick view is opened.</summary>
diff --git a/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml b/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml
index 4b037006..01b9c34 100644
--- a/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml
+++ b/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml
@@ -173,7 +173,7 @@
 
 <histogram
     name="FingerprintingProtection.DocumentLoad.SubframeFilteringDelay.{Result}"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>thesalsa@google.com</owner>
   <owner>trishalfonso@google.com</owner>
   <owner>rizvis@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml
index 4eaf771..12e14e5a 100644
--- a/tools/metrics/histograms/metadata/geolocation/histograms.xml
+++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -261,7 +261,7 @@
 </histogram>
 
 <histogram name="Geolocation.NetworkLocationRequest.RequestInterval"
-    units="mins" expires_after="2025-09-07">
+    units="mins" expires_after="2025-11-09">
   <owner>alvinji@chromium.org</owner>
   <owner>device-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index 84fa325..0054dfd9 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1460,7 +1460,7 @@
 
 <histogram
     name="GPU.{GraphiteDawnOrWebGPU}.MaxTextureDimension2D.{AdapterType}"
-    units="dimensions" expires_after="2025-09-07">
+    units="dimensions" expires_after="2025-11-09">
   <owner>cduvall@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
@@ -1521,7 +1521,7 @@
 
 <histogram
     name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.{CacheHitMiss}.90SecondsPostStartup"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>hitawala@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
@@ -1541,7 +1541,7 @@
 
 <histogram
     name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.{CacheHitMiss}.Counts.90SecondsPostStartup"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>hitawala@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 4a457972..03ad321 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -386,7 +386,7 @@
 </histogram>
 
 <histogram name="IOS.ClosedTabIsAboutBlank" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>michaeldo@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -456,7 +456,7 @@
 </histogram>
 
 <histogram name="IOS.ContextMenu.ImagePreviewDisplayed" enum="BooleanSuccess"
-    expires_after="2025-09-06">
+    expires_after="2025-11-09">
   <owner>olivierrobin@google.com</owner>
   <owner>bling-squid-squad@google.com</owner>
   <summary>Whether the loading of the image preview succeeded.</summary>
@@ -796,7 +796,7 @@
 </histogram>
 
 <histogram name="IOS.CredentialExtension.PasskeyUseCount" units="count"
-    expires_after="2025-08-10">
+    expires_after="2025-11-09">
   <owner>tmartino@chromium.org</owner>
   <owner>bling-transactions-eng@google.com</owner>
   <summary>
@@ -2285,7 +2285,7 @@
 </histogram>
 
 <histogram name="IOS.IsDefaultBrowser{NumberOfDays}" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>sebsg@chromium.org</owner>
   <owner>gujen@chromium.org</owner>
   <summary>
@@ -2475,7 +2475,7 @@
 </histogram>
 
 <histogram name="IOS.LocationBar.LensOverlayEntrypointAvailable" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>christianxu@chromium.org</owner>
   <owner>stkhapugin@chromium.org</owner>
   <summary>
@@ -2485,7 +2485,7 @@
 </histogram>
 
 <histogram name="IOS.LocationBar.LensOverlayEntrypointHidden"
-    enum="IOSLocationBarLeadingIconType" expires_after="2025-09-07">
+    enum="IOSLocationBarLeadingIconType" expires_after="2025-11-09">
   <owner>christianxu@chromium.org</owner>
   <owner>stkhapugin@chromium.org</owner>
   <summary>
@@ -2616,7 +2616,7 @@
 
 <histogram
     name="IOS.MagicStack.Module.{Event}.TabResumption.{Surface}.{Source}"
-    units="index" expires_after="2025-09-07">
+    units="index" expires_after="2025-11-09">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-get-set-up@google.com</owner>
   <summary>
@@ -2729,7 +2729,7 @@
 </histogram>
 
 <histogram name="IOS.MemoryExperimenter.AllocationTime" units="ms"
-    expires_after="2025-08-14">
+    expires_after="2025-11-09">
   <owner>rohitrao@google.com</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -3128,7 +3128,7 @@
 </histogram>
 
 <histogram name="IOS.MultiWindow.OpenInNewWindow" enum="WindowActivityOrigin"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>marq@chromium.org</owner>
   <owner>fedegermi@chromium.org</owner>
   <summary>
@@ -3507,7 +3507,7 @@
 </histogram>
 
 <histogram name="IOS.OpenIn.MimeType" enum="IOSOpenInMimeType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ewannpv@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
@@ -4311,7 +4311,7 @@
 <histogram
     name="IOS.PushNotification.NotificationAutorizationStatusChangedToProvisional"
     enum="PushNotificationSettingsAuthorizationStatus"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>scottyoder@google.com</owner>
   <owner>bling-get-set-up@google.com</owner>
   <summary>
@@ -5098,7 +5098,7 @@
 </histogram>
 
 <histogram name="IOS.SearchWith.Trigger" enum="IOSSearchWithContext"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>olivierrobin@chromium.org</owner>
   <owner>bling-squid-squad@google.com</owner>
   <summary>The context in which Search With has been triggered.</summary>
@@ -5480,7 +5480,7 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.TabGrid.CloseTabs" units="Tabs" expires_after="2025-09-07">
+<histogram name="IOS.TabGrid.CloseTabs" units="Tabs" expires_after="2025-11-09">
   <owner>ewannpv@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
@@ -5655,7 +5655,7 @@
 </histogram>
 
 <histogram name="IOS.TabSwitcher.Idle.IncognitoTabGridPage" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ewannpv@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/lens/histograms.xml b/tools/metrics/histograms/metadata/lens/histograms.xml
index 10e0308..245bb0a 100644
--- a/tools/metrics/histograms/metadata/lens/histograms.xml
+++ b/tools/metrics/histograms/metadata/lens/histograms.xml
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.ByDocumentType.{DocumentType}.Invoked"
-    enum="Boolean" expires_after="2025-10-31">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>stanfield@google.com</owner>
   <owner>mercerd@google.com</owner>
   <owner>lens-chrome@google.com</owner>
@@ -141,7 +141,7 @@
 
 <histogram
     name="Lens.Overlay.ByInvocationSource.{InvocationSource}.ContextMenuOption.Shown"
-    enum="LensOverlayContextMenuOption" expires_after="2025-07-06">
+    enum="LensOverlayContextMenuOption" expires_after="2025-11-09">
   <owner>hujasonx@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -155,7 +155,7 @@
 
 <histogram
     name="Lens.Overlay.ByInvocationSource.{InvocationSource}.InvocationResultedInSearch"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -168,7 +168,7 @@
 
 <histogram
     name="Lens.Overlay.ByInvocationSource.{InvocationSource}.SessionDuration"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -195,7 +195,7 @@
 
 <histogram
     name="Lens.Overlay.ByInvocationSource.{InvocationSource}.TimeToFirstInteraction"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -493,7 +493,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.Dismissed" enum="LensOverlayDismissalSource"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -520,7 +520,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.GeneratedTab.SessionCount" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>christianxu@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -540,7 +540,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.Invoked" enum="LensOverlayInvocationSource"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -558,7 +558,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.LensResponseTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>christianxu@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -584,7 +584,7 @@
 
 <histogram
     name="Lens.Overlay.Overlay.ByInvocationSource.{InvocationSource}.UserAction"
-    enum="LensOverlayUserAction" expires_after="2025-09-07">
+    enum="LensOverlayUserAction" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -601,7 +601,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.Overlay.UserAction" enum="LensOverlayUserAction"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -631,7 +631,7 @@
 
 <histogram
     name="Lens.Overlay.PermissionBubble.ByInvocationSource.{InvocationSource}.Shown"
-    enum="BooleanShown" expires_after="2025-09-07">
+    enum="BooleanShown" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -645,7 +645,7 @@
 
 <histogram
     name="Lens.Overlay.PermissionBubble.ByInvocationSource.{InvocationSource}.UserAction"
-    enum="LensPermissionBubbleUserAction" expires_after="2025-09-07">
+    enum="LensPermissionBubbleUserAction" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -656,7 +656,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.PermissionBubble.Shown" enum="BooleanShown"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -667,7 +667,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.PermissionBubble.UserAction"
-    enum="LensPermissionBubbleUserAction" expires_after="2025-09-07">
+    enum="LensPermissionBubbleUserAction" expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
@@ -677,7 +677,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.SessionDuration" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -687,7 +687,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.SessionForegroundDuration" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>christianxu@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -739,7 +739,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.TimeToFirstInteraction" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -751,7 +751,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.TimeToFirstInteraction.{FirstInteractionType}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>christianxu@chromium.org</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml
index 90a1d53a4..f6e7d50a 100644
--- a/tools/metrics/histograms/metadata/login/histograms.xml
+++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -62,7 +62,7 @@
 </histogram>
 
 <histogram name="Login.CryptohomeRecoveryDuration.{Result}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yunkez@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/magic_stack/histograms.xml b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
index 9d58b6e..4e747d6f 100644
--- a/tools/metrics/histograms/metadata/magic_stack/histograms.xml
+++ b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
@@ -187,7 +187,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.Scrollable.{ScrollState}"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 49919e1..f12b707 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -1052,7 +1052,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Output.Win.{AudioOutputMethod}Error"
-    enum="Hresult" expires_after="2025-09-09">
+    enum="Hresult" expires_after="2025-11-09">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1265,7 +1265,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>olka@chromium.org</owner>
   <owner>henrika@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1343,7 +1343,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.SystemDelay" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -4195,7 +4195,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevices.GetDisplayMedia.Result"
-    enum="UserMediaRequestResult" expires_after="2025-09-07">
+    enum="UserMediaRequestResult" expires_after="2025-11-09">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <owner>video-cmi-apis@google.com</owner>
@@ -4553,7 +4553,7 @@
 
 <histogram
     name="Media.MediaVideoVisibilityTracker.OccludingRectsCount.{BucketSizeIncreases}Histogram.TotalCount"
-    units="rects" expires_after="2025-08-31">
+    units="rects" expires_after="2025-11-09">
   <owner>bkeen@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -4624,7 +4624,7 @@
 
 <histogram
     name="Media.MediaVideoVisibilityTracker.{PercentageCategory}.Percentage"
-    units="%" expires_after="2025-08-31">
+    units="%" expires_after="2025-11-09">
   <owner>bkeen@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -4712,7 +4712,7 @@
 </histogram>
 
 <histogram name="Media.MojoVideoDecoder.ActiveInstances" units="units"
-    expires_after="2025-08-10">
+    expires_after="2025-11-09">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -5072,7 +5072,7 @@
 </histogram>
 
 <histogram name="Media.PlatformVideoDecoding.VideoCodecProfile"
-    enum="VideoCodecProfile" expires_after="2025-09-07">
+    enum="VideoCodecProfile" expires_after="2025-11-09">
   <owner>mcasas@chromium.org</owner>
   <owner>chromeos-gfx-video@google.com</owner>
   <summary>
@@ -5496,7 +5496,7 @@
 </histogram>
 
 <histogram name="Media.RTCVideoDecoderError" enum="MediaStatusCode"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>posciak@chromium.org</owner>
   <owner>liberato@chromium.org</owner>
   <owner>webrtc-video@google.com</owner>
@@ -5944,7 +5944,7 @@
 <histogram
     name="Media.Ui.GetDisplayMedia.ScreenSharingPermissionInteractionMac"
     enum="MediaUiGetDisplayMediaPermissionInteraction"
-    expires_after="2025-05-22">
+    expires_after="2026-05-13">
   <owner>tovep@chromium.org</owner>
   <owner>eladalon@chromium.org</owner>
   <owner>kron@chromium.org</owner>
@@ -5959,7 +5959,7 @@
 <histogram
     name="Media.Ui.GetDisplayMedia.WindowSharingPermissionInteractionMac"
     enum="MediaUiGetDisplayMediaPermissionInteraction"
-    expires_after="2025-05-22">
+    expires_after="2026-05-13">
   <owner>tovep@chromium.org</owner>
   <owner>eladalon@chromium.org</owner>
   <owner>kron@chromium.org</owner>
@@ -6629,7 +6629,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Win.Device.CaptureBeginTime.MFTimeOffset"
-    units="ms" expires_after="2025-06-22">
+    units="ms" expires_after="2026-06-22">
   <owner>ilnik@google.com</owner>
   <owner>video-cmi-mpp@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index 12900ec6..910e67b 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -1022,7 +1022,7 @@
 </histogram>
 
 <histogram name="MobileFre.FromLaunch.{Target}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>skym@chromium.org</owner>
   <owner>wenyufu@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index 48c8406..f809d38 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -345,7 +345,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.HistoryNavHasPotentialMatch" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rakina@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -426,7 +426,7 @@
 
 <histogram
     name="BackForwardCache.HistoryNavigationOutcome.DisallowActivationReason"
-    enum="InactiveFrameDisallowActivationReason" expires_after="2025-09-07">
+    enum="InactiveFrameDisallowActivationReason" expires_after="2025-11-09">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -752,7 +752,7 @@
 
 <histogram name="Navigation.BrowserMappedUrnUuidInIframeOrFencedFrame"
     enum="NavigationBrowserMappedUrnUuidInIframeOrFencedFrame"
-    expires_after="2025-09-09">
+    expires_after="2025-11-09">
   <owner>xiaochenzh@chromium.org</owner>
   <owner>shivanisha@chromium.org</owner>
   <summary>
@@ -888,7 +888,7 @@
 </histogram>
 
 <histogram name="Navigation.DuringGesture.NavStarted{NavigationMode}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>lazzzis@google.com</owner>
   <owner>liuwilliam@chromium.org</owner>
   <owner>chrome-seamless-core@google.com</owner>
@@ -1322,7 +1322,7 @@
 </histogram>
 
 <histogram name="Navigation.IsSameSiteInstance"
-    enum="NavigationIsSameSiteInstance" expires_after="2025-09-07">
+    enum="NavigationIsSameSiteInstance" expires_after="2025-11-09">
   <owner>arthursonzogni@chromium.org</owner>
   <owner>clamy@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
@@ -1714,7 +1714,7 @@
 </histogram>
 
 <histogram name="Navigation.PendingCommit.Duration.{RegularOrMHTMLType}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>dcheng@chromium.org</owner>
   <owner>rakina@chromium.org</owner>
   <summary>
@@ -2941,7 +2941,7 @@
 </histogram>
 
 <histogram name="Navigation.{TracedMethod}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rakina@chromium.org</owner>
   <owner>chrome-security-architecture@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 29b62c0a..f654280 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -609,7 +609,7 @@
 </histogram>
 
 <histogram name="HttpCache.IsNoStore{Type}" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2549,7 +2549,7 @@
 </histogram>
 
 <histogram name="Net.HttpAuthTarget" enum="HttpAuthTarget"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mpdenton@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -3260,7 +3260,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.SwitchesToPoolPostTaskTime" units="ms"
-    expires_after="2025-07-27">
+    expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -3500,8 +3500,31 @@
 </histogram>
 
 <histogram
+    name="Net.NetworkTransaction.DuplicateRequestInterval{HostType}{MainFrame}"
+    units="ms" expires_after="2025-08-14">
+  <owner>ricea@chromium.org</owner>
+  <owner>src/net/OWNERS</owner>
+  <summary>
+    When an HTTP(S) request with a GET method is sent to the network within 10
+    seconds of another GET request with an identical URL, records the time
+    interval between the first request and the second.
+
+    Recorded once per duplicate request, but only when the
+    &quot;LogDuplicateRequests&quot; feature is enabled.
+  </summary>
+  <token key="HostType">
+    <variant name=""/>
+    <variant name=".GoogleHost"/>
+  </token>
+  <token key="MainFrame">
+    <variant name=""/>
+    <variant name=".MainFrame"/>
+  </token>
+</histogram>
+
+<histogram
     name="Net.NetworkTransaction.GenerateProxyAuthTokenBlocked{HostType}.{Protocol}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -3530,7 +3553,7 @@
 
 <histogram
     name="Net.NetworkTransaction.GenerateServerAuthTokenBlocked{HostType}.{Protocol}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -3559,7 +3582,7 @@
 
 <histogram
     name="Net.NetworkTransaction.InitializeStreamBlocked{HostType}.{Protocol}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -3572,7 +3595,7 @@
 
 <histogram
     name="Net.NetworkTransaction.InitializeStreamBlockTime{HostType}.{Protocol}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -5745,7 +5768,7 @@
 
 <histogram
     name="Net.QuicSession.SessionKeyMismatch.MismatchedFieldCombination{HostType}"
-    enum="QuicSessionKeyMismatchedFieldCombination" expires_after="2025-09-07">
+    enum="QuicSessionKeyMismatchedFieldCombination" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -5759,7 +5782,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.SessionKeyMismatch.MismatchedField{HostType}"
-    enum="QuicSessionKeyMismatchedField" expires_after="2025-09-07">
+    enum="QuicSessionKeyMismatchedField" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -5772,7 +5795,7 @@
 
 <histogram
     name="Net.QuicSession.SessionKeyMismatch.TotalMismatchedField{HostType}"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -5785,7 +5808,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.SessionKeyMismatch{HostType}"
-    enum="QuicSessionKeyPartialMatchResult" expires_after="2025-09-07">
+    enum="QuicSessionKeyPartialMatchResult" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -6144,7 +6167,7 @@
 </histogram>
 
 <histogram name="Net.QuicSessionAttempt.CompleteTime.{SuccessOrFailure}"
-    units="ms" expires_after="2025-07-27">
+    units="ms" expires_after="2025-11-09">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -6572,7 +6595,7 @@
 
 <histogram
     name="Net.SessionCreate.GoogleSearch.Preconnect2.Quic.CompletionResult{JobType}"
-    enum="NetErrorCodes" expires_after="2025-07-27">
+    enum="NetErrorCodes" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -6696,7 +6719,7 @@
 
 <histogram
     name="Net.SharedDictionaryManagerOnDisk.TotalDictionarySizeKBWhenAdded"
-    units="KB" expires_after="2025-06-29">
+    units="KB" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6708,7 +6731,7 @@
 
 <histogram
     name="Net.SharedDictionaryOnDisk.OpenEntryLatency.{SuccessOrFailure}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6719,7 +6742,7 @@
 </histogram>
 
 <histogram name="Net.SharedDictionaryOnDisk.ReadDataLatency.{SuccessOrFailure}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6740,7 +6763,7 @@
 </histogram>
 
 <histogram name="Net.SharedDictionaryStorageOnDisk.MetadataReadTime.{Result}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6777,7 +6800,7 @@
 </histogram>
 
 <histogram name="Net.SharedDictionaryStore.{MethodName}.Error"
-    enum="SharedDictionaryStoreError" expires_after="2025-09-07">
+    enum="SharedDictionaryStoreError" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6803,7 +6826,7 @@
 
 <histogram
     name="Net.SharedDictionaryTransaction.AbortedWhileReadingDictionary.{SuccessOrFailure}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6817,7 +6840,7 @@
 
 <histogram
     name="Net.SharedDictionaryTransaction.DictionaryReadLatency.{SuccessOrFailure}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -6846,7 +6869,7 @@
 
 <histogram
     name="Net.SharedDictionaryUsedByResponseWhenAvailable2.MainFrame.{ConnectionType}.{CertState}"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index d547d455..37d10be 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -5018,7 +5018,7 @@
 
 <histogram
     name="NetworkService.CorsURLLoaderFactory.CreateLoaderAndStart2.Duration"
-    units="microseconds" expires_after="2025-09-10">
+    units="microseconds" expires_after="2025-11-09">
   <owner>olivier@chromium.org</owner>
   <owner>cduvall@chromium.org</owner>
   <summary>
@@ -5349,7 +5349,7 @@
 
 <histogram
     name="NetworkService.IpProtection.ProxyAllowList.FlatbufferBuildTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -5484,7 +5484,7 @@
 </histogram>
 
 <histogram name="NetworkService.IpProtection.TokenBatchGenerationTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>ashleynewson@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
@@ -5604,7 +5604,7 @@
 </histogram>
 
 <histogram name="NetworkService.MaskedDomainList.DiskUsage" units="KB"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -5628,7 +5628,7 @@
 </histogram>
 
 <histogram name="NetworkService.MaskedDomainList.FirstUpdateTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ashleynewson@chromium.org</owner>
   <owner>src/android_webview/browser/ip_protection/OWNERS</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/notifications/histograms.xml b/tools/metrics/histograms/metadata/notifications/histograms.xml
index fc43ded..f89f1d71 100644
--- a/tools/metrics/histograms/metadata/notifications/histograms.xml
+++ b/tools/metrics/histograms/metadata/notifications/histograms.xml
@@ -848,7 +848,7 @@
 </histogram>
 
 <histogram name="Notifications.PerNotificationActions"
-    enum="NotificationActionType" expires_after="2025-09-07">
+    enum="NotificationActionType" expires_after="2025-11-09">
   <owner>dewittj@chromium.org</owner>
   <owner>leandre@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index 5afed18..4e98e155 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -1408,7 +1408,7 @@
 </histogram>
 
 <histogram name="Omnibox.IsPasteAndGo" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -3042,7 +3042,7 @@
 
 <histogram
     name="Omnibox.URLScoringModelExecuted.ScoringSignalCoverage.{ProviderType}.{ScoringSignalType}"
-    enum="BooleanNonNull" expires_after="2025-09-07">
+    enum="BooleanNonNull" expires_after="2025-11-09">
   <owner>khalidpeer@chromium.org</owner>
   <owner>manukh@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -3407,7 +3407,7 @@
 </histogram>
 
 <histogram name="Omnibox.{SearchPrefetch}.CacheAliasElapsedTimeToFallback"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -3422,7 +3422,7 @@
 </histogram>
 
 <histogram name="Omnibox.{SearchPrefetch}.CacheAliasFallbackReason"
-    enum="SearchPrefetchCacheAliasFallbackReason" expires_after="2025-09-07">
+    enum="SearchPrefetchCacheAliasFallbackReason" expires_after="2025-11-09">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -3598,7 +3598,7 @@
 </histogram>
 
 <histogram name="Realbox.CharTypedToRepaintLatency.ToPaint" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index af7bc42..da657ba 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -1099,7 +1099,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.ModelExecution.OnDeviceModelStatusAtUseTime"
-    enum="OptimizationGuideOnDeviceModelStatus" expires_after="2025-09-07">
+    enum="OptimizationGuideOnDeviceModelStatus" expires_after="2025-11-09">
   <owner>harringtond@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1125,7 +1125,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceModelValidationResult"
-    enum="OnDeviceModelValidationResult" expires_after="2025-08-31">
+    enum="OnDeviceModelValidationResult" expires_after="2025-11-09">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1347,7 +1347,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ExecutionThreadTime.{OptimizationTarget}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1407,7 +1407,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.TaskExecutionLatency.{OptimizationTarget}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1801,7 +1801,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionManager.IsDownloadUrlValid.{OptimizationTarget}"
-    enum="BooleanValid" expires_after="2025-09-07">
+    enum="BooleanValid" expires_after="2025-11-09">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1946,7 +1946,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsResponse.NetErrorCode"
-    enum="NetErrorCodes" expires_after="2025-09-07">
+    enum="NetErrorCodes" expires_after="2025-11-09">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -2103,7 +2103,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.ProcessHintsResult"
-    enum="OptimizationGuideProcessHintsResult" expires_after="2025-09-07">
+    enum="OptimizationGuideProcessHintsResult" expires_after="2025-11-09">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 28a4c631..6639d30 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -706,7 +706,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.BidFiltered" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -721,7 +721,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.BidScriptTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>behamilton@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -736,7 +736,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ConfigPromises.CriticalPathLatency"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>orrb@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -756,7 +756,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ConfigPromises.Latency" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>orrb@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -774,7 +774,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ContextReused" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -821,7 +821,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.DownloadThreadDelay" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>morlovich@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -837,7 +837,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.FinalReporterState"
-    enum="InterestGroupAuctionReporterState" expires_after="2025-09-07">
+    enum="InterestGroupAuctionReporterState" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -877,7 +877,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.GenerateBidTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -891,7 +891,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.GroupFreshness.{Type}"
-    units="minutes" expires_after="2025-09-07">
+    units="minutes" expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -980,7 +980,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.LoadGroupsCacheHit" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -994,7 +994,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.LoadGroupsTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1008,7 +1008,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.LoadGroupsUseInProgressLoad"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1022,7 +1022,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.LoadNoGroupsTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1052,7 +1052,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumAuctionsPerPage" units="auctions"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -1084,7 +1084,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumberOfPendingScoreAdTasks"
-    units="tasks" expires_after="2025-09-07">
+    units="tasks" expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1112,7 +1112,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumInterestGroups" units="groups"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -1128,7 +1128,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumNegativeInterestGroups"
-    units="groups" expires_after="2025-09-07">
+    units="groups" expires_after="2025-11-09">
   <owner>orrb@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1167,7 +1167,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumOwnersWithInterestGroups"
-    units="owners" expires_after="2025-09-07">
+    units="owners" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -1204,7 +1204,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumSellersWithBidders"
-    units="sellers" expires_after="2025-09-07">
+    units="sellers" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -1250,7 +1250,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.PercentAuctionsSuccessfulPerPage"
-    units="%" expires_after="2025-09-07">
+    units="%" expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -1316,7 +1316,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ProcessLaunchTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1376,7 +1376,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ScoreAdInputWaitTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1388,7 +1388,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ScoreAdQueueTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1412,7 +1412,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ScoreAdTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1457,7 +1457,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.TimeSinceLastAuctionPerPage"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -1473,7 +1473,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.TrustedBidderBatchCompute"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>morlovich@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1517,7 +1517,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.TrustedSellerBatchCompute"
-    units="microseconds" expires_after="2025-09-07">
+    units="microseconds" expires_after="2025-11-09">
   <owner>morlovich@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1705,7 +1705,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.GetInterestGroupAdAuctionData.TimeToResolve"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1735,7 +1735,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Net.DownloadTime.{Type}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1764,7 +1764,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Net.RequestUrlSizeBytes.{Type}"
-    units="bytes" expires_after="2025-09-07">
+    units="bytes" expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -1796,7 +1796,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Net.ResponseSizeBytes.{Type}" units="bytes"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -1875,7 +1875,7 @@
 
 <histogram
     name="Ads.InterestGroup.NetHeaderResponse.HeaderDirectFromSellerSignals.ParseAndFindMatchTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -2019,7 +2019,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.ReceivedDeprecatedBiddingSignalsFormat"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -2121,7 +2121,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.ServerAuction.EndToEndTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -2191,7 +2191,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.ServerAuction.KeyFetch.DBCached"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>abigailkatcoff@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -2383,7 +2383,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.AbortTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -2405,7 +2405,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.AuctionWithWinnerTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -2426,7 +2426,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.CompletedWithoutWinnerTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -2450,7 +2450,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.NonKAnonWinnerIsKAnon"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>behamilton@google.com</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -2506,7 +2506,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.Result{Version}"
-    enum="AuctionResult" expires_after="2025-09-07">
+    enum="AuctionResult" expires_after="2025-11-09">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -2537,7 +2537,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.SignaledAbortTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -2559,7 +2559,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.StateAtAbortTime"
-    enum="AuctionState" expires_after="2025-09-07">
+    enum="AuctionState" expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -2581,7 +2581,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.StateAtFailTime"
-    enum="AuctionState" expires_after="2025-09-07">
+    enum="AuctionState" expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -2630,7 +2630,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.{AuctionType}.TimeToResolve" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -3200,7 +3200,7 @@
 </histogram>
 
 <histogram name="ChromiumAndroidLinker.RelroProvidedSuccessfully"
-    enum="BooleanSuccess" expires_after="2025-09-07">
+    enum="BooleanSuccess" expires_after="2025-11-09">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -4913,7 +4913,7 @@
 </histogram>
 
 <histogram name="Feedback.HappinessTrackingSurvey.SurveyCompleted"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>ravjit@google.com</owner>
   <owner>fjacky@google.com</owner>
   <summary>
@@ -5988,7 +5988,7 @@
 </histogram>
 
 <histogram name="LoadingPredictor.PredictorDatabaseFileSize" units="KiB"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yoichio@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <component>1457018</component>
@@ -6147,7 +6147,7 @@
 </histogram>
 
 <histogram name="Mojo.Channel.WriteMessageSize" units="bytes"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>amistry@chromium.org</owner>
   <owner>bgeffon@chromium.org</owner>
   <owner>rockot@google.com</owner>
@@ -6166,7 +6166,7 @@
 </histogram>
 
 <histogram name="Mojo.Channel.WriteReceiveMessageProcessType"
-    enum="ShortProcessType" expires_after="2025-09-05">
+    enum="ShortProcessType" expires_after="2025-11-09">
   <owner>amanvr@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
   <summary>
@@ -6240,7 +6240,7 @@
 </histogram>
 
 <histogram name="Mojo.SharedMemoryVersion.SharedMemoryAllocationSucceeded"
-    enum="Boolean" expires_after="2025-09-10">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>olivierli@chromium.org</owner>
   <owner>joenotcharles@google.com</owner>
   <summary>
@@ -7051,7 +7051,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AsyncInitialization.Time" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -7963,7 +7963,7 @@
 </histogram>
 
 <histogram name="ReadingList.AddOrReplaceEntry" enum="ReadingListStorageState"
-    expires_after="2025-06-29">
+    expires_after="2025-11-09">
   <owner>mastiz@chromium.org</owner>
   <owner>mmrashad@google.com</owner>
   <owner>treib@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index d91d2da..271c6d57 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -553,7 +553,7 @@
 
 <histogram
     name="PageLoad.Clients.Ads.AdPaintTiming.TopFrameNavigationToFirstAdFirstContentfulPaintAfter{Result}{AuctionType}Auction"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
   <summary>
@@ -718,7 +718,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.InteractiveTiming.NumInteractions.Subframe"
-    units="Count" expires_after="2025-09-07">
+    units="Count" expires_after="2025-11-09">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -822,7 +822,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -993,7 +993,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleHomepage.DomainLookupTiming.NavigationToDomainLookupEnd.{NavigationCountType}{BrowserInitializationStatus}"
-    units="ms" expires_after="2025-08-10">
+    units="ms" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1033,7 +1033,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleHomepage.NavigationTiming.NavigationToConnectStart.{NavigationCountType}{BrowserInitializationStatus}"
-    units="ms" expires_after="2025-08-10">
+    units="ms" expires_after="2025-11-09">
   <owner>suzukikeita@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1660,7 +1660,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.LCPP.PaintTiming.ActualLCPIndex2"
-    units="Index(1 origin)" expires_after="2025-06-22">
+    units="Index(1 origin)" expires_after="2025-12-22">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -1719,7 +1719,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.LCPP.PaintTiming.PredictHitIndex2"
-    units="Index(1 origin)" expires_after="2025-06-22">
+    units="Index(1 origin)" expires_after="2025-12-22">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3058,7 +3058,7 @@
 
 <histogram
     name="PageLoad.Experimental.NavigationTiming.NavigationStartToFinalResponseStart"
-    units="ms" expires_after="2025-08-31">
+    units="ms" expires_after="2025-11-09">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -3106,7 +3106,7 @@
 
 <histogram
     name="PageLoad.Experimental.NavigationTiming.NavigationStartToNavigationCommitSent"
-    units="ms" expires_after="2025-08-31">
+    units="ms" expires_after="2025-11-09">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -3469,7 +3469,7 @@
 </histogram>
 
 <histogram name="PageLoad.InteractiveTiming.ProcessingTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -4158,7 +4158,7 @@
 
 <histogram
     name="PageLoad.PaintTiming.NavigationToFirstContentfulPaint.{Scheme}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index e3ac925..0b60992 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -372,7 +372,7 @@
 </histogram>
 
 <histogram name="PasswordGeneration.EditsInGeneratedPassword.{CharacterClass}"
-    enum="CharacterClassPresenceChange" expires_after="2025-09-07">
+    enum="CharacterClassPresenceChange" expires_after="2025-11-09">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -529,7 +529,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AccessPasswordInSettings"
-    enum="AccessPasswordInSettingsEvent" expires_after="2025-09-07">
+    enum="AccessPasswordInSettingsEvent" expires_after="2025-11-09">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -795,7 +795,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchTime.{Status}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -810,7 +810,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.ResponseSize.{Status}"
-    units="bytes" expires_after="2025-09-07">
+    units="bytes" expires_after="2025-11-09">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -891,7 +891,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AuthenticationAsyncOpFailureReson"
-    enum="Hresult" expires_after="2025-09-07">
+    enum="Hresult" expires_after="2025-11-09">
   <owner>sygiet@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -967,7 +967,7 @@
 
 <histogram
     name="PasswordManager.BiometricAuthPwdFillAndroid.CanAuthenticateWithBiometricOrScreenLock"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>ioanap@chromium.org</owner>
   <owner>atsvirchkova@google.com</owner>
   <summary>
@@ -1176,7 +1176,7 @@
 </histogram>
 
 <histogram name="PasswordManager.CctFormSubmissionToActivityStopTime"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1188,7 +1188,7 @@
 </histogram>
 
 <histogram name="PasswordManager.CctFormSubmissionToRedirectTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1249,7 +1249,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ClassificationCorrectness.CurrentPassword"
-    enum="PasswordManagerClassificationCorrectness" expires_after="2025-09-07">
+    enum="PasswordManagerClassificationCorrectness" expires_after="2025-11-09">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@google.com</owner>
   <summary>
@@ -2611,7 +2611,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordAccessLossWarningDialog.Shown"
-    enum="PasswordAccessLossWarningType" expires_after="2025-09-07">
+    enum="PasswordAccessLossWarningType" expires_after="2025-11-09">
   <owner>izuzic@google.com</owner>
   <owner>atsvirchkova@google.com</owner>
   <summary>
@@ -3203,7 +3203,7 @@
 
 <histogram name="PasswordManager.PasswordSharingDesktop.UserAction"
     enum="PasswordManager.PasswordSharingDesktopActions"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>natiahlyi@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <owner>rgod@google.com</owner>
@@ -3834,7 +3834,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ReuseCheck.CheckedPasswords" units="passwords"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4397,7 +4397,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.MigrationForLocalUsers.AddLoginCount"
-    units="passwords" expires_after="2025-06-22">
+    units="passwords" expires_after="2025-08-22">
   <owner>vsemeniuk@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>atsvirchkova@google.com</owner>
@@ -4410,7 +4410,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.MigrationForLocalUsers.AndroidBackend.{MigrationOperation}.APIError"
-    enum="PasswordStoreAndroidBackendAPIError" expires_after="2025-09-07">
+    enum="PasswordStoreAndroidBackendAPIError" expires_after="2025-11-09">
   <owner>vsemeniuk@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -4437,7 +4437,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.MigrationForLocalUsers.MergeWhereAndroidHasMostRecent"
-    units="passwords" expires_after="2025-06-22">
+    units="passwords" expires_after="2025-08-22">
   <owner>atsvirchkova@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -4458,7 +4458,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.MigrationForLocalUsers.MigratedLoginsTotalCount"
-    units="passwords" expires_after="2025-06-22">
+    units="passwords" expires_after="2025-08-22">
   <owner>vsemeniuk@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>atsvirchkova@google.com</owner>
@@ -4495,7 +4495,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.MigrationForLocalUsers.UpdateLoginCount"
-    units="passwords" expires_after="2025-06-22">
+    units="passwords" expires_after="2025-08-22">
   <owner>vsemeniuk@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>atsvirchkova@google.com</owner>
@@ -4774,7 +4774,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Scope}LoginData.RemovalStatus"
-    enum="BooleanSuccess" expires_after="2025-09-07">
+    enum="BooleanSuccess" expires_after="2025-11-09">
   <owner>izuzic@google.com</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -4848,7 +4848,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Store}PasswordLossPotentialReasonBitmask"
-    units="bitmask" expires_after="2025-09-07">
+    units="bitmask" expires_after="2025-11-09">
   <owner>izuzic@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <owner>battre@chromium.org</owner>
@@ -4985,7 +4985,7 @@
 </histogram>
 
 <histogram name="PasswordProtection.CSDCacheContainsDebuggingMetadata"
-    enum="BooleanPresent" expires_after="2025-09-07">
+    enum="BooleanPresent" expires_after="2025-11-09">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/performance_controls/histograms.xml b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
index dee12b2..32bc29d 100644
--- a/tools/metrics/histograms/metadata/performance_controls/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
@@ -54,7 +54,7 @@
 
 <histogram
     name="PerformanceControls.Intervention.BackgroundTab.{ResourceType}.BubbleAction"
-    enum="InterventionBubbleActionType" expires_after="2025-09-07">
+    enum="InterventionBubbleActionType" expires_after="2025-11-09">
   <owner>stluong@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
@@ -76,7 +76,7 @@
 
 <histogram
     name="PerformanceControls.Intervention.BackgroundTab.{ResourceType}.HealthStatusAfterDiscard.{Time}"
-    enum="PerformanceDetectionManagerHealthLevel" expires_after="2025-09-07">
+    enum="PerformanceDetectionManagerHealthLevel" expires_after="2025-11-09">
   <owner>stluong@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
@@ -140,7 +140,7 @@
 
 <histogram
     name="PerformanceControls.Intervention.BackgroundTab.{ResourceType}.MessageShownCount"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>stluong@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
@@ -161,7 +161,7 @@
 
 <histogram
     name="PerformanceControls.Intervention.BackgroundTab.{ResourceType}.MessageTriggerResult"
-    enum="InterventionMessageTriggerResult" expires_after="2025-09-07">
+    enum="InterventionMessageTriggerResult" expires_after="2025-11-09">
   <owner>stluong@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
@@ -184,7 +184,7 @@
 
 <histogram
     name="PerformanceControls.Intervention.BackgroundTab.{ResourceType}.RateLimitedCount"
-    units="count" expires_after="2025-08-31">
+    units="count" expires_after="2025-11-09">
   <owner>stluong@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index a2f0c77..43e873a 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -250,7 +250,7 @@
 </histogram>
 
 <histogram name="BrowserDialogs.ExternalProtocol.Scheme"
-    enum="ExternalProtocolScheme" expires_after="2025-09-07">
+    enum="ExternalProtocolScheme" expires_after="2025-11-09">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -546,7 +546,7 @@
 </histogram>
 
 <histogram name="Permissions.ConfirmationChip.PageInfoDialogAccessType"
-    enum="PageInfoDialogAccessType" expires_after="2025-09-07">
+    enum="PageInfoDialogAccessType" expires_after="2025-11-09">
   <owner>fjacky@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -845,7 +845,7 @@
 
 <histogram
     name="Permissions.OnDevicePredictionService.Response.{PermissionType}"
-    enum="BooleanIgnored" expires_after="2025-09-07">
+    enum="BooleanIgnored" expires_after="2025-11-09">
   <owner>ravjit@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -868,7 +868,7 @@
 </histogram>
 
 <histogram name="Permissions.OneTimePermission.{PermissionType}.Event"
-    enum="OneTimePermissionEvent" expires_after="2025-09-07">
+    enum="OneTimePermissionEvent" expires_after="2025-11-09">
   <owner>fjacky@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -893,7 +893,7 @@
 
 <histogram
     name="Permissions.PageInfo.Changed.{PermissionType}.Reallowed.Outcome"
-    enum="PermissionChangeInfo" expires_after="2025-07-13">
+    enum="PermissionChangeInfo" expires_after="2025-11-09">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1454,7 +1454,7 @@
 
 <histogram
     name="Permissions.Prompt.{PermissionType}.{Disposition}.IgnoredReason"
-    enum="PermissionRequestIgnoredReason" expires_after="2025-09-05">
+    enum="PermissionRequestIgnoredReason" expires_after="2025-11-09">
   <owner>fjacky@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1573,7 +1573,7 @@
 </histogram>
 
 <histogram name="Permissions.Query.QueryResponseTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pbirk@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -1700,7 +1700,7 @@
 </histogram>
 
 <histogram name="Permissions.Revocation.Notifications.SourceUI"
-    enum="PermissionSourceUI" expires_after="2025-09-07">
+    enum="PermissionSourceUI" expires_after="2025-11-09">
   <owner>engedy@chromium.org</owner>
   <owner>willxu@google.com</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
@@ -1831,7 +1831,7 @@
 </histogram>
 
 <histogram name="SiteEngagementService.EngagementType"
-    enum="SiteEngagementServiceEngagementType" expires_after="2025-09-07">
+    enum="SiteEngagementServiceEngagementType" expires_after="2025-11-09">
   <owner>calamity@chromium.org</owner>
   <owner>dominickn@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 0fd09e8..3d7a393 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -821,7 +821,7 @@
 </histogram>
 
 <histogram name="Platform.FbPreprocessor.Pseudonymization.DumpType"
-    enum="Platform.FbPreprocessor.FirmwareType" expires_after="2025-09-07">
+    enum="Platform.FbPreprocessor.FirmwareType" expires_after="2025-11-09">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -833,7 +833,7 @@
 
 <histogram name="Platform.FbPreprocessor.{FirmwareType}.Collection.Allowed"
     enum="Platform.FbPreprocessor.CollectionAllowedStatus"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -845,7 +845,7 @@
 </histogram>
 
 <histogram name="Platform.FbPreprocessor.{FirmwareType}.Output.Number"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -859,7 +859,7 @@
 <histogram
     name="Platform.FbPreprocessor.{FirmwareType}.Pseudonymization.Result"
     enum="Platform.FbPreprocessor.PseudonymizationResult"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1923,7 +1923,7 @@
 </histogram>
 
 <histogram name="Platform.Modemfwd.DlcUninstallResult"
-    enum="ModemfwdDlcUninstallResult" expires_after="2025-09-01">
+    enum="ModemfwdDlcUninstallResult" expires_after="2025-11-09">
   <owner>andrewlassalle@google.com</owner>
   <owner>ujjwalpande@google.com</owner>
   <summary>
@@ -1954,7 +1954,7 @@
 </histogram>
 
 <histogram name="Platform.Modemfwd.FWUpdateLocation"
-    enum="ModemfwdFWUpdateLocation" expires_after="2025-07-13">
+    enum="ModemfwdFWUpdateLocation" expires_after="2025-11-09">
   <owner>andrewlassalle@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index b2db176c..3b41b8e 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -1184,7 +1184,7 @@
 </histogram>
 
 <histogram name="Power.DisplayAfterResumeDurationMs{PowerSource}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mhiramat@google.com</owner>
   <owner>cros-suspend-resume@google.com</owner>
   <summary>
@@ -1731,7 +1731,7 @@
 </histogram>
 
 <histogram name="Power.PowerSupplyType" enum="PowerSupplyType"
-    expires_after="2025-08-24">
+    expires_after="2025-11-09">
   <owner>bleung@chromium.org</owner>
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/prefetch/histograms.xml b/tools/metrics/histograms/metadata/prefetch/histograms.xml
index c706b40..6489bc9 100644
--- a/tools/metrics/histograms/metadata/prefetch/histograms.xml
+++ b/tools/metrics/histograms/metadata/prefetch/histograms.xml
@@ -278,7 +278,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.AfterClick.RedirectChainSize" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>kenoss@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
@@ -317,7 +317,7 @@
 
 <histogram
     name="PrefetchProxy.CanaryChecker.CacheLookupResult.{PrefetchProxyCanaryCheckerClient}"
-    enum="CanaryCheckLookupResult" expires_after="2025-09-07">
+    enum="CanaryCheckLookupResult" expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -335,7 +335,7 @@
 
 <histogram
     name="PrefetchProxy.CanaryChecker.FinalState.{PrefetchProxyCanaryCheckerClient}"
-    enum="BooleanSuccess" expires_after="2025-09-07">
+    enum="BooleanSuccess" expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -352,7 +352,7 @@
 
 <histogram
     name="PrefetchProxy.CanaryChecker.NetError.{PrefetchProxyCanaryCheckerClient}"
-    enum="NetErrorCodes" expires_after="2025-09-07">
+    enum="NetErrorCodes" expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -389,7 +389,7 @@
 
 <histogram
     name="PrefetchProxy.CanaryChecker.TimeUntilFailure.{PrefetchProxyCanaryCheckerClient}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -405,7 +405,7 @@
 
 <histogram
     name="PrefetchProxy.CanaryChecker.TimeUntilSuccess.{PrefetchProxyCanaryCheckerClient}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -431,7 +431,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.BodyLength" units="bytes"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>kenoss@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
@@ -446,7 +446,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.ConnectTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -469,7 +469,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.NetError"
-    enum="NetErrorCodes" expires_after="2025-09-07">
+    enum="NetErrorCodes" expires_after="2025-11-09">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index a01ecf7..7954e587 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -206,7 +206,7 @@
 </histogram>
 
 <histogram name="Privacy.ClearBrowsingData.TabsEnabled" enum="BooleanEnabled"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>zalmashni@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
   <summary>
@@ -560,7 +560,7 @@
 </histogram>
 
 <histogram name="Privacy.DIPS.DIPSErrorCodes" enum="DIPSErrorCode"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>liu@chromium.org</owner>
   <owner>src/content/browser/btm/OWNERS</owner>
   <summary>
@@ -654,7 +654,7 @@
 </histogram>
 
 <histogram name="Privacy.QuickDelete.TabsEnabled" enum="BooleanEnabled"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>zalmashni@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml
index c22b1a8..d378f89 100644
--- a/tools/metrics/histograms/metadata/profile/histograms.xml
+++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -679,7 +679,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.FirstProfileTime.FirstWebContentsNonEmptyPaint"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -696,7 +696,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.FirstRun.DefaultBrowser"
-    enum="FirstRunDefaultBrowserChoice" expires_after="2025-09-07">
+    enum="FirstRunDefaultBrowserChoice" expires_after="2025-11-09">
   <owner>dgn@chromium.org</owner>
   <owner>for-you-fre@google.com</owner>
   <summary>
@@ -717,7 +717,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.FirstRun.FinishReason"
-    enum="FirstRunFinishReason" expires_after="2025-09-07">
+    enum="FirstRunFinishReason" expires_after="2025-11-09">
   <owner>dgn@chromium.org</owner>
   <owner>for-you-fre@google.com</owner>
   <summary>
@@ -741,7 +741,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.FirstRun.PolicyStoreState"
-    enum="FirstRunCloudPolicyStoreState" expires_after="2025-09-07">
+    enum="FirstRunCloudPolicyStoreState" expires_after="2025-11-09">
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -754,7 +754,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.FirstRun.ServiceCreated" enum="BooleanCreated"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>dgn@chromium.org</owner>
   <owner>for-you-fre@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml
index e4f3b74..191ef85 100644
--- a/tools/metrics/histograms/metadata/renderer/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -141,7 +141,7 @@
 </histogram>
 
 <histogram name="Renderer.CriticalFonts.CriticalFontDelay" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -154,7 +154,7 @@
 </histogram>
 
 <histogram name="Renderer.CriticalFonts.PreloadedFontsLoadTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -554,7 +554,7 @@
 </histogram>
 
 <histogram name="Renderer.RenderThreadImpl.Init" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jam@chromium.org</owner>
   <owner>sky@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index e1ef3d2..9f5f6c74 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -413,7 +413,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.BrowserThrottle.TotalDelay2{ResponseType}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -450,7 +450,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.CheckBrowseUrl.HasLocalMatch2"
-    enum="BooleanMatched" expires_after="2025-09-07">
+    enum="BooleanMatched" expires_after="2025-11-09">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -710,7 +710,7 @@
 
 <histogram
     name="SafeBrowsing.Daily.BypassCountLast28Days.{UserState}.AllEvents"
-    units="events" expires_after="2025-09-07">
+    units="events" expires_after="2025-11-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1708,7 +1708,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.FoundUnmatchedFullHashes"
-    enum="BooleanFound" expires_after="2025-09-07">
+    enum="BooleanFound" expires_after="2025-11-09">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1730,7 +1730,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.HashDatabaseFallbackThreatType{TriggerType}"
-    enum="SBThreatType" expires_after="2025-09-07">
+    enum="SBThreatType" expires_after="2025-11-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2112,7 +2112,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.NavigationObserver.RedirectForTelScheme"
-    enum="BooleanAccepted" expires_after="2025-09-07">
+    enum="BooleanAccepted" expires_after="2025-11-09">
   <owner>nwokedi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2623,7 +2623,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.HashDatabaseFallbackThreatType{TriggerType}"
-    enum="SBThreatType" expires_after="2025-09-07">
+    enum="SBThreatType" expires_after="2025-11-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3286,7 +3286,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4Database.SizeLinear{ThreatTypeKB}"
-    units="100 KB" expires_after="2025-09-07">
+    units="100 KB" expires_after="2025-11-09">
   <owner>kristianm@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index 5e15778..5dbf4bcc 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -1078,7 +1078,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.VisualFeaturesClearReason"
-    enum="CanExtractVisualFeaturesResult" expires_after="2025-09-07">
+    enum="CanExtractVisualFeaturesResult" expires_after="2025-11-09">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/scanning/histograms.xml b/tools/metrics/histograms/metadata/scanning/histograms.xml
index 8b76bf8d..932c6c5 100644
--- a/tools/metrics/histograms/metadata/scanning/histograms.xml
+++ b/tools/metrics/histograms/metadata/scanning/histograms.xml
@@ -34,7 +34,7 @@
 </histogram>
 
 <histogram name="Scanning.DiscoverySession.MaxInterval" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/scheduler/histograms.xml b/tools/metrics/histograms/metadata/scheduler/histograms.xml
index 8f61fb74..6a98f017 100644
--- a/tools/metrics/histograms/metadata/scheduler/histograms.xml
+++ b/tools/metrics/histograms/metadata/scheduler/histograms.xml
@@ -144,7 +144,7 @@
 </histogram>
 
 <histogram name="Scheduling.SchedQoS.SetProcessStateError" enum="QoSErrorType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kawasin@google.com</owner>
   <owner>joelaf@google.com</owner>
   <summary>
@@ -154,7 +154,7 @@
 </histogram>
 
 <histogram name="Scheduling.SchedQoS.SetThreadStateError" enum="QoSErrorType"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kawasin@google.com</owner>
   <owner>joelaf@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml
index 62498cb..1c2c4ca1 100644
--- a/tools/metrics/histograms/metadata/search/histograms.xml
+++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -122,7 +122,7 @@
 </histogram>
 
 <histogram name="Search.AuxiliarySearch.DonateTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>gangwu@chromium.org</owner>
   <owner>chrome-mobile-search@google.com</owner>
   <summary>Time taken for donating contents to the auxiliary search.</summary>
@@ -1446,7 +1446,7 @@
 </histogram>
 
 <histogram name="Search.SearchEngineCountryDelegate.Connection{Result}Time"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>triploblastic@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <summary>
@@ -1465,7 +1465,7 @@
 </histogram>
 
 <histogram name="Search.SearchEngineCountryDelegate.Fetch{Result}Time"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>triploblastic@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <summary>
@@ -1485,7 +1485,7 @@
 </histogram>
 
 <histogram name="Search.SearchEngineCountryDelegate.ServiceBindStatus"
-    enum="BooleanStartedCompleted" expires_after="2025-09-07">
+    enum="BooleanStartedCompleted" expires_after="2025-11-09">
   <owner>triploblastic@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index 5962708..5062e4f 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -141,7 +141,7 @@
 </histogram>
 
 <histogram name="Security.DataDecoder.Json.DecodingTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>djmitche@chromium.org</owner>
   <owner>dadrian@chromium.org</owner>
   <summary>
@@ -889,7 +889,7 @@
 </histogram>
 
 <histogram name="SiteIsolation.BrowsingInstance.MaxCountPerProcess"
-    units="units" expires_after="2025-09-07">
+    units="units" expires_after="2025-11-09">
   <owner>wjmaclean@chromium.org</owner>
   <owner>creis@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sensitive_content/histograms.xml b/tools/metrics/histograms/metadata/sensitive_content/histograms.xml
index 33bbda4..58c8036 100644
--- a/tools/metrics/histograms/metadata/sensitive_content/histograms.xml
+++ b/tools/metrics/histograms/metadata/sensitive_content/histograms.xml
@@ -64,7 +64,7 @@
 </histogram>
 
 <histogram name="SensitiveContent.{Embedder}.LatencyUntilSensitive" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jkeitel@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -78,7 +78,7 @@
 </histogram>
 
 <histogram name="SensitiveContent.{Embedder}.SensitiveTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>jkeitel@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -92,7 +92,7 @@
 </histogram>
 
 <histogram name="SensitiveContent.{Embedder}.SensitivityChanged"
-    enum="ContentSensitivity" expires_after="2025-09-07">
+    enum="ContentSensitivity" expires_after="2025-11-09">
   <owner>jkeitel@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index e178b8f8..78519c5 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -160,7 +160,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.ActivateEvent.Time2" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
@@ -1912,7 +1912,7 @@
 
 <histogram
     name="ServiceWorkerCache.Cache.{ServiceWorkerCacheProcessType}.{ProcessOps}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index 02f9b0e..1dccf35 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -885,7 +885,7 @@
 </histogram>
 
 <histogram name="Session.TotalDurationMax1Day.{HistorySyncState}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mastiz@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -929,7 +929,7 @@
 </histogram>
 
 <histogram name="Session.TotalDurationMax1Day.{MsbbState}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>mastiz@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>treib@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/settings/enums.xml b/tools/metrics/histograms/metadata/settings/enums.xml
index 3c1e4a5..0fd5590a 100644
--- a/tools/metrics/histograms/metadata/settings/enums.xml
+++ b/tools/metrics/histograms/metadata/settings/enums.xml
@@ -131,11 +131,14 @@
   <int value="2" label="Content setting not site scoped"/>
   <int value="3" label="Managed content setting"/>
   <int value="4" label="Site already in the proposed revoke list"/>
-  <int value="5" label="False positive"/>
+  <int value="5"
+      label="(Obsolete) False positive (now reported as not disruptive)"/>
   <int value="6" label="Site not disruptive"/>
   <int value="7" label="Proposed revoke"/>
   <int value="8" label="Notification not revoked because of default block"/>
-  <int value="9" label="Previously marked as false positive"/>
+  <int value="9"
+      label="(Obsolete) Previously marked as false positive (now reported as
+             not disruptive)"/>
   <int value="10" label="Revoke"/>
   <int value="11" label="Ignore"/>
 </enum>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index a07cfc1..3569d45 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -715,7 +715,7 @@
 
 <histogram name="Settings.SafetyCheck.UnusedSitePermissionsModuleInteractions"
     enum="SafetyCheckUnusedSitePermissionsModuleInteractions"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index 3da53ab..75076ed 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -367,7 +367,7 @@
 </histogram>
 
 <histogram name="Sharing.SharingHubAndroid.CustomAction"
-    enum="ShareCustomAction" expires_after="2025-09-07">
+    enum="ShareCustomAction" expires_after="2025-11-09">
   <owner>wenyufu@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -399,7 +399,7 @@
 </histogram>
 
 <histogram name="Sharing.SharingHubAndroid.TimeToCustomAction" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wenyufu@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index 8efda94c..83134cf 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -358,7 +358,7 @@
 </histogram>
 
 <histogram name="Signin.AccountInPref.State" enum="AccountInPrefState"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rsult@google.com</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1493,7 +1493,7 @@
 </histogram>
 
 <histogram name="Signin.HistorySyncOptIn.{OptInFlowEvent}"
-    enum="SigninAccessPoint" expires_after="2025-09-07">
+    enum="SigninAccessPoint" expires_after="2025-11-09">
   <owner>myuu@google.com</owner>
   <owner>bsazonov@chromium.org</owner>
   <owner>jlebel@chromium.org</owner>
@@ -1581,7 +1581,7 @@
 </histogram>
 
 <histogram name="Signin.Intercept.ChromeSignin.NumberOfDaysSinceLastDecline"
-    units="Days" expires_after="2025-09-07">
+    units="Days" expires_after="2025-11-09">
   <owner>rsult@google.com</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -1593,7 +1593,7 @@
 </histogram>
 
 <histogram name="Signin.Intercept.ChromeSignin.RepromptCount" units="reprompts"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rsult@google.com</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -1648,7 +1648,7 @@
 </histogram>
 
 <histogram name="Signin.Intercept.Heuristic.SupervisionState.{InterceptType}"
-    enum="SinginInterceptSupervisionState" expires_after="2025-09-07">
+    enum="SinginInterceptSupervisionState" expires_after="2025-11-09">
   <owner>anthie@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2303,7 +2303,7 @@
 </histogram>
 
 <histogram name="Signin.PAMInitialize.PrimaryAccountInfoState"
-    enum="PAMInitializePrimaryAccountInfoState" expires_after="2025-08-24">
+    enum="PAMInitializePrimaryAccountInfoState" expires_after="2025-11-09">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2618,7 +2618,7 @@
 </histogram>
 
 <histogram name="Signin.SignIn.Offered{AccountState}" enum="SigninAccessPoint"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2777,7 +2777,7 @@
 </histogram>
 
 <histogram name="Signin.SignInPromo.{UserAction}" enum="SigninAccessPoint"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>amelies@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/stability/histograms.xml b/tools/metrics/histograms/metadata/stability/histograms.xml
index d7251cc..ba109f10 100644
--- a/tools/metrics/histograms/metadata/stability/histograms.xml
+++ b/tools/metrics/histograms/metadata/stability/histograms.xml
@@ -547,7 +547,7 @@
 </histogram>
 
 <histogram name="Stability.iOS.UTE.DeviceThermalState"
-    enum="IOSDeviceThermalState" expires_after="2025-07-27">
+    enum="IOSDeviceThermalState" expires_after="2025-11-09">
   <owner>michaeldo@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index 111eaa3..8bc126ac 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -325,7 +325,7 @@
 </histogram>
 
 <histogram name="IndexedDB.CalculateBlockingStatusLongTimes" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -336,7 +336,7 @@
 </histogram>
 
 <histogram name="IndexedDB.CalculateBlockingStatusRequestQueueSize"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -370,7 +370,7 @@
 </histogram>
 
 <histogram name="IndexedDB.GetUnacquirableLocksRequestQueueSize" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -455,7 +455,7 @@
 </histogram>
 
 <histogram name="IndexedDB.LockRequestCancelledLongTimes" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -466,7 +466,7 @@
 </histogram>
 
 <histogram name="IndexedDB.LockRequestCancelledRequestQueueSize" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -493,7 +493,7 @@
 </histogram>
 
 <histogram name="IndexedDB.RemoveTransactionConnectionTxnCount" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -504,7 +504,7 @@
 </histogram>
 
 <histogram name="IndexedDB.RemoveTransactionLongTimes" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -515,7 +515,7 @@
 </histogram>
 
 <histogram name="IndexedDB.RemoveTransactionRequestQueueSize" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml
index 7fdec0f..311b74b 100644
--- a/tools/metrics/histograms/metadata/sync/enums.xml
+++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -152,11 +152,6 @@
   <int value="1" label="First sync"/>
 </enum>
 
-<enum name="BooleanIsSignedIn">
-  <int value="0" label="Not signed in"/>
-  <int value="1" label="Signed in"/>
-</enum>
-
 <!-- LINT.IfChange(CrossUserSharingDecryptionResult) -->
 
 <enum name="CrossUserSharingDecryptionResult">
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index bdebffb..5174458 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -351,7 +351,7 @@
 </histogram>
 
 <histogram name="Sync.BookmarkGUIDSource2" enum="BookmarkGUIDSource"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rushans@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -547,7 +547,7 @@
 </histogram>
 
 <histogram name="Sync.ClearMetadataWhileStopped{ClearTime}"
-    enum="SyncDataTypes" expires_after="2025-06-22">
+    enum="SyncDataTypes" expires_after="2026-05-13">
   <owner>ankushkush@google.com</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -914,7 +914,7 @@
 </histogram>
 
 <histogram name="Sync.DataTypeCount{SyncDataType}" units="entries"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rushans@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -926,7 +926,7 @@
 </histogram>
 
 <histogram name="Sync.DataTypeEntityChange{SyncDataType}"
-    enum="SyncEntityChange" expires_after="2025-09-07">
+    enum="SyncEntityChange" expires_after="2025-11-09">
   <owner>treib@chromium.org</owner>
   <owner>rushans@google.com</owner>
   <summary>
@@ -1349,7 +1349,7 @@
 </histogram>
 
 <histogram name="Sync.IdentityErrorCard{SyncErrorReason}"
-    enum="SyncErrorUiAction" expires_after="2025-09-07">
+    enum="SyncErrorUiAction" expires_after="2025-11-09">
   <owner>ankushkush@google.com</owner>
   <owner>src/components/sync/OWNERS</owner>
   <summary>
@@ -1365,7 +1365,7 @@
 </histogram>
 
 <histogram name="Sync.IdentityErrorMessage{SyncErrorReason}"
-    enum="SyncErrorUiAction" expires_after="2025-09-07">
+    enum="SyncErrorUiAction" expires_after="2025-11-09">
   <owner>ankushkush@google.com</owner>
   <owner>src/components/sync/OWNERS</owner>
   <summary>
@@ -1522,7 +1522,7 @@
 
 <histogram
     name="Sync.NonReflectionUpdateFreshnessPossiblySkewed2{SyncDataType}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -2023,30 +2023,6 @@
   </summary>
 </histogram>
 
-<histogram name="Sync.Startup.AccountInfoFullyLoaded2" enum="BooleanLoaded"
-    expires_after="2025-09-28">
-  <owner>mastiz@chromium.org</owner>
-  <owner>rushans@google.com</owner>
-  <owner>treib@chromium.org</owner>
-  <summary>
-    Records whether refresh tokens were already fully loaded during SyncService
-    initialization (i.e. during browser/profile startup).
-  </summary>
-</histogram>
-
-<histogram name="Sync.Startup.SignedInWithoutAccountInfo2"
-    enum="BooleanIsSignedIn" expires_after="2025-05-15">
-  <owner>mastiz@chromium.org</owner>
-  <owner>rushans@google.com</owner>
-  <owner>treib@chromium.org</owner>
-  <summary>
-    Records whether there was a signed-in user during SyncService initialization
-    (i.e. during browser/profile startup), specifically in the case where the
-    account info was NOT fully loaded yet (see
-    Sync.Startup.AccountInfoFullyLoaded2).
-  </summary>
-</histogram>
-
 <histogram name="Sync.Startup.TimeDeferred2" units="ms"
     expires_after="2026-05-10">
   <owner>mastiz@chromium.org</owner>
@@ -2328,7 +2304,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultAddKeysAttemptIsSuccessful" enum="Boolean"
-    expires_after="2025-06-30">
+    expires_after="2025-11-09">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -2409,7 +2385,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultFetchedKeysCount" units="keys"
-    expires_after="2025-06-30">
+    expires_after="2025-11-09">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 660a42fb..8301b77 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -991,7 +991,7 @@
 </histogram>
 
 <histogram name="TabGroups.SelectedTabInTabGroup" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ckitagawa@chromium.org</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -1847,7 +1847,7 @@
 </histogram>
 
 <histogram name="Tabs.ArchivePass.DurationMs" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -1857,7 +1857,7 @@
 </histogram>
 
 <histogram name="Tabs.ArchiveSettings.ArchiveDuplicateTabsEnabled"
-    enum="Boolean" expires_after="2025-09-07">
+    enum="Boolean" expires_after="2025-11-09">
   <owner>bjfong@google.com</owner>
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
@@ -1884,7 +1884,7 @@
 </histogram>
 
 <histogram name="Tabs.ArchiveSettings.TimeDeltaPreference" units="days"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>Records when a user selects an archive time preference.</summary>
@@ -1904,7 +1904,7 @@
 </histogram>
 
 <histogram name="Tabs.CloseAllArchivedTabs.TabCount" units="tabs"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -1914,7 +1914,7 @@
 </histogram>
 
 <histogram name="Tabs.CloseArchivedTabsMenuItem.TabCount" units="tabs"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2028,7 +2028,7 @@
 </histogram>
 
 <histogram name="Tabs.GridTabSwitcher.ScrollToTabById.HasTab" enum="Boolean"
-    expires_after="2025-09-09">
+    expires_after="2025-11-09">
   <owner>ckitagawa@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>
@@ -2470,7 +2470,7 @@
 </histogram>
 
 <histogram name="Tabs.RestoreAllArchivedTabsMenuItem.TabCount" units="tabs"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2480,7 +2480,7 @@
 </histogram>
 
 <histogram name="Tabs.RestoreArchivedTabsMenuItem.TabCount" units="tabs"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2667,7 +2667,7 @@
 </histogram>
 
 <histogram name="Tabs.Startup.UniqueUrlCount.{TabModelSelectorType}"
-    units="count" expires_after="2025-09-07">
+    units="count" expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2688,7 +2688,7 @@
 </histogram>
 
 <histogram name="Tabs.TabArchived.TabCount" units="tabs"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2698,7 +2698,7 @@
 </histogram>
 
 <histogram name="Tabs.TabArchiveEligibilityCheck.AfterNDays" units="days"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2710,7 +2710,7 @@
 </histogram>
 
 <histogram name="Tabs.TabAutoDeleted.AfterNDays" units="days"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2720,7 +2720,7 @@
 </histogram>
 
 <histogram name="Tabs.TabAutoDeleteEligibilityCheck.AfterNDays" units="days"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2831,7 +2831,7 @@
 </histogram>
 
 <histogram name="Tabs.TabRestoreMethod" enum="TabRestoreMethod"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>davidjm@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <owner>nyquist@chromium.org</owner>
@@ -2911,7 +2911,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.CloseAction" enum="TabSearchCloseActions"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3031,7 +3031,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.PageHandlerConstructionDelay" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -3109,7 +3109,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.TimeToShow.{WarmUpLevel}" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>kerenzhu@chromium.org</owner>
   <owner>dayeung@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
@@ -3140,7 +3140,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.IndexOf{Action}In{State}List"
-    units="tabs" expires_after="2025-09-07">
+    units="tabs" expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -3164,7 +3164,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.LoadCompletedTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3175,7 +3175,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.LoadDocumentTime" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3185,7 +3185,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.RecentlyClosed{Item}OpenAction"
-    enum="TabSearchRecentlyClosedItemOpenAction" expires_after="2025-09-07">
+    enum="TabSearchRecentlyClosedItemOpenAction" expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>chrome-cros@chromium.org</owner>
   <summary>
@@ -3201,7 +3201,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WebUI.SearchAlgorithmDuration" units="ms"
-    expires_after="2025-07-08">
+    expires_after="2025-11-09">
   <owner>yuhengh@chromium.org</owner>
   <owner>chrome-cros@chromium.org</owner>
   <summary>
@@ -3273,7 +3273,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WindowDisplayedDuration3" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3296,7 +3296,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WindowTimeToShowCachedWebView2" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
@@ -3314,7 +3314,7 @@
 </histogram>
 
 <histogram name="Tabs.TabSearch.WindowTimeToShowUncachedWebView2" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/trusted_vault/histograms.xml b/tools/metrics/histograms/metadata/trusted_vault/histograms.xml
index 965056f..944820c 100644
--- a/tools/metrics/histograms/metadata/trusted_vault/histograms.xml
+++ b/tools/metrics/histograms/metadata/trusted_vault/histograms.xml
@@ -288,7 +288,7 @@
 </histogram>
 
 <histogram name="TrustedVault.SetEncryptionKeysForSecurityDomain{ProfileType}"
-    enum="SecurityDomainId" expires_after="2025-07-31">
+    enum="SecurityDomainId" expires_after="2025-11-09">
   <owner>mastiz@chromium.org</owner>
   <owner>martinkr@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ui/histograms.xml b/tools/metrics/histograms/metadata/ui/histograms.xml
index c065bc7..5f0c1046 100644
--- a/tools/metrics/histograms/metadata/ui/histograms.xml
+++ b/tools/metrics/histograms/metadata/ui/histograms.xml
@@ -447,7 +447,7 @@
 </histogram>
 
 <histogram name="Views.ColorProviderCacheSize" units="entries"
-    expires_after="2025-09-09">
+    expires_after="2025-11-09">
   <owner>tluk@chromium.org</owner>
   <owner>skau@chromium.org</owner>
   <summary>
@@ -460,7 +460,7 @@
 </histogram>
 
 <histogram name="Views.InvalidatesDuringLayout" units="count"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>dpranke@chromium.org</owner>
   <owner>elainechien@chromium.org</owner>
   <owner>kylixrd@chromium.org</owner>
@@ -502,7 +502,7 @@
 
 <histogram
     name="Views.{Process}.NumColorProvidersInitializedDuringOnNativeThemeUpdated"
-    units="providers" expires_after="2025-09-07">
+    units="providers" expires_after="2025-11-09">
   <owner>pkasting@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
   <owner>skau@chromium.org</owner>
@@ -519,7 +519,7 @@
 </histogram>
 
 <histogram name="Views.{Process}.TimeSpentInitializingColorProvider" units="ms"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>pkasting@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
   <owner>skau@chromium.org</owner>
@@ -536,7 +536,7 @@
 </histogram>
 
 <histogram name="Views.{Process}.TimeSpentProcessingOnNativeThemeUpdatedEvent"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>pkasting@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
   <owner>skau@chromium.org</owner>
@@ -567,7 +567,7 @@
 </histogram>
 
 <histogram name="WebUI.CreatedForUrl" enum="WebUIUrlHashes"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>dpapad@chromium.org</owner>
   <owner>chrome-webui@google.com</owner>
   <summary>URLs for which Chrome creates WebUIControllers.</summary>
diff --git a/tools/metrics/histograms/metadata/ukm/histograms.xml b/tools/metrics/histograms/metadata/ukm/histograms.xml
index 5dca0fc6..05b1504 100644
--- a/tools/metrics/histograms/metadata/ukm/histograms.xml
+++ b/tools/metrics/histograms/metadata/ukm/histograms.xml
@@ -35,7 +35,7 @@
 </histogram>
 
 <histogram name="UKM.BuildAndStoreLogIsEmpty" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -69,7 +69,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Dropped" enum="UkmDataDroppedReason"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -79,7 +79,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Dropped.ByEntryHash" enum="UkmEventNameHash"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -91,7 +91,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Dropped.MaxHit.ByEntryHash"
-    enum="UkmEventNameHash" expires_after="2025-09-07">
+    enum="UkmEventNameHash" expires_after="2025-11-09">
   <owner>lucnguyen@google.com</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -116,7 +116,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Dropped.SampledOut.ByEntryHash"
-    enum="UkmEventNameHash" expires_after="2025-09-07">
+    enum="UkmEventNameHash" expires_after="2025-11-09">
   <owner>lucnguyen@google.com</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Recorded.ByEntryHash" enum="UkmEventNameHash"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yrsun@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -140,14 +140,14 @@
 </histogram>
 
 <histogram name="UKM.Entries.SerializedCount2" units="entries"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>Number of serialized UKM entries when storing a UKM log.</summary>
 </histogram>
 
 <histogram name="UKM.Entries.SerializedCountFCP" units="entries"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -171,7 +171,7 @@
 </histogram>
 
 <histogram name="UKM.IOSLog.OnSuccess" units="records"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -188,7 +188,7 @@
   </summary>
 </histogram>
 
-<histogram name="UKM.LogSize.OnSuccess" units="KB" expires_after="2025-09-07">
+<histogram name="UKM.LogSize.OnSuccess" units="KB" expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -211,7 +211,7 @@
 </histogram>
 
 <histogram name="UKM.LogUpload.ResponseOrErrorCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-09-07">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -280,7 +280,7 @@
 </histogram>
 
 <histogram name="UKM.Sources.SerializedCount2{UkmSourceIdTypes}"
-    units="sources" expires_after="2025-09-07">
+    units="sources" expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -329,7 +329,7 @@
 </histogram>
 
 <histogram name="UKM.UnsentLogs.NumDropped" units="units"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -350,7 +350,7 @@
 </histogram>
 
 <histogram name="UKM.WebDXFeatureSets.SerializedCount" units="web feature sets"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>yrsun@chromium.org</owner>
   <owner>lucnguyen@google.com</owner>
   <owner>chrome-metrics-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index ef08b88d..4fb1799 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -152,7 +152,7 @@
 </histogram>
 
 <histogram name="V8.CompileLazyMicroSeconds" units="microseconds"
-    expires_after="2025-09-10">
+    expires_after="2025-11-09">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -282,7 +282,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds.NoCache.CacheTooCold"
-    units="microseconds" expires_after="2025-09-10">
+    units="microseconds" expires_after="2025-11-09">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -301,7 +301,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds.NoCache.InlineScript"
-    units="microseconds" expires_after="2025-09-10">
+    units="microseconds" expires_after="2025-11-09">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -320,7 +320,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds.NoCache.Other"
-    units="microseconds" expires_after="2025-09-10">
+    units="microseconds" expires_after="2025-11-09">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -339,7 +339,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds.NoCache.ScriptTooSmall"
-    units="microseconds" expires_after="2025-09-10">
+    units="microseconds" expires_after="2025-11-09">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -392,7 +392,7 @@
 </histogram>
 
 <histogram name="V8.CompileSerializeMicroSeconds" units="microseconds"
-    expires_after="2025-09-10">
+    expires_after="2025-11-09">
   <owner>jgruber@chromium.org</owner>
   <owner>leszeks@chromium.org</owner>
   <summary>
@@ -2587,7 +2587,7 @@
 </histogram>
 
 <histogram name="V8.WasmModuleNumberOfCodeGCsTriggered" units="gcs"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml
index d430b15..f7b70c0 100644
--- a/tools/metrics/histograms/metadata/variations/histograms.xml
+++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -557,7 +557,7 @@
 </histogram>
 
 <histogram name="Variations.SeedFileRead.{SeedFile}" enum="BooleanSuccess"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>caitlinfischer@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/visited_url_ranking/histograms.xml b/tools/metrics/histograms/metadata/visited_url_ranking/histograms.xml
index 47fd7cf..e71dc512 100644
--- a/tools/metrics/histograms/metadata/visited_url_ranking/histograms.xml
+++ b/tools/metrics/histograms/metadata/visited_url_ranking/histograms.xml
@@ -24,7 +24,7 @@
 <histograms>
 
 <histogram name="GroupSuggestionsService.OpenedTabCount.Last10Mins"
-    units="counts" expires_after="2025-08-22">
+    units="counts" expires_after="2025-11-09">
   <owner>ssid@chromium.org</owner>
   <owner>chrome-tab-group-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_core/histograms.xml b/tools/metrics/histograms/metadata/web_core/histograms.xml
index 5576001..5460c77c 100644
--- a/tools/metrics/histograms/metadata/web_core/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_core/histograms.xml
@@ -536,7 +536,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.Transaction.{TransactionType}.TimeActive2"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -565,7 +565,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.Transaction.{TransactionType}.TimeQueued"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -596,7 +596,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.TransactionAbortReason" enum="IDBException"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index c4668a34..528f01f 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -1106,7 +1106,7 @@
 </histogram>
 
 <histogram name="WebRTC.DesktopCapture.Win.DesktopCapturerImpl"
-    enum="WebRtcDesktopCapturerImpl" expires_after="2025-09-07">
+    enum="WebRtcDesktopCapturerImpl" expires_after="2025-11-09">
   <owner>alcooper@chromium.org</owner>
   <owner>henrika@chromium.org</owner>
   <owner>edgecapabilitiesdev@microsoft.com</owner>
@@ -1651,7 +1651,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.ValidBundledPayloadTypes" enum="Boolean"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>hbos@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <owner>phancke@microsoft.com</owner>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index c8ed10b..8d27a038 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -2014,7 +2014,7 @@
 </histogram>
 
 <histogram name="WebApp.ProtocolHandlers.Registration.Result"
-    enum="BooleanSuccess" expires_after="2025-09-10">
+    enum="BooleanSuccess" expires_after="2025-11-09">
   <owner>dibyapal@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -2065,7 +2065,7 @@
 </histogram>
 
 <histogram name="WebApp.RunOnOsLogin.Registration.Result" enum="BooleanSuccess"
-    expires_after="2025-09-07">
+    expires_after="2025-11-09">
   <owner>dibyapal@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webauthn/histograms.xml b/tools/metrics/histograms/metadata/webauthn/histograms.xml
index a220f982..d1c91bd 100644
--- a/tools/metrics/histograms/metadata/webauthn/histograms.xml
+++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -257,7 +257,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.CredentialFetchDuration.{ApiUsed}"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2025-11-09">
   <owner>kenrb@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
@@ -294,7 +294,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.EnclaveEvent"
-    enum="WebAuthenticationEnclaveEvent" expires_after="2025-09-07">
+    enum="WebAuthenticationEnclaveEvent" expires_after="2025-11-09">
   <owner>agl@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
@@ -450,7 +450,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.MakeCredential.Result"
-    enum="WebAuthenticationCredentialRequestResult" expires_after="2025-09-07">
+    enum="WebAuthenticationCredentialRequestResult" expires_after="2025-11-09">
   <owner>kenrb@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>Records the result of a make credential request.</summary>
@@ -561,7 +561,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.Windows.KeyCredentialCreation"
-    enum="WindowsKeyCredentialCreateResult" expires_after="2025-09-07">
+    enum="WindowsKeyCredentialCreateResult" expires_after="2025-11-09">
   <owner>kenrb@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
@@ -573,7 +573,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.Windows.KeyCredentialManagerSupported"
-    enum="WindowsKeyCredentialManagerSupportResults" expires_after="2025-07-06">
+    enum="WindowsKeyCredentialManagerSupportResults" expires_after="2025-11-09">
   <owner>kenrb@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index a6efafca..5b89eb0 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -15350,6 +15350,12 @@
       The last milestone before the navigation is abandoned.
     </summary>
   </metric>
+  <metric name="Net.ErrorCode" enum="NetErrorCodes">
+    <summary>
+      The `net::Error` code for this page load. Only logged for failed
+      provisional navigations (i.e. abandoned before commit).
+    </summary>
+  </metric>
   <metric name="PreviousBackgroundedTime">
     <summary>
       If we've experienced backgrounding while the navigation/page load is
diff --git a/ui/accessibility/platform/BUILD.gn b/ui/accessibility/platform/BUILD.gn
index 30440d1..349a50c 100644
--- a/ui/accessibility/platform/BUILD.gn
+++ b/ui/accessibility/platform/BUILD.gn
@@ -32,6 +32,7 @@
   defines = [ "IS_AX_PLATFORM_IMPL" ]
 
   visibility = [
+    "//chrome/browser/ui/webui/accessibility",
     "//ui/accessibility",
     "//ui/views:views",
   ]
diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceInput.java b/ui/android/java/src/org/chromium/ui/base/DeviceInput.java
index 3aa7602..bcd2251e 100644
--- a/ui/android/java/src/org/chromium/ui/base/DeviceInput.java
+++ b/ui/android/java/src/org/chromium/ui/base/DeviceInput.java
@@ -6,12 +6,14 @@
 
 import static android.view.InputDevice.KEYBOARD_TYPE_ALPHABETIC;
 import static android.view.InputDevice.SOURCE_MOUSE;
+import static android.view.InputDevice.SOURCE_TOUCHPAD;
 
 import android.content.Context;
 import android.hardware.input.InputManager;
 import android.hardware.input.InputManager.InputDeviceListener;
 import android.util.SparseArray;
 import android.view.InputDevice;
+import android.view.MotionEvent;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -128,6 +130,34 @@
         return false;
     }
 
+    /**
+     * @return the Touchpad MotionRange of AXIS_X for the provided {@param deviceId}, or null if the
+     *     device is not found or the device doesn't support touchpad source
+     */
+    public static InputDevice.@Nullable MotionRange getTouchpadXAxisMotionRange(int deviceId) {
+        ThreadUtils.assertOnUiThread();
+        DeviceSnapshot snapshot = getInstance().mDeviceSnapshotsById.get(deviceId);
+        if (snapshot != null) {
+            return snapshot.touchpadXAxisMotionRange;
+        }
+
+        return null;
+    }
+
+    /**
+     * @return the Touchpad MotionRange of AXIS_Y for the provided {@param deviceId}, or null if the
+     *     device is not found or the device doesn't support touchpad source
+     */
+    public static InputDevice.@Nullable MotionRange getTouchpadYAxisMotionRange(int deviceId) {
+        ThreadUtils.assertOnUiThread();
+        DeviceSnapshot snapshot = getInstance().mDeviceSnapshotsById.get(deviceId);
+        if (snapshot != null) {
+            return snapshot.touchpadYAxisMotionRange;
+        }
+
+        return null;
+    }
+
     @Override
     public void onInputDeviceAdded(int deviceId) {
         ThreadUtils.assertOnUiThread();
@@ -167,11 +197,22 @@
          */
         public final boolean supportsPrecisionPointer;
 
+        /** The MotionRange of AXIS_X for the Touchpad source */
+        public final InputDevice.MotionRange touchpadXAxisMotionRange;
+
+        /** The MotionRange of AXIS_Y for the Touchpad source */
+        public final InputDevice.MotionRange touchpadYAxisMotionRange;
+
         /** See {@link #from(InputDevice)}. */
         private DeviceSnapshot(
-                boolean supportsAlphabeticKeyboard, boolean supportsPrecisionPointer) {
+                boolean supportsAlphabeticKeyboard,
+                boolean supportsPrecisionPointer,
+                InputDevice.MotionRange touchpadXAxisMotionRange,
+                InputDevice.MotionRange touchpadYAxisMotionRange) {
             this.supportsAlphabeticKeyboard = supportsAlphabeticKeyboard;
             this.supportsPrecisionPointer = supportsPrecisionPointer;
+            this.touchpadXAxisMotionRange = touchpadXAxisMotionRange;
+            this.touchpadYAxisMotionRange = touchpadYAxisMotionRange;
         }
 
         /**
@@ -184,7 +225,9 @@
                             && device.getKeyboardType() == KEYBOARD_TYPE_ALPHABETIC,
                     // SOURCE_MOUSE applies to pointer devices, including mouse and touchpad
                     /* supportsPrecisionPointer= */ isPhysical
-                            && device.supportsSource(SOURCE_MOUSE));
+                            && device.supportsSource(SOURCE_MOUSE),
+                    device.getMotionRange(MotionEvent.AXIS_X, SOURCE_TOUCHPAD),
+                    device.getMotionRange(MotionEvent.AXIS_Y, SOURCE_TOUCHPAD));
         }
     }
 }
diff --git a/ui/android/java/src/org/chromium/ui/base/PointerLockEventHelper.java b/ui/android/java/src/org/chromium/ui/base/PointerLockEventHelper.java
index 03568d51..7604001 100644
--- a/ui/android/java/src/org/chromium/ui/base/PointerLockEventHelper.java
+++ b/ui/android/java/src/org/chromium/ui/base/PointerLockEventHelper.java
@@ -157,14 +157,20 @@
             return event;
         }
 
-        // TODO(https://crbug.com/415730915): Cache the input device resolution
-        InputDevice inputDevice = InputDevice.getDevice(event.getDeviceId());
         // Resolution is how many pixels per millimeters on the trackpad
         float xAxisResolution = 1;
         float yAxisResolution = 1;
-        if (inputDevice != null) {
-            xAxisResolution = inputDevice.getMotionRange(MotionEvent.AXIS_X).getResolution();
-            yAxisResolution = inputDevice.getMotionRange(MotionEvent.AXIS_Y).getResolution();
+
+        InputDevice.MotionRange xAxisMotionRange =
+                DeviceInput.getTouchpadXAxisMotionRange(event.getDeviceId());
+        InputDevice.MotionRange yAxisMotionRange =
+                DeviceInput.getTouchpadYAxisMotionRange(event.getDeviceId());
+
+        if (xAxisMotionRange != null) {
+            xAxisResolution = xAxisMotionRange.getResolution();
+        }
+        if (yAxisMotionRange != null) {
+            yAxisResolution = yAxisMotionRange.getResolution();
         }
 
         // TODO(https://crbug.com/415730929): inverse scrolling is not respected, doesn't seem that
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemProperties.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemProperties.java
index 5769580..49831722 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemProperties.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemProperties.java
@@ -29,7 +29,8 @@
     // TODO(crbug.com/40738791): Consider passing menu item title through TITLE property instead of
     // TITLE_ID.
     public static final WritableIntPropertyKey TITLE_ID = new WritableIntPropertyKey();
-    public static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>();
+    public static final WritableObjectPropertyKey<CharSequence> TITLE =
+            new WritableObjectPropertyKey<>();
     // A11y content description of menu item
     public static final WritableObjectPropertyKey<@Nullable String> CONTENT_DESCRIPTION =
             new WritableObjectPropertyKey<>();
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/MenuModelBridge.java b/ui/android/java/src/org/chromium/ui/listmenu/MenuModelBridge.java
index e03d274..d45e61e 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/MenuModelBridge.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/MenuModelBridge.java
@@ -4,13 +4,6 @@
 
 package org.chromium.ui.listmenu;
 
-import static org.chromium.ui.listmenu.BasicListMenu.ListMenuItemType.MENU_ITEM;
-import static org.chromium.ui.listmenu.BasicListMenu.buildMenuDivider;
-import static org.chromium.ui.listmenu.ListMenuItemProperties.CLICK_LISTENER;
-import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
-import static org.chromium.ui.listmenu.ListMenuItemProperties.START_ICON_BITMAP;
-import static org.chromium.ui.listmenu.ListMenuItemProperties.TITLE;
-
 import android.graphics.Bitmap;
 
 import org.jni_zero.CalledByNative;
@@ -19,6 +12,7 @@
 
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.contextmenu.ContextMenuCoordinator.ListItemType;
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -65,17 +59,41 @@
             final Runnable callback) {
         PropertyModel.Builder modelBuilder =
                 new PropertyModel.Builder(ListMenuItemProperties.ALL_KEYS)
-                        .with(TITLE, label)
-                        .with(START_ICON_BITMAP, bitmap)
-                        .with(ENABLED, isEnabled)
-                        .with(CLICK_LISTENER, (view) -> callback.run());
-        mItems.add(new ListItem(MENU_ITEM, modelBuilder.build()));
+                        .with(ListMenuItemProperties.TITLE, label)
+                        .with(ListMenuItemProperties.START_ICON_BITMAP, bitmap)
+                        .with(ListMenuItemProperties.ENABLED, isEnabled)
+                        .with(ListMenuItemProperties.CLICK_LISTENER, (view) -> callback.run());
+        mItems.add(new ListItem(ListItemType.CONTEXT_MENU_ITEM, modelBuilder.build()));
+    }
+
+    /**
+     * Adds a context menu item with a checkbox.
+     *
+     * @param label The label to display.
+     * @param isChecked Whether the checkbox is checked.
+     * @param isEnabled Whether the checkbox and label are enabled.
+     * @param callback The callback to run when the checkbox is clicked.
+     */
+    @CalledByNative
+    private void addCheck(
+            @JniType("std::u16string") final String label,
+            final boolean isChecked,
+            final boolean isEnabled,
+            final Runnable callback) {
+        PropertyModel.Builder modelBuilder =
+                new PropertyModel.Builder(ContextMenuCheckItemProperties.ALL_KEYS)
+                        .with(ContextMenuCheckItemProperties.TITLE, label)
+                        .with(ContextMenuCheckItemProperties.CHECKED, isChecked)
+                        .with(ContextMenuCheckItemProperties.ENABLED, isEnabled)
+                        .with(ContextMenuCheckItemProperties.ON_CLICK, callback);
+        mItems.add(
+                new ListItem(ListItemType.CONTEXT_MENU_ITEM_WITH_CHECKBOX, modelBuilder.build()));
     }
 
     /** Adds a divider to the context menu. */
     @CalledByNative
     private void addDivider() {
         // TODO(crbug.com/416222384): Update context menus to use incognito theming.
-        mItems.add(buildMenuDivider(/* isIncognito= */ false));
+        mItems.add(new ListItem(ContextMenuItemType.DIVIDER, new PropertyModel()));
     }
 }
diff --git a/ui/android/junit/src/org/chromium/ui/base/DeviceInputTest.java b/ui/android/junit/src/org/chromium/ui/base/DeviceInputTest.java
index e8e95c160..0d0277f 100644
--- a/ui/android/junit/src/org/chromium/ui/base/DeviceInputTest.java
+++ b/ui/android/junit/src/org/chromium/ui/base/DeviceInputTest.java
@@ -9,9 +9,11 @@
 import static android.view.InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC;
 import static android.view.InputDevice.SOURCE_KEYBOARD;
 import static android.view.InputDevice.SOURCE_MOUSE;
+import static android.view.InputDevice.SOURCE_TOUCHPAD;
 
 import android.util.SparseArray;
 import android.view.InputDevice;
+import android.view.MotionEvent;
 
 import androidx.test.filters.SmallTest;
 
@@ -28,11 +30,16 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 
+import java.util.ArrayList;
 import java.util.function.Consumer;
 
 /** Tests for {@link DeviceInput}. */
 @RunWith(BaseRobolectricTestRunner.class)
-@Config(shadows = {DeviceInputTest.ShadowInputDevice.class})
+@Config(
+        shadows = {
+            DeviceInputTest.ShadowInputDevice.class,
+            DeviceInputTest.ShadowInputDevice.ShadowMotionRange.class
+        })
 public class DeviceInputTest {
 
     @After
@@ -207,6 +214,54 @@
         Assert.assertTrue(DeviceInput.supportsPrecisionPointer());
     }
 
+    @Test
+    @SmallTest
+    public void testSupportsMotionRanges() {
+        int deviceId = 1;
+
+        ShadowInputDevice.attach(deviceId)
+                .setSources(SOURCE_TOUCHPAD)
+                .addMotionRange(MotionEvent.AXIS_X, SOURCE_TOUCHPAD, 5)
+                .addMotionRange(MotionEvent.AXIS_Y, SOURCE_TOUCHPAD, 10);
+
+        // Verify initial state.
+        Assert.assertEquals(
+                DeviceInput.getTouchpadXAxisMotionRange(deviceId).getResolution(), 5, 0.01);
+        Assert.assertEquals(
+                DeviceInput.getTouchpadYAxisMotionRange(deviceId).getResolution(), 10, 0.01);
+    }
+
+    @Test
+    @SmallTest
+    public void testSupportsMotionRangesWrongSource() {
+        int deviceId = 1;
+
+        ShadowInputDevice.attach(deviceId)
+                .setSources(SOURCE_TOUCHPAD)
+                .addMotionRange(MotionEvent.AXIS_X, SOURCE_MOUSE, 5)
+                .addMotionRange(MotionEvent.AXIS_Y, SOURCE_MOUSE, 10);
+
+        // Verify initial state.
+        Assert.assertNull(DeviceInput.getTouchpadXAxisMotionRange(deviceId));
+        Assert.assertNull(DeviceInput.getTouchpadYAxisMotionRange(deviceId));
+    }
+
+    @Test
+    @SmallTest
+    public void testSupportsMotionRangesWrongDeviceId() {
+        int deviceId = 1;
+        int nonExistentDeviceId = 2;
+
+        ShadowInputDevice.attach(deviceId)
+                .setSources(SOURCE_TOUCHPAD)
+                .addMotionRange(MotionEvent.AXIS_X, SOURCE_TOUCHPAD, 5)
+                .addMotionRange(MotionEvent.AXIS_Y, SOURCE_TOUCHPAD, 10);
+
+        // Verify initial state.
+        Assert.assertNull(DeviceInput.getTouchpadXAxisMotionRange(nonExistentDeviceId));
+        Assert.assertNull(DeviceInput.getTouchpadYAxisMotionRange(nonExistentDeviceId));
+    }
+
     @Implements(InputDevice.class)
     public static class ShadowInputDevice extends org.robolectric.shadows.ShadowInputDevice {
 
@@ -216,6 +271,7 @@
         private boolean mIsVirtual;
         private int mKeyboardType;
         private int mSources;
+        private final ArrayList<InputDevice.MotionRange> mMotionRanges = new ArrayList<>();
 
         public static ShadowInputDevice attach(int deviceId) {
             assert sDevicesById.indexOfKey(deviceId) < 0;
@@ -299,6 +355,20 @@
             return mSources;
         }
 
+        public ShadowInputDevice addMotionRange(int axis, int source, float resolution) {
+            InputDevice.MotionRange motionRange =
+                    Shadow.newInstanceOf(InputDevice.MotionRange.class);
+            mMotionRanges.add(motionRange);
+
+            ShadowMotionRange shadowMotionRange = Shadow.extract(motionRange);
+            shadowMotionRange.mAxis = axis;
+            shadowMotionRange.mSource = source;
+            shadowMotionRange.mResolution = resolution;
+
+            notifyInputDeviceChanged(mId);
+            return this;
+        }
+
         public ShadowInputDevice setSources(int sources) {
             if (mSources != sources) {
                 mSources = sources;
@@ -324,5 +394,36 @@
         public boolean supportsSource(int source) {
             return (getSources() & source) == source;
         }
+
+        @Implementation
+        public InputDevice.MotionRange getMotionRange(int axis, int source) {
+            final int numRanges = mMotionRanges.size();
+            for (int i = 0; i < numRanges; i++) {
+                final InputDevice.MotionRange range = mMotionRanges.get(i);
+                if (range.getAxis() == axis && range.getSource() == source) {
+                    return range;
+                }
+            }
+            return null;
+        }
+
+        @Implements(InputDevice.MotionRange.class)
+        public static class ShadowMotionRange {
+            private int mAxis;
+            private int mSource;
+            private float mResolution;
+
+            public int getAxis() {
+                return mAxis;
+            }
+
+            public int getSource() {
+                return mSource;
+            }
+
+            public float getResolution() {
+                return mResolution;
+            }
+        }
     }
 }
diff --git a/ui/menus/android/menu_model_bridge.cc b/ui/menus/android/menu_model_bridge.cc
index 07321728..5d49cfe 100644
--- a/ui/menus/android/menu_model_bridge.cc
+++ b/ui/menus/android/menu_model_bridge.cc
@@ -53,7 +53,12 @@
         break;
       }
       case MenuModel::TYPE_CHECK:
-        // TODO(jhimawan): Call Java MenuModelBridge to add check item.
+        Java_MenuModelBridge_addCheck(
+            env, java_obj_, menu_model->GetLabelAt(i),
+            menu_model->IsItemCheckedAt(i), menu_model->IsEnabledAt(i),
+            ToJniCallback(env, base::BindOnce(&MenuModelBridge::ActivatedAt,
+                                              weak_ptr_factory_.GetWeakPtr(),
+                                              menu_model->AsWeakPtr(), i)));
         break;
       case MenuModel::TYPE_RADIO:
         // TODO(jhimawan): Call Java MenuModelBridge to add radio item.
diff --git a/v8 b/v8
index f603959..15e797f 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit f603959113a63b6ee8fb0ab1efa6df3765e2b8ca
+Subproject commit 15e797f9eaefc113c3c1b2dafc0513ad6a81afb5