diff --git a/DEPS b/DEPS
index b68e5a61..78b75a3 100644
--- a/DEPS
+++ b/DEPS
@@ -276,11 +276,11 @@
   # 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': '07d1b817873ca3c81870063eceec46298d475541',
+  'src_internal_revision': '73607eee994ba5e68eb326f61e3f0543f2044a86',
   # 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': 'c24b41eebcc69f4f8156716a411de04a80b6c3bc',
+  'skia_revision': 'b0427017da022cf34f9485d6361b1d03aac64021',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -352,7 +352,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': '8010e7fb8e1d64f2c914da216cedf6e3cdfad093',
+  'chromium_variations_revision': 'ad31f7ef5295293b73ada2c9da59fb550429061e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -372,7 +372,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '1ea78154d90c2b0a33fd7a72fc97beccc6d1c40d',
+  'devtools_frontend_revision': '5c21cab5d886e9e5732e903ff19238e6f3e3d8ca',
   # 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.
@@ -503,7 +503,7 @@
   'libcxx_revision':       '2e25154d49c29fa9aa42c30ad4a027bd30123434',
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:c97a86a72105f3328a540f5a5ab17d11989ab7dd',
+  'gn_version': 'git_revision:ed1abc107815210dc66ec439542bee2f6cbabc00',
 
   # ninja CIPD package.
   'ninja_package': 'infra/3pp/tools/ninja/',
@@ -1439,7 +1439,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '13571b2b78ee3c8179518064da9ed1a3f5da47ec',
+    '2e6ed9613f693e00c5d442214459a289bea9c5ef',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1468,7 +1468,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '3f82e5f3b0ea2e4aaca1bdfbfa18f34f5b3f6a6d',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'b5bbb66b58798106ab6d1cab32a22288d3ccabd4',
       'condition': 'checkout_ios',
   },
 
@@ -1598,7 +1598,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'wo7iIVgF-B5pVgthj7EDcFUn84oMIQo4Z1ZNtYHK-QIC',
+          'version': '32AzFSTUhsuZ_f9YU0c-rm5iCVSFQDV_EJRHADNVPAgC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2752,7 +2752,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@5b43f9496300bdac77c67501dc3b3738cb3d21c5',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@d47ae2be278152820d6904829ed6fbbae559f03d',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@c16e6a34b72de51d07c121a1c202806bac0be9dc',
   '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@a380cd25433092dbce9a455a3feb1242138febee',
@@ -2761,7 +2761,7 @@
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@369f59ad598b60d6ed9f553af651c5cccd20234c',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@315964ad5aabd5b148a484e5fbea8a365c8d1eb3',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@5a88b6042edb8f03eefc8de73bd73a899989373f',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@cddf2371ee3ef9c31deea06ce14df558c20ece04',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@27d4bf4948e4c5d313bd43147629b38729f6edc6',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -2806,7 +2806,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2911627ab3cb5e2549d7e65d176a01ed398b874a',
+    Var('webrtc_git') + '/src.git' + '@' + 'b099e0d7effde8969bad12cf0495c44fc7ff28f3',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -2853,13 +2853,13 @@
   },
 
   'src/third_party/zstd/src':
-    Var('chromium_git') + '/external/github.com/facebook/zstd.git' + '@' + 'b0a179d469680276adbd4007435989a6b7fd8b4f',
+    Var('chromium_git') + '/external/github.com/facebook/zstd.git' + '@' + '80af41e08a630946a75a5cda9e4cdf192247f20a',
 
   'src/tools/skia_goldctl/linux': {
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'y4kowbHdyv_7-p0-MB1QlTWy5YWYDclmStirH1GbuCkC',
+          'version': 'wJuGySZSXWYzSSYnrikBGF40Jt9Np2sryaAZDgPktSMC',
         },
       ],
       'dep_type': 'cipd',
@@ -2869,7 +2869,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': 'skMt2xgfOuITCmlSoLbBGHtrtM3geW4ejGVKFtFxTvsC',
+          'version': 'ZbpG6l6nZTf_9CzhFx_mAhpawgzPaR_4DWHooNZRWTEC',
         },
       ],
       'dep_type': 'cipd',
@@ -2880,7 +2880,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'tGIX6p4MvgbXFQWrWBCJ-xjSTLxHwW3ShJXRnLQCUdYC',
+          'version': 'GdyWLemYJthJSy9vVJ_qtCqO3aTkj_LWZ7X6I15d-PoC',
         },
       ],
       'dep_type': 'cipd',
@@ -2891,7 +2891,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-arm64',
-          'version': '7m6yrdw10Gle5GlaI-jY2YVIqXxO_8MgLIVhKt9tPzYC',
+          'version': '5D08ylQHoTIb5hVQwEIQ_f_lopZUOXEtntUD_naP1goC',
         },
       ],
       'dep_type': 'cipd',
@@ -2921,7 +2921,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': 'Kdms-EK9XVmquV6I0yPrHsDBj38kBX6ZhyDByrWC1KMC',
+        'version': 'RN0xvjleQ3cZb_0ADjJThZ6BHBE0zBg_k95_J3T6E34C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2932,7 +2932,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_app/app',
-        'version': 'waXRDqwwLQKvPqABrqULEhbPQOZVfphzzbClpeg5tU4C',
+        'version': 'aBZPSA-59UYhqT_7QWTjyXq_teLG12AG3DAtpFBrYA8C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4568,7 +4568,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        'd2dce193b98bc200e7b9d6c6894fe09fdcb16b39',
+        '5fdd6f6cda0ecc774859916adb4cf02184206560',
       'condition': 'checkout_src_internal',
   },
 
@@ -4634,7 +4634,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'a48abcfc293d8e695d52adafe5a76954066a0ab8',
+        'b17d27327c1014632c418765f9f031f6c942a18e',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 1379ebb..026de1a0 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -2122,7 +2122,8 @@
                  r'IS_CHROMEOS_LACROS'),
         explanation=
         ('Lacros is deprecated. Please do not use IS_CHROMEOS_ASH and '
-         'IS_CHROMEOS_LACROS anymore. Prefer IS_CHROMEOS instead.',
+         'IS_CHROMEOS_LACROS anymore. Instead, remove the code section under '
+         'IS_CHROMEOS_LACROS and use IS_CHROMEOS for ChromeOS-only code.',
         ),
         treat_as_error=False,
     ),
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 f2d56dd..ec14dca4 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
@@ -580,6 +580,7 @@
                 NetFeatures.SPDY_HEADERS_TO_HTTP_RESPONSE_USE_BUILDER,
                 "Enables new optimized implementation of SpdyHeadersToHttpResponse. No behavior"
                         + " change."),
+        Flag.baseFeature(NetFeatures.HAPPY_EYEBALLS_V3, "Enables Happy Eyeballs V3"),
         Flag.baseFeature("MojoIpcz"),
         Flag.baseFeature(
                 "FixDataPipeTrapBug",
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index 0bbb840..74834a7 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -3573,7 +3573,7 @@
   void ExpectActionRecorded(ui::MediaHardwareKeyAction action) {
     histogram_tester_.ExpectBucketCount(
         ui::kMediaHardwareKeyActionHistogramName,
-        static_cast<base::HistogramBase::Sample>(action), 1);
+        static_cast<base::HistogramBase::Sample32>(action), 1);
   }
 
  private:
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 62028d8..cda4d1f 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -14,7 +14,7 @@
 -->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/ash_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/capture_mode/capture_mode_controller.h b/ash/capture_mode/capture_mode_controller.h
index 0262fed..37a2096 100644
--- a/ash/capture_mode/capture_mode_controller.h
+++ b/ash/capture_mode/capture_mode_controller.h
@@ -806,9 +806,6 @@
   bool is_camera_muted_ = false;
   bool is_microphone_muted_ = false;
 
-  // Watches events that lead to ending video recording.
-  std::unique_ptr<VideoRecordingWatcher> video_recording_watcher_;
-
   // Tracks the windows that currently have content protection enabled, so that
   // we prevent them from being video recorded. Each window is mapped to its
   // currently-set protection_mask. Windows in this map are only the ones that
@@ -872,6 +869,11 @@
   base::flat_map<BehaviorType, std::unique_ptr<CaptureModeBehavior>>
       behaviors_map_;
 
+  // Watches events that lead to ending video recording.
+  // Must be destroyed before `behaviors_map_` to avoid dangling raw pointers
+  // to `CaptureModeBehavior`s.
+  std::unique_ptr<VideoRecordingWatcher> video_recording_watcher_;
+
   base::ObserverList<CaptureModeObserver> observers_;
 
   std::unique_ptr<CaptureModeEducationController> education_controller_;
diff --git a/ash/capture_mode/video_recording_watcher.h b/ash/capture_mode/video_recording_watcher.h
index 5103cb2..5c14546e 100644
--- a/ash/capture_mode/video_recording_watcher.h
+++ b/ash/capture_mode/video_recording_watcher.h
@@ -226,7 +226,7 @@
   const raw_ptr<CaptureModeController> controller_;
 
   // The currently active behavior which is passed from capture mode session.
-  const raw_ptr<CaptureModeBehavior, DanglingUntriaged> active_behavior_;
+  const raw_ptr<CaptureModeBehavior> active_behavior_;
   const raw_ptr<wm::CursorManager> cursor_manager_;
   const raw_ptr<aura::Window, DanglingUntriaged> window_being_recorded_;
   raw_ptr<aura::Window, DanglingUntriaged> current_root_;
diff --git a/ash/keyboard/ui/keyboard_resources.grd b/ash/keyboard/ui/keyboard_resources.grd
index 91ca2ba2..480ebb8 100644
--- a/ash/keyboard/ui/keyboard_resources.grd
+++ b/ash/keyboard/ui/keyboard_resources.grd
@@ -3,7 +3,7 @@
      NOTE: if you are adding resources here, you should probably also edit:
      ui/keyboard/keyboard_resource_util.cc
 -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/keyboard_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/login/resources/login_resources.grd b/ash/login/resources/login_resources.grd
index a0e5640..3a86047 100644
--- a/ash/login/resources/login_resources.grd
+++ b/ash/login/resources/login_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/login_resources.h" type="rc_header" context="default_100_percent">
       <emit emit_type='prepend'></emit>
diff --git a/ash/public/cpp/resources/ash_public_unscaled_resources.grd b/ash/public/cpp/resources/ash_public_unscaled_resources.grd
index cd53f64..6080aeb 100644
--- a/ash/public/cpp/resources/ash_public_unscaled_resources.grd
+++ b/ash/public/cpp/resources/ash_public_unscaled_resources.grd
@@ -5,7 +5,7 @@
      it is the caller's responsibility to do the right thing when the
      display is not at 100P device scale factor.
   -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ash_public_unscaled_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/quick_insert/resources/quick_insert_resources.grd b/ash/quick_insert/resources/quick_insert_resources.grd
index 3a970956..af9f25ac 100644
--- a/ash/quick_insert/resources/quick_insert_resources.grd
+++ b/ash/quick_insert/resources/quick_insert_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/quick_insert_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/system/mahi/resources/mahi_resources.grd b/ash/system/mahi/resources/mahi_resources.grd
index e90cc57..36d0841 100644
--- a/ash/system/mahi/resources/mahi_resources.grd
+++ b/ash/system/mahi/resources/mahi_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/mahi_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/system/video_conference/resources/vc_resources.grd b/ash/system/video_conference/resources/vc_resources.grd
index 574d6ca..f191cde 100644
--- a/ash/system/video_conference/resources/vc_resources.grd
+++ b/ash/system/video_conference/resources/vc_resources.grd
@@ -2,7 +2,7 @@
 <!--This file contains the gradient animation json files for image button and create
 with ai button on the VC tray.
 -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/vc_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/webui/boca_ui/resources/mock/boca_app_bundle_mock_resources.grd b/ash/webui/boca_ui/resources/mock/boca_app_bundle_mock_resources.grd
index 8cb9b12d..c7c3600 100644
--- a/ash/webui/boca_ui/resources/mock/boca_app_bundle_mock_resources.grd
+++ b/ash/webui/boca_ui/resources/mock/boca_app_bundle_mock_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="grit/chromeos_boca_app_bundle_resources.h" type="rc_header">
       <emit emit_type="prepend"/>
diff --git a/ash/webui/camera_app_ui/camera_app_events_sender.cc b/ash/webui/camera_app_ui/camera_app_events_sender.cc
index ef7be6c..1124e7f 100644
--- a/ash/webui/camera_app_ui/camera_app_events_sender.cc
+++ b/ash/webui/camera_app_ui/camera_app_events_sender.cc
@@ -152,7 +152,7 @@
 
 void CameraAppEventsSender::SendStartSessionEvent(
     camera_app::mojom::StartSessionEventParamsPtr params) {
-  auto language = static_cast<base::HistogramBase::Sample>(
+  auto language = static_cast<base::HistogramBase::Sample32>(
       base::HashMetricName(system_language_));
   metrics::structured::StructuredMetricsClient::Record(std::move(
       cros_events::CameraApp_StartSession()
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings.grd b/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
index c093a45e..46e35f6 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <grit base_dir="." current_release="1" latest_public_release="0"
-      output_all_resource_defines="false" enc_check="möl" source_lang_id="en">
+      enc_check="möl" source_lang_id="en">
   <outputs>
     <output filename="grit/ash_camera_app_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/webui/eche_app_ui/resources/mock/ash_eche_bundle_mock_resources.grd b/ash/webui/eche_app_ui/resources/mock/ash_eche_bundle_mock_resources.grd
index d269477..a42d49d 100644
--- a/ash/webui/eche_app_ui/resources/mock/ash_eche_bundle_mock_resources.grd
+++ b/ash/webui/eche_app_ui/resources/mock/ash_eche_bundle_mock_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="grit/ash_eche_bundle_resources.h" type="rc_header">
       <emit emit_type="prepend"/>
diff --git a/ash/webui/focus_mode/resources/resources.grd b/ash/webui/focus_mode/resources/resources.grd
index ee24b06..378ecee5 100644
--- a/ash/webui/focus_mode/resources/resources.grd
+++ b/ash/webui/focus_mode/resources/resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ash_focus_mode_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/webui/help_app_ui/resources/help_app_resources.grd b/ash/webui/help_app_ui/resources/help_app_resources.grd
index f00486af..1c89d50 100644
--- a/ash/webui/help_app_ui/resources/help_app_resources.grd
+++ b/ash/webui/help_app_ui/resources/help_app_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ash_help_app_resources.h" type="rc_header">
       <emit emit_type="prepend"></emit>
diff --git a/ash/webui/help_app_ui/resources/mock/help_app_bundle_mock_resources.grd b/ash/webui/help_app_ui/resources/mock/help_app_bundle_mock_resources.grd
index 2eade976..3cac11f 100644
--- a/ash/webui/help_app_ui/resources/mock/help_app_bundle_mock_resources.grd
+++ b/ash/webui/help_app_ui/resources/mock/help_app_bundle_mock_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="grit/chromeos_help_app_bundle_resources.h" type="rc_header">
       <emit emit_type="prepend"/>
diff --git a/ash/webui/help_app_ui/resources/mock/help_app_kids_magazine_bundle_mock_resources.grd b/ash/webui/help_app_ui/resources/mock/help_app_kids_magazine_bundle_mock_resources.grd
index 6d076a1..8a29520e 100644
--- a/ash/webui/help_app_ui/resources/mock/help_app_kids_magazine_bundle_mock_resources.grd
+++ b/ash/webui/help_app_ui/resources/mock/help_app_kids_magazine_bundle_mock_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="grit/chromeos_help_app_kids_magazine_bundle_resources.h" type="rc_header">
       <emit emit_type="prepend"/>
diff --git a/ash/webui/media_app_ui/resources/media_app_resources.grd b/ash/webui/media_app_ui/resources/media_app_resources.grd
index 02fb3cb..052f81c 100644
--- a/ash/webui/media_app_ui/resources/media_app_resources.grd
+++ b/ash/webui/media_app_ui/resources/media_app_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ash_media_app_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/webui/media_app_ui/resources/mock/media_app_bundle_mock_resources.grd b/ash/webui/media_app_ui/resources/mock/media_app_bundle_mock_resources.grd
index e01f4a0..56f9137 100644
--- a/ash/webui/media_app_ui/resources/mock/media_app_bundle_mock_resources.grd
+++ b/ash/webui/media_app_ui/resources/mock/media_app_bundle_mock_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="grit/chromeos_media_app_bundle_resources.h" type="rc_header">
       <emit emit_type="prepend"/>
diff --git a/ash/webui/multidevice_debug/resources/multidevice_debug_resources.grd b/ash/webui/multidevice_debug/resources/multidevice_debug_resources.grd
index 18ece03..5885eb0 100644
--- a/ash/webui/multidevice_debug/resources/multidevice_debug_resources.grd
+++ b/ash/webui/multidevice_debug/resources/multidevice_debug_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ash_multidevice_debug_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ash/webui/projector_app/resources/mock/projector_app_bundle_mock_resources.grd b/ash/webui/projector_app/resources/mock/projector_app_bundle_mock_resources.grd
index e3167f15..5084f85 100644
--- a/ash/webui/projector_app/resources/mock/projector_app_bundle_mock_resources.grd
+++ b/ash/webui/projector_app/resources/mock/projector_app_bundle_mock_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="grit/chromeos_projector_app_bundle_resources.h" type="rc_header">
       <emit emit_type="prepend"/>
diff --git a/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts b/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts
index 13a7f04..439fb1dd6 100644
--- a/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts
+++ b/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts
@@ -114,7 +114,9 @@
       }
 
       #title {
+        color: var(--cros-sys-on_surface);
         font: var(--cros-title-1-font);
+        margin: 0;
         overflow: hidden;
 
         /* To avoid overlap with the options button. */
@@ -332,14 +334,14 @@
 
   private renderTitle(title: string, highlight: [number, number]|null) {
     if (highlight === null) {
-      return html`<div id="title">${title}</div>`;
+      return html`<h3 id="title">${title}</h3>`;
     }
     const [start, end] = highlight;
-    return html`<div id="title">
+    return html`<h3 id="title">
       ${title.slice(0, start)}<span class="highlight"
         >${title.slice(start, end)}</span
       >${title.slice(end)}
-    </div>`;
+    </h3>`;
   }
 
   private renderDescription(description: string) {
diff --git a/ash/wm/overview/birch/resources/coral_resources.grd b/ash/wm/overview/birch/resources/coral_resources.grd
index 6049610..69a4a3a 100644
--- a/ash/wm/overview/birch/resources/coral_resources.grd
+++ b/ash/wm/overview/birch/resources/coral_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/coral_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/build/android/list_java_targets.py b/build/android/list_java_targets.py
index 309b33a..aeca42ef 100755
--- a/build/android/list_java_targets.py
+++ b/build/android/list_java_targets.py
@@ -234,10 +234,17 @@
   constants.CheckOutputDirectory()
   output_dir = constants.GetOutDirectory()
 
+  if args.build:
+    _compile(output_dir, ['build.ninja'])
+
   # Query ninja for all __build_config_crbug_908819 targets.
   targets = _query_for_build_config_targets(output_dir)
   entries = [_TargetEntry(t) for t in targets]
 
+  if not entries:
+    logging.warning('No targets found. Run with --build')
+    sys.exit(1)
+
   if args.build:
     logging.warning('Building %d .build_config.json files...', len(entries))
     _compile(output_dir, [e.ninja_build_config_target for e in entries],
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index 7677872..451bdd0b 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -15,7 +15,6 @@
 
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/memory/shared_memory_mapping.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -183,16 +182,12 @@
       uint64_t tracing_process_id,
       int importance) const override {
     base::UnguessableToken resource_guid =
-        shared_image ? shared_image->Map()->GetSharedMemoryGuid()
-                     : shared_mapping.guid();
+        shared_image->Map()->GetSharedMemoryGuid();
     pmd->CreateSharedMemoryOwnershipEdge(buffer_dump_guid, resource_guid,
                                          importance);
   }
 
   raw_ptr<LayerTreeFrameSink> layer_tree_frame_sink;
-
-  // Will be empty if `shared_image` is non-null.
-  base::WritableSharedMemoryMapping shared_mapping;
 };
 
 bool HeadsUpDisplayLayerImpl::WillDraw(
@@ -425,9 +420,7 @@
     auto* backing =
         static_cast<HudSoftwareBacking*>(pool_resource.software_backing());
     auto shared_image = backing->shared_image;
-    base::span<uint8_t> mem = shared_image
-                                  ? shared_image->Map()->GetMemoryForPlane(0)
-                                  : backing->shared_mapping;
+    base::span<uint8_t> mem = shared_image->Map()->GetMemoryForPlane(0);
     CHECK_GE(mem.size(), info.computeByteSize(row_bytes));
     sk_sp<SkSurface> surface =
         SkSurfaces::WrapPixels(info, mem.data(), row_bytes, &props);
diff --git a/cc/raster/bitmap_raster_buffer_provider.cc b/cc/raster/bitmap_raster_buffer_provider.cc
index 6d695ef..dbdd8c5 100644
--- a/cc/raster/bitmap_raster_buffer_provider.cc
+++ b/cc/raster/bitmap_raster_buffer_provider.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/memory/raw_ptr.h"
-#include "base/memory/shared_memory_mapping.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
@@ -36,12 +35,12 @@
       const base::trace_event::MemoryAllocatorDumpGuid& buffer_dump_guid,
       uint64_t tracing_process_id,
       int importance) const override {
-      pmd->CreateSharedMemoryOwnershipEdge(buffer_dump_guid, mapping.guid(),
-                                           importance);
+    pmd->CreateSharedMemoryOwnershipEdge(
+        buffer_dump_guid, mapping->GetSharedMemoryGuid(), importance);
   }
 
   raw_ptr<LayerTreeFrameSink> frame_sink;
-  base::WritableSharedMemoryMapping mapping;
+  std::unique_ptr<gpu::ClientSharedImage::ScopedMapping> mapping;
 };
 
 class BitmapRasterBufferImpl : public RasterBuffer {
@@ -53,7 +52,7 @@
                          uint64_t previous_content_id)
       : resource_size_(size),
         color_space_(color_space),
-        pixels_(backing->mapping.memory()),
+        pixels_(backing->mapping->GetMemoryForPlane(0).data()),
         resource_has_previous_content_(
             resource_content_id && resource_content_id == previous_content_id),
         backing_(backing) {}
@@ -131,13 +130,12 @@
     auto sii = frame_sink_->shared_image_interface();
     CHECK(sii) << "SharedImageInterface is null!";
 
-    auto shared_image_mapping = sii->CreateSharedImage(
+    backing->shared_image = sii->CreateSharedImageForSoftwareCompositor(
         {viz::SinglePlaneFormat::kBGRA_8888, size, color_space,
          gpu::SHARED_IMAGE_USAGE_CPU_WRITE_ONLY, "BitmapRasterBufferProvider"});
-    backing->shared_image = std::move(shared_image_mapping.shared_image);
     CHECK(backing->shared_image);
 
-    backing->mapping = std::move(shared_image_mapping.mapping);
+    backing->mapping = backing->shared_image->Map();
     backing->mailbox_sync_token = sii->GenVerifiedSyncToken();
 
     resource.set_software_backing(std::move(backing));
diff --git a/cc/test/layer_test_common.cc b/cc/test/layer_test_common.cc
index eab711e..9be3ff4c 100644
--- a/cc/test/layer_test_common.cc
+++ b/cc/test/layer_test_common.cc
@@ -29,13 +29,6 @@
   return settings;
 }
 
-LayerTreeSettings CommitToActiveTreeLayerTreeSettings() {
-  LayerTreeSettings settings;
-  settings.commit_to_active_tree = true;
-  settings.use_layer_lists = false;
-  return settings;
-}
-
 LayerTreeSettings CommitToPendingTreeLayerListSettings() {
   LayerTreeSettings settings;
   settings.commit_to_active_tree = false;
diff --git a/cc/test/layer_test_common.h b/cc/test/layer_test_common.h
index a5df45fb..e53b3d53 100644
--- a/cc/test/layer_test_common.h
+++ b/cc/test/layer_test_common.h
@@ -24,7 +24,6 @@
 // LayerTreeSettings with different combinations of
 // commit_to_active_tree and use_layer_lists.
 LayerTreeSettings CommitToActiveTreeLayerListSettings();
-LayerTreeSettings CommitToActiveTreeLayerTreeSettings();
 LayerTreeSettings CommitToPendingTreeLayerListSettings();
 LayerTreeSettings CommitToPendingTreeLayerTreeSettings();
 
diff --git a/chrome/VERSION b/chrome/VERSION
index ff876dd..d78e619 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=134
 MINOR=0
-BUILD=6956
+BUILD=6957
 PATCH=0
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
index 365a616..2394a08 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
@@ -796,13 +796,6 @@
         mMediator.setTabId(getTabIdFromLaunchOrigin(launchOrigin));
     }
 
-    /*
-     * Returns true if the supervised user feed should be displayed.
-     */
-    public boolean shouldDisplaySupervisedFeed() {
-        return mProfile.isChild();
-    }
-
     /**
      * Gets the appropriate {@link StreamTabId} for the given {@link NewTabPageLaunchOrigin}.
      *
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
index 6f2f488..027a743 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -608,15 +608,9 @@
 
         boolean suggestionsVisible = isSuggestionsVisible();
 
-        @StreamKind
-        int streamKind =
-                mCoordinator.shouldDisplaySupervisedFeed()
-                        ? StreamKind.SUPERVISED_USER
-                        : StreamKind.FOR_YOU;
-
         addHeaderAndStream(
-                getInterestFeedHeaderText(suggestionsVisible, streamKind),
-                mCoordinator.createFeedStream(streamKind, new StreamsMediatorImpl()));
+                getInterestFeedHeaderText(suggestionsVisible),
+                mCoordinator.createFeedStream(StreamKind.FOR_YOU, new StreamsMediatorImpl()));
         setHeaderIndicatorState(suggestionsVisible);
 
         // Build menu after section enabled key is set.
@@ -1058,8 +1052,7 @@
                 .get(PRIMARY_FEED_HEADER_POSITION)
                 .set(
                         SectionHeaderProperties.HEADER_TEXT_KEY,
-                        getInterestFeedHeaderText(
-                                suggestionsVisible, mTabToStreamMap.get(0).getStreamKind()));
+                        getInterestFeedHeaderText(suggestionsVisible));
 
         setHeaderIndicatorState(suggestionsVisible);
 
@@ -1133,27 +1126,12 @@
                         : FeedUserActionType.TAPPED_TURN_OFF);
     }
 
-    /**
-     * Returns the interest feed header text based on the type of user (supervised or
-     * non-supervised) and the selected default search engine
-     */
-    private String getInterestFeedHeaderText(boolean isExpanded, @StreamKind int streamKind) {
+    /** Returns the interest feed header text and the selected default search engine. */
+    private String getInterestFeedHeaderText(boolean isExpanded) {
         Resources res = mContext.getResources();
         final boolean isDefaultSearchEngineGoogle =
                 mTemplateUrlService.isDefaultSearchEngineGoogle();
 
-        if (streamKind == StreamKind.SUPERVISED_USER) {
-            if (isDefaultSearchEngineGoogle) {
-                return isExpanded
-                        ? res.getString(R.string.supervised_user_ntp_discover_on)
-                        : res.getString(R.string.supervised_user_ntp_discover_off);
-            } else {
-                return isExpanded
-                        ? res.getString(R.string.supervised_user_ntp_discover_on_branded)
-                        : res.getString(R.string.supervised_user_ntp_discover_off_branded);
-            }
-        }
-
         if (WebFeedBridge.isWebFeedEnabled() && FeedServiceBridge.isSignedIn() && isExpanded) {
             return res.getString(R.string.ntp_discover_on);
         } else if (isDefaultSearchEngineGoogle) {
@@ -1170,8 +1148,7 @@
         ModelList itemList = new ModelList();
         int iconId = 0;
 
-        // Do not display Manage menu items for the supervised-user feed.
-        if (FeedServiceBridge.isSignedIn() && !mCoordinator.shouldDisplaySupervisedFeed()) {
+        if (FeedServiceBridge.isSignedIn()) {
             if (WebFeedBridge.isWebFeedEnabled()) {
                 itemList.add(
                         buildMenuListItem(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
index 730c856..63f7f55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
@@ -264,10 +264,10 @@
             mSigninPromoCoordinator =
                     new SigninPromoCoordinator(
                             context,
-                            mProfile,
+                            mProfile.getOriginalProfile(),
                             new BookmarkSigninPromoDelegate(
                                     context,
-                                    mProfile,
+                                    mProfile.getOriginalProfile(),
                                     SigninAndHistorySyncActivityLauncherImpl.get(),
                                     mMediator::onPromoVisibilityChange,
                                     this::openSettings));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
index 5373e73..1c80e10b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
@@ -219,7 +219,9 @@
                 public void onDestroy() {
                     removeUiObserver(mBookmarkUiObserver);
                     getSelectionDelegate().removeObserver(mSelectionObserver);
-                    mPromoHeaderManager.destroy();
+                    if (mPromoHeaderManager != null) {
+                        mPromoHeaderManager.destroy();
+                    }
                 }
 
                 @Override
@@ -358,7 +360,7 @@
     private final boolean mIsDialogUi;
     private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier;
     private final Profile mProfile;
-    private final BookmarkPromoHeader mPromoHeaderManager;
+    private final @Nullable BookmarkPromoHeader mPromoHeaderManager;
     private final BookmarkUndoController mBookmarkUndoController;
     private final BookmarkQueryHandler mBookmarkQueryHandler;
     private final ModelList mModelList;
@@ -439,9 +441,6 @@
         mShoppingService = shoppingService;
         mSnackbarManager = snackbarManager;
         mCanShowSigninPromo = canShowSigninPromo;
-        mPromoHeaderManager =
-                new BookmarkPromoHeader(
-                        mContext, mProfile.getOriginalProfile(), this::updateHeader);
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP)) {
             mBookmarkBatchUploadCardCoordinator =
                     new BookmarkBatchUploadCardCoordinator(
@@ -451,6 +450,11 @@
                             mProfile.getOriginalProfile(),
                             mSnackbarManager,
                             this::updateBatchUploadCard);
+            mPromoHeaderManager = null;
+        } else {
+            mPromoHeaderManager =
+                    new BookmarkPromoHeader(
+                            mContext, mProfile.getOriginalProfile(), this::updateHeader);
         }
         mBookmarkUndoController = bookmarkUndoController;
         mBookmarkMoveSnackbarManager = bookmarkMoveSnackbarManager;
@@ -585,6 +589,7 @@
         }
     }
 
+    @Nullable
     BookmarkPromoHeader getPromoHeaderManager() {
         return mPromoHeaderManager;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
index 31f71540..b08bc49 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinder.java
@@ -12,6 +12,7 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.bookmarks.BookmarkListEntry.SectionHeaderData;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -19,6 +20,7 @@
 /** Responsible for binding views to their properties. */
 class BookmarkManagerViewBinder {
     static void bindPersonalizedPromoView(PropertyModel model, View view, PropertyKey key) {
+        assert !ChromeFeatureList.isEnabled(ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP);
         if (key == BookmarkManagerProperties.BOOKMARK_PROMO_HEADER) {
             PersonalizedSigninPromoView promoView =
                     view.findViewById(R.id.signin_promo_view_container);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java
index 34c5cdf..9e21dcf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java
@@ -63,6 +63,7 @@
 import org.chromium.chrome.browser.bookmarks.TestingDelegate;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.ui.signin.signin_promo.SigninPromoCoordinator;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
@@ -235,9 +236,10 @@
     @Test
     @SmallTest
     public void testReadingListItemMenuItems() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
         openReadingList();
@@ -261,13 +263,14 @@
     @Test
     @SmallTest
     public void testReadingListItemMenuItems_ReadItem() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         BookmarkId id = addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mBookmarkModel.setReadStatusForReadingList(id, /* read= */ true);
                 });
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
         openReadingList();
@@ -292,8 +295,9 @@
     @MediumTest
     @Restriction(DeviceRestriction.RESTRICTION_TYPE_NON_AUTO) // crbug.com/372854032
     public void testSearchReadingList_Deletion() throws Exception {
-        addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
+        SigninPromoCoordinator.disablePromoForTesting();
         BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
+        addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
 
         openBookmarkManager();
         openRootFolder();
@@ -329,6 +333,7 @@
     @SmallTest
     @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
     public void testReadingListEmptyStateView() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
         BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
@@ -353,9 +358,10 @@
     @SmallTest
     @Restriction({DeviceFormFactor.PHONE})
     public void testReadingListOpenInRegularTab() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
         openReadingList();
@@ -387,11 +393,12 @@
     @Restriction({DeviceFormFactor.PHONE})
     @DisabledTest(message = "crbug.com/383562582")
     public void testReadingListOpenInIncognitoTab() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
 
         mActivityTestRule.loadUrlInNewTab(UrlConstants.NTP_NON_NATIVE_URL, /* incognito= */ true);
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
         openReadingList();
@@ -421,6 +428,7 @@
     @Test
     @SmallTest
     public void testReadingListFolderShown() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
         BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
@@ -450,12 +458,13 @@
     @Test
     @SmallTest
     public void testReadingListFolderShownOneUnreadPage() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         // Add two reading list items and set one as read.
         setReadStatusForReadingList(
                 addReadingListBookmark("a", new GURL("https://a.com/reading_list_0")), true);
         addReadingListBookmark("b", new GURL("https://b.com/reading_list_0"));
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         runOnUiThreadBlocking(
                 () -> {
@@ -471,13 +480,14 @@
     @Test
     @SmallTest
     public void testReadingListFolderShownMultipleUnreadPages() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         // Add three reading list items and set one as read.
         setReadStatusForReadingList(
                 addReadingListBookmark("a", new GURL("https://a.com/reading_list_0")), true);
         addReadingListBookmark("b", new GURL("https://b.com/reading_list_1"));
         addReadingListBookmark("c", new GURL("https://c.com/reading_list_1"));
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         runOnUiThreadBlocking(
                 () -> {
@@ -493,11 +503,12 @@
     @Test
     @SmallTest
     public void testReadingListFolderShown_SetReadingListStatus() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         // Add three reading list items and set one as read.
         BookmarkId id1 = addReadingListBookmark("a", new GURL("https://a.com/reading_list_0"));
         BookmarkId id2 = addReadingListBookmark("b", new GURL("https://a.com/reading_list_1"));
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         runOnUiThreadBlocking(
                 () -> {
@@ -518,9 +529,10 @@
     @Test
     @SmallTest
     public void testReadingListItemsInSelectionMode() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
         openReadingList();
@@ -566,9 +578,10 @@
     @Test
     @SmallTest
     public void testReadingListItemsInSelectionMode_SearchMode() throws Exception {
+        SigninPromoCoordinator.disablePromoForTesting();
+        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
 
-        BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
         openBookmarkManager();
         openRootFolder();
         openReadingList();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java
index 13f2f179..4da6ab6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java
@@ -29,6 +29,7 @@
 import org.chromium.chrome.browser.app.bookmarks.BookmarkActivity;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.ui.signin.signin_promo.SigninPromoCoordinator;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
@@ -81,6 +82,7 @@
     }
 
     private void openBookmarkManager() {
+        SigninPromoCoordinator.disablePromoForTesting();
         BookmarkPromoHeader.forcePromoVisibilityForTesting(false);
 
         if (mActivityTestRule.getActivity().isTablet()) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
index f7d0fe7..6cff03a4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
@@ -25,7 +25,6 @@
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -144,10 +143,6 @@
     @MediumTest
     @DisableIf.Build(sdk_equals = Build.VERSION_CODES.S_V2, message = "crbug.com/40262804")
     public void testPromoImpressionCountIncrementAfterDisplayingSigninPromo() {
-        Assert.assertEquals(
-                0,
-                ChromeSharedPreferences.getInstance()
-                        .readInt(ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT));
         assertEquals(
                 0,
                 ChromeSharedPreferences.getInstance()
@@ -155,8 +150,7 @@
                                 SyncPromoController.getPromoShowCountPreferenceName(
                                         SigninAccessPoint.BOOKMARK_MANAGER)));
         var histogramWatcher =
-                HistogramWatcher.newSingleRecordWatcher(
-                        "Signin.SyncPromo.Shown.Count.Bookmarks", 1);
+                HistogramWatcher.newSingleRecordWatcher("Signin.SyncPromo.Shown.Count.Bookmarks");
 
         mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity());
         onActiveViewId(R.id.signin_promo_view_container).check(matches(isDisplayed()));
@@ -171,10 +165,6 @@
                                         SigninAccessPoint.BOOKMARK_MANAGER));
         assertTrue(
                 "Expected at least one, but found " + bookmarkShownCount, bookmarkShownCount >= 1);
-        int totalShownCount =
-                ChromeSharedPreferences.getInstance()
-                        .readInt(ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT);
-        assertTrue("Expected at least one, but found " + totalShownCount, totalShownCount >= 1);
         histogramWatcher.assertExpected();
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java
index 4f8fd48e3..8f7f12c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java
@@ -150,8 +150,6 @@
     @EnableFeatures(ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP)
     public void testCreateViewUNOPhase2FollowUpEnabled() {
         FrameLayout parent = new FrameLayout(mActivity);
-        assertNotNull(mCoordinator.buildPersonalizedPromoView(parent));
-        assertNotNull(mCoordinator.buildLegacyPromoView(parent));
         assertNotNull(mCoordinator.buildBatchUploadCardView(parent));
         assertNotNull(mCoordinator.buildSectionHeaderView(parent));
         assertNotNull(BookmarkManagerCoordinator.buildDividerView(parent));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinderTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinderTest.java
index e771076..166e8c45 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinderTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinderTest.java
@@ -29,7 +29,9 @@
 import org.chromium.base.Callback;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.Features;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.ui.base.TestActivity;
@@ -71,6 +73,7 @@
     }
 
     @Test
+    @Features.DisableFeatures(ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP)
     public void testBindPersonalizedPromoView() {
         when(mView.findViewById(R.id.signin_promo_view_container)).thenReturn(mPromoView);
         mModel.set(BookmarkManagerProperties.BOOKMARK_PROMO_HEADER, mBookmarkPromoHeader);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java
index e52f195..b4d8682 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java
@@ -93,10 +93,7 @@
 import org.chromium.components.prefs.PrefChangeRegistrar;
 import org.chromium.components.prefs.PrefService;
 import org.chromium.components.search_engines.TemplateUrlService;
-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.test.util.TestAccounts;
 import org.chromium.components.user_prefs.UserPrefs;
 import org.chromium.components.user_prefs.UserPrefsJni;
 import org.chromium.ui.base.WindowAndroid;
@@ -114,7 +111,6 @@
     ChromeFeatureList.FEED_CONTAINMENT
 })
 @EnableFeatures({
-    ChromeFeatureList.KID_FRIENDLY_CONTENT_FEED,
     ChromeFeatureList.REPLACE_SYNC_PROMOS_WITH_SIGN_IN_PROMOS,
     ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP,
     ChromeFeatureList.FEED_LOW_MEMORY_IMPROVEMENT
@@ -474,32 +470,6 @@
     }
 
     @Test
-    public void testIsPrimaryAccountSupervisedForChildUser() {
-        AccountInfo account = TestAccounts.CHILD_ACCOUNT;
-        when(mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN)).thenReturn(account);
-        when(mIdentityManager.findExtendedAccountInfoByEmailAddress(account.getEmail()))
-                .thenReturn(account);
-        when(mProfileMock.isChild()).thenReturn(true);
-
-        assertTrue(mCoordinator.shouldDisplaySupervisedFeed());
-    }
-
-    @Test
-    public void testIsPrimaryAccountSupervisedForRegularUser() {
-        AccountInfo account = TestAccounts.ACCOUNT1;
-        when(mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN)).thenReturn(account);
-        when(mIdentityManager.findExtendedAccountInfoByEmailAddress(account.getEmail()))
-                .thenReturn(account);
-        assertFalse(mCoordinator.shouldDisplaySupervisedFeed());
-    }
-
-    @Test
-    public void testIsPrimaryAccountSupervisedForSignedOutUser() {
-        when(mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN)).thenReturn(null);
-        assertFalse(mCoordinator.shouldDisplaySupervisedFeed());
-    }
-
-    @Test
     @DisableFeatures(ChromeFeatureList.TAB_STRIP_LAYOUT_OPTIMIZATION)
     public void testTabStripHeightChangeCallback() {
         ArgumentCaptor<Callback<Integer>> captor = ArgumentCaptor.forClass(Callback.class);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
index b5a335f..ad72202 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
@@ -77,8 +77,6 @@
 import org.chromium.components.search_engines.TemplateUrlService;
 import org.chromium.components.search_engines.TemplateUrlService.TemplateUrlServiceObserver;
 import org.chromium.components.signin.identitymanager.IdentityManager;
-import org.chromium.ui.listmenu.ListMenuItemProperties;
-import org.chromium.ui.modelutil.MVCListAdapter;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /** Tests for {@link FeedSurfaceMediator}. */
@@ -107,7 +105,6 @@
     @Mock private TemplateUrlService mUrlService;
     @Mock private FeedStream mForYouStream;
     @Mock private FeedStream mFollowingStream;
-    @Mock private FeedStream mSupervisedUserStream;
     @Mock private HybridListRenderer mHybridListRenderer;
     @Mock private ListLayoutHelper mListLayoutHelper;
     @Mock private FeedSurfaceLifecycleManager mFeedSurfaceLifecycleManager;
@@ -146,9 +143,6 @@
         when(mFeedSurfaceCoordinator.createFeedStream(
                         eq(StreamKind.FOR_YOU), any(Stream.StreamsMediator.class)))
                 .thenReturn(mForYouStream);
-        when(mFeedSurfaceCoordinator.createFeedStream(
-                        eq(StreamKind.SUPERVISED_USER), any(Stream.StreamsMediator.class)))
-                .thenReturn(mSupervisedUserStream);
         when(mFeedSurfaceCoordinator.getReliabilityLogger()).thenReturn(mReliabilityLogger);
         when(mFeedSurfaceCoordinator.getHybridListRenderer()).thenReturn(mHybridListRenderer);
         when(mHybridListRenderer.getListLayoutHelper()).thenReturn(mListLayoutHelper);
@@ -161,8 +155,6 @@
         when(mForYouStream.getStreamKind()).thenReturn(StreamKind.FOR_YOU);
         when(mFollowingStream.hasUnreadContent()).thenReturn(hasUnreadContent);
         when(mFollowingStream.getStreamKind()).thenReturn(StreamKind.FOLLOWING);
-        when(mSupervisedUserStream.hasUnreadContent()).thenReturn(hasUnreadContent);
-        when(mSupervisedUserStream.getStreamKind()).thenReturn(StreamKind.SUPERVISED_USER);
 
         FeedSurfaceMediator.setPrefForTest(mPrefChangeRegistrar, mPrefService);
         FeedFeatures.setFakePrefsForTest(mPrefService);
@@ -231,8 +223,6 @@
 
         verify(mForYouStream, never()).bind(any(), any(), any(), any(), any(), any(), anyInt());
         verify(mFollowingStream, times(1)).bind(any(), any(), any(), any(), any(), any(), anyInt());
-        verify(mSupervisedUserStream, never())
-                .bind(any(), any(), any(), any(), any(), any(), anyInt());
         assertEquals(
                 FeedSurfaceCoordinator.StreamTabId.FOLLOWING,
                 sectionHeaderModel.get(SectionHeaderListProperties.CURRENT_TAB_INDEX_KEY));
@@ -252,8 +242,6 @@
 
         verify(mForYouStream, times(1)).bind(any(), any(), any(), any(), any(), any(), anyInt());
         verify(mFollowingStream, never()).bind(any(), any(), any(), any(), any(), any(), anyInt());
-        verify(mSupervisedUserStream, never())
-                .bind(any(), any(), any(), any(), any(), any(), anyInt());
 
         assertEquals(
                 FeedSurfaceCoordinator.StreamTabId.FOR_YOU,
@@ -262,148 +250,6 @@
     }
 
     @Test
-    public void updateContent_openingTabIdSupervisedUser() {
-        when(mFeedSurfaceCoordinator.shouldDisplaySupervisedFeed()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(true);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        verify(mSupervisedUserStream, times(1))
-                .bind(any(), any(), any(), any(), any(), any(), anyInt());
-        verify(mForYouStream, never()).bind(any(), any(), any(), any(), any(), any(), anyInt());
-        verify(mFollowingStream, never()).bind(any(), any(), any(), any(), any(), any(), anyInt());
-        assertEquals(
-                FeedSurfaceCoordinator.StreamTabId.FOR_YOU,
-                model.get(SectionHeaderListProperties.CURRENT_TAB_INDEX_KEY));
-    }
-
-    @Test
-    public void testMenuItems_supervisedFeedOn() {
-        when(mFeedSurfaceCoordinator.shouldDisplaySupervisedFeed()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(true);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        MVCListAdapter.ModelList menuItemList =
-                model.get(SectionHeaderListProperties.MENU_MODEL_LIST_KEY);
-
-        assertEquals(2, menuItemList.size());
-        assertEquals(
-                R.string.learn_more,
-                menuItemList.get(0).model.get(ListMenuItemProperties.TITLE_ID));
-        assertEquals(
-                R.string.ntp_turn_off_feed,
-                menuItemList.get(1).model.get(ListMenuItemProperties.TITLE_ID));
-    }
-
-    @Test
-    public void testMenuItems_supervisedFeedOff() {
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(true);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        MVCListAdapter.ModelList menuItemList =
-                model.get(SectionHeaderListProperties.MENU_MODEL_LIST_KEY);
-
-        assertTrue(menuItemList.size() > 2);
-    }
-
-    @Test
-    public void testHeaderText_supervisedFeedOnWithDefaultSearchEngineGoogle() {
-        when(mFeedSurfaceCoordinator.shouldDisplaySupervisedFeed()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(true);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-        doReturn(true).when(mUrlService).isDefaultSearchEngineGoogle();
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        assertEquals(
-                model.get(SectionHeaderListProperties.SECTION_HEADERS_KEY)
-                        .get(0)
-                        .get(SectionHeaderProperties.HEADER_TEXT_KEY),
-                mContext.getString(R.string.supervised_user_ntp_discover_on));
-    }
-
-    @Test
-    public void testHeaderText_supervisedFeedOffWithDefaultSearchEngineGoogle() {
-        when(mFeedSurfaceCoordinator.shouldDisplaySupervisedFeed()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(false);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-        doReturn(true).when(mUrlService).isDefaultSearchEngineGoogle();
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        assertEquals(
-                model.get(SectionHeaderListProperties.SECTION_HEADERS_KEY)
-                        .get(0)
-                        .get(SectionHeaderProperties.HEADER_TEXT_KEY),
-                mContext.getString(R.string.supervised_user_ntp_discover_off));
-    }
-
-    @Test
-    public void testHeaderText_supervisedFeedOnWithDefaultSearchEngineNotGoogle() {
-        when(mFeedSurfaceCoordinator.shouldDisplaySupervisedFeed()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(true);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-        doReturn(false).when(mUrlService).isDefaultSearchEngineGoogle();
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        assertEquals(
-                model.get(SectionHeaderListProperties.SECTION_HEADERS_KEY)
-                        .get(0)
-                        .get(SectionHeaderProperties.HEADER_TEXT_KEY),
-                mContext.getString(R.string.supervised_user_ntp_discover_on_branded));
-    }
-
-    @Test
-    public void testHeaderText_supervisedFeedOffWithDefaultSearchEngineNotGoogle() {
-        when(mFeedSurfaceCoordinator.shouldDisplaySupervisedFeed()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ARTICLES_LIST_VISIBLE)).thenReturn(false);
-        when(mFeedServiceBridgeJniMock.isSignedIn()).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true);
-        when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS_BY_DSE)).thenReturn(true);
-        doReturn(false).when(mUrlService).isDefaultSearchEngineGoogle();
-
-        PropertyModel model = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
-        mFeedSurfaceMediator = createMediator(FeedSurfaceCoordinator.StreamTabId.FOR_YOU, model);
-        mFeedSurfaceMediator.updateContent();
-
-        assertEquals(
-                model.get(SectionHeaderListProperties.SECTION_HEADERS_KEY)
-                        .get(0)
-                        .get(SectionHeaderProperties.HEADER_TEXT_KEY),
-                mContext.getString(R.string.supervised_user_ntp_discover_off_branded));
-    }
-
-    @Test
     public void testUpdateContent_policyFeedOnOff() {
         PropertyModel sectionHeaderModel = SectionHeaderListProperties.create(TOOLBAR_HEIGHT);
         mFeedSurfaceMediator =
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 5f9b728..c67826c 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -3,7 +3,7 @@
 If you update this file, be sure also to update google_chrome_strings.grd. -->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/branded_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index ad0ab60..fa025105 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8,7 +8,7 @@
 -->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/generated_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 0aa30808..aebfa09 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -5,7 +5,7 @@
 chromium_strings.grd. -->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/branded_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/os_settings_search_tag_strings.grdp b/chrome/app/os_settings_search_tag_strings.grdp
index f01086d..e521d603 100644
--- a/chrome/app/os_settings_search_tag_strings.grdp
+++ b/chrome/app/os_settings_search_tag_strings.grdp
@@ -1686,12 +1686,15 @@
   </message>
 
   <!-- On Startup section. -->
-  <message name="IDS_OS_SETTINGS_TAG_ON_STARTUP" desc="Text for search result item which, when clicked, navigates the user to On Startup settings, with a radio group to configure the restore apps and pages options">
+  <message name="IDS_OS_SETTINGS_TAG_ON_STARTUP" desc="Text for search result item which, when clicked, navigates the user to On Startup settings, with a drop down to configure the restore apps and pages options">
     Startup
   </message>
-  <message name="IDS_OS_SETTINGS_TAG_RESTORE_APPS_AND_PAGES" desc="Text for search result item which, when clicked, navigates the user to On Startup settings, with a radio group to configure the restore apps and pages options">
+  <message name="IDS_OS_SETTINGS_TAG_RESTORE_APPS_AND_PAGES" desc="Text for search result item which, when clicked, navigates the user to On Startup settings, with a drop down to configure the restore apps and pages options">
     Restore apps and pages
   </message>
+  <message name="IDS_OS_SETTINGS_TAG_WELCOME_RECAP" desc="Text for search result item which, when clicked, navigates the user to On Startup settings, with a drop down to configure the restore apps and pages options">
+    Welcome recap
+  </message>
 
   <!-- Multitasking section. -->
   <message name="IDS_OS_SETTINGS_TAG_MULTITASKING_SNAP_WINDOW" desc="Text for search result item which, when clicked, navigates the user to Multitasking settings, with a toggle to enable/disable snap window suggestions. Alternate phrase for 'Split screen set up', 'Dock window', 'Snap window', 'Split screen overview'">
diff --git a/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_WELCOME_RECAP.png.sha1 b/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_WELCOME_RECAP.png.sha1
new file mode 100644
index 0000000..36b74435
--- /dev/null
+++ b/chrome/app/os_settings_search_tag_strings_grdp/IDS_OS_SETTINGS_TAG_WELCOME_RECAP.png.sha1
@@ -0,0 +1 @@
+46bc1db8b0908c8c8d557a9388a3b0ebdb821f29
\ No newline at end of file
diff --git a/chrome/app/resources/locale_settings.grd b/chrome/app/resources/locale_settings.grd
index b849b774..1ce5e1b 100644
--- a/chrome/app/resources/locale_settings.grd
+++ b/chrome/app/resources/locale_settings.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/resources/locale_settings_chromiumos.grd b/chrome/app/resources/locale_settings_chromiumos.grd
index 67414f6..9e9f546 100644
--- a/chrome/app/resources/locale_settings_chromiumos.grd
+++ b/chrome/app/resources/locale_settings_chromiumos.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/platform_locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/resources/locale_settings_google_chromeos.grd b/chrome/app/resources/locale_settings_google_chromeos.grd
index 08a1155..7060f5de 100644
--- a/chrome/app/resources/locale_settings_google_chromeos.grd
+++ b/chrome/app/resources/locale_settings_google_chromeos.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/platform_locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/resources/locale_settings_linux.grd b/chrome/app/resources/locale_settings_linux.grd
index 13ba52b..e174cc45 100644
--- a/chrome/app/resources/locale_settings_linux.grd
+++ b/chrome/app/resources/locale_settings_linux.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/platform_locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/resources/locale_settings_mac.grd b/chrome/app/resources/locale_settings_mac.grd
index abd3d520..e327a4f2 100644
--- a/chrome/app/resources/locale_settings_mac.grd
+++ b/chrome/app/resources/locale_settings_mac.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/platform_locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/app/resources/locale_settings_win.grd b/chrome/app/resources/locale_settings_win.grd
index 86222480..0f592827 100644
--- a/chrome/app/resources/locale_settings_win.grd
+++ b/chrome/app/resources/locale_settings_win.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/platform_locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/ai/ai_language_model.cc b/chrome/browser/ai/ai_language_model.cc
index 8beb2978..17a1ab0 100644
--- a/chrome/browser/ai/ai_language_model.cc
+++ b/chrome/browser/ai/ai_language_model.cc
@@ -348,7 +348,11 @@
   }
 
   if (response->has_value()) {
-    responder->OnStreaming(streaming_result);
+    responder->OnStreaming(
+        streaming_result,
+        should_stream_full_response
+            ? blink::mojom::ModelStreamingResponderAction::kReplace
+            : blink::mojom::ModelStreamingResponderAction::kAppend);
   }
   if (result.response->is_complete) {
     // TODO(crbug.com/351935390): instead of calculating this from the
@@ -394,6 +398,10 @@
     responder->OnContextOverflow();
   }
 
+  if (context_->HasContextItem()) {
+    session_->AddContext(*context_->MakeRequest());
+  }
+
   session_->ExecuteModel(
       *context_->MaybeFormatRequest(request),
       base::BindRepeating(&AILanguageModel::ModelExecutionCallback,
@@ -413,10 +421,6 @@
     return;
   }
 
-  if (context_->HasContextItem()) {
-    session_->AddContext(*context_->MakeRequest());
-  }
-
   // Clear the response from the previous execution.
   current_response_ = "";
   mojo::RemoteSetElementId responder_id =
diff --git a/chrome/browser/ai/ai_language_model_unittest.cc b/chrome/browser/ai/ai_language_model_unittest.cc
index 4874e02..036cca2 100644
--- a/chrome/browser/ai/ai_language_model_unittest.cc
+++ b/chrome/browser/ai/ai_language_model_unittest.cc
@@ -415,31 +415,12 @@
               return session;
             });
 
-    mojo::Remote<blink::mojom::AILanguageModel> mock_session;
-    AITestUtils::MockCreateLanguageModelClient
-        mock_create_language_model_client;
-    base::RunLoop creation_run_loop;
-    EXPECT_CALL(mock_create_language_model_client, OnResult(_, _))
-        .WillOnce([&](mojo::PendingRemote<blink::mojom::AILanguageModel>
-                          language_model,
-                      blink::mojom::AILanguageModelInfoPtr info) {
-          EXPECT_TRUE(language_model);
-          mock_session = mojo::Remote<blink::mojom::AILanguageModel>(
-              std::move(language_model));
-          creation_run_loop.Quit();
-        });
-
-    mojo::Remote<blink::mojom::AIManager> mock_remote = GetAIManagerRemote();
-
-    mock_remote->CreateLanguageModel(
-        mock_create_language_model_client.BindNewPipeAndPassRemote(),
-        blink::mojom::AILanguageModelCreateOptions::New());
-    creation_run_loop.Run();
+    mojo::Remote<blink::mojom::AILanguageModel> mock_session =
+        CreateMockSession();
 
     AITestUtils::MockModelStreamingResponder mock_responder;
 
     base::RunLoop responder_run_loop;
-    std::string response = std::string(kTestResponse);
 
     EXPECT_CALL(mock_responder, OnError(_))
         .WillOnce(testing::Invoke(
@@ -458,7 +439,6 @@
     responder_run_loop.Run();
   }
 
- private:
   optimization_guide::OptimizationGuideModelStreamingExecutionResult
   CreateExecutionResult(const std::string& output, bool is_complete) {
     optimization_guide::proto::StringValue response;
@@ -471,6 +451,123 @@
         /*provided_by_on_device=*/true);
   }
 
+  void TestSessionAddContext(bool should_overflow_context) {
+    SetupMockOptimizationGuideKeyedService();
+    // Use `max_context_token / 2 + 1` to ensure the
+    // context overflow on the second prompt.
+    uint32_t mock_size_in_tokens =
+        should_overflow_context
+            ? 1 + AITestUtils::GetFakeTokenLimits().max_context_tokens / 2
+            : 1;
+
+    EXPECT_CALL(*mock_optimization_guide_keyed_service_, StartSession(_, _))
+        .WillOnce([&](optimization_guide::ModelBasedCapabilityKey feature,
+                      const std::optional<
+                          optimization_guide::SessionConfigParams>&
+                          config_params) {
+          auto session = std::make_unique<
+              testing::NiceMock<optimization_guide::MockSession>>();
+
+          SetUpMockSession(*session, /*use_prompt_api_proto=*/false,
+                           IsModelStreamingChunkByChunk());
+
+          ON_CALL(*session, GetContextSizeInTokens(_, _))
+              .WillByDefault(
+                  [&](const google::protobuf::MessageLite& request_metadata,
+                      optimization_guide::
+                          OptimizationGuideModelSizeInTokenCallback callback) {
+                    std::move(callback).Run(mock_size_in_tokens);
+                  });
+
+          ON_CALL(*session, GetExecutionInputSizeInTokens(_, _))
+              .WillByDefault(
+                  [&](const google::protobuf::MessageLite& request_metadata,
+                      optimization_guide::
+                          OptimizationGuideModelSizeInTokenCallback callback) {
+                    std::move(callback).Run(mock_size_in_tokens);
+                  });
+
+          // If the context is overflow, the previous prompt history should not
+          // be added to the context.
+          EXPECT_CALL(*session, AddContext(_))
+              .Times(should_overflow_context ? 0 : 1);
+
+          EXPECT_CALL(*session, ExecuteModel(_, _))
+              .Times(2)
+              .WillOnce(
+                  [&](const google::protobuf::MessageLite& request_metadata,
+                      optimization_guide::
+                          OptimizationGuideModelExecutionResultStreamingCallback
+                              callback) {
+                    EXPECT_THAT(ToString(request_metadata), "User: A\nModel: ");
+                    callback.Run(
+                        CreateExecutionResult("OK", /*is_complete=*/true));
+                  })
+              .WillOnce(
+                  [&](const google::protobuf::MessageLite& request_metadata,
+                      optimization_guide::
+                          OptimizationGuideModelExecutionResultStreamingCallback
+                              callback) {
+                    EXPECT_THAT(ToString(request_metadata), "User: B\nModel: ");
+                    callback.Run(
+                        CreateExecutionResult("OK", /*is_complete=*/true));
+                  });
+          return session;
+        });
+
+    mojo::Remote<blink::mojom::AILanguageModel> mock_session =
+        CreateMockSession();
+
+    AITestUtils::MockModelStreamingResponder mock_responder_1;
+    AITestUtils::MockModelStreamingResponder mock_responder_2;
+
+    base::RunLoop responder_run_loop_1;
+    base::RunLoop responder_run_loop_2;
+
+    EXPECT_CALL(mock_responder_1, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "OK");
+              EXPECT_EQ(
+                  IsAPIStreamingChunkByChunk()
+                      ? blink::mojom::ModelStreamingResponderAction::kAppend
+                      : blink::mojom::ModelStreamingResponderAction::kReplace,
+                  action);
+            }));
+    EXPECT_CALL(mock_responder_2, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "OK");
+              EXPECT_EQ(
+                  IsAPIStreamingChunkByChunk()
+                      ? blink::mojom::ModelStreamingResponderAction::kAppend
+                      : blink::mojom::ModelStreamingResponderAction::kReplace,
+                  action);
+            }));
+
+    EXPECT_CALL(mock_responder_2, OnContextOverflow())
+        .Times(should_overflow_context ? 1 : 0);
+
+    EXPECT_CALL(mock_responder_1, OnCompletion(_))
+        .WillOnce(testing::Invoke(
+            [&](blink::mojom::ModelExecutionContextInfoPtr context_info) {
+              responder_run_loop_1.Quit();
+            }));
+    EXPECT_CALL(mock_responder_2, OnCompletion(_))
+        .WillOnce(testing::Invoke(
+            [&](blink::mojom::ModelExecutionContextInfoPtr context_info) {
+              responder_run_loop_2.Quit();
+            }));
+
+    mock_session->Prompt("A", mock_responder_1.BindNewPipeAndPassRemote());
+    responder_run_loop_1.Run();
+    mock_session->Prompt("B", mock_responder_2.BindNewPipeAndPassRemote());
+    responder_run_loop_2.Run();
+  }
+
+ private:
   void SetUpMockSession(
       testing::NiceMock<optimization_guide::MockSession>& session,
       bool use_prompt_api_proto,
@@ -537,18 +634,41 @@
 
     base::RunLoop responder_run_loop;
     std::string response = std::string(kTestResponse);
-    EXPECT_CALL(mock_responder, OnStreaming(_))
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
         .Times(3)
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, response.substr(0, 1));
-        }))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, IsAPIStreamingChunkByChunk() ? response.substr(1)
-                                                         : kTestResponse);
-        }))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, IsAPIStreamingChunkByChunk() ? "" : kTestResponse);
-        }));
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, response.substr(0, 1));
+              EXPECT_EQ(
+                  IsAPIStreamingChunkByChunk()
+                      ? blink::mojom::ModelStreamingResponderAction::kAppend
+                      : blink::mojom::ModelStreamingResponderAction::kReplace,
+                  action);
+            }))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, IsAPIStreamingChunkByChunk()
+                                    ? response.substr(1)
+                                    : kTestResponse);
+              EXPECT_EQ(
+                  IsAPIStreamingChunkByChunk()
+                      ? blink::mojom::ModelStreamingResponderAction::kAppend
+                      : blink::mojom::ModelStreamingResponderAction::kReplace,
+                  action);
+            }))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text,
+                          IsAPIStreamingChunkByChunk() ? "" : kTestResponse);
+              EXPECT_EQ(
+                  IsAPIStreamingChunkByChunk()
+                      ? blink::mojom::ModelStreamingResponderAction::kAppend
+                      : blink::mojom::ModelStreamingResponderAction::kReplace,
+                  action);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
@@ -560,6 +680,31 @@
     responder_run_loop.Run();
   }
 
+  mojo::Remote<blink::mojom::AILanguageModel> CreateMockSession() {
+    mojo::Remote<blink::mojom::AILanguageModel> mock_session;
+    AITestUtils::MockCreateLanguageModelClient
+        mock_create_language_model_client;
+    base::RunLoop creation_run_loop;
+    EXPECT_CALL(mock_create_language_model_client, OnResult(_, _))
+        .WillOnce([&](mojo::PendingRemote<blink::mojom::AILanguageModel>
+                          language_model,
+                      blink::mojom::AILanguageModelInfoPtr info) {
+          EXPECT_TRUE(language_model);
+          mock_session = mojo::Remote<blink::mojom::AILanguageModel>(
+              std::move(language_model));
+          creation_run_loop.Quit();
+        });
+
+    mojo::Remote<blink::mojom::AIManager> mock_remote = GetAIManagerRemote();
+
+    mock_remote->CreateLanguageModel(
+        mock_create_language_model_client.BindNewPipeAndPassRemote(),
+        blink::mojom::AILanguageModelCreateOptions::New());
+    creation_run_loop.Run();
+
+    return mock_session;
+  }
+
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
@@ -691,6 +836,18 @@
       }));
 }
 
+// Tests that the session will call `AddContext()` from the second prompt when
+// there is no context overflow.
+TEST_P(AILanguageModelTest, PromptWithHistoryWithoutContextOverflow) {
+  TestSessionAddContext(/*should_overflow_context=*/false);
+}
+
+// Tests that the session will not call `AddContext()` from the second prompt
+// when there is context overflow.
+TEST_P(AILanguageModelTest, PromptWithHistoryWithContextOverflow) {
+  TestSessionAddContext(/*should_overflow_context=*/true);
+}
+
 // Tests `AILanguageModel::Context` creation without initial prompts.
 TEST(AILanguageModelContextCreationTest, CreateContext_WithoutInitialPrompts) {
   AILanguageModel::Context context(kTestMaxContextToken, {},
diff --git a/chrome/browser/ai/ai_rewriter.cc b/chrome/browser/ai/ai_rewriter.cc
index 5feded53..fb8f13fa 100644
--- a/chrome/browser/ai/ai_rewriter.cc
+++ b/chrome/browser/ai/ai_rewriter.cc
@@ -96,7 +96,9 @@
   auto compose_response = optimization_guide::ParsedAnyMetadata<
       optimization_guide::proto::ComposeResponse>(result.response->response);
   if (compose_response) {
-    responder->OnStreaming(compose_response->output());
+    responder->OnStreaming(
+        compose_response->output(),
+        blink::mojom::ModelStreamingResponderAction::kReplace);
   }
   if (result.response->is_complete) {
     responder->OnCompletion(/*context_info=*/nullptr);
diff --git a/chrome/browser/ai/ai_rewriter_unittest.cc b/chrome/browser/ai/ai_rewriter_unittest.cc
index 3f8d763..d3c8b46 100644
--- a/chrome/browser/ai/ai_rewriter_unittest.cc
+++ b/chrome/browser/ai/ai_rewriter_unittest.cc
@@ -194,9 +194,14 @@
   AITestUtils::MockModelStreamingResponder mock_responder;
 
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_responder, OnStreaming(_))
+  EXPECT_CALL(mock_responder, OnStreaming(_, _))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "Result text"); }));
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Result text");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }));
 
   EXPECT_CALL(mock_responder, OnCompletion(_))
       .WillOnce(testing::Invoke(
@@ -622,8 +627,8 @@
 
                   callback.Run(
                       CreateExecutionResult("Result ", /*is_complete=*/false));
-                  callback.Run(
-                      CreateExecutionResult("text", /*is_complete=*/true));
+                  callback.Run(CreateExecutionResult("Result text",
+                                                     /*is_complete=*/true));
                 }));
         return session;
       }));
@@ -653,11 +658,21 @@
   AITestUtils::MockModelStreamingResponder mock_responder;
 
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_responder, OnStreaming(_))
+  EXPECT_CALL(mock_responder, OnStreaming(_, _))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "Result "); }))
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Result ");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "text"); }));
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Result text");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }));
 
   EXPECT_CALL(mock_responder, OnCompletion(_))
       .WillOnce(testing::Invoke(
@@ -741,10 +756,14 @@
   {
     AITestUtils::MockModelStreamingResponder mock_responder;
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_responder, OnStreaming(_))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, "Result text");
-        }));
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "Result text");
+              EXPECT_EQ(action,
+                        blink::mojom::ModelStreamingResponderAction::kReplace);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
@@ -759,10 +778,14 @@
   {
     AITestUtils::MockModelStreamingResponder mock_responder;
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_responder, OnStreaming(_))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, "Result text 2");
-        }));
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "Result text 2");
+              EXPECT_EQ(action,
+                        blink::mojom::ModelStreamingResponderAction::kReplace);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
diff --git a/chrome/browser/ai/ai_summarizer.cc b/chrome/browser/ai/ai_summarizer.cc
index 77928df..be94d47 100644
--- a/chrome/browser/ai/ai_summarizer.cc
+++ b/chrome/browser/ai/ai_summarizer.cc
@@ -91,7 +91,9 @@
   auto response = optimization_guide::ParsedAnyMetadata<
       optimization_guide::proto::StringValue>(result.response->response);
   if (response->has_value()) {
-    responder->OnStreaming(response->value());
+    responder->OnStreaming(
+        response->value(),
+        blink::mojom::ModelStreamingResponderAction::kReplace);
   }
   if (result.response->is_complete) {
     responder->OnCompletion(/*context_info=*/nullptr);
diff --git a/chrome/browser/ai/ai_summarizer_unittest.cc b/chrome/browser/ai/ai_summarizer_unittest.cc
index e966802..d0d8397 100644
--- a/chrome/browser/ai/ai_summarizer_unittest.cc
+++ b/chrome/browser/ai/ai_summarizer_unittest.cc
@@ -174,9 +174,14 @@
   AITestUtils::MockModelStreamingResponder mock_responder;
 
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_responder, OnStreaming(_))
+  EXPECT_CALL(mock_responder, OnStreaming(_, _))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "Test output"); }));
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Test output");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }));
 
   EXPECT_CALL(mock_responder, OnCompletion(_))
       .WillOnce(testing::Invoke(
@@ -254,10 +259,14 @@
     AITestUtils::MockModelStreamingResponder mock_responder;
 
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_responder, OnStreaming(_))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, "Test output1");
-        }));
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "Test output1");
+              EXPECT_EQ(action,
+                        blink::mojom::ModelStreamingResponderAction::kReplace);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
@@ -281,10 +290,14 @@
     AITestUtils::MockModelStreamingResponder mock_responder;
 
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_responder, OnStreaming(_))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, "Test output2");
-        }));
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "Test output2");
+              EXPECT_EQ(action,
+                        blink::mojom::ModelStreamingResponderAction::kReplace);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
diff --git a/chrome/browser/ai/ai_test_utils.h b/chrome/browser/ai/ai_test_utils.h
index 27ce3a2..e645fa7 100644
--- a/chrome/browser/ai/ai_test_utils.h
+++ b/chrome/browser/ai/ai_test_utils.h
@@ -32,7 +32,11 @@
     mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
     BindNewPipeAndPassRemote();
 
-    MOCK_METHOD(void, OnStreaming, (const std::string& text), (override));
+    MOCK_METHOD(void,
+                OnStreaming,
+                (const std::string& text,
+                 blink::mojom::ModelStreamingResponderAction action),
+                (override));
     MOCK_METHOD(void,
                 OnError,
                 (blink::mojom::ModelStreamingResponseStatus status),
diff --git a/chrome/browser/ai/ai_writer.cc b/chrome/browser/ai/ai_writer.cc
index 936bae65..3a9feca5 100644
--- a/chrome/browser/ai/ai_writer.cc
+++ b/chrome/browser/ai/ai_writer.cc
@@ -78,7 +78,9 @@
   auto compose_response = optimization_guide::ParsedAnyMetadata<
       optimization_guide::proto::ComposeResponse>(result.response->response);
   if (compose_response) {
-    responder->OnStreaming(compose_response->output());
+    responder->OnStreaming(
+        compose_response->output(),
+        blink::mojom::ModelStreamingResponderAction::kReplace);
   }
   if (result.response->is_complete) {
     responder->OnCompletion(/*context_info=*/nullptr);
diff --git a/chrome/browser/ai/ai_writer_unittest.cc b/chrome/browser/ai/ai_writer_unittest.cc
index 4695965..5c9a8192 100644
--- a/chrome/browser/ai/ai_writer_unittest.cc
+++ b/chrome/browser/ai/ai_writer_unittest.cc
@@ -343,9 +343,14 @@
   AITestUtils::MockModelStreamingResponder mock_responder;
 
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_responder, OnStreaming(_))
+  EXPECT_CALL(mock_responder, OnStreaming(_, _))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "Result text"); }));
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Result text");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }));
 
   EXPECT_CALL(mock_responder, OnCompletion(_))
       .WillOnce(testing::Invoke(
@@ -458,8 +463,8 @@
 
                   callback.Run(
                       CreateExecutionResult("Result ", /*is_complete=*/false));
-                  callback.Run(
-                      CreateExecutionResult("text", /*is_complete=*/true));
+                  callback.Run(CreateExecutionResult("Result text",
+                                                     /*is_complete=*/true));
                 }));
         return session;
       }));
@@ -489,11 +494,21 @@
   AITestUtils::MockModelStreamingResponder mock_responder;
 
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_responder, OnStreaming(_))
+  EXPECT_CALL(mock_responder, OnStreaming(_, _))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "Result "); }))
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Result ");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }))
       .WillOnce(testing::Invoke(
-          [&](const std::string& text) { EXPECT_THAT(text, "text"); }));
+          [&](const std::string& text,
+              blink::mojom::ModelStreamingResponderAction action) {
+            EXPECT_THAT(text, "Result text");
+            EXPECT_EQ(action,
+                      blink::mojom::ModelStreamingResponderAction::kReplace);
+          }));
 
   EXPECT_CALL(mock_responder, OnCompletion(_))
       .WillOnce(testing::Invoke(
@@ -576,10 +591,14 @@
   {
     AITestUtils::MockModelStreamingResponder mock_responder;
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_responder, OnStreaming(_))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, "Result text");
-        }));
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "Result text");
+              EXPECT_EQ(action,
+                        blink::mojom::ModelStreamingResponderAction::kReplace);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
@@ -594,10 +613,14 @@
   {
     AITestUtils::MockModelStreamingResponder mock_responder;
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_responder, OnStreaming(_))
-        .WillOnce(testing::Invoke([&](const std::string& text) {
-          EXPECT_THAT(text, "Result text 2");
-        }));
+    EXPECT_CALL(mock_responder, OnStreaming(_, _))
+        .WillOnce(testing::Invoke(
+            [&](const std::string& text,
+                blink::mojom::ModelStreamingResponderAction action) {
+              EXPECT_THAT(text, "Result text 2");
+              EXPECT_EQ(action,
+                        blink::mojom::ModelStreamingResponderAction::kReplace);
+            }));
 
     EXPECT_CALL(mock_responder, OnCompletion(_))
         .WillOnce(testing::Invoke(
diff --git a/chrome/browser/ash/app_restore/full_restore_service.cc b/chrome/browser/ash/app_restore/full_restore_service.cc
index 1422be03..688e57e 100644
--- a/chrome/browser/ash/app_restore/full_restore_service.cc
+++ b/chrome/browser/ash/app_restore/full_restore_service.cc
@@ -658,27 +658,27 @@
 
     InitInformedRestoreContentsData(dialog_type);
 
-      // Retrieves session service data from browser and app browsers, which
-      // will be used to display favicons and tab titles.
-      SessionServiceBase* service =
-          SessionServiceFactory::GetForProfileForSessionRestore(profile_);
-      SessionServiceBase* app_service =
-          AppSessionServiceFactory::GetForProfileForSessionRestore(profile_);
-      if (service && app_service) {
-        auto barrier = base::BarrierCallback<SessionWindows>(
-            /*num_callbacks=*/2u, /*done_callback=*/base::BindOnce(
-                &FullRestoreService::OnGotAllSessionsAsh,
-                weak_ptr_factory_.GetWeakPtr()));
+    // Retrieves session service data from browser and app browsers, which
+    // will be used to display favicons and tab titles.
+    SessionServiceBase* service =
+        SessionServiceFactory::GetForProfileForSessionRestore(profile_);
+    SessionServiceBase* app_service =
+        AppSessionServiceFactory::GetForProfileForSessionRestore(profile_);
+    if (service && app_service) {
+      auto barrier = base::BarrierCallback<SessionWindows>(
+          /*num_callbacks=*/2u, /*done_callback=*/base::BindOnce(
+              &FullRestoreService::OnGotAllSessionsAsh,
+              weak_ptr_factory_.GetWeakPtr()));
 
-        service->GetLastSession(
-            base::BindOnce(&FullRestoreService::OnGotSessionAsh,
-                           weak_ptr_factory_.GetWeakPtr(), barrier));
-        app_service->GetLastSession(
-            base::BindOnce(&FullRestoreService::OnGotSessionAsh,
-                           weak_ptr_factory_.GetWeakPtr(), barrier));
-      } else {
-        OnGotAllSessionsAsh(/*all_session_windows=*/{});
-      }
+      service->GetLastSession(
+          base::BindOnce(&FullRestoreService::OnGotSessionAsh,
+                         weak_ptr_factory_.GetWeakPtr(), barrier));
+      app_service->GetLastSession(
+          base::BindOnce(&FullRestoreService::OnGotSessionAsh,
+                         weak_ptr_factory_.GetWeakPtr(), barrier));
+    } else {
+      OnGotAllSessionsAsh(/*all_session_windows=*/{});
+    }
 
     // Set to true as we might want to show the post reboot notification.
     show_notification = true;
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer.cc b/chrome/browser/autofill/automated_tests/cache_replayer.cc
index 2c3d5db0..6145757 100644
--- a/chrome/browser/autofill/automated_tests/cache_replayer.cc
+++ b/chrome/browser/autofill/automated_tests/cache_replayer.cc
@@ -614,13 +614,9 @@
 std::ostream& operator<<(std::ostream& out,
                          const autofill::AutofillPageQueryRequest& query) {
   for (const auto& form : query.forms()) {
-    out << "\nForm\n signature: " << form.signature();
+    out << "\nForm signature: " << form.signature();
     for (const auto& field : form.fields()) {
-      out << "\n Field\n  signature: " << field.signature();
-      if (!field.name().empty())
-        out << "\n  name: " << field.name();
-      if (!field.control_type().empty())
-        out << "\n  control_type: " << field.control_type();
+      out << "\n Field signature: " << field.signature();
     }
   }
   return out;
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 9e2507b1b..acfef46 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/browser_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 4005b7b..c0e65f8f 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -63,7 +63,6 @@
 #include "components/shared_highlighting/core/common/shared_highlighting_features.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
-#include "components/supervised_user/core/common/features.h"
 #include "components/sync/base/features.h"
 #include "components/sync_sessions/features.h"
 #include "components/visited_url_ranking/public/features.h"
@@ -404,7 +403,6 @@
     &send_tab_to_self::kSendTabToSelfV2,
     &sensitive_content::features::kSensitiveContent,
     &sensitive_content::features::kSensitiveContentWhileSwitchingTabs,
-    &supervised_user::kKidFriendlyContentFeed,
     &switches::kForceStartupSigninPromo,
     &switches::kForceDisableExtendedSyncPromos,
     &sync_sessions::kOptimizeAssociateWindowsAndroid,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 9ce634f4..6b1f766 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -368,7 +368,6 @@
     public static final String IP_PROTECTION_V1 = "IpProtectionV1";
     public static final String IP_PROTECTION_UX = "IpProtectionUx";
     public static final String IP_PROTECTION_USER_BYPASS = "IpProtectionUserBypass";
-    public static final String KID_FRIENDLY_CONTENT_FEED = "KidFriendlyContentFeed";
     public static final String LENS_ON_QUICK_ACTION_SEARCH_WIDGET = "LensOnQuickActionSearchWidget";
     public static final String LINKED_SERVICES_SETTING = "LinkedServicesSetting";
     public static final String LOADING_PREDICTOR_LIMIT_PRECONNECT_SOCKET_COUNT =
diff --git a/chrome/browser/on_device_translation/service_controller.cc b/chrome/browser/on_device_translation/service_controller.cc
index 02a71c44..9f156c2 100644
--- a/chrome/browser/on_device_translation/service_controller.cc
+++ b/chrome/browser/on_device_translation/service_controller.cc
@@ -83,6 +83,8 @@
       return CreateTranslatorError::kFailedToInitialize;
     case CreateTranslatorResult::kErrorFailedToCreateTranslator:
       return CreateTranslatorError::kFailedToCreateTranslator;
+    case CreateTranslatorResult::kErrorInvalidVersion:
+      return CreateTranslatorError::kInvalidVersion;
   }
 }
 
@@ -457,7 +459,6 @@
                                std::back_inserter(to_be_registered_packs));
 }
 
-
 void OnDeviceTranslationServiceController::OnServiceIdle() {
   service_remote_.reset();
 }
diff --git a/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
index 7d5954e..e56038ec 100644
--- a/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
@@ -697,7 +697,7 @@
       content::NavigateToURL(web_contents(), GURL(url::kAboutBlankURL)));
 
   std::string histogram_name = prerender_helper_.GenerateHistogramName(
-      "PageLoad.Internal.Prerender2.DomContentLoadedToActivation2",
+      "PageLoad.Internal.Prerender2.DomContentLoadedToActivation3",
       content::PreloadingTriggerType::kSpeculationRule, "");
   histogram_tester().ExpectTotalCount(histogram_name, 1);
   // We shift the duration by the 1 minute when recording the metric.
@@ -765,7 +765,7 @@
   ASSERT_TRUE(
       content::NavigateToURL(web_contents(), GURL(url::kAboutBlankURL)));
   std::string histogram_name = prerender_helper_.GenerateHistogramName(
-      "PageLoad.Internal.Prerender2.DomContentLoadedToActivation2",
+      "PageLoad.Internal.Prerender2.DomContentLoadedToActivation3",
       content::PreloadingTriggerType::kSpeculationRule, "");
   histogram_tester().ExpectTotalCount(histogram_name, 1);
   // We shift the duration by the 1 minute when recording the metric.
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
index c7496ec7..d837b77 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
@@ -152,6 +152,8 @@
     // This will be deleted soon.
     return;
   }
+  TRACE_EVENT0("loading",
+               "StreamingSearchPrefetchURLLoader::ResponseReader::PushData");
   while (true) {
     std::string_view response_data =
         loader_->GetMoreDataFromCache(write_position_);
@@ -669,6 +671,7 @@
   // as we are at the intermediate state during refactoring.
   DCHECK(forwarding_client_);
   DCHECK(!streaming_prefetch_request_);
+  TRACE_EVENT0("loading", "StreamingSearchPrefetchURLLoader::PushData");
   while (true) {
     std::string_view response_data = GetMoreDataFromCache(write_position_);
 
diff --git a/chrome/browser/resources/accessibility/strings/extension_strings.grd b/chrome/browser/resources/accessibility/strings/extension_strings.grd
index 06356f2..5658cd2 100644
--- a/chrome/browser/resources/accessibility/strings/extension_strings.grd
+++ b/chrome/browser/resources/accessibility/strings/extension_strings.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <grit base_dir="." current_release="1" latest_public_release="0"
-      output_all_resource_defines="false" enc_check="möl" source_lang_id="en">
+      enc_check="möl" source_lang_id="en">
   <outputs>
     <output filename="_locales/af/messages.json.gz" type="chrome_messages_json_gzip" lang="af"/>
     <output filename="_locales/am/messages.json.gz" type="chrome_messages_json_gzip" lang="am"/>
diff --git a/chrome/browser/resources/app_icon/app_icon_resources.grd b/chrome/browser/resources/app_icon/app_icon_resources.grd
index baafe99..fa70956 100644
--- a/chrome/browser/resources/app_icon/app_icon_resources.grd
+++ b/chrome/browser/resources/app_icon/app_icon_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/app_icon_resources.h" type="rc_header" context="default_100_percent">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.html b/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.html
index 6ed1cbf5..2b091458 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.html
+++ b/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.html
@@ -50,53 +50,12 @@
       The option values needs to corresponds to the int value of the mojo enum JpPosType.
     -->
     <select id="posDropdownMenu" class="md-select" class="entry-input" on-change="onOptionChanged_">
-       <!-- LINT.IfChange(JpPosType) -->
-       <option value="0" selected>品詞なし</option>
-       <option value="1">名詞</option>
-       <option value="2">短縮よみ</option>
-       <option value="3">サジェストのみ</option>
-       <option value="4">固有名詞</option>
-       <option value="5">人名</option>
-       <option value="6">姓</option>
-       <option value="7">名</option>
-       <option value="8">組織</option>
-       <option value="9">地名</option>
-       <option value="10">名詞サ変</option>
-       <option value="11">名詞形動</option>
-       <option value="12">数</option>
-       <option value="13">アルファベット</option>
-       <option value="14">記号</option>
-       <option value="15">顔文字</option>
-       <option value="16">副詞</option>
-       <option value="17">連体詞</option>
-       <option value="18">接続詞</option>
-       <option value="19">感動詞</option>
-       <option value="20">接頭語</option>
-       <option value="21">助数詞</option>
-       <option value="22">接尾一般</option>
-       <option value="23">接尾人名</option>
-       <option value="24">接尾地名</option>
-       <option value="25">動詞ワ行五段</option>
-       <option value="26">動詞カ行五段</option>
-       <option value="27">動詞サ行五段</option>
-       <option value="28">動詞タ行五段</option>
-       <option value="29">動詞ナ行五段</option>
-       <option value="30">動詞マ行五段</option>
-       <option value="31">動詞ラ行五段</option>
-       <option value="32">動詞ガ行五段</option>
-       <option value="33">動詞バ行五段</option>
-       <option value="34">動詞ハ行四段</option>
-       <option value="35">動詞一段</option>
-       <option value="36">動詞カ変</option>
-       <option value="37">動詞サ変</option>
-       <option value="38">動詞ザ変</option>
-       <option value="39">動詞ラ変</option>
-       <option value="40">形容詞</option>
-       <option value="41">終助詞</option>
-       <option value="42">句読点</option>
-       <option value="43">独立語</option>
-       <option value="44">抑制単語</option>
-       <!-- LINT.ThenChange(//chromeos/ash/services/ime/public/mojom/user_data_japanese_dictionary.mojom:JpPosType) -->
+       <template is="dom-repeat" items="[[posTypeOptions_]]">
+         <option value="[[item.value]]"
+            selected="[[isSelectedOption_(item.value)]]">
+           [[item.label]]
+         </option>
+       </template>
     </select>
   </div>
   <cr-input value="[[entry.comment]]"
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.ts b/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.ts
index 9c1eaee4..ce379eb9 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.ts
+++ b/chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.ts
@@ -12,10 +12,15 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import type {JapaneseDictionaryEntry} from '../mojom-webui/user_data_japanese_dictionary.mojom-webui.js';
+import {JpPosType} from '../mojom-webui/user_data_japanese_dictionary.mojom-webui.js';
 
 import {getTemplate} from './os_japanese_dictionary_entry_row.html.js';
 import {UserDataServiceProvider} from './user_data_service_provider.js';
 
+interface DropdownOption {
+  value: JpPosType;
+  label: string;
+}
 
 interface OsJapaneseDictionaryEntryRowElement {
   $: {
@@ -24,6 +29,56 @@
 }
 
 class OsJapaneseDictionaryEntryRowElement extends PolymerElement {
+  // LINT.IfChange(JpPosType)
+  private readonly posTypeOptions_: DropdownOption[] = [
+    {value: JpPosType.kNoPos, label: '品詞なし'},
+    {value: JpPosType.kNoun, label: '名詞'},
+    {value: JpPosType.kAbbreviation, label: '短縮よみ'},
+    {value: JpPosType.kSuggestionOnly, label: 'サジェストのみ'},
+    {value: JpPosType.kProperNoun, label: '固有名詞'},
+    {value: JpPosType.kPersonalName, label: '人名'},
+    {value: JpPosType.kFamilyName, label: '姓'},
+    {value: JpPosType.kFirstName, label: '名'},
+    {value: JpPosType.kOrganizationName, label: '組織'},
+    {value: JpPosType.kPlaceName, label: '地名'},
+    {value: JpPosType.kSaIrregularConjugationNoun, label: '名詞サ変'},
+    {value: JpPosType.kAdjectiveVerbalNoun, label: '名詞形動'},
+    {value: JpPosType.kNumber, label: '数'},
+    {value: JpPosType.kAlphabet, label: 'アルファベット'},
+    {value: JpPosType.kSymbol, label: '記号'},
+    {value: JpPosType.kEmoticon, label: '顔文字'},
+    {value: JpPosType.kAdverb, label: '副詞'},
+    {value: JpPosType.kPrenounAdjectival, label: '連体詞'},
+    {value: JpPosType.kConjunction, label: '接続詞'},
+    {value: JpPosType.kInterjection, label: '感動詞'},
+    {value: JpPosType.kPrefix, label: '接頭語'},
+    {value: JpPosType.kCounterSuffix, label: '助数詞'},
+    {value: JpPosType.kGenericSuffix, label: '接尾一般'},
+    {value: JpPosType.kPersonNameSuffix, label: '接尾人名'},
+    {value: JpPosType.kPlaceNameSuffix, label: '接尾地名'},
+    {value: JpPosType.kWaGroup1Verb, label: '動詞ワ行五段'},
+    {value: JpPosType.kKaGroup1Verb, label: '動詞カ行五段'},
+    {value: JpPosType.kSaGroup1Verb, label: '動詞サ行五段'},
+    {value: JpPosType.kTaGroup1Verb, label: '動詞タ行五段'},
+    {value: JpPosType.kNaGroup1Verb, label: '動詞ナ行五段'},
+    {value: JpPosType.kMaGroup1Verb, label: '動詞マ行五段'},
+    {value: JpPosType.kRaGroup1Verb, label: '動詞ラ行五段'},
+    {value: JpPosType.kGaGroup1Verb, label: '動詞ガ行五段'},
+    {value: JpPosType.kBaGroup1Verb, label: '動詞バ行五段'},
+    {value: JpPosType.kHaGroup1Verb, label: '動詞ハ行四段'},
+    {value: JpPosType.kGroup2Verb, label: '動詞一段'},
+    {value: JpPosType.kKuruGroup3Verb, label: '動詞カ変'},
+    {value: JpPosType.kSuruGroup3Verb, label: '動詞サ変'},
+    {value: JpPosType.kZuruGroup3Verb, label: '動詞ザ変'},
+    {value: JpPosType.kRuGroup3Verb, label: '動詞ラ変'},
+    {value: JpPosType.kAdjective, label: '形容詞'},
+    {value: JpPosType.kSentenceEndingParticle, label: '終助詞'},
+    {value: JpPosType.kPunctuation, label: '句読点'},
+    {value: JpPosType.kFreeStandingWord, label: '独立語'},
+    {value: JpPosType.kSuppressionWord, label: '抑制単語'},
+  ];
+  // LINT.ThenChange(//chromeos/ash/services/ime/public/mojom/user_data_japanese_dictionary.mojom:JpPosType)
+
   static get is() {
     return 'os-japanese-dictionary-entry-row' as const;
   }
@@ -85,6 +140,10 @@
     this.saveEntryToDictionary_();
   }
 
+  private isSelectedOption_(value: JpPosType): boolean {
+    return this.entry.pos === value;
+  }
+
   private async deleteEntry_(): Promise<void> {
     const dictionarySaved =
         (await UserDataServiceProvider.getRemote()
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd
index 26c7294..c8dfdba3 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <grit base_dir="." current_release="1" latest_public_release="0"
-      output_all_resource_defines="false" enc_check="möl" source_lang_id="en">
+      enc_check="möl" source_lang_id="en">
   <outputs>
     <output filename="_locales/af/messages.json.gz" type="chrome_messages_json_gzip" lang="af"/>
     <output filename="_locales/am/messages.json.gz" type="chrome_messages_json_gzip" lang="am"/>
diff --git a/chrome/browser/resources/chromeos/app_icon/app_icon_resources.grd b/chrome/browser/resources/chromeos/app_icon/app_icon_resources.grd
index 39c47005..455401e 100644
--- a/chrome/browser/resources/chromeos/app_icon/app_icon_resources.grd
+++ b/chrome/browser/resources/chromeos/app_icon/app_icon_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/chromeos_app_icon_resources.h" type="rc_header" context="default_100_percent">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/resources/chromeos/mako/resources.grd b/chrome/browser/resources/chromeos/mako/resources.grd
index cd85803..0ab32fe3 100644
--- a/chrome/browser/resources/chromeos/mako/resources.grd
+++ b/chrome/browser/resources/chromeos/mako/resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/orca_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/resources/chromeos/seal/resources.grd b/chrome/browser/resources/chromeos/seal/resources.grd
index 658c11b..8c42e8a 100644
--- a/chrome/browser/resources/chromeos/seal/resources.grd
+++ b/chrome/browser/resources/chromeos/seal/resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/seal_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/resources/component_extension_resources.grd b/chrome/browser/resources/component_extension_resources.grd
index 7c8bac0..85b7fb06 100644
--- a/chrome/browser/resources/component_extension_resources.grd
+++ b/chrome/browser/resources/component_extension_resources.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- This comment is only here because changes to resources are not picked up
      without changes to the corresponding grd file.  -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/component_extension_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/resources/office_web_app/resources.grd b/chrome/browser/resources/office_web_app/resources.grd
index de2ac956..57cec92 100644
--- a/chrome/browser/resources/office_web_app/resources.grd
+++ b/chrome/browser/resources/office_web_app/resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/office_web_app_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/resources/preinstalled_web_apps/resources.grd b/chrome/browser/resources/preinstalled_web_apps/resources.grd
index 2352ff9..ae49b25 100644
--- a/chrome/browser/resources/preinstalled_web_apps/resources.grd
+++ b/chrome/browser/resources/preinstalled_web_apps/resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/preinstalled_web_apps_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoCoordinator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoCoordinator.java
index ac51079b..17534ed 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoCoordinator.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoCoordinator.java
@@ -9,6 +9,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import org.chromium.base.ResettersForTesting;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.services.ProfileDataCache;
@@ -24,17 +25,25 @@
 
 /** Coordinator for the signin promo card. */
 public final class SigninPromoCoordinator {
+    private static boolean sPromoDisabledForTesting;
     private final Context mContext;
     private final SigninPromoDelegate mDelegate;
     private final SigninPromoMediator mMediator;
     private ImpressionTracker mImpressionTracker;
     private PropertyModelChangeProcessor mPropertyModelChangeProcessor;
 
+    /** Disables promo in tests. */
+    public static void disablePromoForTesting() {
+        sPromoDisabledForTesting = true;
+        ResettersForTesting.register(() -> sPromoDisabledForTesting = false);
+    }
+
     /**
      * Creates an instance of the {@link SigninPromoCoordinator}.
      *
      * @param context The Android {@link Context}.
-     * @param profile A {@link Profile} object to access identity services.
+     * @param profile A {@link Profile} object to access identity services. This must be the
+     *     original profile, not the incognito one.
      * @param delegate A {@link SigninPromoDelegate} to customize the view.
      */
     public SigninPromoCoordinator(Context context, Profile profile, SigninPromoDelegate delegate) {
@@ -68,7 +77,7 @@
 
     /** Determines whether the signin promo can be shown. */
     public boolean canShowPromo() {
-        return mMediator.canShowPromo();
+        return !sPromoDisabledForTesting && mMediator.canShowPromo();
     }
 
     /** Builds a promo view object for the corresponding access point. */
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index e4f83df5..313a303 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -30,7 +30,7 @@
   * Action bar items - 32 characters
 -->
 
-<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output filename="values-af/android_chrome_strings.xml" lang="af" type="android" />
     <output filename="values-am/android_chrome_strings.xml" lang="am" type="android" />
@@ -4050,18 +4050,6 @@
       <message name="IDS_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
         Discover by Google - off
       </message>
-      <message name="IDS_SUPERVISED_USER_NTP_DISCOVER_ON" desc="Title in the feed header when the feed is turned on for a supervised user. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
-        Content for young minds
-      </message>
-      <message name="IDS_SUPERVISED_USER_NTP_DISCOVER_ON_BRANDED" desc="Title in the feed header when the feed is turned on for a supervised user and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
-        Content by Google for young minds
-      </message>
-      <message name="IDS_SUPERVISED_USER_NTP_DISCOVER_OFF" desc="Title in the feed header when the feed is turned off for a supervised user. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
-        Content for young minds - off
-      </message>
-      <message name="IDS_SUPERVISED_USER_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off for a supervised user and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
-        Content by Google for young minds - off
-      </message>
 
       <message name="IDS_NTP_FOLLOWING"
         meaning="Title for content - e.g. Followed sites"
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_OFF.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_OFF.png.sha1
deleted file mode 100644
index 5be2f500..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_OFF.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f267ff118a7245972017cac864cf3d2fe1192fed
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_OFF_BRANDED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_OFF_BRANDED.png.sha1
deleted file mode 100644
index 8b93bea..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_OFF_BRANDED.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2d682451a5f2507d8d5be1f761890de553057e6b
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_ON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_ON.png.sha1
deleted file mode 100644
index 1cb1e75f..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_ON.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-19cac7bc8312aa5b0395aa3263675574d0b29110
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_ON_BRANDED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_ON_BRANDED.png.sha1
deleted file mode 100644
index f1c43816..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SUPERVISED_USER_NTP_DISCOVER_ON_BRANDED.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-ee30d24ba05d105e043a24c01e51d2bb1b64f005
\ No newline at end of file
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_factory.cc b/chrome/browser/ui/views/permissions/permission_prompt_factory.cc
index a5c99f8..641926d 100644
--- a/chrome/browser/ui/views/permissions/permission_prompt_factory.cc
+++ b/chrome/browser/ui/views/permissions/permission_prompt_factory.cc
@@ -23,6 +23,7 @@
 #include "chrome/common/webui_url_constants.h"
 #include "components/permissions/permission_request.h"
 #include "components/permissions/permission_uma_util.h"
+#include "components/permissions/permission_util.h"
 #include "components/permissions/request_type.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
@@ -134,26 +135,6 @@
       });
 }
 
-bool ShouldCurrentRequestUsePermissionElementSecondaryUI(
-    permissions::PermissionPrompt::Delegate* delegate) {
-  if (!base::FeatureList::IsEnabled(blink::features::kPermissionElement)) {
-    return false;
-  }
-
-  std::vector<raw_ptr<permissions::PermissionRequest, VectorExperimental>>
-      requests = delegate->Requests();
-  return base::ranges::all_of(
-      requests, [](permissions::PermissionRequest* request) {
-        return (request->request_type() ==
-                    permissions::RequestType::kCameraStream ||
-                request->request_type() ==
-                    permissions::RequestType::kGeolocation ||
-                request->request_type() ==
-                    permissions::RequestType::kMicStream) &&
-               request->IsEmbeddedPermissionElementInitiated();
-      });
-}
-
 bool ShouldCurrentRequestUseExclusiveAccessUI(
     permissions::PermissionPrompt::Delegate* delegate) {
   std::vector<raw_ptr<permissions::PermissionRequest, VectorExperimental>>
@@ -171,7 +152,8 @@
     Browser* browser,
     content::WebContents* web_contents,
     permissions::PermissionPrompt::Delegate* delegate) {
-  if (ShouldCurrentRequestUsePermissionElementSecondaryUI(delegate)) {
+  if (permissions::PermissionUtil::
+          ShouldCurrentRequestUsePermissionElementSecondaryUI(delegate)) {
     return std::make_unique<EmbeddedPermissionPrompt>(browser, web_contents,
                                                       delegate);
   } else if (delegate->ShouldCurrentRequestUseQuietUI()) {
@@ -192,7 +174,9 @@
   if (ShouldCurrentRequestUseExclusiveAccessUI(delegate)) {
     return std::make_unique<ExclusiveAccessPermissionPrompt>(
         browser, web_contents, delegate);
-  } else if (ShouldCurrentRequestUsePermissionElementSecondaryUI(delegate)) {
+  } else if (permissions::PermissionUtil::
+                 ShouldCurrentRequestUsePermissionElementSecondaryUI(
+                     delegate)) {
     return std::make_unique<EmbeddedPermissionPrompt>(browser, web_contents,
                                                       delegate);
   } else if (ShouldUseChip(delegate) && IsLocationBarDisplayed(browser)) {
diff --git a/chrome/browser/ui/webui/ash/settings/pages/system_preferences/startup_section.cc b/chrome/browser/ui/webui/ash/settings/pages/system_preferences/startup_section.cc
index 136d537..beef104 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/system_preferences/startup_section.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/system_preferences/startup_section.cc
@@ -31,7 +31,8 @@
        mojom::SearchResultDefaultRank::kMedium,
        mojom::SearchResultType::kSetting,
        {.setting = mojom::Setting::kRestoreAppsAndPages},
-       {IDS_OS_SETTINGS_TAG_ON_STARTUP, SearchConcept::kAltTagEnd}},
+       {IDS_OS_SETTINGS_TAG_ON_STARTUP, IDS_OS_SETTINGS_TAG_WELCOME_RECAP,
+        SearchConcept::kAltTagEnd}},
   });
   return *tags;
 }
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
index aef517e..c1067318 100644
--- a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
@@ -10,6 +10,9 @@
 #include <vector>
 
 #include "base/containers/contains.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
@@ -756,6 +759,8 @@
   const GURL kIconUrl = GURL("https://example.com/icon.png");
   static constexpr SkColor kIconColor = SK_ColorCYAN;
   const std::u16string kPageTitle = u"Page Title";
+  const base::FilePath kUnmaskableFavicon{
+      FILE_PATH_LITERAL("chrome/test/data/web_apps/slack_favicon.png")};
 
   ~FetchManifestAndInstallCommandUniversalInstallTest() override = default;
 
@@ -803,14 +808,24 @@
       webapps::InstallResultCode::kSuccessNewInstall);
 }
 
+gfx::Image LoadTestPNG(const base::FilePath::CharType* path) {
+  base::FilePath data_root;
+  base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &data_root);
+  base::FilePath image_path = data_root.Append(path);
+  std::string png_data;
+  ReadFileToString(image_path, &png_data);
+  return gfx::Image::CreateFrom1xPNGBytes(base::as_byte_span(png_data));
+}
+
+using FaviconOptions = absl::variant<absl::monostate, SkColor, base::FilePath>;
+
 using ManifestConfig = std::tuple<
     /*app_name=*/std::optional<std::u16string>,
-    /*favicon=*/std::optional<SkColor>,
+    /*favicon=*/FaviconOptions,
     /*start_url=*/std::optional<GURL>,
     /*manifest_id=*/std::optional<webapps::ManifestId>,
     /*display_mode=*/std::optional<blink::mojom::DisplayMode>,
     /*manifest_icons=*/std::optional<blink::Manifest::ImageResource>>;
-
 class UniversalInstallComboTest
     : public FetchManifestAndInstallCommandUniversalInstallTest,
       public testing::WithParamInterface<ManifestConfig> {
@@ -832,7 +847,11 @@
          std::get<0>(config) ? base::UTF16ToUTF8(std::get<0>(config).value())
                              : "Absent",
          "_Favicon",
-         std::get<1>(config) ? ui::SkColorName(*std::get<1>(config)) : "Absent",
+         absl::holds_alternative<absl::monostate>(std::get<1>(config))
+             ? "Absent"
+         : absl::holds_alternative<SkColor>(std::get<1>(config))
+             ? ui::SkColorName(absl::get<SkColor>(std::get<1>(config)))
+             : "IconPathSpecified",
          "_StartUrl", std::get<2>(config) ? "Specified" : "Absent",
          "_ManifestId", std::get<3>(config) ? "Specified" : "Absent",
          "_DisplayMode",
@@ -846,8 +865,21 @@
     return std::get<std::optional<std::u16string>>(GetParam());
   }
   std::optional<SkColor> GetFaviconColor() {
-    return std::get<std::optional<SkColor>>(GetParam());
+    auto param = std::get<1>(GetParam());
+    if (!absl::holds_alternative<SkColor>(param)) {
+      return std::nullopt;
+    }
+    return absl::get<SkColor>(param);
   }
+  std::optional<std::string> GetFaviconFilePath() {
+    auto param = std::get<1>(GetParam());
+    if (!absl::holds_alternative<base::FilePath>(param)) {
+      return std::nullopt;
+    }
+    base::FilePath file_path = absl::get<base::FilePath>(param);
+    return file_path.AsUTF8Unsafe();
+  }
+
   std::optional<GURL> GetStartUrl() { return std::get<2>(GetParam()); }
   std::optional<webapps::ManifestId> GetManifestIdentity() {
     return std::get<3>(GetParam());
@@ -884,13 +916,18 @@
   SkBitmap GenerateExpected256Icon() {
     if (GetIcon() && !base::Contains(GetIcon()->src.spec(), "not_found")) {
       return CreateSquareIcon(icon_size::k256, kIconColor);
-    } else if (IsDiyApp() && GetFaviconColor()) {
-      return CreateSquareIcon(icon_size::k256, GetFaviconColor().value());
-    } else {
-      // This generates the letter icons.
-      return GenerateIcons(base::UTF16ToUTF8(
-          GetAppName().value_or(kPageTitle)))[icon_size::k256];
+    } else if (IsDiyApp()) {
+      if (GetFaviconColor()) {
+        return CreateSquareIcon(icon_size::k256, GetFaviconColor().value());
+      } else if (GetFaviconFilePath()) {
+        gfx::Image favicon_icon =
+            LoadTestPNG(kUnmaskableFavicon.value().c_str());
+        return favicon_icon.AsBitmap();
+      }
     }
+    // This generates the letter icons.
+    return GenerateIcons(
+        base::UTF16ToUTF8(GetAppName().value_or(kPageTitle)))[icon_size::k256];
   }
 
   void SetupPageFromParams() {
@@ -901,6 +938,10 @@
       page_state.favicon = {CreateSquareIcon(32, GetFaviconColor().value()),
                             CreateSquareIcon(64, GetFaviconColor().value()),
                             CreateSquareIcon(256, GetFaviconColor().value())};
+    } else if (GetFaviconFilePath()) {
+      page_state.favicon_url = kFaviconUrl;
+      gfx::Image test_icon = LoadTestPNG(kUnmaskableFavicon.value().c_str());
+      page_state.favicon = {test_icon.AsBitmap()};
     }
     page_state.manifest_before_default_processing =
         blink::mojom::Manifest::New();
@@ -957,6 +998,41 @@
   }
 
   SkBitmap GetExpectedPlatformIconAtSize(int width) {
+#if BUILDFLAG(IS_MAC)
+    if (IsDiyApp()) {
+      if (GetIcon().has_value() &&
+          !base::Contains(GetIcon()->src.spec(), "not_found") &&
+          !base::Contains(GetIcon()->src.spec(), "Absent")) {
+        gfx::Image test_icon = LoadTestPNG(FILE_PATH_LITERAL(
+            "chrome/test/data/web_apps/diyapp_icon_image.png"));
+        SkBitmap test_bitmap = test_icon.AsBitmap();
+        return test_bitmap;
+      }
+      auto favicon_path = GetFaviconFilePath();
+      if (favicon_path && base::Contains(*favicon_path, "slack")) {
+        gfx::Image test_icon = LoadTestPNG(FILE_PATH_LITERAL(
+            "chrome/test/data/web_apps/masked_slack_favicon.png"));
+        SkBitmap test_bitmap = test_icon.AsBitmap();
+        return test_bitmap;
+      }
+      if (GetFaviconColor() == SK_ColorBLUE) {
+        gfx::Image test_icon = LoadTestPNG(FILE_PATH_LITERAL(
+            "chrome/test/data/web_apps/diyapp_blue_image.png"));
+        SkBitmap test_bitmap = test_icon.AsBitmap();
+        return test_bitmap;
+      }
+      if (GetAppName() == u"AppName") {
+        gfx::Image test_icon = LoadTestPNG(FILE_PATH_LITERAL(
+            "chrome/test/data/web_apps/diyapp_textA_image.png"));
+        SkBitmap test_bitmap = test_icon.AsBitmap();
+        return test_bitmap;
+      }
+      gfx::Image test_icon = LoadTestPNG(FILE_PATH_LITERAL(
+          "chrome/test/data/web_apps/diyapp_textP_image.png"));
+      SkBitmap test_bitmap = test_icon.AsBitmap();
+      return test_bitmap;
+    }
+#endif
     // Note: These should be static test images instead of dynamically
     // generating these using the same production code.
     if (GetIcon().has_value() &&
@@ -1041,13 +1117,11 @@
   // reading code above is not consistent.
   // TODO(https://crbug.com/372688523): Implement icon checks for masked DIY app
   // icons.
-  if (!IsDiyApp()) {
-    EXPECT_THAT(*bitmap, gfx::test::EqualsBitmap(
-                             GetExpectedPlatformIconAtSize(bitmap->width())))
-        << bitmap->width() << "x" << bitmap->height() << ", with center color "
-        << ui::SkColorName(
-               bitmap->getColor(bitmap->width() / 2, bitmap->height() / 2));
-  }
+  EXPECT_THAT(*bitmap, gfx::test::EqualsBitmap(
+                           GetExpectedPlatformIconAtSize(bitmap->width())))
+      << bitmap->width() << "x" << bitmap->height() << ", with center color "
+      << ui::SkColorName(
+             bitmap->getColor(bitmap->width() / 2, bitmap->height() / 2));
 #endif
 
   EXPECT_THAT(histogram_tester.GetAllSamples(GetBucketName()),
@@ -1075,7 +1149,13 @@
     UniversalInstallComboTest,
     ::testing::Combine(
         testing::Values(u"AppName", std::nullopt),
-        testing::Values(SK_ColorBLUE, std::nullopt),
+        testing::Values(FaviconOptions(SK_ColorBLUE),
+                        absl::monostate(),
+#if BUILDFLAG(IS_MAC)
+                        FaviconOptions(base::FilePath(FILE_PATH_LITERAL(
+                            "chrome/test/data/web_apps/slack_favicon.png")))
+#endif
+                            ),
         // Note: the name just specified if the start_url exists or not - to add
         // more values, the ParamToString function must be changed.
         testing::Values(GURL("https://example.com/path/index.html?start_url"),
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 6f77ab3..d0df2d1 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1736812635-cb2e1de919905e7391bc2854b6dee56823f3fbfe-7d3b695c550d443ed19e2b8a0598214c48556024.profdata
+chrome-android32-main-1736833739-e06ec138525e31756aa10b2fa4a113f2359a865b-9c1e902abde681ae40f06d041fb5f5372b36dd54.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 8c7fabf..73c0ba8 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1736812923-b91e22bd048e50ca156190c5f174498d600f0a08-9644bcf5a9588d562fa12611cda3252d26ee5760.profdata
+chrome-android64-main-1736840604-ad3862fb808ca693c29a46582315b4ebe92e35b4-60f09135f1b70bb781d1455848732e6646aa877a.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index cebb897d..c11993e 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1736791001-5d39fbca4ac2117546a3612f6feea454b4da00ca-10021c5159e4121954dcc274c5eb9646ee6dad38.profdata
+chrome-linux-main-1736812635-b9303be2615343d26e86ffba41843083e52f48b6-7d3b695c550d443ed19e2b8a0598214c48556024.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 4dfa5e2..3193068 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1736805507-0b04020f195564cdf12834686b7ac6106027e38e-1fab80dad9a80b75211023046cb8d045515e945c.profdata
+chrome-mac-arm-main-1736833739-aff6db1c443273708845db57ddc7c06c4c0e4c49-9c1e902abde681ae40f06d041fb5f5372b36dd54.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 31c16c14..48451acb 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1736791001-dbb79b7f528af1f8875ddc3eb1b9998eed86ca74-10021c5159e4121954dcc274c5eb9646ee6dad38.profdata
+chrome-mac-main-1736833739-d1eeca116eccf7f4751d6aaaef06d0b7d15398d7-9c1e902abde681ae40f06d041fb5f5372b36dd54.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 5a788dda..014e4ec 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1736746872-2a4b0a9334b30696377fe0a1e485f9aeacbd3c8e-77a482e6d2f3b2d4f7dd93761999631398997b02.profdata
+chrome-win-arm64-main-1736812635-c5c235b564dc1944a62deeb7c421caf447291415-7d3b695c550d443ed19e2b8a0598214c48556024.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 1f5466b..1981c9e1 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1736791001-caed23642957c755d4788f9416472485b042435f-10021c5159e4121954dcc274c5eb9646ee6dad38.profdata
+chrome-win32-main-1736812635-de706d53fb89bfe82c8e9eefd03ec26f01356b33-7d3b695c550d443ed19e2b8a0598214c48556024.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index f0d8c13..7a65ece 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1736791001-766f078d3f5fb2b574e78bb139dc2e77dc5b8bc6-10021c5159e4121954dcc274c5eb9646ee6dad38.profdata
+chrome-win64-main-1736822930-3b9b70a6e15488d767d75f2dc48188d7dd176e3a-cb73a1142c2bed40239671c097b28ffa8dbc4abe.profdata
diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd
index af5da23a..57c536c5 100644
--- a/chrome/renderer/resources/renderer_resources.grd
+++ b/chrome/renderer/resources/renderer_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/renderer_resources.h" type="rc_header" context="default_100_percent">
       <emit emit_type='prepend'></emit>
diff --git a/chrome/test/data/extensions/api_test/search/query/normal/background.js b/chrome/test/data/extensions/api_test/search/query/normal/background.js
index 18ae496..ce452b60 100644
--- a/chrome/test/data/extensions/api_test/search/query/normal/background.js
+++ b/chrome/test/data/extensions/api_test/search/query/normal/background.js
@@ -23,17 +23,23 @@
 
   // Display results in current tab if no disposition is provided.
   function QueryPopulatedDispositionEmpty() {
-    chrome.tabs.create({}, (tab) => {
-      waitForTabAndPass(tab.id);
+    chrome.tabs.create({}, async (tab) => {
+      await waitForNewTab(tab.id);
+      let navigated = waitForNavigationToGoogle(tab.id);
       chrome.search.query({text: SEARCH_WORDS}, () => {});
+      await navigated;
+      chrome.test.succeed();
     });
   },
 
   // Display results in current tab if said disposition is provided.
   function QueryPopulatedDispositionCurrentTab() {
-    chrome.tabs.create({}, (tab) => {
-      waitForTabAndPass(tab.id);
+    chrome.tabs.create({}, async (tab) => {
+      await waitForNewTab(tab.id);
+      let navigated = waitForNavigationToGoogle(tab.id);
       chrome.search.query({text: SEARCH_WORDS, disposition: 'CURRENT_TAB'});
+      await navigated;
+      chrome.test.succeed();
     });
   },
 
@@ -43,7 +49,7 @@
       let initialTabIds = initialTabs.map(tab => tab.id);
       Promise
           .all([
-            waitForAnyTab(),
+            waitForGoogleInAnyTab(),
             new Promise(resolve => {
               chrome.search.query(
                   {text: SEARCH_WORDS, disposition: 'NEW_TAB'}, () => {
@@ -69,7 +75,7 @@
       let initialWindowIds = initialWindows.map(window => window.id);
       Promise
           .all([
-            waitForAnyTab(),
+            waitForGoogleInAnyTab(),
             new Promise((resolve) => {
               chrome.search.query(
                   {text: SEARCH_WORDS, disposition: 'NEW_WINDOW'}, () => {
@@ -91,9 +97,12 @@
 
   // Display results in specified tab if said tabId is provided.
   function QueryPopulatedTabIDValid() {
-    chrome.tabs.create({}, (tab) => {
-      waitForTabAndPass(tab.id);
+    chrome.tabs.create({}, async (tab) => {
+      await waitForNewTab(tab.id);
+      let navigated = waitForNavigationToGoogle(tab.id);
       chrome.search.query({text: SEARCH_WORDS, tabId: tab.id});
+      await navigated;
+      chrome.test.succeed();
     });
   },
 
@@ -118,29 +127,33 @@
   },
 ]);
 
-function waitForTab(tabIdExpected) {
+function waitForTab(tabIdExpected, expectedHostname) {
   return new Promise((resolve) => {
     chrome.tabs.onUpdated.addListener(function listener(
         tabId, changeInfo, tab) {
       if ((tabIdExpected != -1 && tabId != tabIdExpected) ||
           changeInfo.status !== 'complete') {
-        return;  // Not our tab.
+        return;  // Not our tab or not fully loaded.
       }
-      // Note: make sure to stop listening to future events, so that this
-      // doesn't affect future tests.
+      // Stop listening to future events to avoid affecting future tests.
       chrome.tabs.onUpdated.removeListener(listener);
-      // The tab finished loading. It should be on google (the default
-      // search engine).
-      assertEq('www.google.com', new URL(tab.url).hostname);
+
+      // The tab finished loading. It should have expected hostname.
+      assertEq(expectedHostname, new URL(tab.url).hostname);
+      // Resolve the promise as the tab has navigated to the expected hostname.
       resolve();
     });
   });
+}
+
+function waitForNewTab(tabId) {
+  return waitForTab(tabId, 'newtab');
 };
 
-function waitForAnyTab() {
-  return waitForTab(-1);
+function waitForNavigationToGoogle(tabId) {
+  return waitForTab(tabId, 'www.google.com');
 };
 
-function waitForTabAndPass(tabId) {
-  waitForTab(tabId).then(succeed);
-}
\ No newline at end of file
+function waitForGoogleInAnyTab() {
+  return waitForTab(-1, 'www.google.com');
+};
diff --git a/chrome/test/data/web_apps/diyapp_blue_image.png b/chrome/test/data/web_apps/diyapp_blue_image.png
new file mode 100644
index 0000000..bc066cb
--- /dev/null
+++ b/chrome/test/data/web_apps/diyapp_blue_image.png
Binary files differ
diff --git a/chrome/test/data/web_apps/diyapp_icon_image.png b/chrome/test/data/web_apps/diyapp_icon_image.png
new file mode 100644
index 0000000..af67c4e
--- /dev/null
+++ b/chrome/test/data/web_apps/diyapp_icon_image.png
Binary files differ
diff --git a/chrome/test/data/web_apps/diyapp_textA_image.png b/chrome/test/data/web_apps/diyapp_textA_image.png
new file mode 100644
index 0000000..fc3aa6e
--- /dev/null
+++ b/chrome/test/data/web_apps/diyapp_textA_image.png
Binary files differ
diff --git a/chrome/test/data/web_apps/diyapp_textP_image.png b/chrome/test/data/web_apps/diyapp_textP_image.png
new file mode 100644
index 0000000..0261490
--- /dev/null
+++ b/chrome/test/data/web_apps/diyapp_textP_image.png
Binary files differ
diff --git a/chromeos/ash/components/emoji/emoji.grd b/chromeos/ash/components/emoji/emoji.grd
index 59c26f1..c82e4b4 100644
--- a/chromeos/ash/components/emoji/emoji.grd
+++ b/chromeos/ash/components/emoji/emoji.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/emoji.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chromeos/ash/components/install_attributes/install_attributes.cc b/chromeos/ash/components/install_attributes/install_attributes.cc
index 21b3304..9a50ea6 100644
--- a/chromeos/ash/components/install_attributes/install_attributes.cc
+++ b/chromeos/ash/components/install_attributes/install_attributes.cc
@@ -435,7 +435,7 @@
     return;
   }
 
-  base::HistogramBase::Sample state;
+  base::HistogramBase::Sample32 state;
   // If we get the TPM status successfully, we are interested if install
   // attributes file exists (device_locked_), if the device is enrolled
   // (registration_mode_) and if the TPM is locked, meaning the TPM password
diff --git a/chromeos/ash/components/mantis/media_app/BUILD.gn b/chromeos/ash/components/mantis/media_app/BUILD.gn
index e63fda0..d8a92db 100644
--- a/chromeos/ash/components/mantis/media_app/BUILD.gn
+++ b/chromeos/ash/components/mantis/media_app/BUILD.gn
@@ -29,13 +29,23 @@
 
 source_set("unit_tests") {
   testonly = true
-  sources = [ "mantis_untrusted_service_unittest.cc" ]
+  sources = [
+    "mantis_untrusted_service_manager_unittest.cc",
+    "mantis_untrusted_service_unittest.cc",
+  ]
   deps = [
     ":media_app",
+    "//ash/constants",
+    "//ash/webui/media_app_ui:mojo_bindings_untrusted",
     "//base",
     "//base/test:test_support",
     "//chromeos/ash/components/mantis/mojom",
+    "//chromeos/ash/components/mojo_service_manager",
+    "//chromeos/ash/components/mojo_service_manager:test_support",
+    "//chromeos/ash/components/specialized_features",
+    "//components/prefs:test_support",
     "//mojo/public/cpp/bindings",
+    "//mojo/public/cpp/system",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager_unittest.cc b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager_unittest.cc
new file mode 100644
index 0000000..73cd851
--- /dev/null
+++ b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager_unittest.cc
@@ -0,0 +1,241 @@
+// 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 "chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.h"
+
+#include <memory>
+
+#include "ash/constants/ash_pref_names.h"
+#include "ash/webui/media_app_ui/media_app_ui_untrusted.mojom.h"
+#include "base/memory/raw_ptr.h"
+#include "base/test/gmock_callback_support.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "chromeos/ash/components/mantis/mojom/mantis_processor.mojom.h"
+#include "chromeos/ash/components/mantis/mojom/mantis_service.mojom.h"
+#include "chromeos/ash/components/mojo_service_manager/connection.h"
+#include "chromeos/ash/components/mojo_service_manager/fake_mojo_service_manager.h"
+#include "chromeos/ash/components/mojo_service_manager/mojom/mojo_service_manager.mojom.h"
+#include "chromeos/ash/components/specialized_features/feature_access_checker.h"
+#include "components/prefs/testing_pref_service.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/cros_system_api/mojo/service_constants.h"
+
+namespace ash {
+namespace {
+
+using ::ash::media_app_ui::mojom::MantisUntrustedServiceResultPtr;
+using ::base::test::RunOnceCallback;
+using ::base::test::TestFuture;
+using ::mantis::mojom::InitializeResult;
+using ::mantis::mojom::MantisFeatureStatus;
+using ::mantis::mojom::PlatformModelProgressObserver;
+using ::specialized_features::FeatureAccessChecker;
+using ::specialized_features::FeatureAccessConfig;
+using ::specialized_features::FeatureAccessFailure;
+using ::specialized_features::FeatureAccessFailureSet;
+using ::testing::NiceMock;
+using ::testing::Return;
+
+enum class GenAIPhotoEditingSettings {
+  kAllowed = 0,                // Allow and improve AI models
+  kAllowedWithoutLogging = 1,  // Allow without improving AI models
+  kDisabled = 2,               // Do not allow
+};
+
+class MockFeatureAccessChecker
+    : public specialized_features::FeatureAccessChecker {
+ public:
+  MOCK_METHOD(FeatureAccessFailureSet, Check, (), (const override));
+};
+
+class MockMojoMantisService
+    : public mantis::mojom::MantisService,
+      public chromeos::mojo_service_manager::mojom::ServiceProvider {
+ public:
+  MockMojoMantisService() : mantis_receiver_(this), provider_receiver_(this) {
+    ash::mojo_service_manager::GetServiceManagerProxy()->Register(
+        chromeos::mojo_services::kCrosMantisService,
+        provider_receiver_.BindNewPipeAndPassRemote());
+  }
+
+  // Implements mantis::mojom::MantisService:
+  MOCK_METHOD(void,
+              GetMantisFeatureStatus,
+              (GetMantisFeatureStatusCallback),
+              (override));
+  MOCK_METHOD(
+      void,
+      Initialize,
+      (mojo::PendingRemote<mantis::mojom::PlatformModelProgressObserver>,
+       mojo::PendingReceiver<mantis::mojom::MantisProcessor>,
+       InitializeCallback),
+      (override));
+
+  // Implements chromeos::mojo_service_manager::mojom::ServiceProvider:
+  void Request(
+      chromeos::mojo_service_manager::mojom::ProcessIdentityPtr client_identity,
+      mojo::ScopedMessagePipeHandle handle) override {
+    CHECK(handle->is_valid());
+    CHECK(!mantis_receiver_.is_bound());
+    mantis_receiver_.Bind(
+        mojo::PendingReceiver<mantis::mojom::MantisService>(std::move(handle)));
+  }
+
+ private:
+  mojo_service_manager::FakeMojoServiceManager fake_mojo_service_manager_;
+  mojo::Receiver<mantis::mojom::MantisService> mantis_receiver_;
+  mojo::Receiver<chromeos::mojo_service_manager::mojom::ServiceProvider>
+      provider_receiver_;
+};
+
+class MockMantisUntrustedPage
+    : public media_app_ui::mojom::MantisUntrustedPage {
+ public:
+  MockMantisUntrustedPage() : page_(this) {}
+
+  MOCK_METHOD(void, ReportMantisProgress, (double), (override));
+
+  mojo::PendingRemote<media_app_ui::mojom::MantisUntrustedPage>
+  BindNewPipeAndPassRemote() {
+    return page_.BindNewPipeAndPassRemote();
+  }
+
+ private:
+  mojo::Receiver<media_app_ui::mojom::MantisUntrustedPage> page_;
+};
+
+class MantisUntrustedServiceManagerTest : public testing::Test {
+ public:
+  MantisUntrustedServiceManagerTest()
+      : mock_mojo_service_(std::make_unique<NiceMock<MockMojoMantisService>>()),
+        access_checker_(
+            std::make_unique<NiceMock<MockFeatureAccessChecker>>()) {
+    // TODO(crbug.com/388786784): Move enterprise policy handling to
+    // FeatureAccessChecker.
+    pref_.registry()->RegisterIntegerPref(
+        ash::prefs::kGenAIPhotoEditingSettings,
+        static_cast<int>(GenAIPhotoEditingSettings::kAllowed));
+
+    // Set Mantis is available by default in this test, so that we can check
+    // each unavailable case one by one.
+    ON_CALL(*access_checker_, Check)
+        .WillByDefault(Return(FeatureAccessFailureSet()));
+    ON_CALL(*mock_mojo_service_, GetMantisFeatureStatus)
+        .WillByDefault(RunOnceCallback<0>(MantisFeatureStatus::kAvailable));
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  std::unique_ptr<NiceMock<MockMojoMantisService>> mock_mojo_service_;
+  std::unique_ptr<NiceMock<MockFeatureAccessChecker>> access_checker_;
+  TestingPrefServiceSimple pref_;
+};
+
+TEST_F(MantisUntrustedServiceManagerTest, IsAvailable) {
+  // Mantis is set to be available by default in the test fixture.
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  TestFuture<bool> result_future;
+  manager.IsAvailable(&pref_, result_future.GetCallback());
+
+  EXPECT_TRUE(result_future.Take());
+}
+
+TEST_F(MantisUntrustedServiceManagerTest, IsNotAvailableByAccountCapabilities) {
+  ASSERT_FALSE(MantisUntrustedServiceManager::GetFeatureAccessConfig()
+                   .capability_callback.is_null());
+  EXPECT_CALL(*access_checker_, Check)
+      .WillOnce(Return(FeatureAccessFailureSet(
+          {FeatureAccessFailure::kAccountCapabilitiesCheckFailed})));
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  TestFuture<bool> result_future;
+  manager.IsAvailable(&pref_, result_future.GetCallback());
+
+  EXPECT_FALSE(result_future.Take());
+}
+
+TEST_F(MantisUntrustedServiceManagerTest, IsNotAvailableByEnterprisePolicy) {
+  pref_.SetInteger(ash::prefs::kGenAIPhotoEditingSettings,
+                   static_cast<int>(GenAIPhotoEditingSettings::kDisabled));
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  TestFuture<bool> result_future;
+  manager.IsAvailable(&pref_, result_future.GetCallback());
+
+  EXPECT_FALSE(result_future.Take());
+}
+
+TEST_F(MantisUntrustedServiceManagerTest, IsNotAvailableByUnavailableService) {
+  // Reset mantis mojo service but keep mojo service manager.
+  mock_mojo_service_.reset();
+  mojo_service_manager::FakeMojoServiceManager fake_mojo_service_manager;
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  TestFuture<bool> result_future;
+  manager.IsAvailable(&pref_, result_future.GetCallback());
+
+  EXPECT_FALSE(result_future.Take());
+}
+
+TEST_F(MantisUntrustedServiceManagerTest, IsNotAvailableByMantisFeatureStatus) {
+  ON_CALL(*mock_mojo_service_, GetMantisFeatureStatus)
+      .WillByDefault(
+          RunOnceCallback<0>(MantisFeatureStatus::kDeviceNotSupported));
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  TestFuture<bool> result_future;
+  manager.IsAvailable(&pref_, result_future.GetCallback());
+
+  EXPECT_FALSE(result_future.Take());
+}
+
+TEST_F(MantisUntrustedServiceManagerTest, CreateSuccess) {
+  constexpr double kProgress = 1.0;
+  EXPECT_CALL(*mock_mojo_service_, Initialize)
+      .WillOnce(testing::WithArgs<0, 2>(
+          [](mojo::PendingRemote<PlatformModelProgressObserver>
+                 pending_observer,
+             base::OnceCallback<void(InitializeResult)> callback) {
+            mojo::Remote<PlatformModelProgressObserver> observer(
+                std::move(pending_observer));
+            // To check if progress report is passed.
+            observer->Progress(kProgress);
+            observer.FlushForTesting();
+            std::move(callback).Run(InitializeResult::kSuccess);
+          }));
+  MockMantisUntrustedPage page;
+  EXPECT_CALL(page, ReportMantisProgress(kProgress));
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  TestFuture<MantisUntrustedServiceResultPtr> result_future;
+  manager.Create(page.BindNewPipeAndPassRemote(), result_future.GetCallback());
+
+  MantisUntrustedServiceResultPtr result = result_future.Take();
+  ASSERT_FALSE(result.is_null());
+  EXPECT_TRUE(result->is_service());
+}
+
+TEST_F(MantisUntrustedServiceManagerTest, CreateFailed) {
+  EXPECT_CALL(*mock_mojo_service_, Initialize)
+      .WillOnce(RunOnceCallback<2>(InitializeResult::kFailedToLoadLibrary));
+  MantisUntrustedServiceManager manager(std::move(access_checker_));
+
+  MockMantisUntrustedPage page;
+  TestFuture<MantisUntrustedServiceResultPtr> result_future;
+  manager.Create(page.BindNewPipeAndPassRemote(), result_future.GetCallback());
+
+  MantisUntrustedServiceResultPtr result = result_future.Take();
+  ASSERT_FALSE(result.is_null());
+  EXPECT_TRUE(result->is_error());
+}
+
+}  // namespace
+}  // namespace ash
diff --git a/chromeos/ash/components/specialized_features/feature_access_checker.cc b/chromeos/ash/components/specialized_features/feature_access_checker.cc
index 6ddfc51..7a8f8f5 100644
--- a/chromeos/ash/components/specialized_features/feature_access_checker.cc
+++ b/chromeos/ash/components/specialized_features/feature_access_checker.cc
@@ -35,6 +35,10 @@
       identity_manager_(identity_manager),
       variations_service_(variations_service) {}
 
+FeatureAccessChecker::FeatureAccessChecker() = default;
+
+FeatureAccessChecker::~FeatureAccessChecker() = default;
+
 FeatureAccessFailureSet FeatureAccessChecker::Check() const {
   FeatureAccessFailureSet failures;
   if (config_.disabled_in_kiosk_mode && chromeos::IsKioskSession()) {
diff --git a/chromeos/ash/components/specialized_features/feature_access_checker.h b/chromeos/ash/components/specialized_features/feature_access_checker.h
index a4b9134f..adcfd321 100644
--- a/chromeos/ash/components/specialized_features/feature_access_checker.h
+++ b/chromeos/ash/components/specialized_features/feature_access_checker.h
@@ -135,10 +135,15 @@
 
   FeatureAccessChecker(const FeatureAccessChecker&) = delete;
   FeatureAccessChecker& operator=(const FeatureAccessChecker&) = delete;
+  virtual ~FeatureAccessChecker();
 
   // Uses the set config and dependencies to check. Returns a list of errors.
   // For details of errors, please refer the comments of FeatureAccessConfig.
-  FeatureAccessFailureSet Check() const;
+  virtual FeatureAccessFailureSet Check() const;
+
+ protected:
+  // Constructor for mock subclass.
+  FeatureAccessChecker();
 
  private:
   FeatureAccessConfig config_;
diff --git a/chromeos/ash/experiences/arc/metrics/arc_metrics_service_unittest.cc b/chromeos/ash/experiences/arc/metrics/arc_metrics_service_unittest.cc
index 920a8c4..b9d3c5cb 100644
--- a/chromeos/ash/experiences/arc/metrics/arc_metrics_service_unittest.cc
+++ b/chromeos/ash/experiences/arc/metrics/arc_metrics_service_unittest.cc
@@ -401,7 +401,7 @@
   service()->OnArcSessionStopped();
 
   tester.ExpectUniqueSample("Arc.Session.HasWebViewUsage",
-                            static_cast<base::HistogramBase::Sample>(0), 1);
+                            static_cast<base::HistogramBase::Sample32>(0), 1);
 }
 
 TEST_F(ArcMetricsServiceTest, ReportWebViewProcessStarted_OneUsageReported) {
@@ -411,7 +411,7 @@
   service()->OnArcSessionStopped();
 
   tester.ExpectUniqueSample("Arc.Session.HasWebViewUsage",
-                            static_cast<base::HistogramBase::Sample>(1), 1);
+                            static_cast<base::HistogramBase::Sample32>(1), 1);
 }
 
 TEST_F(ArcMetricsServiceTest, ReportWebViewProcessStarted_SomeUsageReported) {
@@ -427,9 +427,9 @@
   service()->OnArcSessionStopped();
 
   tester.ExpectBucketCount("Arc.Session.HasWebViewUsage",
-                           static_cast<base::HistogramBase::Sample>(0), 1);
+                           static_cast<base::HistogramBase::Sample32>(0), 1);
   tester.ExpectBucketCount("Arc.Session.HasWebViewUsage",
-                           static_cast<base::HistogramBase::Sample>(1), 2);
+                           static_cast<base::HistogramBase::Sample32>(1), 2);
 }
 
 TEST_F(ArcMetricsServiceTest, ReportArcKeyMintError_SomeErrorReported) {
@@ -439,7 +439,7 @@
   service()->OnArcSessionStopped();
 
   tester.ExpectUniqueSample("Arc.KeyMint.KeyMintError",
-                            static_cast<base::HistogramBase::Sample>(2), 1);
+                            static_cast<base::HistogramBase::Sample32>(2), 1);
 }
 
 TEST_F(ArcMetricsServiceTest,
diff --git a/chromeos/ash/resources/ash_resources.grd b/chromeos/ash/resources/ash_resources.grd
index 4d5dbd1e..7508d61 100644
--- a/chromeos/ash/resources/ash_resources.grd
+++ b/chromeos/ash/resources/ash_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ash_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/chromeos/ash/services/ime/public/mojom/mojom_traits.cc b/chromeos/ash/services/ime/public/mojom/mojom_traits.cc
index 6b8365e8..41a4bc94 100644
--- a/chromeos/ash/services/ime/public/mojom/mojom_traits.cc
+++ b/chromeos/ash/services/ime/public/mojom/mojom_traits.cc
@@ -36,8 +36,8 @@
 base::Histogram* GetHistogramStrict(
     const std::string& name,
     ash::ime::mojom::HistogramBucketType bucket_type,
-    const base::Histogram::Sample minimum,
-    const base::Histogram::Sample maximum,
+    const base::HistogramBase::Sample32 minimum,
+    const base::HistogramBase::Sample32 maximum,
     const size_t bucket_count) {
   // When `InspectConstructionArguments` receives certain invalid parameters, it
   // will attempt to adjust them to be correct and return true. So in order to
@@ -301,9 +301,9 @@
   }
 
   const auto minimum =
-      base::strict_cast<base::Histogram::Sample>(input.minimum());
+      base::strict_cast<base::HistogramBase::Sample32>(input.minimum());
   const auto maximum =
-      base::strict_cast<base::Histogram::Sample>(input.maximum());
+      base::strict_cast<base::HistogramBase::Sample32>(input.maximum());
   const auto bucket_count = base::strict_cast<size_t>(input.bucket_count());
 
   base::Histogram* counter = GetHistogramStrict(name, input.bucket_type(),
diff --git a/chromeos/ash/services/ime/public/mojom/user_data_japanese_dictionary.mojom b/chromeos/ash/services/ime/public/mojom/user_data_japanese_dictionary.mojom
index e00b9df..18d5610 100644
--- a/chromeos/ash/services/ime/public/mojom/user_data_japanese_dictionary.mojom
+++ b/chromeos/ash/services/ime/public/mojom/user_data_japanese_dictionary.mojom
@@ -52,7 +52,7 @@
   kFreeStandingWord = 43,               // "独立語"
   kSuppressionWord = 44,                // "抑制単語"
 };
-// LINT.ThenChange(//chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.html:JpPosType)
+// LINT.ThenChange(//chrome/browser/resources/ash/settings/os_languages_page/os_japanese_dictionary_entry_row.ts:JpPosType)
 
 struct JapaneseDictionaryEntry {
   // The string tyat is typed in order to display the custom suggestion.
diff --git a/chromeos/ash/services/secure_channel/public/cpp/client/connection_manager_impl_unittest.cc b/chromeos/ash/services/secure_channel/public/cpp/client/connection_manager_impl_unittest.cc
index e2f54c27..088f0a4 100644
--- a/chromeos/ash/services/secure_channel/public/cpp/client/connection_manager_impl_unittest.cc
+++ b/chromeos/ash/services/secure_channel/public/cpp/client/connection_manager_impl_unittest.cc
@@ -163,7 +163,7 @@
   }
 
   void VerifyConnectionResultHistogram(
-      base::HistogramBase::Sample sample,
+      base::HistogramBase::Sample32 sample,
       base::HistogramBase::Count expected_count) {
     histogram_tester_.ExpectBucketCount(kConnectionResultMetricName, sample,
                                         expected_count);
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 29af607..c43d3f5 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/chromeos_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/clank b/clank
index 13571b2..2e6ed96 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 13571b2b78ee3c8179518064da9ed1a3f5da47ec
+Subproject commit 2e6ed9613f693e00c5d442214459a289bea9c5ef
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 3727278..0332b70 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -867,7 +867,10 @@
   }
 
   if (enable_on_device_translation) {
-    deps += [ "//components/services/on_device_translation:unit_tests" ]
+    deps += [
+      "//components/services/on_device_translation:unit_tests",
+      "//components/services/on_device_translation/public/cpp:unit_tests",
+    ]
   }
 
   # No components should depend on Chrome.
diff --git a/components/autofill/content/renderer/BUILD.gn b/components/autofill/content/renderer/BUILD.gn
index 68204cb2..4177407 100644
--- a/components/autofill/content/renderer/BUILD.gn
+++ b/components/autofill/content/renderer/BUILD.gn
@@ -73,7 +73,6 @@
     "autofill_renderer_test.h",
     "focus_test_utils.cc",
     "focus_test_utils.h",
-    "form_cache_test_api.h",
     "form_tracker_test_api.h",
     "test_password_autofill_agent.cc",
     "test_password_autofill_agent.h",
diff --git a/components/autofill/content/renderer/form_cache_browsertest.cc b/components/autofill/content/renderer/form_cache_browsertest.cc
index ec78b29..13deb17a 100644
--- a/components/autofill/content/renderer/form_cache_browsertest.cc
+++ b/components/autofill/content/renderer/form_cache_browsertest.cc
@@ -18,7 +18,6 @@
 #include "components/autofill/content/renderer/autofill_renderer_test.h"
 #include "components/autofill/content/renderer/focus_test_utils.h"
 #include "components/autofill/content/renderer/form_autofill_util.h"
-#include "components/autofill/content/renderer/form_cache_test_api.h"
 #include "components/autofill/content/renderer/test_utils.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/field_data_manager.h"
@@ -97,9 +96,7 @@
                                         kCallTimerStateDummy);
   }
 
-  size_t num_extracted_forms() {
-    return test_api(*form_cache_).num_extracted_forms();
-  }
+  size_t num_extracted_forms() { return form_cache_->extracted_forms().size(); }
 
   FieldDataManager& GetFieldDataManager() const {
     return *field_data_manager_.get();
diff --git a/components/autofill/content/renderer/form_cache_test_api.h b/components/autofill/content/renderer/form_cache_test_api.h
deleted file mode 100644
index 5336cac..0000000
--- a/components/autofill/content/renderer/form_cache_test_api.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_TEST_API_H_
-#define COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_TEST_API_H_
-
-#include <stddef.h>
-
-#include "base/containers/contains.h"
-#include "base/memory/raw_ref.h"
-#include "components/autofill/content/renderer/form_autofill_util.h"
-#include "components/autofill/content/renderer/form_cache.h"
-#include "third_party/blink/public/web/web_form_control_element.h"
-
-namespace autofill {
-
-// Exposes some testing operations for FormCache.
-class FormCacheTestApi {
- public:
-  explicit FormCacheTestApi(FormCache* form_cache) : form_cache_(*form_cache) {}
-
-  size_t num_extracted_forms() const {
-    return form_cache_->extracted_forms_.size();
-  }
-
- private:
-  const raw_ref<FormCache> form_cache_;
-};
-
-inline FormCacheTestApi test_api(FormCache& form_cache) {
-  return FormCacheTestApi(&form_cache);
-}
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_TEST_API_H_
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
index 765e363f..b45c2b94 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
@@ -328,13 +328,7 @@
   for (const auto& form : query.forms()) {
     LogBuffer form_buffer(LogBuffer::IsActive(true));
     for (const auto& field : form.fields()) {
-      form_buffer << Tag{"table"};
-      form_buffer << Tr{} << "Signature"
-                  << "Field name"
-                  << "Control type";
-      form_buffer << Tr{} << field.signature() << field.name()
-                  << field.control_type();
-      form_buffer << CTag{"table"};
+      form_buffer << "Signature: " << field.signature();
     }
     out << Tr{} << ("Form " + base::NumberToString(form.signature()))
         << std::move(form_buffer);
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc
index 03d5b8c7..85499bcc 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc
@@ -1480,16 +1480,8 @@
   ASSERT_EQ(query.forms_size(), 1);
   const auto& query_form = query.forms(0);
 
-  // There should be no encoded metadata for the form.
-  EXPECT_FALSE(query_form.has_metadata());
-
-  // There should be three fields, none of which have encoded metadata.
-  ASSERT_EQ(3, query_form.fields_size());
-  ASSERT_EQ(static_cast<int>(form.fields().size()), query_form.fields_size());
-  for (int i = 0; i < query_form.fields_size(); ++i) {
-    const auto& query_field = query_form.fields(i);
-    EXPECT_FALSE(query_field.has_metadata());
-  }
+  // There should be three fields.
+  EXPECT_EQ(3, query_form.fields_size());
 }
 
 // Note that we omit DEFAULT_URL from the test params. We don't actually want
diff --git a/components/autofill/core/browser/form_parsing/form_field_parser.cc b/components/autofill/core/browser/form_parsing/form_field_parser.cc
index ecdeb6bb..5572c225 100644
--- a/components/autofill/core/browser/form_parsing/form_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/form_field_parser.cc
@@ -531,6 +531,18 @@
 }
 
 // static
+bool FormFieldParser::ParseField(
+    ParsingContext& context,
+    AutofillScanner* scanner,
+    const char* regex_name,
+    std::optional<FieldAndMatchInfo>* match,
+    MatchParams (*projection)(const MatchParams&)) {
+  base::span<const MatchPatternRef> patterns =
+      GetMatchPatterns(regex_name, context.page_language, context.pattern_file);
+  return ParseField(context, scanner, patterns, match, regex_name, projection);
+}
+
+// static
 bool FormFieldParser::ParseInAnyOrder(
     AutofillScanner* scanner,
     std::vector<
diff --git a/components/autofill/core/browser/form_parsing/form_field_parser.h b/components/autofill/core/browser/form_parsing/form_field_parser.h
index a48ea78..33fab7d 100644
--- a/components/autofill/core/browser/form_parsing/form_field_parser.h
+++ b/components/autofill/core/browser/form_parsing/form_field_parser.h
@@ -241,6 +241,15 @@
       const char* regex_name = "",
       MatchParams (*match_pattern_projection)(const MatchParams&) = nullptr);
 
+  // This is just a wrapper which doesn't require `patterns` and looks them up
+  // using `regex_name`.
+  static bool ParseField(
+      ParsingContext& context,
+      AutofillScanner* scanner,
+      const char* regex_name,
+      std::optional<FieldAndMatchInfo>* match = nullptr,
+      MatchParams (*match_pattern_projection)(const MatchParams&) = nullptr);
+
   // Attempts to parse a field with an empty label. Returns true
   // on success and fills |match| with a pointer to the field.
   static bool ParseEmptyLabel(ParsingContext& context,
diff --git a/components/autofill/core/browser/form_parsing/name_field_parser.cc b/components/autofill/core/browser/form_parsing/name_field_parser.cc
index 7f7fd21a..101f798 100644
--- a/components/autofill/core/browser/form_parsing/name_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/name_field_parser.cc
@@ -20,11 +20,6 @@
 namespace autofill {
 namespace {
 
-base::span<const MatchPatternRef> GetMatchPatterns(std::string_view name,
-                                                   ParsingContext& context) {
-  return GetMatchPatterns(name, context.page_language, context.pattern_file);
-}
-
 // A form field that can parse a full name field.
 class FullNameField : public NameFieldParser {
  public:
@@ -152,15 +147,8 @@
                                                     AutofillScanner* scanner) {
   // Exclude e.g. "username" or "nickname" fields.
   scanner->SaveCursor();
-  base::span<const MatchPatternRef> name_ignored_patterns =
-      GetMatchPatterns("NAME_IGNORED", context);
-  base::span<const MatchPatternRef> address_name_ignored_patterns =
-      GetMatchPatterns("ADDRESS_NAME_IGNORED", context);
-  bool should_ignore =
-      ParseField(context, scanner, name_ignored_patterns, nullptr,
-                 "NAME_IGNORED") ||
-      ParseField(context, scanner, address_name_ignored_patterns, nullptr,
-                 "ADDRESS_NAME_IGNORED");
+  bool should_ignore = ParseField(context, scanner, "NAME_IGNORED") ||
+                       ParseField(context, scanner, "ADDRESS_NAME_IGNORED");
   scanner->Rewind();
   if (should_ignore) {
     return nullptr;
@@ -171,9 +159,7 @@
   // "Travel Profile Name".
   std::optional<FieldAndMatchInfo> match;
 
-  base::span<const MatchPatternRef> name_patterns =
-      GetMatchPatterns("FULL_NAME", context);
-  if (ParseField(context, scanner, name_patterns, &match, "FULL_NAME")) {
+  if (ParseField(context, scanner, "FULL_NAME", &match)) {
     return std::make_unique<FullNameField>(std::move(*match));
   }
 
@@ -204,29 +190,11 @@
   auto v = base::WrapUnique(new FirstTwoLastNamesField());
   scanner->SaveCursor();
 
-  base::span<const MatchPatternRef> honorific_prefix_patterns =
-      GetMatchPatterns("HONORIFIC_PREFIX", context);
-  base::span<const MatchPatternRef> name_ignored_patterns =
-      GetMatchPatterns("NAME_IGNORED", context);
-  base::span<const MatchPatternRef> address_name_ignored_patterns =
-      GetMatchPatterns("ADDRESS_NAME_IGNORED", context);
-  base::span<const MatchPatternRef> first_name_patterns =
-      GetMatchPatterns("FIRST_NAME", context);
-  base::span<const MatchPatternRef> middle_name_patterns =
-      GetMatchPatterns("MIDDLE_NAME", context);
-  base::span<const MatchPatternRef> last_name_prefix_patterns =
-      GetMatchPatterns("LAST_NAME_PREFIX", context);
-  base::span<const MatchPatternRef> first_last_name_patterns =
-      GetMatchPatterns("LAST_NAME_FIRST", context);
-  base::span<const MatchPatternRef> second_last_name_patterns =
-      GetMatchPatterns("LAST_NAME_SECOND", context);
-
   // Allow name fields to appear in any order.
   while (!scanner->IsEnd()) {
     // Skip over address label fields, which can have misleading names
     // e.g. "title" or "name".
-    if (ParseField(context, scanner, address_name_ignored_patterns, nullptr,
-                   "ADDRESS_NAME_IGNORED")) {
+    if (ParseField(context, scanner, "ADDRESS_NAME_IGNORED")) {
       continue;
     }
 
@@ -236,24 +204,23 @@
     // TODO(crbug.com/40137264): Remove check once feature is launched or
     // removed.
     if (!v->honorific_prefix_ &&
-        ParseField(context, scanner, honorific_prefix_patterns,
-                   &v->honorific_prefix_, "HONORIFIC_PREFIX")) {
+        ParseField(context, scanner, "HONORIFIC_PREFIX",
+                   &v->honorific_prefix_)) {
       continue;
     }
 
     // Skip over any unrelated fields, e.g. "username" or "nickname".
-    if (ParseField(context, scanner, name_ignored_patterns, nullptr,
-                   "NAME_IGNORED")) {
+    if (ParseField(context, scanner, "NAME_IGNORED")) {
       continue;
     }
 
-    if (!v->first_name_ && ParseField(context, scanner, first_name_patterns,
-                                      &v->first_name_, "FIRST_NAME")) {
+    if (!v->first_name_ &&
+        ParseField(context, scanner, "FIRST_NAME", &v->first_name_)) {
       continue;
     }
 
-    if (!v->middle_name_ && ParseField(context, scanner, middle_name_patterns,
-                                       &v->middle_name_, "MIDDLE_NAME")) {
+    if (!v->middle_name_ &&
+        ParseField(context, scanner, "MIDDLE_NAME", &v->middle_name_)) {
       continue;
     }
 
@@ -262,20 +229,19 @@
     if (base::FeatureList::IsEnabled(
             features::kAutofillSupportLastNamePrefix) &&
         !v->last_name_prefix_ &&
-        ParseField(context, scanner, last_name_prefix_patterns,
-                   &v->last_name_prefix_, "LAST_NAME_PREFIX")) {
+        ParseField(context, scanner, "LAST_NAME_PREFIX",
+                   &v->last_name_prefix_)) {
       continue;
     }
 
     if (!v->first_last_name_ &&
-        ParseField(context, scanner, first_last_name_patterns,
-                   &v->first_last_name_, "LAST_NAME_FIRST")) {
+        ParseField(context, scanner, "LAST_NAME_FIRST", &v->first_last_name_)) {
       continue;
     }
 
     if (!v->second_last_name_ &&
-        ParseField(context, scanner, second_last_name_patterns,
-                   &v->second_last_name_, "LAST_NAME_SECOND")) {
+        ParseField(context, scanner, "LAST_NAME_SECOND",
+                   &v->second_last_name_)) {
       continue;
     }
 
@@ -316,25 +282,10 @@
   // Example: Name [      ] Last Name [      ]
   auto v = base::WrapUnique(new FirstLastNameField());
 
-  base::span<const MatchPatternRef> name_specific_patterns =
-      GetMatchPatterns("NAME_GENERIC", context);
-  base::span<const MatchPatternRef> middle_name_patterns =
-      GetMatchPatterns("MIDDLE_NAME", context);
-  base::span<const MatchPatternRef> last_name_prefix_patterns =
-      GetMatchPatterns("LAST_NAME_PREFIX", context);
-  base::span<const MatchPatternRef> last_name_patterns =
-      GetMatchPatterns("LAST_NAME", context);
-  base::span<const MatchPatternRef> name_ignored_patterns =
-      GetMatchPatterns("NAME_IGNORED", context);
-  base::span<const MatchPatternRef> address_name_ignored_patterns =
-      GetMatchPatterns("ADDRESS_NAME_IGNORED", context);
   scanner->SaveCursor();
 
-  bool should_ignore =
-      ParseField(context, scanner, name_ignored_patterns, nullptr,
-                 "NAME_IGNORED") ||
-      ParseField(context, scanner, address_name_ignored_patterns, nullptr,
-                 "ADDRESS_NAME_IGNORED");
+  bool should_ignore = ParseField(context, scanner, "NAME_IGNORED") ||
+                       ParseField(context, scanner, "ADDRESS_NAME_IGNORED");
   scanner->Rewind();
 
   scanner->SaveCursor();
@@ -343,20 +294,16 @@
     return nullptr;
   }
 
-  if (ParseField(context, scanner, name_specific_patterns, &v->first_name_,
-                 "NAME_GENERIC")) {
+  if (ParseField(context, scanner, "NAME_GENERIC", &v->first_name_)) {
     // Check for an optional middle name field.
-    ParseField(context, scanner, middle_name_patterns, &v->middle_name_,
-               "MIDDLE_NAME");
+    ParseField(context, scanner, "MIDDLE_NAME", &v->middle_name_);
     // TODO(crbug.com/386916943) Remove check once feature is launched or
     // removed.
     if (base::FeatureList::IsEnabled(
             features::kAutofillSupportLastNamePrefix)) {
-      ParseField(context, scanner, last_name_prefix_patterns,
-                 &v->last_name_prefix_, "LAST_NAME_PREFIX");
+      ParseField(context, scanner, "LAST_NAME_PREFIX", &v->last_name_prefix_);
     }
-    if (ParseField(context, scanner, last_name_patterns, &v->last_name_,
-                   "LAST_NAME")) {
+    if (ParseField(context, scanner, "LAST_NAME", &v->last_name_)) {
       return v;
     }
   }
@@ -374,10 +321,7 @@
   scanner->SaveCursor();
 
   std::optional<FieldAndMatchInfo> next;
-  base::span<const MatchPatternRef> name_specific_patterns =
-      GetMatchPatterns("NAME_GENERIC", context);
-  if (ParseField(context, scanner, name_specific_patterns, &v->first_name_,
-                 "NAME_GENERIC") &&
+  if (ParseField(context, scanner, "NAME_GENERIC", &v->first_name_) &&
       ParseEmptyLabel(context, scanner, &next)) {
     if (ParseEmptyLabel(context, scanner, &v->last_name_)) {
       // There are three name fields; assume that the middle one is a
@@ -414,28 +358,10 @@
 
   // Allow name fields to appear in any order.
 
-  base::span<const MatchPatternRef> honorific_prefix_patterns =
-      GetMatchPatterns("HONORIFIC_PREFIX", context);
-  base::span<const MatchPatternRef> name_ignored_patterns =
-      GetMatchPatterns("NAME_IGNORED", context);
-  base::span<const MatchPatternRef> address_name_ignored_patterns =
-      GetMatchPatterns("ADDRESS_NAME_IGNORED", context);
-  base::span<const MatchPatternRef> first_name_patterns =
-      GetMatchPatterns("FIRST_NAME", context);
-  base::span<const MatchPatternRef> middle_name_initial_patterns =
-      GetMatchPatterns("MIDDLE_INITIAL", context);
-  base::span<const MatchPatternRef> middle_name_patterns =
-      GetMatchPatterns("MIDDLE_NAME", context);
-  base::span<const MatchPatternRef> last_name_prefix_patterns =
-      GetMatchPatterns("LAST_NAME_PREFIX", context);
-  base::span<const MatchPatternRef> last_name_patterns =
-      GetMatchPatterns("LAST_NAME", context);
-
   while (!scanner->IsEnd()) {
     // Skip over address label fields, which can have misleading names
     // e.g. "title" or "name".
-    if (ParseField(context, scanner, address_name_ignored_patterns, nullptr,
-                   "ADDRESS_NAME_IGNORED")) {
+    if (ParseField(context, scanner, "ADDRESS_NAME_IGNORED")) {
       continue;
     }
 
@@ -443,19 +369,18 @@
     // because a honorific prefix field is expected to have very specific labels
     // including "Title:". The latter is matched with |kNameIgnoredRe|.
     if (!v->honorific_prefix_ &&
-        ParseField(context, scanner, honorific_prefix_patterns,
-                   &v->honorific_prefix_, "HONORIFIC_PREFIX")) {
+        ParseField(context, scanner, "HONORIFIC_PREFIX",
+                   &v->honorific_prefix_)) {
       continue;
     }
 
     // Skip over any unrelated name fields, e.g. "username" or "nickname".
-    if (ParseField(context, scanner, name_ignored_patterns, nullptr,
-                   "NAME_IGNORED")) {
+    if (ParseField(context, scanner, "NAME_IGNORED")) {
       continue;
     }
 
-    if (!v->first_name_ && ParseField(context, scanner, first_name_patterns,
-                                      &v->first_name_, "FIRST_NAME")) {
+    if (!v->first_name_ &&
+        ParseField(context, scanner, "FIRST_NAME", &v->first_name_)) {
       continue;
     }
 
@@ -465,14 +390,13 @@
     // "txtmiddlename"); such a field probably actually represents a
     // middle initial.
     if (!v->middle_name_ &&
-        ParseField(context, scanner, middle_name_initial_patterns,
-                   &v->middle_name_, "MIDDLE_INITIAL")) {
+        ParseField(context, scanner, "MIDDLE_INITIAL", &v->middle_name_)) {
       v->middle_initial_ = true;
       continue;
     }
 
-    if (!v->middle_name_ && ParseField(context, scanner, middle_name_patterns,
-                                       &v->middle_name_, "MIDDLE_NAME")) {
+    if (!v->middle_name_ &&
+        ParseField(context, scanner, "MIDDLE_NAME", &v->middle_name_)) {
       continue;
     }
 
@@ -481,13 +405,13 @@
     if (base::FeatureList::IsEnabled(
             features::kAutofillSupportLastNamePrefix) &&
         !v->last_name_prefix_ &&
-        ParseField(context, scanner, last_name_prefix_patterns,
-                   &v->last_name_prefix_, "LAST_NAME_PREFIX")) {
+        ParseField(context, scanner, "LAST_NAME_PREFIX",
+                   &v->last_name_prefix_)) {
       continue;
     }
 
-    if (!v->last_name_ && ParseField(context, scanner, last_name_patterns,
-                                     &v->last_name_, "LAST_NAME")) {
+    if (!v->last_name_ &&
+        ParseField(context, scanner, "LAST_NAME", &v->last_name_)) {
       continue;
     }
 
diff --git a/components/autofill/core/browser/proto/api_v1.proto b/components/autofill/core/browser/proto/api_v1.proto
index 6434394..ed3f866 100644
--- a/components/autofill/core/browser/proto/api_v1.proto
+++ b/components/autofill/core/browser/proto/api_v1.proto
@@ -32,12 +32,7 @@
     message Field {
       // Signature made of the field |name| and |control_type|.
       optional fixed32 signature = 1;
-      // Name of the field (e.g., "First Name").
-      optional string name = 2;
-      // Type of the control (e.g., "email").
-      optional string control_type = 3;
-      // Metadata around the field.
-      optional AutofillRandomizedFieldMetadata metadata = 4;
+      reserved 2, 3, 4;
     };
     // Signature of the form that is made of:
     //  - URL scheme (e.g., "http")
@@ -47,8 +42,7 @@
     optional fixed64 signature = 1;
     // Fields of the form for which we want suggestions.
     repeated Field fields = 2;
-    // Metadata around the form.
-    optional AutofillRandomizedFormMetadata metadata = 3;
+    reserved 3;
     // Alternative signature of the form that is made of:
     //  - URL scheme (e.g., "http")
     //  - URL domain page (e.g., "google.com")
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
index dad3288..9a68d90 100644
--- a/components/browser_ui/strings/android/browser_ui_strings.grd
+++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <grit latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="values-af/browser_ui_strings.xml" lang="af" type="android" />
     <output filename="values-am/browser_ui_strings.xml" lang="am" type="android" />
diff --git a/components/cast/named_message_port_connector/named_message_port_connector_resources.grd b/components/cast/named_message_port_connector/named_message_port_connector_resources.grd
index d70601d5..78b5fdb9 100644
--- a/components/cast/named_message_port_connector/named_message_port_connector_resources.grd
+++ b/components/cast/named_message_port_connector/named_message_port_connector_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/named_message_port_connector_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/components/collaboration/internal/collaboration_controller_unittest.cc b/components/collaboration/internal/collaboration_controller_unittest.cc
index 5086ca22..eaa9866 100644
--- a/components/collaboration/internal/collaboration_controller_unittest.cc
+++ b/components/collaboration/internal/collaboration_controller_unittest.cc
@@ -283,7 +283,7 @@
 
   std::move(preview_callback)
       .Run(base::unexpected(data_sharing::DataSharingService::
-                                PeopleGroupActionFailure::kUnknown));
+                                DataPreviewActionFailure::kOtherFailure));
   EXPECT_EQ(controller_->GetStateForTesting(), StateId::kError);
 }
 
diff --git a/components/data_sharing/internal/android/data_sharing_conversion_bridge.cc b/components/data_sharing/internal/android/data_sharing_conversion_bridge.cc
index 87c0513..29d1ad2 100644
--- a/components/data_sharing/internal/android/data_sharing_conversion_bridge.cc
+++ b/components/data_sharing/internal/android/data_sharing_conversion_bridge.cc
@@ -87,8 +87,8 @@
 DataSharingConversionBridge::CreateSharedDataPreviewOrFailureOutcome(
     JNIEnv* env,
     const DataSharingService::SharedDataPreviewOrFailureOutcome& data) {
-  DataSharingService::PeopleGroupActionFailure failure =
-      DataSharingService::PeopleGroupActionFailure::kUnknown;
+  DataSharingService::DataPreviewActionFailure failure =
+      DataSharingService::DataPreviewActionFailure::kUnknown;
 
   ScopedJavaLocalRef<jobject> j_preview;
   if (data.has_value() && data.value().shared_tab_group_preview) {
diff --git a/components/data_sharing/internal/preview_server_proxy.cc b/components/data_sharing/internal/preview_server_proxy.cc
index bedeb0e9..049a7ee 100644
--- a/components/data_sharing/internal/preview_server_proxy.cc
+++ b/components/data_sharing/internal/preview_server_proxy.cc
@@ -284,8 +284,8 @@
         FROM_HERE,
         base::BindOnce(
             std::move(callback),
-            base::unexpected(DataSharingService::PeopleGroupActionFailure::
-                                 kPersistentFailure)));
+            base::unexpected(
+                DataSharingService::DataPreviewActionFailure::kOtherFailure)));
     return;
   }
   std::string data_type_str;
@@ -351,8 +351,14 @@
   if (response->http_status_code != net::HTTP_OK || response->error_type) {
     DLOG(ERROR) << "Got bad response (" << response->http_status_code
                 << ") for shared data preview!";
-    std::move(callback).Run(base::unexpected(
-        DataSharingService::PeopleGroupActionFailure::kTransientFailure));
+    DataSharingService::DataPreviewActionFailure failure =
+        DataSharingService::DataPreviewActionFailure::kOtherFailure;
+    if (response->http_status_code == net::HTTP_CONFLICT) {
+      failure = DataSharingService::DataPreviewActionFailure::kGroupFull;
+    } else if (response->http_status_code == net::HTTP_FORBIDDEN) {
+      failure = DataSharingService::DataPreviewActionFailure::kPermissionDenied;
+    }
+    std::move(callback).Run(base::unexpected(failure));
     return;
   }
 
@@ -400,7 +406,7 @@
   }
   if (!preview.shared_tab_group_preview) {
     std::move(callback).Run(base::unexpected(
-        DataSharingService::PeopleGroupActionFailure::kPersistentFailure));
+        DataSharingService::DataPreviewActionFailure::kOtherFailure));
   } else {
     std::move(callback).Run(std::move(preview));
   }
diff --git a/components/data_sharing/internal/preview_server_proxy_unittest.cc b/components/data_sharing/internal/preview_server_proxy_unittest.cc
index f8516861..d67cee2 100644
--- a/components/data_sharing/internal/preview_server_proxy_unittest.cc
+++ b/components/data_sharing/internal/preview_server_proxy_unittest.cc
@@ -292,9 +292,8 @@
       /*data_type=*/std::nullopt,
       base::BindOnce([](const DataSharingService::
                             SharedDataPreviewOrFailureOutcome& result) {
-        ASSERT_EQ(
-            result.error(),
-            DataSharingService::PeopleGroupActionFailure::kPersistentFailure);
+        ASSERT_EQ(result.error(),
+                  DataSharingService::DataPreviewActionFailure::kOtherFailure);
       }).Then(run_loop.QuitClosure()));
   run_loop.Run();
 }
@@ -311,9 +310,8 @@
       /*data_type=*/std::nullopt,
       base::BindOnce([](const DataSharingService::
                             SharedDataPreviewOrFailureOutcome& result) {
-        ASSERT_EQ(
-            result.error(),
-            DataSharingService::PeopleGroupActionFailure::kPersistentFailure);
+        ASSERT_EQ(result.error(),
+                  DataSharingService::DataPreviewActionFailure::kOtherFailure);
       }).Then(run_loop.QuitClosure()));
   run_loop.Run();
 }
@@ -332,9 +330,8 @@
       /*data_type=*/std::nullopt,
       base::BindOnce([](const DataSharingService::
                             SharedDataPreviewOrFailureOutcome& result) {
-        ASSERT_EQ(
-            result.error(),
-            DataSharingService::PeopleGroupActionFailure::kPersistentFailure);
+        ASSERT_EQ(result.error(),
+                  DataSharingService::DataPreviewActionFailure::kOtherFailure);
       }).Then(run_loop.QuitClosure()));
   run_loop.Run();
 }
@@ -349,13 +346,47 @@
       /*data_type=*/std::nullopt,
       base::BindOnce([](const DataSharingService::
                             SharedDataPreviewOrFailureOutcome& result) {
+        ASSERT_EQ(result.error(),
+                  DataSharingService::DataPreviewActionFailure::kOtherFailure);
+      }).Then(run_loop.QuitClosure()));
+  run_loop.Run();
+}
+
+TEST_F(PreviewServerProxyTest, TestGetSharedDataPreview_PermissionError) {
+  fetcher_->SetFetchResponse("", net::HTTP_FORBIDDEN);
+  EXPECT_CALL(*server_proxy_, CreateEndpointFetcher(GURL(kExpectedUrl)))
+      .Times(1);
+  base::RunLoop run_loop;
+  server_proxy_->GetSharedDataPreview(
+      GroupToken(GroupId(kCollaborationId), kAccessToken),
+      /*data_type=*/std::nullopt,
+      base::BindOnce([](const DataSharingService::
+                            SharedDataPreviewOrFailureOutcome& result) {
         ASSERT_EQ(
             result.error(),
-            DataSharingService::PeopleGroupActionFailure::kTransientFailure);
+            DataSharingService::DataPreviewActionFailure::kPermissionDenied);
       }).Then(run_loop.QuitClosure()));
   run_loop.Run();
 }
 
+TEST_F(PreviewServerProxyTest, TestGetSharedDataPreview_ResourceExceeded) {
+  fetcher_->SetFetchResponse("", net::HTTP_CONFLICT);
+  EXPECT_CALL(*server_proxy_, CreateEndpointFetcher(GURL(kExpectedUrl)))
+      .Times(1);
+  base::RunLoop run_loop;
+  server_proxy_->GetSharedDataPreview(
+      GroupToken(GroupId(kCollaborationId), kAccessToken),
+      /*data_type=*/std::nullopt,
+      base::BindOnce(
+          [](const DataSharingService::SharedDataPreviewOrFailureOutcome&
+                 result) {
+            ASSERT_EQ(result.error(),
+                      DataSharingService::DataPreviewActionFailure::kGroupFull);
+          })
+          .Then(run_loop.QuitClosure()));
+  run_loop.Run();
+}
+
 TEST_F(PreviewServerProxyTest, TestGetSharedDataPreview_WrongJson) {
   fetcher_->SetFetchResponse("wrong");
   EXPECT_CALL(*server_proxy_, CreateEndpointFetcher(GURL(kExpectedUrl)))
@@ -367,9 +398,8 @@
       /*data_type=*/std::nullopt,
       base::BindOnce([](const DataSharingService::
                             SharedDataPreviewOrFailureOutcome& result) {
-        ASSERT_EQ(
-            result.error(),
-            DataSharingService::PeopleGroupActionFailure::kPersistentFailure);
+        ASSERT_EQ(result.error(),
+                  DataSharingService::DataPreviewActionFailure::kOtherFailure);
       }).Then(run_loop.QuitClosure()));
   run_loop.Run();
 }
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/DataSharingService.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/DataSharingService.java
index 5d4e18ec..99abfa3 100644
--- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/DataSharingService.java
+++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/DataSharingService.java
@@ -65,10 +65,10 @@
         public final SharedDataPreview sharedDataPreview;
 
         /** Result of the action, UNKNOWN if the action was successful. */
-        public final @PeopleGroupActionFailure int actionFailure;
+        public final @DataPreviewActionFailure int actionFailure;
 
         public SharedDataPreviewOrFailureOutcome(
-                SharedDataPreview sharedDataPreview, @PeopleGroupActionFailure int actionFailure) {
+                SharedDataPreview sharedDataPreview, @DataPreviewActionFailure int actionFailure) {
             this.sharedDataPreview = sharedDataPreview;
             this.actionFailure = actionFailure;
         }
diff --git a/components/data_sharing/public/data_sharing_service.h b/components/data_sharing/public/data_sharing_service.h
index 3a66f94..acdaa9c3 100644
--- a/components/data_sharing/public/data_sharing_service.h
+++ b/components/data_sharing/public/data_sharing_service.h
@@ -40,6 +40,15 @@
  public:
   // GENERATED_JAVA_ENUM_PACKAGE: (
   //   org.chromium.components.data_sharing)
+  enum class DataPreviewActionFailure {
+    kUnknown = 0,
+    kPermissionDenied = 1,
+    kGroupFull = 2,
+    kOtherFailure = 3
+  };
+
+  // GENERATED_JAVA_ENUM_PACKAGE: (
+  //   org.chromium.components.data_sharing)
   enum class PeopleGroupActionFailure {
     kUnknown = 0,
     kTransientFailure = 1,
@@ -102,7 +111,7 @@
   using GroupsDataSetOrFailureOutcome =
       base::expected<std::set<GroupData>, PeopleGroupActionFailure>;
   using SharedDataPreviewOrFailureOutcome =
-      base::expected<SharedDataPreview, PeopleGroupActionFailure>;
+      base::expected<SharedDataPreview, DataPreviewActionFailure>;
   using ParseUrlResult = base::expected<GroupToken, ParseUrlStatus>;
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn
index f73dff8..05359209 100644
--- a/components/feed/core/v2/BUILD.gn
+++ b/components/feed/core/v2/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//components/supervised_user/buildflags.gni")
 import("//testing/test.gni")
 
 if (is_android) {
@@ -163,7 +162,6 @@
       "//components/reading_list/features:flags",
       "//components/search_engines",
       "//components/signin/public/identity_manager",
-      "//components/supervised_user/core/common:features",
       "//components/url_matcher:url_matcher",
       "//components/variations",
       "//components/variations/net",
@@ -182,7 +180,6 @@
       "//components/feed/core/common:feed_core_common",
       "//components/feed/core/proto:proto_ios_shared_v2",
       "//components/feed/core/proto:proto_v2",
-      "//components/supervised_user/core/browser/proto",
     ]
   }
 
@@ -259,7 +256,6 @@
       "//components/search_engines:test_support",
       "//components/signin/public/identity_manager",
       "//components/signin/public/identity_manager:test_support",
-      "//components/supervised_user/core/common:buildflags",
       "//components/sync/base",
       "//components/sync_preferences:test_support",
       "//components/variations:test_support",
@@ -277,14 +273,6 @@
     } else {
       deps += [ ":unit_tests_bundle_data" ]
     }
-
-    if (enable_supervised_users) {
-      sources += [ "api_test/feed_api_supervised_feed_unittest.cc" ]
-      deps += [
-        "//components/supervised_user/core/browser",
-        "//components/supervised_user/core/common:features",
-      ]
-    }
   }
 
   source_set("feed_core_stubs") {
diff --git a/components/feed/core/v2/api_test/feed_api_supervised_feed_unittest.cc b/components/feed/core/v2/api_test/feed_api_supervised_feed_unittest.cc
deleted file mode 100644
index 4f836d93..0000000
--- a/components/feed/core/v2/api_test/feed_api_supervised_feed_unittest.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/feed/core/proto/v2/wire/feed_entry_point_source.pb.h"
-#include "components/feed/core/proto/v2/wire/feed_query.pb.h"
-#include "components/feed/core/v2/api_test/feed_api_test.h"
-#include "components/feed/core/v2/config.h"
-#include "components/feed/core/v2/feed_network.h"
-#include "components/feed/core/v2/public/stream_type.h"
-#include "components/feed/core/v2/public/types.h"
-#include "components/signin/public/identity_manager/identity_test_environment.h"
-#include "components/supervised_user/core/browser/child_account_service.h"
-#include "components/supervised_user/core/browser/supervised_user_preferences.h"
-#include "components/supervised_user/core/browser/supervised_user_service.h"
-#include "components/supervised_user/core/common/features.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// This file is for testing the Supervised Feed content.
-
-namespace feed::test {
-namespace {
-
-class FeedApiSupervisedUserTest : public FeedApiTest {
- public:
-  void SetUp() override {
-    supervised_user::RegisterProfilePrefs(profile_prefs_.registry());
-    supervised_user::EnableParentalControls(profile_prefs_);
-    is_supervised_account_ = true;
-
-    feature_list_.InitAndEnableFeature(
-        supervised_user::kKidFriendlyContentFeed);
-    FeedApiTest::SetUp();
-  }
-
- protected:
-  // Returns model state for `StreamKind::kSupervisedUser`.
-  std::unique_ptr<StreamModelUpdateRequest>
-  MakeTypicalInitialModelStateForSupervisedUser() {
-    return MakeTypicalInitialModelState(
-        0, kTestTimeEpoch, /*signed_in=*/true, /*logging_enabled=*/true,
-        /*privacy_notice_fulfilled=*/false,
-        feedstore::StreamKey(StreamType(StreamKind::kSupervisedUser)));
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-// Shows feed content for supervised users.
-TEST_F(FeedApiSupervisedUserTest, LoadSupervisedFeed) {
-  response_translator_.InjectResponse(
-      MakeTypicalInitialModelStateForSupervisedUser());
-  TestSupervisedFeedSurface surface(stream_.get());
-  WaitForIdleTaskQueue();
-
-  EXPECT_TRUE(network_.query_request_sent);
-  EXPECT_EQ(
-      std::vector<NetworkRequestType>({NetworkRequestType::kSupervisedFeed}),
-      network_.sent_request_types());
-
-  StreamType stream_type(StreamKind::kSupervisedUser);
-  // Verify the model is filled correctly.
-  ASSERT_EQ(stream_->GetModel(stream_type)->DumpStateForTesting(),
-            ModelStateFor(stream_type, store_.get()));
-  // Verify the data is written to the store.
-  EXPECT_STRINGS_EQUAL(
-      ModelStateFor(MakeTypicalInitialModelStateForSupervisedUser()),
-      ModelStateFor(stream_type, store_.get()));
-  EXPECT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
-}
-
-// Supervised feed is deleted after surface is detached.
-TEST_F(FeedApiSupervisedUserTest, DeleteSupervisedFeedOnDetachedSurface) {
-  response_translator_.InjectResponse(
-      MakeTypicalInitialModelStateForSupervisedUser());
-  TestSupervisedFeedSurface surface(stream_.get());
-  WaitForIdleTaskQueue();
-
-  surface.Detach();
-
-  WaitForModelToAutoUnload();
-  WaitForIdleTaskQueue();
-
-  StreamType stream_type(StreamKind::kSupervisedUser);
-  EXPECT_FALSE(stream_->GetModel(stream_type));
-}
-
-// Supervised feed should ignore quota.
-TEST_F(FeedApiSupervisedUserTest, SupervisedFeedShouldIgnoreQuota) {
-  LoadStreamStatus status = LoadStreamStatus::kNoStatus;
-  for (int i = 0; i < 50; i++) {
-    status =
-        stream_
-            ->ShouldMakeFeedQueryRequest(
-                StreamType(StreamKind::kSupervisedUser), LoadType::kInitialLoad)
-            .load_stream_status;
-  }
-
-  ASSERT_EQ(LoadStreamStatus::kNoStatus, status);
-}
-
-TEST_F(FeedApiSupervisedUserTest, WebFeedsDisabledForSupervisedAccounts) {
-  SetFeedConfigForTesting(Config());
-  response_translator_.InjectResponse(
-      MakeTypicalInitialModelStateForSupervisedUser());
-  TestSupervisedFeedSurface surface(stream_.get());
-  WaitForIdleTaskQueue();
-
-  ASSERT_FALSE(stream_->IsWebFeedEnabled());
-
-  // Wait until the delayed task would normally run, verify no request is made.
-  task_environment_.FastForwardBy(GetFeedConfig().fetch_web_feed_info_delay +
-                                  base::Seconds(1));
-  WaitForIdleTaskQueue();
-  ASSERT_EQ(0, network_.GetListFollowedWebFeedsRequestCount());
-}
-
-}  // namespace
-}  // namespace feed::test
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc
index bdc506f..4a930276 100644
--- a/components/feed/core/v2/api_test/feed_api_test.cc
+++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -369,8 +369,6 @@
           StreamType(StreamKind::kSingleWebFeed, web_feed_id, entry_point),
           stream,
           entry_point) {}
-TestSupervisedFeedSurface::TestSupervisedFeedSurface(FeedStream* stream)
-    : TestSurfaceBase(StreamType(StreamKind::kSupervisedUser), stream) {}
 
 TestReliabilityLoggingBridge::TestReliabilityLoggingBridge() = default;
 TestReliabilityLoggingBridge::~TestReliabilityLoggingBridge() = default;
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h
index 50cc3f1..663e0803 100644
--- a/components/feed/core/v2/api_test/feed_api_test.h
+++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -220,10 +220,6 @@
       std::string = "",
       SingleWebFeedEntryPoint entry_point = SingleWebFeedEntryPoint::kOther);
 };
-class TestSupervisedFeedSurface : public TestSurfaceBase {
- public:
-  explicit TestSupervisedFeedSurface(FeedStream* stream = nullptr);
-};
 
 class TestImageFetcher : public ImageFetcher {
  public:
diff --git a/components/optimization_guide/core/model_execution/feature_keys.h b/components/optimization_guide/core/model_execution/feature_keys.h
index e7bca05..c2b480d 100644
--- a/components/optimization_guide/core/model_execution/feature_keys.h
+++ b/components/optimization_guide/core/model_execution/feature_keys.h
@@ -40,6 +40,8 @@
       MODEL_EXECUTION_FEATURE_PASSWORD_CHANGE_SUBMISSION,
   kScamDetection =
       proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_SCAM_DETECTION,
+  kPermissionsAi =
+      proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_PERMISSIONS_AI,
 };
 
 inline std::ostream& operator<<(std::ostream& out,
@@ -73,6 +75,8 @@
       return out << "PasswordChangeSubmission";
     case ModelBasedCapabilityKey::kScamDetection:
       return out << "ScamDetection";
+    case ModelBasedCapabilityKey::kPermissionsAi:
+      return out << "PermissionsAi";
   }
   return out;
 }
@@ -164,6 +168,8 @@
         return ModelBasedCapabilityKey::kPasswordChangeSubmission;
     case proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_SCAM_DETECTION:
       return ModelBasedCapabilityKey::kScamDetection;
+    case proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_PERMISSIONS_AI:
+      return ModelBasedCapabilityKey::kPermissionsAi;
     case proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_UNSPECIFIED:
       NOTREACHED() << "Invalid feature";
   }
@@ -209,6 +215,9 @@
     case ModelBasedCapabilityKey::kScamDetection:
       return proto::ModelExecutionFeature::
           MODEL_EXECUTION_FEATURE_SCAM_DETECTION;
+    case ModelBasedCapabilityKey::kPermissionsAi:
+      return proto::ModelExecutionFeature::
+          MODEL_EXECUTION_FEATURE_PERMISSIONS_AI;
   }
 }
 
diff --git a/components/optimization_guide/core/model_execution/model_execution_features.cc b/components/optimization_guide/core/model_execution/model_execution_features.cc
index 3c6f4769..295b08fa 100644
--- a/components/optimization_guide/core/model_execution/model_execution_features.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_features.cc
@@ -153,6 +153,8 @@
           OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_HISTORY_QUERY_INTENT;
     case ModelBasedCapabilityKey::kScamDetection:
       return proto::OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_SCAM_DETECTION;
+    case ModelBasedCapabilityKey::kPermissionsAi:
+      return proto::OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_PERMISSIONS_AI;
     // The below capabilities never support on-device execution.
     case ModelBasedCapabilityKey::kFormsAnnotations:
     case ModelBasedCapabilityKey::kFormsPredictions:
diff --git a/components/optimization_guide/core/model_execution/model_execution_fetcher.cc b/components/optimization_guide/core/model_execution/model_execution_fetcher.cc
index 19863039..feacdff3 100644
--- a/components/optimization_guide/core/model_execution/model_execution_fetcher.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_fetcher.cc
@@ -223,6 +223,7 @@
     case ModelBasedCapabilityKey::kHistoryQueryIntent:
     case ModelBasedCapabilityKey::kPromptApi:
     case ModelBasedCapabilityKey::kScamDetection:
+    case ModelBasedCapabilityKey::kPermissionsAi:
     case ModelBasedCapabilityKey::kSummarize:
       // On-device only feature.
       NOTREACHED();
diff --git a/components/optimization_guide/core/model_execution/model_execution_util.cc b/components/optimization_guide/core/model_execution/model_execution_util.cc
index ba79a14..e5914e6 100644
--- a/components/optimization_guide/core/model_execution/model_execution_util.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_util.cc
@@ -56,6 +56,7 @@
     case ModelBasedCapabilityKey::kBlingPrototyping:
     case ModelBasedCapabilityKey::kPasswordChangeSubmission:
     case ModelBasedCapabilityKey::kScamDetection:
+    case ModelBasedCapabilityKey::kPermissionsAi:
       // Do not log requests for these features.
       return;
   }
@@ -98,6 +99,7 @@
     case ModelBasedCapabilityKey::kTest:
     case ModelBasedCapabilityKey::kBlingPrototyping:
     case ModelBasedCapabilityKey::kPasswordChangeSubmission:
+    case ModelBasedCapabilityKey::kPermissionsAi:
     case ModelBasedCapabilityKey::kScamDetection:
       // Do not log responses for these features.
       return;
diff --git a/components/optimization_guide/core/model_util.cc b/components/optimization_guide/core/model_util.cc
index 7477f28..630d0491 100644
--- a/components/optimization_guide/core/model_util.cc
+++ b/components/optimization_guide/core/model_util.cc
@@ -138,6 +138,8 @@
       return "ModelExecutionFeatureHistoryQueryIntent";
     case proto::OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_SCAM_DETECTION:
       return "ModelExecutionFeatureScamDetection";
+    case proto::OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_PERMISSIONS_AI:
+      return "ModelExecutionFeaturePermissionsAi";
     case proto::OPTIMIZATION_TARGET_EXPERIMENTAL_EMBEDDER:
       return "ExperimentalEmbedder";
     case proto::OPTIMIZATION_TARGET_SEGMENTATION_FEDCM_USER:
diff --git a/components/optimization_guide/core/optimization_guide_util.cc b/components/optimization_guide/core/optimization_guide_util.cc
index 717659ab..bb70bddc 100644
--- a/components/optimization_guide/core/optimization_guide_util.cc
+++ b/components/optimization_guide/core/optimization_guide_util.cc
@@ -100,6 +100,8 @@
       return "PasswordChangeSubmission";
     case proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_SCAM_DETECTION:
       return "ScamDetection";
+    case proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_PERMISSIONS_AI:
+      return "PermissionsAi";
     case proto::ModelExecutionFeature::MODEL_EXECUTION_FEATURE_UNSPECIFIED:
       return "Unknown";
       // Must be in sync with the ModelExecutionFeature variant in
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index d2dce19..5fdd6f6 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit d2dce193b98bc200e7b9d6c6894fe09fdcb16b39
+Subproject commit 5fdd6f6cda0ecc774859916adb4cf02184206560
diff --git a/components/optimization_guide/proto/BUILD.gn b/components/optimization_guide/proto/BUILD.gn
index 05c2b5f6..d5707c5 100644
--- a/components/optimization_guide/proto/BUILD.gn
+++ b/components/optimization_guide/proto/BUILD.gn
@@ -28,6 +28,7 @@
     "features/history_search_strings.proto",
     "features/model_prototyping.proto",
     "features/password_change_submission.proto",
+    "features/permissions_ai.proto",
     "features/product_specifications.proto",
     "features/prompt_api.proto",
     "features/scam_detection.proto",
diff --git a/components/optimization_guide/proto/model_execution.proto b/components/optimization_guide/proto/model_execution.proto
index 505e8d8..1601509 100644
--- a/components/optimization_guide/proto/model_execution.proto
+++ b/components/optimization_guide/proto/model_execution.proto
@@ -52,7 +52,7 @@
 }
 
 enum ModelExecutionFeature {
-  reserved 11;
+  reserved 11, 16;
 
   MODEL_EXECUTION_FEATURE_UNSPECIFIED = 0;
   MODEL_EXECUTION_FEATURE_COMPOSE = 1;
@@ -75,4 +75,5 @@
   MODEL_EXECUTION_FEATURE_BLING_PROTOTYPING = 13;
   MODEL_EXECUTION_FEATURE_PASSWORD_CHANGE_SUBMISSION = 14;
   MODEL_EXECUTION_FEATURE_SCAM_DETECTION = 15;
+  MODEL_EXECUTION_FEATURE_PERMISSIONS_AI = 17;
 }
diff --git a/components/optimization_guide/proto/model_quality_service.proto b/components/optimization_guide/proto/model_quality_service.proto
index 9c376d31..1169732c 100644
--- a/components/optimization_guide/proto/model_quality_service.proto
+++ b/components/optimization_guide/proto/model_quality_service.proto
@@ -21,6 +21,7 @@
 import "components/optimization_guide/proto/features/history_query_intent.proto";
 import "components/optimization_guide/proto/features/model_prototyping.proto";
 import "components/optimization_guide/proto/features/password_change_submission.proto";
+import "components/optimization_guide/proto/features/permissions_ai.proto";
 import "components/optimization_guide/proto/features/product_specifications.proto";
 import "components/optimization_guide/proto/features/scam_detection.proto";
 import "components/optimization_guide/proto/features/tab_organization.proto";
@@ -64,6 +65,8 @@
 
     ScamDetectionLoggingData scam_detection = 17;
 
+    PermissionsAILoggingData permissions_ai = 18;
+
     DefaultLoggingData default = 1000;
   }
 }
diff --git a/components/optimization_guide/proto/models.proto b/components/optimization_guide/proto/models.proto
index cd1a315..9063d3b 100644
--- a/components/optimization_guide/proto/models.proto
+++ b/components/optimization_guide/proto/models.proto
@@ -122,7 +122,7 @@
 
 // The scenarios for which the optimization guide has models for.
 enum OptimizationTarget {
-  reserved 14, 56;
+  reserved 14;
 
   OPTIMIZATION_TARGET_UNKNOWN = 0;
   // Should only be applied when the page load is predicted to be painful.
@@ -238,6 +238,8 @@
   OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_HISTORY_QUERY_INTENT = 54;
   // Target for scam detection feature config.
   OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_SCAM_DETECTION = 55;
+  // Target for Permissions AI feature config.
+  OPTIMIZATION_TARGET_MODEL_EXECUTION_FEATURE_PERMISSIONS_AI = 56;
   // Target for assessing embedding model performance.
   OPTIMIZATION_TARGET_EXPERIMENTAL_EMBEDDER = 57;
   // Target for segmentation: FedCM user.
diff --git a/components/os_crypt/async/browser/freedesktop_secret_key_provider.cc b/components/os_crypt/async/browser/freedesktop_secret_key_provider.cc
index dc46da9..e42e545 100644
--- a/components/os_crypt/async/browser/freedesktop_secret_key_provider.cc
+++ b/components/os_crypt/async/browser/freedesktop_secret_key_provider.cc
@@ -42,6 +42,7 @@
 constexpr char kSalt[] = "saltysalt";
 constexpr size_t kDerivedKeySizeInBits = 128;
 constexpr size_t kEncryptionIterations = 1;
+constexpr size_t kSecretLengthBytes = 16;
 
 template <typename ReplyArgs>
 void CallMethod(
@@ -125,6 +126,127 @@
 
 }  // namespace
 
+// A helper class to handle a Secret Service prompt. It is templated on the
+// return type expected from the prompt.
+template <typename T>
+class FreedesktopSecretKeyProvider::Prompter
+    : public base::RefCountedThreadSafe<Prompter<T>> {
+ public:
+  using PromptCallback = base::OnceCallback<void(
+      base::expected<T, FreedesktopSecretKeyProvider::ErrorDetail>)>;
+
+  static void Prompt(scoped_refptr<dbus::Bus> bus,
+                     dbus::ObjectProxy* object_proxy,
+                     const std::string& interface_name,
+                     const std::string& method_name,
+                     const DbusType& arguments,
+                     PromptCallback callback) {
+    auto handler =
+        base::MakeRefCounted<Prompter<T>>(std::move(bus), std::move(callback));
+    CallMethod(object_proxy, interface_name, method_name, arguments,
+               base::BindOnce(&Prompter::OnReply, handler));
+  }
+
+  Prompter(scoped_refptr<dbus::Bus> bus, PromptCallback callback)
+      : bus_(std::move(bus)), callback_(std::move(callback)) {}
+
+  Prompter(const Prompter&) = delete;
+  Prompter& operator=(const Prompter&) = delete;
+
+ private:
+  friend class base::RefCountedThreadSafe<Prompter<T>>;
+  using ErrorDetail = FreedesktopSecretKeyProvider::ErrorDetail;
+
+  ~Prompter() {
+    Finish(base::unexpected(ErrorDetail::kDestructedBeforeComplete));
+  }
+
+  void OnReply(
+      base::expected<DbusParameters<T, DbusObjectPath>, ErrorDetail> reply) {
+    if (!reply.has_value()) {
+      Finish(base::unexpected(reply.error()));
+      return;
+    }
+    auto& [value, prompt] = reply->value();
+    if (prompt.value().value() == "/") {
+      Finish(std::move(value));
+    } else {
+      prompt_path_ = prompt.value();
+      StartPrompt();
+    }
+  }
+
+  void StartPrompt() {
+    auto* prompt_proxy = bus_->GetObjectProxy(
+        FreedesktopSecretKeyProvider::kSecretServiceName, prompt_path_);
+    prompt_proxy->ConnectToSignal(
+        FreedesktopSecretKeyProvider::kSecretPromptInterface, "Completed",
+        base::BindRepeating(&Prompter::OnPromptCompletedSignal, this),
+        base::BindOnce(&Prompter::OnSignalConnected, this));
+    CallMethod(prompt_proxy,
+               FreedesktopSecretKeyProvider::kSecretPromptInterface,
+               FreedesktopSecretKeyProvider::kMethodPrompt, DbusString(""),
+               base::BindOnce(&Prompter::OnPromptResponse, this));
+  }
+
+  void OnPromptResponse(base::expected<DbusVoid, ErrorDetail> response) {
+    if (!response.has_value()) {
+      LOG(ERROR) << "Prompt call returned no response.";
+      Finish(base::unexpected(response.error()));
+    }
+  }
+
+  void OnSignalConnected(const std::string& interface_name,
+                         const std::string& signal_name,
+                         bool connected) {
+    if (!connected) {
+      LOG(ERROR) << "Failed to connect to Prompt.Completed signal.";
+      Finish(base::unexpected(ErrorDetail::kPromptFailedSignalConnection));
+    }
+  }
+
+  void OnPromptCompletedSignal(dbus::Signal* signal) {
+    dbus::MessageReader reader(signal);
+    DbusParameters<DbusBoolean, DbusVariant> args;
+    if (!args.Read(&reader)) {
+      LOG(ERROR) << "Failed to read Prompt.Completed signal args.";
+      Finish(base::unexpected(ErrorDetail::kInvalidSignalFormat));
+      return;
+    }
+
+    auto& [dismissed, variant] = args.value();
+    if (dismissed.value()) {
+      Finish(base::unexpected(ErrorDetail::kPromptDismissed));
+      return;
+    }
+
+    T* value = variant.GetAs<T>();
+    if (!value) {
+      LOG(ERROR) << "Failed to parse prompt result.";
+      Finish(base::unexpected(ErrorDetail::kInvalidVariantFormat));
+      return;
+    }
+
+    Finish(base::ok(std::move(*value)));
+  }
+
+  void Finish(base::expected<T, ErrorDetail> result) {
+    if (!prompt_path_.value().empty()) {
+      bus_->RemoveObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                              prompt_path_, base::DoNothing());
+      prompt_path_ = dbus::ObjectPath();
+    }
+    if (callback_) {
+      std::move(callback_).Run(std::move(result));
+    }
+    bus_.reset();
+  }
+
+  scoped_refptr<dbus::Bus> bus_;
+  PromptCallback callback_;
+  dbus::ObjectPath prompt_path_;
+};
+
 FreedesktopSecretKeyProvider::FreedesktopSecretKeyProvider(
     bool use_for_encryption,
     const std::string& product_name,
@@ -198,8 +320,17 @@
                    &FreedesktopSecretKeyProvider::OnGetCollectionLabelResponse,
                    weak_ptr_factory_.GetWeakPtr()));
   } else {
-    NOTIMPLEMENTED();
-    FinalizeFailure(InitStatus::kCreateCollectionFailed, ErrorDetail::kNone);
+    // No default collection, create it
+    auto* service_proxy = bus_->GetObjectProxy(
+        kSecretServiceName, dbus::ObjectPath(kSecretServicePath));
+    DbusDictionary props = MakeDbusDictionary(
+        kSecretCollectionLabelProperty, DbusString(kDefaultCollectionLabel));
+
+    Prompter<DbusObjectPath>::Prompt(
+        bus_, service_proxy, kSecretServiceInterface, kMethodCreateCollection,
+        MakeDbusParameters(std::move(props), DbusString(kDefaultAlias)),
+        base::BindOnce(&FreedesktopSecretKeyProvider::OnCreateCollection,
+                       weak_ptr_factory_.GetWeakPtr()));
   }
 }
 
@@ -224,27 +355,45 @@
   UnlockDefaultCollection();
 }
 
+void FreedesktopSecretKeyProvider::OnCreateCollection(
+    base::expected<DbusObjectPath, ErrorDetail> create_collection_reply) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!create_collection_reply.has_value()) {
+    FinalizeFailure(InitStatus::kCreateCollectionFailed,
+                    create_collection_reply.error());
+    return;
+  }
+  if (create_collection_reply->value().value() == "/") {
+    FinalizeFailure(InitStatus::kCreateCollectionFailed,
+                    ErrorDetail::kEmptyObjectPaths);
+    return;
+  }
+  default_collection_proxy_ = bus_->GetObjectProxy(
+      kSecretServiceName, create_collection_reply->value());
+  UnlockDefaultCollection();
+}
+
 void FreedesktopSecretKeyProvider::UnlockDefaultCollection() {
   auto* service_proxy = bus_->GetObjectProxy(
       kSecretServiceName, dbus::ObjectPath(kSecretServicePath));
 
   auto objects =
       MakeDbusArray(DbusObjectPath(default_collection_proxy_->object_path()));
-  CallMethod(service_proxy, kSecretServiceInterface, kMethodUnlock, objects,
-             base::BindOnce(&FreedesktopSecretKeyProvider::OnUnlock,
-                            weak_ptr_factory_.GetWeakPtr()));
+  Prompter<DbusArray<DbusObjectPath>>::Prompt(
+      bus_, service_proxy, kSecretServiceInterface, kMethodUnlock, objects,
+      base::BindOnce(&FreedesktopSecretKeyProvider::OnUnlock,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void FreedesktopSecretKeyProvider::OnUnlock(
-    base::expected<DbusParameters<DbusArray<DbusObjectPath>, DbusObjectPath>,
-                   ErrorDetail> unlocked_collection) {
+    base::expected<DbusArray<DbusObjectPath>, ErrorDetail>
+        unlocked_collection) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!unlocked_collection.has_value()) {
     FinalizeFailure(InitStatus::kUnlockFailed, unlocked_collection.error());
     return;
   }
-  const auto& [collection_paths, _] = unlocked_collection->value();
-  if (collection_paths.value().empty()) {
+  if (unlocked_collection->value().empty()) {
     FinalizeFailure(InitStatus::kUnlockFailed, ErrorDetail::kEmptyObjectPaths);
     return;
   }
@@ -292,8 +441,8 @@
   }
 
   if (results->value().empty()) {
-    NOTIMPLEMENTED();
-    FinalizeFailure(InitStatus::kCreateItemFailed, ErrorDetail::kNone);
+    // No items found, attempt KWallet migration.
+    TryKWalletMigration();
     return;
   }
 
@@ -330,6 +479,147 @@
   DeriveKeyFromSecret(base::span(*secret_bytes));
 }
 
+void FreedesktopSecretKeyProvider::TryKWalletMigration() {
+  if (kwallet_candidate_index_ >= kKWalletCandidates.size()) {
+    // No KWallet
+    CreateItem(base::MakeRefCounted<base::RefCountedString>(
+        base::Base64Encode(base::RandBytesAsVector(kSecretLengthBytes))));
+    return;
+  }
+
+  const auto& service_and_path = kKWalletCandidates[kwallet_candidate_index_];
+  kwallet_proxy_ =
+      bus_->GetObjectProxy(service_and_path.kwallet_service,
+                           dbus::ObjectPath(service_and_path.kwallet_path));
+  dbus_utils::NameHasOwner(
+      bus_.get(), service_and_path.kwallet_service,
+      base::BindOnce(&FreedesktopSecretKeyProvider::OnNameHasOwnerForKWallet,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void FreedesktopSecretKeyProvider::OnNameHasOwnerForKWallet(
+    std::optional<bool> has_owner) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!has_owner.value_or(false)) {
+    kwallet_candidate_index_++;
+    TryKWalletMigration();
+    return;
+  }
+
+  CallMethod(kwallet_proxy_, kKWalletInterface, kKWalletMethodIsEnabled,
+             DbusVoid(),
+             base::BindOnce(&FreedesktopSecretKeyProvider::OnKWalletIsEnabled,
+                            weak_ptr_factory_.GetWeakPtr()));
+}
+
+void FreedesktopSecretKeyProvider::OnKWalletIsEnabled(
+    base::expected<DbusBoolean, ErrorDetail> is_enabled) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!is_enabled.has_value() || !is_enabled->value()) {
+    kwallet_candidate_index_++;
+    TryKWalletMigration();
+    return;
+  }
+  CallMethod(
+      kwallet_proxy_, kKWalletInterface, kKWalletMethodNetworkWallet,
+      DbusVoid(),
+      base::BindOnce(&FreedesktopSecretKeyProvider::OnKWalletNetworkWallet,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void FreedesktopSecretKeyProvider::OnKWalletNetworkWallet(
+    base::expected<DbusString, ErrorDetail> wallet_name) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!wallet_name.has_value()) {
+    kwallet_candidate_index_++;
+    TryKWalletMigration();
+    return;
+  }
+  CallMethod(kwallet_proxy_, kKWalletInterface, kKWalletMethodOpen,
+             MakeDbusParameters(std::move(*wallet_name), DbusInt64(0),
+                                DbusString(product_name_)),
+             base::BindOnce(&FreedesktopSecretKeyProvider::OnKWalletOpen,
+                            weak_ptr_factory_.GetWeakPtr()));
+}
+
+void FreedesktopSecretKeyProvider::OnKWalletOpen(
+    base::expected<DbusInt32, ErrorDetail> handle_reply) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  int32_t handle = handle_reply.has_value() ? handle_reply->value() : -1;
+  if (handle < 0) {
+    kwallet_candidate_index_++;
+    TryKWalletMigration();
+    return;
+  }
+  CallMethod(
+      kwallet_proxy_, kKWalletInterface, kKWalletMethodReadPassword,
+      MakeDbusParameters(DbusInt32(handle), DbusString(kKWalletFolder),
+                         DbusString(kKeyName), DbusString(product_name_)),
+      base::BindOnce(&FreedesktopSecretKeyProvider::OnKWalletReadPassword,
+                     weak_ptr_factory_.GetWeakPtr(), handle));
+}
+
+void FreedesktopSecretKeyProvider::OnKWalletReadPassword(
+    int32_t handle,
+    base::expected<DbusString, ErrorDetail> secret_reply) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CallMethod(kwallet_proxy_, kKWalletInterface, kKWalletMethodClose,
+             MakeDbusParameters(DbusInt32(handle), DbusBoolean(false),
+                                DbusString(product_name_)),
+             base::BindOnce([](base::expected<DbusInt32, ErrorDetail>) {}));
+
+  if (!secret_reply.has_value() || secret_reply->value().empty()) {
+    // No secret found. Try next candidate.
+    kwallet_candidate_index_++;
+    TryKWalletMigration();
+    return;
+  }
+
+  CreateItem(
+      base::MakeRefCounted<base::RefCountedString>(secret_reply->value()));
+}
+
+void FreedesktopSecretKeyProvider::CreateItem(
+    scoped_refptr<base::RefCountedMemory> secret) {
+  auto attributes =
+      MakeDbusArray(MakeDbusDictEntry(DbusString(kApplicationAttributeKey),
+                                      DbusString(kAppName)),
+                    MakeDbusDictEntry(DbusString(kSchemaAttributeKey),
+                                      DbusString(kSchemaAttributeValue)));
+  auto props =
+      MakeDbusDictionary(kSecretItemAttributesProperty, std::move(attributes),
+                         kSecretItemLabelProperty, DbusString(kKeyName));
+
+  auto secret_struct = MakeDbusStruct(
+      DbusObjectPath(session_proxy_->object_path()),
+      DbusByteArray(base::MakeRefCounted<base::RefCountedBytes>()),
+      DbusByteArray(secret), DbusString(kMimePlain));
+  auto* collection_proxy = bus_->GetObjectProxy(
+      kSecretServiceName, default_collection_proxy_->object_path());
+  Prompter<DbusObjectPath>::Prompt(
+      bus_, collection_proxy, kSecretCollectionInterface, kMethodCreateItem,
+      MakeDbusParameters(std::move(props), std::move(secret_struct),
+                         DbusBoolean(false)),
+      base::BindOnce(&FreedesktopSecretKeyProvider::OnCreateItem,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(secret)));
+}
+
+void FreedesktopSecretKeyProvider::OnCreateItem(
+    scoped_refptr<base::RefCountedMemory> secret,
+    base::expected<DbusObjectPath, ErrorDetail> created_item) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!created_item.has_value()) {
+    FinalizeFailure(InitStatus::kCreateItemFailed, created_item.error());
+    return;
+  }
+  if (created_item->value().value().empty()) {
+    FinalizeFailure(InitStatus::kCreateItemFailed,
+                    ErrorDetail::kEmptyObjectPaths);
+    return;
+  }
+  DeriveKeyFromSecret(*secret);
+}
+
 void FreedesktopSecretKeyProvider::DeriveKeyFromSecret(
     base::span<const uint8_t> secret) {
   static_assert(kDerivedKeySizeInBits % 8 == 0);
diff --git a/components/os_crypt/async/browser/freedesktop_secret_key_provider.h b/components/os_crypt/async/browser/freedesktop_secret_key_provider.h
index da2c899..62fff980 100644
--- a/components/os_crypt/async/browser/freedesktop_secret_key_provider.h
+++ b/components/os_crypt/async/browser/freedesktop_secret_key_provider.h
@@ -13,6 +13,7 @@
 #include "base/files/scoped_file.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/types/expected.h"
@@ -59,7 +60,9 @@
     kInvalidSignalFormat = 4,
     kInvalidVariantFormat = 5,
     kNoResponse = 6,
-    kMaxValue = kNoResponse,
+    kPromptDismissed = 7,
+    kPromptFailedSignalConnection = 8,
+    kMaxValue = kPromptFailedSignalConnection,
   };
 
   FreedesktopSecretKeyProvider(bool use_for_encryption,
@@ -74,8 +77,15 @@
 
  private:
   FRIEND_TEST_ALL_PREFIXES(FreedesktopSecretKeyProviderTest, BasicHappyPath);
+  FRIEND_TEST_ALL_PREFIXES(FreedesktopSecretKeyProviderTest,
+                           CreateCollectionAndItemWithUnlockPrompt);
+  FRIEND_TEST_ALL_PREFIXES(FreedesktopSecretKeyProviderTest,
+                           MigrateFromKWallet);
   friend class FreedesktopSecretKeyProviderCompatTest;
 
+  template <typename T>
+  class Prompter;
+
   using DbusSecret = DbusStruct</*session=*/DbusObjectPath,
                                 /*parameters=*/DbusByteArray,
                                 /*value=*/DbusByteArray,
@@ -90,16 +100,28 @@
   static constexpr char kSecretItemInterface[] = "org.freedesktop.Secret.Item";
   static constexpr char kSecretSessionInterface[] =
       "org.freedesktop.Secret.Session";
+  static constexpr char kSecretPromptInterface[] =
+      "org.freedesktop.Secret.Prompt";
 
   static constexpr char kMethodReadAlias[] = "ReadAlias";
+  static constexpr char kMethodCreateCollection[] = "CreateCollection";
   static constexpr char kMethodGetSecret[] = "GetSecret";
   static constexpr char kMethodOpenSession[] = "OpenSession";
+  static constexpr char kMethodCreateItem[] = "CreateItem";
   static constexpr char kMethodUnlock[] = "Unlock";
   static constexpr char kMethodClose[] = "Close";
   static constexpr char kMethodSearchItems[] = "SearchItems";
   static constexpr char kPropertiesInterface[] =
       "org.freedesktop.DBus.Properties";
   static constexpr char kMethodGet[] = "Get";
+  static constexpr char kMethodPrompt[] = "Prompt";
+
+  static constexpr char kKWalletInterface[] = "org.kde.KWallet";
+  static constexpr char kKWalletMethodIsEnabled[] = "isEnabled";
+  static constexpr char kKWalletMethodNetworkWallet[] = "networkWallet";
+  static constexpr char kKWalletMethodOpen[] = "open";
+  static constexpr char kKWalletMethodReadPassword[] = "readPassword";
+  static constexpr char kKWalletMethodClose[] = "close";
 
   static constexpr char kDefaultAlias[] = "default";
 
@@ -123,27 +145,58 @@
   static constexpr char kLabelProperty[] = "Label";
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  static constexpr char kKWalletFolder[] = "Chrome Keys";
+  static constexpr char kKeyName[] = "Chrome Safe Storage";
   static constexpr char kAppName[] = "chrome";
 #else
+  static constexpr char kKWalletFolder[] = "Chromium Keys";
+  static constexpr char kKeyName[] = "Chromium Safe Storage";
   static constexpr char kAppName[] = "chromium";
 #endif
 
+  struct KwalletServiceAndPath {
+    const char* kwallet_service;
+    const char* kwallet_path;
+  };
+  static constexpr auto kKWalletCandidates =
+      std::to_array<KwalletServiceAndPath>({
+          {"org.kde.kwalletd6", "/modules/kwalletd6"},
+          {"org.kde.kwalletd5", "/modules/kwalletd5"},
+          {"org.kde.kwalletd", "/modules/kwalletd"},
+      });
+
   void OnServiceStarted(std::optional<bool> service_started);
+
   void OnReadAliasDefault(
       base::expected<DbusObjectPath, ErrorDetail> collection_path);
   void OnGetCollectionLabelResponse(
       base::expected<DbusVariant, ErrorDetail> variant);
-  void OnUnlock(
-      base::expected<DbusParameters<DbusArray<DbusObjectPath>, DbusObjectPath>,
-                     ErrorDetail> unlocked_collection);
+  void OnCreateCollection(
+      base::expected<DbusObjectPath, ErrorDetail> create_collection_reply);
+  void OnUnlock(base::expected<DbusArray<DbusObjectPath>, ErrorDetail>
+                    unlocked_collection);
   void OnOpenSession(base::expected<DbusParameters<DbusVariant, DbusObjectPath>,
                                     ErrorDetail> session_reply);
   void OnSearchItems(
       base::expected<DbusArray<DbusObjectPath>, ErrorDetail> results);
   void OnGetSecret(base::expected<DbusSecret, ErrorDetail> secret_reply);
 
+  // KWallet migration
+  void TryKWalletMigration();
+  void OnNameHasOwnerForKWallet(std::optional<bool> has_owner);
+  void OnKWalletIsEnabled(base::expected<DbusBoolean, ErrorDetail> is_enabled);
+  void OnKWalletNetworkWallet(
+      base::expected<DbusString, ErrorDetail> wallet_name);
+  void OnKWalletOpen(base::expected<DbusInt32, ErrorDetail> handle_reply);
+  void OnKWalletReadPassword(
+      int32_t handle,
+      base::expected<DbusString, ErrorDetail> secret_reply);
+
   void UnlockDefaultCollection();
   void OpenSession();
+  void CreateItem(scoped_refptr<base::RefCountedMemory> secret);
+  void OnCreateItem(scoped_refptr<base::RefCountedMemory> secret,
+                    base::expected<DbusObjectPath, ErrorDetail> created_item);
   void DeriveKeyFromSecret(base::span<const uint8_t> secret);
   void FinalizeSuccess(Encryptor::Key key);
   void FinalizeFailure(InitStatus status, ErrorDetail detail);
@@ -154,6 +207,10 @@
   raw_ptr<dbus::ObjectProxy> session_proxy_ = nullptr;
   bool session_opened_ = false;
 
+  // For KWallet migration
+  raw_ptr<dbus::ObjectProxy> kwallet_proxy_ = nullptr;
+  size_t kwallet_candidate_index_ = 0;
+
   const bool use_for_encryption_;
   const std::string product_name_;
   scoped_refptr<dbus::Bus> bus_;
diff --git a/components/os_crypt/async/browser/freedesktop_secret_key_provider_unittest.cc b/components/os_crypt/async/browser/freedesktop_secret_key_provider_unittest.cc
index ad03527..bda063f5 100644
--- a/components/os_crypt/async/browser/freedesktop_secret_key_provider_unittest.cc
+++ b/components/os_crypt/async/browser/freedesktop_secret_key_provider_unittest.cc
@@ -36,6 +36,14 @@
 constexpr char kSessionPath[] = "/org/freedesktop/secrets/session/test_session";
 constexpr char kItemPath[] =
     "/org/freedesktop/secrets/collection/default/item0";
+constexpr char kCollectionPromptPath[] =
+    "/org/freedesktop/secrets/prompt/collection_prompt";
+constexpr char kUnlockPromptPath[] =
+    "/org/freedesktop/secrets/prompt/unlock_prompt";
+constexpr char kItemPromptPath[] =
+    "/org/freedesktop/secrets/prompt/item_prompt";
+constexpr char kNetworkWallet[] = "kdewallet";
+constexpr int32_t kKWalletHandle = 42;
 
 constexpr char kFakeSecret[] = "c3VwZXJfc2VjcmV0X2tleQ==";
 
@@ -246,4 +254,436 @@
   EXPECT_TRUE(key.has_value());
 }
 
+TEST(FreedesktopSecretKeyProviderTest,
+     CreateCollectionAndItemWithUnlockPrompt) {
+  auto mock_bus = base::MakeRefCounted<dbus::MockBus>(dbus::Bus::Options());
+
+  EXPECT_CALL(*mock_bus, AssertOnOriginThread()).WillRepeatedly([] {});
+
+  // Initialize object proxies
+  auto mock_dbus_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), DBUS_SERVICE_DBUS, dbus::ObjectPath(DBUS_PATH_DBUS));
+  EXPECT_CALL(*mock_bus, GetObjectProxy(DBUS_SERVICE_DBUS,
+                                        dbus::ObjectPath(DBUS_PATH_DBUS)))
+      .WillRepeatedly(Return(mock_dbus_proxy.get()));
+  auto mock_service_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+      dbus::ObjectPath(FreedesktopSecretKeyProvider::kSecretServicePath));
+  EXPECT_CALL(
+      *mock_bus,
+      GetObjectProxy(
+          FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(FreedesktopSecretKeyProvider::kSecretServicePath)))
+      .WillRepeatedly(Return(mock_service_proxy.get()));
+  auto mock_collection_prompt_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(kCollectionPromptPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kCollectionPromptPath)))
+      .WillRepeatedly(Return(mock_collection_prompt_proxy.get()));
+  auto mock_unlock_prompt_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(kUnlockPromptPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kUnlockPromptPath)))
+      .WillRepeatedly(Return(mock_unlock_prompt_proxy.get()));
+  auto mock_item_prompt_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(kItemPromptPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kItemPromptPath)))
+      .WillRepeatedly(Return(mock_item_prompt_proxy.get()));
+  auto mock_session_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+      dbus::ObjectPath(kSessionPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kSessionPath)))
+      .WillRepeatedly(Return(mock_session_proxy.get()));
+  auto mock_collection_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(kCollectionPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kCollectionPath)))
+      .WillRepeatedly(Return(mock_collection_proxy.get()));
+  auto mock_item_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+      dbus::ObjectPath(kItemPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kItemPath)))
+      .WillRepeatedly(Return(mock_item_proxy.get()));
+
+  // NameHasOwner for Secret Service
+  EXPECT_CALL(*mock_dbus_proxy,
+              Call(DBUS_INTERFACE_DBUS, "NameHasOwner",
+                   MatchArgs(DbusString(
+                       FreedesktopSecretKeyProvider::kSecretServiceName)),
+                   _))
+      .WillOnce(RespondWith(DbusBoolean(true)));
+
+  // ReadAlias("default") returns no default collection
+  EXPECT_CALL(
+      *mock_service_proxy,
+      Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+           FreedesktopSecretKeyProvider::kMethodReadAlias,
+           MatchArgs(DbusString(FreedesktopSecretKeyProvider::kDefaultAlias)),
+           _))
+      .WillOnce(RespondWith(DbusObjectPath(dbus::ObjectPath("/"))));
+
+  // CreateCollection returns a prompt
+  EXPECT_CALL(*mock_service_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+                   "CreateCollection", _, _))
+      .WillOnce(RespondWith(MakeDbusParameters(
+          DbusObjectPath(dbus::ObjectPath("/")),
+          DbusObjectPath(dbus::ObjectPath(kCollectionPromptPath)))));
+
+  EXPECT_CALL(*mock_collection_prompt_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretPromptInterface,
+                   FreedesktopSecretKeyProvider::kMethodPrompt, _, _))
+      .WillOnce(RespondWith(DbusVoid()));
+
+  EXPECT_CALL(*mock_collection_prompt_proxy, DoConnectToSignal(_, _, _, _))
+      .WillOnce([](const std::string& interface_name,
+                   const std::string& signal_name,
+                   dbus::ObjectProxy::SignalCallback signal_callback,
+                   dbus::ObjectProxy::OnConnectedCallback* on_connected) {
+        // Connected successfully
+        std::move(*on_connected).Run(interface_name, signal_name, true);
+
+        // Trigger the signal callback with a non-empty collection path now
+        auto signal = dbus::Signal(interface_name, signal_name);
+        dbus::MessageWriter writer(&signal);
+        // Prompt completed: dismissed = false, return the newly created
+        // collection path
+        DbusParameters<DbusBoolean, DbusVariant> args(
+            DbusBoolean(false),
+            MakeDbusVariant(DbusObjectPath(dbus::ObjectPath(kCollectionPath))));
+        args.Write(&writer);
+        signal_callback.Run(&signal);
+      });
+
+  // Unlock collection returns a prompt
+  EXPECT_CALL(*mock_service_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+                   FreedesktopSecretKeyProvider::kMethodUnlock,
+                   MatchArgs(MakeDbusArray(
+                       DbusObjectPath(dbus::ObjectPath(kCollectionPath)))),
+                   _))
+      .WillOnce(RespondWith(MakeDbusParameters(
+          DbusArray<DbusObjectPath>(),
+          DbusObjectPath(dbus::ObjectPath(kUnlockPromptPath)))));
+
+  EXPECT_CALL(*mock_unlock_prompt_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretPromptInterface,
+                   FreedesktopSecretKeyProvider::kMethodPrompt, _, _))
+      .WillOnce(RespondWith(DbusVoid()));
+
+  EXPECT_CALL(*mock_unlock_prompt_proxy, DoConnectToSignal(_, _, _, _))
+      .WillOnce([](const std::string& interface_name,
+                   const std::string& signal_name,
+                   dbus::ObjectProxy::SignalCallback signal_callback,
+                   dbus::ObjectProxy::OnConnectedCallback* on_connected) {
+        std::move(*on_connected).Run(interface_name, signal_name, true);
+
+        auto signal = dbus::Signal(interface_name, signal_name);
+        dbus::MessageWriter writer(&signal);
+        DbusParameters<DbusBoolean, DbusVariant> args(
+            DbusBoolean(false), MakeDbusVariant(MakeDbusArray(DbusObjectPath(
+                                    dbus::ObjectPath(kCollectionPath)))));
+        args.Write(&writer);
+        signal_callback.Run(&signal);
+      });
+
+  // OpenSession
+  EXPECT_CALL(*mock_service_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+                   FreedesktopSecretKeyProvider::kMethodOpenSession, _, _))
+      .WillOnce(RespondWith(
+          MakeDbusParameters(MakeDbusVariant(DbusString("")),
+                             DbusObjectPath(dbus::ObjectPath(kSessionPath)))));
+
+  // SearchItems returns empty
+  EXPECT_CALL(*mock_collection_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretCollectionInterface,
+                   FreedesktopSecretKeyProvider::kMethodSearchItems, _, _))
+      .WillOnce(RespondWith(DbusArray<DbusObjectPath>()));
+
+  // Don't try to migrate from KWallet.
+  for (const auto& service_and_path :
+       FreedesktopSecretKeyProvider::kKWalletCandidates) {
+    auto mock_kwallet6_proxy =
+        base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+            mock_bus.get(), service_and_path.kwallet_service,
+            dbus::ObjectPath(service_and_path.kwallet_path));
+    EXPECT_CALL(*mock_bus,
+                GetObjectProxy(service_and_path.kwallet_service,
+                               dbus::ObjectPath(service_and_path.kwallet_path)))
+        .WillRepeatedly(Return(mock_dbus_proxy.get()));
+    EXPECT_CALL(
+        *mock_dbus_proxy,
+        Call(DBUS_INTERFACE_DBUS, "NameHasOwner",
+             MatchArgs(DbusString(service_and_path.kwallet_service)), _))
+        .WillOnce(RespondWith(DbusBoolean(false)));
+  }
+
+  // CreateItem
+  EXPECT_CALL(*mock_collection_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretCollectionInterface,
+                   "CreateItem", _, _))
+      .WillOnce(RespondWith(MakeDbusParameters(
+          DbusObjectPath(dbus::ObjectPath("/")),
+          DbusObjectPath(dbus::ObjectPath(kItemPromptPath)))));
+
+  EXPECT_CALL(*mock_item_prompt_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretPromptInterface,
+                   FreedesktopSecretKeyProvider::kMethodPrompt, _, _))
+      .WillOnce(RespondWith(DbusVoid()));
+
+  EXPECT_CALL(*mock_item_prompt_proxy, DoConnectToSignal(_, _, _, _))
+      .WillOnce([&](const std::string& interface_name,
+                    const std::string& signal_name,
+                    dbus::ObjectProxy::SignalCallback signal_callback,
+                    dbus::ObjectProxy::OnConnectedCallback* on_connected) {
+        std::move(*on_connected).Run(interface_name, signal_name, true);
+
+        auto signal = dbus::Signal(interface_name, signal_name);
+        dbus::MessageWriter writer(&signal);
+        // Return a valid item path now
+        DbusParameters<DbusBoolean, DbusVariant> args(
+            DbusBoolean(false),
+            MakeDbusVariant(DbusObjectPath(dbus::ObjectPath(kItemPath))));
+        args.Write(&writer);
+        signal_callback.Run(&signal);
+      });
+
+  // CloseSession
+  EXPECT_CALL(*mock_session_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretSessionInterface,
+                   FreedesktopSecretKeyProvider::kMethodClose,
+                   MatchArgs(DbusVoid()), _))
+      .WillOnce(RespondWith(DbusVoid()));
+
+  FreedesktopSecretKeyProvider provider(/*use_for_encryption=*/true,
+                                        kProductName, mock_bus);
+  std::string tag;
+  std::optional<Encryptor::Key> key;
+  provider.GetKey(base::BindLambdaForTesting(
+      [&](const std::string& returned_tag,
+          std::optional<Encryptor::Key> returned_key) {
+        tag = returned_tag;
+        key = std::move(returned_key);
+      }));
+
+  EXPECT_EQ(tag, "v11");
+  EXPECT_TRUE(key.has_value());
+}
+
+TEST(FreedesktopSecretKeyProviderTest, MigrateFromKWallet) {
+  auto mock_bus = base::MakeRefCounted<dbus::MockBus>(dbus::Bus::Options());
+
+  // Initialize object proxies
+  auto mock_dbus_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), DBUS_SERVICE_DBUS, dbus::ObjectPath(DBUS_PATH_DBUS));
+  EXPECT_CALL(*mock_bus, GetObjectProxy(DBUS_SERVICE_DBUS,
+                                        dbus::ObjectPath(DBUS_PATH_DBUS)))
+      .WillRepeatedly(Return(mock_dbus_proxy.get()));
+
+  auto mock_service_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+      dbus::ObjectPath(FreedesktopSecretKeyProvider::kSecretServicePath));
+  EXPECT_CALL(
+      *mock_bus,
+      GetObjectProxy(
+          FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(FreedesktopSecretKeyProvider::kSecretServicePath)))
+      .WillRepeatedly(Return(mock_service_proxy.get()));
+
+  auto mock_collection_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+          dbus::ObjectPath(kCollectionPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kCollectionPath)))
+      .WillRepeatedly(Return(mock_collection_proxy.get()));
+
+  auto mock_session_proxy = base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+      mock_bus.get(), FreedesktopSecretKeyProvider::kSecretServiceName,
+      dbus::ObjectPath(kSessionPath));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(FreedesktopSecretKeyProvider::kSecretServiceName,
+                             dbus::ObjectPath(kSessionPath)))
+      .WillRepeatedly(Return(mock_session_proxy.get()));
+
+  // NameHasOwner for Secret Service
+  EXPECT_CALL(*mock_dbus_proxy,
+              Call(DBUS_INTERFACE_DBUS, "NameHasOwner",
+                   MatchArgs(DbusString(
+                       FreedesktopSecretKeyProvider::kSecretServiceName)),
+                   _))
+      .WillOnce(RespondWith(DbusBoolean(true)));
+
+  // ReadAlias("default")
+  EXPECT_CALL(
+      *mock_service_proxy,
+      Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+           FreedesktopSecretKeyProvider::kMethodReadAlias,
+           MatchArgs(DbusString(FreedesktopSecretKeyProvider::kDefaultAlias)),
+           _))
+      .WillOnce(RespondWith(DbusObjectPath(dbus::ObjectPath(kCollectionPath))));
+
+  // Get(Label) on the default collection
+  EXPECT_CALL(
+      *mock_collection_proxy,
+      Call(FreedesktopSecretKeyProvider::kPropertiesInterface,
+           FreedesktopSecretKeyProvider::kMethodGet,
+           MatchArgs(MakeDbusParameters(
+               DbusString(
+                   FreedesktopSecretKeyProvider::kSecretCollectionInterface),
+               DbusString(FreedesktopSecretKeyProvider::kLabelProperty))),
+           _))
+      .WillOnce(RespondWith(MakeDbusVariant(
+          DbusString(FreedesktopSecretKeyProvider::kDefaultCollectionLabel))));
+
+  // Unlock the default collection (already unlocked)
+  EXPECT_CALL(*mock_service_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+                   FreedesktopSecretKeyProvider::kMethodUnlock,
+                   MatchArgs(MakeDbusArray(
+                       DbusObjectPath(dbus::ObjectPath(kCollectionPath)))),
+                   _))
+      .WillOnce(RespondWith(MakeDbusParameters(
+          MakeDbusArray(DbusObjectPath(dbus::ObjectPath(kCollectionPath))),
+          DbusObjectPath(dbus::ObjectPath("/")))));
+
+  // OpenSession
+  EXPECT_CALL(*mock_service_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretServiceInterface,
+                   FreedesktopSecretKeyProvider::kMethodOpenSession, _, _))
+      .WillOnce(RespondWith(
+          MakeDbusParameters(MakeDbusVariant(DbusString("")),
+                             DbusObjectPath(dbus::ObjectPath(kSessionPath)))));
+
+  // SearchItems returns empty
+  EXPECT_CALL(*mock_collection_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretCollectionInterface,
+                   FreedesktopSecretKeyProvider::kMethodSearchItems, _, _))
+      .WillOnce(RespondWith(DbusArray<DbusObjectPath>()));
+
+  // KWallet 6 is not running
+  const auto& kwallet6 = FreedesktopSecretKeyProvider::kKWalletCandidates[0];
+  auto mock_kwallet6_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), kwallet6.kwallet_service,
+          dbus::ObjectPath(kwallet6.kwallet_path));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(kwallet6.kwallet_service,
+                             dbus::ObjectPath(kwallet6.kwallet_path)))
+      .WillRepeatedly(Return(mock_kwallet6_proxy.get()));
+  EXPECT_CALL(*mock_dbus_proxy,
+              Call(DBUS_INTERFACE_DBUS, "NameHasOwner",
+                   MatchArgs(DbusString(kwallet6.kwallet_service)), _))
+      .WillOnce(RespondWith(DbusBoolean(false)));
+
+  // Migrate from KWallet 5
+  const auto& kwallet5 = FreedesktopSecretKeyProvider::kKWalletCandidates[1];
+  auto mock_kwallet5_proxy =
+      base::MakeRefCounted<MockObjectProxyWithTypedCalls>(
+          mock_bus.get(), kwallet5.kwallet_service,
+          dbus::ObjectPath(kwallet5.kwallet_path));
+  EXPECT_CALL(*mock_bus,
+              GetObjectProxy(kwallet5.kwallet_service,
+                             dbus::ObjectPath(kwallet5.kwallet_path)))
+      .WillRepeatedly(Return(mock_kwallet5_proxy.get()));
+  EXPECT_CALL(*mock_dbus_proxy,
+              Call(DBUS_INTERFACE_DBUS, "NameHasOwner",
+                   MatchArgs(DbusString(kwallet5.kwallet_service)), _))
+      .WillOnce(RespondWith(DbusBoolean(true)));
+
+  // isEnabled -> true
+  EXPECT_CALL(*mock_kwallet5_proxy,
+              Call(FreedesktopSecretKeyProvider::kKWalletInterface,
+                   FreedesktopSecretKeyProvider::kKWalletMethodIsEnabled,
+                   MatchArgs(DbusVoid()), _))
+      .WillOnce(RespondWith(DbusBoolean(true)));
+
+  // networkWallet
+  EXPECT_CALL(*mock_kwallet5_proxy,
+              Call(FreedesktopSecretKeyProvider::kKWalletInterface,
+                   FreedesktopSecretKeyProvider::kKWalletMethodNetworkWallet,
+                   MatchArgs(DbusVoid()), _))
+      .WillOnce(RespondWith(DbusString(kNetworkWallet)));
+
+  // open -> non-negative handle
+  EXPECT_CALL(*mock_kwallet5_proxy,
+              Call(FreedesktopSecretKeyProvider::kKWalletInterface,
+                   FreedesktopSecretKeyProvider::kKWalletMethodOpen,
+                   MatchArgs(MakeDbusParameters(DbusString(kNetworkWallet),
+                                                DbusInt64(0),
+                                                DbusString(kProductName))),
+                   _))
+      .WillOnce(RespondWith(DbusInt32(kKWalletHandle)));
+
+  // readPassword -> return a secret
+  EXPECT_CALL(*mock_kwallet5_proxy,
+              Call(FreedesktopSecretKeyProvider::kKWalletInterface,
+                   FreedesktopSecretKeyProvider::kKWalletMethodReadPassword,
+                   MatchArgs(MakeDbusParameters(
+                       DbusInt32(kKWalletHandle),
+                       DbusString(FreedesktopSecretKeyProvider::kKWalletFolder),
+                       DbusString(FreedesktopSecretKeyProvider::kKeyName),
+                       DbusString(kProductName))),
+                   _))
+      .WillOnce(RespondWith(DbusString(kFakeSecret)));
+
+  // close
+  EXPECT_CALL(*mock_kwallet5_proxy,
+              Call(FreedesktopSecretKeyProvider::kKWalletInterface,
+                   FreedesktopSecretKeyProvider::kKWalletMethodClose,
+                   MatchArgs(MakeDbusParameters(DbusInt32(kKWalletHandle),
+                                                DbusBoolean(false),
+                                                DbusString(kProductName))),
+                   _))
+      .WillOnce(RespondWith(DbusInt32(kKWalletHandle)));
+
+  // CreateItem for the migrated secret
+  EXPECT_CALL(*mock_collection_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretCollectionInterface,
+                   FreedesktopSecretKeyProvider::kMethodCreateItem, _, _))
+      .WillOnce(RespondWith(
+          MakeDbusParameters(DbusObjectPath(dbus::ObjectPath(kItemPath)),
+                             DbusObjectPath(dbus::ObjectPath("/")))));
+
+  // CloseSession
+  EXPECT_CALL(*mock_session_proxy,
+              Call(FreedesktopSecretKeyProvider::kSecretSessionInterface,
+                   FreedesktopSecretKeyProvider::kMethodClose,
+                   MatchArgs(DbusVoid()), _))
+      .WillOnce(RespondWith(DbusVoid()));
+
+  FreedesktopSecretKeyProvider provider(/*use_for_encryption=*/true,
+                                        kProductName, mock_bus);
+  std::string tag;
+  std::optional<Encryptor::Key> key;
+  provider.GetKey(base::BindLambdaForTesting(
+      [&](const std::string& returned_tag,
+          std::optional<Encryptor::Key> returned_key) {
+        tag = returned_tag;
+        key = std::move(returned_key);
+      }));
+
+  EXPECT_EQ(tag, "v11");
+  EXPECT_TRUE(key.has_value());
+}
+
 }  // namespace os_crypt_async
diff --git a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
index 047836a..5d8b3aa 100644
--- a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
@@ -39,10 +39,8 @@
       60146, 60181, 60224, 60278, 60345, 60428, 60531, 60658,  60816, 61012,
       61255, 61556, 61929, 62391, 62964, 63674, 64555, 65647,  67000, 68678,
       70758, 73336, 76532, 80494, 85406, 91495, 99043, 108400, 120000};
-  static const std::vector<base::HistogramBase::Sample> samples =
-      base::CustomHistogram::ArrayToCustomEnumRanges(ranges);
   base::HistogramBase* time_histogram = base::CustomHistogram::FactoryGet(
-      histogram_name, samples, base::HistogramBase::kUmaTargetedHistogramFlag);
+      histogram_name, ranges, base::HistogramBase::kUmaTargetedHistogramFlag);
   time_histogram->Add(time.InMilliseconds());
 }
 
@@ -89,7 +87,7 @@
 
 // Lead time brought by prerender
 const char kDomContentLoadedToActivation[] =
-    "PageLoad.Internal.Prerender2.DomContentLoadedToActivation2";
+    "PageLoad.Internal.Prerender2.DomContentLoadedToActivation3";
 
 }  // namespace internal
 
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn
index 8e3a821..23960ff 100644
--- a/components/permissions/BUILD.gn
+++ b/components/permissions/BUILD.gn
@@ -171,6 +171,8 @@
       "android/bluetooth_scanning_prompt_android.cc",
       "android/bluetooth_scanning_prompt_android.h",
       "android/bluetooth_scanning_prompt_android_delegate.h",
+      "android/permission_prompt/embedded_permission_prompt_android.cc",
+      "android/permission_prompt/embedded_permission_prompt_android.h",
       "android/permission_prompt/permission_dialog.cc",
       "android/permission_prompt/permission_dialog.h",
       "android/permission_prompt/permission_dialog_delegate.cc",
diff --git a/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc
new file mode 100644
index 0000000..2789441
--- /dev/null
+++ b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc
@@ -0,0 +1,96 @@
+// 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/permissions/android/permission_prompt/embedded_permission_prompt_android.h"
+
+#include "components/permissions/android/permission_prompt/permission_dialog_delegate.h"
+#include "components/permissions/features.h"
+#include "components/permissions/permission_request.h"
+#include "components/resources/android/theme_resources.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/url_formatter/elide_url.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/strings/grit/ui_strings.h"
+
+namespace permissions {
+
+using Variant = EmbeddedPermissionPromptFlowModel::Variant;
+
+EmbeddedPermissionPromptAndroid::EmbeddedPermissionPromptAndroid(
+    content::WebContents* web_contents,
+    Delegate* delegate)
+    : PermissionPromptAndroid(web_contents, delegate) {
+  prompt_model_ = std::make_unique<EmbeddedPermissionPromptFlowModel>(
+      web_contents, delegate);
+  prompt_model_->CalculateCurrentVariant();
+  CreatePermissionDialogDelegate();
+}
+
+EmbeddedPermissionPromptAndroid::~EmbeddedPermissionPromptAndroid() = default;
+
+PermissionPromptDisposition
+EmbeddedPermissionPromptAndroid::GetPromptDisposition() const {
+  return PermissionPromptDisposition::MODAL_DIALOG;
+}
+
+Variant EmbeddedPermissionPromptAndroid::GetEmbeddedPromptVariant() const {
+  return prompt_model_->prompt_variant();
+}
+
+void EmbeddedPermissionPromptAndroid::Closing() {
+  delegate()->Dismiss();
+  // TODO(crbug.com/388407662): free `PermissionDialogDelegate`
+}
+
+void EmbeddedPermissionPromptAndroid::Accept() {
+  delegate()->Accept();
+  MaybeUpdateDialogWithNewScreenVariant();
+}
+
+void EmbeddedPermissionPromptAndroid::AcceptThisTime() {
+  delegate()->AcceptThisTime();
+  MaybeUpdateDialogWithNewScreenVariant();
+}
+
+void EmbeddedPermissionPromptAndroid::Deny() {
+  delegate()->Deny();
+  // TODO(crbug.com/388407662): free `PermissionDialogDelegate`
+}
+
+bool EmbeddedPermissionPromptAndroid::ShouldCurrentRequestUseQuietUI() {
+  return false;
+}
+
+std::optional<PermissionUiSelector::QuietUiReason>
+EmbeddedPermissionPromptAndroid::ReasonForUsingQuietUi() const {
+  return std::nullopt;
+}
+
+PermissionRequest::AnnotatedMessageText
+EmbeddedPermissionPromptAndroid::GetAnnotatedMessageText() const {
+  // TODO(crbug.com/388407662): correct the title to send to Java.
+  return PermissionRequest::GetDialogAnnotatedMessageText(
+      url_formatter::FormatUrlForSecurityDisplay(
+          delegate()->GetRequestingOrigin(),
+          url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC),
+      IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_INFOBAR_TEXT,
+      /*format_origin_bold=*/
+      base::FeatureList::IsEnabled(permissions::features::kOneTimePermission));
+}
+
+bool EmbeddedPermissionPromptAndroid::ShouldUseRequestingOriginFavicon() const {
+  return false;
+}
+
+void EmbeddedPermissionPromptAndroid::MaybeUpdateDialogWithNewScreenVariant() {
+  prompt_model_->CalculateCurrentVariant();
+  if (prompt_model_->prompt_variant() == Variant::kPreviouslyGranted) {
+    // TODO(crbug.com/388407662); destroy dialog.
+    return;
+  }
+  // TODO(crbug.com/388407640); update new screen.
+}
+
+}  // namespace permissions
diff --git a/components/permissions/android/permission_prompt/embedded_permission_prompt_android.h b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.h
new file mode 100644
index 0000000..be0eda3
--- /dev/null
+++ b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.h
@@ -0,0 +1,60 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_EMBEDDED_PERMISSION_PROMPT_ANDROID_H_
+#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_EMBEDDED_PERMISSION_PROMPT_ANDROID_H_
+
+#include <memory>
+
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
+#include "components/permissions/embedded_permission_prompt_flow_model.h"
+
+namespace content {
+class WebContents;
+}
+
+namespace permissions {
+
+// Permission prompt for PEPC requests (permission requests when users click on
+// <permission> element).
+class EmbeddedPermissionPromptAndroid : public PermissionPromptAndroid {
+ public:
+  EmbeddedPermissionPromptAndroid(content::WebContents* web_contents,
+                                  Delegate* delegate);
+
+  EmbeddedPermissionPromptAndroid(const EmbeddedPermissionPromptAndroid&) =
+      delete;
+  EmbeddedPermissionPromptAndroid& operator=(
+      const EmbeddedPermissionPromptAndroid&) = delete;
+
+  ~EmbeddedPermissionPromptAndroid() override;
+
+  // PermissionPrompt:
+  PermissionPromptDisposition GetPromptDisposition() const override;
+
+  // PermissionPromptAndroid:
+  EmbeddedPermissionPromptFlowModel::Variant GetEmbeddedPromptVariant()
+      const override;
+  void Closing() override;
+  void Accept() override;
+  void AcceptThisTime() override;
+  void Deny() override;
+  bool ShouldCurrentRequestUseQuietUI() override;
+  std::optional<PermissionUiSelector::QuietUiReason> ReasonForUsingQuietUi()
+      const override;
+  PermissionRequest::AnnotatedMessageText GetAnnotatedMessageText()
+      const override;
+  bool ShouldUseRequestingOriginFavicon() const override;
+
+ private:
+  // Decide to destroy the current dialog or update the dialog with new screen
+  // variant.
+  void MaybeUpdateDialogWithNewScreenVariant();
+
+  std::unique_ptr<EmbeddedPermissionPromptFlowModel> prompt_model_;
+};
+
+}  // namespace permissions
+
+#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_EMBEDDED_PERMISSION_PROMPT_ANDROID_H_
diff --git a/components/permissions/android/permission_prompt/permission_dialog.cc b/components/permissions/android/permission_prompt/permission_dialog.cc
index 88081a7..4cc1ef3 100644
--- a/components/permissions/android/permission_prompt/permission_dialog.cc
+++ b/components/permissions/android/permission_prompt/permission_dialog.cc
@@ -12,8 +12,7 @@
                                    Delegate* delegate)
     : PermissionPromptAndroid(web_contents, delegate) {
   DCHECK(web_contents);
-
-  PermissionDialogDelegate::Create(web_contents, this);
+  CreatePermissionDialogDelegate();
 }
 
 PermissionDialog::~PermissionDialog() = default;
diff --git a/components/permissions/android/permission_prompt/permission_dialog.h b/components/permissions/android/permission_prompt/permission_dialog.h
index 8cc3517..0d998e64 100644
--- a/components/permissions/android/permission_prompt/permission_dialog.h
+++ b/components/permissions/android/permission_prompt/permission_dialog.h
@@ -22,6 +22,7 @@
 
   ~PermissionDialog() override;
 
+  // PermissionPrompt:
   PermissionPromptDisposition GetPromptDisposition() const override;
 };
 
diff --git a/components/permissions/android/permission_prompt/permission_prompt_android.cc b/components/permissions/android/permission_prompt/permission_prompt_android.cc
index 248940b..774bc6a 100644
--- a/components/permissions/android/permission_prompt/permission_prompt_android.cc
+++ b/components/permissions/android/permission_prompt/permission_prompt_android.cc
@@ -59,6 +59,11 @@
   return std::nullopt;
 }
 
+EmbeddedPermissionPromptFlowModel::Variant
+PermissionPromptAndroid::GetEmbeddedPromptVariant() const {
+  return EmbeddedPermissionPromptFlowModel::Variant::kUninitialized;
+}
+
 void PermissionPromptAndroid::Closing() {
   delegate_->Dismiss();
 }
diff --git a/components/permissions/android/permission_prompt/permission_prompt_android.h b/components/permissions/android/permission_prompt/permission_prompt_android.h
index 7595ede..fad1ede 100644
--- a/components/permissions/android/permission_prompt/permission_prompt_android.h
+++ b/components/permissions/android/permission_prompt/permission_prompt_android.h
@@ -6,8 +6,11 @@
 #define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_
 
 #include <memory>
+
 #include "base/memory/raw_ptr.h"
 #include "components/content_settings/core/common/content_settings_types.h"
+#include "components/permissions/android/permission_prompt/permission_dialog_delegate.h"
+#include "components/permissions/embedded_permission_prompt_flow_model.h"
 #include "components/permissions/permission_prompt.h"
 #include "components/permissions/permission_uma_util.h"
 #include "components/permissions/permissions_client.h"
@@ -47,29 +50,36 @@
   std::optional<permissions::feature_params::PermissionElementPromptPosition>
   GetPromptPosition() const override;
 
-  void Closing();
-  void Accept();
-  void AcceptThisTime();
-  void Deny();
+  virtual EmbeddedPermissionPromptFlowModel::Variant GetEmbeddedPromptVariant()
+      const;
+  virtual void Closing();
+  virtual void Accept();
+  virtual void AcceptThisTime();
+  virtual void Deny();
   void SetManageClicked();
   void SetLearnMoreClicked();
-  bool ShouldCurrentRequestUseQuietUI();
-  std::optional<PermissionUiSelector::QuietUiReason> ReasonForUsingQuietUi()
-      const;
+  virtual bool ShouldCurrentRequestUseQuietUI();
+  virtual std::optional<PermissionUiSelector::QuietUiReason>
+  ReasonForUsingQuietUi() const;
 
   // We show one permission at a time except for grouped mic+camera, for which
   // we still have a single icon and message text.
   size_t PermissionCount() const;
   ContentSettingsType GetContentSettingType(size_t position) const;
   int GetIconId() const;
-
-  PermissionRequest::AnnotatedMessageText GetAnnotatedMessageText() const;
-
-  bool ShouldUseRequestingOriginFavicon() const;
-
+  virtual PermissionRequest::AnnotatedMessageText GetAnnotatedMessageText()
+      const;
+  virtual bool ShouldUseRequestingOriginFavicon() const;
   GURL GetRequestingOrigin() const;
   content::WebContents* web_contents() { return web_contents_; }
 
+ protected:
+  Delegate* delegate() const { return delegate_; }
+
+  void CreatePermissionDialogDelegate() {
+    PermissionDialogDelegate::Create(web_contents_, this);
+  }
+
  private:
   // PermissionPromptAndroid is owned by PermissionRequestManager, so it should
   // be safe to hold a raw WebContents pointer here because this class is
diff --git a/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc b/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc
index 606dd59..c85d08417 100644
--- a/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc
+++ b/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc
@@ -19,13 +19,16 @@
   // necessary conditions are met. The message UI is preferred over the infobar
   // UI.
   auto message_ui = PermissionMessage::Create(web_contents, delegate);
-  if (message_ui)
+  if (message_ui) {
     return message_ui;
+  }
 
   auto infobar = PermissionPromptInfoBar::Create(web_contents, delegate);
-  if (infobar)
+  if (infobar) {
     return infobar;
+  }
 
+  // TODO(crbug.com/377264239): enable PEPC prompt here.
   return std::make_unique<PermissionDialog>(web_contents, delegate);
 }
 
diff --git a/components/permissions/permission_util.cc b/components/permissions/permission_util.cc
index 7a06b95..0265815a 100644
--- a/components/permissions/permission_util.cc
+++ b/components/permissions/permission_util.cc
@@ -21,6 +21,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom.h"
@@ -228,6 +229,26 @@
          request->request_type() == RequestType::kGeolocation;
 }
 
+bool PermissionUtil::ShouldCurrentRequestUsePermissionElementSecondaryUI(
+    PermissionPrompt::Delegate* delegate) {
+  if (!base::FeatureList::IsEnabled(blink::features::kPermissionElement)) {
+    return false;
+  }
+
+  std::vector<raw_ptr<permissions::PermissionRequest, VectorExperimental>>
+      requests = delegate->Requests();
+  return base::ranges::all_of(
+      requests, [](permissions::PermissionRequest* request) {
+        return (request->request_type() ==
+                    permissions::RequestType::kCameraStream ||
+                request->request_type() ==
+                    permissions::RequestType::kGeolocation ||
+                request->request_type() ==
+                    permissions::RequestType::kMicStream) &&
+               request->IsEmbeddedPermissionElementInitiated();
+      });
+}
+
 bool PermissionUtil::IsGuardContentSetting(ContentSettingsType type) {
   switch (type) {
     case ContentSettingsType::USB_GUARD:
diff --git a/components/permissions/permission_util.h b/components/permissions/permission_util.h
index bed498f..d0aa80fd 100644
--- a/components/permissions/permission_util.h
+++ b/components/permissions/permission_util.h
@@ -85,6 +85,13 @@
   // acceptance data)
   static bool IsLowPriorityPermissionRequest(const PermissionRequest* request);
 
+  // Check whether the given permission request could prompt a secondary UI, it
+  // means:
+  // - The request is initiated from a permission element.
+  // - The request type is permission element supported type.
+  static bool ShouldCurrentRequestUsePermissionElementSecondaryUI(
+      PermissionPrompt::Delegate* delegate);
+
   // Checks whether the given ContentSettingsType is a guard content setting,
   // meaning it does not support allow setting and toggles between "ask" and
   // "block" instead. This is primarily used for chooser-based permissions.
diff --git a/components/resources/components_resources.grd b/components/resources/components_resources.grd
index 7b51b424..aab3659 100644
--- a/components/resources/components_resources.grd
+++ b/components/resources/components_resources.grd
@@ -4,7 +4,7 @@
 Resources for developer-facing chrome:// pages should be aggregated in
 dev_ui_components_resources.grd.
 -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/components_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/components/resources/components_scaled_resources.grd b/components/resources/components_scaled_resources.grd
index d9e9af3d..5ec1922 100644
--- a/components/resources/components_scaled_resources.grd
+++ b/components/resources/components_scaled_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/components_scaled_resources.h" type="rc_header" context="default_100_percent">
       <emit emit_type='prepend'></emit>
diff --git a/components/resources/dev_ui_components_resources.grd b/components/resources/dev_ui_components_resources.grd
index f9e5f45..be22dad 100644
--- a/components/resources/dev_ui_components_resources.grd
+++ b/components/resources/dev_ui_components_resources.grd
@@ -7,7 +7,7 @@
 * DevUI page resources that are *not* for Android Chrome can be aggregated in
   components_resources.grd (or browser_resources.grd if applicable).
 -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/dev_ui_components_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/components/services/on_device_translation/public/cpp/BUILD.gn b/components/services/on_device_translation/public/cpp/BUILD.gn
index f4436f11..8056f78 100644
--- a/components/services/on_device_translation/public/cpp/BUILD.gn
+++ b/components/services/on_device_translation/public/cpp/BUILD.gn
@@ -16,3 +16,15 @@
     "//third_party/blink/public/common:headers",
   ]
 }
+
+source_set("unit_tests") {
+  testonly = true
+
+  sources = [ "features_unittest.cc" ]
+  deps = [
+    "//base/test:test_support",
+    "//components/services/on_device_translation/public/cpp",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/services/on_device_translation/public/cpp/features.cc b/components/services/on_device_translation/public/cpp/features.cc
index 0ef9183..049fba95 100644
--- a/components/services/on_device_translation/public/cpp/features.cc
+++ b/components/services/on_device_translation/public/cpp/features.cc
@@ -4,7 +4,11 @@
 
 #include "components/services/on_device_translation/public/cpp/features.h"
 
+#include <cstddef>
+
 #include "base/command_line.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/version.h"
 #include "third_party/blink/public/common/features_generated.h"
 
 namespace on_device_translation {
@@ -25,6 +29,10 @@
 
 }  // namespace
 
+const base::FeatureParam<std::string> kTranslationAPILibraryMinimumVersion{
+    &blink::features::kTranslationAPI, "TranslationAPILibraryMinimumVersion",
+    "2025.1.10.0"};
+
 const base::FeatureParam<bool> kTranslationAPIAcceptLanguagesCheck{
     &blink::features::kTranslationAPI, "TranslationAPIAcceptLanguagesCheck",
     true};
@@ -55,4 +63,19 @@
   return kTranslationAPILimitLanguagePackCountMax - installed_package_count;
 }
 
+bool IsValidTranslateKitVersion(std::string_view version_str) {
+  base::Version minimum_version(kTranslationAPILibraryMinimumVersion.Get());
+  CHECK(minimum_version.IsValid());
+
+  base::Version version(version_str);
+  if (!version.IsValid()) {
+    return false;
+  }
+  if (version.components().size() != minimum_version.components().size()) {
+    return false;
+  }
+
+  return version.CompareTo(minimum_version) >= 0;
+}
+
 }  // namespace on_device_translation
diff --git a/components/services/on_device_translation/public/cpp/features.h b/components/services/on_device_translation/public/cpp/features.h
index c4339ec8..1a80c7d 100644
--- a/components/services/on_device_translation/public/cpp/features.h
+++ b/components/services/on_device_translation/public/cpp/features.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_SERVICES_ON_DEVICE_TRANSLATION_PUBLIC_CPP_FEATURES_H_
 #define COMPONENTS_SERVICES_ON_DEVICE_TRANSLATION_PUBLIC_CPP_FEATURES_H_
 
+#include <string_view>
+
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/metrics/field_trial_params.h"
@@ -12,6 +14,15 @@
 
 namespace on_device_translation {
 
+// The Translation API will fail the version check if the loaded library version
+// is lower than the specified minimum version.
+extern const base::FeatureParam<std::string>
+    kTranslationAPILibraryMinimumVersion;
+
+// Version string is in the format of "xxxx.xx.xx.xx".
+// Any version string longer than this will be truncated.
+inline constexpr size_t kTranslationAPILibraryVersionStringSize = 14;
+
 // When this feature param is enabled, the Translation API will fail if neither
 // the source nor destination language is in the AcceptLanguages. This is
 // introduced to mitigate privacy concerns.
@@ -37,6 +48,13 @@
 
 base::FilePath GetTranslateKitBinaryPathFromCommandLine();
 
+// Checks if the given `version` is valid.
+// `version` must be in the same format as the minimum version
+// `kTranslationAPILibraryMinimumVersion`.
+// Returns false if the format is invalid, or if any of the version components
+// is invalid.
+bool IsValidTranslateKitVersion(std::string_view version);
+
 }  // namespace on_device_translation
 
 #endif  // COMPONENTS_SERVICES_ON_DEVICE_TRANSLATION_PUBLIC_CPP_FEATURES_H_
diff --git a/components/services/on_device_translation/public/cpp/features_unittest.cc b/components/services/on_device_translation/public/cpp/features_unittest.cc
new file mode 100644
index 0000000..5bbc401
--- /dev/null
+++ b/components/services/on_device_translation/public/cpp/features_unittest.cc
@@ -0,0 +1,81 @@
+// 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/services/on_device_translation/public/cpp/features.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace on_device_translation {
+namespace {
+
+TEST(IsValidTranslateKitVersionTest, InvalidEmptyVersion) {
+  EXPECT_FALSE(IsValidTranslateKitVersion(""));
+}
+
+TEST(IsValidTranslateKitVersionTest, InvalidZeroVersion) {
+  EXPECT_FALSE(IsValidTranslateKitVersion("0.0.0.0"));
+}
+
+TEST(IsValidTranslateKitVersionTest, InvalidWildcardVersion) {
+  EXPECT_FALSE(IsValidTranslateKitVersion("*"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.*"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.*"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.10.*"));
+}
+
+TEST(IsValidTranslateKitVersionTest, InvalidTruncatedVersion) {
+  EXPECT_FALSE(IsValidTranslateKitVersion("0.0.0"));
+
+  EXPECT_FALSE(IsValidTranslateKitVersion("2024.1.1"));
+
+  EXPECT_FALSE(IsValidTranslateKitVersion("2"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2024"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025"));
+
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.1"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.10"));
+
+  EXPECT_FALSE(IsValidTranslateKitVersion("2026"));
+}
+
+TEST(IsValidTranslateKitVersionTest, InvalidLowerThanMinimumVersion) {
+  EXPECT_FALSE(IsValidTranslateKitVersion("2024.1.1.1"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2024.9.9.9"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2024.10.10.10"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2024.11.11.11"));
+
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.1.1"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.9.9"));
+  EXPECT_FALSE(IsValidTranslateKitVersion("2025.1.9.10"));
+}
+
+TEST(IsValidTranslateKitVersionTest, MinimumVersion) {
+  EXPECT_TRUE(IsValidTranslateKitVersion("2025.1.10.0"));
+}
+
+TEST(IsValidTranslateKitVersionTest, GreaterThanMinimumVersion) {
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.1.1.0"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.1.1.1"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.1.1.10"));
+
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.1.10.0"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.1.10.1"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.1.10.10"));
+
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.10.1.0"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.10.1.1"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.10.1.10"));
+
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.10.10.0"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.10.10.1"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.10.10.10"));
+
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.12.1.0"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.12.1.1"));
+  EXPECT_TRUE(IsValidTranslateKitVersion("3025.12.1.10"));
+}
+
+}  // namespace
+}  // namespace on_device_translation
diff --git a/components/services/on_device_translation/public/mojom/on_device_translation_service.mojom b/components/services/on_device_translation/public/mojom/on_device_translation_service.mojom
index 616e25b..2387955f 100644
--- a/components/services/on_device_translation/public/mojom/on_device_translation_service.mojom
+++ b/components/services/on_device_translation/public/mojom/on_device_translation_service.mojom
@@ -72,6 +72,9 @@
   // The translator cannot be created because the library failed to create the
   // translator.
   kErrorFailedToCreateTranslator = 4,
+
+  // The translator cannot be created because the library version is invalid.
+  kErrorInvalidVersion= 5,
 };
 
 // Currently the sandboxing of the On Device Translation service is supported
diff --git a/components/services/on_device_translation/test/mock_failing_translate_kit_lib.cc b/components/services/on_device_translation/test/mock_failing_translate_kit_lib.cc
index ec03aa79..0902c4b 100644
--- a/components/services/on_device_translation/test/mock_failing_translate_kit_lib.cc
+++ b/components/services/on_device_translation/test/mock_failing_translate_kit_lib.cc
@@ -9,6 +9,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <cstring>
 
 #include "base/compiler_specific.h"
 #include "base/notreached.h"
@@ -23,6 +24,18 @@
 
 extern "C" {
 
+TRANSLATE_KIT_EXPORT bool GetTranslateKitVersion(TranslateKitVersion* version) {
+  CHECK(version);
+  CHECK(version->buffer);
+  CHECK(version->buffer_size);
+
+  // Always return a maximum version.
+  constexpr char kMaxVersion[] = "9999.99.99.99";
+  strncpy(version->buffer, kMaxVersion, sizeof(kMaxVersion));
+  version->buffer_size = sizeof(kMaxVersion) - 1;
+  return true;
+}
+
 TRANSLATE_KIT_EXPORT void InitializeStorageBackend(
     FileExistsFn file_exists,
     OpenForReadOnlyMemoryMapFn open_for_read_only_memory_map,
diff --git a/components/services/on_device_translation/test/mock_translate_kit_lib.cc b/components/services/on_device_translation/test/mock_translate_kit_lib.cc
index aa6055b..7e9794e 100644
--- a/components/services/on_device_translation/test/mock_translate_kit_lib.cc
+++ b/components/services/on_device_translation/test/mock_translate_kit_lib.cc
@@ -21,6 +21,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <cstring>
 #include <string>
 #include <string_view>
 
@@ -182,6 +183,18 @@
 
 extern "C" {
 
+TRANSLATE_KIT_EXPORT bool GetTranslateKitVersion(TranslateKitVersion* version) {
+  CHECK(version);
+  CHECK(version->buffer);
+  CHECK(version->buffer_size);
+
+  // Always return a maximum version.
+  constexpr char kMaxVersion[] = "9999.99.99.99";
+  strncpy(version->buffer, kMaxVersion, sizeof(kMaxVersion));
+  version->buffer_size = sizeof(kMaxVersion) - 1;
+  return true;
+}
+
 TRANSLATE_KIT_EXPORT void InitializeStorageBackend(
     FileExistsFn file_exists,
     OpenForReadOnlyMemoryMapFn open_for_read_only_memory_map,
diff --git a/components/services/on_device_translation/translate_kit_client.cc b/components/services/on_device_translation/translate_kit_client.cc
index 516c58f1..cd4aaa3 100644
--- a/components/services/on_device_translation/translate_kit_client.cc
+++ b/components/services/on_device_translation/translate_kit_client.cc
@@ -7,6 +7,8 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <string>
+#include <string_view>
 
 #include "base/check.h"
 #include "base/compiler_specific.h"
@@ -16,6 +18,7 @@
 #include "base/no_destructor.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/types/expected.h"
 #include "build/build_config.h"
@@ -125,6 +128,9 @@
 TranslateKitClient::TranslateKitClient(const base::FilePath& library_path,
                                        base::PassKey<TranslateKitClient>)
     : lib_(library_path),
+      get_translate_kit_version_func_(
+          reinterpret_cast<GetTranslateKitVersionFn>(
+              lib_.GetFunctionPointer("GetTranslateKitVersion"))),
       initialize_storage_backend_fnc_(
           reinterpret_cast<InitializeStorageBackendFn>(
               lib_.GetFunctionPointer("InitializeStorageBackend"))),
@@ -152,18 +158,37 @@
     return LoadTranslateKitResult::kInvalidBinary;
   }
 
-  if (!initialize_storage_backend_fnc_ || !create_translate_kit_fnc_ ||
-      !delete_tanslate_kit_fnc_ || !set_language_packages_func_ ||
-      !translate_kit_create_translator_func_ || !delete_translator_fnc_ ||
-      !translator_translate_func_) {
+  if (!get_translate_kit_version_func_ || !initialize_storage_backend_fnc_ ||
+      !create_translate_kit_fnc_ || !delete_tanslate_kit_fnc_ ||
+      !set_language_packages_func_ || !translate_kit_create_translator_func_ ||
+      !delete_translator_fnc_ || !translator_translate_func_) {
     maybe_kit_ptr_ =
         base::unexpected(CreateTranslatorResult::kErrorInvalidFunctionPointer);
     return LoadTranslateKitResult::kInvalidFunctionPointer;
   }
+
+  if (!IsTranslateKitVersionValid()) {
+    maybe_kit_ptr_ =
+        base::unexpected(CreateTranslatorResult::kErrorInvalidVersion);
+    return LoadTranslateKitResult::kInvalidVersion;
+  }
+
   return LoadTranslateKitResult::kSuccess;
 }
 
 DISABLE_CFI_DLSYM
+bool TranslateKitClient::IsTranslateKitVersionValid() {
+  std::string version_buffer(kTranslationAPILibraryVersionStringSize, '\0');
+  TranslateKitVersion version{version_buffer.data(), version_buffer.size()};
+  if (!get_translate_kit_version_func_(&version)) {
+    return false;
+  }
+
+  std::string_view version_string(version.buffer, version.buffer_size);
+  return IsValidTranslateKitVersion(version_string);
+}
+
+DISABLE_CFI_DLSYM
 bool TranslateKitClient::MaybeInitialize() {
   if (maybe_kit_ptr_.has_value() && *maybe_kit_ptr_) {
     // Already successfully initialized.
diff --git a/components/services/on_device_translation/translate_kit_client.h b/components/services/on_device_translation/translate_kit_client.h
index b1fb075..9a99a35 100644
--- a/components/services/on_device_translation/translate_kit_client.h
+++ b/components/services/on_device_translation/translate_kit_client.h
@@ -34,7 +34,10 @@
   // Success to load TranslateKit binary but fails due to invalid function
   // pointers.
   kInvalidFunctionPointer = 3,
-  kMaxValue = kInvalidFunctionPointer,
+  // Success to load TranslateKit binary but the binary version is invalid.
+  kInvalidVersion = 4,
+
+  kMaxValue = kInvalidVersion,
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/ai/enums.xml:LoadTranslateKitResult)
 
@@ -121,6 +124,9 @@
   // are valid. And sets the `maybe_kit_ptr_` to the error code if any.
   LoadTranslateKitResult CheckLoadTranslateKitResult();
 
+  // Checks if the loaded TranslateKit version is valid.
+  bool IsTranslateKitVersionValid();
+
   // Initializes the TranslateKit instance only when first needed, provided the
   // underlying library has loaded successfully. Returns true if initialization
   // was successful, false otherwise.
@@ -136,6 +142,9 @@
   // WARNING:
   // Changes to the below interfaces must be backwards compatible and
   // reflected in the Google3-side definition.
+  typedef bool (*GetTranslateKitVersionFn)(TranslateKitVersion* version);
+  GetTranslateKitVersionFn get_translate_kit_version_func_;
+
   typedef void (*InitializeStorageBackendFn)(
       FileExistsFn file_exists,
       OpenForReadOnlyMemoryMapFn open_for_read_only_memory_map,
diff --git a/components/services/on_device_translation/translate_kit_structs.h b/components/services/on_device_translation/translate_kit_structs.h
index 3cd27ff3..faf9c0d 100644
--- a/components/services/on_device_translation/translate_kit_structs.h
+++ b/components/services/on_device_translation/translate_kit_structs.h
@@ -41,6 +41,14 @@
 } TranslateKitOutputText;
 
 typedef struct {
+  // The buffer to store the version string to.
+  // Not owned.
+  char* buffer;
+  // The size of `buffer`.
+  size_t buffer_size;
+} TranslateKitVersion;
+
+typedef struct {
   // A chrome::on_device_translation::TranslateKitLanguagePackageConfig
   // serialized as a string.
   // Not owned.
diff --git a/components/supervised_user/core/browser/supervised_user_pref_store.cc b/components/supervised_user/core/browser/supervised_user_pref_store.cc
index 28eda8ce..bd83c7aa 100644
--- a/components/supervised_user/core/browser/supervised_user_pref_store.cc
+++ b/components/supervised_user/core/browser/supervised_user_pref_store.cc
@@ -135,8 +135,7 @@
         static_cast<int>(supervised_user::FilteringBehavior::kAllow));
 
     prefs_->SetBoolean(policy::policy_prefs::kHideWebStoreIcon, false);
-    prefs_->SetBoolean(feed::prefs::kEnableSnippets,
-                       supervised_user::IsKidFriendlyContentFeedAvailable());
+    prefs_->SetBoolean(feed::prefs::kEnableSnippets, false);
 
 #if BUILDFLAG(IS_ANDROID)
     syncer::SyncPrefs::SetTypeDisabledByCustodian(
diff --git a/components/supervised_user/core/common/features.cc b/components/supervised_user/core/common/features.cc
index eccfc92..b2f54e0 100644
--- a/components/supervised_user/core/common/features.cc
+++ b/components/supervised_user/core/common/features.cc
@@ -14,10 +14,6 @@
 
 namespace supervised_user {
 
-BASE_FEATURE(kKidFriendlyContentFeed,
-             "KidFriendlyContentFeed",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Enables local parent approvals for the blocked website on the Family Link
 // user's device.
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
@@ -188,8 +184,4 @@
              "ExemptGuardianApprovalOnGwsRedirector",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-bool IsKidFriendlyContentFeedAvailable() {
-  return base::FeatureList::IsEnabled(kKidFriendlyContentFeed);
-}
-
 }  // namespace supervised_user
diff --git a/components/supervised_user/core/common/features.h b/components/supervised_user/core/common/features.h
index db78b22..b66b7ed9 100644
--- a/components/supervised_user/core/common/features.h
+++ b/components/supervised_user/core/common/features.h
@@ -12,9 +12,6 @@
 
 namespace supervised_user {
 
-// Experiment to enable kid-friendly content feed.
-BASE_DECLARE_FEATURE(kKidFriendlyContentFeed);
-
 BASE_DECLARE_FEATURE(kLocalWebApprovals);
 
 // Applies the updated extension approval flow, which can skip parent-approvals
@@ -134,10 +131,6 @@
 // filter interstitial is enabled.
 bool IsLocalWebApprovalsEnabled();
 
-// Returns whether the experiment to display a kid-friendly content stream on
-// the New Tab page has been enabled.
-bool IsKidFriendlyContentFeedAvailable();
-
 }  // namespace supervised_user
 
 #endif  // COMPONENTS_SUPERVISED_USER_CORE_COMMON_FEATURES_H_
diff --git a/content/browser/ai/echo_ai_language_model.cc b/content/browser/ai/echo_ai_language_model.cc
index 67fb0ef2..afce48d4 100644
--- a/content/browser/ai/echo_ai_language_model.cc
+++ b/content/browser/ai/echo_ai_language_model.cc
@@ -19,6 +19,12 @@
 
 namespace content {
 
+namespace {
+constexpr char kResponsePrefix[] =
+    "On-device model is not available in Chromium, this API is just echoing "
+    "back the input:\n";
+}
+
 EchoAILanguageModel::EchoAILanguageModel() = default;
 
 EchoAILanguageModel::~EchoAILanguageModel() = default;
@@ -32,11 +38,6 @@
     return;
   }
 
-  const std::string response =
-      "On-device model is not available in Chromium, this API is just echoing "
-      "back the input:\n" +
-      input;
-
   if (input.size() > EchoAIManagerImpl::kMaxContextSizeInTokens) {
     responder->OnError(blink::mojom::ModelStreamingResponseStatus::
                            kErrorPromptRequestTooLarge);
@@ -48,7 +49,10 @@
     responder->OnContextOverflow();
   }
   current_tokens_ += input.size();
-  responder->OnStreaming(response);
+  responder->OnStreaming(kResponsePrefix,
+                         blink::mojom::ModelStreamingResponderAction::kAppend);
+  responder->OnStreaming(input,
+                         blink::mojom::ModelStreamingResponderAction::kAppend);
   responder->OnCompletion(
       blink::mojom::ModelExecutionContextInfo::New(current_tokens_));
 }
diff --git a/content/browser/ai/echo_ai_rewriter.cc b/content/browser/ai/echo_ai_rewriter.cc
index b6a537d..2b7d3c8 100644
--- a/content/browser/ai/echo_ai_rewriter.cc
+++ b/content/browser/ai/echo_ai_rewriter.cc
@@ -16,7 +16,8 @@
         pending_responder) {
   mojo::Remote<blink::mojom::ModelStreamingResponder> responder(
       std::move(pending_responder));
-  responder->OnStreaming("Model not available in Chromium\n" + input);
+  responder->OnStreaming("Model not available in Chromium\n" + input,
+                         blink::mojom::ModelStreamingResponderAction::kReplace);
   responder->OnCompletion(/*context_info=*/nullptr);
 }
 
diff --git a/content/browser/ai/echo_ai_summarizer.cc b/content/browser/ai/echo_ai_summarizer.cc
index 686be5e9..d3a7783c 100644
--- a/content/browser/ai/echo_ai_summarizer.cc
+++ b/content/browser/ai/echo_ai_summarizer.cc
@@ -27,7 +27,8 @@
         pending_responder) {
   mojo::Remote<blink::mojom::ModelStreamingResponder> responder(
       std::move(pending_responder));
-  responder->OnStreaming("Model not available in Chromium\n" + input);
+  responder->OnStreaming("Model not available in Chromium\n" + input,
+                         blink::mojom::ModelStreamingResponderAction::kReplace);
   responder->OnCompletion(/*context_info=*/nullptr);
 }
 
diff --git a/content/browser/ai/echo_ai_writer.cc b/content/browser/ai/echo_ai_writer.cc
index 9597e19..ecc4adc 100644
--- a/content/browser/ai/echo_ai_writer.cc
+++ b/content/browser/ai/echo_ai_writer.cc
@@ -18,7 +18,8 @@
         pending_responder) {
   mojo::Remote<blink::mojom::ModelStreamingResponder> responder(
       std::move(pending_responder));
-  responder->OnStreaming("Model not available in Chromium\n" + input);
+  responder->OnStreaming("Model not available in Chromium\n" + input,
+                         blink::mojom::ModelStreamingResponderAction::kReplace);
   responder->OnCompletion(/*context_info=*/nullptr);
 }
 
diff --git a/content/content_resources.grd b/content/content_resources.grd
index 2e252ab..84e120e 100644
--- a/content/content_resources.grd
+++ b/content/content_resources.grd
@@ -7,7 +7,7 @@
 * Aliased resources (see shared_resources_data_source.cc).
 * (Optional) Resources for non-Android DevUI pages.
 -->
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/content_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/content/renderer/v8_value_converter_impl.cc b/content/renderer/v8_value_converter_impl.cc
index 69cf21e..0896308 100644
--- a/content/renderer/v8_value_converter_impl.cc
+++ b/content/renderer/v8_value_converter_impl.cc
@@ -421,7 +421,11 @@
     if (!reg_exp_allowed_)
       // JSON.stringify converts to an object.
       return FromV8Object(val.As<v8::Object>(), state, isolate);
-    return std::make_unique<base::Value>(*v8::String::Utf8Value(isolate, val));
+    auto utf8_value = v8::String::Utf8Value(isolate, val);
+    if (!*utf8_value) {
+      return FromV8Object(val.As<v8::Object>(), state, isolate);
+    }
+    return std::make_unique<base::Value>(*utf8_value);
   }
 
   // v8::Value doesn't have a ToArray() method for some reason.
diff --git a/docs/android_dynamic_feature_modules.md b/docs/android_dynamic_feature_modules.md
index 87b665b3..20506680 100644
--- a/docs/android_dynamic_feature_modules.md
+++ b/docs/android_dynamic_feature_modules.md
@@ -643,10 +643,7 @@
 
 ```xml
 <?xml version="1.0" encoding="UTF-8"?>
-<grit
-    current_release="1"
-    latest_public_release="0"
-    output_all_resource_defines="false">
+<grit current_release="1" latest_public_release="0">
   <outputs>
     <output
         filename="values-am/android_foo_strings.xml"
diff --git a/extensions/renderer/api/i18n_hooks_delegate.cc b/extensions/renderer/api/i18n_hooks_delegate.cc
index 313dc79..56f8f69 100644
--- a/extensions/renderer/api/i18n_hooks_delegate.cc
+++ b/extensions/renderer/api/i18n_hooks_delegate.cc
@@ -336,7 +336,7 @@
     DCHECK(arguments[1]->IsFunction());
     JSRunner::Get(v8_context)
         ->RunJSFunction(arguments[1].As<v8::Function>(), v8_context,
-                        std::size(response_args), response_args);
+                        response_args);
   } else {
     DCHECK_EQ(binding::AsyncResponseType::kPromise, parse_result.async_type);
     auto promise_resolver =
diff --git a/extensions/renderer/api/runtime_hooks_delegate.cc b/extensions/renderer/api/runtime_hooks_delegate.cc
index b24c0d8..a199dc9b 100644
--- a/extensions/renderer/api/runtime_hooks_delegate.cc
+++ b/extensions/renderer/api/runtime_hooks_delegate.cc
@@ -547,7 +547,7 @@
     maybe_custom_callback =
         JSRunner::Get(v8_context)
             ->RunJSFunctionSync(get_bind_directory_entry_callback, v8_context,
-                                0, nullptr);
+                                {});
   }  // End modules enabled scope.
   v8::Local<v8::Value> callback;
   if (!maybe_custom_callback.ToLocal(&callback)) {
diff --git a/extensions/renderer/api/web_request_hooks.cc b/extensions/renderer/api/web_request_hooks.cc
index 2bd457ea..a688293 100644
--- a/extensions/renderer/api/web_request_hooks.cc
+++ b/extensions/renderer/api/web_request_hooks.cc
@@ -95,7 +95,7 @@
   v8::TryCatch try_catch(isolate);
   v8::Local<v8::Value> event;
   if (!JSRunner::Get(context)
-           ->RunJSFunctionSync(get_event, context, std::size(args), args)
+           ->RunJSFunctionSync(get_event, context, args)
            .ToLocal(&event)) {
     // In theory this should never happen, but log an error in case it does.
     LOG(ERROR) << "Unexpected error when creating custom webRequest event: "
diff --git a/extensions/renderer/bindings/api_binding_bridge.cc b/extensions/renderer/bindings/api_binding_bridge.cc
index d6fd783..d44f564 100644
--- a/extensions/renderer/bindings/api_binding_bridge.cc
+++ b/extensions/renderer/bindings/api_binding_bridge.cc
@@ -103,8 +103,7 @@
   // This CHECK is helping to track down https://crbug.com/819968, and should be
   // removed when that's fixed.
   CHECK(binding::IsContextValid(context));
-  JSRunner::Get(context)->RunJSFunction(function, context, std::size(args),
-                                        args);
+  JSRunner::Get(context)->RunJSFunction(function, context, args);
 }
 
 }  // namespace extensions
diff --git a/extensions/renderer/bindings/api_binding_hooks.cc b/extensions/renderer/bindings/api_binding_hooks.cc
index af9b112..1993f54 100644
--- a/extensions/renderer/bindings/api_binding_hooks.cc
+++ b/extensions/renderer/bindings/api_binding_hooks.cc
@@ -460,8 +460,8 @@
   // Safe to use synchronous JS since it's in direct response to JS calling
   // into the binding.
   v8::MaybeLocal<v8::Value> v8_result =
-      JSRunner::Get(context)->RunJSFunctionSync(
-          handle_request, context, arguments->size(), arguments->data());
+      JSRunner::Get(context)->RunJSFunctionSync(handle_request, context,
+                                                *arguments);
 
   if (!binding::IsContextValid(context))
     return RequestResult(RequestResult::CONTEXT_INVALIDATED);
@@ -539,8 +539,8 @@
     // Safe to use synchronous JS since it's in direct response to JS calling
     // into the binding.
     v8::MaybeLocal<v8::Value> maybe_result =
-        JSRunner::Get(context)->RunJSFunctionSync(
-            function, context, arguments->size(), arguments->data());
+        JSRunner::Get(context)->RunJSFunctionSync(function, context,
+                                                  *arguments);
     if (try_catch.HasCaught()) {
       try_catch.ReThrow();
       return false;
diff --git a/extensions/renderer/bindings/api_binding_js_util.cc b/extensions/renderer/bindings/api_binding_js_util.cc
index fa0f11f..443cdb5f 100644
--- a/extensions/renderer/bindings/api_binding_js_util.cc
+++ b/extensions/renderer/bindings/api_binding_js_util.cc
@@ -232,7 +232,7 @@
   v8::Local<v8::Context> context = arguments->GetHolderCreationContext();
 
   request_handler_->last_error()->SetError(context, error);
-  JSRunner::Get(context)->RunJSFunction(callback, context, 0, nullptr);
+  JSRunner::Get(context)->RunJSFunction(callback, context, {});
 
   bool report_if_unchecked = true;
   request_handler_->last_error()->ClearError(context, report_if_unchecked);
diff --git a/extensions/renderer/bindings/api_event_handler.cc b/extensions/renderer/bindings/api_event_handler.cc
index 1843d54..29e46df 100644
--- a/extensions/renderer/bindings/api_event_handler.cc
+++ b/extensions/renderer/bindings/api_event_handler.cc
@@ -340,8 +340,7 @@
             .ToLocalChecked();
 
     v8::Local<v8::Value> massager_args[] = {args_array, dispatch_event};
-    JSRunner::Get(context)->RunJSFunction(
-        massager, context, std::size(massager_args), massager_args);
+    JSRunner::Get(context)->RunJSFunction(massager, context, massager_args);
   }
 }
 
diff --git a/extensions/renderer/bindings/api_event_handler_unittest.cc b/extensions/renderer/bindings/api_event_handler_unittest.cc
index 7316482..c80800b 100644
--- a/extensions/renderer/bindings/api_event_handler_unittest.cc
+++ b/extensions/renderer/bindings/api_event_handler_unittest.cc
@@ -1208,10 +1208,10 @@
     v8::Local<v8::Function> remove_listener_function =
         FunctionFromString(context, kRemoveListenerFunction);
     {
-      v8::Local<v8::Value> argv[] = {event, listener1};
+      v8::Local<v8::Value> args[] = {event, listener1};
       // Note: Use JSRunner() so that script suspension is respected.
       JSRunner::Get(context)->RunJSFunction(remove_listener_function, context,
-                                            std::size(argv), argv);
+                                            args);
     }
 
     // Since script has been suspended, there should still be two listeners, and
diff --git a/extensions/renderer/bindings/api_request_handler.cc b/extensions/renderer/bindings/api_request_handler.cc
index 5cdbc7d..d5eec99 100644
--- a/extensions/renderer/bindings/api_request_handler.cc
+++ b/extensions/renderer/bindings/api_request_handler.cc
@@ -398,8 +398,7 @@
                               response_args.end());
 
   JSRunner::Get(context)->RunJSFunction(custom_callback_.Get(isolate), context,
-                                        custom_callback_args.size(),
-                                        custom_callback_args.data());
+                                        custom_callback_args);
 }
 
 APIRequestHandler::Request::Request() = default;
diff --git a/extensions/renderer/bindings/event_emitter.cc b/extensions/renderer/bindings/event_emitter.cc
index 50c6937b..880c2d0e 100644
--- a/extensions/renderer/bindings/event_emitter.cc
+++ b/extensions/renderer/bindings/event_emitter.cc
@@ -229,8 +229,8 @@
     // (through e.g. calling alert() or print()). That should suspend this
     // message loop as well (though a nested message loop will run). This is a
     // bit ugly, but should hopefully be safe.
-    v8::MaybeLocal<v8::Value> maybe_result = js_runner->RunJSFunctionSync(
-        listener, context, args->size(), args->data());
+    v8::MaybeLocal<v8::Value> maybe_result =
+        js_runner->RunJSFunctionSync(listener, context, *args);
 
     // Any of the listeners could invalidate the context. If that happens,
     // bail out.
@@ -297,7 +297,7 @@
   CHECK(v8::Function::New(context, &DispatchAsyncHelper, data)
             .ToLocal(&function));
 
-  JSRunner::Get(context)->RunJSFunction(function, context, 0, nullptr,
+  JSRunner::Get(context)->RunJSFunction(function, context, {},
                                         std::move(callback));
 }
 
diff --git a/extensions/renderer/bindings/exception_handler.cc b/extensions/renderer/bindings/exception_handler.cc
index 7b450d9b..477b4c68 100644
--- a/extensions/renderer/bindings/exception_handler.cc
+++ b/extensions/renderer/bindings/exception_handler.cc
@@ -102,8 +102,7 @@
     // possible. Handle this gracefully, and log errors normally.
     v8::TryCatch handler_try_catch(isolate);
     handler_try_catch.SetVerbose(true);
-    JSRunner::Get(context)->RunJSFunction(handler, context,
-                                          std::size(arguments), arguments);
+    JSRunner::Get(context)->RunJSFunction(handler, context, arguments);
   } else {
     add_console_error_.Run(context, full_message);
   }
@@ -129,8 +128,7 @@
   // synchronously, so if JS is suspended at this moment, the `try_catch` here
   // is insufficient.
   JSRunner::Get(context)->RunJSFunction(extension_callback, context,
-                                        callback_arguments.size(),
-                                        callback_arguments.data());
+                                        callback_arguments);
 
   // Since arbitrary JS has ran, the context may have been invalidated. If it
   // was, bail.
diff --git a/extensions/renderer/bindings/js_runner.cc b/extensions/renderer/bindings/js_runner.cc
index c71e115..7bd657e 100644
--- a/extensions/renderer/bindings/js_runner.cc
+++ b/extensions/renderer/bindings/js_runner.cc
@@ -4,6 +4,7 @@
 
 #include "extensions/renderer/bindings/js_runner.h"
 
+#include "base/containers/span.h"
 #include "base/supports_user_data.h"
 #include "gin/per_context_data.h"
 
@@ -75,9 +76,8 @@
 
 void JSRunner::RunJSFunction(v8::Local<v8::Function> function,
                              v8::Local<v8::Context> context,
-                             int argc,
-                             v8::Local<v8::Value> argv[]) {
-  RunJSFunction(function, context, argc, argv, ResultCallback());
+                             base::span<v8::Local<v8::Value>> args) {
+  RunJSFunction(function, context, args, ResultCallback());
 }
 
 }  // namespace extensions
diff --git a/extensions/renderer/bindings/js_runner.h b/extensions/renderer/bindings/js_runner.h
index bd67be391..bc58332 100644
--- a/extensions/renderer/bindings/js_runner.h
+++ b/extensions/renderer/bindings/js_runner.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <optional>
 
+#include "base/containers/span.h"
 #include "base/functional/callback.h"
 #include "v8/include/v8.h"
 
@@ -44,14 +45,12 @@
   // the context.
   void RunJSFunction(v8::Local<v8::Function> function,
                      v8::Local<v8::Context> context,
-                     int argc,
-                     v8::Local<v8::Value> argv[]);
+                     base::span<v8::Local<v8::Value>> args);
   // Same as above, but if a |callback| is provided, it will be called with the
   // results of the function running.
   virtual void RunJSFunction(v8::Local<v8::Function> function,
                              v8::Local<v8::Context> context,
-                             int argc,
-                             v8::Local<v8::Value> argv[],
+                             base::span<v8::Local<v8::Value>> args,
                              ResultCallback callback) = 0;
 
   // Executes the given |function| synchronously and returns the result. This
@@ -60,14 +59,22 @@
   virtual v8::MaybeLocal<v8::Value> RunJSFunctionSync(
       v8::Local<v8::Function> function,
       v8::Local<v8::Context> context,
-      int argc,
-      v8::Local<v8::Value> argv[]) = 0;
+      base::span<v8::Local<v8::Value>> args) = 0;
 
   // Sets a global instance for testing that will be returned instead of the
   // per-context version (if any).
   static void SetInstanceForTesting(JSRunner* runner);
   // Returns the global testing instance.
   static JSRunner* GetInstanceForTesting();
+
+ protected:
+  // Returns the address of the first element in `args` or nullptr if the span
+  // is empty.
+  // TODO(crbug.com/351564777): This potentially can be removed once other
+  // APIs migrate from C-style arrays to spans.
+  v8::Local<v8::Value>* GetArgv(base::span<v8::Local<v8::Value>> args) {
+    return args.empty() ? nullptr : &args[0];
+  }
 };
 
 }  // namespace extensions
diff --git a/extensions/renderer/bindings/test_js_runner.cc b/extensions/renderer/bindings/test_js_runner.cc
index fffb5e8..d4e1e964 100644
--- a/extensions/renderer/bindings/test_js_runner.cc
+++ b/extensions/renderer/bindings/test_js_runner.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "extensions/renderer/bindings/test_js_runner.h"
 
 #include <ostream>
@@ -86,8 +81,7 @@
 
 void TestJSRunner::RunJSFunction(v8::Local<v8::Function> function,
                                  v8::Local<v8::Context> context,
-                                 int argc,
-                                 v8::Local<v8::Value> argv[],
+                                 base::span<v8::Local<v8::Value>> args,
                                  ResultCallback callback) {
   if (g_suspended) {
     // Script is suspended. Queue up the call and return.
@@ -96,10 +90,11 @@
     call.isolate = isolate;
     call.function.Reset(isolate, function);
     call.context.Reset(isolate, context);
-    call.arguments.reserve(argc);
+    call.arguments.reserve(args.size());
     call.callback = std::move(callback);
-    for (int i = 0; i < argc; ++i)
-      call.arguments.push_back(v8::Global<v8::Value>(isolate, argv[i]));
+    for (auto& arg : args) {
+      call.arguments.push_back(v8::Global<v8::Value>(isolate, arg));
+    }
     pending_calls_.push_back(std::move(call));
     return;
   }
@@ -112,9 +107,10 @@
 
   v8::MaybeLocal<v8::Value> result;
   if (g_allow_errors) {
-    result = function->Call(context, context->Global(), argc, argv);
+    result =
+        function->Call(context, context->Global(), args.size(), GetArgv(args));
   } else {
-    result = RunFunctionOnGlobal(function, context, argc, argv);
+    result = RunFunctionOnGlobal(function, context, args.size(), GetArgv(args));
   }
 
   if (callback)
@@ -124,8 +120,7 @@
 v8::MaybeLocal<v8::Value> TestJSRunner::RunJSFunctionSync(
     v8::Local<v8::Function> function,
     v8::Local<v8::Context> context,
-    int argc,
-    v8::Local<v8::Value> argv[]) {
+    base::span<v8::Local<v8::Value>> args) {
   // Note: deliberately circumvent g_suspension, since this should only be used
   // in response to JS interaction.
   if (will_call_js_)
@@ -133,10 +128,10 @@
 
   if (g_allow_errors) {
     v8::MaybeLocal<v8::Value> result =
-        function->Call(context, context->Global(), argc, argv);
+        function->Call(context, context->Global(), args.size(), GetArgv(args));
     return result;
   }
-  return RunFunctionOnGlobal(function, context, argc, argv);
+  return RunFunctionOnGlobal(function, context, args.size(), GetArgv(args));
 }
 
 void TestJSRunner::Flush() {
@@ -153,8 +148,7 @@
     for (auto& arg : call.arguments)
       local_arguments.push_back(arg.Get(isolate));
     v8::MaybeLocal<v8::Value> result =
-        RunJSFunctionSync(call.function.Get(isolate), context,
-                          local_arguments.size(), local_arguments.data());
+        RunJSFunctionSync(call.function.Get(isolate), context, local_arguments);
     if (call.callback)
       std::move(call.callback).Run(context, Convert(result, context));
   }
diff --git a/extensions/renderer/bindings/test_js_runner.h b/extensions/renderer/bindings/test_js_runner.h
index d3b5f46..2b89816 100644
--- a/extensions/renderer/bindings/test_js_runner.h
+++ b/extensions/renderer/bindings/test_js_runner.h
@@ -5,6 +5,7 @@
 #ifndef EXTENSIONS_RENDERER_BINDINGS_TEST_JS_RUNNER_H_
 #define EXTENSIONS_RENDERER_BINDINGS_TEST_JS_RUNNER_H_
 
+#include "base/containers/span.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "extensions/renderer/bindings/js_runner.h"
@@ -85,14 +86,12 @@
   // JSRunner:
   void RunJSFunction(v8::Local<v8::Function> function,
                      v8::Local<v8::Context> context,
-                     int argc,
-                     v8::Local<v8::Value> argv[],
+                     base::span<v8::Local<v8::Value>> args,
                      ResultCallback callback) override;
   v8::MaybeLocal<v8::Value> RunJSFunctionSync(
       v8::Local<v8::Function> function,
       v8::Local<v8::Context> context,
-      int argc,
-      v8::Local<v8::Value> argv[]) override;
+      base::span<v8::Local<v8::Value>> args) override;
 
  private:
   friend class Suspension;
diff --git a/extensions/renderer/content_setting.cc b/extensions/renderer/content_setting.cc
index e1a735e3..8a722fe 100644
--- a/extensions/renderer/content_setting.cc
+++ b/extensions/renderer/content_setting.cc
@@ -191,7 +191,7 @@
         args.push_back(object);
       }
       JSRunner::Get(context)->RunJSFunction(parse_result.callback, context,
-                                            args.size(), args.data());
+                                            args);
     }
     return;
   }
diff --git a/extensions/renderer/extension_js_runner.cc b/extensions/renderer/extension_js_runner.cc
index ad77ae8f..eb13e00 100644
--- a/extensions/renderer/extension_js_runner.cc
+++ b/extensions/renderer/extension_js_runner.cc
@@ -4,6 +4,7 @@
 
 #include "extensions/renderer/extension_js_runner.h"
 
+#include "base/containers/span.h"
 #include "base/functional/bind.h"
 #include "content/public/renderer/worker_thread.h"
 #include "extensions/renderer/script_context.h"
@@ -21,8 +22,7 @@
 
 void ExtensionJSRunner::RunJSFunction(v8::Local<v8::Function> function,
                                       v8::Local<v8::Context> context,
-                                      int argc,
-                                      v8::Local<v8::Value> argv[],
+                                      base::span<v8::Local<v8::Value>> args,
                                       ResultCallback callback) {
   blink::WebScriptExecutionCallback wrapper_callback;
   if (callback) {
@@ -32,15 +32,14 @@
   }
 
   // TODO(devlin): Move ScriptContext::SafeCallFunction() into here?
-  script_context_->SafeCallFunction(function, argc, argv,
+  script_context_->SafeCallFunction(function, args.size(), GetArgv(args),
                                     std::move(wrapper_callback));
 }
 
 v8::MaybeLocal<v8::Value> ExtensionJSRunner::RunJSFunctionSync(
     v8::Local<v8::Function> function,
     v8::Local<v8::Context> context,
-    int argc,
-    v8::Local<v8::Value> argv[]) {
+    base::span<v8::Local<v8::Value>> args) {
   DCHECK(script_context_->v8_context() == context);
 
   v8::Isolate* isolate = context->GetIsolate();
@@ -64,10 +63,10 @@
   // entry points would be reached during suspension. It would be nice to reduce
   // or eliminate the need for this method.
   if (web_frame) {
-    result = web_frame->CallFunctionEvenIfScriptDisabled(function, global, argc,
-                                                         argv);
+    result = web_frame->CallFunctionEvenIfScriptDisabled(
+        function, global, args.size(), GetArgv(args));
   } else {
-    result = function->Call(context, global, argc, argv);
+    result = function->Call(context, global, args.size(), GetArgv(args));
   }
 
   return result;
diff --git a/extensions/renderer/extension_js_runner.h b/extensions/renderer/extension_js_runner.h
index d75f255..4073db1 100644
--- a/extensions/renderer/extension_js_runner.h
+++ b/extensions/renderer/extension_js_runner.h
@@ -27,14 +27,12 @@
   // JSRunner:
   void RunJSFunction(v8::Local<v8::Function> function,
                      v8::Local<v8::Context> context,
-                     int argc,
-                     v8::Local<v8::Value> argv[],
+                     base::span<v8::Local<v8::Value>> args,
                      ResultCallback callback) override;
   v8::MaybeLocal<v8::Value> RunJSFunctionSync(
       v8::Local<v8::Function> function,
       v8::Local<v8::Context> context,
-      int argc,
-      v8::Local<v8::Value> argv[]) override;
+      base::span<v8::Local<v8::Value>> args) override;
 
  private:
   // Called with the result of executing the JS function.
diff --git a/internal b/internal
index 07d1b81..73607ee 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 07d1b817873ca3c81870063eceec46298d475541
+Subproject commit 73607eee994ba5e68eb326f61e3f0543f2044a86
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index bfa3d55..39863c0 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+<grit base_dir="." latest_public_release="0" current_release="1" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
   locale.  The strings in this file are specific to iOS.
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index e116be14..a46839e 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+<grit base_dir="." latest_public_release="0" current_release="1" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
   locale.  The strings in this file are specific to iOS.
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 861b8c5c..136826b 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+<grit base_dir="." latest_public_release="0" current_release="1" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
   locale.  The strings in this file are specific to iOS.
diff --git a/ios/chrome/browser/omnibox/ui_bundled/omnibox_text_field_ios.mm b/ios/chrome/browser/omnibox/ui_bundled/omnibox_text_field_ios.mm
index 000482a..9527b7d 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/omnibox_text_field_ios.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/omnibox_text_field_ios.mm
@@ -126,6 +126,13 @@
 
     [self pasteboardDidChange:nil];
 
+    // Similar logic as `omnibox_view_controller.mm`.
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(applicationDidBecomeActive:)
+               name:UIApplicationDidBecomeActiveNotification
+             object:nil];
+
     if (@available(iOS 17, *)) {
       NSArray<UITrait>* traits = TraitCollectionSetForTraits(
           @[ UITraitPreferredContentSizeCategory.class ]);
@@ -141,6 +148,10 @@
   NOTREACHED();
 }
 
+- (void)dealloc {
+  [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
 - (void)setText:(NSAttributedString*)text
     userTextLength:(size_t)userTextLength {
   DCHECK_LE(userTextLength, text.length);
@@ -1034,6 +1045,10 @@
   _pasteboardHasStrings = pasteboard.hasStrings;
 }
 
+- (void)applicationDidBecomeActive:(NSNotification*)notification {
+  [self pasteboardDidChange:nil];
+}
+
 // Resets Omnibox's the font and attributed text when a UITrait is modified.
 - (void)updateTextProperitesOnTraitChange {
   // Reset the fonts to the appropriate ones in this size class.
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index 0873740..bc01d1eb 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-aa8cf6acf5e19c2c34fa65e11fd641d66db69922
\ No newline at end of file
+310465941d79d968a37deb5ca289c1156490686c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
index 4f893ce..b0d0c9d 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-1aa84e3683d38fb700807bd2c980e95849476faf
\ No newline at end of file
+ac62852be931c28822a02ef6ddcc43c8c1933fb7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 913b6e0..9b0c3e78 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-e44ecffdc76a63a4a0c8fc0d4e417eec046a42c8
\ No newline at end of file
+d875b8ccbe836ab36cd777f30739b4bb60c129bb
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
index 88504b3..38bd3c0 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-3bc60f53c6e08de9ef5940d0212409d8f3dbc2d1
\ No newline at end of file
+c154766a10978dcbe37f0c92bbb29314c9ef6310
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 32b2d41..f83d3d74 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-6b6905682ef4fba4e49e272e4f7ef5efd5cc49ac
\ No newline at end of file
+ad3f89dcd5022abd30d3d1041ee0e2dcc1025eac
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
index bcfe9598..9d419932 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-84c2a656fa28331d33c8ef8aa000c53f7d6b5d59
\ No newline at end of file
+3b2d1dda12b4097eace76e3afae4378a619f108d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index e6c5762..5a39191b1 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-e582e06e185785e2591a9cada0c796b9c789bb59
\ No newline at end of file
+13b69614b20d5c0c821fe35504eec2663b80df82
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
index dc0c453..be72e36 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-b6e27b3269682a5be4385a16cc0201abbc5bdc11
\ No newline at end of file
+9d6d241ade1150e338d3008665ed58c55fe6a88d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index 5c460da..b782137 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4e95ecff31ac344203da9cbb4e4d88d608b2220b
\ No newline at end of file
+f01e802094f60d9dac265d008f7cf2571e5186c2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 20885c7..2a2c88a2 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-d20ffaf39593f471e53a04bc5a0d28b546162a4a
\ No newline at end of file
+0caaf47a3b0b3cad6f5db7aa9350f182ff5daaa9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 2909cf44..2eb5b22 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-c7d948e9266f21e434a2189949b65884fb8584d1
\ No newline at end of file
+61dd5abcdaac55fd6dec83c98cc2661cfffa3c32
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
index 218ae73d..1fb09fd 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-d6a9b95d85b361406e52c6291a523beca92e6806
\ No newline at end of file
+7bb35323cb1790794e5da511b224dd09b905e545
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 250a064..9b6949b 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0468c1689cc4364cffd81a1fec6b952a6e2a47d5
\ No newline at end of file
+5da1d9d764db2d2d8ad67fa56018e66daea17a7c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 82ea1f7be..d4440676 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-300ec4efb8160babcc21d751b07e7c8fc7b8f1a4
\ No newline at end of file
+40ff75697f7f53664b8db51c00ba488c975934d1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index fc79fd7a..960579c 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-a0c7c6c090ba42a04f2a84f7189fdd59fe757e9c
\ No newline at end of file
+9a6e00d1f1543ebe35fdf68cd2ee7d5a51045b2c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
index 812252f7..bb0928c 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-c65c8208c744d696f1b0b95abb1fc96516a46222
\ No newline at end of file
+d548129c5045f0e014e8639e89bff22f69f64bb6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 8add769..0f9c725 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-daf0177267dee5c0067a36074b5e526f80f0743c
\ No newline at end of file
+cdcdc92ffb473a3125494e0d9b5d510051994d17
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
index f889340..31acf88 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-415991b5d338741e0b1e74da3e6b5feb86b196f0
\ No newline at end of file
+a2eb8809705f95ed105af6ba38596ca1797a5811
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index b79751b4..f9c04ccf 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-066d0fd8ef1ef69187cb127b1e8651ae2cf06d7c
\ No newline at end of file
+7e0040a9a510cf82b06b08fabeeb178b9ad8e948
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index c958c316..1a88e86 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0085addececc99b32262e61a901743cb2b06b252
\ No newline at end of file
+981c51344fcd00452399ae34e71a7a23e501018b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 5642218..a457329818 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-94db464706d519ea64877e8036fcca2031c9dd61
\ No newline at end of file
+d5b8426bb3a7aa100fdbcfc851c9cd4683fae955
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
index 6004dad..3435a232 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-caf40f2dce2278a316241d65f5d309a573dc1a00
\ No newline at end of file
+a813266906126c35f10f9ff83cdeba4169aac18a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 6d711f4..7ef34ce 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-cf24e646e70804992455a7ff494d3dac15115c6f
\ No newline at end of file
+2b73403c69a32b27d9671cb0f5cd53a413d63152
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 2ff9573..975a3d9 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-261c36fd4374059728ee92297231d24880e85bbd
\ No newline at end of file
+c251eec0ea5e31304febe5922dd85a49685c2c5a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index a021a92..5de9077 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-08be24b0f90c1803d73d7f4288911caeb140778b
\ No newline at end of file
+545c5ceb72a032a726009bd2c6ee49e67e0a3bd8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
index 21bdf424..6c5d62f 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-5c2fb28a9bf778d7cabfe2180d1ab10aacf53a78
\ No newline at end of file
+de2be9bb523bc0cbc868d8106586b62e05b786c9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index b22037b4..0cdacb4 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-05331d180128738fc8ee1744dbbefc31997819ff
\ No newline at end of file
+01f2603591bc293a23f6bbd3ad9afed8d64da0af
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 8f47b803..12cebe0 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-c2092e50932a6404e5fdc3b46803ff574f2aa241
\ No newline at end of file
+7878329ae63882446c5f5ed15a40a756ac81ef13
\ No newline at end of file
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn
index 6e098514..214ed4b5 100644
--- a/ios/third_party/material_components_ios/BUILD.gn
+++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -375,8 +375,6 @@
   "src/components/Tabs/src/TabBarView/private/MDCTabBarViewItemView.h",
   "src/components/Tabs/src/TabBarView/private/MDCTabBarViewItemViewDelegate.h",
   "src/components/Tabs/src/TabBarView/private/MDCTabBarViewPrivateIndicatorContext.h",
-  "src/components/Tabs/src/TypographyThemer/MDCTabBarTypographyThemer.h",
-  "src/components/Tabs/src/TypographyThemer/MaterialTabs+TypographyThemer.h",
   "src/components/Tabs/src/private/MDCItemBar.h",
   "src/components/Tabs/src/private/MDCItemBarAlignment.h",
   "src/components/Tabs/src/private/MDCItemBarBadge.h",
@@ -399,8 +397,6 @@
   "src/components/TextControls/src/Enums/MaterialTextControls+Enums.h",
   "src/components/TextControls/src/FilledTextAreas/MDCFilledTextArea.h",
   "src/components/TextControls/src/FilledTextAreas/MaterialTextControls+FilledTextAreas.h",
-  "src/components/TextControls/src/FilledTextAreasTheming/MDCFilledTextArea+MaterialTheming.h",
-  "src/components/TextControls/src/FilledTextAreasTheming/MaterialTextControls+FilledTextAreasTheming.h",
   "src/components/TextControls/src/FilledTextFields/MDCFilledTextField.h",
   "src/components/TextControls/src/FilledTextFields/MaterialTextControls+FilledTextFields.h",
   "src/components/TextControls/src/FilledTextFieldsTheming/MDCFilledTextField+MaterialTheming.h",
@@ -415,8 +411,6 @@
   "src/components/TextControls/src/OutlinedTextFieldsTheming/MaterialTextControls+OutlinedTextFieldsTheming.h",
   "src/components/TextControls/src/UnderlinedTextFields/MDCUnderlinedTextField.h",
   "src/components/TextControls/src/UnderlinedTextFields/MaterialTextControls+UnderlinedTextFields.h",
-  "src/components/TextControls/src/UnderlinedTextFieldsTheming/MDCUnderlinedTextField+MaterialTheming.h",
-  "src/components/TextControls/src/UnderlinedTextFieldsTheming/MaterialTextControls+UnderlinedTextFieldsTheming.h",
   "src/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.h",
   "src/components/TextFields/src/ColorThemer/MaterialTextFields+ColorThemer.h",
   "src/components/TextFields/src/MDCIntrinsicHeightTextView.h",
@@ -655,14 +649,12 @@
   "src/components/Tabs/src/SizeClassDelegate",
   "src/components/Tabs/src/TabBarView",
   "src/components/Tabs/src/TabBarView/private",
-  "src/components/Tabs/src/TypographyThemer",
   "src/components/Tabs/src/private",
   "src/components/TextControls/src/BaseTextAreas",
   "src/components/TextControls/src/BaseTextAreas/private",
   "src/components/TextControls/src/BaseTextFields",
   "src/components/TextControls/src/Enums",
   "src/components/TextControls/src/FilledTextAreas",
-  "src/components/TextControls/src/FilledTextAreasTheming",
   "src/components/TextControls/src/FilledTextFields",
   "src/components/TextControls/src/FilledTextFieldsTheming",
   "src/components/TextControls/src/OutlinedTextAreas",
@@ -670,7 +662,6 @@
   "src/components/TextControls/src/OutlinedTextFields",
   "src/components/TextControls/src/OutlinedTextFieldsTheming",
   "src/components/TextControls/src/UnderlinedTextFields",
-  "src/components/TextControls/src/UnderlinedTextFieldsTheming",
   "src/components/TextFields/src",
   "src/components/TextFields/src/ColorThemer",
   "src/components/TextFields/src/Theming",
@@ -1264,9 +1255,6 @@
   "src/components/Tabs/src/TabBarView/private/MDCTabBarViewItemViewDelegate.h",
   "src/components/Tabs/src/TabBarView/private/MDCTabBarViewPrivateIndicatorContext.h",
   "src/components/Tabs/src/TabBarView/private/MDCTabBarViewPrivateIndicatorContext.m",
-  "src/components/Tabs/src/TypographyThemer/MDCTabBarTypographyThemer.h",
-  "src/components/Tabs/src/TypographyThemer/MDCTabBarTypographyThemer.m",
-  "src/components/Tabs/src/TypographyThemer/MaterialTabs+TypographyThemer.h",
   "src/components/Tabs/src/private/MDCItemBar.h",
   "src/components/Tabs/src/private/MDCItemBar.m",
   "src/components/Tabs/src/private/MDCItemBarAlignment.h",
@@ -1301,9 +1289,6 @@
   "src/components/TextControls/src/FilledTextAreas/MDCFilledTextArea.h",
   "src/components/TextControls/src/FilledTextAreas/MDCFilledTextArea.m",
   "src/components/TextControls/src/FilledTextAreas/MaterialTextControls+FilledTextAreas.h",
-  "src/components/TextControls/src/FilledTextAreasTheming/MDCFilledTextArea+MaterialTheming.h",
-  "src/components/TextControls/src/FilledTextAreasTheming/MDCFilledTextArea+MaterialTheming.m",
-  "src/components/TextControls/src/FilledTextAreasTheming/MaterialTextControls+FilledTextAreasTheming.h",
   "src/components/TextControls/src/FilledTextFields/MDCFilledTextField.h",
   "src/components/TextControls/src/FilledTextFields/MDCFilledTextField.m",
   "src/components/TextControls/src/FilledTextFields/MaterialTextControls+FilledTextFields.h",
@@ -1325,9 +1310,6 @@
   "src/components/TextControls/src/UnderlinedTextFields/MDCUnderlinedTextField.h",
   "src/components/TextControls/src/UnderlinedTextFields/MDCUnderlinedTextField.m",
   "src/components/TextControls/src/UnderlinedTextFields/MaterialTextControls+UnderlinedTextFields.h",
-  "src/components/TextControls/src/UnderlinedTextFieldsTheming/MDCUnderlinedTextField+MaterialTheming.h",
-  "src/components/TextControls/src/UnderlinedTextFieldsTheming/MDCUnderlinedTextField+MaterialTheming.m",
-  "src/components/TextControls/src/UnderlinedTextFieldsTheming/MaterialTextControls+UnderlinedTextFieldsTheming.h",
   "src/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.h",
   "src/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.m",
   "src/components/TextFields/src/ColorThemer/MaterialTextFields+ColorThemer.h",
diff --git a/ios/third_party/material_components_ios/src b/ios/third_party/material_components_ios/src
index 3f82e5f..b5bbb66 160000
--- a/ios/third_party/material_components_ios/src
+++ b/ios/third_party/material_components_ios/src
@@ -1 +1 @@
-Subproject commit 3f82e5f3b0ea2e4aaca1bdfbfa18f34f5b3f6a6d
+Subproject commit b5bbb66b58798106ab6d1cab32a22288d3ccabd4
diff --git a/ios_internal b/ios_internal
index a48abcf..b17d273 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit a48abcfc293d8e695d52adafe5a76954066a0ab8
+Subproject commit b17d27327c1014632c418765f9f031f6c942a18e
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc
index e5a5212..b23e816 100644
--- a/media/video/av1_video_encoder.cc
+++ b/media/video/av1_video_encoder.cc
@@ -530,7 +530,7 @@
   }
 
   bool key_frame = encode_options.key_frame;
-  auto duration_us = GetFrameDuration(*frame).InMicroseconds();
+  int64_t duration_us = GetFrameDuration(*frame).InMicroseconds();
   last_frame_timestamp_ = frame->timestamp();
   if (last_frame_color_space_ != frame->ColorSpace()) {
     last_frame_color_space_ = frame->ColorSpace();
@@ -595,14 +595,19 @@
   auto error =
       aom_codec_encode(codec_.get(), image, artificial_timestamp_, duration_us,
                        key_frame ? AOM_EFLAG_FORCE_KF : 0);
-  artificial_timestamp_ += duration_us;
-
   if (error != AOM_CODEC_OK) {
     auto msg = LogAomErrorMessage(codec_.get(), "AOM encoding error", error);
     std::move(done_cb).Run(
         EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode, msg));
     return;
   }
+  if (!base::CheckAdd(artificial_timestamp_, duration_us)
+           .AssignIfValid(&artificial_timestamp_)) {
+    std::move(done_cb).Run(EncoderStatus(
+        EncoderStatus::Codes::kEncoderFailedEncode,
+        "Timestamp overflow. Most likely, frame's duration is too large."));
+    return;
+  }
   auto output = GetEncoderOutput(std::move(temporal_id_status).value(),
                                  frame->timestamp(), frame->ColorSpace());
   if (svc_params_.number_temporal_layers > 1) {
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc
index cdd77cc..10a11db6 100644
--- a/net/http/http_auth_cache.cc
+++ b/net/http/http_auth_cache.cc
@@ -304,14 +304,14 @@
   return false;
 }
 
-void HttpAuthCache::ClearEntriesAddedBetween(
+bool HttpAuthCache::ClearEntriesAddedBetween(
     base::Time begin_time,
     base::Time end_time,
     base::RepeatingCallback<bool(const GURL&)> url_matcher) {
   if (begin_time.is_min() && end_time.is_max() && !url_matcher) {
-    ClearAllEntries();
-    return;
+    return ClearAllEntries();
   }
+  const size_t num_entries_before = entries_.size();
   std::erase_if(entries_, [begin_time, end_time, url_matcher](
                               const EntryMap::value_type& entry_map_pair) {
     const Entry& entry = entry_map_pair.second;
@@ -320,10 +320,15 @@
            (url_matcher ? url_matcher.Run(entry.scheme_host_port().GetURL())
                         : true);
   });
+  return entries_.size() != num_entries_before;
 }
 
-void HttpAuthCache::ClearAllEntries() {
+bool HttpAuthCache::ClearAllEntries() {
+  if (entries_.empty()) {
+    return false;
+  }
   entries_.clear();
+  return true;
 }
 
 bool HttpAuthCache::UpdateStaleChallenge(
diff --git a/net/http/http_auth_cache.h b/net/http/http_auth_cache.h
index 960b95760..1fbbbc4b 100644
--- a/net/http/http_auth_cache.h
+++ b/net/http/http_auth_cache.h
@@ -205,13 +205,14 @@
   // Clears cache entries added between |begin_time| inclusively and |end_time|
   // exclusively. Clears all entries if |begin_time| and |end_time| are equal to
   // base::Time::Min() and base::Time::Max() respectively.
-  void ClearEntriesAddedBetween(
+  // Returns true if any entries were cleared.
+  bool ClearEntriesAddedBetween(
       base::Time begin_time,
       base::Time end_time,
       base::RepeatingCallback<bool(const GURL&)> url_matcher);
 
-  // Clears all added entries.
-  void ClearAllEntries();
+  // Clears all added entries. Returns true if any entries were cleared.
+  bool ClearAllEntries();
 
   // Updates a stale digest entry on server |scheme_host_port| for realm |realm|
   // and scheme |scheme|. The cached auth challenge is replaced with
diff --git a/net/http/http_auth_cache_unittest.cc b/net/http/http_auth_cache_unittest.cc
index 7841f691..06a7a90 100644
--- a/net/http/http_auth_cache_unittest.cc
+++ b/net/http/http_auth_cache_unittest.cc
@@ -749,6 +749,18 @@
   EXPECT_FALSE(nullptr == entry);
 }
 
+TEST(HttpAuthCacheTest, ClearEntriesAddedBetweenNothingToClear) {
+  HttpAuthCache cache(false /* key_entries_by_network_anonymization_key */);
+  EXPECT_FALSE(cache.ClearEntriesAddedBetween(
+      base::Time::Min(), base::Time::Max(),
+      base::RepeatingCallback<bool(const GURL&)>()));
+}
+
+TEST(HttpAuthCacheTest, ClearAllEntriesNothingToClear) {
+  HttpAuthCache cache(false /* key_entries_by_network_anonymization_key */);
+  EXPECT_FALSE(cache.ClearAllEntries());
+}
+
 TEST(HttpAuthCacheTest, ClearEntriesAddedBetween) {
   url::SchemeHostPort scheme_host_port(GURL("http://foobar.com"));
 
@@ -788,8 +800,8 @@
   ASSERT_TRUE(base::Time::FromString("30 May 2018 12:00:05", &test_time1));
   base::Time test_time2;
   ASSERT_TRUE(base::Time::FromString("30 May 2018 12:00:15", &test_time2));
-  cache.ClearEntriesAddedBetween(test_time1, test_time2,
-                                 base::RepeatingCallback<bool(const GURL&)>());
+  EXPECT_TRUE(cache.ClearEntriesAddedBetween(
+      test_time1, test_time2, base::RepeatingCallback<bool(const GURL&)>()));
 
   // Realms 1 and 2 are older than 12:00:05 and should not be cleared
   EXPECT_NE(nullptr, cache.Lookup(scheme_host_port, HttpAuth::AUTH_SERVER,
@@ -817,9 +829,13 @@
                                   kRealm4, HttpAuth::AUTH_SCHEME_BASIC,
                                   NetworkAnonymizationKey()));
 
-  cache.ClearEntriesAddedBetween(start_time - base::Seconds(1),
-                                 base::Time::Max(),
-                                 base::RepeatingCallback<bool(const GURL&)>());
+  // Repeated clear with the same filter should return false.
+  EXPECT_FALSE(cache.ClearEntriesAddedBetween(
+      test_time1, test_time2, base::RepeatingCallback<bool(const GURL&)>()));
+
+  EXPECT_TRUE(cache.ClearEntriesAddedBetween(
+      start_time - base::Seconds(1), base::Time::Max(),
+      base::RepeatingCallback<bool(const GURL&)>()));
   EXPECT_EQ(nullptr, cache.Lookup(scheme_host_port, HttpAuth::AUTH_SERVER,
                                   kRealm1, HttpAuth::AUTH_SCHEME_BASIC,
                                   NetworkAnonymizationKey()));
@@ -828,6 +844,11 @@
                                   NetworkAnonymizationKey()));
   EXPECT_EQ(nullptr, cache.LookupByPath(scheme_host_port, HttpAuth::AUTH_SERVER,
                                         NetworkAnonymizationKey(), "/baz/"));
+
+  // Repeated clear with the same filter should return false.
+  EXPECT_FALSE(cache.ClearEntriesAddedBetween(
+      start_time - base::Seconds(1), base::Time::Max(),
+      base::RepeatingCallback<bool(const GURL&)>()));
 }
 
 TEST(HttpAuthCacheTest, ClearEntriesAddedBetweenByFilter) {
@@ -847,10 +868,10 @@
             HttpAuth::AUTH_SCHEME_BASIC, NetworkAnonymizationKey(),
             "basic realm=Realm1", AuthCredentials(kRoot, kWileCoyote), "/");
 
-  cache.ClearEntriesAddedBetween(
+  EXPECT_TRUE(cache.ClearEntriesAddedBetween(
       base::Time::Min(), base::Time::Max(),
       base::BindRepeating(&DoesUrlMatchFilter,
-                          std::set<std::string>({scheme_host_port_1.host()})));
+                          std::set<std::string>({scheme_host_port_1.host()}))));
 
   // Only foobar.com should be cleared while foobar2.com remains.
   EXPECT_EQ(nullptr, cache.Lookup(scheme_host_port_1, HttpAuth::AUTH_SERVER,
@@ -859,6 +880,12 @@
   EXPECT_NE(nullptr, cache.Lookup(scheme_host_port_2, HttpAuth::AUTH_SERVER,
                                   kRealm1, HttpAuth::AUTH_SCHEME_BASIC,
                                   NetworkAnonymizationKey()));
+
+  // Repeated clear with the same filter should return false.
+  EXPECT_FALSE(cache.ClearEntriesAddedBetween(
+      base::Time::Min(), base::Time::Max(),
+      base::BindRepeating(&DoesUrlMatchFilter,
+                          std::set<std::string>({scheme_host_port_1.host()}))));
 }
 
 TEST(HttpAuthCacheTest, ClearEntriesAddedBetweenWithAllTimeValues) {
@@ -889,8 +916,9 @@
             HttpAuth::AUTH_SCHEME_BASIC, NetworkAnonymizationKey(),
             "basic realm=Realm2", AuthCredentials(kAdmin, kPassword), "/baz/");
 
-  cache.ClearEntriesAddedBetween(base::Time::Min(), base::Time::Max(),
-                                 base::RepeatingCallback<bool(const GURL&)>());
+  EXPECT_TRUE(cache.ClearEntriesAddedBetween(
+      base::Time::Min(), base::Time::Max(),
+      base::RepeatingCallback<bool(const GURL&)>()));
 
   // All entries should be cleared.
   EXPECT_EQ(nullptr, cache.Lookup(scheme_host_port, HttpAuth::AUTH_SERVER,
@@ -907,6 +935,11 @@
   EXPECT_EQ(nullptr, cache.Lookup(scheme_host_port, HttpAuth::AUTH_SERVER,
                                   kRealm4, HttpAuth::AUTH_SCHEME_BASIC,
                                   NetworkAnonymizationKey()));
+
+  // A second clear while the cache is still empty should return false.
+  EXPECT_FALSE(cache.ClearEntriesAddedBetween(
+      base::Time::Min(), base::Time::Max(),
+      base::RepeatingCallback<bool(const GURL&)>()));
 }
 
 TEST(HttpAuthCacheTest, ClearAllEntries) {
@@ -938,7 +971,7 @@
             "basic realm=Realm2", AuthCredentials(kAdmin, kPassword), "/baz/");
 
   test_clock.Advance(base::Seconds(55));
-  cache.ClearAllEntries();
+  EXPECT_TRUE(cache.ClearAllEntries());
 
   // All entries should be cleared.
   EXPECT_EQ(nullptr, cache.Lookup(scheme_host_port, HttpAuth::AUTH_SERVER,
@@ -955,6 +988,9 @@
   EXPECT_EQ(nullptr, cache.Lookup(scheme_host_port, HttpAuth::AUTH_SERVER,
                                   kRealm4, HttpAuth::AUTH_SCHEME_BASIC,
                                   NetworkAnonymizationKey()));
+
+  // If there are no entries to clear, ClearAllEntries should return false.
+  EXPECT_FALSE(cache.ClearAllEntries());
 }
 
 TEST(HttpAuthCacheTest, UpdateStaleChallenge) {
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
index 5b0ce5e7..136f913 100644
--- a/net/http/http_stream_factory_job.cc
+++ b/net/http/http_stream_factory_job.cc
@@ -1278,14 +1278,20 @@
 }
 
 void HttpStreamFactory::Job::RecordPreconnectHistograms(int result) {
+  CHECK(job_type_ == PRECONNECT || job_type_ == PRECONNECT_DNS_ALPN_H3);
   if (!IsGoogleHost(destination_.host())) {
     return;
   }
   if (using_quic_) {
+    constexpr std::string_view kHistogramName =
+        "Net.SessionCreate.GoogleSearch.Preconnect.Quic.CompletionResult";
     // TODO(crbug.com/376304027): Expand this to non-Quic as well. Currently,
     // H1 and H2 does not return precise failure reason.
+    base::UmaHistogramSparse(kHistogramName, -result);
     base::UmaHistogramSparse(
-        "Net.SessionCreate.GoogleSearch.Preconnect.Quic.CompletionResult",
+        base::StrCat({kHistogramName, job_type_ == PRECONNECT
+                                          ? ".PreconnectJob"
+                                          : ".PreconnectDnsAlpnH3Job"}),
         -result);
   }
 }
diff --git a/net/http/http_stream_pool_attempt_manager.cc b/net/http/http_stream_pool_attempt_manager.cc
index 20b9fea..6af8c6ff 100644
--- a/net/http/http_stream_pool_attempt_manager.cc
+++ b/net/http/http_stream_pool_attempt_manager.cc
@@ -458,11 +458,10 @@
       });
 
   if (rv != OK) {
-    final_error_to_notify_jobs_ = rv;
     // If service endpoint resolution failed, record an empty endpoint and the
     // result.
     connection_attempts_.emplace_back(IPEndPoint(), rv);
-    NotifyFailure();
+    HandleFinalError(rv);
     return;
   }
 
@@ -552,11 +551,15 @@
 
 void HttpStreamPool::AttemptManager::CancelInFlightAttempts(
     StreamSocketCloseReason reason) {
+  if (in_flight_attempts_.empty()) {
+    return;
+  }
+
   const size_t num_cancel_attempts = in_flight_attempts_.size();
   for (auto& attempt : in_flight_attempts_) {
     attempt->SetCancelReason(reason);
   }
-  pool()->DecrementTotalConnectingStreamCount(in_flight_attempts_.size());
+  pool()->DecrementTotalConnectingStreamCount(num_cancel_attempts);
   in_flight_attempts_.clear();
   slow_attempt_count_ = 0;
 
@@ -597,9 +600,15 @@
 }
 
 void HttpStreamPool::AttemptManager::CancelJobs(int error) {
-  final_error_to_notify_jobs_ = error;
   is_canceling_jobs_ = true;
-  NotifyFailure();
+  HandleFinalError(error);
+}
+
+void HttpStreamPool::AttemptManager::CancelQuicTask(int error) {
+  if (quic_task_) {
+    quic_task_result_ = error;
+    quic_task_.reset();
+  }
 }
 
 size_t HttpStreamPool::AttemptManager::PendingJobCount() const {
@@ -739,8 +748,7 @@
 void HttpStreamPool::AttemptManager::OnRequiredHttp11() {
   if (spdy_session_) {
     spdy_session_.reset();
-    is_failing_ = true;
-    final_error_to_notify_jobs_ = ERR_HTTP_1_1_REQUIRED;
+    HandleFinalError(ERR_HTTP_1_1_REQUIRED);
   }
 }
 
@@ -798,8 +806,7 @@
   if (rv != OK &&
       (tcp_based_attempt_state_ == TcpBasedAttemptState::kAllEndpointsFailed ||
        group_->force_quic() || !CanUseTcpBasedProtocols())) {
-    final_error_to_notify_jobs_ = rv;
-    NotifyFailure();
+    HandleFinalError(rv);
     return;
   }
 
@@ -827,6 +834,12 @@
   dict.Set("in_flight_attempt_count", static_cast<int>(InFlightAttemptCount()));
   dict.Set("slow_attempt_count", static_cast<int>(slow_attempt_count_));
   dict.Set("is_failing", is_failing_);
+  if (final_error_to_notify_jobs_.has_value()) {
+    dict.Set("final_error_to_notify_job", *final_error_to_notify_jobs_);
+  }
+  if (most_recent_tcp_error_.has_value()) {
+    dict.Set("most_recent_tcp_error", *most_recent_tcp_error_);
+  }
   dict.Set("can_attempt_connection",
            CanAttemptResultToString(CanAttemptConnection()));
   dict.Set("service_endpoint_request_finished",
@@ -924,11 +937,8 @@
   }
 
   if (!CanUseQuic()) {
-    if (quic_task_) {
-      // TODO(crbug.com/346835898): Use other error code?
-      quic_task_result_ = ERR_ABORTED;
-      quic_task_.reset();
-    }
+    // TODO(crbug.com/346835898): Use other error code?
+    CancelQuicTask(ERR_ABORTED);
     UpdateStreamAttemptState();
   }
 }
@@ -977,6 +987,9 @@
           quic_task_result_ = OK;
           quic_task_.reset();
         }
+        base::UmaHistogramTimes(
+            "Net.HttpStreamPool.ExistingQuicSessionFoundTime",
+            base::TimeTicks::Now() - dns_resolution_start_time_);
         HandleQuicSessionReady(
             StreamSocketCloseReason::kUsingExistingQuicSession);
         // Use PostTask() because we could reach here from RequestStream()
@@ -1004,6 +1017,9 @@
             spdy_session_key(), endpoint,
             service_endpoint_request_->GetDnsAliasResults());
     if (spdy_session_) {
+      base::UmaHistogramTimes(
+          "Net.HttpStreamPool.ExistingSpdySessionFoundTime",
+          base::TimeTicks::Now() - dns_resolution_start_time_);
       HandleSpdySessionReady(
           StreamSocketCloseReason::kUsingExistingSpdySession);
       // Use PostTask() because we could reach here from RequestStream()
@@ -1147,7 +1163,8 @@
               TcpBasedAttemptState::kAllEndpointsFailed &&
           !quic_task_) {
         // Tried all endpoints.
-        NotifyFailure();
+        DCHECK(most_recent_tcp_error_.has_value());
+        HandleFinalError(*most_recent_tcp_error_);
       }
       return;
     }
@@ -1440,6 +1457,30 @@
   return num_attempts >= std::max(jobs_.size(), CalculateMaxPreconnectCount());
 }
 
+void HttpStreamPool::AttemptManager::HandleFinalError(int error) {
+  // `this` may already be failing, e.g. IP address change happens while failing
+  // for a different reason.
+  if (is_failing_) {
+    return;
+  }
+
+  CHECK(!final_error_to_notify_jobs_.has_value());
+  final_error_to_notify_jobs_ = error;
+  is_failing_ = true;
+  net_log_.AddEvent(
+      NetLogEventType::HTTP_STREAM_POOL_ATTEMPT_MANAGER_NOTIFY_FAILURE, [&] {
+        base::Value::Dict dict = GetStatesAsNetLogParams();
+        dict.Set("net_error", final_error_to_notify_jobs());
+        return dict;
+      });
+
+  CancelInFlightAttempts(StreamSocketCloseReason::kAbort);
+  CancelQuicTask(final_error_to_notify_jobs());
+  NotifyPreconnectsComplete(final_error_to_notify_jobs());
+  NotifyJobOfFailure();
+  // `this` may be deleted.
+}
+
 HttpStreamPool::AttemptManager::FailureKind
 HttpStreamPool::AttemptManager::DetermineFailureKind() {
   if (is_canceling_jobs_) {
@@ -1457,20 +1498,6 @@
   return FailureKind::kStreamFailed;
 }
 
-void HttpStreamPool::AttemptManager::NotifyFailure() {
-  is_failing_ = true;
-  net_log_.AddEvent(
-      NetLogEventType::HTTP_STREAM_POOL_ATTEMPT_MANAGER_NOTIFY_FAILURE, [&] {
-        base::Value::Dict dict = GetStatesAsNetLogParams();
-        dict.Set("net_error", final_error_to_notify_jobs());
-        return dict;
-      });
-
-  NotifyPreconnectsComplete(final_error_to_notify_jobs());
-  NotifyJobOfFailure();
-  // `this` may be deleted.
-}
-
 void HttpStreamPool::AttemptManager::NotifyJobOfFailure() {
   CHECK(is_failing_);
   Job* job = ExtractFirstJobToNotify();
@@ -1798,6 +1825,10 @@
           /*supports_spdy=*/true);
     }
 
+    base::UmaHistogramTimes(
+        "Net.HttpStreamPool.NewSpdySessionEstablishTime",
+        base::TimeTicks::Now() - in_flight_attempt->start_time());
+
     HandleSpdySessionReady(StreamSocketCloseReason::kSpdySessionCreated);
     CreateSpdyStreamAndNotify();
     return;
@@ -1863,13 +1894,11 @@
     return;
   }
 
-  final_error_to_notify_jobs_ = rv;
-
   if (rv == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
     CHECK(UsingTls());
     client_auth_cert_info_ = in_flight_attempt->attempt()->GetCertRequestInfo();
     in_flight_attempt.reset();
-    NotifyFailure();
+    HandleFinalError(rv);
     return;
   }
 
@@ -1884,11 +1913,17 @@
     CHECK(has_ssl_info);
     cert_error_ssl_info_ = ssl_info;
     in_flight_attempt.reset();
-    NotifyFailure();
-  } else {
-    in_flight_attempt.reset();
-    MaybeAttemptConnection();
+    HandleFinalError(rv);
+    return;
   }
+
+  most_recent_tcp_error_ = rv;
+  in_flight_attempt.reset();
+  // Try to connect to a different destination, if any.
+  // TODO(crbug.com/383606724): Figure out better way to make connection
+  // attempts, see the review comment at
+  // https://chromium-review.googlesource.com/c/chromium/src/+/6160855/comment/60e04065_805b0b89/
+  MaybeAttemptConnection();
 }
 
 void HttpStreamPool::AttemptManager::OnSpdyThrottleDelayPassed() {
diff --git a/net/http/http_stream_pool_attempt_manager.h b/net/http/http_stream_pool_attempt_manager.h
index 8a066e6..87ad2ff1 100644
--- a/net/http/http_stream_pool_attempt_manager.h
+++ b/net/http/http_stream_pool_attempt_manager.h
@@ -159,6 +159,9 @@
   // Cancels all jobs.
   void CancelJobs(int error);
 
+  // Cancels the QuicTask if it exists.
+  void CancelQuicTask(int error);
+
   // Returns the number of pending jobs/preconnects. The number is
   // calculated by subtracting the number of in-flight attempts (excluding slow
   // attempts) from the number of total jobs.
@@ -357,13 +360,14 @@
                             std::optional<IPEndPoint>& current_endpoint);
   bool HasEnoughAttemptsForSlowIPEndPoint(const IPEndPoint& ip_endpoint);
 
+  // Called when this gets a fatal error. Notifies all jobs of the failure and
+  // cancels in-flight TCP-based attempts and QuicTask's, if they exist.
+  void HandleFinalError(int error);
+
   // Calculate the failure kind to notify jobs of failure. Used to call one of
   // the job's methods.
   FailureKind DetermineFailureKind();
 
-  // Notifies a failure to all jobs.
-  void NotifyFailure();
-
   // Notifies a failure to a single job. Used by NotifyFailure().
   void NotifyJobOfFailure();
 
@@ -509,6 +513,9 @@
   // attempt failure, network change events, or QUIC task failure.
   std::optional<int> final_error_to_notify_jobs_;
 
+  // Set to the most recent TCP-based attempt failure, if any.
+  std::optional<int> most_recent_tcp_error_;
+
   // Set to a SSLInfo when an attempt has failed with a certificate error. Used
   // to notify jobs.
   std::optional<SSLInfo> cert_error_ssl_info_;
diff --git a/net/http/http_stream_pool_attempt_manager_unittest.cc b/net/http/http_stream_pool_attempt_manager_unittest.cc
index 4380904e..e4e422c 100644
--- a/net/http/http_stream_pool_attempt_manager_unittest.cc
+++ b/net/http/http_stream_pool_attempt_manager_unittest.cc
@@ -2515,7 +2515,8 @@
   RunUntilIdle();
   EXPECT_THAT(requester1.result(),
               Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
-  EXPECT_THAT(requester2.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
+  EXPECT_THAT(requester2.result(),
+              Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
 }
 
 TEST_F(HttpStreamPoolAttemptManagerTest, SSLConfigChangedCloseIdleStream) {
@@ -6559,4 +6560,179 @@
   FastForwardUntilNoTasksRemain();
 }
 
+// Regression test for crbug.com/384965448
+// Ensure that QUIC attempts are canceled when network change happens.
+TEST_F(HttpStreamPoolAttemptManagerTest, NetworkChangeCancelJobs) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(net::features::kAsyncQuicSession);
+
+  resolver()
+      ->AddFakeRequest()
+      ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
+      .CompleteStartSynchronously(OK);
+
+  MockConnectCompleter quic_completer;
+  MockQuicData quic_data(quic_version());
+  quic_data.AddConnect(&quic_completer);
+  quic_data.AddSocketDataToFactory(socket_factory());
+
+  // Make the TCP attempt stalled forever.
+  SequencedSocketData data;
+  data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_IO_PENDING));
+  socket_factory()->AddSocketDataProvider(&data);
+
+  StreamRequester requester;
+  requester.set_destination(kDefaultDestination)
+      .set_quic_version(quic_version())
+      .RequestStream(pool());
+  ASSERT_FALSE(requester.result().has_value());
+
+  NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
+  FastForwardUntilNoTasksRemain();
+
+  quic_completer.Complete(OK);
+
+  requester.WaitForResult();
+  EXPECT_THAT(requester.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
+  AttemptManager* manager =
+      pool()
+          .GetOrCreateGroupForTesting(requester.GetStreamKey())
+          .GetAttemptManagerForTesting();
+  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
+              Optional(IsError(ERR_NETWORK_CHANGED)));
+}
+
+// Regression test for crbug.com/384965448
+// Ensure that QUIC attempts are canceled when service endpoint request provided
+// results partially and the failed.
+TEST_F(HttpStreamPoolAttemptManagerTest,
+       ServiceEndpointRequestFailedAfterUpdatedCalled) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(net::features::kAsyncQuicSession);
+
+  FakeServiceEndpointRequest* endpoint_request = resolver()->AddFakeRequest();
+
+  endpoint_request
+      ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
+      .set_crypto_ready(true);
+
+  MockConnectCompleter quic_completer;
+  MockQuicData quic_data(quic_version());
+  quic_data.AddConnect(&quic_completer);
+  quic_data.AddSocketDataToFactory(socket_factory());
+
+  // Make the TCP attempt stalled forever.
+  SequencedSocketData data;
+  data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_IO_PENDING));
+  socket_factory()->AddSocketDataProvider(&data);
+
+  StreamRequester requester;
+  requester.set_destination(kDefaultDestination)
+      .set_quic_version(quic_version())
+      .RequestStream(pool());
+  ASSERT_FALSE(requester.result().has_value());
+
+  // Notifies partial endpoint results. Triggers QuicTask to start.
+  endpoint_request->CallOnServiceEndpointsUpdated();
+
+  // Simulates endpoint resolution failure.
+  endpoint_request->CallOnServiceEndpointRequestFinished(ERR_NAME_NOT_RESOLVED);
+
+  quic_completer.Complete(OK);
+
+  requester.WaitForResult();
+  EXPECT_THAT(requester.result(), Optional(IsError(ERR_NAME_NOT_RESOLVED)));
+  AttemptManager* manager =
+      pool()
+          .GetOrCreateGroupForTesting(requester.GetStreamKey())
+          .GetAttemptManagerForTesting();
+  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
+              Optional(IsError(ERR_NAME_NOT_RESOLVED)));
+}
+
+// Regression test for crbug.com/384965448
+// Ensure that QUIC attempts are canceled when a client certificate is
+// required.
+TEST_F(HttpStreamPoolAttemptManagerTest, ClientAuthRequiredCancelQuic) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(net::features::kAsyncQuicSession);
+
+  resolver()
+      ->AddFakeRequest()
+      ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
+      .CompleteStartSynchronously(OK);
+
+  MockConnectCompleter quic_completer;
+  MockQuicData quic_data(quic_version());
+  quic_data.AddConnect(&quic_completer);
+  quic_data.AddSocketDataToFactory(socket_factory());
+
+  SequencedSocketData data;
+  socket_factory()->AddSocketDataProvider(&data);
+  SSLSocketDataProvider ssl(ASYNC, ERR_SSL_CLIENT_AUTH_CERT_NEEDED);
+  ssl.cert_request_info = base::MakeRefCounted<SSLCertRequestInfo>();
+  ssl.cert_request_info->host_and_port =
+      HostPortPair::FromString(kDefaultDestination);
+  socket_factory()->AddSSLSocketDataProvider(&ssl);
+
+  StreamRequester requester;
+  requester.set_destination(kDefaultDestination)
+      .set_quic_version(quic_version())
+      .RequestStream(pool());
+  ASSERT_FALSE(requester.result().has_value());
+
+  requester.WaitForResult();
+  EXPECT_THAT(requester.result(),
+              Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
+  quic_completer.Complete(OK);
+  AttemptManager* manager =
+      pool()
+          .GetOrCreateGroupForTesting(requester.GetStreamKey())
+          .GetAttemptManagerForTesting();
+  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
+              Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
+}
+
+// Regression test for crbug.com/384965448
+// Ensure that QUIC attempts are canceled when a certificate error happens.
+TEST_F(HttpStreamPoolAttemptManagerTest, CertificateErrorCancelQuic) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(net::features::kAsyncQuicSession);
+
+  resolver()
+      ->AddFakeRequest()
+      ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
+      .CompleteStartSynchronously(OK);
+
+  MockConnectCompleter quic_completer;
+  MockQuicData quic_data(quic_version());
+  quic_data.AddConnect(&quic_completer);
+  quic_data.AddSocketDataToFactory(socket_factory());
+
+  SequencedSocketData data;
+  socket_factory()->AddSocketDataProvider(&data);
+  SSLSocketDataProvider ssl(ASYNC, ERR_CERT_DATE_INVALID);
+  socket_factory()->AddSSLSocketDataProvider(&ssl);
+
+  StreamRequester requester;
+  requester.set_destination(kDefaultDestination)
+      .set_quic_version(quic_version())
+      .RequestStream(pool());
+  ASSERT_FALSE(requester.result().has_value());
+
+  requester.WaitForResult();
+  EXPECT_THAT(requester.result(), Optional(IsError(ERR_CERT_DATE_INVALID)));
+  quic_completer.Complete(OK);
+  AttemptManager* manager =
+      pool()
+          .GetOrCreateGroupForTesting(requester.GetStreamKey())
+          .GetAttemptManagerForTesting();
+  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
+              Optional(IsError(ERR_CERT_DATE_INVALID)));
+}
+
 }  // namespace net
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index b25fdbb..a7e795bd 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -2585,6 +2585,12 @@
 // QUIC with TLS gets 0-RTT rejected.
 EVENT_TYPE(QUIC_SESSION_ZERO_RTT_REJECTED)
 
+// Records the state of a QUIC 0-RTT handshake.
+//   {
+//     "state": <The state of 0-RTT handshake>
+//   }
+EVENT_TYPE(QUIC_SESSION_ZERO_RTT_STATE)
+
 // Records that the QUIC session received a default network change signal.
 //   {
 //     "new_default_network": <The new default network>
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index a8ea23b..1a94ac0 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -304,6 +304,17 @@
   kMaxValue = kNotAttempted,
 };
 
+std::string_view ZeroRttStateToString(ZeroRttState state) {
+  switch (state) {
+    case ZeroRttState::kAttemptedAndSucceeded:
+      return "AttemptedAndSucceeded";
+    case ZeroRttState::kAttemptedAndRejected:
+      return "AttemptedAndRejected";
+    case ZeroRttState::kNotAttempted:
+      return "NotAttempted";
+  }
+}
+
 void RecordHandshakeState(HandshakeState state) {
   UMA_HISTOGRAM_ENUMERATION("Net.QuicHandshakeState", state,
                             NUM_HANDSHAKE_STATES);
@@ -1761,6 +1772,10 @@
                               early_data_reason,
                               ssl_early_data_reason_max_value + 1);
   }
+
+  net_log_.AddEvent(NetLogEventType::QUIC_SESSION_ZERO_RTT_STATE, [&] {
+    return base::Value::Dict().Set("state", ZeroRttStateToString(state));
+  });
 }
 
 void QuicChromiumClientSession::OnCryptoHandshakeMessageSent(
diff --git a/net/socket/stream_socket_close_reason.cc b/net/socket/stream_socket_close_reason.cc
index abe5d5a7..29410ab 100644
--- a/net/socket/stream_socket_close_reason.cc
+++ b/net/socket/stream_socket_close_reason.cc
@@ -29,6 +29,8 @@
       return "UsingExistingSpdySession";
     case StreamSocketCloseReason::kUsingExistingQuicSession:
       return "UsingExistingQuicSession";
+    case StreamSocketCloseReason::kAbort:
+      return "Abort";
   }
 }
 
diff --git a/net/socket/stream_socket_close_reason.h b/net/socket/stream_socket_close_reason.h
index eab8697..39ba86ac 100644
--- a/net/socket/stream_socket_close_reason.h
+++ b/net/socket/stream_socket_close_reason.h
@@ -24,7 +24,8 @@
   kQuicSessionCreated = 6,
   kUsingExistingSpdySession = 7,
   kUsingExistingQuicSession = 8,
-  kMaxValue = kUsingExistingQuicSession,
+  kAbort = 9,
+  kMaxValue = kAbort,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:StreamSocketCloseReason)
 
diff --git a/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc b/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc
index 8d7a7c8d..1023f69 100644
--- a/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc
+++ b/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc
@@ -75,7 +75,8 @@
   EXPECT_EQ(0u, actual_body.size());
 }
 
-class CertNetFetcherURLLoaderTest : public PlatformTest {
+class CertNetFetcherURLLoaderTest : public PlatformTest,
+                                    public net::WithTaskEnvironment {
  public:
   CertNetFetcherURLLoaderTest() {
     test_server_.AddDefaultHandlers(base::FilePath(kDocRoot));
@@ -215,7 +216,6 @@
   net::EmbeddedTestServer test_server_;
   std::unique_ptr<base::Thread> creation_thread_;
   std::unique_ptr<CertNetFetcherTestUtil> test_util_;
-
   bool use_hanging_url_loader_ = false;
 };
 
@@ -239,8 +239,7 @@
 };
 
 class CertNetFetcherURLLoaderTestWithSecureDnsInterceptor
-    : public CertNetFetcherURLLoaderTest,
-      public net::WithTaskEnvironment {
+    : public CertNetFetcherURLLoaderTest {
  public:
   CertNetFetcherURLLoaderTestWithSecureDnsInterceptor()
       : invoked_interceptor_(false) {}
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index cb1aca9..d6521657 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -1361,11 +1361,12 @@
       url_request_context_->http_transaction_factory()->GetSession();
   DCHECK(http_session);
 
-  http_session->http_auth_cache()->ClearEntriesAddedBetween(
-      start_time, end_time, BuildUrlFilter(std::move(filter)));
-  // TODO(mmenke): Use another error code for this, as ERR_ABORTED has somewhat
-  // magical handling with respect to navigations.
-  http_session->CloseAllConnections(net::ERR_ABORTED, "Clearing auth cache");
+  if (http_session->http_auth_cache()->ClearEntriesAddedBetween(
+          start_time, end_time, BuildUrlFilter(std::move(filter)))) {
+    // TODO(mmenke): Use another error code for this, as ERR_ABORTED has
+    // somewhat magical handling with respect to navigations.
+    http_session->CloseAllConnections(net::ERR_ABORTED, "Clearing auth cache");
+  }
 
   std::move(callback).Run();
 }
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index 3d4a47c..5bb0fc06 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -360,4 +360,8 @@
              "SRIMessageSignatureEnforcement",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kCreateURLLoaderPipeAsync,
+             "CreateURLLoaderPipeAsync",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace network::features
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 721eb36..f6ff490 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -152,6 +152,8 @@
 COMPONENT_EXPORT(NETWORK_CPP)
 BASE_DECLARE_FEATURE(kSRIMessageSignatureEnforcement);
 
+COMPONENT_EXPORT(NETWORK_CPP) BASE_DECLARE_FEATURE(kCreateURLLoaderPipeAsync);
+
 }  // namespace network::features
 
 #endif  // SERVICES_NETWORK_PUBLIC_CPP_FEATURES_H_
diff --git a/services/network/public/cpp/sri_message_signatures.cc b/services/network/public/cpp/sri_message_signatures.cc
index bb58185b..b1a21c2 100644
--- a/services/network/public/cpp/sri_message_signatures.cc
+++ b/services/network/public/cpp/sri_message_signatures.cc
@@ -43,11 +43,11 @@
 
 std::optional<mojom::SRIMessageSignatureComponentPtr> ParseComponent(
     const net::structured_headers::ParameterizedItem& component,
-    std::vector<mojom::SRIMessageSignatureError>& parsing_errors) {
+    std::vector<mojom::SRIMessageSignatureError>& errors) {
   // https://wicg.github.io/signature-based-sri/#profile
   if (!component.item.is_string()) {
-    parsing_errors.push_back(mojom::SRIMessageSignatureError::
-                                 kSignatureInputHeaderInvalidComponentType);
+    errors.push_back(mojom::SRIMessageSignatureError::
+                         kSignatureInputHeaderInvalidComponentType);
     return std::nullopt;
   }
 
@@ -56,7 +56,7 @@
     // The "identity-digest" component requires a single `sf` parameter with
     // a `true` boolean value.
     if (!ItemHasSingleBooleanParam(component, "sf")) {
-      parsing_errors.push_back(
+      errors.push_back(
           mojom::SRIMessageSignatureError::
               kSignatureInputHeaderInvalidHeaderComponentParameter);
       return std::nullopt;
@@ -69,7 +69,7 @@
     // Derived components require a single `req` parameter with a `true` boolean
     // value.
     if (!ItemHasSingleBooleanParam(component, "req")) {
-      parsing_errors.push_back(
+      errors.push_back(
           mojom::SRIMessageSignatureError::
               kSignatureInputHeaderInvalidDerivedComponentParameter);
       return std::nullopt;
@@ -79,8 +79,8 @@
     result->params.push_back(Parameters::kRequest);
     return result;
   } else {
-    parsing_errors.push_back(mojom::SRIMessageSignatureError::
-                                 kSignatureInputHeaderInvalidComponentName);
+    errors.push_back(mojom::SRIMessageSignatureError::
+                         kSignatureInputHeaderInvalidComponentName);
     return std::nullopt;
   }
 }
@@ -222,17 +222,17 @@
 bool ValidateHeaderPresence(
     const std::string& signature_header,
     const std::string& signature_input_header,
-    std::vector<mojom::SRIMessageSignatureError>& parsing_errors) {
+    std::vector<mojom::SRIMessageSignatureError>& errors) {
   if (signature_header.empty() && signature_input_header.empty()) {
     // Neither `Signature` nor `Signature-Input` is present, punt on validation
     // without any errors.
     return false;
   } else if (signature_header.empty() && !signature_input_header.empty()) {
-    parsing_errors.emplace_back(
+    errors.emplace_back(
         mojom::SRIMessageSignatureError::kMissingSignatureHeader);
     return false;
   } else if (signature_input_header.empty() && !signature_header.empty()) {
-    parsing_errors.emplace_back(
+    errors.emplace_back(
         mojom::SRIMessageSignatureError::kMissingSignatureInputHeader);
     return false;
   }
@@ -242,14 +242,14 @@
 bool ValidateDictionaryStructure(
     std::optional<net::structured_headers::Dictionary> signature_dictionary,
     std::optional<net::structured_headers::Dictionary> input_dictionary,
-    std::vector<mojom::SRIMessageSignatureError>& parsing_errors) {
+    std::vector<mojom::SRIMessageSignatureError>& errors) {
   if (!signature_dictionary) {
-    parsing_errors.emplace_back(
+    errors.emplace_back(
         mojom::SRIMessageSignatureError::kInvalidSignatureHeader);
     return false;
   }
   if (!input_dictionary) {
-    parsing_errors.emplace_back(
+    errors.emplace_back(
         mojom::SRIMessageSignatureError::kInvalidSignatureInputHeader);
     return false;
   }
@@ -258,24 +258,24 @@
 
 bool ValidateSignatureValue(
     const net::structured_headers::DictionaryMember& signature_entry,
-    std::vector<mojom::SRIMessageSignatureError>& parsing_errors) {
+    std::vector<mojom::SRIMessageSignatureError>& errors) {
   // The value must be an unparameterized byte-sequence:
   if (signature_entry.second.member.empty() ||
       signature_entry.second.member_is_inner_list ||
       !signature_entry.second.member[0].item.is_byte_sequence()) {
-    parsing_errors.emplace_back(mojom::SRIMessageSignatureError::
-                                    kSignatureHeaderValueIsNotByteSequence);
+    errors.emplace_back(mojom::SRIMessageSignatureError::
+                            kSignatureHeaderValueIsNotByteSequence);
     return false;
   } else if (signature_entry.second.params.size() != 0u) {
-    parsing_errors.emplace_back(
+    errors.emplace_back(
         mojom::SRIMessageSignatureError::kSignatureHeaderValueIsParameterized);
     return false;
   }
 
   std::string signature = signature_entry.second.member[0].item.GetString();
   if (signature.size() != kEd25519SigLength) {
-    parsing_errors.emplace_back(mojom::SRIMessageSignatureError::
-                                    kSignatureHeaderValueIsIncorrectLength);
+    errors.emplace_back(mojom::SRIMessageSignatureError::
+                            kSignatureHeaderValueIsIncorrectLength);
     return false;
   }
   return true;
@@ -292,7 +292,7 @@
   std::string signature_input_header =
       headers.GetNormalizedHeader("Signature-Input").value_or("");
   if (!ValidateHeaderPresence(signature_header, signature_input_header,
-                              parsed_headers->parsing_errors)) {
+                              parsed_headers->errors)) {
     return parsed_headers;
   }
 
@@ -303,7 +303,7 @@
   std::optional<net::structured_headers::Dictionary> input_dictionary =
       net::structured_headers::ParseDictionary(signature_input_header);
   if (!ValidateDictionaryStructure(signature_dictionary, input_dictionary,
-                                   parsed_headers->parsing_errors)) {
+                                   parsed_headers->errors)) {
     return parsed_headers;
   }
 
@@ -322,8 +322,7 @@
     auto message_signature = mojom::SRIMessageSignature::New();
     message_signature->label = signature_entry.first;
 
-    if (!ValidateSignatureValue(signature_entry,
-                                parsed_headers->parsing_errors)) {
+    if (!ValidateSignatureValue(signature_entry, parsed_headers->errors)) {
       continue;
     }
     std::string signature = signature_entry.second.member[0].item.GetString();
@@ -333,13 +332,13 @@
     // Grab the relevant `Signature-Input` entry, punting early if none exists
     // or if its value is not a non-empty parameterized inner-list.
     if (!input_dictionary->contains(signature_entry.first)) {
-      parsed_headers->parsing_errors.push_back(
+      parsed_headers->errors.push_back(
           mojom::SRIMessageSignatureError::kSignatureInputHeaderMissingLabel);
       continue;
     }
     auto input_entry = input_dictionary->at(signature_entry.first);
     if (!input_entry.member_is_inner_list) {
-      parsed_headers->parsing_errors.push_back(
+      parsed_headers->errors.push_back(
           mojom::SRIMessageSignatureError::
               kSignatureInputHeaderValueNotInnerList);
       continue;
@@ -350,7 +349,7 @@
       // entire header; if both valid and invalid signatures are delivered,
       // we'll retain the former while ignoring the latter).
       std::optional<mojom::SRIMessageSignatureComponentPtr> parsed_component =
-          ParseComponent(component, parsed_headers->parsing_errors);
+          ParseComponent(component, parsed_headers->errors);
       if (!parsed_component.has_value()) {
         message_signature.reset();
         break;
@@ -360,7 +359,7 @@
     }
 
     if (!message_signature || message_signature->components.empty()) {
-      parsed_headers->parsing_errors.push_back(
+      parsed_headers->errors.push_back(
           mojom::SRIMessageSignatureError::
               kSignatureInputHeaderValueMissingComponents);
       continue;
@@ -379,7 +378,7 @@
         std::string value = param.second.GetString();
         std::optional<std::vector<uint8_t>> decoded = base::Base64Decode(value);
         if (!decoded || decoded->size() != kEd25519KeyLength) {
-          parsed_headers->parsing_errors.push_back(
+          parsed_headers->errors.push_back(
               mojom::SRIMessageSignatureError::
                   kSignatureInputHeaderKeyIdLength);
           message_signature.reset();
@@ -397,7 +396,7 @@
         // invalidate the signature.
         //
         // https://www.iana.org/assignments/http-message-signature/http-message-signature.xhtml#signature-metadata-parameters
-        parsed_headers->parsing_errors.push_back(
+        parsed_headers->errors.push_back(
             mojom::SRIMessageSignatureError::
                 kSignatureInputHeaderInvalidParameter);
         message_signature.reset();
@@ -408,7 +407,7 @@
     if (message_signature) {
       // Check required fields, and punt the signature if any are missing.
       if (!message_signature->keyid || !message_signature->tag) {
-        parsed_headers->parsing_errors.push_back(
+        parsed_headers->errors.push_back(
             mojom::SRIMessageSignatureError::
                 kSignatureInputHeaderMissingRequiredParameters);
         continue;
@@ -535,21 +534,23 @@
 }
 
 bool ValidateSRIMessageSignaturesOverHeaders(
-    const std::vector<mojom::SRIMessageSignaturePtr>& message_signatures,
+    mojom::SRIMessageSignaturesPtr& message_signatures,
     const GURL& request_url,
     const net::HttpResponseHeaders& headers) {
   // If no signatures are present, validation automatically succeeds.
-  if (!message_signatures.size() || !request_url.is_valid()) {
+  if (!message_signatures->signatures.size() || !request_url.is_valid()) {
     return true;
   }
 
   // Loop through the signatures, validating each. Validation fails if any
   // given signature fails to validate.
-  for (const auto& message_signature : message_signatures) {
+  for (const auto& message_signature : message_signatures->signatures) {
     // Ensure the signature hasn't expired.
     if (message_signature->expires.has_value() &&
         message_signature->expires.value() <
             base::Time::Now().InMillisecondsSinceUnixEpoch() / 1000) {
+      message_signatures->errors.push_back(
+          mojom::SRIMessageSignatureError::kValidationFailedSignatureExpired);
       return false;
     }
 
@@ -566,6 +567,8 @@
         base::Base64Decode(encoded_key).value_or(std::vector<uint8_t>{});
     if (public_key.size() != kEd25519KeyLength ||
         message_signature->signature.size() != kEd25519SigLength) {
+      message_signatures->errors.push_back(
+          mojom::SRIMessageSignatureError::kValidationFailedInvalidLength);
       return false;
     }
 
@@ -574,6 +577,8 @@
             reinterpret_cast<const uint8_t*>(signature_base->data()),
             signature_base->size(), message_signature->signature.data(),
             public_key.data())) {
+      message_signatures->errors.push_back(
+          mojom::SRIMessageSignatureError::kValidationFailedSignatureMismatch);
       return false;
     }
   }
@@ -597,8 +602,8 @@
   }
   auto parsed_headers = ParseSRIMessageSignaturesFromHeaders(*response.headers);
   if (!parsed_headers->signatures.size() ||
-      ValidateSRIMessageSignaturesOverHeaders(parsed_headers->signatures,
-                                              request_url, *response.headers)) {
+      ValidateSRIMessageSignaturesOverHeaders(parsed_headers, request_url,
+                                              *response.headers)) {
     return std::nullopt;
   }
   return mojom::BlockedByResponseReason::kSRIMessageSignatureMismatch;
diff --git a/services/network/public/cpp/sri_message_signatures.h b/services/network/public/cpp/sri_message_signatures.h
index 21e26ac..0f11697 100644
--- a/services/network/public/cpp/sri_message_signatures.h
+++ b/services/network/public/cpp/sri_message_signatures.h
@@ -49,7 +49,7 @@
 // that work, returning `true` if validation succeeds.
 COMPONENT_EXPORT(NETWORK_CPP)
 bool ValidateSRIMessageSignaturesOverHeaders(
-    const std::vector<mojom::SRIMessageSignaturePtr>& signatures,
+    mojom::SRIMessageSignaturesPtr& signatures,
     const GURL& request_url,
     const net::HttpResponseHeaders& headers);
 
diff --git a/services/network/public/cpp/sri_message_signatures_unittest.cc b/services/network/public/cpp/sri_message_signatures_unittest.cc
index d221f511..c132666 100644
--- a/services/network/public/cpp/sri_message_signatures_unittest.cc
+++ b/services/network/public/cpp/sri_message_signatures_unittest.cc
@@ -151,7 +151,7 @@
   mojom::SRIMessageSignaturesPtr result =
       ParseSRIMessageSignaturesFromHeaders(*headers);
   EXPECT_EQ(0u, result->signatures.size());
-  EXPECT_EQ(0u, result->parsing_errors.size());
+  EXPECT_EQ(0u, result->errors.size());
 }
 
 TEST_F(SRIMessageSignatureParserTest, NoSignatureHeader) {
@@ -159,9 +159,9 @@
   mojom::SRIMessageSignaturesPtr result =
       ParseSRIMessageSignaturesFromHeaders(*headers);
   EXPECT_EQ(0u, result->signatures.size());
-  ASSERT_EQ(1u, result->parsing_errors.size());
+  ASSERT_EQ(1u, result->errors.size());
   EXPECT_EQ(mojom::SRIMessageSignatureError::kMissingSignatureHeader,
-            result->parsing_errors[0]);
+            result->errors[0]);
 }
 
 TEST_F(SRIMessageSignatureParserTest, NoSignatureInputHeader) {
@@ -169,9 +169,9 @@
   mojom::SRIMessageSignaturesPtr result =
       ParseSRIMessageSignaturesFromHeaders(*headers);
   EXPECT_EQ(0u, result->signatures.size());
-  ASSERT_EQ(1u, result->parsing_errors.size());
+  ASSERT_EQ(1u, result->errors.size());
   EXPECT_EQ(mojom::SRIMessageSignatureError::kMissingSignatureInputHeader,
-            result->parsing_errors[0]);
+            result->errors[0]);
 }
 
 TEST_F(SRIMessageSignatureParserTest, ValidHeaders) {
@@ -180,7 +180,7 @@
       ParseSRIMessageSignaturesFromHeaders(*headers);
 
   EXPECT_EQ(1u, result->signatures.size());
-  EXPECT_EQ(0u, result->parsing_errors.size());
+  EXPECT_EQ(0u, result->errors.size());
   ValidateBasicTestHeader(result->signatures[0]);
 }
 
@@ -203,10 +203,10 @@
     mojom::SRIMessageSignaturesPtr result =
         ParseSRIMessageSignaturesFromHeaders(*headers);
     EXPECT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(1u, result->parsing_errors.size());
+    EXPECT_EQ(1u, result->errors.size());
     EXPECT_EQ(
         mojom::SRIMessageSignatureError::kSignatureInputHeaderMissingLabel,
-        result->parsing_errors[0]);
+        result->errors[0]);
     ValidateBasicTestHeader(result->signatures[0]);
   }
 
@@ -217,7 +217,7 @@
         ParseSRIMessageSignaturesFromHeaders(*headers);
     EXPECT_EQ(1u, result->signatures.size());
     // TODO(crbug.com/381044049): We should probably have a parsing error here.
-    EXPECT_EQ(0u, result->parsing_errors.size());
+    EXPECT_EQ(0u, result->errors.size());
     ValidateBasicTestHeader(result->signatures[0]);
   }
 
@@ -227,10 +227,10 @@
     mojom::SRIMessageSignaturesPtr result =
         ParseSRIMessageSignaturesFromHeaders(*headers);
     EXPECT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(1u, result->parsing_errors.size());
+    EXPECT_EQ(1u, result->errors.size());
     EXPECT_EQ(
         mojom::SRIMessageSignatureError::kSignatureInputHeaderMissingLabel,
-        result->parsing_errors[0]);
+        result->errors[0]);
     ValidateBasicTestHeader(result->signatures[0]);
   }
 }
@@ -277,7 +277,7 @@
 
     // As these are all malformed, we expect parsing to return no headers.
     EXPECT_EQ(0u, result->signatures.size());
-    EXPECT_EQ(1u, result->parsing_errors.size());
+    EXPECT_EQ(1u, result->errors.size());
   }
 }
 
@@ -442,7 +442,7 @@
            kSignatureInputHeaderInvalidComponentName},
   };
 
-  for (const auto test : cases) {
+  for (const auto& test : cases) {
     SCOPED_TRACE(testing::Message() << "Header value: `" << test.value << "`");
 
     // Tack valid parameters onto the test string so that we're actually
@@ -455,8 +455,8 @@
 
     // As these are all malformed, we expect parsing to return no headers.
     EXPECT_EQ(0u, result->signatures.size());
-    ASSERT_GT(result->parsing_errors.size(), 0u);
-    EXPECT_THAT(result->parsing_errors, testing::Contains(test.error));
+    ASSERT_GT(result->errors.size(), 0u);
+    EXPECT_THAT(result->errors, testing::Contains(test.error));
   }
 }
 
@@ -593,7 +593,7 @@
         ParseSRIMessageSignaturesFromHeaders(*headers);
 
     ASSERT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(0u, result->parsing_errors.size());
+    EXPECT_EQ(0u, result->errors.size());
     ASSERT_EQ(test.expected_names.size(),
               result->signatures[0]->components.size());
     for (size_t i = 0; i < test.expected_names.size(); i++) {
@@ -626,7 +626,7 @@
         ParseSRIMessageSignaturesFromHeaders(*headers);
 
     ASSERT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(0u, result->parsing_errors.size());
+    EXPECT_EQ(0u, result->errors.size());
     ASSERT_TRUE(result->signatures[0]->created.has_value());
 
     int64_t expected_int;
@@ -658,7 +658,7 @@
         ParseSRIMessageSignaturesFromHeaders(*headers);
 
     ASSERT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(0u, result->parsing_errors.size());
+    EXPECT_EQ(0u, result->errors.size());
     ASSERT_TRUE(result->signatures[0]->expires.has_value());
 
     int64_t expected_int;
@@ -690,7 +690,7 @@
         ParseSRIMessageSignaturesFromHeaders(*headers);
 
     ASSERT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(0u, result->parsing_errors.size());
+    EXPECT_EQ(0u, result->errors.size());
     ASSERT_TRUE(result->signatures[0]->nonce.has_value());
     EXPECT_EQ(test, result->signatures[0]->nonce.value());
   }
@@ -714,7 +714,7 @@
     auto headers = GetHeaders(kValidSignatureHeader, header.str().c_str());
     auto result = ParseSRIMessageSignaturesFromHeaders(*headers);
     ASSERT_EQ(1u, result->signatures.size());
-    EXPECT_EQ(0u, result->parsing_errors.size());
+    EXPECT_EQ(0u, result->errors.size());
   } while (std::next_permutation(params.begin(), params.end()));
 }
 
@@ -754,7 +754,7 @@
   auto headers = ValidHeadersPlusInput(kValidSignatureInputHeader);
   auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
   ASSERT_EQ(1u, parsed->signatures.size());
-  EXPECT_EQ(0u, parsed->parsing_errors.size());
+  EXPECT_EQ(0u, parsed->errors.size());
 
   std::optional<std::string> result =
       ConstructSignatureBase(parsed->signatures[0], this->url(), *headers);
@@ -798,7 +798,7 @@
     auto headers = ValidHeadersPlusInput(test);
     auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
     ASSERT_EQ(1u, parsed->signatures.size());
-    EXPECT_EQ(0u, parsed->parsing_errors.size());
+    EXPECT_EQ(0u, parsed->errors.size());
 
     std::optional<std::string> result =
         ConstructSignatureBase(parsed->signatures[0], this->url(), *headers);
@@ -847,7 +847,7 @@
     auto headers = ValidHeadersPlusInput(input_header.c_str());
     auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
     ASSERT_EQ(1u, parsed->signatures.size());
-    EXPECT_EQ(0u, parsed->parsing_errors.size());
+    EXPECT_EQ(0u, parsed->errors.size());
 
     std::optional<std::string> result =
         ConstructSignatureBase(parsed->signatures[0], GURL(test.url), *headers);
@@ -904,7 +904,7 @@
     auto headers = ValidHeadersPlusInput(input_header.str().c_str());
     auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
     ASSERT_EQ(1u, parsed->signatures.size());
-    EXPECT_EQ(0u, parsed->parsing_errors.size());
+    EXPECT_EQ(0u, parsed->errors.size());
 
     std::optional<std::string> result =
         ConstructSignatureBase(parsed->signatures[0], this->url(), *headers);
@@ -937,7 +937,7 @@
     auto headers = ValidHeadersPlusInput(input_header.str().c_str());
     auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
     ASSERT_EQ(1u, parsed->signatures.size());
-    EXPECT_EQ(0u, parsed->parsing_errors.size());
+    EXPECT_EQ(0u, parsed->errors.size());
 
     std::optional<std::string> result =
         ConstructSignatureBase(parsed->signatures[0], this->url(), *headers);
@@ -995,20 +995,24 @@
 TEST_F(SRIMessageSignatureValidationTest, NoSignatures) {
   auto headers =
       net::HttpResponseHeaders::Builder(net::HttpVersion(1, 1), "200").Build();
-  std::vector<mojom::SRIMessageSignaturePtr> signatures;
+  auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
+  ASSERT_EQ(0u, parsed->signatures.size());
+  EXPECT_EQ(0u, parsed->errors.size());
 
-  EXPECT_TRUE(ValidateSRIMessageSignaturesOverHeaders(signatures, this->url(),
-                                                      *headers));
+  EXPECT_TRUE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  EXPECT_EQ(0u, parsed->errors.size());
 }
 
 TEST_F(SRIMessageSignatureValidationTest, ValidSignature) {
   auto headers = ValidHeaders();
   auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
   ASSERT_EQ(1u, parsed->signatures.size());
-  EXPECT_EQ(0u, parsed->parsing_errors.size());
+  EXPECT_EQ(0u, parsed->errors.size());
 
-  EXPECT_TRUE(ValidateSRIMessageSignaturesOverHeaders(parsed->signatures,
-                                                      this->url(), *headers));
+  EXPECT_TRUE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  EXPECT_EQ(0u, parsed->errors.size());
 }
 
 TEST_F(SRIMessageSignatureValidationTest, ValidPlusInvalidSignature) {
@@ -1027,10 +1031,13 @@
 
   auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
   ASSERT_EQ(2u, parsed->signatures.size());
-  EXPECT_EQ(0u, parsed->parsing_errors.size());
+  EXPECT_EQ(0u, parsed->errors.size());
 
-  EXPECT_FALSE(ValidateSRIMessageSignaturesOverHeaders(parsed->signatures,
-                                                       this->url(), *headers));
+  EXPECT_FALSE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  ASSERT_EQ(1u, parsed->errors.size());
+  EXPECT_EQ(mojom::SRIMessageSignatureError::kValidationFailedSignatureMismatch,
+            parsed->errors[0]);
 }
 
 TEST_F(SRIMessageSignatureValidationTest, MultipleValidSignatures) {
@@ -1044,10 +1051,11 @@
 
   auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
   ASSERT_EQ(2u, parsed->signatures.size());
-  EXPECT_EQ(0u, parsed->parsing_errors.size());
+  EXPECT_EQ(0u, parsed->errors.size());
 
-  EXPECT_TRUE(ValidateSRIMessageSignaturesOverHeaders(parsed->signatures,
-                                                      this->url(), *headers));
+  EXPECT_TRUE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  EXPECT_EQ(0u, parsed->errors.size());
 }
 
 TEST_F(SRIMessageSignatureValidationTest, ValidSignatureExpires) {
@@ -1055,22 +1063,28 @@
                          kValidExpiringSignatureInputHeader);
   auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
   ASSERT_EQ(1u, parsed->signatures.size());
-  EXPECT_EQ(0u, parsed->parsing_errors.size());
+  EXPECT_EQ(0u, parsed->errors.size());
 
   // Signature should validate at the moment before and of expiration.
   auto diff = kValidExpiringSignatureExpiresAt -
               base::Time::Now().InMillisecondsSinceUnixEpoch() / 1000 - 1;
   task_environment_.AdvanceClock(base::Seconds(diff));
-  EXPECT_TRUE(ValidateSRIMessageSignaturesOverHeaders(parsed->signatures,
-                                                      this->url(), *headers));
+  EXPECT_TRUE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  ASSERT_EQ(0u, parsed->errors.size());
+
   task_environment_.AdvanceClock(base::Seconds(1));
-  EXPECT_TRUE(ValidateSRIMessageSignaturesOverHeaders(parsed->signatures,
-                                                      this->url(), *headers));
+  EXPECT_TRUE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  ASSERT_EQ(0u, parsed->errors.size());
 
   // ...but not after expiration.
   task_environment_.AdvanceClock(base::Seconds(1));
-  EXPECT_FALSE(ValidateSRIMessageSignaturesOverHeaders(parsed->signatures,
-                                                       this->url(), *headers));
+  EXPECT_FALSE(
+      ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+  ASSERT_EQ(1u, parsed->errors.size());
+  EXPECT_EQ(mojom::SRIMessageSignatureError::kValidationFailedSignatureExpired,
+            parsed->errors[0]);
 }
 
 TEST_F(SRIMessageSignatureValidationTest, ValidSignatureDigestHeaderMismatch) {
@@ -1087,10 +1101,14 @@
         Headers(test, kValidSignatureHeader, kValidSignatureInputHeader);
     auto parsed = ParseSRIMessageSignaturesFromHeaders(*headers);
     ASSERT_EQ(1u, parsed->signatures.size());
-    EXPECT_EQ(0u, parsed->parsing_errors.size());
+    EXPECT_EQ(0u, parsed->errors.size());
 
-    EXPECT_FALSE(ValidateSRIMessageSignaturesOverHeaders(
-        parsed->signatures, this->url(), *headers));
+    EXPECT_FALSE(
+        ValidateSRIMessageSignaturesOverHeaders(parsed, this->url(), *headers));
+    EXPECT_EQ(1u, parsed->errors.size());
+    EXPECT_EQ(
+        mojom::SRIMessageSignatureError::kValidationFailedSignatureMismatch,
+        parsed->errors[0]);
   }
 }
 
diff --git a/services/network/public/mojom/sri_message_signature.mojom b/services/network/public/mojom/sri_message_signature.mojom
index 0be4db9..5f26cd0 100644
--- a/services/network/public/mojom/sri_message_signature.mojom
+++ b/services/network/public/mojom/sri_message_signature.mojom
@@ -85,6 +85,9 @@
   kSignatureInputHeaderKeyIdLength,
   kSignatureInputHeaderInvalidParameter,
   kSignatureInputHeaderMissingRequiredParameters,
+  kValidationFailedSignatureExpired,
+  kValidationFailedInvalidLength,
+  kValidationFailedSignatureMismatch,
 };
 
 // Contains the set of valid message signatures for a given response, along with
@@ -92,5 +95,5 @@
 // `Signature` headers.
 struct SRIMessageSignatures {
   array<SRIMessageSignature> signatures;
-  array<SRIMessageSignatureError> parsing_errors;
+  array<SRIMessageSignatureError> errors;
 };
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 21fe7223..96e189a 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -32,6 +32,7 @@
 #include "base/sequence_checker.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
+#include "base/task/bind_post_task.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/thread_pool.h"
@@ -565,6 +566,30 @@
   return new_observer;
 }
 
+int32_t PopulateOptions(int32_t initial_options,
+                        bool is_orb_enabled,
+                        bool has_devtools_request_id) {
+  int32_t options = initial_options;
+
+  if (options & mojom::kURLLoadOptionReadAndDiscardBody) {
+    CHECK(!(options & mojom::kURLLoadOptionSniffMimeType))
+        << "options ReadAndDiscardBody and SniffMimeType cannot be used "
+           "together";
+    if (is_orb_enabled) {
+      // TODO(ricea): Make ReadAndDiscardBody and ORB work together.
+      LOG(WARNING) << "Disabling ReadAndDiscardBody because ORB is enabled";
+      options &= ~mojom::kURLLoadOptionReadAndDiscardBody;
+    }
+  }
+
+  if (has_devtools_request_id) {
+    options |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
+               mojom::kURLLoadOptionSendSSLInfoForCertificateError;
+  }
+
+  return options;
+}
+
 }  // namespace
 
 URLLoader::MaybeSyncURLLoaderClient::MaybeSyncURLLoaderClient(
@@ -622,7 +647,6 @@
     : url_request_context_(context.GetUrlRequestContext()),
       network_context_client_(context.GetNetworkContextClient()),
       delete_callback_(std::move(delete_callback)),
-      options_(options),
       resource_type_(request.resource_type),
       is_load_timing_enabled_(request.enable_load_timing),
       factory_params_(context.GetFactoryParams()),
@@ -643,6 +667,9 @@
           base::SequencedTaskRunner::GetCurrentDefault()),
       per_factory_orb_state_(context.GetMutableOrbState()),
       devtools_request_id_(request.devtools_request_id),
+      options_(PopulateOptions(options,
+                               factory_params_->is_orb_enabled,
+                               !!devtools_request_id())),
       request_mode_(request.mode),
       request_credentials_mode_(request.credentials_mode),
       has_user_activation_(request.trusted_params &&
@@ -703,15 +730,30 @@
       provide_data_use_updates_(context.DataUseUpdatesEnabled()) {
   DCHECK(delete_callback_);
 
+  // crbug.com/387537990: Experiment with creating the mojo data pipe
+  // asynchronously to evaluate the impact of removing a small amount of work
+  // per-resource from the main network service sequence. This isn't meant to
+  // ship as-is, rather it'll allow us to understand the potential payoff of
+  // investing in URLLoader optimization.
+  create_data_pipe_async_ =
+      base::FeatureList::IsEnabled(features::kCreateURLLoaderPipeAsync);
+  if (create_data_pipe_async_ &&
+      !(options_ & mojom::kURLLoadOptionReadAndDiscardBody)) {
+    // If the data pipe is created asynchronously, post the task to do so here
+    // so it can start being created while other things are happening.
+    base::ThreadPool::PostTask(
+        FROM_HERE,
+        base::BindOnce(&URLLoader::PrepareDataPipe,
+                       base::BindPostTaskToCurrentDefault(
+                           base::BindOnce(&URLLoader::OnPrepareDataPipeSuccess,
+                                          weak_ptr_factory_.GetWeakPtr())),
+                       base::BindPostTaskToCurrentDefault(
+                           base::BindOnce(&URLLoader::OnPrepareDataPipeError,
+                                          weak_ptr_factory_.GetWeakPtr()))));
+  }
+
   if (options_ & mojom::kURLLoadOptionReadAndDiscardBody) {
-    CHECK(!(options_ & mojom::kURLLoadOptionSniffMimeType))
-        << "options ReadAndDiscardBody and SniffMimeType cannot be used "
-           "together";
-    if (factory_params_->is_orb_enabled) {
-      // TODO(ricea): Make ReadAndDiscardBody and ORB work together.
-      LOG(WARNING) << "Disabling ReadAndDiscardBody because ORB is enabled";
-      options_ &= ~mojom::kURLLoadOptionReadAndDiscardBody;
-    } else {
+    if (!factory_params_->is_orb_enabled) {
       discard_buffer_ =
           base::MakeRefCounted<net::IOBufferWithSize>(kDiscardBufferSize);
     }
@@ -733,10 +775,6 @@
     header_client_.set_disconnect_handler(
         base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
   }
-  if (devtools_request_id()) {
-    options_ |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
-                mojom::kURLLoadOptionSendSSLInfoForCertificateError;
-  }
   receiver_.set_disconnect_handler(
       base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
   url_request_ = url_request_context_->CreateRequest(
@@ -1294,12 +1332,88 @@
         base::BindOnce(&URLLoader::ResumeStart, base::Unretained(this)));
     resource_scheduler_request_handle_->WillStartRequest(&defer);
   }
+
   if (defer)
     url_request_->LogBlockedBy("ResourceScheduler");
   else
     url_request_->Start();
 }
 
+void URLLoader::PrepareDataPipe(
+    URLLoader::PrepareDataPipeSuccessCallback success_cb,
+    base::OnceClosure error_cb) {
+  MojoCreateDataPipeOptions options;
+  options.struct_size = sizeof(MojoCreateDataPipeOptions);
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
+  options.element_num_bytes = 1;
+  options.capacity_num_bytes = GetDataPipeDefaultAllocationSize(
+      DataPipeAllocationSize::kLargerSizeIfPossible);
+
+  mojo::ScopedDataPipeProducerHandle producer_handle;
+  mojo::ScopedDataPipeConsumerHandle consumer_handle;
+  MojoResult result =
+      mojo::CreateDataPipe(&options, producer_handle, consumer_handle);
+  if (result != MOJO_RESULT_OK) {
+    std::move(error_cb).Run();
+    return;
+  }
+
+  std::move(success_cb)
+      .Run(std::move(producer_handle), std::move(consumer_handle));
+}
+
+void URLLoader::OnPrepareDataPipeSuccess(
+    mojo::ScopedDataPipeProducerHandle producer_handle,
+    mojo::ScopedDataPipeConsumerHandle consumer_handle) {
+  if (was_continue_and_response_started_called_ || !create_data_pipe_async_) {
+    // `ContinueOnResponseStarted` was already called, or the pipe creation is
+    // synchronous and we're currently being called by
+    // `ContinueOnResponseStarted` so finish setting up the pipe and invoke
+    // `ContinueOnResponseStartedImmediately` right away.
+    SetupPipeHandlesAndWatchers(std::move(producer_handle),
+                                std::move(consumer_handle));
+    CHECK(response_body_stream_.is_valid());
+    CHECK(consumer_handle_.is_valid());
+    ContinueOnResponseStartedImmediately();
+  } else {
+    // Nothing is waiting on the pipe, but a lot of this code's preconditions
+    // encode the fact that the handles aren't setup until
+    // `ContinueOnResponseStarted` is called. Instead of setting up the pipe
+    // handles right away, store them as "pending" and let
+    // `ContinueOnResponseStarted` call setup.
+    pending_pipe_handles_ = std::make_pair<mojo::ScopedDataPipeProducerHandle,
+                                           mojo::ScopedDataPipeConsumerHandle>(
+        std::move(producer_handle), std::move(consumer_handle));
+  }
+}
+
+void URLLoader::OnPrepareDataPipeError() {
+  NotifyCompleted(net::ERR_INSUFFICIENT_RESOURCES);
+  // Don't do any more work here because `NotifyCompleted` deletes this
+  // URLLoader.
+}
+
+void URLLoader::SetupPipeHandlesAndWatchers(
+    mojo::ScopedDataPipeProducerHandle producer_handle,
+    mojo::ScopedDataPipeConsumerHandle consumer_handle) {
+  response_body_stream_ = std::move(producer_handle);
+  consumer_handle_ = std::move(consumer_handle);
+
+  CHECK(response_body_stream_.is_valid());
+  CHECK(consumer_handle_.is_valid());
+
+  peer_closed_handle_watcher_.Watch(
+      response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
+      base::BindRepeating(&URLLoader::OnResponseBodyStreamConsumerClosed,
+                          base::Unretained(this)));
+  peer_closed_handle_watcher_.ArmOrNotify();
+
+  writable_handle_watcher_.Watch(
+      response_body_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
+      base::BindRepeating(&URLLoader::OnResponseBodyStreamReady,
+                          base::Unretained(this)));
+}
+
 URLLoader::~URLLoader() {
   TRACE_EVENT(
       "loading", "URLLoader::~URLLoader",
@@ -2000,33 +2114,46 @@
     upload_progress_tracker_ = nullptr;
   }
 
-  if (!(options_ & mojom::kURLLoadOptionReadAndDiscardBody)) {
-    MojoCreateDataPipeOptions options;
-    options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
-    options.element_num_bytes = 1;
-    options.capacity_num_bytes = GetDataPipeDefaultAllocationSize(
-        DataPipeAllocationSize::kLargerSizeIfPossible);
-    MojoResult result =
-        mojo::CreateDataPipe(&options, response_body_stream_, consumer_handle_);
-    if (result != MOJO_RESULT_OK) {
-      NotifyCompleted(net::ERR_INSUFFICIENT_RESOURCES);
-      return;
-    }
-    CHECK(response_body_stream_.is_valid());
-    CHECK(consumer_handle_.is_valid());
-    peer_closed_handle_watcher_.Watch(
-        response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-        base::BindRepeating(&URLLoader::OnResponseBodyStreamConsumerClosed,
-                            base::Unretained(this)));
-    peer_closed_handle_watcher_.ArmOrNotify();
-
-    writable_handle_watcher_.Watch(
-        response_body_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
-        base::BindRepeating(&URLLoader::OnResponseBodyStreamReady,
-                            base::Unretained(this)));
+  if (options_ & mojom::kURLLoadOptionReadAndDiscardBody) {
+    // If the body is to be discarded, the pipe won't be used and it's correct
+    // to keep going without waiting for it.
+    ContinueOnResponseStartedImmediately();
+    return;
   }
 
+  if (create_data_pipe_async_) {
+    // If the body isn't discarded, the mojo pipe is required before continuing.
+    if (pending_pipe_handles_) {
+      // The pipe is already in a usable state, set up the pipe handles so it's
+      // safe to continue the work
+      SetupPipeHandlesAndWatchers(std::move(pending_pipe_handles_->first),
+                                  std::move(pending_pipe_handles_->second));
+      pending_pipe_handles_ = std::nullopt;
+      CHECK(response_body_stream_.is_valid());
+      CHECK(consumer_handle_.is_valid());
+      ContinueOnResponseStartedImmediately();
+    } else {
+      // The pipe isn't ready.
+      // Its creation was started from the constructor and
+      // OnPrepareDataPipeSuccess will
+      was_continue_and_response_started_called_ = true;
+    }
+  } else {
+    // If the data pipe is to be created synchronously, invoke `PrepareDataPipe`
+    // directly on this sequence. Either of `OnPrepareDataPipeSuccess` or
+    // `OnPrepareDataPipeError` will be invoked synchronously and
+    // URLLoader::OnPrepareDataPipeSuccess will set the pipe handles before
+    // calling `ContinueOnResponseStartedImmediately`
+    PrepareDataPipe(base::BindOnce(&URLLoader::OnPrepareDataPipeSuccess,
+                                   base::Unretained(this)),
+                    base::BindOnce(&URLLoader::OnPrepareDataPipeError,
+                                   base::Unretained(this)));
+    // If PrepareDataPipe fails, `this` is deleted by `OnPrepareDataPipeError`
+    // and is invalid here.
+  }
+}
+
+void URLLoader::ContinueOnResponseStartedImmediately() {
   // Enforce the Cross-Origin-Resource-Policy (CORP) header.
   const CrossOriginEmbedderPolicy kEmptyCoep;
   const CrossOriginEmbedderPolicy& cross_origin_embedder_policy =
diff --git a/services/network/url_loader.h b/services/network/url_loader.h
index bae7c68d..f07541a0 100644
--- a/services/network/url_loader.h
+++ b/services/network/url_loader.h
@@ -528,9 +528,35 @@
   // concluding the request's Trust Tokens, Attribution, and/or Shared Storage
   // operations.
   void ContinueOnResponseStarted();
+  // Invoked either by the pipe creation success callback, or by
+  // `ContinueOnResponseStarted` when no mojo pipe is needed (thus no need to
+  // use to wait on it).
+  void ContinueOnResponseStartedImmediately();
   void MaybeSendTrustTokenOperationResultToDevTools();
 
   void ScheduleStart();
+
+  using PrepareDataPipeSuccessCallback =
+      base::OnceCallback<void(mojo::ScopedDataPipeProducerHandle,
+                              mojo::ScopedDataPipeConsumerHandle)>;
+  // Prepares the mojo data pipe that will be used to send the body data to the
+  // URLLoaderClient. Can be invoked on any sequence.
+  static void PrepareDataPipe(PrepareDataPipeSuccessCallback success_cb,
+                              base::OnceClosure error_cb);
+  // Invoked by `PrepareDataPipe`. Should run on the sequence where `this`
+  // lives.
+  void OnPrepareDataPipeSuccess(
+      mojo::ScopedDataPipeProducerHandle producer_handle,
+      mojo::ScopedDataPipeConsumerHandle consumer_handle);
+  // Invoked by `PrepareDataPipe`. Should run on the sequence where `this`
+  // lives.
+  void OnPrepareDataPipeError();
+  // Sets up this object's pipe handles. Invoked from `OnPrepareDataPipeSuccess`
+  // or `ContinueOnResponseStarted`, whichever comes last.
+  void SetupPipeHandlesAndWatchers(
+      mojo::ScopedDataPipeProducerHandle producer_handle,
+      mojo::ScopedDataPipeConsumerHandle consumer_handle);
+
   void ReadMore();
   void DidRead(int num_bytes,
                bool completed_synchronously,
@@ -636,7 +662,6 @@
   const raw_ptr<mojom::NetworkContextClient> network_context_client_;
   DeleteCallback delete_callback_;
 
-  int32_t options_;
   const int resource_type_;
   const bool is_load_timing_enabled_;
   bool has_received_response_ = false;
@@ -712,6 +737,8 @@
   // renderer.
   const std::optional<std::string> devtools_request_id_;
 
+  const int32_t options_;
+
   bool should_pause_reading_body_ = false;
   // The response body stream is open, but transferring data is paused.
   bool paused_reading_body_ = false;
@@ -856,6 +883,23 @@
   // Keeps the result of IsSharedDictionaryReadAllowed(). Used only for metrics.
   bool shared_dictionary_allowed_check_passed_ = false;
 
+  // True if the async data pipe creation experiment is enabled.
+  bool create_data_pipe_async_ = false;
+
+  // Set to `true` once ContinueAndResponseStarted() is called. If
+  // OnPrepareDataPipeSuccess() finds that
+  // `was_continue_and_response_started_called_` is true it will call
+  // SetupPipeHandleAndWatchers() and ContinueOnResponseStartedImmediately().
+  bool was_continue_and_response_started_called_ = false;
+
+  // Stores the `consumer_handle` and the `produced_handle` if they become
+  // available while `was_continue_and_response_started_called_` is still
+  // false. If ContinueAndResponseStarted() finds that `pending_pipe_handles_`
+  // is set it will call SetupPipeHandlesAndWatches().
+  std::optional<std::pair<mojo::ScopedDataPipeProducerHandle,
+                          mojo::ScopedDataPipeConsumerHandle>>
+      pending_pipe_handles_;
+
   base::WeakPtrFactory<URLLoader> weak_ptr_factory_{this};
 };
 
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 691178149..0d93fdd 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -745,8 +745,6 @@
 
     net::QuicSimpleTestServer::Start();
     net::URLRequestFailedJob::AddUrlHandler();
-
-    scoped_feature_list_.InitAndEnableFeature(features::kAcceptCHFrame);
   }
   ~URLLoaderTest() override {
     net::URLRequestFilter::GetInstance()->ClearHandlers();
@@ -1198,8 +1196,6 @@
     OnServerReceivedRequest(request);
   }
 
-  base::test::ScopedFeatureList scoped_feature_list_;
-
   base::test::TaskEnvironment task_environment_;
   net::ScopedTestRoot scoped_test_root_;
   net::EmbeddedTestServer test_server_;
@@ -1240,6 +1236,18 @@
   raw_ptr<MockAcceptCHFrameObserver> accept_ch_frame_observer_ = nullptr;
 };
 
+class ParameterizedURLLoaderTest : public URLLoaderTest,
+                                   public ::testing::WithParamInterface<bool> {
+ public:
+  ParameterizedURLLoaderTest() {
+    scoped_feature_list_.InitWithFeatureState(
+        features::kCreateURLLoaderPipeAsync, GetParam());
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
 class URLLoaderMockSocketTest : public URLLoaderTest {
  public:
   URLLoaderMockSocketTest() = default;
@@ -1257,15 +1265,15 @@
 constexpr int URLLoaderTest::kProcessId;
 constexpr int URLLoaderTest::kRouteId;
 
-TEST_F(URLLoaderTest, Basic) {
+TEST_P(ParameterizedURLLoaderTest, Basic) {
   LoadAndCompareFile("simple_page.html");
 }
 
-TEST_F(URLLoaderTest, Empty) {
+TEST_P(ParameterizedURLLoaderTest, Empty) {
   LoadAndCompareFile("empty.html");
 }
 
-TEST_F(URLLoaderTest, BasicSSL) {
+TEST_P(ParameterizedURLLoaderTest, BasicSSL) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.ServeFilesFromSourceDirectory(
       base::FilePath(FILE_PATH_LITERAL("services/test/data")));
@@ -1281,7 +1289,7 @@
       ssl_info()->cert.get()));
 }
 
-TEST_F(URLLoaderTest, SSLSentOnlyWhenRequested) {
+TEST_P(ParameterizedURLLoaderTest, SSLSentOnlyWhenRequested) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.ServeFilesFromSourceDirectory(
       base::FilePath(FILE_PATH_LITERAL("services/test/data")));
@@ -1294,7 +1302,7 @@
 
 // This test verifies that when the request is same-origin and the origin is
 // potentially trustworthy, the request is not blocked.
-TEST_F(URLLoaderTest, PotentiallyTrustworthySameOriginIsOk) {
+TEST_P(ParameterizedURLLoaderTest, PotentiallyTrustworthySameOriginIsOk) {
   mojom::ClientSecurityStatePtr client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1310,14 +1318,14 @@
 
 // This test verifies that when the URLLoaderFactory's parameters are missing
 // a client security state, requests to local network resources are authorized.
-TEST_F(URLLoaderTest, MissingClientSecurityStateIsOk) {
+TEST_P(ParameterizedURLLoaderTest, MissingClientSecurityStateIsOk) {
   EXPECT_EQ(net::OK, LoadRequest(CreateCrossOriginResourceRequest()));
 }
 
 // This test verifies that when the request's `target_ip_address_space` matches
 // the resource's IP address space, then the request is allowed even if it
 // would otherwise be blocked by policy.
-TEST_F(URLLoaderTest, MatchingTargetIPAddressSpaceIsOk) {
+TEST_P(ParameterizedURLLoaderTest, MatchingTargetIPAddressSpaceIsOk) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   set_factory_client_security_state(std::move(client_security_state));
@@ -1331,7 +1339,8 @@
 // This test verifies that when the request's `target_ip_address_space` does not
 // match the resource's IP address space, and the policy is `kPreflightWarn`,
 // then the request is not blocked.
-TEST_F(URLLoaderTest, MismatchingTargetIPAddressSpaceWarnIsNotBlocked) {
+TEST_P(ParameterizedURLLoaderTest,
+       MismatchingTargetIPAddressSpaceWarnIsNotBlocked) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1347,7 +1356,7 @@
 // This test verifies that when the request's `target_ip_address_space` does not
 // match the resource's IP address space, and the policy is `kPreflightBlock`,
 // then the request is blocked.
-TEST_F(URLLoaderTest, MismatchingTargetIPAddressSpaceIsBlocked) {
+TEST_P(ParameterizedURLLoaderTest, MismatchingTargetIPAddressSpaceIsBlocked) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1369,7 +1378,7 @@
 // match the resource's IP address space, and the policy is `kPreflightBlock`,
 // then `URLLoader::OnConnected()` returns the right error code. This error code
 // causes any cache entry in use to be invalidated.
-TEST_F(URLLoaderTest, MismatchingTargetIPAddressSpaceErrorCode) {
+TEST_P(ParameterizedURLLoaderTest, MismatchingTargetIPAddressSpaceErrorCode) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1410,7 +1419,7 @@
 // twice with endpoints belonging to different IP address spaces, but the
 // private network request policy is `kPreflightWarn`, then the request is not
 // blocked.
-TEST_F(URLLoaderTest, InconsistentIPAddressSpaceWarnIsNotBlocked) {
+TEST_P(ParameterizedURLLoaderTest, InconsistentIPAddressSpaceWarnIsNotBlocked) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->is_web_secure_context = true;
@@ -1441,7 +1450,7 @@
 // twice with endpoints belonging to different IP address spaces, the request
 // fails. In that case `URLLoader::OnConnected()` returns the right error code,
 // which causes any cache entry in use to be invalidated.
-TEST_F(URLLoaderTest, InconsistentIPAddressSpaceIsBlocked) {
+TEST_P(ParameterizedURLLoaderTest, InconsistentIPAddressSpaceIsBlocked) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->is_web_secure_context = true;
@@ -1494,7 +1503,7 @@
 // the whole stack. OTOH, using an embedded test server prevents us from mocking
 // out the endpoint IP address.
 
-TEST_F(URLLoaderTest, SecureUnknownToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecureUnknownToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
@@ -1509,7 +1518,7 @@
                   mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecureUnknownToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecureUnknownToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
@@ -1522,7 +1531,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecureUnknownToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, SecureUnknownToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
@@ -1535,7 +1544,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecureUnknownToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecureUnknownToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
@@ -1554,7 +1563,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecureUnknownToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecureUnknownToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
@@ -1573,7 +1582,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecureUnknownToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureUnknownToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
   set_factory_client_security_state(std::move(client_security_state));
@@ -1587,7 +1596,7 @@
                   mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecureUnknownToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureUnknownToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
   client_security_state->private_network_request_policy =
@@ -1599,7 +1608,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureUnknownToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureUnknownToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
   client_security_state->private_network_request_policy =
@@ -1611,7 +1620,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureUnknownToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureUnknownToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
   client_security_state->private_network_request_policy =
@@ -1629,7 +1638,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecureUnknownToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureUnknownToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown;
   client_security_state->private_network_request_policy =
@@ -1647,7 +1656,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecurePublicToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecurePublicToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
@@ -1662,7 +1671,7 @@
                   mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecurePublicToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecurePublicToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
@@ -1675,7 +1684,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecurePublicToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, SecurePublicToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
@@ -1688,7 +1697,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecurePublicToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecurePublicToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
@@ -1707,7 +1716,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecurePublicToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecurePublicToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
@@ -1726,7 +1735,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecurePublicToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePublicToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   set_factory_client_security_state(std::move(client_security_state));
@@ -1740,7 +1749,7 @@
                   mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecurePublicToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePublicToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1752,7 +1761,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecurePublicToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePublicToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1764,7 +1773,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecurePublicToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePublicToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1782,7 +1791,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecurePublicToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePublicToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -1800,7 +1809,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecurePrivateToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecurePrivateToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
@@ -1815,7 +1824,7 @@
                   mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecurePrivateToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecurePrivateToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
@@ -1828,7 +1837,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecurePrivateToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, SecurePrivateToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
@@ -1841,7 +1850,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecurePrivateToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecurePrivateToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
@@ -1860,7 +1869,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecurePrivateToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecurePrivateToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
@@ -1879,7 +1888,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecurePrivateToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePrivateToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
   set_factory_client_security_state(std::move(client_security_state));
@@ -1893,7 +1902,7 @@
                   mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecurePrivateToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePrivateToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
   client_security_state->private_network_request_policy =
@@ -1905,7 +1914,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecurePrivateToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePrivateToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
   client_security_state->private_network_request_policy =
@@ -1917,7 +1926,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecurePrivateToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePrivateToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
   client_security_state->private_network_request_policy =
@@ -1935,7 +1944,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, NonSecurePrivateToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecurePrivateToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate;
   client_security_state->private_network_request_policy =
@@ -1953,7 +1962,7 @@
           mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kLocal)));
 }
 
-TEST_F(URLLoaderTest, SecureLocalToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecureLocalToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
@@ -1964,7 +1973,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecureLocalToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecureLocalToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
@@ -1977,7 +1986,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecureLocalToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, SecureLocalToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
@@ -1990,7 +1999,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecureLocalToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, SecureLocalToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
@@ -2003,7 +2012,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, SecureLocalToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, SecureLocalToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->is_web_secure_context = true;
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
@@ -2016,7 +2025,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureLocalToLocalBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureLocalToLocalBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
   set_factory_client_security_state(std::move(client_security_state));
@@ -2026,7 +2035,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureLocalToLocalWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureLocalToLocalWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
   client_security_state->private_network_request_policy =
@@ -2038,7 +2047,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureLocalToLocalAllow) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureLocalToLocalAllow) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
   client_security_state->private_network_request_policy =
@@ -2050,7 +2059,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureLocalToLocalPreflightBlock) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureLocalToLocalPreflightBlock) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
   client_security_state->private_network_request_policy =
@@ -2062,7 +2071,7 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, NonSecureLocalToLocalPreflightWarn) {
+TEST_P(ParameterizedURLLoaderTest, NonSecureLocalToLocalPreflightWarn) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
   client_security_state->private_network_request_policy =
@@ -2074,7 +2083,8 @@
   EXPECT_EQ(net::OK, LoadRequest(request));
 }
 
-TEST_F(URLLoaderTest, AddsNetLogEntryForPrivateNetworkAccessCheckSuccess) {
+TEST_P(ParameterizedURLLoaderTest,
+       AddsNetLogEntryForPrivateNetworkAccessCheckSuccess) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal;
   set_factory_client_security_state(std::move(client_security_state));
@@ -2101,7 +2111,8 @@
               Pointee(Eq("allowed-no-less-public")));
 }
 
-TEST_F(URLLoaderTest, AddsNetLogEntryForPrivateNetworkAccessCheckFailure) {
+TEST_P(ParameterizedURLLoaderTest,
+       AddsNetLogEntryForPrivateNetworkAccessCheckFailure) {
   auto client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -2130,7 +2141,8 @@
               Pointee(Eq("blocked-by-policy-preflight-block")));
 }
 
-TEST_F(URLLoaderTest, AddsNetLogEntryForPrivateNetworkAccessCheckSameOrigin) {
+TEST_P(ParameterizedURLLoaderTest,
+       AddsNetLogEntryForPrivateNetworkAccessCheckSameOrigin) {
   mojom::ClientSecurityStatePtr client_security_state = NewSecurityState();
   client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state->private_network_request_policy =
@@ -2462,7 +2474,7 @@
 
 // Tests that auth challenge info is present on the response when a request
 // receives an authentication challenge.
-TEST_F(URLLoaderTest, AuthChallengeInfo) {
+TEST_P(ParameterizedURLLoaderTest, AuthChallengeInfo) {
   GURL url = test_server()->GetURL("/auth-basic");
   EXPECT_EQ(net::OK, Load(url));
   ASSERT_TRUE(client()->response_head()->auth_challenge_info.has_value());
@@ -2479,14 +2491,14 @@
 
 // Tests that no auth challenge info is present on the response when a request
 // does not receive an authentication challenge.
-TEST_F(URLLoaderTest, NoAuthChallengeInfo) {
+TEST_P(ParameterizedURLLoaderTest, NoAuthChallengeInfo) {
   GURL url = test_server()->GetURL("/");
   EXPECT_EQ(net::OK, Load(url));
   EXPECT_FALSE(client()->response_head()->auth_challenge_info.has_value());
 }
 
 // Test decoded_body_length / encoded_body_length when they're different.
-TEST_F(URLLoaderTest, GzipTest) {
+TEST_P(ParameterizedURLLoaderTest, GzipTest) {
   std::string body;
   EXPECT_EQ(net::OK, Load(test_server()->GetURL("/gzip-body?Body"), &body));
   EXPECT_EQ("Body", body);
@@ -2499,13 +2511,13 @@
             client()->completion_status().encoded_data_length);
 }
 
-TEST_F(URLLoaderTest, ErrorBeforeHeaders) {
+TEST_P(ParameterizedURLLoaderTest, ErrorBeforeHeaders) {
   EXPECT_EQ(net::ERR_EMPTY_RESPONSE,
             Load(test_server()->GetURL("/close-socket"), nullptr));
   EXPECT_FALSE(client()->response_body().is_valid());
 }
 
-TEST_F(URLLoaderTest, SyncErrorWhileReadingBody) {
+TEST_P(ParameterizedURLLoaderTest, SyncErrorWhileReadingBody) {
   std::string body;
   EXPECT_EQ(net::ERR_FAILED,
             Load(net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase(
@@ -2514,7 +2526,7 @@
   EXPECT_EQ("", body);
 }
 
-TEST_F(URLLoaderTest, AsyncErrorWhileReadingBody) {
+TEST_P(ParameterizedURLLoaderTest, AsyncErrorWhileReadingBody) {
   std::string body;
   EXPECT_EQ(net::ERR_FAILED,
             Load(net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase(
@@ -2523,7 +2535,8 @@
   EXPECT_EQ("", body);
 }
 
-TEST_F(URLLoaderTest, SyncErrorWhileReadingBodyAfterBytesReceived) {
+TEST_P(ParameterizedURLLoaderTest,
+       SyncErrorWhileReadingBodyAfterBytesReceived) {
   const std::string kBody("Foo.");
 
   std::list<std::string> packets;
@@ -2536,7 +2549,8 @@
   EXPECT_EQ(kBody, body);
 }
 
-TEST_F(URLLoaderTest, AsyncErrorWhileReadingBodyAfterBytesReceived) {
+TEST_P(ParameterizedURLLoaderTest,
+       AsyncErrorWhileReadingBodyAfterBytesReceived) {
   const std::string kBody("Foo.");
 
   std::list<std::string> packets;
@@ -2549,14 +2563,14 @@
   EXPECT_EQ(kBody, body);
 }
 
-TEST_F(URLLoaderTest, DoNotSniffUnlessSpecified) {
+TEST_P(ParameterizedURLLoaderTest, DoNotSniffUnlessSpecified) {
   EXPECT_EQ(net::OK,
             Load(test_server()->GetURL("/content-sniffer-test0.html")));
   EXPECT_FALSE(did_mime_sniff());
   ASSERT_TRUE(mime_type().empty());
 }
 
-TEST_F(URLLoaderTest, SniffMimeType) {
+TEST_P(ParameterizedURLLoaderTest, SniffMimeType) {
   set_sniff();
   EXPECT_EQ(net::OK,
             Load(test_server()->GetURL("/content-sniffer-test0.html")));
@@ -2564,14 +2578,14 @@
   ASSERT_EQ(std::string("text/html"), mime_type());
 }
 
-TEST_F(URLLoaderTest, RespectNoSniff) {
+TEST_P(ParameterizedURLLoaderTest, RespectNoSniff) {
   set_sniff();
   EXPECT_EQ(net::OK, Load(test_server()->GetURL("/nosniff-test.html")));
   EXPECT_FALSE(did_mime_sniff());
   ASSERT_EQ(std::string("text/plain"), mime_type());
 }
 
-TEST_F(URLLoaderTest, SniffTextPlainDoesNotResultInHTML) {
+TEST_P(ParameterizedURLLoaderTest, SniffTextPlainDoesNotResultInHTML) {
   set_sniff();
   EXPECT_EQ(net::OK,
             Load(test_server()->GetURL("/content-sniffer-test1.html")));
@@ -2579,7 +2593,7 @@
   ASSERT_EQ(std::string("text/plain"), mime_type());
 }
 
-TEST_F(URLLoaderTest, DoNotSniffHTMLFromImageGIF) {
+TEST_P(ParameterizedURLLoaderTest, DoNotSniffHTMLFromImageGIF) {
   set_sniff();
   EXPECT_EQ(net::OK,
             Load(test_server()->GetURL("/content-sniffer-test2.html")));
@@ -2587,7 +2601,7 @@
   ASSERT_EQ(std::string("image/gif"), mime_type());
 }
 
-TEST_F(URLLoaderTest, EmptyHtmlIsTextPlain) {
+TEST_P(ParameterizedURLLoaderTest, EmptyHtmlIsTextPlain) {
   set_sniff();
   EXPECT_EQ(net::OK,
             Load(test_server()->GetURL("/content-sniffer-test4.html")));
@@ -2595,7 +2609,7 @@
   ASSERT_EQ(std::string("text/plain"), mime_type());
 }
 
-TEST_F(URLLoaderTest, EmptyHtmlIsTextPlainWithAsyncResponse) {
+TEST_P(ParameterizedURLLoaderTest, EmptyHtmlIsTextPlainWithAsyncResponse) {
   set_sniff();
 
   const std::string kBody;
@@ -2614,7 +2628,7 @@
 // Tests the case where the first read doesn't have enough data to figure out
 // the right mime type. The second read would have enough data even though the
 // total bytes is still smaller than net::kMaxBytesToSniff.
-TEST_F(URLLoaderTest, FirstReadNotEnoughToSniff1) {
+TEST_P(ParameterizedURLLoaderTest, FirstReadNotEnoughToSniff1) {
   set_sniff();
   std::string first(500, 'a');
   std::string second(std::string(100, 'b'));
@@ -2627,7 +2641,7 @@
 }
 
 // Like above, except that the total byte count is > kMaxBytesToSniff.
-TEST_F(URLLoaderTest, FirstReadNotEnoughToSniff2) {
+TEST_P(ParameterizedURLLoaderTest, FirstReadNotEnoughToSniff2) {
   set_sniff();
   std::string first(500, 'a');
   std::string second(std::string(1000, 'b'));
@@ -2641,7 +2655,7 @@
 
 // Tests that even if the first and only read is smaller than the minimum number
 // of bytes needed to sniff, the loader works correctly and returns the data.
-TEST_F(URLLoaderTest, LoneReadNotEnoughToSniff) {
+TEST_P(ParameterizedURLLoaderTest, LoneReadNotEnoughToSniff) {
   set_sniff();
   std::string first(net::kMaxBytesToSniff - 100, 'a');
   LoadPacketsAndVerifyContents(first, std::string());
@@ -2650,7 +2664,7 @@
 }
 
 // Tests the simple case where the first read is enough to sniff.
-TEST_F(URLLoaderTest, FirstReadIsEnoughToSniff) {
+TEST_P(ParameterizedURLLoaderTest, FirstReadIsEnoughToSniff) {
   set_sniff();
   std::string first(net::kMaxBytesToSniff + 100, 'a');
   LoadPacketsAndVerifyContents(first, std::string());
@@ -2679,7 +2693,7 @@
 };
 
 // Check that the URLLoader tears itself down when the URLLoader pipe is closed.
-TEST_F(URLLoaderTest, DestroyOnURLLoaderPipeClosed) {
+TEST_P(ParameterizedURLLoaderTest, DestroyOnURLLoaderPipeClosed) {
   net::EmbeddedTestServer server;
   server.RegisterRequestHandler(
       base::BindRepeating([](const net::test_server::HttpRequest& request) {
@@ -2727,7 +2741,7 @@
 // depending on whether the closed pipe is first noticed when trying to write to
 // it, or when a mojo close notification is received, so if only one path
 // breaks, this test may flakily fail.
-TEST_F(URLLoaderTest, CloseResponseBodyConsumerBeforeProducer) {
+TEST_P(ParameterizedURLLoaderTest, CloseResponseBodyConsumerBeforeProducer) {
   net::EmbeddedTestServer server;
   server.RegisterRequestHandler(
       base::BindRepeating([](const net::test_server::HttpRequest& request) {
@@ -2773,7 +2787,8 @@
   EXPECT_EQ(net::ERR_FAILED, client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, PauseReadingBodyFromNetBeforeResponseHeaders) {
+TEST_P(ParameterizedURLLoaderTest,
+       PauseReadingBodyFromNetBeforeResponseHeaders) {
   const char* const kPath = "/hello.html";
   const char* const kBodyContents = "This is the data as you requested.";
 
@@ -2834,7 +2849,7 @@
   client()->Unbind();
 }
 
-TEST_F(URLLoaderTest, PauseReadingBodyFromNetWhenReadIsPending) {
+TEST_P(ParameterizedURLLoaderTest, PauseReadingBodyFromNetWhenReadIsPending) {
   const char* const kPath = "/hello.html";
   const char* const kBodyContentsFirstHalf = "This is the first half.";
   const char* const kBodyContentsSecondHalf = "This is the second half.";
@@ -2887,7 +2902,8 @@
   client()->Unbind();
 }
 
-TEST_F(URLLoaderTest, ResumeReadingBodyFromNetAfterClosingConsumer) {
+TEST_P(ParameterizedURLLoaderTest,
+       ResumeReadingBodyFromNetAfterClosingConsumer) {
   const char* const kPath = "/hello.html";
   const char* const kBodyContentsFirstHalf = "This is the first half.";
 
@@ -2933,7 +2949,7 @@
   delete_run_loop.Run();
 }
 
-TEST_F(URLLoaderTest, MultiplePauseResumeReadingBodyFromNet) {
+TEST_P(ParameterizedURLLoaderTest, MultiplePauseResumeReadingBodyFromNet) {
   const char* const kPath = "/hello.html";
   const char* const kBodyContentsFirstHalf = "This is the first half.";
   const char* const kBodyContentsSecondHalf = "This is the second half.";
@@ -2993,7 +3009,7 @@
   client()->Unbind();
 }
 
-TEST_F(URLLoaderTest, UploadBytes) {
+TEST_P(ParameterizedURLLoaderTest, UploadBytes) {
   const std::string kRequestBody = "Request Body";
 
   scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody());
@@ -3005,7 +3021,7 @@
   EXPECT_EQ(kRequestBody, response_body);
 }
 
-TEST_F(URLLoaderTest, UploadFile) {
+TEST_P(ParameterizedURLLoaderTest, UploadFile) {
   allow_file_uploads();
   base::FilePath file_path = GetTestFilePath("simple_page.html");
 
@@ -3023,7 +3039,7 @@
   EXPECT_EQ(expected_body, response_body);
 }
 
-TEST_F(URLLoaderTest, UploadFileWithRange) {
+TEST_P(ParameterizedURLLoaderTest, UploadFileWithRange) {
   allow_file_uploads();
   base::FilePath file_path = GetTestFilePath("simple_page.html");
 
@@ -3042,7 +3058,7 @@
   EXPECT_EQ(expected_body, response_body);
 }
 
-TEST_F(URLLoaderTest, UploadTwoFiles) {
+TEST_P(ParameterizedURLLoaderTest, UploadTwoFiles) {
   allow_file_uploads();
   base::FilePath file_path1 = GetTestFilePath("simple_page.html");
   base::FilePath file_path2 = GetTestFilePath("hello.html");
@@ -3066,7 +3082,7 @@
   EXPECT_EQ(expected_body1 + expected_body2, response_body);
 }
 
-TEST_F(URLLoaderTest, UploadTwoBatchesOfFiles) {
+TEST_P(ParameterizedURLLoaderTest, UploadTwoBatchesOfFiles) {
   allow_file_uploads();
   base::FilePath file_path = GetTestFilePath("simple_page.html");
 
@@ -3091,7 +3107,8 @@
   EXPECT_EQ(expected_body, response_body);
 }
 
-TEST_F(URLLoaderTest, UploadTwoBatchesOfFilesWithRespondInvalidFile) {
+TEST_P(ParameterizedURLLoaderTest,
+       UploadTwoBatchesOfFilesWithRespondInvalidFile) {
   allow_file_uploads();
   set_upload_files_invalid(true);
   base::FilePath file_path = GetTestFilePath("simple_page.html");
@@ -3107,7 +3124,8 @@
   EXPECT_EQ(net::ERR_ACCESS_DENIED, Load(test_server()->GetURL("/echo")));
 }
 
-TEST_F(URLLoaderTest, UploadTwoBatchesOfFilesWithRespondDifferentNumOfFiles) {
+TEST_P(ParameterizedURLLoaderTest,
+       UploadTwoBatchesOfFilesWithRespondDifferentNumOfFiles) {
   allow_file_uploads();
   set_ignore_last_upload_file(true);
   base::FilePath file_path = GetTestFilePath("simple_page.html");
@@ -3123,7 +3141,7 @@
   EXPECT_EQ(net::ERR_FAILED, Load(test_server()->GetURL("/echo")));
 }
 
-TEST_F(URLLoaderTest, UploadInvalidFile) {
+TEST_P(ParameterizedURLLoaderTest, UploadInvalidFile) {
   allow_file_uploads();
   set_upload_files_invalid(true);
   base::FilePath file_path = GetTestFilePath("simple_page.html");
@@ -3136,7 +3154,7 @@
   EXPECT_EQ(net::ERR_ACCESS_DENIED, Load(test_server()->GetURL("/echo")));
 }
 
-TEST_F(URLLoaderTest, UploadFileWithoutNetworkServiceClient) {
+TEST_P(ParameterizedURLLoaderTest, UploadFileWithoutNetworkServiceClient) {
   // Don't call allow_file_uploads();
   base::FilePath file_path = GetTestFilePath("simple_page.html");
 
@@ -3175,7 +3193,7 @@
   OnFileUploadRequestedCallback file_upload_requested_callback_;
 };
 
-TEST_F(URLLoaderTest, UploadFileCanceled) {
+TEST_P(ParameterizedURLLoaderTest, UploadFileCanceled) {
   base::FilePath file_path = GetTestFilePath("simple_page.html");
   std::vector<base::File> opened_file;
   opened_file.emplace_back(file_path, base::File::FLAG_OPEN |
@@ -3212,7 +3230,7 @@
 }
 
 // Tests a request body with a data pipe element.
-TEST_F(URLLoaderTest, UploadDataPipe) {
+TEST_P(ParameterizedURLLoaderTest, UploadDataPipe) {
   const std::string kRequestBody = "Request Body";
 
   mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter_remote;
@@ -3229,7 +3247,7 @@
 }
 
 // Same as above and tests that the body is sent after a 307 redirect.
-TEST_F(URLLoaderTest, UploadDataPipe_Redirect307) {
+TEST_P(ParameterizedURLLoaderTest, UploadDataPipe_Redirect307) {
   const std::string kRequestBody = "Request Body";
 
   mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter_remote;
@@ -3249,7 +3267,7 @@
 
 // Tests a large request body, which should result in multiple asynchronous
 // reads.
-TEST_F(URLLoaderTest, UploadDataPipeWithLotsOfData) {
+TEST_P(ParameterizedURLLoaderTest, UploadDataPipeWithLotsOfData) {
   std::string request_body;
   request_body.reserve(5 * 1024 * 1024);
   // Using a repeating patter with a length that's prime is more likely to spot
@@ -3271,7 +3289,7 @@
   EXPECT_EQ(request_body, response_body);
 }
 
-TEST_F(URLLoaderTest, UploadDataPipeError) {
+TEST_P(ParameterizedURLLoaderTest, UploadDataPipeError) {
   const std::string kRequestBody = "Request Body";
 
   mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter_remote;
@@ -3286,7 +3304,7 @@
   EXPECT_EQ(net::ERR_ACCESS_DENIED, Load(test_server()->GetURL("/echo")));
 }
 
-TEST_F(URLLoaderTest, UploadDataPipeClosedEarly) {
+TEST_P(ParameterizedURLLoaderTest, UploadDataPipeClosedEarly) {
   const std::string kRequestBody = "Request Body";
 
   mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter_remote;
@@ -3303,7 +3321,7 @@
 }
 
 // Tests a request body with a chunked data pipe element.
-TEST_F(URLLoaderTest, UploadChunkedDataPipe) {
+TEST_P(ParameterizedURLLoaderTest, UploadChunkedDataPipe) {
   const std::string kRequestBody = "Request Body";
 
   TestChunkedDataPipeGetter data_pipe_getter;
@@ -3337,7 +3355,7 @@
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, UploadChunkedDataPipeOverHTTP2) {
+TEST_P(ParameterizedURLLoaderTest, UploadChunkedDataPipeOverHTTP2) {
   const std::string kRequestBody = "Request Body";
 
   TestChunkedDataPipeGetter data_pipe_getter;
@@ -3370,7 +3388,7 @@
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, UploadChunkedDataPipeNotAllowHTTP1) {
+TEST_P(ParameterizedURLLoaderTest, UploadChunkedDataPipeNotAllowHTTP1) {
   const std::string kRequestBody = "Request Body";
 
   TestChunkedDataPipeGetter data_pipe_getter;
@@ -3385,7 +3403,7 @@
 }
 
 // Tests a request body with ReadOnceStream.
-TEST_F(URLLoaderTest, UploadChunkedDataPipeReadOnceStream) {
+TEST_P(ParameterizedURLLoaderTest, UploadChunkedDataPipeReadOnceStream) {
   const std::string kRequestBody = "Request Body";
 
   TestChunkedDataPipeGetter data_pipe_getter;
@@ -3421,7 +3439,7 @@
 
 // Tests that SSLInfo is not attached to OnComplete messages or the
 // URLResponseHead when there is no certificate error.
-TEST_F(URLLoaderTest, NoSSLInfoWithoutCertificateError) {
+TEST_P(ParameterizedURLLoaderTest, NoSSLInfoWithoutCertificateError) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   ASSERT_TRUE(https_server.Start());
   set_send_ssl_for_cert_error();
@@ -3432,7 +3450,7 @@
 
 // Tests that SSLInfo is not attached to OnComplete messages when the
 // corresponding option is not set.
-TEST_F(URLLoaderTest, NoSSLInfoOnComplete) {
+TEST_P(ParameterizedURLLoaderTest, NoSSLInfoOnComplete) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
   ASSERT_TRUE(https_server.Start());
@@ -3442,7 +3460,7 @@
 
 // Tests that SSLInfo is attached to OnComplete messages when the corresponding
 // option is set and the certificate error causes the load to fail.
-TEST_F(URLLoaderTest, SSLInfoOnComplete) {
+TEST_P(ParameterizedURLLoaderTest, SSLInfoOnComplete) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
   ASSERT_TRUE(https_server.Start());
@@ -3457,7 +3475,7 @@
 // Tests that SSLInfo is attached to OnComplete messages and the URLResponseHead
 // when the corresponding option is set and the certificate error doesn't cause
 // the load to fail.
-TEST_F(URLLoaderTest, SSLInfoOnResponseWithCertificateError) {
+TEST_P(ParameterizedURLLoaderTest, SSLInfoOnResponseWithCertificateError) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
   ASSERT_TRUE(https_server.Start());
@@ -3477,7 +3495,7 @@
 // Tests that SSLInfo is attached to the URLResponseHead on redirects when the
 // corresponding option is set and the certificate error doesn't cause the load
 // to fail.
-TEST_F(URLLoaderTest, SSLInfoOnRedirectWithCertificateError) {
+TEST_P(ParameterizedURLLoaderTest, SSLInfoOnRedirectWithCertificateError) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
   https_server.AddDefaultHandlers(
@@ -3515,7 +3533,7 @@
 }
 
 // Make sure the client can modify headers during a redirect.
-TEST_F(URLLoaderTest, RedirectModifiedHeaders) {
+TEST_P(ParameterizedURLLoaderTest, RedirectModifiedHeaders) {
   ResourceRequest request = CreateResourceRequest(
       "GET", test_server()->GetURL("/redirect307-to-echo"));
   request.headers.SetHeader("Header1", "Value1");
@@ -3554,7 +3572,7 @@
   EXPECT_EQ("Value3", request_headers2.find("Header3")->second);
 }
 
-TEST_F(URLLoaderTest, RedirectFailsOnModifyUnsafeHeader) {
+TEST_P(ParameterizedURLLoaderTest, RedirectFailsOnModifyUnsafeHeader) {
   const char* kUnsafeHeaders[] = {
       net::HttpRequestHeaders::kContentLength,
       net::HttpRequestHeaders::kHost,
@@ -3592,7 +3610,7 @@
 }
 
 // Test the client can remove headers during a redirect.
-TEST_F(URLLoaderTest, RedirectRemoveHeader) {
+TEST_P(ParameterizedURLLoaderTest, RedirectRemoveHeader) {
   ResourceRequest request = CreateResourceRequest(
       "GET", test_server()->GetURL("/redirect307-to-echo"));
   request.headers.SetHeader("Header1", "Value1");
@@ -3628,7 +3646,7 @@
 }
 
 // Test the client can remove headers and add headers back during a redirect.
-TEST_F(URLLoaderTest, RedirectRemoveHeaderAndAddItBack) {
+TEST_P(ParameterizedURLLoaderTest, RedirectRemoveHeaderAndAddItBack) {
   ResourceRequest request = CreateResourceRequest(
       "GET", test_server()->GetURL("/redirect307-to-echo"));
   request.headers.SetHeader("Header1", "Value1");
@@ -3668,7 +3686,7 @@
 // Validate Sec- prefixed headers are handled properly when redirecting from
 // insecure => secure urls. The Sec-Fetch-Site header should be re-added on the
 // secure url.
-TEST_F(URLLoaderTest, UpgradeAddsSecHeaders) {
+TEST_P(ParameterizedURLLoaderTest, UpgradeAddsSecHeaders) {
   // Set up a redirect to signal we will go from insecure => secure.
   GURL url = test_server()->GetURL(
       kInsecureHost,
@@ -3706,7 +3724,7 @@
 // Validate Sec- prefixed headers are properly handled when redirecting from
 // secure => insecure urls. All Sec-CH- and Sec-Fetch- prefixed
 // headers should be removed.
-TEST_F(URLLoaderTest, DowngradeRemovesSecHeaders) {
+TEST_P(ParameterizedURLLoaderTest, DowngradeRemovesSecHeaders) {
   // Set up a redirect to signal we will go from secure => insecure.
   GURL url = test_server()->GetURL(
       "/server-redirect?" +
@@ -3757,7 +3775,7 @@
 // Validate Sec- prefixed headers are properly handled when redirecting from
 // secure => insecure => secure urls.The headers on insecure
 // urls should be removed and Sec-Fetch-Site should be re-added on secure ones.
-TEST_F(URLLoaderTest, RedirectChainRemovesAndAddsSecHeaders) {
+TEST_P(ParameterizedURLLoaderTest, RedirectChainRemovesAndAddsSecHeaders) {
   // Set up a redirect to signal we will go from secure => insecure => secure.
   GURL insecure_upgrade_url = test_server()->GetURL(
       kInsecureHost,
@@ -3822,7 +3840,7 @@
 }
 
 // Validate Sec-Fetch-User header is properly handled.
-TEST_F(URLLoaderTest, RedirectSecHeadersUser) {
+TEST_P(ParameterizedURLLoaderTest, RedirectSecHeadersUser) {
   GURL url = test_server()->GetURL("/server-redirect?" +
                                    test_server()->GetURL("/echo").spec());
 
@@ -3848,7 +3866,7 @@
 }
 
 // Validate Sec-Fetch-User header cannot be modified by manually set the value.
-TEST_F(URLLoaderTest, RedirectDirectlyModifiedSecHeadersUser) {
+TEST_P(ParameterizedURLLoaderTest, RedirectDirectlyModifiedSecHeadersUser) {
   GURL url = test_server()->GetURL("/server-redirect?" +
                                    test_server()->GetURL("/echo").spec());
 
@@ -3916,7 +3934,7 @@
 };
 
 // Tests that |cert_status| is set on the resource response.
-TEST_F(URLLoaderTest, CertStatusOnResponse) {
+TEST_P(ParameterizedURLLoaderTest, CertStatusOnResponse) {
   net::URLRequestFilter::GetInstance()->ClearHandlers();
   net::URLRequestFilter::GetInstance()->AddHostnameInterceptor(
       "https", "example.test",
@@ -3929,7 +3947,7 @@
 }
 
 // Verifies if URLLoader works well with ResourceScheduler.
-TEST_F(URLLoaderTest, ResourceSchedulerIntegration) {
+TEST_P(ParameterizedURLLoaderTest, ResourceSchedulerIntegration) {
   // ResourceScheduler limits the number of connections for the same host
   // by 6.
   constexpr int kRepeat = 6;
@@ -3993,7 +4011,7 @@
 
 // This tests that case where a read pipe is closed while there's a post task to
 // invoke ReadMore.
-TEST_F(URLLoaderTest, ReadPipeClosedWhileReadTaskPosted) {
+TEST_P(ParameterizedURLLoaderTest, ReadPipeClosedWhileReadTaskPosted) {
   AddEternalSyncReadsInterceptor();
 
   ResourceRequest request = CreateResourceRequest(
@@ -4357,7 +4375,7 @@
   raw_ptr<mojo::Remote<mojom::URLLoader>> url_loader_remote_ = nullptr;
 };
 
-TEST_F(URLLoaderTest, SetAuth) {
+TEST_P(ParameterizedURLLoaderTest, SetAuth) {
   ClientCertAuthObserver client_auth_observer;
   client_auth_observer.set_credentials_response(
       ClientCertAuthObserver::CredentialsResponse::CORRECT_CREDENTIALS);
@@ -4394,7 +4412,7 @@
   EXPECT_FALSE(client()->response_head()->auth_challenge_info.has_value());
 }
 
-TEST_F(URLLoaderTest, CancelAuth) {
+TEST_P(ParameterizedURLLoaderTest, CancelAuth) {
   ClientCertAuthObserver client_auth_observer;
   client_auth_observer.set_credentials_response(
       ClientCertAuthObserver::CredentialsResponse::NO_CREDENTIALS);
@@ -4430,7 +4448,7 @@
   ASSERT_FALSE(url_loader);
 }
 
-TEST_F(URLLoaderTest, TwoChallenges) {
+TEST_P(ParameterizedURLLoaderTest, TwoChallenges) {
   ClientCertAuthObserver client_auth_observer;
   client_auth_observer.set_credentials_response(
       ClientCertAuthObserver::CredentialsResponse::
@@ -4467,7 +4485,7 @@
   ASSERT_FALSE(url_loader);
 }
 
-TEST_F(URLLoaderTest, NoAuthRequiredForFavicon) {
+TEST_P(ParameterizedURLLoaderTest, NoAuthRequiredForFavicon) {
   constexpr char kFaviconTestPage[] = "/has_favicon.html";
 
   ClientCertAuthObserver client_auth_observer;
@@ -4506,7 +4524,7 @@
   ASSERT_FALSE(url_loader);
 }
 
-TEST_F(URLLoaderTest, HttpAuthResponseHeadersAvailable) {
+TEST_P(ParameterizedURLLoaderTest, HttpAuthResponseHeadersAvailable) {
   ClientCertAuthObserver client_auth_observer;
   client_auth_observer.set_credentials_response(
       ClientCertAuthObserver::CredentialsResponse::CORRECT_CREDENTIALS);
@@ -4540,7 +4558,7 @@
 
 // Make sure the client can't call FollowRedirect if there's no pending
 // redirect.
-TEST_F(URLLoaderTest, FollowRedirectTwice) {
+TEST_P(ParameterizedURLLoaderTest, FollowRedirectTwice) {
   ResourceRequest request = CreateResourceRequest(
       "GET", test_server()->GetURL("/redirect307-to-echo"));
   request.headers.SetHeader("Header1", "Value1");
@@ -4603,7 +4621,7 @@
 };
 
 #if !BUILDFLAG(IS_IOS)
-TEST_F(URLLoaderTest, ClientAuthRespondTwice) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthRespondTwice) {
   // This tests that one URLLoader can handle two client cert requests.
 
   net::SSLServerConfig ssl_config;
@@ -4669,7 +4687,7 @@
   EXPECT_EQ(2, private_key->sign_count());
 }
 
-TEST_F(URLLoaderTest, ClientAuthDestroyResponder) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthDestroyResponder) {
   // When URLLoader receives no message from the ClientCertificateResponder and
   // its connection errors out, we expect the request to be canceled rather than
   // just hang.
@@ -4706,7 +4724,7 @@
             client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, ClientAuthCancelConnection) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthCancelConnection) {
   net::EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   net::SSLServerConfig ssl_config;
   ssl_config.client_cert_type =
@@ -4739,7 +4757,7 @@
   EXPECT_EQ(net::ERR_FAILED, client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, ClientAuthCancelCertificateSelection) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthCancelCertificateSelection) {
   net::EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   net::SSLServerConfig ssl_config;
   ssl_config.client_cert_type =
@@ -4774,7 +4792,7 @@
             client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, ClientAuthNoCertificate) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthNoCertificate) {
   net::EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   net::SSLServerConfig ssl_config;
   ssl_config.client_cert_type =
@@ -4815,7 +4833,7 @@
             client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, ClientAuthCertificateWithValidSignature) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthCertificateWithValidSignature) {
   std::unique_ptr<net::FakeClientCertIdentity> identity =
       net::FakeClientCertIdentity::CreateFromCertAndKeyFiles(
           net::GetTestCertsDirectory(), "client_1.pem", "client_1.pk8");
@@ -4860,7 +4878,7 @@
   EXPECT_EQ(1, private_key->sign_count());
 }
 
-TEST_F(URLLoaderTest, ClientAuthCertificateWithInvalidSignature) {
+TEST_P(ParameterizedURLLoaderTest, ClientAuthCertificateWithInvalidSignature) {
   std::unique_ptr<net::FakeClientCertIdentity> identity =
       net::FakeClientCertIdentity::CreateFromCertAndKeyFiles(
           net::GetTestCertsDirectory(), "client_1.pem", "client_1.pk8");
@@ -4908,7 +4926,7 @@
             client()->completion_status().error_code);
 }
 
-TEST_F(URLLoaderTest, BlockAllCookies) {
+TEST_P(ParameterizedURLLoaderTest, BlockAllCookies) {
   GURL first_party_url("http://www.example.com.test/");
   net::SiteForCookies site_for_cookies =
       net::SiteForCookies::FromUrl(first_party_url);
@@ -4937,7 +4955,7 @@
   EXPECT_FALSE(url_loader->AllowFullCookies(third_party_url, site_for_cookies));
 }
 
-TEST_F(URLLoaderTest, BlockOnlyThirdPartyCookies) {
+TEST_P(ParameterizedURLLoaderTest, BlockOnlyThirdPartyCookies) {
   GURL first_party_url("http://www.example.com.test/");
   net::SiteForCookies site_for_cookies =
       net::SiteForCookies::FromUrl(first_party_url);
@@ -4966,7 +4984,7 @@
   EXPECT_FALSE(url_loader->AllowFullCookies(third_party_url, site_for_cookies));
 }
 
-TEST_F(URLLoaderTest, AllowAllCookies) {
+TEST_P(ParameterizedURLLoaderTest, AllowAllCookies) {
   GURL first_party_url("http://www.example.com.test/");
   net::SiteForCookies site_for_cookies =
       net::SiteForCookies::FromUrl(first_party_url);
@@ -5662,7 +5680,7 @@
 
 #endif  // !BUILDFLAG(IS_IOS)
 
-TEST_F(URLLoaderTest, CookieReporting) {
+TEST_P(ParameterizedURLLoaderTest, CookieReporting) {
   {
     TestURLLoaderClient loader_client;
     ResourceRequest request =
@@ -5723,7 +5741,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, CookieReportingRedirect) {
+TEST_P(ParameterizedURLLoaderTest, CookieReportingRedirect) {
   MockCookieObserver cookie_observer(CookieAccessType::kChange);
 
   GURL dest_url = test_server()->GetURL("/nocontent");
@@ -5761,7 +5779,7 @@
   EXPECT_EQ(redirecting_url, cookie_observer.observed_cookies()[0].url);
 }
 
-TEST_F(URLLoaderTest, CookieReportingAuth) {
+TEST_P(ParameterizedURLLoaderTest, CookieReportingAuth) {
   for (auto mode :
        {ClientCertAuthObserver::CredentialsResponse::NO_CREDENTIALS,
         ClientCertAuthObserver::CredentialsResponse::CORRECT_CREDENTIALS}) {
@@ -5801,7 +5819,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawRequestCookies) {
+TEST_P(ParameterizedURLLoaderTest, RawRequestCookies) {
   {
     MockDevToolsObserver devtools_observer;
     TestURLLoaderClient loader_client;
@@ -5843,7 +5861,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawRequestCookiesFlagged) {
+TEST_P(ParameterizedURLLoaderTest, RawRequestCookiesFlagged) {
   {
     MockDevToolsObserver devtools_observer;
     TestURLLoaderClient loader_client;
@@ -5887,7 +5905,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawResponseCookies) {
+TEST_P(ParameterizedURLLoaderTest, RawResponseCookies) {
   {
     MockDevToolsObserver devtools_observer;
     TestURLLoaderClient loader_client;
@@ -5926,7 +5944,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawResponseCookiesInvalid) {
+TEST_P(ParameterizedURLLoaderTest, RawResponseCookiesInvalid) {
   {
     MockDevToolsObserver devtools_observer;
     TestURLLoaderClient loader_client;
@@ -5963,7 +5981,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawResponseCookiesRedirect) {
+TEST_P(ParameterizedURLLoaderTest, RawResponseCookiesRedirect) {
   // Check a valid cookie
   {
     MockDevToolsObserver devtools_observer;
@@ -6053,7 +6071,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawResponseCookiesAuth) {
+TEST_P(ParameterizedURLLoaderTest, RawResponseCookiesAuth) {
   // Check a valid cookie
   {
     MockDevToolsObserver devtools_observer;
@@ -6136,7 +6154,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, RawResponseQUIC) {
+TEST_P(ParameterizedURLLoaderTest, RawResponseQUIC) {
   {
     MockDevToolsObserver devtools_observer;
     TestURLLoaderClient loader_client;
@@ -6170,7 +6188,7 @@
   }
 }
 
-TEST_F(URLLoaderTest, EarlyHints) {
+TEST_P(ParameterizedURLLoaderTest, EarlyHints) {
   const std::string kPath = "/hinted";
   const std::string kResponseBody = "content with hints";
   const std::string kPreloadPath = "/hello.txt";
@@ -6230,7 +6248,7 @@
   EXPECT_EQ(header_content.value, preload_link);
 }
 
-TEST_F(URLLoaderTest, CookieReportingCategories) {
+TEST_P(ParameterizedURLLoaderTest, CookieReportingCategories) {
   net::test_server::EmbeddedTestServer https_server(
       net::test_server::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(
@@ -6991,7 +7009,7 @@
           test_server()->GetOrigin(), test_server()->GetOrigin(), true)));
 }
 
-TEST_F(URLLoaderTest, OnRawRequestClientSecurityStateFactory) {
+TEST_P(ParameterizedURLLoaderTest, OnRawRequestClientSecurityStateFactory) {
   MockDevToolsObserver devtools_observer;
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html"));
@@ -7033,7 +7051,7 @@
             mojom::IPAddressSpace::kPublic);
 }
 
-TEST_F(URLLoaderTest, OnRawRequestClientSecurityStateRequest) {
+TEST_P(ParameterizedURLLoaderTest, OnRawRequestClientSecurityStateRequest) {
   MockDevToolsObserver devtools_observer;
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html"));
@@ -7072,7 +7090,7 @@
             mojom::IPAddressSpace::kPublic);
 }
 
-TEST_F(URLLoaderTest, OnRawRequestClientSecurityStateNotPresent) {
+TEST_P(ParameterizedURLLoaderTest, OnRawRequestClientSecurityStateNotPresent) {
   MockDevToolsObserver devtools_observer;
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html"));
@@ -7097,7 +7115,7 @@
   ASSERT_FALSE(devtools_observer.client_security_state());
 }
 
-TEST_F(URLLoaderTest, OnRawResponseIPAddressSpace) {
+TEST_P(ParameterizedURLLoaderTest, OnRawResponseIPAddressSpace) {
   MockDevToolsObserver devtools_observer;
   ResourceRequest request =
       CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html"));
@@ -7472,7 +7490,7 @@
   EXPECT_TRUE(socket_data_no_reads_no_writes.socket());
 }
 
-TEST_F(URLLoaderTest, WithDnsAliases) {
+TEST_P(ParameterizedURLLoaderTest, WithDnsAliases) {
   GURL url(test_server_.GetURL(kHostnameWithAliases, "/echo"));
 
   EXPECT_EQ(net::OK, Load(url));
@@ -7481,7 +7499,7 @@
               testing::ElementsAre("alias1", "alias2", "host"));
 }
 
-TEST_F(URLLoaderTest, NoAdditionalDnsAliases) {
+TEST_P(ParameterizedURLLoaderTest, NoAdditionalDnsAliases) {
   GURL url(test_server_.GetURL(kHostnameWithoutAliases, "/echo"));
 
   EXPECT_EQ(net::OK, Load(url));
@@ -7490,7 +7508,7 @@
               testing::ElementsAre(kHostnameWithoutAliases));
 }
 
-TEST_F(URLLoaderTest,
+TEST_P(ParameterizedURLLoaderTest,
        PrivateNetworkRequestPolicyReportsOnPrivateNetworkRequestWarn) {
   url::Origin initiator =
       url::Origin::Create(GURL("http://other-origin.test/"));
@@ -7528,7 +7546,7 @@
   EXPECT_THAT(params.url.spec(), testing::HasSubstr("simple_page.html"));
 }
 
-TEST_F(URLLoaderTest,
+TEST_P(ParameterizedURLLoaderTest,
        PrivateNetworkRequestPolicyReportsOnPrivateNetworkRequestBlock) {
   url::Origin initiator =
       url::Origin::Create(GURL("http://other-origin.test/"));
@@ -7567,7 +7585,7 @@
   EXPECT_THAT(params.url.spec(), testing::HasSubstr("simple_page.html"));
 }
 
-TEST_F(URLLoaderTest,
+TEST_P(ParameterizedURLLoaderTest,
        PrivateNetworkRequestPolicyReportsOnPrivateNetworkRequestAllow) {
   url::Origin initiator =
       url::Origin::Create(GURL("http://other-origin.test/"));
@@ -7673,7 +7691,7 @@
   EXPECT_FALSE(accept_ch_frame_observer.called());
 }
 
-TEST_F(URLLoaderTest, CookieSettingOverridesCopiedToURLRequest) {
+TEST_P(ParameterizedURLLoaderTest, CookieSettingOverridesCopiedToURLRequest) {
   GURL url = test_server()->GetURL("/simple_page.html");
   net::CookieSettingOverrides cookie_setting_overrides =
       net::CookieSettingOverrides::All();
@@ -7695,7 +7713,7 @@
   EXPECT_TRUE(was_intercepted);
 }
 
-TEST_F(URLLoaderTest, ReadAndDiscardBody) {
+TEST_P(ParameterizedURLLoaderTest, ReadAndDiscardBody) {
   const std::string file = "simple_page.html";
   const GURL url = test_server()->GetURL("/" + file);
   std::optional<int64_t> file_size = base::GetFileSize(GetTestFilePath(file));
@@ -8026,7 +8044,7 @@
 }
 
 #if BUILDFLAG(IS_ANDROID)
-TEST_F(URLLoaderTest, SocketTaggingWorks) {
+TEST_P(ParameterizedURLLoaderTest, SocketTaggingWorks) {
   if (!net::CanGetTaggedBytes()) {
     GTEST_SKIP() << "Skipping test - GetTaggedBytes unsupported.";
   }
@@ -8042,4 +8060,8 @@
 }
 #endif
 
+INSTANTIATE_TEST_SUITE_P(PipeCreationAsyncMode,
+                         ParameterizedURLLoaderTest,
+                         testing::Bool());
+
 }  // namespace network
diff --git a/services/webnn/coreml/graph_builder_coreml.cc b/services/webnn/coreml/graph_builder_coreml.cc
index a86729e..4a2cf04 100644
--- a/services/webnn/coreml/graph_builder_coreml.cc
+++ b/services/webnn/coreml/graph_builder_coreml.cc
@@ -165,15 +165,16 @@
 constexpr char kOpMaximumTypeName[] = "maximum";
 constexpr char kOpMinimumTypeName[] = "minimum";
 constexpr char kOpPowerTypeName[] = "pow";
-constexpr char kOpLogicalAnd[] = "logical_and";
-constexpr char kOpLogicalOr[] = "logical_or";
-constexpr char kOpLogicalXor[] = "logical_xor";
-// Elementwise unary operators.
 constexpr char kOpLogicalEqual[] = "equal";
 constexpr char kOpLogicalGreater[] = "greater";
 constexpr char kOpLogicalGreaterEqual[] = "greater_equal";
 constexpr char kOpLogicalLess[] = "less";
 constexpr char kOpLogicalLessEqual[] = "less_equal";
+constexpr char kOpLogicalNotEqual[] = "not_equal";
+constexpr char kOpLogicalAnd[] = "logical_and";
+constexpr char kOpLogicalOr[] = "logical_or";
+constexpr char kOpLogicalXor[] = "logical_xor";
+// Elementwise unary operators.
 constexpr char kOpLogicalNot[] = "logical_not";
 constexpr char kOpAbsTypeName[] = "abs";
 constexpr char kOpCeilTypeName[] = "ceil";
@@ -1012,6 +1013,7 @@
        /*equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
        /*greater_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
        /*greater_or_equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
+       /*not_equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
        /*lesser_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
        /*lesser_or_equal_input=*/{kFloatsAndInt32, SupportedRanks::UpTo(5)},
        /*logical_and_input=*/
@@ -2113,6 +2115,12 @@
       op_type_name = kOpLogicalLessEqual;
       break;
     }
+    case mojom::ElementWiseBinary::Kind::kNotEqual: {
+      CHECK(context_properties_.data_type_limits.not_equal_input.data_types.Has(
+          input_data_type));
+      op_type_name = kOpLogicalNotEqual;
+      break;
+    }
     case mojom::ElementWiseBinary::Kind::kLogicalAnd: {
       CHECK(
           context_properties_.data_type_limits.logical_and_input.data_types.Has(
diff --git a/services/webnn/dml/context_impl_dml.cc b/services/webnn/dml/context_impl_dml.cc
index 6ec586d..3a8e3d6 100644
--- a/services/webnn/dml/context_impl_dml.cc
+++ b/services/webnn/dml/context_impl_dml.cc
@@ -163,6 +163,10 @@
        /*lesser_or_equal_input=*/
        {kFloat16To32Ints8To32, SupportedRanks::UpTo(8)},
 
+       // NotEqual is emulated by DML_OPERATOR_ELEMENT_WISE_LOGICAL_EQUALS and
+       // DML_OPERATOR_ELEMENT_WISE_LOGICAL_NOT.
+       /*not_equal_input=*/{kUint8To32, SupportedRanks::UpTo(8)},
+
        // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_element_wise_logical_and_operator_desc#tensor-support
        /*logical_and_input=*/{kUint8To32, SupportedRanks::UpTo(8)},
 
@@ -400,6 +404,8 @@
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.gather_nd_input =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
+    properties.data_type_limits.not_equal_input.data_types =
+        DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.reshape_input =
         DataTypeConstraint::kAllDataTypesAtLeast8bits;
     properties.data_type_limits.reverse_input =
diff --git a/services/webnn/dml/graph_impl_dml.cc b/services/webnn/dml/graph_impl_dml.cc
index e178f3b3..da97b6a 100644
--- a/services/webnn/dml/graph_impl_dml.cc
+++ b/services/webnn/dml/graph_impl_dml.cc
@@ -2080,6 +2080,46 @@
   return base::ok();
 }
 
+template <typename DML_OPERATOR_DESC, DML_OPERATOR_TYPE operator_type>
+const GraphNode* CreateUnaryOperator(const TensorDesc& input_tensor,
+                                     const TensorDesc& output_tensor,
+                                     const NodeOutput* input,
+                                     GraphBuilderDml& graph_builder,
+                                     std::string_view label = "") {
+  DML_OPERATOR_DESC unary_operator_desc{
+      .InputTensor = &input_tensor.GetDMLTensorDesc(),
+      .OutputTensor = &output_tensor.GetDMLTensorDesc()};
+  std::array<const NodeOutput*, 1> inputs = {input};
+  return graph_builder.CreateOperatorNode(operator_type, &unary_operator_desc,
+                                          inputs, label);
+}
+
+template <typename OperatorDesc,
+          DML_OPERATOR_TYPE operator_type,
+          typename Operation>
+void CreateOperatorNodeForUnary(const IdToOperandMap& id_to_operand_map,
+                                const Operation& operation,
+                                GraphBuilderDml& graph_builder,
+                                IdToNodeOutputMap& id_to_node_output_map) {
+  const NodeOutput* input = GetNodeOutputForOperand(
+      id_to_node_output_map, operation->input_operand_id);
+  const auto& input_tensor_desc = input->GetTensorDesc();
+
+  uint64_t output_id = operation->output_operand_id;
+  const auto output_tensor_desc =
+      CreateOutputTensorDesc(id_to_operand_map, output_id);
+
+  const GraphNode* unary_node =
+      CreateUnaryOperator<OperatorDesc, operator_type>(
+          input_tensor_desc, output_tensor_desc, input, graph_builder,
+          operation->label);
+
+  const NodeOutput* output = graph_builder.CreateNodeOutput(
+      unary_node, std::move(output_tensor_desc), 0);
+  // The output id must be unique in the map.
+  CHECK(id_to_node_output_map.try_emplace(output_id, output).second);
+}
+
 void CreateOperatorNodeForBinary(
     const ContextProperties& context_properties,
     const IdToOperandMap& id_to_operand_map,
@@ -2260,6 +2300,28 @@
           inputs, label);
       break;
     }
+    case mojom::ElementWiseBinary::Kind::kNotEqual: {
+      CHECK(context_properties.data_type_limits.not_equal_input.data_types.Has(
+          input_data_type));
+      // DirectML doesn't support `notEqual`, emulate it by `logicalNot(equal(a,
+      // b))`. Step 1: calculate `equal(a, b)`.
+      const TensorDesc equal_output_tensor_desc =
+          TensorDesc(output_tensor_desc.GetDataType(), output_dimensions);
+      const GraphNode* equal_node =
+          CreateBinaryOperator<DML_ELEMENT_WISE_LOGICAL_EQUALS_OPERATOR_DESC>(
+              input_a_tensor_desc, input_b_tensor_desc,
+              equal_output_tensor_desc, graph_builder,
+              DML_OPERATOR_ELEMENT_WISE_LOGICAL_EQUALS, inputs, label);
+      const NodeOutput* equal_output =
+          graph_builder.CreateNodeOutput(equal_node, equal_output_tensor_desc);
+      // Step 2: calculate `logicalNot(equal_output)`
+      binary_node =
+          CreateUnaryOperator<DML_ELEMENT_WISE_LOGICAL_NOT_OPERATOR_DESC,
+                              DML_OPERATOR_ELEMENT_WISE_LOGICAL_NOT>(
+              equal_output_tensor_desc, output_tensor_desc, equal_output,
+              graph_builder, label);
+      break;
+    }
     case mojom::ElementWiseBinary::Kind::kLogicalAnd: {
       CHECK(
           context_properties.data_type_limits.logical_and_input.data_types.Has(
@@ -2732,46 +2794,6 @@
   }
 }
 
-template <typename DML_OPERATOR_DESC, DML_OPERATOR_TYPE operator_type>
-const GraphNode* CreateUnaryOperator(const TensorDesc& input_tensor,
-                                     const TensorDesc& output_tensor,
-                                     const NodeOutput* input,
-                                     GraphBuilderDml& graph_builder,
-                                     std::string_view label = "") {
-  DML_OPERATOR_DESC unary_operator_desc{
-      .InputTensor = &input_tensor.GetDMLTensorDesc(),
-      .OutputTensor = &output_tensor.GetDMLTensorDesc()};
-  std::array<const NodeOutput*, 1> inputs = {input};
-  return graph_builder.CreateOperatorNode(operator_type, &unary_operator_desc,
-                                          inputs, label);
-}
-
-template <typename OperatorDesc,
-          DML_OPERATOR_TYPE operator_type,
-          typename Operation>
-void CreateOperatorNodeForUnary(const IdToOperandMap& id_to_operand_map,
-                                const Operation& operation,
-                                GraphBuilderDml& graph_builder,
-                                IdToNodeOutputMap& id_to_node_output_map) {
-  const NodeOutput* input = GetNodeOutputForOperand(
-      id_to_node_output_map, operation->input_operand_id);
-  const auto& input_tensor_desc = input->GetTensorDesc();
-
-  uint64_t output_id = operation->output_operand_id;
-  const auto output_tensor_desc =
-      CreateOutputTensorDesc(id_to_operand_map, output_id);
-
-  const GraphNode* unary_node =
-      CreateUnaryOperator<OperatorDesc, operator_type>(
-          input_tensor_desc, output_tensor_desc, input, graph_builder,
-          operation->label);
-
-  const NodeOutput* output = graph_builder.CreateNodeOutput(
-      unary_node, std::move(output_tensor_desc), 0);
-  // The output id must be unique in the map.
-  CHECK(id_to_node_output_map.try_emplace(output_id, output).second);
-}
-
 void CreateOperatorNodeForNeg(const IdToOperandMap& id_to_operand_map,
                               const mojom::ElementWiseUnaryPtr& operation,
                               GraphBuilderDml& graph_builder,
diff --git a/services/webnn/public/cpp/data_type_limits.cc b/services/webnn/public/cpp/data_type_limits.cc
index e9bd547..1578332 100644
--- a/services/webnn/public/cpp/data_type_limits.cc
+++ b/services/webnn/public/cpp/data_type_limits.cc
@@ -33,6 +33,7 @@
                                SupportedTensors greater_or_equal_input,
                                SupportedTensors lesser_input,
                                SupportedTensors lesser_or_equal_input,
+                               SupportedTensors not_equal_input,
                                SupportedTensors logical_and_input,
                                SupportedTensors logical_or_input,
                                SupportedTensors logical_xor_input,
@@ -135,6 +136,7 @@
       greater_or_equal_input(greater_or_equal_input),
       lesser_input(lesser_input),
       lesser_or_equal_input(lesser_or_equal_input),
+      not_equal_input(not_equal_input),
       logical_and_input(logical_and_input),
       logical_or_input(logical_or_input),
       logical_xor_input(logical_xor_input),
diff --git a/services/webnn/public/cpp/data_type_limits.h b/services/webnn/public/cpp/data_type_limits.h
index 6b7f27b..296c585 100644
--- a/services/webnn/public/cpp/data_type_limits.h
+++ b/services/webnn/public/cpp/data_type_limits.h
@@ -39,6 +39,7 @@
                  SupportedTensors greater_or_equal_input,
                  SupportedTensors lesser_input,
                  SupportedTensors lesser_or_equal_input,
+                 SupportedTensors not_equal_input,
                  SupportedTensors logical_and_input,
                  SupportedTensors logical_or_input,
                  SupportedTensors logical_xor_input,
@@ -152,6 +153,7 @@
   SupportedTensors greater_or_equal_input;
   SupportedTensors lesser_input;
   SupportedTensors lesser_or_equal_input;
+  SupportedTensors not_equal_input;
   SupportedTensors logical_and_input;
   SupportedTensors logical_or_input;
   SupportedTensors logical_xor_input;
@@ -258,6 +260,7 @@
          lhs.greater_or_equal_input == rhs.greater_or_equal_input &&
          lhs.lesser_input == rhs.lesser_input &&
          lhs.lesser_or_equal_input == rhs.lesser_or_equal_input &&
+         lhs.not_equal_input == rhs.not_equal_input &&
          lhs.logical_and_input == rhs.logical_and_input &&
          lhs.logical_or_input == rhs.logical_or_input &&
          lhs.logical_xor_input == rhs.logical_xor_input &&
diff --git a/services/webnn/public/cpp/webnn_errors.h b/services/webnn/public/cpp/webnn_errors.h
index 9185c299..20056385 100644
--- a/services/webnn/public/cpp/webnn_errors.h
+++ b/services/webnn/public/cpp/webnn_errors.h
@@ -78,6 +78,7 @@
 inline constexpr char kGreaterOrEqual[] = "greaterOrEqual";
 inline constexpr char kLesser[] = "lesser";
 inline constexpr char kLesserOrEqual[] = "lesserOrEqual";
+inline constexpr char kNotEqual[] = "notEqual";
 inline constexpr char kLogicalAnd[] = "logicalAnd";
 inline constexpr char kLogicalOr[] = "logicalOr";
 inline constexpr char kLogicalXor[] = "logicalXor";
diff --git a/services/webnn/public/cpp/webnn_trace.h b/services/webnn/public/cpp/webnn_trace.h
index b62de55..5686d60 100644
--- a/services/webnn/public/cpp/webnn_trace.h
+++ b/services/webnn/public/cpp/webnn_trace.h
@@ -5,6 +5,8 @@
 #ifndef SERVICES_WEBNN_PUBLIC_CPP_WEBNN_TRACE_H_
 #define SERVICES_WEBNN_PUBLIC_CPP_WEBNN_TRACE_H_
 
+#include <stdint.h>
+
 #include <memory>
 #include <optional>
 
diff --git a/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc b/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
index 862a2ce..8a6e6bb 100644
--- a/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
+++ b/services/webnn/public/mojom/context_properties_mojom_traits_unittest.cc
@@ -54,25 +54,23 @@
        {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kInt8},
         webnn::SupportedRanks::UpTo(8)},
        /*equal_input=*/
-       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-        webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*greater_input=*/
-       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-        webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*greater_or_equal_input=*/
        {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*lesser_input=*/
-       {{webnn::OperandDataType::kInt32, webnn::OperandDataType::kInt64},
-        webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*lesser_or_equal_input=*/
-       {{webnn::OperandDataType::kFloat16, webnn::OperandDataType::kFloat32},
-        webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
+       /*not_equal_input=*/
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*logical_and_input=*/
-       {{webnn::OperandDataType::kUint8}, webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*logical_or_input=*/
-       {{webnn::OperandDataType::kUint8}, webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*logical_xor_input=*/
-       {{webnn::OperandDataType::kUint8}, webnn::SupportedRanks::UpTo(8)},
+       {{webnn::OperandDataType::kFloat16}, webnn::SupportedRanks::UpTo(8)},
        /*logical_not_input=*/webnn::SupportedDataTypes::All(),
        /*logical_output=*/{webnn::OperandDataType::kUint64},
        /*abs_input=*/
@@ -180,12 +178,12 @@
 
   webnn::ContextProperties output(
       webnn::InputOperandLayout::kNhwc, webnn::Resample2DAxes::kChannelsFirst,
-      {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
-       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
-       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
-       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
-       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
-       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}});
+      {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+       {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}});
 
   EXPECT_TRUE(
       mojo::test::SerializeAndDeserialize<webnn::mojom::ContextProperties>(
diff --git a/services/webnn/public/mojom/data_type_limits_mojom_traits.h b/services/webnn/public/mojom/data_type_limits_mojom_traits.h
index 79f0931..bf46e98 100644
--- a/services/webnn/public/mojom/data_type_limits_mojom_traits.h
+++ b/services/webnn/public/mojom/data_type_limits_mojom_traits.h
@@ -114,6 +114,10 @@
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.lesser_or_equal_input;
   }
+  static webnn::SupportedTensors not_equal_input(
+      const webnn::DataTypeLimits& data_type_limits) {
+    return data_type_limits.not_equal_input;
+  }
   static webnn::SupportedTensors logical_and_input(
       const webnn::DataTypeLimits& data_type_limits) {
     return data_type_limits.logical_and_input;
@@ -449,6 +453,7 @@
            data.ReadGreaterOrEqualInput(&out->greater_or_equal_input) &&
            data.ReadLesserInput(&out->lesser_input) &&
            data.ReadLesserOrEqualInput(&out->lesser_or_equal_input) &&
+           data.ReadNotEqualInput(&out->not_equal_input) &&
            data.ReadLogicalAndInput(&out->logical_and_input) &&
            data.ReadLogicalOrInput(&out->logical_or_input) &&
            data.ReadLogicalXorInput(&out->logical_xor_input) &&
diff --git a/services/webnn/public/mojom/webnn_context_properties.mojom b/services/webnn/public/mojom/webnn_context_properties.mojom
index 57704474..8bb79da 100644
--- a/services/webnn/public/mojom/webnn_context_properties.mojom
+++ b/services/webnn/public/mojom/webnn_context_properties.mojom
@@ -85,6 +85,7 @@
   SupportedTensors greater_or_equal_input;
   SupportedTensors lesser_input;
   SupportedTensors lesser_or_equal_input;
+  SupportedTensors not_equal_input;
   SupportedTensors logical_and_input;
   SupportedTensors logical_or_input;
   SupportedTensors logical_xor_input;
diff --git a/services/webnn/public/mojom/webnn_graph.mojom b/services/webnn/public/mojom/webnn_graph.mojom
index 5b31fb4f8..e3c2a96b 100644
--- a/services/webnn/public/mojom/webnn_graph.mojom
+++ b/services/webnn/public/mojom/webnn_graph.mojom
@@ -269,6 +269,7 @@
     kGreaterOrEqual,
     kLesser,
     kLesserOrEqual,
+    kNotEqual,
     kLogicalAnd,
     kLogicalOr,
     kLogicalXor,
diff --git a/services/webnn/tflite/graph_builder_tflite.cc b/services/webnn/tflite/graph_builder_tflite.cc
index f5e7eee..dd4e2a0 100644
--- a/services/webnn/tflite/graph_builder_tflite.cc
+++ b/services/webnn/tflite/graph_builder_tflite.cc
@@ -462,6 +462,8 @@
        /*lesser_input=*/{kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
        /*lesser_or_equal_input=*/
        {kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
+       /*not_equal_input=*/
+       {kFloat16To32AndInt32To64, SupportedRanks::UpTo(4)},
        // Logical binary operators are limited to 4D when broadcasting is
        // required:
        // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/kernels/logical.cc
@@ -2071,6 +2073,11 @@
                 .data_types.Has(input_data_type));
       code = ::tflite::BuiltinOperator_LESS_EQUAL;
       break;
+    case mojom::ElementWiseBinary::Kind::kNotEqual:
+      CHECK(context_properties_.data_type_limits.not_equal_input.data_types.Has(
+          input_data_type));
+      code = ::tflite::BuiltinOperator_NOT_EQUAL;
+      break;
     case mojom::ElementWiseBinary::Kind::kLogicalAnd:
       CHECK(
           context_properties_.data_type_limits.logical_and_input.data_types.Has(
@@ -2101,37 +2108,42 @@
   ASSIGN_OR_RETURN(const TensorInfo& output_tensor_info,
                    SerializeOutputTensorInfo(op.output_operand_id));
 
-  if (op.kind == mojom::ElementWiseBinary::Kind::kLogicalAnd ||
-      op.kind == mojom::ElementWiseBinary::Kind::kLogicalOr ||
-      op.kind == mojom::ElementWiseBinary::Kind::kLogicalXor) {
-    // The data types of the inputs and output for these binary logical
-    // operators are uint8 in WebNN. However, TFLite requires them to be bools,
-    // so we need to cast the inputs to temporary bool tensors, perform the
-    // actual operation, and then cast the output back to uint8.
+  if (IsLogicalElementWiseBinary(op.kind)) {
+    int32_t lhs_tensor_index = lhs_tensor_info.index;
+    int32_t rhs_tensor_index = rhs_tensor_info.index;
+    if (op.kind == mojom::ElementWiseBinary::Kind::kLogicalAnd ||
+        op.kind == mojom::ElementWiseBinary::Kind::kLogicalOr ||
+        op.kind == mojom::ElementWiseBinary::Kind::kLogicalXor) {
+      // The data types of the inputs for these binary logical operators are
+      // uint8 in WebNN. However, TFLite requires them to be bools, so we need
+      // to cast the inputs to temporary bool tensors, perform the actual
+      // operation.
+      CHECK_EQ(lhs_tensor_info.data_type, ::tflite::TensorType_UINT8);
+      lhs_tensor_index = SerializeTemporaryTensor(lhs_tensor_info.dimensions,
+                                                  ::tflite::TensorType_BOOL);
+      operators_.emplace_back(SerializeCastOperation(
+          lhs_tensor_info.index,
+          /*input_tensor_type=*/::tflite::TensorType_UINT8, lhs_tensor_index,
+          /*output_tensor_type=*/::tflite::TensorType_BOOL));
 
-    CHECK_EQ(lhs_tensor_info.data_type, ::tflite::TensorType_UINT8);
-    int32_t lhs_tensor_bool_index = SerializeTemporaryTensor(
-        lhs_tensor_info.dimensions, ::tflite::TensorType_BOOL);
-    operators_.emplace_back(SerializeCastOperation(
-        lhs_tensor_info.index,
-        /*input_tensor_type=*/::tflite::TensorType_UINT8, lhs_tensor_bool_index,
-        /*output_tensor_type=*/::tflite::TensorType_BOOL));
+      CHECK_EQ(rhs_tensor_info.data_type, ::tflite::TensorType_UINT8);
+      rhs_tensor_index = SerializeTemporaryTensor(rhs_tensor_info.dimensions,
+                                                  ::tflite::TensorType_BOOL);
+      operators_.emplace_back(SerializeCastOperation(
+          rhs_tensor_info.index,
+          /*input_tensor_type=*/::tflite::TensorType_UINT8, rhs_tensor_index,
+          /*output_tensor_type=*/::tflite::TensorType_BOOL));
+    }
 
-    CHECK_EQ(rhs_tensor_info.data_type, ::tflite::TensorType_UINT8);
-    int32_t rhs_tensor_bool_index = SerializeTemporaryTensor(
-        rhs_tensor_info.dimensions, ::tflite::TensorType_BOOL);
-    operators_.emplace_back(SerializeCastOperation(
-        rhs_tensor_info.index,
-        /*input_tensor_type=*/::tflite::TensorType_UINT8, rhs_tensor_bool_index,
-        /*output_tensor_type=*/::tflite::TensorType_BOOL));
-
+    // The data types of the output for all the binary logical operators are
+    // uint8 in WebNN. However, TFLite returns bools, so we need to cast the
+    // output to uint8.
     CHECK_EQ(output_tensor_info.data_type, ::tflite::TensorType_UINT8);
     int32_t output_tensor_bool_index = SerializeTemporaryTensor(
         output_tensor_info.dimensions, ::tflite::TensorType_BOOL);
 
     operators_.emplace_back(SerializeBinaryOperation(
-        code, lhs_tensor_bool_index, rhs_tensor_bool_index,
-        output_tensor_bool_index));
+        code, lhs_tensor_index, rhs_tensor_index, output_tensor_bool_index));
 
     // Cast the output from bool to uint8, since that's what WebNN expects back.
     return SerializeCastOperation(
diff --git a/services/webnn/webnn_graph_builder_impl.cc b/services/webnn/webnn_graph_builder_impl.cc
index 8a3f7d5..7f2f5081 100644
--- a/services/webnn/webnn_graph_builder_impl.cc
+++ b/services/webnn/webnn_graph_builder_impl.cc
@@ -1084,6 +1084,9 @@
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
       return context_properties_->data_type_limits.lesser_or_equal_input
           .SupportsAll({lhs->descriptor, rhs->descriptor});
+    case mojom::ElementWiseBinary::Kind::kNotEqual:
+      return context_properties_->data_type_limits.not_equal_input.SupportsAll(
+          {lhs->descriptor, rhs->descriptor});
     case mojom::ElementWiseBinary::Kind::kLogicalAnd:
       return context_properties_->data_type_limits.logical_and_input
           .SupportsAll({lhs->descriptor, rhs->descriptor});
diff --git a/services/webnn/webnn_graph_impl_unittest.cc b/services/webnn/webnn_graph_impl_unittest.cc
index e4d3cd3..25ac66e 100644
--- a/services/webnn/webnn_graph_impl_unittest.cc
+++ b/services/webnn/webnn_graph_impl_unittest.cc
@@ -1785,7 +1785,7 @@
   OperandInfo output;
   bool expected;
 
-  static constexpr std::array<mojom::ElementWiseBinary::Kind, 15>
+  static constexpr std::array<mojom::ElementWiseBinary::Kind, 16>
       kAllBinaryOps = {
           mojom::ElementWiseBinary::Kind::kAdd,
           mojom::ElementWiseBinary::Kind::kSub,
@@ -1799,6 +1799,7 @@
           mojom::ElementWiseBinary::Kind::kGreaterOrEqual,
           mojom::ElementWiseBinary::Kind::kLesser,
           mojom::ElementWiseBinary::Kind::kLesserOrEqual,
+          mojom::ElementWiseBinary::Kind::kNotEqual,
           mojom::ElementWiseBinary::Kind::kLogicalAnd,
           mojom::ElementWiseBinary::Kind::kLogicalOr,
           mojom::ElementWiseBinary::Kind::kLogicalXor,
@@ -1818,6 +1819,7 @@
       case mojom::ElementWiseBinary::Kind::kGreaterOrEqual:
       case mojom::ElementWiseBinary::Kind::kLesser:
       case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
+      case mojom::ElementWiseBinary::Kind::kNotEqual:
         return OperandDataType::kFloat32;
       case mojom::ElementWiseBinary::Kind::kLogicalAnd:
       case mojom::ElementWiseBinary::Kind::kLogicalOr:
@@ -1841,6 +1843,7 @@
       case mojom::ElementWiseBinary::Kind::kGreaterOrEqual:
       case mojom::ElementWiseBinary::Kind::kLesser:
       case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
+      case mojom::ElementWiseBinary::Kind::kNotEqual:
       case mojom::ElementWiseBinary::Kind::kLogicalAnd:
       case mojom::ElementWiseBinary::Kind::kLogicalOr:
       case mojom::ElementWiseBinary::Kind::kLogicalXor:
@@ -1873,6 +1876,7 @@
         mojom::ElementWiseBinary::Kind::kGreaterOrEqual,
         mojom::ElementWiseBinary::Kind::kLesser,
         mojom::ElementWiseBinary::Kind::kLesserOrEqual,
+        mojom::ElementWiseBinary::Kind::kNotEqual,
     };
 
     for (const auto& op : kLogicalOperators) {
diff --git a/services/webnn/webnn_test_utils.cc b/services/webnn/webnn_test_utils.cc
index 4f299fc..6ff7cb0 100644
--- a/services/webnn/webnn_test_utils.cc
+++ b/services/webnn/webnn_test_utils.cc
@@ -602,6 +602,8 @@
        /*lesser_input=*/{SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
        /*lesser_or_equal_input=*/
        {SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
+       /*not_equal_input=*/
+       {SupportedDataTypes::All(), SupportedRanks::UpTo(8)},
        /*logical_and_input=*/
        {DataTypeConstraint::kUint8, SupportedRanks::UpTo(8)},
        /*logical_or_input=*/
diff --git a/services/webnn/webnn_utils.cc b/services/webnn/webnn_utils.cc
index fca7310..4b04560 100644
--- a/services/webnn/webnn_utils.cc
+++ b/services/webnn/webnn_utils.cc
@@ -202,6 +202,8 @@
       return ops::kLesser;
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
       return ops::kLesserOrEqual;
+    case mojom::ElementWiseBinary::Kind::kNotEqual:
+      return ops::kNotEqual;
     case mojom::ElementWiseBinary::Kind::kLogicalAnd:
       return ops::kLogicalAnd;
     case mojom::ElementWiseBinary::Kind::kLogicalOr:
@@ -350,6 +352,7 @@
     case mojom::ElementWiseBinary::Kind::kGreaterOrEqual:
     case mojom::ElementWiseBinary::Kind::kLesser:
     case mojom::ElementWiseBinary::Kind::kLesserOrEqual:
+    case mojom::ElementWiseBinary::Kind::kNotEqual:
     case mojom::ElementWiseBinary::Kind::kLogicalAnd:
     case mojom::ElementWiseBinary::Kind::kLogicalOr:
     case mojom::ElementWiseBinary::Kind::kLogicalXor:
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 3c2371d..f49e2d5 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2833,6 +2833,26 @@
             ]
         }
     ],
+    "BackForwardCacheBroadcastChannel": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "fuchsia",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "BFCacheOpenBroadcastChannel"
+                    ]
+                }
+            ]
+        }
+    ],
     "BackForwardCacheForPageWithCacheControlNotStoredHeader": [
         {
             "platforms": [
@@ -21382,6 +21402,56 @@
             ]
         }
     ],
+    "SearchEnginePreconnectInterval": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "EnabledWith50_20250114",
+                    "params": {
+                        "preconnect_interval": "50"
+                    },
+                    "enable_features": [
+                        "SearchEnginePreconnectInterval"
+                    ]
+                },
+                {
+                    "name": "EnabledWith40_20250114",
+                    "params": {
+                        "preconnect_interval": "40"
+                    },
+                    "enable_features": [
+                        "SearchEnginePreconnectInterval"
+                    ]
+                },
+                {
+                    "name": "EnabledWith30_20250114",
+                    "params": {
+                        "preconnect_interval": "30"
+                    },
+                    "enable_features": [
+                        "SearchEnginePreconnectInterval"
+                    ]
+                },
+                {
+                    "name": "EnabledWith20_20250114",
+                    "params": {
+                        "preconnect_interval": "20"
+                    },
+                    "enable_features": [
+                        "SearchEnginePreconnectInterval"
+                    ]
+                }
+            ]
+        }
+    ],
     "SearchInCCT": [
         {
             "platforms": [
diff --git a/third_party/androidx/build.gradle.template b/third_party/androidx/build.gradle.template
index da73d95..09d3f53 100644
--- a/third_party/androidx/build.gradle.template
+++ b/third_party/androidx/build.gradle.template
@@ -43,6 +43,7 @@
     compile 'androidx.appsearch:appsearch-platform-storage:{{androidx_dependency_version}}'
     compile 'androidx.asynclayoutinflater:asynclayoutinflater:{{androidx_dependency_version}}'
     compile 'androidx.asynclayoutinflater:asynclayoutinflater-appcompat:{{androidx_dependency_version}}'
+    compile 'androidx.autofill:autofill:{{androidx_dependency_version}}'
     compile 'androidx.biometric:biometric:{{androidx_dependency_version}}'
     compile 'androidx.browser:browser:{{androidx_dependency_version}}'
     compile 'androidx.cardview:cardview:{{androidx_dependency_version}}'
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 23ddc67..5b4bce6 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -144,10 +144,9 @@
              "AvoidForcedLayoutOnInitialEmptyDocumentInSubframe",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// TODO(https://crbug.com/327075943): Delete this.
 BASE_FEATURE(kBFCacheOpenBroadcastChannel,
              "BFCacheOpenBroadcastChannel",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 BASE_FEATURE(kBackForwardCacheDWCOnJavaScriptExecution,
              "BackForwardCacheDWCOnJavaScriptExecution",
diff --git a/third_party/blink/public/common/permissions_policy/permissions_policy.h b/third_party/blink/public/common/permissions_policy/permissions_policy.h
index 093192ae..252981d 100644
--- a/third_party/blink/public/common/permissions_policy/permissions_policy.h
+++ b/third_party/blink/public/common/permissions_policy/permissions_policy.h
@@ -204,6 +204,14 @@
       const std::optional<ParsedPermissionsPolicy>& base_policy,
       const url::Origin& origin);
 
+  // Returns the inherited policy of the given feature.
+  static bool InheritedValueForFeature(
+      const url::Origin& origin,
+      const PermissionsPolicy* parent_policy,
+      std::pair<mojom::PermissionsPolicyFeature,
+                PermissionsPolicyFeatureDefault> feature,
+      const ParsedPermissionsPolicy& container_policy);
+
   bool IsFeatureEnabled(mojom::PermissionsPolicyFeature feature) const;
 
   // Returns whether or not the given feature is enabled by this policy for a
@@ -256,14 +264,6 @@
   bool IsFeatureEnabledByInheritedPolicy(
       mojom::PermissionsPolicyFeature feature) const;
 
-  // Returns the inherited policy of the given feature.
-  static bool InheritedValueForFeature(
-      const url::Origin& origin,
-      const PermissionsPolicy* parent_policy,
-      std::pair<mojom::PermissionsPolicyFeature,
-                PermissionsPolicyFeatureDefault> feature,
-      const ParsedPermissionsPolicy& container_policy);
-
  private:
   friend class ResourceRequest;
   friend class PermissionsPolicyTest;
diff --git a/third_party/blink/public/mojom/ai/model_streaming_responder.mojom b/third_party/blink/public/mojom/ai/model_streaming_responder.mojom
index b52c24ce..73d03df 100644
--- a/third_party/blink/public/mojom/ai/model_streaming_responder.mojom
+++ b/third_party/blink/public/mojom/ai/model_streaming_responder.mojom
@@ -53,14 +53,28 @@
   uint64 current_tokens;
 };
 
+// The enum describes how the responder should handle the latest chunk of
+// data that is streamed back.
+enum ModelStreamingResponderAction {
+  // The data should completely replace the existing result.
+  kReplace = 0,
+  // The data should be appended to the existing result.
+  kAppend = 1,
+};
+
 // The responder provides methods for the session to return the execution
 // response in a streaming manner.
+// It will be passed to the AIManager by the built-in AI interfaces
+// (e.g. AILanguageModel, AISummarizer etc.) when they executes the model to
+// get the response back.
 interface ModelStreamingResponder {
   // Called when the model execution encounters errors.
   OnError(ModelStreamingResponseStatus status);
   // Called when there is a new chunk of data available for streaming.
-  // The data will be stored in `text`.
-  OnStreaming(string text);
+  // Depending on the execution feature, the `text` may contain either the
+  // latest chunk of the data, or the latest full response. How the responder
+  // should handle the data will be indicated in the `action` field.
+  OnStreaming(string text, ModelStreamingResponderAction action);
   // Called when the model execution completes. The optional `context_info`
   // contain information about the session like the current number of tokens
   // and if the context overflows.
diff --git a/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom b/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom
index 8dc5417..b3ca77ba 100644
--- a/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom
+++ b/third_party/blink/public/mojom/on_device_translation/translation_manager.mojom
@@ -88,6 +88,9 @@
   // The translator cannot be created, because the number of pending tasks
   // exceeds the limitation.
   kExceedsPendingTaskCountLimitation = 10,
+
+  // The translator cannot be created because the library version is invalid.
+  kInvalidVersion = 11,
 };
 
 // The result of TranslationManager's CreateTranslator IPC.
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
index 68d4064d..cc98eda777 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -1126,7 +1126,8 @@
   TokenSequence sequence;
 
   CSSParserTokenStream stream(data->OriginalText());
-  if (ResolveTokensInto(stream, resolver, *context, FunctionContext{},
+  if (ResolveTokensInto(stream, resolver, *context,
+                        /* function_context */ nullptr,
                         /* stop_type */ kEOFToken, sequence)) {
     // TODO(sesse): It would be nice if we had some way of combining
     // ResolveTokensInto() and the re-tokenization. This is basically
@@ -1168,9 +1169,10 @@
     TokenSequence sequence;
 
     CSSParserTokenStream stream(shorthand_data->OriginalText());
-    if (!ResolveTokensInto(
-            stream, resolver, *GetParserContext(*shorthand_value),
-            FunctionContext{}, /* stop_type */ kEOFToken, sequence)) {
+    if (!ResolveTokensInto(stream, resolver,
+                           *GetParserContext(*shorthand_value),
+                           /* function_context */ nullptr,
+                           /* stop_type */ kEOFToken, sequence)) {
       return cssvalue::CSSUnsetValue::Create();
     }
 
@@ -1317,7 +1319,8 @@
   TokenSequence sequence(data);
 
   CSSParserTokenStream stream(data->OriginalText());
-  if (!ResolveTokensInto(stream, resolver, context, FunctionContext{},
+  if (!ResolveTokensInto(stream, resolver, context,
+                         /* function_context */ nullptr,
                          /* stop_type */ kEOFToken, sequence)) {
     return nullptr;
   }
@@ -1328,7 +1331,7 @@
 bool StyleCascade::ResolveTokensInto(CSSParserTokenStream& stream,
                                      CascadeResolver& resolver,
                                      const CSSParserContext& context,
-                                     const FunctionContext& function_context,
+                                     const FunctionContext* function_context,
                                      CSSParserTokenType stop_type,
                                      TokenSequence& out) {
   bool success = true;
@@ -1341,15 +1344,11 @@
       break;
     } else if (token.FunctionId() == CSSValueID::kVar) {
       CSSParserTokenStream::BlockGuard guard(stream);
-      success &= ResolveVarInto(stream, resolver, context, out);
+      success &=
+          ResolveVarInto(stream, resolver, context, function_context, out);
     } else if (token.FunctionId() == CSSValueID::kEnv) {
       CSSParserTokenStream::BlockGuard guard(stream);
       success &= ResolveEnvInto(stream, resolver, context, out);
-    } else if (token.FunctionId() == CSSValueID::kArg &&
-               RuntimeEnabledFeatures::CSSFunctionsEnabled()) {
-      CSSParserTokenStream::BlockGuard guard(stream);
-      success &=
-          ResolveArgInto(stream, resolver, context, function_context, out);
     } else if (token.FunctionId() == CSSValueID::kAttr &&
                RuntimeEnabledFeatures::CSSAdvancedAttrFunctionEnabled()) {
       CSSParserTokenStream::BlockGuard guard(stream);
@@ -1396,10 +1395,37 @@
 bool StyleCascade::ResolveVarInto(CSSParserTokenStream& stream,
                                   CascadeResolver& resolver,
                                   const CSSParserContext& context,
+                                  const FunctionContext* function_context,
                                   TokenSequence& out) {
-  CustomProperty property(ConsumeVariableName(stream), state_.GetDocument());
+  AtomicString var_name = ConsumeVariableName(stream);
   DCHECK(stream.AtEnd() || (stream.Peek().GetType() == kCommaToken));
 
+  // Within a function context (i.e. when resolving values within the body of
+  // an @function rule), var() must first look for local variables
+  // and arguments.
+  //
+  // https://drafts.csswg.org/css-mixins-1/#locally-substitute-a-var
+  if (function_context) {
+    // TODO(crbug.com/325504770): Support local variables.
+    const auto it = function_context->arguments.find(var_name);
+    if (it != function_context->arguments.end()) {
+      // Note that there's nothing to actually resolve within `arg_value`;
+      // substitution functions were already eliminated at the call-site
+      // by ResolveFunctionInto. We're still using ResolveTokensInto, since
+      // it's the most convenient way to "paste" `arg_value` into `out`.
+      //
+      // TODO(crbug.com/325504770): Avoid tokenization and the call to
+      // ResolveTokensInto.
+      String arg_value = it->value->CssText();
+      CSSParserTokenStream arg_value_stream(arg_value);
+      return ResolveTokensInto(arg_value_stream, resolver, context,
+                               /* function_context */ nullptr,
+                               /* stop_type */ kEOFToken, out);
+    }
+  }
+
+  CustomProperty property(var_name, state_.GetDocument());
+
   // Any custom property referenced (by anything, even just once) in the
   // document can currently not be animated on the compositor. Hence we mark
   // properties that have been referenced.
@@ -1437,9 +1463,9 @@
     stream.ConsumeWhitespace();
 
     TokenSequence fallback;
-    bool success =
-        ResolveTokensInto(stream, resolver, context, FunctionContext{},
-                          /* stop_type */ kEOFToken, fallback);
+    bool success = ResolveTokensInto(stream, resolver, context,
+                                     /* function_context */ nullptr,
+                                     /* stop_type */ kEOFToken, fallback);
     // The fallback must match the syntax of the referenced custom property.
     // https://drafts.css-houdini.org/css-properties-values-api-1/#fallbacks-in-var-references
     //
@@ -1468,7 +1494,7 @@
                                        CSSParserTokenStream& stream,
                                        CascadeResolver& resolver,
                                        const CSSParserContext& context,
-                                       const FunctionContext& function_context,
+                                       const FunctionContext* function_context,
                                        TokenSequence& out) {
   state_.StyleBuilder().SetAffectedByCSSFunction();
 
@@ -1523,9 +1549,10 @@
     function_arguments.insert(parameter.name, argument_value);
   }
 
+  FunctionContext local_function_context{function_arguments};
   const CSSValue* ret_value = ResolveFunctionExpression(
       function->GetFunctionBody().OriginalText(), function->GetReturnType(),
-      resolver, context, FunctionContext{function_arguments});
+      resolver, context, &local_function_context);
   if (ret_value == nullptr) {
     return false;
   }
@@ -1533,7 +1560,8 @@
   String ret_string = ret_value->CssText();
   CSSParserTokenStream ret_value_stream(ret_string);
   return ResolveTokensInto(ret_value_stream, resolver, context,
-                           FunctionContext{}, /* stop_type */ kEOFToken, out);
+                           /* function_context */ nullptr,
+                           /* stop_type */ kEOFToken, out);
 }
 
 // Resolves an expression within a function; in practice, either a function
@@ -1549,7 +1577,7 @@
     const CSSSyntaxDefinition& type,
     CascadeResolver& resolver,
     const CSSParserContext& context,
-    const FunctionContext& function_context) {
+    const FunctionContext* function_context) {
   TokenSequence resolved_expr;
 
   CSSParserTokenStream argument_stream(expr);
@@ -1564,6 +1592,10 @@
     return nullptr;
   }
 
+  // TODO(crbug.com/325504770): We need to return a CSSUnparsedDeclarationValue
+  // (or CSSVariableData) from this function. We're currently losing
+  // tainting information held by TokenSequence.
+
   // Resolve the value as if it were a registered property, to get rid of
   // extraneous calc(), resolve lengths and so on.
   return &StyleBuilderConverter::ConvertRegisteredPropertyValue(state_, *value,
@@ -1604,7 +1636,8 @@
 
   if (!data) {
     if (ConsumeComma(stream)) {
-      return ResolveTokensInto(stream, resolver, context, FunctionContext{},
+      return ResolveTokensInto(stream, resolver, context,
+                               /* function_context */ nullptr,
                                /* stop_type */ kEOFToken, out);
     }
     return false;
@@ -1613,26 +1646,6 @@
   return out.Append(data, data->IsAttrTainted());
 }
 
-bool StyleCascade::ResolveArgInto(CSSParserTokenStream& stream,
-                                  CascadeResolver& resolver,
-                                  const CSSParserContext& context,
-                                  const FunctionContext& function_context,
-                                  TokenSequence& out) {
-  AtomicString argument_name = ConsumeVariableName(stream);
-  DCHECK(stream.AtEnd());
-
-  const auto it = function_context.arguments.find(argument_name);
-  if (it == function_context.arguments.end()) {
-    // Argument not found.
-    return false;
-  }
-
-  String arg_value = it->value->CssText();
-  CSSParserTokenStream arg_value_stream(arg_value);
-  return ResolveTokensInto(arg_value_stream, resolver, context,
-                           FunctionContext{}, /* stop_type */ kEOFToken, out);
-}
-
 bool StyleCascade::ResolveAttrInto(CSSParserTokenStream& stream,
                                    CascadeResolver& resolver,
                                    const CSSParserContext& context,
@@ -1659,7 +1672,8 @@
     stream.ConsumeWhitespace();
 
     TokenSequence fallback;
-    if (!ResolveTokensInto(stream, resolver, context, FunctionContext{},
+    if (!ResolveTokensInto(stream, resolver, context,
+                           /* function_context */ nullptr,
                            /* stop_type */ kEOFToken, fallback)) {
       return false;
     }
@@ -1711,7 +1725,8 @@
     stream.ConsumeIncludingWhitespace();  // kCommaToken
   }
 
-  return ResolveTokensInto(stream, resolver, context, FunctionContext{},
+  return ResolveTokensInto(stream, resolver, context,
+                           /* function_context */ nullptr,
                            /* stop_type */ kCommaToken, out);
 }
 
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.h b/third_party/blink/renderer/core/css/resolver/style_cascade.h
index 89e3bdf..ba4dfa3 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.h
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.h
@@ -405,22 +405,18 @@
   bool ResolveTokensInto(CSSParserTokenStream&,
                          CascadeResolver&,
                          const CSSParserContext&,
-                         const FunctionContext&,
+                         const FunctionContext*,
                          CSSParserTokenType stop_type,
                          TokenSequence&);
   bool ResolveVarInto(CSSParserTokenStream&,
                       CascadeResolver&,
                       const CSSParserContext&,
+                      const FunctionContext*,
                       TokenSequence&);
   bool ResolveEnvInto(CSSParserTokenStream&,
                       CascadeResolver&,
                       const CSSParserContext&,
                       TokenSequence&);
-  bool ResolveArgInto(CSSParserTokenStream&,
-                      CascadeResolver&,
-                      const CSSParserContext&,
-                      const FunctionContext&,
-                      TokenSequence&);
   bool ResolveAttrInto(CSSParserTokenStream&,
                        CascadeResolver&,
                        const CSSParserContext&,
@@ -438,7 +434,7 @@
                            CSSParserTokenStream& stream,
                            CascadeResolver& resolver,
                            const CSSParserContext& context,
-                           const FunctionContext& function_context,
+                           const FunctionContext* function_context,
                            TokenSequence& out);
 
   const CSSValue* ResolveFunctionExpression(
@@ -446,7 +442,7 @@
       const CSSSyntaxDefinition& type,
       CascadeResolver& resolver,
       const CSSParserContext& context,
-      const FunctionContext& function_context);
+      const FunctionContext* function_context);
 
   CSSVariableData* GetVariableData(const CustomProperty&) const;
   CSSVariableData* GetEnvironmentVariable(const AtomicString&,
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
index 0a05ba40..5aa6a00 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
@@ -4320,7 +4320,7 @@
 TEST_F(StyleCascadeTest, CSSFunctionWithArgument) {
   AppendSheet(R"HTML(
      @function --foo(--a <length>) returns <length> {
-       @return calc(arg(--a) * 2);
+       @return calc(var(--a) * 2);
      }
     )HTML");
 
@@ -4335,7 +4335,7 @@
 TEST_F(StyleCascadeTest, CSSFunctionWithTwoArguments) {
   AppendSheet(R"HTML(
      @function --foo(--a <integer>, --b <integer>) returns <integer> {
-       @return calc(arg(--a) * arg(--b));
+       @return calc(var(--a) * var(--b));
      }
     )HTML");
 
@@ -4347,13 +4347,30 @@
   EXPECT_EQ("24", cascade.ComputedValue("z-index"));
 }
 
+TEST_F(StyleCascadeTest, CSSFunctionShadowingArgument) {
+  AppendSheet(R"HTML(
+     @function --foo(--a <length>) returns <length> {
+       @return calc(var(--a) * var(--b));
+     }
+    )HTML");
+
+  TestCascade cascade(GetDocument());
+
+  cascade.Add("--a", "0px"); /* Shadowed by argument --a. */
+  cascade.Add("--b", "2");
+  cascade.Add("left", "--foo(10.00px)");
+  cascade.Apply();
+
+  EXPECT_EQ("20px", cascade.ComputedValue("left"));
+}
+
 TEST_F(StyleCascadeTest, CSSFunctionCallingOtherFunction) {
   AppendSheet(R"HTML(
      @function --foo(--a <length>) returns <length> {
-       @return calc(arg(--a) * 2);
+       @return calc(var(--a) * 2);
      }
      @function --bar(--b <length>) returns <length> {
-       @return calc(--foo(arg(--b)) * 3);
+       @return calc(--foo(var(--b)) * 3);
      }
     )HTML");
 
@@ -4419,7 +4436,7 @@
 TEST_F(StyleCascadeTest, CSSFunctionExplicitCalc) {
   AppendSheet(R"HTML(
      @function --foo(--x <number>) returns <number> {
-       @return calc(arg(--x) * 2);
+       @return calc(var(--x) * 2);
      }
     )HTML");
 
diff --git a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
index 226817c6c..a70f97c 100644
--- a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
@@ -454,10 +454,9 @@
 String ReplaceSelectionCommand::TextDataForInputEvent() const {
   // As per spec https://www.w3.org/TR/input-events-1/#overview
   // input event data should be set for certain input types.
-  if (RuntimeEnabledFeatures::NonNullInputEventDataForTextAreaEnabled() &&
-      (input_type_ == InputEvent::InputType::kInsertFromDrop ||
-       input_type_ == InputEvent::InputType::kInsertFromPaste ||
-       input_type_ == InputEvent::InputType::kInsertReplacementText)) {
+  if (input_type_ == InputEvent::InputType::kInsertFromDrop ||
+      input_type_ == InputEvent::InputType::kInsertFromPaste ||
+      input_type_ == InputEvent::InputType::kInsertReplacementText) {
     return input_event_data_;
   }
   return g_null_atom;
@@ -1262,10 +1261,7 @@
     return;
 
   Position insertion_pos = EndingVisibleSelection().Start();
-  Position placeholder;
-  if (RuntimeEnabledFeatures::RemoveCollapsedPlaceholderEnabled()) {
-    placeholder = ComputePlaceholderToCollapseAt(insertion_pos);
-  }
+  Position placeholder = ComputePlaceholderToCollapseAt(insertion_pos);
 
   // We don't want any of the pasted content to end up nested in a Mail
   // blockquote, so first break out of any surrounding Mail blockquotes. Unless
@@ -1392,7 +1388,14 @@
           split_start = insertion_pos.ComputeContainerNode();
         Node* node_to_split_to =
             SplitTreeToNode(split_start, element_to_split_to->parentNode());
-        insertion_pos = Position::InParentBeforeNode(*node_to_split_to);
+        if (RuntimeEnabledFeatures::
+                ComputeInsertionPositionBasedOnAnchorTypeEnabled() &&
+            (insertion_pos.IsAfterChildren() ||
+             insertion_pos.IsAfterAnchor())) {
+          insertion_pos = Position::InParentAfterNode(*node_to_split_to);
+        } else {
+          insertion_pos = Position::InParentBeforeNode(*node_to_split_to);
+        }
       }
     }
   }
@@ -2130,10 +2133,8 @@
       !fragment.FirstChild()->IsTextNode())
     return false;
 
-  if (RuntimeEnabledFeatures::NonNullInputEventDataForTextAreaEnabled()) {
-    // Save the text to set event data for input events.
-    input_event_data_ = To<Text>(fragment.FirstChild())->data();
-  }
+  // Save the text to set event data for input events.
+  input_event_data_ = To<Text>(fragment.FirstChild())->data();
 
   // FIXME: Would be nice to handle smart replace in the fast path.
   if (smart_replace_ || fragment.HasInterchangeNewlineAtStart() ||
diff --git a/third_party/blink/renderer/core/fetch/fetch_later_util.cc b/third_party/blink/renderer/core/fetch/fetch_later_util.cc
index ca88a18..9f0807e1 100644
--- a/third_party/blink/renderer/core/fetch/fetch_later_util.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_later_util.cc
@@ -7,6 +7,8 @@
 #include "base/check.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
+#include "third_party/blink/public/common/permissions_policy/permissions_policy.h"
+#include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h"
 #include "third_party/blink/renderer/core/execution_context/security_context.h"
 #include "third_party/blink/renderer/core/fetch/fetch_header_list.h"
@@ -16,20 +18,21 @@
 #include "third_party/blink/renderer/core/frame/local_dom_window.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/location.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request_utils.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 
 namespace blink {
 namespace {
 
-// The max containers with minimal quota is 16.
-// https://whatpr.org/fetch/1647.html#max-containers-with-minimal-quota
-constexpr uint32_t kMaxContainersWithMinimalQuota = 16;
+// The max containers with minimal quota.
+constexpr uint32_t kMaxContainersWithMinimalQuota =
+    kQuotaReservedForDeferredFetchMinimal / kMinimalReservedDeferredFetchQuota;
 
-// Converts `policy` to one of possible values of reserved deferred-fetch quota.
-// https://whatpr.org/fetch/1647.html#reserved-deferred-fetch-quota
-uint32_t ToReservedDeferredFetchQuota(FramePolicy::DeferredFetchPolicy policy) {
+}  // namespace
+
+// static
+uint32_t FetchLaterUtil::ToReservedDeferredFetchQuota(
+    FramePolicy::DeferredFetchPolicy policy) {
   switch (policy) {
     case FramePolicy::DeferredFetchPolicy::kDisabled:
       return 0;
@@ -40,9 +43,8 @@
   }
 }
 
-// Tells if the given two frames shares the same origin.
-// https://html.spec.whatwg.org/multipage/browsers.html#same-origin
-bool AreSameOrigin(const Frame* frame_a, const Frame* frame_b) {
+// static
+bool FetchLaterUtil::AreSameOrigin(const Frame* frame_a, const Frame* frame_b) {
   CHECK(frame_a);
   CHECK(frame_b);
 
@@ -50,33 +52,17 @@
       frame_b->GetSecurityContext()->GetSecurityOrigin());
 }
 
-// Calculates the total number of frames according to Step 5 of
-// https://whatpr.org/fetch/1647.html#reserve-deferred-fetch-quota
-//
-// `container_frame` is an iframe to count the result for. Note that it must be
-// an iframe with `PermissionsPolicyFeature::kDeferredFetchMinimal` enabled
-// before calling this function.
-//
-// Example (with default Permissions Policy on every origin):
-//    root (a.com) -> frame-1 (a.com)
-//                 -> frame-2 (a.com)
-//                 -> frame-3 (b.com)
-//                 -> frame-4 (b.com)
-// * `container_frame` cannot be frame-1, frame-2.
-// * When `container_frame` = frame-3 or frame-4, the result is 2.
-uint32_t CountContainersWithReservedMinimalQuota(
-    const FrameOwner* container_frame) {
-  CHECK(container_frame);
+// static
+uint32_t FetchLaterUtil::CountDescendantsWithReservedMinimalQuota(
+    const Frame* control_frame) {
+  CHECK(control_frame);
   uint32_t count = 0;
 
-  // 5. Let containersWithReservedMinimalQuota be container’s node navigable’s
-  // top-level traversable’s descendant navigables
-  auto* top_frame = container_frame->ContentFrame()->Top();
-  CHECK(top_frame);
-  for (const auto* navigable = top_frame; navigable;
-       navigable = navigable->Tree().TraverseNext(top_frame)) {
-    // removing any navigable whose reserved deferred-fetch quota is not minimal
-    // quota.
+  // The size of controlDocument’s node navigable’s descendant navigables:
+  for (const auto* navigable = control_frame->FirstChild(); navigable;
+       navigable = navigable->Tree().TraverseNext(control_frame)) {
+    // removing any navigable whose navigable container’s reserved
+    // deferred-fetch quota is not minimal quota.
     if (auto* navigable_container = navigable->Owner();
         navigable_container &&
         navigable_container->GetFramePolicy().deferred_fetch_policy ==
@@ -88,8 +74,6 @@
   return count;
 }
 
-}  // namespace
-
 bool IsFetchLaterUseDeferredFetchPolicyEnabled() {
   return base::GetFieldTrialParamByFeatureAsBool(
       features::kFetchLaterAPI, "use_deferred_fetch_policy", false);
@@ -108,72 +92,91 @@
   // IsSubframeDeprioritizationEnabled.
 }
 
-FramePolicy::DeferredFetchPolicy GetContainerDeferredFetchPolicyOnNavigation(
-    FrameOwner* container_frame) {
+// static
+Frame* FetchLaterUtil::GetDeferredFetchControlFrame(Frame* frame) {
+  CHECK(frame);
+  // If document’ node navigable’s container document is null or a Document
+  // whose origin is not same origin with document, return document;
+  if (!frame->Parent() || !AreSameOrigin(frame, frame->Parent())) {
+    return frame;
+  }
+
+  // Otherwise return the deferred-fetch control document given document’ node
+  // navigable’s container document.
+  return GetDeferredFetchControlFrame(frame->Parent());
+}
+
+// static
+FramePolicy::DeferredFetchPolicy
+FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+    FrameOwner* container_frame,
+    const KURL& to_url) {
   CHECK(container_frame);
   // Must be called when "inherited policy" is available for container document.
   CHECK(container_frame->ContentFrame());
-  CHECK(container_frame->ContentFrame()->IsLocalFrame());
-  // Called after committing navigation, so the frame must be local.
-  KURL to_url =
-      To<LocalFrame>(container_frame->ContentFrame())->GetDocument()->Url();
   auto to_url_origin = SecurityOrigin::Create(to_url)->ToUrlOrigin();
-  auto* permissions_policy = container_frame->ContentFrame()
-                                 ->GetSecurityContext()
-                                 ->GetPermissionsPolicy();
+  // At this moment, the overall "inherited policies" for `container_frame`'s
+  // features are not yet calculated, which only happens in the call to
+  // `PermissionsPolicy::CreateFromParentPolicy()` made by
+  // `DocumentLoader::CommitNavigation()` .
+  // Hence, we manually trigger calculation for the deferred-fetch features.
+  auto* parent_permissions_policy =
+      container_frame->ContentFrame()->Tree().Parent()
+          ? container_frame->ContentFrame()
+                ->Tree()
+                .Parent()
+                ->GetSecurityContext()
+                ->GetPermissionsPolicy()
+          : nullptr;
+  const auto& feature_list = GetPermissionsPolicyFeatureList(to_url_origin);
+
   // 1. Set container’s reserved deferred-fetch quota to 0.
 
-  // 2. If the inherited policy for "deferred-fetch", container and
+  // 2. Let controlDocument be container’s node document’s deferred-fetch
+  // control document.
+  Frame* control_frame =
+      GetDeferredFetchControlFrame(container_frame->ContentFrame()->Parent());
+
+  // 3. If the "inherited policy" for "deferred-fetch", container and
   // originToNavigateTo is Enabled,
-  // TODO(crbug.com/40276121): and the available deferred fetching quota for
-  // container’s container document is equal or greater than normal quota:
-  if (permissions_policy->IsFeatureEnabledForOrigin(
-          mojom::blink::PermissionsPolicyFeature::kDeferredFetch,
-          to_url_origin)) {
+  // TODO(crbug.com/40276121): and the available deferred-fetch quota for
+  // controlDocument is equal or greater than normal quota:
+  auto deferred_fetch_it =
+      feature_list.find(mojom::blink::PermissionsPolicyFeature::kDeferredFetch);
+  CHECK(deferred_fetch_it != feature_list.end());
+  if (PermissionsPolicy::InheritedValueForFeature(
+          to_url_origin, parent_permissions_policy, *deferred_fetch_it,
+          container_frame->GetFramePolicy().container_policy)) {
     // then set container’s reserved deferred-fetch quota to normal quota and
     // return.
     return FramePolicy::DeferredFetchPolicy::kDeferredFetch;
   }
-  // 3. If the inherited policy for "deferred-fetch-minimal", container and
-  // originToNavigateTo is Disabled:
-  if (!permissions_policy->IsFeatureEnabledForOrigin(
-          mojom::blink::PermissionsPolicyFeature::kDeferredFetchMinimal,
-          to_url_origin)) {
-    // then return.
+
+  // 4. If all of the following conditions are true:
+
+  // 4-1. controlDocument’s node navigable is a top-level traversable.
+  if (!control_frame->IsOutermostMainFrame()) {
     return FramePolicy::DeferredFetchPolicy::kDisabled;
   }
-  // 4. If container’s node document's origin is not same origin with
-  // container’s node navigable’s top-level traversable’s active document’s
-  // origin:
-  if (!AreSameOrigin(container_frame->ContentFrame()->Parent(),
-                     container_frame->ContentFrame()->Top())) {
+  // 4-2. The "inherited policy" for "deferred-fetch-minimal", container and
+  // originToNavigateTo is Enabled.
+  auto deferred_fetch_minimal_it = feature_list.find(
+      mojom::blink::PermissionsPolicyFeature::kDeferredFetchMinimal);
+  CHECK(deferred_fetch_minimal_it != feature_list.end());
+  if (!PermissionsPolicy::InheritedValueForFeature(
+          to_url_origin, parent_permissions_policy, *deferred_fetch_minimal_it,
+          container_frame->GetFramePolicy().container_policy)) {
     // then return.
     return FramePolicy::DeferredFetchPolicy::kDisabled;
   }
 
-  // 5. Let containersWithReservedMinimalQuota be ...
-  // 6. If containersWithReservedMinimalQuota’s size is less than max containers
-  // with minimal quota, then set container’s reserved deferred-fetch quota to
-  // minimal quota.
-  return CountContainersWithReservedMinimalQuota(container_frame) <
+  // 4-3. The size of controlDocument’s ...
+  // is less than quota reserved for deferred-fetch-minimal / minimal quota:
+  // then set container’s reserved deferred-fetch quota to minimal quota.
+  return CountDescendantsWithReservedMinimalQuota(control_frame) <
                  kMaxContainersWithMinimalQuota
              ? FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal
              : FramePolicy::DeferredFetchPolicy::kDisabled;
 }
 
-// For testing only:
-uint32_t ToReservedDeferredFetchQuotaForTesting(
-    FramePolicy::DeferredFetchPolicy policy) {
-  return ToReservedDeferredFetchQuota(policy);
-}
-
-bool AreSameOriginForTesting(const Frame* frame_a, const Frame* frame_b) {
-  return AreSameOrigin(frame_a, frame_b);
-}
-
-uint32_t CountContainersWithReservedMinimalQuotaForTesting(
-    const FrameOwner* container_frame) {
-  return CountContainersWithReservedMinimalQuota(container_frame);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/fetch_later_util.h b/third_party/blink/renderer/core/fetch/fetch_later_util.h
index d08ebff..f10efc2b 100644
--- a/third_party/blink/renderer/core/fetch/fetch_later_util.h
+++ b/third_party/blink/renderer/core/fetch/fetch_later_util.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "base/gtest_prod_util.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
@@ -18,6 +19,7 @@
 namespace blink {
 class Frame;
 class FrameOwner;
+class CountDescendantsWithReservedMinimalQuotaTest;
 
 // The ResourceType of FetchLater requests.
 inline constexpr ResourceType kFetchLaterResourceType = ResourceType::kRaw;
@@ -32,6 +34,10 @@
 // https://whatpr.org/fetch/1647.html#reserved-deferred-fetch-quota-normal-quota
 inline constexpr uint32_t kNormalReservedDeferredFetchQuota = 64 * 1024;
 
+// The quota reserved for deferred-fetch-minimal is 128 kibibytes.
+// https://whatpr.org/fetch/1647.html#quota-reserved-for-deferred-fetch-minimal
+inline constexpr uint32_t kQuotaReservedForDeferredFetchMinimal = 128 * 1024;
+
 // Tells whether the FetchLater API should use subframe deferred fetch
 // policy to decide whether a frame show allow using the API.
 bool CORE_EXPORT IsFetchLaterUseDeferredFetchPolicyEnabled();
@@ -40,27 +46,79 @@
 ResourceLoadPriority CORE_EXPORT
 ComputeFetchLaterLoadPriority(const FetchParameters& params);
 
-// Determines the deferred fetch policy of a navigable container
-// `container_frame`, e.g. iframe, when it navigates its content to a target
-// URL, by the following algorithm:
-// https://whatpr.org/fetch/1647.html#reserve-deferred-fetch-quota
-// `container_frame` is a FrameOwner on navigation, i.e. an iframe.
-// Returns an enum that can be mapped to a "reserved deferred-fetch quota" by
-// calling `ToReservedDeferredFetchQuota()`.
-//
-// This must be called after "inherited policy" for `container_frame` is
-// available, i.e. after `PermissionsPolicy::CreateFromParentPolicy()` is
-// already executed.
-FramePolicy::DeferredFetchPolicy CORE_EXPORT
-GetContainerDeferredFetchPolicyOnNavigation(FrameOwner* container_frame);
+class CORE_EXPORT FetchLaterUtil {
+ public:
+  // Determines the deferred fetch policy of a navigable container
+  // `container_frame`, e.g. iframe, when it begins to navigate its content to a
+  // target URL `to_url` by the following algorithm:
+  // https://whatpr.org/fetch/1647.html#reserve-deferred-fetch-quota
+  //
+  // `container_frame` is a FrameOwner, i.e. an iframe, on navigation.
+  // `to_url` is the target URL the iframe is navigating to.
+  //
+  // Returns an enum that can be mapped to a "reserved deferred-fetch quota" by
+  // calling `ToReservedDeferredFetchQuota()`.
+  //
+  // This must be called during "Beginning navigation" as described in
+  // https://whatpr.org/html/10903/d1c086a...0e0afb3/browsing-the-web.html#beginning-navigation
+  static FramePolicy::DeferredFetchPolicy
+  GetContainerDeferredFetchPolicyOnNavigation(FrameOwner* container_frame,
+                                              const KURL& to_url);
 
-// For testing only:
-uint32_t CORE_EXPORT
-ToReservedDeferredFetchQuotaForTesting(FramePolicy::DeferredFetchPolicy policy);
-bool CORE_EXPORT AreSameOriginForTesting(const Frame* frame_a,
-                                         const Frame* frame_b);
-uint32_t CORE_EXPORT CountContainersWithReservedMinimalQuotaForTesting(
-    const FrameOwner* container_frame);
+  // Returns the "deferred-fetch control document" for the given `frame`.
+  // https://whatpr.org/fetch/1647.html#deferred-fetch-control-document
+  //
+  // `frame` is the node navigable of a Document to query for.
+  // The returned is also a node navigable of the control document for `frame`.
+  static Frame* GetDeferredFetchControlFrame(Frame* frame);
+
+ private:
+  friend class CountDescendantsWithReservedMinimalQuotaTest;
+  FRIEND_TEST_ALL_PREFIXES(AreSameOriginTest,
+                           MultipleDifferentOriginSiblingFrames);
+  FRIEND_TEST_ALL_PREFIXES(AreSameOriginTest, MultipleLevelFrames);
+
+  FRIEND_TEST_ALL_PREFIXES(CountDescendantsWithReservedMinimalQuotaTest,
+                           SingleCrossOriginFrame);
+  FRIEND_TEST_ALL_PREFIXES(CountDescendantsWithReservedMinimalQuotaTest,
+                           MultipleDifferentOriginSiblingFrames);
+  FRIEND_TEST_ALL_PREFIXES(CountDescendantsWithReservedMinimalQuotaTest,
+                           MultipleLevelFrames);
+
+  FRIEND_TEST_ALL_PREFIXES(ToReservedDeferredFetchQuotaTest, PolicyDisabled);
+  FRIEND_TEST_ALL_PREFIXES(ToReservedDeferredFetchQuotaTest,
+                           PolicyDeferredFetch);
+  FRIEND_TEST_ALL_PREFIXES(ToReservedDeferredFetchQuotaTest,
+                           PolicyDeferredFetchMinimal);
+
+  // Converts `policy` to one of possible values of reserved deferred-fetch
+  // quota.
+  // https://whatpr.org/fetch/1647.html#reserved-deferred-fetch-quota
+  static uint32_t ToReservedDeferredFetchQuota(
+      FramePolicy::DeferredFetchPolicy policy);
+
+  // Tells if the given two frames shares the same origin.
+  // https://html.spec.whatwg.org/multipage/browsers.html#same-origin
+  static bool AreSameOrigin(const Frame* frame_a, const Frame* frame_b);
+
+  // Calculates the total number of descendant frames according to Step 4 of
+  // https://whatpr.org/fetch/1647.html#reserve-deferred-fetch-quota
+  //
+  // `control_frame` is a frame to count the result for. It should be
+  // obtained by calling `GetDeferredFetchControlFrame()`. Note that it must
+  // be an iframe with `PermissionsPolicyFeature::kDeferredFetchMinimal` enabled
+  // before calling this function.
+  //
+  // Example (with default Permissions Policy on every origin):
+  //    root (a.com) -> frame-1 (a.com)
+  //                 -> frame-2 (a.com)
+  //                 -> frame-3 (b.com)
+  //                 -> frame-4 (b.com)
+  // * `control_frame` cannot be frame-1, frame-2.
+  // * When `control_frame` = frame-3 or frame-4, the result is 2.
+  static uint32_t CountDescendantsWithReservedMinimalQuota(
+      const Frame* control_frame);
+};
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/fetch/fetch_later_util_test.cc b/third_party/blink/renderer/core/fetch/fetch_later_util_test.cc
index dbbb0d38..98cb1650 100644
--- a/third_party/blink/renderer/core/fetch/fetch_later_util_test.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_later_util_test.cc
@@ -30,7 +30,6 @@
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
-namespace {
 
 const KURL GetSourcePageURL(const String& relative_url) {
   static const String kSourcePageURL = "https://example.com";
@@ -174,26 +173,30 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-class CountContainersWithReservedMinimalQuotaTest
+class CountDescendantsWithReservedMinimalQuotaTest
     : public DeferredFetchPolicyTestBase {
  protected:
-  [[nodiscard]] static size_t CountContainersWithReservedMinimalQuotaFor(
+  [[nodiscard]] static size_t CountDescendantsWithReservedMinimalQuotaFor(
       Frame* target_frame) {
     // Should only be called by content of an iframe.
     CHECK(target_frame->Owner());
     // Should not be called by frame without permissions policy
     // `deferred-fetch-minimal`.
     CheckFrameEnableDeferredFetchMinimal(target_frame);
+    // Let controlDocument be container’s node document’s deferred-fetch control
+    // document.
+    auto* control_frame =
+        FetchLaterUtil::GetDeferredFetchControlFrame(target_frame->Parent());
 
-    return CountContainersWithReservedMinimalQuotaForTesting(
-        target_frame->Owner());
+    return FetchLaterUtil::CountDescendantsWithReservedMinimalQuota(
+        control_frame);
   }
 };
 
 // The single cross-origin iframe has default `deferred-fetch-minimal` policy
 // enabled `*`. However, there is no other cross-origin iframe shares this quota
 // with it.
-TEST_F(CountContainersWithReservedMinimalQuotaTest, SingleCrossOriginFrame) {
+TEST_F(CountDescendantsWithReservedMinimalQuotaTest, SingleCrossOriginFrame) {
   // The structure of the document:
   // root -> frame_a (cross-origin)
   String root_url = kMainUrl;
@@ -204,10 +207,10 @@
   auto* frame_a = root->Tree().FirstChild();
 
   // Expects only `frame_a` share the minimal quota policy.
-  EXPECT_EQ(CountContainersWithReservedMinimalQuotaFor(frame_a), 1u);
+  EXPECT_EQ(CountDescendantsWithReservedMinimalQuotaFor(frame_a), 1u);
 }
 
-TEST_F(CountContainersWithReservedMinimalQuotaTest,
+TEST_F(CountDescendantsWithReservedMinimalQuotaTest,
        MultipleDifferentOriginSiblingFrames) {
   // The structure of the document:
   // root -> frame_a (same-origin)
@@ -236,15 +239,15 @@
 
   // Frame A and Frame B are same-origin with root and are not counted toward
   // minimal quota policy. Hence, they cannot be used in
-  // `CountContainersWithReservedMinimalQuotaFor()`.
+  // `CountDescendantsWithReservedMinimalQuotaFor()`.
 
   // Frame C and D are different origin with root, and shares the minimal quota
   // policy with each other.
-  EXPECT_EQ(CountContainersWithReservedMinimalQuotaFor(frame_c), 2u);
-  EXPECT_EQ(CountContainersWithReservedMinimalQuotaFor(frame_d), 2u);
+  EXPECT_EQ(CountDescendantsWithReservedMinimalQuotaFor(frame_c), 2u);
+  EXPECT_EQ(CountDescendantsWithReservedMinimalQuotaFor(frame_d), 2u);
 }
 
-TEST_F(CountContainersWithReservedMinimalQuotaTest, MultipleLevelFrames) {
+TEST_F(CountDescendantsWithReservedMinimalQuotaTest, MultipleLevelFrames) {
   // The structure of the document:
   // root -> frame_a (same-origin) -> frame_c (cross-origin)
   //      -> frame_d (cross-origin) -> frame_b (same-origin)
@@ -267,12 +270,12 @@
 
   // Frame A and Frame B are same-origin with root and are not counted toward
   // minimal quota policy. Hence, they cannot be used in
-  // `CountContainersWithReservedMinimalQuotaFor()`.
+  // `CountDescendantsWithReservedMinimalQuotaFor()`.
 
   // Frame C and D are different origin with root, and shares the minimal quota
   // policy with each other.
-  EXPECT_EQ(CountContainersWithReservedMinimalQuotaFor(frame_c), 2u);
-  EXPECT_EQ(CountContainersWithReservedMinimalQuotaFor(frame_d), 2u);
+  EXPECT_EQ(CountDescendantsWithReservedMinimalQuotaFor(frame_c), 2u);
+  EXPECT_EQ(CountDescendantsWithReservedMinimalQuotaFor(frame_d), 2u);
 }
 
 using GetContainerDeferredFetchPolicyOnNavigationTest =
@@ -297,7 +300,8 @@
   // when iframe is loaded.
   EXPECT_EQ(frame_a->Owner()->GetFramePolicy().deferred_fetch_policy,
             FramePolicy::DeferredFetchPolicy::kDeferredFetch);
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_a->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_a->Owner(), KURL(frame_a_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetch);
 }
 
@@ -318,7 +322,8 @@
   auto* root = GetMainFrame();
   auto* frame_a = root->Tree().FirstChild();
 
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_a->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_a->Owner(), KURL(frame_a_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal);
 }
 
@@ -349,15 +354,19 @@
   auto* frame_c = frame_b->Tree().NextSibling();
   auto* frame_d = frame_c->Tree().NextSibling();
 
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_a->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_a->Owner(), KURL(frame_a_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetch);
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_b->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_b->Owner(), KURL(frame_b_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetch);
 
   // Frame C and Frame D should have minimal quota policy set.
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_c->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_c->Owner(), KURL(frame_c_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal);
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_d->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_d->Owner(), KURL(frame_d_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal);
 }
 
@@ -383,20 +392,24 @@
   auto* frame_c = frame_a->Tree().FirstChild();
   auto* frame_b = frame_d->Tree().FirstChild();
 
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_a->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_a->Owner(), KURL(frame_a_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetch);
   // Frame B will have NO quota, as
   // (1) its "inherited policy" from its parent Frame D, which is a cross-origin
   // iframe, will not have "deferred-fetch" policy enabled by default but only
   // "deferred-fetch-minimal".
   // (2) its parent Frame D does not share same quota with root frame.
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_b->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_b->Owner(), KURL(frame_b_url)),
             FramePolicy::DeferredFetchPolicy::kDisabled);
 
   // Frame C and Frame D should have minimal quota policy set.
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_c->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_c->Owner(), KURL(frame_c_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal);
-  EXPECT_EQ(GetContainerDeferredFetchPolicyOnNavigation(frame_d->Owner()),
+  EXPECT_EQ(FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(
+                frame_d->Owner(), KURL(frame_d_url)),
             FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal);
 }
 
@@ -440,31 +453,129 @@
       << i + 1 << "-th cross-origin iframe";
 }
 
-using ToReservedDeferredFetchQuotaTest = DeferredFetchPolicyTestBase;
+class GetDeferredFetchControlFrameTest : public DeferredFetchPolicyTestBase {};
+
+TEST_F(GetDeferredFetchControlFrameTest, SingleDocument) {
+  auto new_request_url = KURL(kMainUrl + "test.html");
+  NavigateTo(kMainUrl, "");
+
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(GetMainFrame()),
+            GetMainFrame());
+}
+
+TEST_F(GetDeferredFetchControlFrameTest, SingleSameOriginFrame) {
+  auto new_request_url = KURL(kMainUrl + "test.html");
+  // The structure of the document:
+  // root -> frame_a (same-origin)
+  String root_url = kMainUrl;
+  String frame_a_url = kMainUrl + "frame-a.html";
+
+  NavigateTo(root_url, RenderWithIframes({frame_a_url}), {{frame_a_url, ""}});
+
+  auto* root = GetMainFrame();
+  auto* frame_a = root->Tree().FirstChild();
+
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(root), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_a), root);
+}
+
+TEST_F(GetDeferredFetchControlFrameTest, SingleCrossOriginFrame) {
+  // The structure of the document:
+  // root -> frame_a (cross-origin)
+  String root_url = kMainUrl;
+  String frame_a_url = kCrossSubdomainUrl + "frame-a.html";
+  NavigateTo(root_url, RenderWithIframes({frame_a_url}), {{frame_a_url, ""}});
+
+  auto* root = GetMainFrame();
+  auto* frame_a = root->Tree().FirstChild();
+
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(root), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_a), frame_a);
+}
+
+TEST_F(GetDeferredFetchControlFrameTest, MultipleDifferentOriginSiblingFrames) {
+  // The structure of the document:
+  // root -> frame_a (same-origin)
+  //      -> frame_b (same-origin)
+  //      -> frame_c (cross-origin)
+  //      -> frame_d (cross-origin)
+  String root_url = kMainUrl;
+  String frame_a_url = kMainUrl + "frame-a.html";
+  String frame_b_url = kMainUrl + "frame-b.html";
+  String frame_c_url = kCrossSubdomainUrl + "frame-c.html";
+  String frame_d_url = kCrossSubdomainUrl + "frame-d.html";
+
+  NavigateTo(root_url,
+             RenderWithIframes(
+                 {"frame-a.html", frame_b_url, frame_c_url, frame_d_url}),
+             {{frame_a_url, ""},
+              {frame_b_url, ""},
+              {frame_c_url, ""},
+              {frame_d_url, ""}});
+
+  auto* root = GetMainFrame();
+  auto* frame_a = root->Tree().FirstChild();
+  auto* frame_b = frame_a->Tree().NextSibling();
+  auto* frame_c = frame_b->Tree().NextSibling();
+  auto* frame_d = frame_c->Tree().NextSibling();
+
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(root), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_a), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_b), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_c), frame_c);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_d), frame_d);
+}
+
+TEST_F(GetDeferredFetchControlFrameTest, MultipleLevelFrames) {
+  // The structure of the document:
+  // root -> frame_a (same-origin) -> frame_c (cross-origin)
+  //      -> frame_d (cross-origin) -> frame_b (same-origin)
+  String root_url = kMainUrl;
+  String frame_a_url = kMainUrl + "frame-a.html";
+  String frame_b_url = kMainUrl + "frame-b.html";
+  String frame_c_url = kCrossSubdomainUrl + "frame-c.html";
+  String frame_d_url = kCrossSubdomainUrl + "frame-d.html";
+
+  NavigateTo(root_url, RenderWithIframes({"frame-a.html", frame_d_url}),
+             {{frame_a_url, RenderWithIframes({frame_c_url})},
+              {frame_d_url, RenderWithIframes({frame_b_url})},
+              {frame_c_url, ""},
+              {frame_b_url, ""}});
+
+  auto* root = GetMainFrame();
+  auto* frame_a = root->Tree().FirstChild();
+  auto* frame_d = frame_a->Tree().NextSibling();
+  auto* frame_c = frame_a->Tree().FirstChild();
+  auto* frame_b = frame_d->Tree().FirstChild();
+
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(root), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_a), root);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_b), frame_b);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_c), frame_c);
+  EXPECT_EQ(FetchLaterUtil::GetDeferredFetchControlFrame(frame_d), frame_d);
+}
+
+class ToReservedDeferredFetchQuotaTest : public DeferredFetchPolicyTestBase {};
 
 TEST_F(ToReservedDeferredFetchQuotaTest, PolicyDisabled) {
-  EXPECT_EQ(ToReservedDeferredFetchQuotaForTesting(
+  EXPECT_EQ(FetchLaterUtil::ToReservedDeferredFetchQuota(
                 FramePolicy::DeferredFetchPolicy::kDisabled),
             0u);
 }
 
 TEST_F(ToReservedDeferredFetchQuotaTest, PolicyDeferredFetch) {
-  EXPECT_EQ(ToReservedDeferredFetchQuotaForTesting(
+  EXPECT_EQ(FetchLaterUtil::ToReservedDeferredFetchQuota(
                 FramePolicy::DeferredFetchPolicy::kDeferredFetch),
             kNormalReservedDeferredFetchQuota);
 }
 
 TEST_F(ToReservedDeferredFetchQuotaTest, PolicyDeferredFetchMinimal) {
-  EXPECT_EQ(ToReservedDeferredFetchQuotaForTesting(
+  EXPECT_EQ(FetchLaterUtil::ToReservedDeferredFetchQuota(
                 FramePolicy::DeferredFetchPolicy::kDeferredFetchMinimal),
             kMinimalReservedDeferredFetchQuota);
 }
 
 class AreSameOriginTest : public DeferredFetchPolicyTestBase {
- protected:
-  [[nodiscard]] static bool AreSameOrigin(Frame* frame_a, Frame* frame_b) {
-    return AreSameOriginForTesting(frame_a, frame_b);
-  }
 };
 
 TEST_F(AreSameOriginTest, MultipleDifferentOriginSiblingFrames) {
@@ -494,24 +605,24 @@
   auto* frame_d = frame_c->Tree().NextSibling();
 
   // Root, Frame A and Frame B are same-origin.
-  EXPECT_TRUE(AreSameOrigin(root, frame_a));
-  EXPECT_TRUE(AreSameOrigin(frame_a, root));
-  EXPECT_TRUE(AreSameOrigin(root, frame_b));
-  EXPECT_TRUE(AreSameOrigin(frame_b, root));
-  EXPECT_TRUE(AreSameOrigin(frame_a, frame_b));
-  EXPECT_TRUE(AreSameOrigin(frame_b, frame_a));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(root, frame_a));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_a, root));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(root, frame_b));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_b, root));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_a, frame_b));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_b, frame_a));
 
   // Frame C and D are different origin with root, and shares the minimal quota
   // policy with each other.
-  EXPECT_TRUE(AreSameOrigin(frame_c, frame_d));
-  EXPECT_TRUE(AreSameOrigin(frame_d, frame_c));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_c, frame_d));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_d, frame_c));
 
-  EXPECT_FALSE(AreSameOrigin(root, frame_c));
-  EXPECT_FALSE(AreSameOrigin(root, frame_d));
-  EXPECT_FALSE(AreSameOrigin(frame_a, frame_c));
-  EXPECT_FALSE(AreSameOrigin(frame_a, frame_d));
-  EXPECT_FALSE(AreSameOrigin(frame_b, frame_c));
-  EXPECT_FALSE(AreSameOrigin(frame_b, frame_d));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(root, frame_c));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(root, frame_d));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_a, frame_c));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_a, frame_d));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_b, frame_c));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_b, frame_d));
 }
 
 TEST_F(AreSameOriginTest, MultipleLevelFrames) {
@@ -537,25 +648,24 @@
   auto* frame_b = frame_d->Tree().FirstChild();
 
   // Root, Frame A and Frame B are same-origin.
-  EXPECT_TRUE(AreSameOrigin(root, frame_a));
-  EXPECT_TRUE(AreSameOrigin(frame_a, root));
-  EXPECT_TRUE(AreSameOrigin(root, frame_b));
-  EXPECT_TRUE(AreSameOrigin(frame_b, root));
-  EXPECT_TRUE(AreSameOrigin(frame_a, frame_b));
-  EXPECT_TRUE(AreSameOrigin(frame_b, frame_a));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(root, frame_a));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_a, root));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(root, frame_b));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_b, root));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_a, frame_b));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_b, frame_a));
 
   // Frame C and D are different origin with root, and shares the minimal quota
   // policy with each other.
-  EXPECT_TRUE(AreSameOrigin(frame_c, frame_d));
-  EXPECT_TRUE(AreSameOrigin(frame_d, frame_c));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_c, frame_d));
+  EXPECT_TRUE(FetchLaterUtil::AreSameOrigin(frame_d, frame_c));
 
-  EXPECT_FALSE(AreSameOrigin(root, frame_c));
-  EXPECT_FALSE(AreSameOrigin(root, frame_d));
-  EXPECT_FALSE(AreSameOrigin(frame_a, frame_c));
-  EXPECT_FALSE(AreSameOrigin(frame_a, frame_d));
-  EXPECT_FALSE(AreSameOrigin(frame_b, frame_c));
-  EXPECT_FALSE(AreSameOrigin(frame_b, frame_d));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(root, frame_c));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(root, frame_d));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_a, frame_c));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_a, frame_d));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_b, frame_c));
+  EXPECT_FALSE(FetchLaterUtil::AreSameOrigin(frame_b, frame_d));
 }
 
-}  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/request.cc b/third_party/blink/renderer/core/fetch/request.cc
index e1db724..fcbd1a9 100644
--- a/third_party/blink/renderer/core/fetch/request.cc
+++ b/third_party/blink/renderer/core/fetch/request.cc
@@ -1257,24 +1257,6 @@
   return result;
 }
 
-mojom::blink::RequestContextType Request::GetRequestContextType() const {
-  if (!request_) {
-    return mojom::blink::RequestContextType::UNSPECIFIED;
-  }
-  return mojom::blink::RequestContextType::FETCH;
-}
-
-network::mojom::RequestDestination Request::GetRequestDestination() const {
-  if (!request_) {
-    return network::mojom::RequestDestination::kEmpty;
-  }
-  return request_->Destination();
-}
-
-network::mojom::RequestMode Request::GetRequestMode() const {
-  return request_->Mode();
-}
-
 void Request::Trace(Visitor* visitor) const {
   ScriptWrappable::Trace(visitor);
   Body::Trace(visitor);
diff --git a/third_party/blink/renderer/core/fetch/request.h b/third_party/blink/renderer/core/fetch/request.h
index 42546c6..d3d67f6 100644
--- a/third_party/blink/renderer/core/fetch/request.h
+++ b/third_party/blink/renderer/core/fetch/request.h
@@ -104,9 +104,6 @@
     return request_->Buffer();
   }
   uint64_t BodyBufferByteLength() const { return request_->BufferByteLength(); }
-  mojom::blink::RequestContextType GetRequestContextType() const;
-  network::mojom::RequestDestination GetRequestDestination() const;
-  network::mojom::RequestMode GetRequestMode() const;
 
   void Trace(Visitor*) const override;
 
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
index ba35212..828cb0e 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
@@ -183,7 +183,8 @@
       // try a passthrough provider.
       DCHECK(LowLatencyEnabled());
       provider = CanvasResourceProvider::CreatePassThroughProvider(
-          Size(), sk_color_type, alpha_type, sk_color_space,
+          Size(), sk_color_type, alpha_type,
+          SkColorSpaceToGfxColorSpace(sk_color_space),
           SharedGpuContext::ContextProviderWrapper(), this);
     }
     if (!provider) {
@@ -198,7 +199,8 @@
             gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
       }
       provider = CanvasResourceProvider::CreateSharedImageProvider(
-          Size(), sk_color_type, alpha_type, sk_color_space, kShouldInitialize,
+          Size(), sk_color_type, alpha_type,
+          SkColorSpaceToGfxColorSpace(sk_color_space), kShouldInitialize,
           SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
           shared_image_usage_flags, this);
     }
@@ -213,7 +215,8 @@
       shared_image_usage_flags |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
     }
     provider = CanvasResourceProvider::CreateSharedImageProvider(
-        Size(), sk_color_type, alpha_type, sk_color_space, kShouldInitialize,
+        Size(), sk_color_type, alpha_type,
+        SkColorSpaceToGfxColorSpace(sk_color_space), kShouldInitialize,
         SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
         shared_image_usage_flags, this);
   }
@@ -286,7 +289,8 @@
             gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
       }
       provider = CanvasResourceProvider::CreateSharedImageProvider(
-          Size(), sk_color_type, alpha_type, sk_color_space, kShouldInitialize,
+          Size(), sk_color_type, alpha_type,
+          SkColorSpaceToGfxColorSpace(sk_color_space), kShouldInitialize,
           SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
           shared_image_usage_flags, this);
     }
@@ -301,7 +305,8 @@
       shared_image_usage_flags |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
     }
     provider = CanvasResourceProvider::CreateSharedImageProvider(
-        Size(), sk_color_type, alpha_type, sk_color_space, kShouldInitialize,
+        Size(), sk_color_type, alpha_type,
+        SkColorSpaceToGfxColorSpace(sk_color_space), kShouldInitialize,
         SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
         shared_image_usage_flags, this);
   } else if (SharedGpuContext::MaySupportImageChromium() &&
@@ -309,7 +314,8 @@
     const gpu::SharedImageUsageSet shared_image_usage_flags =
         gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_SCANOUT;
     provider = CanvasResourceProvider::CreateSharedImageProvider(
-        Size(), sk_color_type, alpha_type, sk_color_space, kShouldInitialize,
+        Size(), sk_color_type, alpha_type,
+        SkColorSpaceToGfxColorSpace(sk_color_space), kShouldInitialize,
         SharedGpuContext::ContextProviderWrapper(), RasterMode::kCPU,
         shared_image_usage_flags, this);
   }
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index 72030df1..ac529c9 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -426,12 +426,12 @@
   }
 }
 
-void HTMLFrameOwnerElement::UpdateDeferredFetchPolicy() {
+void HTMLFrameOwnerElement::UpdateDeferredFetchPolicy(const KURL& to_url) {
   if (!IsFetchLaterUseDeferredFetchPolicyEnabled()) {
     return;
   }
   frame_policy_.deferred_fetch_policy =
-      GetContainerDeferredFetchPolicyOnNavigation(this);
+      FetchLaterUtil::GetContainerDeferredFetchPolicyOnNavigation(this, to_url);
 
   if (ContentFrame()) {
     auto* frame = GetDocument().GetFrame();
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.h b/third_party/blink/renderer/core/html/html_frame_owner_element.h
index ee4d0941..0d908c2 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.h
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.h
@@ -140,11 +140,10 @@
 
   // Updates the deferred fetch policy and notify the frame loader client of any
   // changes after `LoadOrRedirectSubframe()` is called and navigating to
-  // a target URL.
-  // Must be called after navigation such that "inherited policy" is available.
-  // To be precise, after `ApplyPermissionsPolicy()` is called by
-  // `DocumentLoader::CommitNavigation()`.
-  void UpdateDeferredFetchPolicy();
+  // a target URL `to_url`.
+  // Must be called during the "Beginning navigation" algorithm as described in
+  // https://whatpr.org/html/10903/d1c086a...0e0afb3/browsing-the-web.html#beginning-navigation
+  void UpdateDeferredFetchPolicy(const KURL& to_url);
 
   void CancelPendingLazyLoad();
 
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
index 6909d96a..38752263 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
@@ -260,8 +260,9 @@
       SharedGpuContext::ContextProviderWrapper();
   auto resource_provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(100, 100), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(), CanvasResourceProvider::ShouldInitialize::kNo,
-      context_provider_wrapper, RasterMode::kGPU, gpu::SharedImageUsageSet());
+      gfx::ColorSpace::CreateSRGB(),
+      CanvasResourceProvider::ShouldInitialize::kNo, context_provider_wrapper,
+      RasterMode::kGPU, gpu::SharedImageUsageSet());
 
   scoped_refptr<StaticBitmapImage> bitmap =
       resource_provider->Snapshot(FlushReason::kTesting);
diff --git a/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator.cc b/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator.cc
index 10e2108..691faf6 100644
--- a/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator.cc
+++ b/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator.h"
 
 #include "base/containers/span.h"
diff --git a/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator_test.cc b/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator_test.cc
index e748d13..5282993 100644
--- a/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator_test.cc
+++ b/third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator_test.cc
@@ -2,13 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "third_party/blink/renderer/core/lcp_critical_path_predictor/element_locator.h"
 
+#include <string_view>
+
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element_traversal.h"
@@ -86,8 +83,8 @@
  public:
   struct Expectation {
     enum class Type { kStartTag, kEndTag } type = Type::kStartTag;
-    const char* tag_name;
-    const char* id_attr = nullptr;
+    const std::string_view tag_name;
+    const std::string_view id_attr;
     bool should_match = false;
   };
   static const auto kEndTag = Expectation::Type::kEndTag;
@@ -97,26 +94,26 @@
     size_t i = 0;
     for (const Expectation& exp : exps) {
       SCOPED_TRACE(testing::Message() << "expectation index = " << i);
-      AtomicString tag_name(exp.tag_name);
+      AtomicString tag_name = AtomicString::FromUTF8(exp.tag_name);
       EXPECT_TRUE(tag_name.Impl()->IsStatic());
 
       switch (exp.type) {
         case Expectation::Type::kStartTag: {
           HTMLToken token;
           {
-            const char* c = exp.tag_name;
-            token.BeginStartTag(static_cast<LChar>(*c++));
-            for (; *c != 0; ++c) {
-              token.AppendToName(static_cast<UChar>(*c));
+            auto it = exp.tag_name.begin();
+            token.BeginStartTag(static_cast<LChar>(*it++));
+            for (; it != exp.tag_name.end(); ++it) {
+              token.AppendToName(static_cast<UChar>(*it));
             }
           }
 
-          if (exp.id_attr) {
+          if (!exp.id_attr.empty()) {
             token.AddNewAttribute('i');
             token.AppendToAttributeName('d');
 
-            for (const char* c = exp.id_attr; *c != 0; ++c) {
-              token.AppendToAttributeValue(static_cast<LChar>(*c));
+            for (char it : exp.id_attr) {
+              token.AppendToAttributeValue(static_cast<LChar>(it));
             }
           }
 
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index f4d01820..322b7ce 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -2209,10 +2209,6 @@
   if (commit_reason_ != CommitReason::kRegular)
     return;
 
-  if (auto* owner = DynamicTo<HTMLFrameOwnerElement>(frame_->Owner()); owner) {
-    owner->UpdateDeferredFetchPolicy();
-  }
-
   // When committing a new document, the FrameScheduler might need to carry over
   // the previous document's FrameScheduler's `UnreportedTaskTime()`, as that
   // value should be aggregated across all documents that ever committed in the
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index fa6abfc0..177938b 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -71,6 +71,7 @@
 #include "third_party/blink/renderer/core/dom/ignore_opens_during_unload_count_incrementer.h"
 #include "third_party/blink/renderer/core/events/page_transition_event.h"
 #include "third_party/blink/renderer/core/exported/web_plugin_container_impl.h"
+#include "third_party/blink/renderer/core/fetch/fetch_later_util.h"
 #include "third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/frame/csp/csp_source.h"
@@ -858,6 +859,17 @@
     }
   }
 
+  // https://whatpr.org/html/10903/d1c086a...0e0afb3/browsing-the-web.html#beginning-navigation
+  // If sourceDocument is navigable's container document, then reserve deferred
+  // fetch quota for navigable's container given url's origin.
+  if (IsFetchLaterUseDeferredFetchPolicyEnabled() && origin_window &&
+      origin_window->GetFrame() == frame_->Parent()) {
+    if (auto* owner = DynamicTo<HTMLFrameOwnerElement>(frame_->Owner());
+        owner) {
+      owner->UpdateDeferredFetchPolicy(url);
+    }
+  }
+
   if (frame_->IsMainFrame())
     LocalFrame::ConsumeTransientUserActivation(frame_);
 
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
index 359a0d1..d6b1c6eb7 100644
--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
@@ -558,7 +558,8 @@
   const sk_sp<SkColorSpace> sk_color_space = GetRenderingContextSkColorSpace();
   if (use_shared_image) {
     provider = CanvasResourceProvider::CreateSharedImageProvider(
-        Size(), sk_color_type, alpha_type, sk_color_space,
+        Size(), sk_color_type, alpha_type,
+        SkColorSpaceToGfxColorSpace(sk_color_space),
         CanvasResourceProvider::ShouldInitialize::kCallClear,
         SharedGpuContext::ContextProviderWrapper(),
         can_use_gpu ? RasterMode::kGPU : RasterMode::kCPU,
diff --git a/third_party/blink/renderer/core/page/drag_image.cc b/third_party/blink/renderer/core/page/drag_image.cc
index d14ef94..d327822 100644
--- a/third_party/blink/renderer/core/page/drag_image.cc
+++ b/third_party/blink/renderer/core/page/drag_image.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
 #include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
+#include "third_party/blink/renderer/platform/text/bidi_paragraph.h"
 #include "third_party/blink/renderer/platform/text/text_run.h"
 #include "third_party/blink/renderer/platform/transforms/affine_transform.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
@@ -246,8 +247,7 @@
         label, image_size.width() - (kDragLabelBorderX * 2.0f), label_font);
   }
 
-  TextRun text_run(label);
-  text_run.SetDirectionFromText();
+  TextRun text_run(label, BidiParagraph::BaseDirectionForStringOrLtr(label));
   gfx::Point text_pos(
       kDragLabelBorderX,
       kDragLabelBorderY + label_font.GetFontDescription().ComputedPixelSize());
diff --git a/third_party/blink/renderer/modules/ai/model_execution_responder.cc b/third_party/blink/renderer/modules/ai/model_execution_responder.cc
index 2de076e..12d74f3 100644
--- a/third_party/blink/renderer/modules/ai/model_execution_responder.cc
+++ b/third_party/blink/renderer/modules/ai/model_execution_responder.cc
@@ -79,12 +79,23 @@
   }
 
   // `mojom::blink::ModelStreamingResponder` implementation.
-  void OnStreaming(const String& text) override {
+  void OnStreaming(
+      const String& text,
+      mojom::blink::ModelStreamingResponderAction action) override {
     RecordResponseStatusMetrics(
         mojom::blink::ModelStreamingResponseStatus::kOngoing);
     response_callback_count_++;
     // Update the response with the latest value.
-    response_ = response_ + text;
+    switch (action) {
+      case mojom::blink::ModelStreamingResponderAction::kAppend: {
+        response_ = response_ + text;
+        break;
+      }
+      case mojom::blink::ModelStreamingResponderAction::kReplace: {
+        response_ = text;
+        break;
+      }
+    }
   }
 
   void OnCompletion(
@@ -237,8 +248,8 @@
 
   // `blink::mojom::blink::ModelStreamingResponder` implementation.
   void OnStreaming(
-
-      const String& text) override {
+      const String& text,
+      mojom::blink::ModelStreamingResponderAction action) override {
     RecordResponseStatusMetrics(
         mojom::blink::ModelStreamingResponseStatus::kOngoing);
     // Update the response info and enqueue the latest response.
diff --git a/third_party/blink/renderer/modules/ai/model_execution_responder_test.cc b/third_party/blink/renderer/modules/ai/model_execution_responder_test.cc
index 7a57a75c..f58af01 100644
--- a/third_party/blink/renderer/modules/ai/model_execution_responder_test.cc
+++ b/third_party/blink/renderer/modules/ai/model_execution_responder_test.cc
@@ -82,7 +82,10 @@
   mojo::Remote<blink::mojom::blink::ModelStreamingResponder> responder(
       std::move(pending_remote));
   responder.set_disconnect_handler(disconnect_runloop.QuitClosure());
-  responder->OnStreaming("result");
+  responder->OnStreaming("a",
+                         mojom::blink::ModelStreamingResponderAction::kReplace);
+  responder->OnStreaming("ab",
+                         mojom::blink::ModelStreamingResponderAction::kReplace);
   responder->OnContextOverflow();
   responder->OnCompletion(
       mojom::blink::ModelExecutionContextInfo::New(kTestTokenNumber));
@@ -91,8 +94,59 @@
   tester.WaitUntilSettled();
   EXPECT_TRUE(tester.IsFulfilled());
   EXPECT_TRUE(tester.Value().V8Value()->IsString());
-  EXPECT_EQ("result", ToCoreString(scope.GetIsolate(),
-                                   tester.Value().V8Value().As<v8::String>()));
+  EXPECT_EQ("ab", ToCoreString(scope.GetIsolate(),
+                               tester.Value().V8Value().As<v8::String>()));
+
+  // Check that the complete and overflow callback is run.
+  complete_runloop.Run();
+  overflow_runloop.Run();
+  // Check that the Mojo handle will be disconnected.
+  disconnect_runloop.Run();
+}
+
+TEST(CreateModelExecutionResponder, ChunkByChunk) {
+  uint64_t kTestTokenNumber = 1u;
+  test::TaskEnvironment task_environment;
+  V8TestingScope scope;
+  ScriptState* script_state = scope.GetScriptState();
+  auto* resolver =
+      MakeGarbageCollected<ScriptPromiseResolver<IDLString>>(script_state);
+  auto promise = resolver->Promise();
+  base::RunLoop disconnect_runloop;
+  base::RunLoop complete_runloop;
+  base::RunLoop overflow_runloop;
+  auto pending_remote = CreateModelExecutionResponder(
+      script_state, /*signal=*/nullptr, resolver,
+      blink::scheduler::GetSequencedTaskRunnerForTesting(),
+      AIMetrics::AISessionType::kLanguageModel,
+      /*complete_callback=*/
+      base::BindOnce(
+          [](uint64_t expected_tokens, base::RunLoop* runloop,
+             mojom::blink::ModelExecutionContextInfoPtr context_info) {
+            EXPECT_TRUE(context_info);
+            EXPECT_EQ(context_info->current_tokens, expected_tokens);
+            runloop->Quit();
+          },
+          kTestTokenNumber, &complete_runloop),
+      /*overflow_callback=*/overflow_runloop.QuitClosure());
+
+  mojo::Remote<blink::mojom::blink::ModelStreamingResponder> responder(
+      std::move(pending_remote));
+  responder.set_disconnect_handler(disconnect_runloop.QuitClosure());
+  responder->OnStreaming("a",
+                         mojom::blink::ModelStreamingResponderAction::kAppend);
+  responder->OnStreaming("ab",
+                         mojom::blink::ModelStreamingResponderAction::kAppend);
+  responder->OnContextOverflow();
+  responder->OnCompletion(
+      mojom::blink::ModelExecutionContextInfo::New(kTestTokenNumber));
+  // Check that the promise will be resolved with the "result" string.
+  ScriptPromiseTester tester(scope.GetScriptState(), promise);
+  tester.WaitUntilSettled();
+  EXPECT_TRUE(tester.IsFulfilled());
+  EXPECT_TRUE(tester.Value().V8Value()->IsString());
+  EXPECT_EQ("aab", ToCoreString(scope.GetIsolate(),
+                                tester.Value().V8Value().As<v8::String>()));
 
   // Check that the complete and overflow callback is run.
   complete_runloop.Run();
@@ -191,7 +245,8 @@
       std::move(pending_remote));
   base::RunLoop runloop;
   responder.set_disconnect_handler(runloop.QuitClosure());
-  responder->OnStreaming("result");
+  responder->OnStreaming("result",
+                         mojom::blink::ModelStreamingResponderAction::kReplace);
   responder->OnCompletion(mojom::blink::ModelExecutionContextInfo::New(
       /*current_tokens=*/1u));
 
@@ -226,7 +281,8 @@
       std::move(pending_remote));
   base::RunLoop runloop;
   responder.set_disconnect_handler(runloop.QuitClosure());
-  responder->OnStreaming("result");
+  responder->OnStreaming("result",
+                         mojom::blink::ModelStreamingResponderAction::kReplace);
   responder->OnCompletion(mojom::blink::ModelExecutionContextInfo::New(
       /*current_tokens=*/1u));
 
@@ -335,7 +391,8 @@
       std::move(pending_remote));
   base::RunLoop runloop;
   responder.set_disconnect_handler(runloop.QuitClosure());
-  responder->OnStreaming("result");
+  responder->OnStreaming("result",
+                         mojom::blink::ModelStreamingResponderAction::kReplace);
   responder->OnCompletion(mojom::blink::ModelExecutionContextInfo::New(1u));
 
   // Check that the AbortError is passed to the stream.
diff --git a/third_party/blink/renderer/modules/ml/ml_context.cc b/third_party/blink/renderer/modules/ml/ml_context.cc
index ef70a0c..85118407 100644
--- a/third_party/blink/renderer/modules/ml/ml_context.cc
+++ b/third_party/blink/renderer/modules/ml/ml_context.cc
@@ -405,6 +405,14 @@
   lesser_or_equal->setOutput(
       SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
   op_support_limits->setLesserOrEqual(lesser_or_equal);
+  MLBinarySupportLimits* not_equal = MLBinarySupportLimits::Create();
+  not_equal->setA(
+      SupportedTensorLimitsToTensorLimits(data_type_limits.not_equal_input));
+  not_equal->setB(
+      SupportedTensorLimitsToTensorLimits(data_type_limits.not_equal_input));
+  not_equal->setOutput(
+      SupportedDataTypesToDataTypeLimits(data_type_limits.logical_output));
+  op_support_limits->setNotEqual(not_equal);
   MLBinarySupportLimits* logical_and = MLBinarySupportLimits::Create();
   logical_and->setA(
       SupportedTensorLimitsToTensorLimits(data_type_limits.logical_and_input));
diff --git a/third_party/blink/renderer/modules/ml/ml_context.idl b/third_party/blink/renderer/modules/ml/ml_context.idl
index 00b4a34..4f49152 100644
--- a/third_party/blink/renderer/modules/ml/ml_context.idl
+++ b/third_party/blink/renderer/modules/ml/ml_context.idl
@@ -199,6 +199,7 @@
   MLBinarySupportLimits greaterOrEqual;
   MLBinarySupportLimits lesser;
   MLBinarySupportLimits lesserOrEqual;
+  MLBinarySupportLimits notEqual;
   MLBinarySupportLimits logicalAnd;
   MLBinarySupportLimits logicalOr;
   MLBinarySupportLimits logicalXor;
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
index d282f218..71a9075 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.cc
@@ -176,8 +176,9 @@
   kTriangular = 89,
   kWhere = 90,
   kReverse = 91,
+  kNotEqual = 92,
   kMinValue = kGraphBuilt,
-  kMaxValue = kReverse,
+  kMaxValue = kNotEqual,
 };
 
 using MLGraphOperatorUmaSet = base::EnumSet<MLGraphOperatorUma,
@@ -234,6 +235,8 @@
           return MLGraphOperatorUma::kLesser;
         case blink_mojom::ElementWiseBinary::Kind::kLesserOrEqual:
           return MLGraphOperatorUma::kLesserOrEqual;
+        case blink_mojom::ElementWiseBinary::Kind::kNotEqual:
+          return MLGraphOperatorUma::kNotEqual;
         case blink_mojom::ElementWiseBinary::Kind::kLogicalAnd:
           return MLGraphOperatorUma::kLogicalAnd;
         case blink_mojom::ElementWiseBinary::Kind::kLogicalOr:
@@ -1953,6 +1956,7 @@
 BUILD_ELEMENTWISE_BINARY_OP(lesser, lesser, kLesser)
 BUILD_ELEMENTWISE_BINARY_OP(greaterOrEqual, greater_or_equal, kGreaterOrEqual)
 BUILD_ELEMENTWISE_BINARY_OP(lesserOrEqual, lesser_or_equal, kLesserOrEqual)
+BUILD_ELEMENTWISE_BINARY_OP(notEqual, not_equal, kNotEqual)
 BUILD_ELEMENTWISE_BINARY_OP(logicalAnd, logical_and, kLogicalAnd)
 BUILD_ELEMENTWISE_BINARY_OP(logicalOr, logical_or, kLogicalOr)
 BUILD_ELEMENTWISE_BINARY_OP(logicalXor, logical_xor, kLogicalXor)
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.h
index 12624e6c..6f6f934 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.h
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.h
@@ -189,6 +189,10 @@
                            MLOperand* b,
                            const MLOperatorOptions* options,
                            ExceptionState& exception_state);
+  MLOperand* notEqual(MLOperand* a,
+                      MLOperand* b,
+                      const MLOperatorOptions* options,
+                      ExceptionState& exception_state);
   MLOperand* logicalAnd(MLOperand* a,
                         MLOperand* b,
                         const MLOperatorOptions* options,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl
index 1137f74b..8832864 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl
@@ -268,6 +268,7 @@
   [RaisesException] MLOperand greaterOrEqual(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
   [RaisesException] MLOperand lesser(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
   [RaisesException] MLOperand lesserOrEqual(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
+  [RaisesException] MLOperand notEqual(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
   [RaisesException] MLOperand logicalAnd(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
   [RaisesException] MLOperand logicalOr(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
   [RaisesException] MLOperand logicalXor(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
index b520933..09b8a136 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test.cc
@@ -247,6 +247,8 @@
       return builder->lesser(a, b, options, scope.GetExceptionState());
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLesserOrEqual:
       return builder->lesserOrEqual(a, b, options, scope.GetExceptionState());
+    case webnn::mojom::blink::ElementWiseBinary::Kind::kNotEqual:
+      return builder->notEqual(a, b, options, scope.GetExceptionState());
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalAnd:
       return builder->logicalAnd(a, b, options, scope.GetExceptionState());
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalOr:
@@ -579,6 +581,8 @@
          {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
          /*lesser_or_equal_input=*/
          {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
+         /*not_equal_input=*/
+         {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
          /*logical_and_input=*/
          {webnn::SupportedDataTypes::All(), webnn::SupportedRanks::UpTo(8)},
          /*logical_or_input=*/
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc
index 39c6ed9..2c40ae3 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_utils.cc
@@ -271,6 +271,7 @@
     case webnn::mojom::blink::ElementWiseBinary::Kind::kGreaterOrEqual:
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLesser:
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLesserOrEqual:
+    case webnn::mojom::blink::ElementWiseBinary::Kind::kNotEqual:
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalAnd:
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalOr:
     case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalXor:
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_operator.cc b/third_party/blink/renderer/modules/ml/webnn/ml_operator.cc
index 5756afa..07a9e32 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_operator.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_operator.cc
@@ -64,6 +64,8 @@
           return "lesser";
         case webnn::mojom::blink::ElementWiseBinary::Kind::kLesserOrEqual:
           return "lesserOrEqual";
+        case webnn::mojom::blink::ElementWiseBinary::Kind::kNotEqual:
+          return "notEqual";
         case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalAnd:
           return "logicalAnd";
         case webnn::mojom::blink::ElementWiseBinary::Kind::kLogicalOr:
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.cc b/third_party/blink/renderer/modules/on_device_translation/translation.cc
index b9bf0bc..c33336a 100644
--- a/third_party/blink/renderer/modules/on_device_translation/translation.cc
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.cc
@@ -64,6 +64,8 @@
       return "The translation service count exceeded the limitation.";
     case CreateTranslatorError::kExceedsPendingTaskCountLimitation:
       return "Too many Translator API requests are queued.";
+    case CreateTranslatorError::kInvalidVersion:
+      return "The translation library version is invalid.";
   }
 }
 class CreateTranslatorClient
@@ -128,9 +130,7 @@
     Cleanup();
   }
 
-  void ResetReceiver() override {
-    receiver_.reset();
-  }
+  void ResetReceiver() override { receiver_.reset(); }
 
  private:
   Member<Translation> translation_;
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc
index 55ec5fc0..9ccf6aa 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc
@@ -399,8 +399,9 @@
   auto context_provider_wrapper = SharedGpuContext::ContextProviderWrapper();
   auto resource_provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(100, 100), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(), CanvasResourceProvider::ShouldInitialize::kNo,
-      context_provider_wrapper, RasterMode::kGPU, gpu::SharedImageUsageSet());
+      gfx::ColorSpace::CreateSRGB(),
+      CanvasResourceProvider::ShouldInitialize::kNo, context_provider_wrapper,
+      RasterMode::kGPU, gpu::SharedImageUsageSet());
 
   scoped_refptr<StaticBitmapImage> bitmap =
       resource_provider->Snapshot(FlushReason::kTesting);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index 4602ed6..5e965ea 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -827,7 +827,8 @@
       CanvasResourceProvider::ShouldInitialize::kNo;
   std::unique_ptr<CanvasResourceProvider> resource_provider =
       CanvasResourceProvider::CreateSharedImageProvider(
-          size, GetSkColorType(), GetAlphaType(), GetSkColorSpace(),
+          size, GetSkColorType(), GetAlphaType(),
+          PredefinedColorSpaceToGfxColorSpace(drawing_buffer_color_space_),
           kShouldInitialize, SharedGpuContext::ContextProviderWrapper(),
           RasterMode::kGPU, gpu::SHARED_IMAGE_USAGE_DISPLAY_READ);
   if (!resource_provider || !resource_provider->IsValid()) {
diff --git a/third_party/blink/renderer/platform/fonts/font.cc b/third_party/blink/renderer/platform/fonts/font.cc
index 8c4165b..c62f887 100644
--- a/third_party/blink/renderer/platform/fonts/font.cc
+++ b/third_party/blink/renderer/platform/fonts/font.cc
@@ -235,9 +235,9 @@
     const String text_with_override =
         BidiParagraph::StringWithDirectionalOverride(run.ToStringView(),
                                                      run.Direction());
-    TextRun run_with_override = run_info.run;
-    run_with_override.SetText(text_with_override);
-    run_with_override.SetDirectionalOverride(false);
+    TextRun run_with_override(text_with_override, run.Direction(),
+                              /* directional_override */ false);
+    run_with_override.SetNormalizeSpace(run.NormalizeSpace());
     return DrawBidiText(canvas, TextRunPaintInfo(run_with_override), point,
                         custom_font_not_ready_action, flags, draw_type);
   }
diff --git a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_fuzzer.cc b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_fuzzer.cc
index 90393d4..c8e2b67b 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_fuzzer.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_fuzzer.cc
@@ -74,9 +74,9 @@
     bool is_override = state & 0x4;
     ++state;
 
-    TextRun subrun = text_run.SubRun(from, to - from);
-    subrun.SetDirection(is_rtl ? TextDirection::kRtl : TextDirection::kLtr);
-    subrun.SetDirectionalOverride(is_override);
+    TextRun subrun(StringView(text_run.ToStringView(), from, to - from),
+                   is_rtl ? TextDirection::kRtl : TextDirection::kLtr,
+                   is_override);
 
     TextRunPaintInfo subrun_info(subrun);
     ShapeResultBuffer buffer;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index 24fb8f05..471e58f 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -1108,7 +1108,7 @@
     gfx::Size size,
     SkColorType sk_color_type,
     SkAlphaType alpha_type,
-    sk_sp<SkColorSpace> sk_color_space,
+    const gfx::ColorSpace& color_space,
     ShouldInitialize should_initialize,
     base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper,
     RasterMode raster_mode,
@@ -1187,8 +1187,7 @@
 #endif
 
   auto provider = std::make_unique<CanvasResourceProviderSharedImage>(
-      size, adjusted_color_type, alpha_type,
-      SkColorSpaceToGfxColorSpace(std::move(sk_color_space)),
+      size, adjusted_color_type, alpha_type, color_space,
       context_provider_wrapper, is_accelerated, shared_image_usage_flags,
       resource_host);
   if (provider->IsValid()) {
@@ -1219,7 +1218,8 @@
   //   the WebGPU interface)
   // Hence, both WEBGPU_READ and WEBGPU_WRITE usage are needed here.
   return CreateSharedImageProvider(
-      size, sk_color_type, alpha_type, std::move(sk_color_space),
+      size, sk_color_type, alpha_type,
+      SkColorSpaceToGfxColorSpace(std::move(sk_color_space)),
       CanvasResourceProvider::ShouldInitialize::kNo,
       std::move(context_provider_wrapper), RasterMode::kGPU,
       shared_image_usage_flags | gpu::SHARED_IMAGE_USAGE_WEBGPU_READ |
@@ -1232,7 +1232,7 @@
     gfx::Size size,
     SkColorType sk_color_type,
     SkAlphaType alpha_type,
-    sk_sp<SkColorSpace> sk_color_space,
+    const gfx::ColorSpace& color_space,
     base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper,
     CanvasResourceHost* resource_host) {
   // SharedGpuContext::IsGpuCompositingEnabled can potentially replace the
@@ -1267,9 +1267,8 @@
   // fact that it simply delegates the internal parts of the resource to other
   // classes).
   auto provider = std::make_unique<CanvasResourceProviderPassThrough>(
-      size, sk_color_type, alpha_type,
-      SkColorSpaceToGfxColorSpace(std::move(sk_color_space)),
-      context_provider_wrapper, resource_host);
+      size, sk_color_type, alpha_type, color_space, context_provider_wrapper,
+      resource_host);
   CHECK(provider->IsValid());
   return provider;
 }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
index db9bac93..72aa7428 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
@@ -129,7 +129,7 @@
       gfx::Size size,
       SkColorType sk_color_type,
       SkAlphaType alpha_type,
-      sk_sp<SkColorSpace> sk_color_space,
+      const gfx::ColorSpace& color_space,
       ShouldInitialize initialize_provider,
       base::WeakPtr<WebGraphicsContext3DProviderWrapper>,
       RasterMode raster_mode,
@@ -148,7 +148,7 @@
       gfx::Size size,
       SkColorType sk_color_type,
       SkAlphaType alpha_type,
-      sk_sp<SkColorSpace> sk_color_space,
+      const gfx::ColorSpace& color_space,
       base::WeakPtr<WebGraphicsContext3DProviderWrapper>,
       CanvasResourceHost* resource_host = nullptr);
 
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc
index a339a5b..56fdd5a 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc
@@ -126,7 +126,7 @@
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -173,7 +173,8 @@
       gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
-      kSize, kInfo.colorType(), kInfo.alphaType(), kInfo.refColorSpace(),
+      kSize, kInfo.colorType(), kInfo.alphaType(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -203,7 +204,8 @@
       SkImageInfo::MakeN32Premul(10, 10, SkColorSpace::MakeSRGB());
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
-      kSize, kInfo.colorType(), kInfo.alphaType(), kInfo.refColorSpace(),
+      kSize, kInfo.colorType(), kInfo.alphaType(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
 
@@ -229,7 +231,8 @@
       gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_SCANOUT;
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
-      kSize, kInfo.colorType(), kInfo.alphaType(), kInfo.refColorSpace(),
+      kSize, kInfo.colorType(), kInfo.alphaType(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kCPU, shared_image_usage_flags);
 
@@ -255,7 +258,7 @@
 
   return CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper, raster_mode, shared_image_usage_flags);
 }
@@ -294,7 +297,7 @@
       gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_SCANOUT;
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
       shared_image_usage_flags);
@@ -332,7 +335,8 @@
       gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_SCANOUT;
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
-      kSize, kInfo.colorType(), kInfo.alphaType(), kInfo.refColorSpace(),
+      kSize, kInfo.colorType(), kInfo.alphaType(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -478,7 +482,7 @@
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -514,7 +518,7 @@
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -560,7 +564,7 @@
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -647,7 +651,8 @@
       gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
-      kSize, kInfo.colorType(), kInfo.alphaType(), kInfo.refColorSpace(),
+      kSize, kInfo.colorType(), kInfo.alphaType(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, shared_image_usage_flags);
 
@@ -678,8 +683,8 @@
       SkImageInfo::MakeN32Premul(10, 10, SkColorSpace::MakeSRGB());
 
   auto provider = CanvasResourceProvider::CreatePassThroughProvider(
-      kSize, kInfo.colorType(), kInfo.alphaType(), kInfo.refColorSpace(),
-      context_provider_wrapper_);
+      kSize, kInfo.colorType(), kInfo.alphaType(),
+      gfx::ColorSpace::CreateSRGB(), context_provider_wrapper_);
 
   EXPECT_EQ(provider->Size(), kSize);
   EXPECT_TRUE(provider->IsValid());
@@ -735,19 +740,19 @@
 TEST_F(CanvasResourceProviderTest, DimensionsExceedMaxTextureSize_SharedImage) {
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(kMaxTextureSize - 1, kMaxTextureSize), kN32_SkColorType,
-      kPremul_SkAlphaType, SkColorSpace::MakeSRGB(),
+      kPremul_SkAlphaType, gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
   EXPECT_TRUE(provider->SupportsDirectCompositing());
   provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(kMaxTextureSize, kMaxTextureSize), kN32_SkColorType,
-      kPremul_SkAlphaType, SkColorSpace::MakeSRGB(),
+      kPremul_SkAlphaType, gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
   EXPECT_TRUE(provider->SupportsDirectCompositing());
   provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(kMaxTextureSize + 1, kMaxTextureSize), kN32_SkColorType,
-      kPremul_SkAlphaType, SkColorSpace::MakeSRGB(),
+      kPremul_SkAlphaType, gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
   // The CanvasResourceProvider for SharedImage should not be created or valid
@@ -782,15 +787,18 @@
 TEST_F(CanvasResourceProviderTest, DimensionsExceedMaxTextureSize_PassThrough) {
   auto provider = CanvasResourceProvider::CreatePassThroughProvider(
       gfx::Size(kMaxTextureSize - 1, kMaxTextureSize), kN32_SkColorType,
-      kPremul_SkAlphaType, SkColorSpace::MakeSRGB(), context_provider_wrapper_);
+      kPremul_SkAlphaType, gfx::ColorSpace::CreateSRGB(),
+      context_provider_wrapper_);
   EXPECT_TRUE(provider->SupportsDirectCompositing());
   provider = CanvasResourceProvider::CreatePassThroughProvider(
       gfx::Size(kMaxTextureSize, kMaxTextureSize), kN32_SkColorType,
-      kPremul_SkAlphaType, SkColorSpace::MakeSRGB(), context_provider_wrapper_);
+      kPremul_SkAlphaType, gfx::ColorSpace::CreateSRGB(),
+      context_provider_wrapper_);
   EXPECT_TRUE(provider->SupportsDirectCompositing());
   provider = CanvasResourceProvider::CreatePassThroughProvider(
       gfx::Size(kMaxTextureSize + 1, kMaxTextureSize), kN32_SkColorType,
-      kPremul_SkAlphaType, SkColorSpace::MakeSRGB(), context_provider_wrapper_);
+      kPremul_SkAlphaType, gfx::ColorSpace::CreateSRGB(),
+      context_provider_wrapper_);
   // The CanvasResourceProvider for PassThrough should not be created or valid
   // if the texture size is greater than the maximum value
   EXPECT_TRUE(!provider || !provider->IsValid());
@@ -840,13 +848,13 @@
 TEST_F(CanvasResourceProviderTest, FlushForImage) {
   auto src_provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
 
   auto dst_provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
 
diff --git a/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc
index 3303204..50cfa95 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc
@@ -63,8 +63,9 @@
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(source->Size().width(), source->Size().height()),
       image_info.colorType(), image_info.alphaType(),
-      image_info.refColorSpace(), CanvasResourceProvider::ShouldInitialize::kNo,
-      context_provider_wrapper, RasterMode::kGPU, kSharedImageUsageFlags);
+      SkColorSpaceToGfxColorSpace(image_info.refColorSpace()),
+      CanvasResourceProvider::ShouldInitialize::kNo, context_provider_wrapper,
+      RasterMode::kGPU, kSharedImageUsageFlags);
   if (!provider || !provider->IsAccelerated())
     return nullptr;
 
diff --git a/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc b/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc
index 9c2f77c..b22674a 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc
@@ -218,7 +218,7 @@
   std::unique_ptr<CanvasResourceProvider> resource_provider =
       CanvasResourceProvider::CreateSharedImageProvider(
           gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-          SkColorSpace::MakeSRGB(),
+          gfx::ColorSpace::CreateSRGB(),
           CanvasResourceProvider::ShouldInitialize::kNo,
           SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
           gpu::SharedImageUsageSet());
@@ -245,7 +245,7 @@
   std::unique_ptr<CanvasResourceProvider> resource_provider =
       CanvasResourceProvider::CreateSharedImageProvider(
           gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-          SkColorSpace::MakeSRGB(),
+          gfx::ColorSpace::CreateSRGB(),
           CanvasResourceProvider::ShouldInitialize::kNo,
           SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
           gpu::SharedImageUsageSet());
diff --git a/third_party/blink/renderer/platform/graphics/scoped_raster_timer_test.cc b/third_party/blink/renderer/platform/graphics/scoped_raster_timer_test.cc
index 98cf56b1..843eda01 100644
--- a/third_party/blink/renderer/platform/graphics/scoped_raster_timer_test.cc
+++ b/third_party/blink/renderer/platform/graphics/scoped_raster_timer_test.cc
@@ -87,7 +87,7 @@
   std::unique_ptr<CanvasResourceProvider> provider =
       CanvasResourceProvider::CreateSharedImageProvider(
           gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-          SkColorSpace::MakeSRGB(),
+          gfx::ColorSpace::CreateSRGB(),
           CanvasResourceProvider::ShouldInitialize::kCallClear,
           context_provider_wrapper_, RasterMode::kCPU,
           shared_image_usage_flags);
@@ -121,7 +121,7 @@
 
   auto provider = CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(10, 10), kN32_SkColorType, kPremul_SkAlphaType,
-      SkColorSpace::MakeSRGB(),
+      gfx::ColorSpace::CreateSRGB(),
       CanvasResourceProvider::ShouldInitialize::kCallClear,
       context_provider_wrapper_, RasterMode::kGPU, gpu::SharedImageUsageSet());
 
diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image_transform.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image_transform.cc
index 0221cab4..fe455ae 100644
--- a/third_party/blink/renderer/platform/graphics/static_bitmap_image_transform.cc
+++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image_transform.cc
@@ -254,8 +254,9 @@
             source->GetSharedImage()->usage();
         resource_provider = CanvasResourceProvider::CreateSharedImageProvider(
             gfx::Size(dest_size.width(), dest_size.height()), dest_color_type,
-            dest_alpha_type, dest_color_space, kShouldInitialize,
-            context_provider, RasterMode::kGPU, shared_image_usage_flags);
+            dest_alpha_type, SkColorSpaceToGfxColorSpace(dest_color_space),
+            kShouldInitialize, context_provider, RasterMode::kGPU,
+            shared_image_usage_flags);
       }
     }
     // If not (or if the SharedImage provider fails), fall back to software.
diff --git a/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h b/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h
index 62aa6a9..c9efd4ef 100644
--- a/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h
+++ b/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h
@@ -51,7 +51,7 @@
           gpu::SHARED_IMAGE_USAGE_SCANOUT;
       provider = CanvasResourceProvider::CreateSharedImageProvider(
           Size(), kN32_SkColorType, kPremul_SkAlphaType,
-          SkColorSpace::MakeSRGB(), kShouldInitialize,
+          gfx::ColorSpace::CreateSRGB(), kShouldInitialize,
           SharedGpuContext::ContextProviderWrapper(),
           hint == RasterModeHint::kPreferGPU ? RasterMode::kGPU
                                              : RasterMode::kCPU,
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc b/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc
index 706e646..230bea41 100644
--- a/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc
+++ b/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc
@@ -349,9 +349,9 @@
   }
   return CanvasResourceProvider::CreateSharedImageProvider(
       gfx::Size(info.width(), info.height()), info.colorType(),
-      info.alphaType(), info.refColorSpace(), kShouldInitialize,
-      SharedGpuContext::ContextProviderWrapper(), RasterMode::kGPU,
-      gpu::SHARED_IMAGE_USAGE_DISPLAY_READ);
+      info.alphaType(), SkColorSpaceToGfxColorSpace(info.refColorSpace()),
+      kShouldInitialize, SharedGpuContext::ContextProviderWrapper(),
+      RasterMode::kGPU, gpu::SHARED_IMAGE_USAGE_DISPLAY_READ);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/network/http_parsers.cc b/third_party/blink/renderer/platform/network/http_parsers.cc
index 91a99d0c..b45194b0 100644
--- a/third_party/blink/renderer/platform/network/http_parsers.cc
+++ b/third_party/blink/renderer/platform/network/http_parsers.cc
@@ -320,7 +320,7 @@
     const SRIMessageSignaturesPtr& in) {
   CHECK(in);
   return blink::SRIMessageSignatures::New(ConvertToBlink(in->signatures),
-                                          ConvertToBlink(in->parsing_errors));
+                                          ConvertToBlink(in->errors));
 }
 
 blink::ParsedHeadersPtr ConvertToBlink(const ParsedHeadersPtr& in) {
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 329afc27..8f0f579c 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -877,6 +877,10 @@
       status: "experimental",
     },
     {
+      name: "ComputeInsertionPositionBasedOnAnchorType",
+      status: "stable",
+    },
+    {
       name: "ComputePressure",
       status: {
         "Android": "",
@@ -2940,13 +2944,6 @@
       status: "stable",
     },
     {
-      // Input event data for textarea should not be null for certain
-      // inputTypes.
-      // https://issues.chromium.org/issues/40737336
-      name: "NonNullInputEventDataForTextArea",
-      status: "stable"
-    },
-    {
       // TODO(crbug.com/1426629): This feature enables the deprecated value
       // slider-vertical. Disable this feature to stop parsing or allowing these
       // values.
@@ -3534,11 +3531,6 @@
         "default": "experimental"},
     },
     {
-      // See https://issues.chromium.org/40805258
-      name: "RemoveCollapsedPlaceholder",
-      status: "stable",
-    },
-    {
       name: "RemoveDanglingMarkupInTarget",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/text/text_run.cc b/third_party/blink/renderer/platform/text/text_run.cc
index b51dad0..f87b93b 100644
--- a/third_party/blink/renderer/platform/text/text_run.cc
+++ b/third_party/blink/renderer/platform/text/text_run.cc
@@ -31,7 +31,6 @@
 #include "third_party/blink/renderer/platform/text/text_run.h"
 
 #include "base/memory/raw_ptr_exclusion.h"
-#include "third_party/blink/renderer/platform/text/bidi_paragraph.h"
 #include "third_party/blink/renderer/platform/text/character.h"
 #include "third_party/blink/renderer/platform/wtf/size_assertions.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
@@ -50,20 +49,6 @@
 
 ASSERT_SIZE(TextRun, SameSizeAsTextRun);
 
-void TextRun::SetText(const String& string) {
-  len_ = string.length();
-  if (!len_) {
-    data_.characters8 = nullptr;
-    is_8bit_ = true;
-    return;
-  }
-  is_8bit_ = string.Is8Bit();
-  if (is_8bit_)
-    data_.characters8 = string.Characters8();
-  else
-    data_.characters16 = string.Characters16();
-}
-
 String TextRun::NormalizedUTF16() const {
   const UChar* source;
   String string_for8_bit_run;
@@ -115,8 +100,4 @@
   return std::numeric_limits<unsigned>::max();
 }
 
-void TextRun::SetDirectionFromText() {
-  SetDirection(BidiParagraph::BaseDirectionForStringOrLtr(ToStringView()));
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/text/text_run.h b/third_party/blink/renderer/platform/text/text_run.h
index ddce860491..fb44170 100644
--- a/third_party/blink/renderer/platform/text/text_run.h
+++ b/third_party/blink/renderer/platform/text/text_run.h
@@ -184,7 +184,6 @@
     len_ = len;
     is_8bit_ = false;
   }
-  void SetText(const String&);
 
   TextDirection Direction() const {
     return static_cast<TextDirection>(direction_);
@@ -195,10 +194,6 @@
   void SetDirection(TextDirection direction) {
     direction_ = static_cast<unsigned>(direction);
   }
-  void SetDirectionFromText();
-  void SetDirectionalOverride(bool override) {
-    directional_override_ = override;
-  }
 
   // Up-converts to UTF-16 as needed and normalizes spaces and Unicode control
   // characters as per the CSS Text Module Level 3 specification.
diff --git a/third_party/blink/web_tests/AIExpectations b/third_party/blink/web_tests/AIExpectations
index 01f0ebb..a199f0da 100644
--- a/third_party/blink/web_tests/AIExpectations
+++ b/third_party/blink/web_tests/AIExpectations
@@ -5,9 +5,6 @@
 # When Optimization Guide Bots run AI related API tests, the default
 # TestExpectations file is ignored and this file is referred.
 
-crbug.com/378549335 wpt_internal/ai/language-model-api-context-overflow.https.any.html [ Failure Pass Timeout ]
-crbug.com/378549335 wpt_internal/ai/language-model-api-context-overflow.https.any.worker.html [ Failure Pass Timeout ]
-
 # Temporary marking Writer/Rewriter API tests as flaky because it will be broken
 # until we get a new prompt.
 crbug.com/372099809 wpt_internal/ai/rewriter-api-slow.https.any.html [ Failure Pass Timeout ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 5facc0a..85e91648 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -1901,6 +1901,8 @@
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/lstm_cell.https.any.worker.html?gpu [ Skip ]
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/matmul.https.any.html?gpu [ Skip ]
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/matmul.https.any.worker.html?gpu [ Skip ]
+crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any.html?gpu [ Skip ]
+crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker.html?gpu [ Skip ]
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/pad.https.any.html?gpu [ Skip ]
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/pad.https.any.worker.html?gpu [ Skip ]
 crbug.com/1500120 [ Win10.20h2 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.html?gpu [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index cb1f356..ee5ed4a 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -9113,3 +9113,6 @@
 
 crbug.com/389559091 [ Linux ] external/wpt/html/semantics/forms/the-select-element/customizable-select/select-home-end-pagedown-pageup.tentative.html [ Pass Timeout ]
 crbug.com/389559091 [ Mac ] external/wpt/html/semantics/forms/the-select-element/customizable-select/select-home-end-pagedown-pageup.tentative.html [ Pass Timeout ]
+
+# Gardener 2025-01-14
+crbug.com/384875218 external/wpt/partitioned-popins/partitioned-popins.partitions.tentative.https.window.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 5200f6ea..dac0d86 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -2372,6 +2372,8 @@
       "external/wpt/webnn/conformance_tests/mul.https.any.worker.html?gpu",
       "external/wpt/webnn/conformance_tests/neg.https.any.html?gpu",
       "external/wpt/webnn/conformance_tests/neg.https.any.worker.html?gpu",
+      "external/wpt/webnn/conformance_tests/not_equal.https.any.html?gpu",
+      "external/wpt/webnn/conformance_tests/not_equal.https.any.worker.html?gpu",
       "external/wpt/webnn/conformance_tests/pad.https.any.html?gpu",
       "external/wpt/webnn/conformance_tests/pad.https.any.worker.html?gpu",
       "external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.html?gpu",
@@ -2706,6 +2708,8 @@
       "external/wpt/webnn/conformance_tests/mul.https.any.worker.html?cpu",
       "external/wpt/webnn/conformance_tests/neg.https.any.html?cpu",
       "external/wpt/webnn/conformance_tests/neg.https.any.worker.html?cpu",
+      "external/wpt/webnn/conformance_tests/not_equal.https.any.html?cpu",
+      "external/wpt/webnn/conformance_tests/not_equal.https.any.worker.html?cpu",
       "external/wpt/webnn/conformance_tests/pad.https.any.html?cpu",
       "external/wpt/webnn/conformance_tests/pad.https.any.worker.html?cpu",
       "external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.html?cpu",
@@ -3038,6 +3042,8 @@
       "external/wpt/webnn/conformance_tests/mul.https.any.worker.html?npu",
       "external/wpt/webnn/conformance_tests/neg.https.any.html?npu",
       "external/wpt/webnn/conformance_tests/neg.https.any.worker.html?npu",
+      "external/wpt/webnn/conformance_tests/not_equal.https.any.html?npu",
+      "external/wpt/webnn/conformance_tests/not_equal.https.any.worker.html?npu",
       "external/wpt/webnn/conformance_tests/pad.https.any.html?npu",
       "external/wpt/webnn/conformance_tests/pad.https.any.worker.html?npu",
       "external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.html?npu",
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt b/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt
index 349f58d..a03c41b 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 57 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 56 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [["stylewithcss","true"],["inserthtml","ab<b>c</b>d"]] "foo[]bar" queryCommandState("stylewithcss") before
   assert_equals: Wrong result returned expected false but got true
 [FAIL] [["defaultparagraphseparator","div"],["inserthtml","<p>abc"]] "<p>foo[bar]baz" compare innerHTML
@@ -112,7 +112,5 @@
   assert_in_array: Unexpected innerHTML (after normalizing inline style) value "<div>ab</div>" not in array ["<div>a<span></span>b</div>", "<div>a<span></span>b<br></div>"]
 [FAIL] [["inserthtml","<span class=\\"s1\\"></span>b<span class=\\"s2\\"></span>"]] "<div>a[]c</div>" compare innerHTML
   assert_in_array: Unexpected innerHTML (after normalizing inline style) value "<div>ab</div><span class=\\"s1\\"></span><span class=\\"s2\\"></span><div>c</div>" not in array ["<div>a<span class=\\"s1\\"></span>b<span class=\\"s2\\"></span>c</div>", "<div>a<span class=\\"s1\\"></span>b<span class=\\"s2\\"></span>c<br></div>"]
-[FAIL] [["inserthtml","<i>Z</i>"]] "<p><b><span contenteditable=false>abc</span>[Y]</b><i>def</i></p>" compare innerHTML
-  assert_in_array: Unexpected innerHTML (after normalizing inline style) value "<p><b><span contenteditable=\\"false\\">abc</span></b><i>def</i></p>" not in array ["<p><b><span contenteditable=\\"false\\">abc</span></b><i>Z</i><i>def</i></p>", "<p><b><span contenteditable=\\"false\\">abc</span></b><i>Zdef</i></p>"]
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js
new file mode 100644
index 0000000..dc02620f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js
@@ -0,0 +1,537 @@
+// META: title=test WebNN API element-wise notEqual operation
+// META: global=window,dedicatedworker
+// META: variant=?cpu
+// META: variant=?gpu
+// META: variant=?npu
+// META: script=../resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+// https://github.com/webmachinelearning/webnn/issues/375#issuecomment-2292466613
+// Compare if the values of the two input tensors are not equal, element-wise.
+//
+// MLOperand notEqual(MLOperand a, MLOperand b);
+
+
+const getNotEqualPrecisionTolerance = (graphResources) => {
+  const toleranceValueDict = {uint8: 0};
+  const expectedDataType =
+      getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
+  return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
+};
+
+const notEqualTests = [
+  {
+    'name': 'notEqual float32 0D scalar',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [-0.6285496950149536],
+          'descriptor': {shape: [], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [-4.4166412353515625],
+          'descriptor': {shape: [], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {'data': [1], 'descriptor': {shape: [], dataType: 'uint8'}}
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 1D constant tensors',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [24], dataType: 'float32'},
+          'constant': true
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,  -4.839719772338867,
+            4.996258735656738,   0.9727277755737305, -6.173707485198975,
+            2.80570650100708,    5.588105201721191,  7.767369747161865,
+            -4.308907985687256,  -5.895479679107666, -8.53209114074707,
+            2.80570650100708,    5.588105201721191,  0.17833954095840454,
+            -4.479541778564453,  0.6819732189178467, -6.6875128746032715,
+            2.80570650100708,    5.588105201721191,  -9.041799545288086,
+            -1.9728281497955322, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [24], dataType: 'float32'},
+          'constant': true
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [24], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 1D tensors',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [24], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,  -4.839719772338867,
+            4.996258735656738,   0.9727277755737305, -6.173707485198975,
+            2.80570650100708,    5.588105201721191,  7.767369747161865,
+            -4.308907985687256,  -5.895479679107666, -8.53209114074707,
+            2.80570650100708,    5.588105201721191,  0.17833954095840454,
+            -4.479541778564453,  0.6819732189178467, -6.6875128746032715,
+            2.80570650100708,    5.588105201721191,  -9.041799545288086,
+            -1.9728281497955322, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [24], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [24], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 2D tensors',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [4, 6], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,  -4.839719772338867,
+            4.996258735656738,   0.9727277755737305, -6.173707485198975,
+            2.80570650100708,    5.588105201721191,  7.767369747161865,
+            -4.308907985687256,  -5.895479679107666, -8.53209114074707,
+            2.80570650100708,    5.588105201721191,  0.17833954095840454,
+            -4.479541778564453,  0.6819732189178467, -6.6875128746032715,
+            2.80570650100708,    5.588105201721191,  -9.041799545288086,
+            -1.9728281497955322, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [4, 6], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [4, 6], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 3D tensors',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 3, 4], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,  -4.839719772338867,
+            4.996258735656738,   0.9727277755737305, -6.173707485198975,
+            2.80570650100708,    5.588105201721191,  7.767369747161865,
+            -4.308907985687256,  -5.895479679107666, -8.53209114074707,
+            2.80570650100708,    5.588105201721191,  0.17833954095840454,
+            -4.479541778564453,  0.6819732189178467, -6.6875128746032715,
+            2.80570650100708,    5.588105201721191,  -9.041799545288086,
+            -1.9728281497955322, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [2, 3, 4], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 3, 4], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 4D tensors',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,  -4.839719772338867,
+            4.996258735656738,   0.9727277755737305, -6.173707485198975,
+            2.80570650100708,    5.588105201721191,  7.767369747161865,
+            -4.308907985687256,  -5.895479679107666, -8.53209114074707,
+            2.80570650100708,    5.588105201721191,  0.17833954095840454,
+            -4.479541778564453,  0.6819732189178467, -6.6875128746032715,
+            2.80570650100708,    5.588105201721191,  -9.041799545288086,
+            -1.9728281497955322, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 5D tensors',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,  -4.839719772338867,
+            4.996258735656738,   0.9727277755737305, -6.173707485198975,
+            2.80570650100708,    5.588105201721191,  7.767369747161865,
+            -4.308907985687256,  -5.895479679107666, -8.53209114074707,
+            2.80570650100708,    5.588105201721191,  0.17833954095840454,
+            -4.479541778564453,  0.6819732189178467, -6.6875128746032715,
+            2.80570650100708,    5.588105201721191,  -9.041799545288086,
+            -1.9728281497955322, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 broadcast 0D to 4D',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [2.80570650100708],
+          'descriptor': {shape: [], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+            0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 broadcast 1D to 4D',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [2.80570650100708],
+          'descriptor': {shape: [1], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+            0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 broadcast 2D to 4D',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708, 5.588105201721191, -4.9622955322265625,
+            -2.863192081451416, -3.011512279510498, 3.6268343925476074
+          ],
+          'descriptor': {shape: [2, 3], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+            0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 broadcast 3D to 4D',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708, 5.588105201721191, -9.041799545288086,
+            3.6268343925476074
+          ],
+          'descriptor': {shape: [2, 2, 1], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+            0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  },
+  {
+    'name': 'notEqual float32 broadcast 4D to 4D',
+    'graph': {
+      'inputs': {
+        'inputA': {
+          'data': [2.80570650100708],
+          'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'}
+        },
+        'inputB': {
+          'data': [
+            2.80570650100708,    5.588105201721191,   2.855226516723633,
+            4.996258735656738,   0.9727277755737305,  -4.742599964141846,
+            2.80570650100708,    5.588105201721191,   -5.107602119445801,
+            6.624142169952393,   -2.3207247257232666, -7.053895950317383,
+            2.80570650100708,    5.588105201721191,   4.980423927307129,
+            -5.440841197967529,  1.1459590196609497,  7.774532794952393,
+            2.80570650100708,    5.588105201721191,   -6.245251178741455,
+            -2.8490731716156006, -2.6951117515563965, 5.817563056945801
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'float32'}
+        }
+      },
+      'operators': [{
+        'name': 'notEqual',
+        'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+        'outputs': 'output'
+      }],
+      'expectedOutputs': {
+        'output': {
+          'data': [
+            0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+            0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1
+          ],
+          'descriptor': {shape: [2, 2, 2, 3], dataType: 'uint8'}
+        }
+      }
+    }
+  }
+];
+
+if (navigator.ml) {
+  notEqualTests.forEach((test) => {
+    webnn_conformance_test(
+        buildAndExecuteGraph, getNotEqualPrecisionTolerance, test);
+  });
+} else {
+  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
+}
diff --git a/third_party/blink/web_tests/external/wpt/webnn/validation_tests/elementwise-logical.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/validation_tests/elementwise-logical.https.any.js
index 3db25c1..3dce605f 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/validation_tests/elementwise-logical.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/validation_tests/elementwise-logical.https.any.js
@@ -13,6 +13,7 @@
   'greaterOrEqual',
   'lesser',
   'lesserOrEqual',
+  'notEqual',
   'logicalAnd',
   'logicalOr',
   'logicalXor',
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..3415057
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_cpu-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 0D scalar
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D constant tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 2D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 3D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 4D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 0D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 1D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 2D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 3D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 4D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any_cpu-expected.txt
new file mode 100644
index 0000000..3415057
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any_cpu-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 0D scalar
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D constant tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 2D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 3D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 4D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 0D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 1D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 2D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 3D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 4D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_gpu-expected.txt
new file mode 100644
index 0000000..3415057
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_gpu-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 0D scalar
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D constant tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 2D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 3D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 4D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 0D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 1D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 2D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 3D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 4D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any_gpu-expected.txt
new file mode 100644
index 0000000..3415057
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/not_equal.https.any_gpu-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 0D scalar
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D constant tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 2D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 3D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 4D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 0D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 1D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 2D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 3D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 4D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_cpu-expected.txt
new file mode 100644
index 0000000..1478c00
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'notEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any_cpu-expected.txt
new file mode 100644
index 0000000..1478c00
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/not_equal.https.any_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'notEqual' on 'MLGraphBuilder': Unsupported rank 5 for argument a (must be at most 4)."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_npu-expected.txt
new file mode 100644
index 0000000..3415057
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/not_equal.https.any.worker_npu-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 0D scalar
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D constant tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 2D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 3D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 4D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 0D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 1D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 2D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 3D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 4D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/not_equal.https.any_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/not_equal.https.any_npu-expected.txt
new file mode 100644
index 0000000..3415057
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/not_equal.https.any_npu-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] notEqual float32 0D scalar
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D constant tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 1D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 2D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 3D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 4D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 5D tensors
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 0D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 1D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 2D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 3D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+[FAIL] notEqual float32 broadcast 4D to 4D
+  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-context-overflow.https.any.js b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-context-overflow.https.any.js
index 90f3fdac..361c81c 100644
--- a/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-context-overflow.https.any.js
+++ b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-context-overflow.https.any.js
@@ -22,4 +22,8 @@
   const promptString = await getPromptExceedingAvailableTokens(session);
   session.prompt(promptString);
   await promise;
+
+  // Destroy the session here to stop the prompt, so that the next test can run
+  // faster.
+  session.destroy();
 }, "event listener should be triggered when the context overflows.");
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index 8010e7f..ad31f7e 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit 8010e7fb8e1d64f2c914da216cedf6e3cdfad093
+Subproject commit ad31f7ef5295293b73ada2c9da59fb550429061e
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 1ea7815..5c21cab 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 1ea78154d90c2b0a33fd7a72fc97beccc6d1c40d
+Subproject commit 5c21cab5d886e9e5732e903ff19238e6f3e3d8ca
diff --git a/third_party/skia b/third_party/skia
index c24b41e..b042701 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit c24b41eebcc69f4f8156716a411de04a80b6c3bc
+Subproject commit b0427017da022cf34f9485d6361b1d03aac64021
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 5b43f94..d47ae2b 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 5b43f9496300bdac77c67501dc3b3738cb3d21c5
+Subproject commit d47ae2be278152820d6904829ed6fbbae559f03d
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index cddf237..27d4bf4 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit cddf2371ee3ef9c31deea06ce14df558c20ece04
+Subproject commit 27d4bf4948e4c5d313bd43147629b38729f6edc6
diff --git a/third_party/webrtc b/third_party/webrtc
index 2911627..b099e0d 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 2911627ab3cb5e2549d7e65d176a01ed398b874a
+Subproject commit b099e0d7effde8969bad12cf0495c44fc7ff28f3
diff --git a/third_party/zlib/CMakeLists.txt b/third_party/zlib/CMakeLists.txt
index 59d77c3..ebf9cd4 100644
--- a/third_party/zlib/CMakeLists.txt
+++ b/third_party/zlib/CMakeLists.txt
@@ -386,6 +386,7 @@
   add_executable(minizip_bin contrib/minizip/minizip.c contrib/minizip/ioapi.c
     contrib/minizip/ioapi.h contrib/minizip/unzip.c
     contrib/minizip/unzip.h contrib/minizip/zip.c contrib/minizip/zip.h
+    contrib/minizip/ints.h contrib/minizip/skipset.h
     )
   target_link_libraries(minizip_bin zlib)
 endif()
diff --git a/third_party/zlib/contrib/minizip/Makefile b/third_party/zlib/contrib/minizip/Makefile
index aac76e0..b3e050a 100644
--- a/third_party/zlib/contrib/minizip/Makefile
+++ b/third_party/zlib/contrib/minizip/Makefile
@@ -1,5 +1,5 @@
-CC=cc
-CFLAGS := $(CFLAGS) -O -I../..
+CC?=cc
+CFLAGS := -O $(CFLAGS) -I../..
 
 UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
 ZIP_OBJS = minizip.o zip.o   ioapi.o ../../libz.a
@@ -9,13 +9,21 @@
 
 all: miniunz minizip
 
-miniunz:  $(UNZ_OBJS)
+miniunz.o: miniunz.c unzip.h iowin32.h
+minizip.o: minizip.c zip.h iowin32.h ints.h
+unzip.o: unzip.c unzip.h crypt.h
+zip.o: zip.c zip.h crypt.h skipset.h ints.h
+ioapi.o: ioapi.c ioapi.h ints.h
+iowin32.o: iowin32.c iowin32.h ioapi.h
+mztools.o: mztools.c unzip.h
+
+miniunz: $(UNZ_OBJS)
 	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
 
-minizip:  $(ZIP_OBJS)
+minizip: $(ZIP_OBJS)
 	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
 
-test:	miniunz minizip
+test: miniunz minizip
 	@rm -f test.*
 	@echo hello hello hello > test.txt
 	./minizip test test.txt
diff --git a/third_party/zlib/contrib/minizip/README.chromium b/third_party/zlib/contrib/minizip/README.chromium
index ceaff34..6728765d 100644
--- a/third_party/zlib/contrib/minizip/README.chromium
+++ b/third_party/zlib/contrib/minizip/README.chromium
@@ -1,8 +1,8 @@
 Name: ZIP file API for reading file entries in a ZIP archive
 Short Name: minizip
 URL: https://github.com/madler/zlib/tree/master/contrib/minizip
-Version: 1.3.0.1
-Revision: 643e17b7498d12ab8d15565662880579692f769d
+Version: 1.3.1.1
+Revision: ef24c4c7502169f016dcd2a26923dbaf3216748c
 License: Zlib
 License File: //third_party/zlib/LICENSE
 Shipped: yes
@@ -14,6 +14,13 @@
 files. See minizip.md for chromium build instructions.
 
 Local Modifications:
+- OS macro tweaks for Android and Fuchsia
+  0000-build.patch (the contrib/minizip/ parts)
+  0008-minizip-zip-unzip-tools.patch (crrev.com/886990)
+
+- Fix build on UWP. (crrev.com/750639)
+  0004-fix-uwp.patch
+
 - Fixed uncompressing files with wrong uncompressed size set
   crrev.com/268940
   0014-minizip-unzip-with-incorrect-size.patch
diff --git a/third_party/zlib/contrib/minizip/ints.h b/third_party/zlib/contrib/minizip/ints.h
new file mode 100644
index 0000000..4c84375b
--- /dev/null
+++ b/third_party/zlib/contrib/minizip/ints.h
@@ -0,0 +1,57 @@
+/* ints.h -- create integer types for 8, 16, 32, and 64 bits
+ * Copyright (C) 2024 Mark Adler
+ * For conditions of distribution and use, see the copyright notice in zlib.h
+ *
+ * There exist compilers with limits.h, but not stdint.h or inttypes.h.
+ */
+
+#ifndef INTS_H
+#define INTS_H
+#include <limits.h>
+#if defined(UCHAR_MAX) && UCHAR_MAX == 0xff
+    typedef signed char i8_t;
+    typedef unsigned char ui8_t;
+#else
+#   error "no 8-bit integer"
+#endif
+#if defined(USHRT_MAX) && USHRT_MAX == 0xffff
+    typedef short i16_t;
+    typedef unsigned short ui16_t;
+#elif defined(UINT_MAX) && UINT_MAX == 0xffff
+    typedef int i16_t;
+    typedef unsigned ui16_t;
+#else
+#   error "no 16-bit integer"
+#endif
+#if defined(UINT_MAX) && UINT_MAX == 0xffffffff
+    typedef int i32_t;
+    typedef unsigned ui32_t;
+#   define PI32 "d"
+#   define PUI32 "u"
+#elif defined(ULONG_MAX) && ULONG_MAX == 0xffffffff
+    typedef long i32_t;
+    typedef unsigned long ui32_t;
+#   define PI32 "ld"
+#   define PUI32 "lu"
+#else
+#   error "no 32-bit integer"
+#endif
+#if defined(ULONG_MAX) && ULONG_MAX == 0xffffffffffffffff
+    typedef long i64_t;
+    typedef unsigned long ui64_t;
+#   define PI64 "ld"
+#   define PUI64 "lu"
+#elif defined(ULLONG_MAX) && ULLONG_MAX == 0xffffffffffffffff
+    typedef long long i64_t;
+    typedef unsigned long long ui64_t;
+#   define PI64 "lld"
+#   define PUI64 "llu"
+#elif defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 0xffffffffffffffff
+    typedef long long i64_t;
+    typedef unsigned long long ui64_t;
+#   define PI64 "lld"
+#   define PUI64 "llu"
+#else
+#   error "no 64-bit integer"
+#endif
+#endif
diff --git a/third_party/zlib/contrib/minizip/ioapi.h b/third_party/zlib/contrib/minizip/ioapi.h
index a2d2e6e..f3b193d 100644
--- a/third_party/zlib/contrib/minizip/ioapi.h
+++ b/third_party/zlib/contrib/minizip/ioapi.h
@@ -18,8 +18,8 @@
 
 */
 
-#ifndef _ZLIBIOAPI64_H
-#define _ZLIBIOAPI64_H
+#ifndef ZLIBIOAPI64_H
+#define ZLIBIOAPI64_H
 
 #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
 
@@ -67,39 +67,12 @@
 #endif
 #endif
 
-/*
-#ifndef ZPOS64_T
-  #ifdef _WIN32
-                #define ZPOS64_T fpos_t
-  #else
-    #include <stdint.h>
-    #define ZPOS64_T uint64_t
-  #endif
-#endif
-*/
-
 #ifdef HAVE_MINIZIP64_CONF_H
 #include "mz64conf.h"
 #endif
 
-/* a type chosen by DEFINE */
-#ifdef HAVE_64BIT_INT_CUSTOM
-typedef  64BIT_INT_CUSTOM_TYPE ZPOS64_T;
-#else
-#ifdef HAS_STDINT_H
-#include "stdint.h"
-typedef uint64_t ZPOS64_T;
-#else
-
-
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-typedef unsigned __int64 ZPOS64_T;
-#else
-typedef unsigned long long int ZPOS64_T;
-#endif
-#endif
-#endif
+#include "ints.h"
+typedef ui64_t ZPOS64_T;
 
 /* Maximum unsigned 32-bit value used as placeholder for zip64 */
 #ifndef MAXU32
diff --git a/third_party/zlib/contrib/minizip/iowin32.c b/third_party/zlib/contrib/minizip/iowin32.c
index 3f6867f..393c9867 100644
--- a/third_party/zlib/contrib/minizip/iowin32.c
+++ b/third_party/zlib/contrib/minizip/iowin32.c
@@ -88,7 +88,7 @@
 }
 
 voidpf ZCALLBACK win32_open64_file_func(voidpf opaque, const void* filename, int mode) {
-    const char* mode_fopen = NULL;
+    (void)opaque;
     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
     HANDLE hFile = NULL;
 
@@ -116,7 +116,7 @@
 
 
 voidpf ZCALLBACK win32_open64_file_funcA(voidpf opaque, const void* filename, int mode) {
-    const char* mode_fopen = NULL;
+    (void)opaque;
     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
     HANDLE hFile = NULL;
 
@@ -139,7 +139,7 @@
 
 
 voidpf ZCALLBACK win32_open64_file_funcW(voidpf opaque, const void* filename, int mode) {
-    const char* mode_fopen = NULL;
+    (void)opaque;
     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
     HANDLE hFile = NULL;
 
@@ -158,7 +158,7 @@
 
 
 voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char* filename, int mode) {
-    const char* mode_fopen = NULL;
+    (void)opaque;
     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
     HANDLE hFile = NULL;
 
@@ -186,6 +186,7 @@
 
 
 uLong ZCALLBACK win32_read_file_func(voidpf opaque, voidpf stream, void* buf,uLong size) {
+    (void)opaque;
     uLong ret=0;
     HANDLE hFile = NULL;
     if (stream!=NULL)
@@ -207,6 +208,7 @@
 
 
 uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) {
+    (void)opaque;
     uLong ret=0;
     HANDLE hFile = NULL;
     if (stream!=NULL)
@@ -246,6 +248,7 @@
 }
 
 long ZCALLBACK win32_tell_file_func(voidpf opaque, voidpf stream) {
+    (void)opaque;
     long ret=-1;
     HANDLE hFile = NULL;
     if (stream!=NULL)
@@ -268,6 +271,7 @@
 }
 
 ZPOS64_T ZCALLBACK win32_tell64_file_func(voidpf opaque, voidpf stream) {
+    (void)opaque;
     ZPOS64_T ret= (ZPOS64_T)-1;
     HANDLE hFile = NULL;
     if (stream!=NULL)
@@ -292,6 +296,7 @@
 
 
 long ZCALLBACK win32_seek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) {
+    (void)opaque;
     DWORD dwMoveMethod=0xFFFFFFFF;
     HANDLE hFile = NULL;
 
@@ -329,6 +334,7 @@
 }
 
 long ZCALLBACK win32_seek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) {
+    (void)opaque;
     DWORD dwMoveMethod=0xFFFFFFFF;
     HANDLE hFile = NULL;
     long ret=-1;
@@ -367,6 +373,7 @@
 }
 
 int ZCALLBACK win32_close_file_func(voidpf opaque, voidpf stream) {
+    (void)opaque;
     int ret=-1;
 
     if (stream!=NULL)
@@ -384,6 +391,7 @@
 }
 
 int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream) {
+    (void)opaque;
     int ret=-1;
     if (stream!=NULL)
     {
diff --git a/third_party/zlib/contrib/minizip/miniunz.c b/third_party/zlib/contrib/minizip/miniunz.c
index 5b4312e..f4ad16b 100644
--- a/third_party/zlib/contrib/minizip/miniunz.c
+++ b/third_party/zlib/contrib/minizip/miniunz.c
@@ -39,6 +39,9 @@
 #endif
 
 
+#ifndef _CRT_SECURE_NO_WARNINGS
+#  define _CRT_SECURE_NO_WARNINGS
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -79,10 +82,11 @@
 
 /* change_file_date : change the date/time of a file
     filename : the filename of the file where date/time must be modified
-    dosdate : the new date at the MSDos format (4 bytes)
+    dosdate : the new date at the MSDOS format (4 bytes)
     tmu_date : the SAME new date at the tm_unz format */
 static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_date) {
 #ifdef _WIN32
+  (void)tmu_date;
   HANDLE hFile;
   FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
 
@@ -93,8 +97,7 @@
   LocalFileTimeToFileTime(&ftLocal,&ftm);
   SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
   CloseHandle(hFile);
-#else
-#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+#elif defined(__unix__) || defined(__unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
   (void)dosdate;
   struct utimbuf ut;
   struct tm newdate;
@@ -116,7 +119,6 @@
   (void)dosdate;
   (void)tmu_date;
 #endif
-#endif
 }
 
 
@@ -125,9 +127,9 @@
 
 static int mymkdir(const char* dirname) {
     int ret=0;
-#if defined(_WIN32)
+#ifdef _WIN32
     ret = _mkdir(dirname);
-#elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+#elif defined(__unix__) || defined(__unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
     ret = mkdir (dirname,0775);
 #else
     (void)dirname;
@@ -238,7 +240,7 @@
     printf("  ------  ------     ---- -----   ----    ----   ------     ----\n");
     for (i=0;i<gi.number_entry;i++)
     {
-        char filename_inzip[256];
+        char filename_inzip[65536+1];
         unz_file_info64 file_info;
         uLong ratio=0;
         const char *string_method = "";
@@ -303,7 +305,7 @@
 
 
 static int do_extract_currentfile(unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password) {
-    char filename_inzip[256];
+    char filename_inzip[65536+1];
     char* filename_withoutpath;
     char* p;
     int err=UNZ_OK;
@@ -354,6 +356,20 @@
         else
             write_filename = filename_withoutpath;
 
+        if (write_filename[0]!='\0')
+        {
+            const char* relative_check = write_filename;
+            while (relative_check[1]!='\0')
+            {
+                if (relative_check[0]=='.' && relative_check[1]=='.')
+                    write_filename = relative_check;
+                relative_check++;
+            }
+        }
+
+        while (write_filename[0]=='/' || write_filename[0]=='.')
+            write_filename++;
+
         err = unzOpenCurrentFilePassword(uf,password);
         if (err!=UNZ_OK)
         {
diff --git a/third_party/zlib/contrib/minizip/minizip.c b/third_party/zlib/contrib/minizip/minizip.c
index 9eb3956..53fdd363 100644
--- a/third_party/zlib/contrib/minizip/minizip.c
+++ b/third_party/zlib/contrib/minizip/minizip.c
@@ -40,6 +40,9 @@
 
 
 
+#ifndef _CRT_SECURE_NO_WARNINGS
+#  define _CRT_SECURE_NO_WARNINGS
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -58,6 +61,7 @@
 #endif
 
 #include "zip.h"
+#include "ints.h"
 
 #ifdef _WIN32
         #define USEWIN32IOAPI
@@ -73,6 +77,7 @@
 /* f: name of file to get info on, tmzip: return value: access,
    modification and creation times, dt: dostime */
 static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
+  (void)tmzip;
   int ret = 0;
   {
       FILETIME ftLocal;
@@ -90,8 +95,7 @@
   }
   return ret;
 }
-#else
-#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+#elif defined(__unix__) || defined(__unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
 /* f: name of file to get info on, tmzip: return value: access,
    modification and creation times, dt: dostime */
 static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
@@ -142,7 +146,6 @@
     return 0;
 }
 #endif
-#endif
 
 
 
@@ -191,7 +194,7 @@
         do
         {
             err = ZIP_OK;
-            size_read = fread(buf,1,size_buf,fin);
+            size_read = (unsigned long)fread(buf,1,size_buf,fin);
             if (size_read < size_buf)
                 if (feof(fin)==0)
             {
@@ -223,7 +226,7 @@
     FSEEKO_FUNC(pFile, 0, SEEK_END);
     pos = (ZPOS64_T)FTELLO_FUNC(pFile);
 
-                printf("File : %s is %llu bytes\n", filename, pos);
+                printf("File : %s is %"PUI64" bytes\n", filename, pos);
 
     if(pos >= 0xffffffff)
      largeFile = 1;
@@ -243,7 +246,7 @@
     char filename_try[MAXFILENAME+16];
     int zipok;
     int err=0;
-    size_t size_buf=0;
+    unsigned long size_buf=0;
     void* buf=NULL;
     const char* password=NULL;
 
@@ -305,7 +308,7 @@
     }
     else
     {
-        int i,len;
+        int len;
         int dot_found=0;
 
         zipok = 1 ;
diff --git a/third_party/zlib/contrib/minizip/mztools.c b/third_party/zlib/contrib/minizip/mztools.c
index c8d2375..f86c1e71 100644
--- a/third_party/zlib/contrib/minizip/mztools.c
+++ b/third_party/zlib/contrib/minizip/mztools.c
@@ -5,6 +5,9 @@
 */
 
 /* Code */
+#ifndef _CRT_SECURE_NO_WARNINGS
+#  define _CRT_SECURE_NO_WARNINGS
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -140,28 +143,28 @@
 
         /* Central directory entry */
         {
-          char header[46];
+          char central[46];
           char* comment = "";
           int comsize = (int) strlen(comment);
-          WRITE_32(header, 0x02014b50);
-          WRITE_16(header + 4, version);
-          WRITE_16(header + 6, version);
-          WRITE_16(header + 8, gpflag);
-          WRITE_16(header + 10, method);
-          WRITE_16(header + 12, filetime);
-          WRITE_16(header + 14, filedate);
-          WRITE_32(header + 16, crc);
-          WRITE_32(header + 20, cpsize);
-          WRITE_32(header + 24, uncpsize);
-          WRITE_16(header + 28, fnsize);
-          WRITE_16(header + 30, extsize);
-          WRITE_16(header + 32, comsize);
-          WRITE_16(header + 34, 0);     /* disk # */
-          WRITE_16(header + 36, 0);     /* int attrb */
-          WRITE_32(header + 38, 0);     /* ext attrb */
-          WRITE_32(header + 42, currentOffset);
+          WRITE_32(central, 0x02014b50);
+          WRITE_16(central + 4, version);
+          WRITE_16(central + 6, version);
+          WRITE_16(central + 8, gpflag);
+          WRITE_16(central + 10, method);
+          WRITE_16(central + 12, filetime);
+          WRITE_16(central + 14, filedate);
+          WRITE_32(central + 16, crc);
+          WRITE_32(central + 20, cpsize);
+          WRITE_32(central + 24, uncpsize);
+          WRITE_16(central + 28, fnsize);
+          WRITE_16(central + 30, extsize);
+          WRITE_16(central + 32, comsize);
+          WRITE_16(central + 34, 0);    /* disk # */
+          WRITE_16(central + 36, 0);    /* int attrb */
+          WRITE_32(central + 38, 0);    /* ext attrb */
+          WRITE_32(central + 42, currentOffset);
           /* Header */
-          if (fwrite(header, 1, 46, fpOutCD) == 46) {
+          if (fwrite(central, 1, 46, fpOutCD) == 46) {
             offsetCD += 46;
 
             /* Filename */
@@ -215,23 +218,23 @@
     /* Final central directory  */
     {
       int entriesZip = entries;
-      char header[22];
+      char end[22];
       char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
       int comsize = (int) strlen(comment);
       if (entriesZip > 0xffff) {
         entriesZip = 0xffff;
       }
-      WRITE_32(header, 0x06054b50);
-      WRITE_16(header + 4, 0);    /* disk # */
-      WRITE_16(header + 6, 0);    /* disk # */
-      WRITE_16(header + 8, entriesZip);   /* hack */
-      WRITE_16(header + 10, entriesZip);  /* hack */
-      WRITE_32(header + 12, offsetCD);    /* size of CD */
-      WRITE_32(header + 16, offset);      /* offset to CD */
-      WRITE_16(header + 20, comsize);     /* comment */
+      WRITE_32(end, 0x06054b50);
+      WRITE_16(end + 4, 0);         /* disk # */
+      WRITE_16(end + 6, 0);         /* disk # */
+      WRITE_16(end + 8, entriesZip);        /* hack */
+      WRITE_16(end + 10, entriesZip);       /* hack */
+      WRITE_32(end + 12, offsetCD);         /* size of CD */
+      WRITE_32(end + 16, offset);           /* offset to CD */
+      WRITE_16(end + 20, comsize);          /* comment */
 
       /* Header */
-      if (fwrite(header, 1, 22, fpOutCD) == 22) {
+      if (fwrite(end, 1, 22, fpOutCD) == 22) {
 
         /* Comment field */
         if (comsize > 0) {
diff --git a/third_party/zlib/contrib/minizip/skipset.h b/third_party/zlib/contrib/minizip/skipset.h
new file mode 100644
index 0000000..5e648b9
--- /dev/null
+++ b/third_party/zlib/contrib/minizip/skipset.h
@@ -0,0 +1,361 @@
+// skipset.h -- set operations using a skiplist
+// Copyright (C) 2024 Mark Adler
+// See MiniZip_info.txt for the license.
+
+// This implements a skiplist set, i.e. just keys, no data, with ~O(log n) time
+// insert and search operations. The application defines the type of a key, and
+// provides a function to compare two keys.
+
+// This header is not definitions of functions found in another source file --
+// it creates the set functions, with the application's key type, right where
+// the #include is. Before this header is #included, these must be defined:
+//
+// 1. A macro or typedef for set_key_t, the type of a key.
+// 2. A macro or function set_cmp(a, b) to compare two keys. The return values
+//    are < 0 for a < b, 0 for a == b, and > 0 for a > b.
+// 3. A macro or function set_drop(s, k) to release the key k's resources, if
+//    any, when doing a set_end() or set_clear(). s is a pointer to the set
+//    that key is in, for use with set_free() if desired.
+//
+// Example usage:
+//
+//      typedef int set_key_t;
+//      #define set_cmp(a, b) ((a) < (b) ? -1 : (a) == (b) ? 0 : 1)
+//      #define set_drop(s, k)
+//      #include "skipset.h"
+//
+//      int test(void) {        // return 0: good, 1: bad, -1: out of memory
+//          set_t set;
+//          if (setjmp(set.env))
+//              return -1;
+//          set_start(&set);
+//          set_insert(&set, 2);
+//          set_insert(&set, 1);
+//          set_insert(&set, 7);
+//          int bad = !set_found(&set, 2);
+//          bad = bad || set_found(&set, 5);
+//          set_end(&set);
+//          return bad;
+//      }
+//
+// Interface summary (see more details below):
+// - set_t is the type of the set being operated on (a set_t pointer is passed)
+// - set_start() initializes a new, empty set (initialize set.env first)
+// - set_insert() inserts a new key into the set, or not if it's already there
+// - set_found() determines whether or not a key is in the set
+// - set_end() ends the use of the set, freeing all memory
+// - set_clear() empties the set, equivalent to set_end() and then set_start()
+// - set_ok() checks if set appears to be usable, i.e. started and not ended
+//
+// Auxiliary functions available to the application:
+// - set_alloc() allocates memory with optional tracking (#define SET_TRACK)
+// - set_free() deallocates memory allocated by set_alloc()
+// - set_rand() returns 32 random bits (seeded by set_start())
+
+#ifndef SKIPSET_H
+#define SKIPSET_H
+
+#include <stdlib.h>     // realloc(), free(), NULL, size_t
+#include <stddef.h>     // ptrdiff_t
+#include <setjmp.h>     // jmp_buf, longjmp()
+#include <errno.h>      // ENOMEM
+#include <time.h>       // time(), clock()
+#include <assert.h>     // assert.h
+#include "ints.h"       // i16_t, ui32_t, ui64_t
+
+// Structures and functions below noted as "--private--" should not be used by
+// the application. set_t is partially private and partially public -- see the
+// comments there.
+
+// There is no POSIX random() in MSVC, and rand() is awful. For portability, we
+// cannot rely on a library function for random numbers. Instead we use the
+// fast and effective algorithm below, invented by Melissa O'Neill.
+
+// *Really* minimal PCG32 code / (c) 2014 M.E. O'Neill / www.pcg-random.org
+// Licensed under Apache License 2.0 (NO WARRANTY, etc. see website)
+// --private-- Random number generator state.
+typedef struct {
+    ui64_t state;       // 64-bit generator state
+    ui64_t inc;         // 63-bit sequence id
+} set_rand_t;
+// --private-- Initialize the state *gen using seed and seq. seed seeds the
+// advancing 64-bit state. seq is a sequence selection constant.
+void set_seed(set_rand_t *gen, ui64_t seed, ui64_t seq) {
+    gen->inc = (seq << 1) | 1;
+    gen->state = (seed + gen->inc) * 6364136223846793005ULL + gen->inc;
+}
+// Return 32 random bits, advancing the state *gen.
+ui32_t set_rand(set_rand_t *gen) {
+    ui64_t state = gen->state;
+    gen->state = state * 6364136223846793005ULL + gen->inc;
+    ui32_t mix = (ui32_t)(((state >> 18) ^ state) >> 27);
+    int rot = state >> 59;
+    return (mix >> rot) | (mix << ((-rot) & 31));
+}
+// End of PCG32 code.
+
+// --private-- Linked-list node.
+typedef struct set_node_s set_node_t;
+struct set_node_s {
+    set_key_t key;          // the key (not used for head or path)
+    i16_t size;             // number of allocated pointers in right[]
+    i16_t fill;             // number of pointers in right[] filled in
+    set_node_t **right;     // pointer for each level, each to the right
+};
+
+// A set. The application sets env, may use gen with set_rand(), and may read
+// allocs and memory. The remaining variables are --private-- .
+typedef struct set_s {
+    set_node_t *head;       // skiplist head -- no key, just links
+    set_node_t *path;       // right[] is path to key from set_found()
+    set_node_t *node;       // node under construction, in case of longjmp()
+    i16_t depth;            // maximum depth of the skiplist
+    ui64_t ran;             // a precious trove of random bits
+    set_rand_t gen;         // random number generator state
+    jmp_buf env;            // setjmp() environment for allocation errors
+#ifdef SET_TRACK
+    size_t allocs;          // number of allocations
+    size_t memory;          // total amount of allocated memory (>= requests)
+#endif
+} set_t;
+
+// Memory allocation and deallocation. set_alloc(set, ptr, size) returns a
+// pointer to an allocation of size bytes if ptr is NULL, or the previous
+// allocation ptr resized to size bytes. set_alloc() will never return NULL.
+// set_free(set, ptr) frees an allocation created by set_alloc(). These may be
+// used by the application. e.g. if allocation tracking is desired.
+#ifdef SET_TRACK
+// Track the number of allocations and the total backing memory size.
+#  if defined(_WIN32)
+#    include <malloc.h>
+#    define SET_ALLOC_SIZE(ptr) _msize(ptr)
+#  elif defined(__MACH__)
+#    include <malloc/malloc.h>
+#    define SET_ALLOC_SIZE(ptr) malloc_size(ptr)
+#  elif defined(__linux__)
+#    include <malloc.h>
+#    define SET_ALLOC_SIZE(ptr) malloc_usable_size(ptr)
+#  elif defined(__FreeBSD__)
+#    include <malloc_np.h>
+#    define SET_ALLOC_SIZE(ptr) malloc_usable_size(ptr)
+#  elif defined(__NetBSD__)
+#    include <jemalloc/jemalloc.h>
+#    define SET_ALLOC_SIZE(ptr) malloc_usable_size(ptr)
+#  else     // e.g. OpenBSD
+#    define SET_ALLOC_SIZE(ptr) 0
+#  endif
+// With tracking.
+void *set_alloc(set_t *set, void *ptr, size_t size) {
+    size_t had = ptr == NULL ? 0 : SET_ALLOC_SIZE(ptr);
+    void *mem = realloc(ptr, size);
+    if (mem == NULL)
+        longjmp(set->env, ENOMEM);
+    set->allocs += ptr == NULL;
+    set->memory += SET_ALLOC_SIZE(mem) - had;
+    return mem;
+}
+void set_free(set_t *set, void *ptr) {
+    if (ptr != NULL) {
+        set->allocs--;
+        set->memory -= SET_ALLOC_SIZE(ptr);
+        free(ptr);
+    }
+}
+#else
+// Without tracking.
+void *set_alloc(set_t *set, void *ptr, size_t size) {
+    void *mem = realloc(ptr, size);
+    if (mem == NULL)
+        longjmp(set->env, ENOMEM);
+    return mem;
+}
+void set_free(set_t *set, void *ptr) {
+    (void)set;
+    free(ptr);
+}
+#endif
+
+// --private-- Grow node's array right[] as needed to be able to hold at least
+// want links. If fill is true, assure that the first want links are filled in,
+// setting them to set->head if not previously filled in. Otherwise it is
+// assumed that the first want links are about to be filled in.
+void set_grow(set_t *set, set_node_t *node, int want, int fill) {
+    if (node->size < want) {
+        int more = node->size ? node->size : 1;
+        while (more < want)
+            more <<= 1;
+        node->right = set_alloc(set, node->right, more * sizeof(set_node_t *));
+        node->size = (i16_t)more;
+    }
+    int i;
+    if (fill)
+        for (i = node->fill; i < want; i++)
+            node->right[i] = set->head;
+    node->fill = (i16_t)want;
+}
+
+// --private-- Return a new node. key is left uninitialized.
+set_node_t *set_node(set_t *set) {
+    set_node_t *node = set_alloc(set, NULL, sizeof(set_node_t));
+    node->size = 0;
+    node->fill = 0;
+    node->right = NULL;
+    return node;
+}
+
+// --private-- Free the list linked from head, along with the keys.
+void set_sweep(set_t *set) {
+    set_node_t *step = set->head->right[0];
+    while (step != set->head) {
+        set_node_t *next = step->right[0];      // save link to next node
+        set_drop(set, step->key);
+        set_free(set, step->right);
+        set_free(set, step);
+        step = next;
+    }
+}
+
+// Initialize a new set. set->env must be initialized using setjmp() before
+// set_start() is called. A longjmp(set->env, ENOMEM) will be used to handle a
+// memory allocation failure during any of the operations. (See setjmp.h and
+// errno.h.) The set can still be used if this happens, assuming that it didn't
+// happen during set_start(). Whether set_start() completed or not, set_end()
+// can be used to free the set's memory after a longjmp().
+void set_start(set_t *set) {
+#ifdef SET_TRACK
+    set->allocs = 0;
+    set->memory = 0;
+#endif
+    set->head = set->path = set->node = NULL;   // in case set_node() fails
+    set->path = set_node(set);
+    set->head = set_node(set);
+    set_grow(set, set->head, 1, 1); // one link back to head for an empty set
+    *(unsigned char *)&set->head->key = 137;    // set id
+    set->depth = 0;
+    set_seed(&set->gen, ((ui64_t)(ptrdiff_t)set << 32) ^
+                        ((ui64_t)time(NULL) << 12) ^ clock(), 0);
+    set->ran = 1;
+}
+
+// Return true if *set appears to be in a usable state. If *set has been zeroed
+// out, then set_ok(set) will be false and set_end(set) will be safe.
+int set_ok(set_t *set) {
+    return set->head != NULL &&
+           set->head->right != NULL &&
+           *(unsigned char *)&set->head->key == 137;
+}
+
+// Empty the set. This frees the memory used for the previous set contents.
+// After set_clear(), *set is ready for use, as if after a set_start().
+void set_clear(set_t *set) {
+    assert(set_ok(set) && "improper use");
+
+    // Free all the keys and their nodes.
+    set_sweep(set);
+
+    // Leave the head and path allocations as is. Clear their contents, with
+    // head pointing to itself and setting depth to zero, for an empty set.
+    set->head->right[0] = set->head;
+    set->head->fill = 1;
+    set->path->fill = 0;
+    set->depth = 0;
+}
+
+// Done using the set -- free all allocations. The only operation on *set
+// permitted after this is set_start(). Though another set_end() would do no
+// harm. This can be done at any time after a set_start(), or after a longjmp()
+// on any allocation failure, including during a set_start().
+void set_end(set_t *set) {
+    if (set->head != NULL) {
+        // Empty the set and free the head node.
+        if (set->head->right != NULL) {
+            set_sweep(set);
+            set_free(set, set->head->right);
+        }
+        set_free(set, set->head);
+        set->head = NULL;
+    }
+    if (set->path != NULL) {
+        // Free the path work area.
+        set_free(set, set->path->right);
+        set_free(set, set->path);
+        set->path = NULL;
+    }
+    if (set->node != NULL) {
+        // Free the node that was under construction when longjmp() hit.
+        set_drop(set, set->node->key);
+        set_free(set, set->node->right);
+        set_free(set, set->node);
+        set->node = NULL;
+    }
+}
+
+// Look for key. Return 1 if found or 0 if not. This also puts the path to get
+// there in set->path, for use by set_insert().
+int set_found(set_t *set, set_key_t key) {
+    assert(set_ok(set) && "improper use");
+
+    // Start at depth and work down and right as determined by key comparisons.
+    set_node_t *head = set->head, *here = head;
+    int i = set->depth;
+    set_grow(set, set->path, i + 1, 0);
+    do {
+        while (here->right[i] != head &&
+               set_cmp(here->right[i]->key, key) < 0)
+            here = here->right[i];
+        set->path->right[i] = here;
+    } while (i--);
+
+    // See if the key matches.
+    here = here->right[0];
+    return here != head && set_cmp(here->key, key) == 0;
+}
+
+// Insert the key key. Return 0 on success, or 1 if key is already in the set.
+int set_insert(set_t *set, set_key_t key) {
+    assert(set_ok(set) && "improper use");
+
+    if (set_found(set, key))
+        // That key is already in the set.
+        return 1;
+
+    // Randomly generate a new level-- level 0 with probability 1/2, 1 with
+    // probability 1/4, 2 with probability 1/8, etc.
+    int level = 0;
+    for (;;) {
+        if (set->ran == 1)
+            // Ran out. Get another 32 random bits.
+            set->ran = set_rand(&set->gen) | (1ULL << 32);
+        int bit = set->ran & 1;
+        set->ran >>= 1;
+        if (bit)
+            break;
+        assert(level < 32767 &&
+               "Overhead, without any fuss, the stars were going out.");
+        level++;
+    }
+    if (level > set->depth) {
+        // The maximum depth is now deeper. Update the structures.
+        set_grow(set, set->path, level + 1, 1);
+        set_grow(set, set->head, level + 1, 1);
+        set->depth = (i16_t)level;
+    }
+
+    // Make a new node for the provided key, and insert it in the lists up to
+    // and including level.
+    set->node = set_node(set);
+    set->node->key = key;
+    set_grow(set, set->node, level + 1, 0);
+    int i;
+    for (i = 0; i <= level; i++) {
+        set->node->right[i] = set->path->right[i]->right[i];
+        set->path->right[i]->right[i] = set->node;
+    }
+    set->node = NULL;
+    return 0;
+}
+
+#else
+#error ** another skiplist set already created here
+// Would need to implement a prefix in order to support multiple sets.
+#endif
diff --git a/third_party/zlib/contrib/minizip/unzip.c b/third_party/zlib/contrib/minizip/unzip.c
index 3576a85..a39e1752 100644
--- a/third_party/zlib/contrib/minizip/unzip.c
+++ b/third_party/zlib/contrib/minizip/unzip.c
@@ -88,7 +88,7 @@
 
 
 #ifndef CASESENSITIVITYDEFAULT_NO
-#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+#  if (!defined(__unix__) && !defined(__unix) || defined(__CYGWIN__))  && !defined(CASESENSITIVITYDEFAULT_YES)
 #    define CASESENSITIVITYDEFAULT_NO
 #  endif
 #endif
@@ -113,7 +113,7 @@
 const char unz_copyright[] =
    " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
 
-/* unz_file_info_interntal contain internal info about a file in zipfile*/
+/* unz_file_info64_internal contain internal info about a file in zipfile*/
 typedef struct unz_file_info64_internal_s
 {
     ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
@@ -336,7 +336,6 @@
 #define CENTRALDIRINVALID ((ZPOS64_T)(-1))
 #endif
 
-
 /*
   Locate the Central directory of a zipfile (at the end, just before
     the global comment)
@@ -467,7 +466,7 @@
     if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
         return CENTRALDIRINVALID;
 
-    /* number of the disk with the start of the zip64 end of  central directory */
+    /* number of the disk with the start of the zip64 end of central directory */
     if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
         return CENTRALDIRINVALID;
     if (uL != 0)
@@ -514,9 +513,9 @@
     ZPOS64_T central_pos;
     uLong   uL;
 
-    uLong number_disk;          /* number of the current dist, used for
+    uLong number_disk;          /* number of the current disk, used for
                                    spanning ZIP, unsupported, always 0*/
-    uLong number_disk_with_CD;  /* number the the disk with central dir, used
+    uLong number_disk_with_CD;  /* number the disk with central dir, used
                                    for spanning ZIP, unsupported, always 0*/
     ZPOS64_T number_entry_CD;      /* total number of entries in
                                    the central dir
@@ -1682,7 +1681,7 @@
                 uInt i;
                 for(i=0;i<uReadThis;i++)
                   pfile_in_zip_read_info->read_buffer[i] =
-                      zdecode(s->keys,s->pcrc_32_tab,
+                      (char)zdecode(s->keys,s->pcrc_32_tab,
                               pfile_in_zip_read_info->read_buffer[i]);
             }
 #            endif
diff --git a/third_party/zlib/contrib/minizip/unzip.h b/third_party/zlib/contrib/minizip/unzip.h
index 1410584..ceb614e 100644
--- a/third_party/zlib/contrib/minizip/unzip.h
+++ b/third_party/zlib/contrib/minizip/unzip.h
@@ -306,13 +306,17 @@
   Get Info about the current file
   if pfile_info!=NULL, the *pfile_info structure will contain some info about
         the current file
-  if szFileName!=NULL, the filemane string will be copied in szFileName
+  if szFileName!=NULL, the filename string will be copied in szFileName
             (fileNameBufferSize is the size of the buffer)
   if extraField!=NULL, the extra field information will be copied in extraField
             (extraFieldBufferSize is the size of the buffer).
             This is the Central-header version of the extra field
   if szComment!=NULL, the comment string of the file will be copied in szComment
             (commentBufferSize is the size of the buffer)
+  The file name and comment will be zero-terminated if there is room in the
+  provided buffer. Otherwise the buffer will contain as much as will fit. If at
+  least 65537 bytes of room is provided, then the result will always be
+  complete and zero-terminated.
 */
 
 
diff --git a/third_party/zlib/contrib/minizip/zip.c b/third_party/zlib/contrib/minizip/zip.c
index e2e9da07..93d2612 100644
--- a/third_party/zlib/contrib/minizip/zip.c
+++ b/third_party/zlib/contrib/minizip/zip.c
@@ -25,8 +25,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <stdint.h>
 #include <time.h>
+#ifndef ZLIB_CONST
+#  define ZLIB_CONST
+#endif
 #include "zlib.h"
 #include "zip.h"
 
@@ -123,6 +125,19 @@
 } linkedlist_data;
 
 
+// zipAlreadyThere() set functions for a set of zero-terminated strings, and
+// a block_t type for reading the central directory datablocks.
+typedef char *set_key_t;
+#define set_cmp(a, b) strcmp(a, b)
+#define set_drop(s, k) set_free(s, k)
+#include "skipset.h"
+typedef struct {
+    unsigned char *next;        // next byte in datablock data
+    size_t left;                // number of bytes left in data (at least)
+    linkedlist_datablock_internal *node;    // current datablock
+} block_t;
+
+
 typedef struct
 {
     z_stream stream;            /* zLib stream structure for inflate */
@@ -174,6 +189,10 @@
     char *globalcomment;
 #endif
 
+    // Support for zipAlreadyThere().
+    set_t set;              // set for detecting name collisions
+    block_t block;          // block for reading the central directory
+
 } zip64_internal;
 
 
@@ -264,6 +283,228 @@
     return ZIP_OK;
 }
 
+// zipAlreadyThere() operations. "set" in the zip internal structure keeps the
+// set of names that are in the under-construction central directory so far. A
+// skipset provides ~O(log n) time insertion and searching. Central directory
+// records, stored in a linked list of allocated memory datablocks, is read
+// through "block" in the zip internal structure.
+
+// The block_*() functions support extracting the central directory file names
+// from the datablocks. They are designed to support a growing directory by
+// automatically continuing once more data has been appended to the linked
+// datablocks.
+
+// Initialize *block to the head of list. This should only be called once the
+// list has at least some data in it, i.e. list->first_block is not NULL.
+local void block_init(block_t *block, linkedlist_data *list) {
+    block->node = list->first_block;
+    block->next = block->node->data;
+    block->left = block->node->filled_in_this_block;
+}
+
+// Mark *block as bad, with all subsequent reads returning end, even if more
+// data is added to the datablocks. This is invoked if the central directory is
+// invalid, so there is no longer any point in attempting to interpret it.
+local void block_stop(block_t *block) {
+    block->left = 0;
+    block->next = NULL;
+}
+
+// Return true if *block has reached the end of the data in the datablocks.
+local int block_end(block_t *block) {
+    linkedlist_datablock_internal *node = block->node;
+    if (node == NULL)
+        // This block was previously terminated with extreme prejudice.
+        return 1;
+    if (block->next < node->data + node->filled_in_this_block)
+        // There are more bytes to read in the current datablock.
+        return 0;
+    while (node->next_datablock != NULL) {
+        if (node->filled_in_this_block != 0)
+            // There are some bytes in a later datablock.
+            return 0;
+        node = node->next_datablock;
+    }
+    // Reached the end of the list of datablocks. There's nothing.
+    return 1;
+}
+
+// Return one byte from *block, or -1 if the end is reached.
+local int block_get(block_t *block) {
+    while (block->left == 0) {
+        if (block->node == NULL)
+            // We've been marked bad. Return end.
+            return -1;
+        // Update left in case more was filled in since we were last here.
+        block->left = block->node->filled_in_this_block -
+                      (block->next - block->node->data);
+        if (block->left != 0)
+            // There was indeed more data appended in the current datablock.
+            break;
+        if (block->node->next_datablock == NULL)
+            // No more data here, and there is no next datablock. At the end.
+            return -1;
+        // Try the next datablock for more data.
+        block->node = block->node->next_datablock;
+        block->next = block->node->data;
+        block->left = block->node->filled_in_this_block;
+    }
+    // We have a byte to return.
+    block->left--;
+    return *block->next++;
+}
+
+// Return a 16-bit unsigned little-endian value from block, or a negative value
+// if the end is reached.
+local long block_get2(block_t *block) {
+    long got = block_get(block);
+    return got | ((unsigned long)block_get(block) << 8);
+}
+
+// Read up to len bytes from block into buf. Return the number of bytes read.
+local size_t block_read(block_t *block, unsigned char *buf, size_t len) {
+    size_t need = len;
+    while (need) {
+        if (block->left == 0) {
+            // Get a byte to update and step through the linked list as needed.
+            int got = block_get(block);
+            if (got == -1)
+                // Reached the end.
+                break;
+            *buf++ = (unsigned char)got;
+            need--;
+            continue;
+        }
+        size_t take = need > block->left ? block->left : need;
+        memcpy(buf, block->next, take);
+        block->next += take;
+        block->left -= take;
+        buf += take;
+        need -= take;
+    }
+    return len - need;      // return the number of bytes copied
+}
+
+// Skip n bytes in block. Return 0 on success or -1 if there are less than n
+// bytes to the end.
+local int block_skip(block_t *block, size_t n) {
+    while (n > block->left) {
+        n -= block->left;
+        block->next += block->left;
+        block->left = 0;
+        if (block_get(block) == -1)
+            return -1;
+        n--;
+    }
+    block->next += n;
+    block->left -= n;
+    return 0;
+}
+
+// Process the next central directory record at *block. Return the allocated,
+// zero-terminated file name, or NULL for end of input or invalid data. If
+// invalid, *block is marked bad. This uses *set for the allocation of memory.
+local char *block_central_name(block_t *block, set_t *set) {
+    char *name = NULL;
+    for (;;) {
+        if (block_end(block))
+            // At the end of the central directory (so far).
+            return NULL;
+
+        // Check for a central directory record signature.
+        if (block_get2(block) != (CENTRALHEADERMAGIC & 0xffff) ||
+            block_get2(block) != (CENTRALHEADERMAGIC >> 16))
+            // Incorrect signature.
+            break;
+
+        // Go through the remaining fixed-length portion of the record,
+        // extracting the lengths of the three variable-length fields.
+        block_skip(block, 24);
+        unsigned flen = block_get2(block);      // file name length
+        unsigned xlen = block_get2(block);      // extra field length
+        unsigned clen = block_get2(block);      // comment field length
+        if (block_skip(block, 12) == -1)
+            // Premature end of the record.
+            break;
+
+        // Extract the name and skip over the extra and comment fields.
+        name = set_alloc(set, NULL, flen + 1);
+        if (block_read(block, (unsigned char *)name, flen) < flen ||
+            block_skip(block, xlen + clen) == -1)
+            // Premature end of the record.
+            break;
+
+        // Check for embedded nuls in the name.
+        if (memchr(name, 0, flen) != NULL) {
+            // This name can never match the zero-terminated name provided to
+            // zipAlreadyThere(), so we discard it and go back to get another
+            // name. (Who the heck is putting nuls inside their zip file entry
+            // names anyway?)
+            set_free(set, name);
+            continue;
+        }
+
+        // All good. Return the zero-terminated file name.
+        name[flen] = 0;
+        return name;
+    }
+
+    // Invalid signature or premature end of the central directory record.
+    // Abandon trying to process the central directory.
+    set_free(set, name);
+    block_stop(block);
+    return NULL;
+}
+
+// Return 0 if name is not in the central directory so far, 1 if it is, -1 if
+// the central directory is invalid, -2 if out of memory, or ZIP_PARAMERROR if
+// file is NULL.
+extern int ZEXPORT zipAlreadyThere(zipFile file, char const *name) {
+    zip64_internal *zip = file;
+    if (zip == NULL)
+        return ZIP_PARAMERROR;
+    if (zip->central_dir.first_block == NULL)
+        // No central directory yet, so no, name isn't there.
+        return 0;
+    if (setjmp(zip->set.env)) {
+        // Memory allocation failure.
+        set_end(&zip->set);
+        return -2;
+    }
+    if (!set_ok(&zip->set)) {
+        // This is the first time here with some central directory content. We
+        // construct this set of names only on demand. Prepare set and block.
+        set_start(&zip->set);
+        block_init(&zip->block, &zip->central_dir);
+    }
+
+    // Update the set of names from the current central directory contents.
+    // This reads any new central directory records since the last time we were
+    // here.
+    for (;;) {
+        char *there = block_central_name(&zip->block, &zip->set);
+        if (there == NULL) {
+            if (zip->block.next == NULL)
+                // The central directory is invalid.
+                return -1;
+            break;
+        }
+
+        // Add there to the set.
+        if (set_insert(&zip->set, there))
+            // There's already a duplicate in the central directory! We'll just
+            // let this be and carry on.
+            set_free(&zip->set, there);
+    }
+
+    // Return true if name is in the central directory.
+    size_t len = strlen(name);
+    char *copy = set_alloc(&zip->set, NULL, len + 1);
+    strcpy(copy, name);
+    int found = set_found(&zip->set, copy);
+    set_free(&zip->set, copy);
+    return found;
+}
 
 
 /****************************************************************************/
@@ -551,7 +792,7 @@
 
     for (i=(int)uReadSize-3; (i--)>0;)
     {
-      // Signature "0x07064b50" Zip64 end of central directory locater
+      // Signature "0x07064b50" Zip64 end of central directory locator
       if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
       {
         uPosFound = uReadPos+(unsigned)i;
@@ -575,7 +816,7 @@
   if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
     return 0;
 
-  /* number of the disk with the start of the zip64 end of  central directory */
+  /* number of the disk with the start of the zip64 end of central directory */
   if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
     return 0;
   if (uL != 0)
@@ -843,6 +1084,7 @@
     ziinit.number_entry = 0;
     ziinit.add_position_when_writing_offset = 0;
     init_linkedlist(&(ziinit.central_dir));
+    memset(&ziinit.set, 0, sizeof(set_t));  // make sure set appears dormant
 
 
 
@@ -1027,7 +1269,6 @@
     int err = ZIP_OK;
 
 #    ifdef NOCRYPT
-    (crcForCrypting);
     if (password != NULL)
         return ZIP_PARAMERROR;
 #    endif
@@ -1412,7 +1653,7 @@
     else
 #endif
     {
-      zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf;
+      zi->ci.stream.next_in = buf;
       zi->ci.stream.avail_in = len;
 
       while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
@@ -1608,7 +1849,7 @@
 
       if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree)
       {
-        // we can not write more data to the buffer that we have room for.
+        // we cannot write more data to the buffer that we have room for.
         return ZIP_BADZIPFILE;
       }
 
@@ -1871,6 +2112,8 @@
     }
     free_linkedlist(&(zi->central_dir));
 
+    set_end(&zi->set);          // set was zeroed, so this is safe
+
     pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
     if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF)
     {
diff --git a/third_party/zlib/contrib/minizip/zip.h b/third_party/zlib/contrib/minizip/zip.h
index 3e230d34..1f7f0b2 100644
--- a/third_party/zlib/contrib/minizip/zip.h
+++ b/third_party/zlib/contrib/minizip/zip.h
@@ -35,7 +35,7 @@
 
         See header of zip.h
 
-*/
+ */
 
 #ifndef _zip12_H
 #define _zip12_H
@@ -127,12 +127,12 @@
      If the zipfile cannot be opened, the return value is NULL.
      Else, the return value is a zipFile Handle, usable with other function
        of this zip package.
-*/
+ */
 
 /* Note : there is no delete function into a zipfile.
    If you want delete file into a zipfile, you must open a zipfile, and create another
    Of course, you can use RAW reading and writing to copy the file you did not want delete
-*/
+ */
 
 extern zipFile ZEXPORT zipOpen2(const char *pathname,
                                 int append,
@@ -186,7 +186,7 @@
   zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
                     this MUST be '1' if the uncompressed size is >= 0xffffffff.
 
-*/
+ */
 
 
 extern int ZEXPORT zipOpenNewFileInZip2(zipFile file,
@@ -311,12 +311,12 @@
                                        unsigned len);
 /*
   Write data in the zipfile
-*/
+ */
 
 extern int ZEXPORT zipCloseFileInZip(zipFile file);
 /*
   Close the current file in the zipfile
-*/
+ */
 
 extern int ZEXPORT zipCloseFileInZipRaw(zipFile file,
                                         uLong uncompressed_size,
@@ -326,17 +326,23 @@
                                           ZPOS64_T uncompressed_size,
                                           uLong crc32);
 
+extern int ZEXPORT zipAlreadyThere(zipFile file,
+                                   char const* name);
+/*
+  See if name is already in file's central directory.
+ */
+
 /*
   Close the current file in the zipfile, for file opened with
     parameter raw=1 in zipOpenNewFileInZip2
   uncompressed_size and crc32 are value for the uncompressed size
-*/
+ */
 
 extern int ZEXPORT zipClose(zipFile file,
                             const char* global_comment);
 /*
   Close the zipfile
-*/
+ */
 
 
 extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader);
@@ -355,7 +361,7 @@
 
                         Remove ZIP64 Extra information from a Local File Header extra field data
         zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001);
-*/
+ */
 
 #ifdef __cplusplus
 }
diff --git a/third_party/zlib/patches/0008-minizip-zip-unzip-tools.patch b/third_party/zlib/patches/0008-minizip-zip-unzip-tools.patch
index 273a8c9..a359e0f 100644
--- a/third_party/zlib/patches/0008-minizip-zip-unzip-tools.patch
+++ b/third_party/zlib/patches/0008-minizip-zip-unzip-tools.patch
@@ -9,7 +9,7 @@
  2 files changed, 9 insertions(+), 11 deletions(-)
 
 diff --git a/third_party/zlib/contrib/minizip/miniunz.c b/third_party/zlib/contrib/minizip/miniunz.c
-index 8ada038dbd4e7..5b4312e5647cd 100644
+index 616c30325e07c..f4ad16bdd377b 100644
 --- a/third_party/zlib/contrib/minizip/miniunz.c
 +++ b/third_party/zlib/contrib/minizip/miniunz.c
 @@ -12,7 +12,7 @@
@@ -30,31 +30,26 @@
  // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
  #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
  #define FTELLO_FUNC(stream) ftello(stream)
-@@ -94,7 +94,7 @@ static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_dat
+@@ -97,7 +97,7 @@ static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_dat
+   LocalFileTimeToFileTime(&ftLocal,&ftm);
    SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
    CloseHandle(hFile);
- #else
--#if defined(unix) || defined(__APPLE__)
-+#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+-#elif defined(__unix__) || defined(__unix) || defined(__APPLE__)
++#elif defined(__unix__) || defined(__unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
    (void)dosdate;
    struct utimbuf ut;
    struct tm newdate;
-@@ -125,11 +125,9 @@ static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_dat
- 
- static int mymkdir(const char* dirname) {
+@@ -129,7 +129,7 @@ static int mymkdir(const char* dirname) {
      int ret=0;
--#ifdef _WIN32
-+#if defined(_WIN32)
+ #ifdef _WIN32
      ret = _mkdir(dirname);
--#elif unix
--    ret = mkdir (dirname,0775);
--#elif __APPLE__
-+#elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+-#elif defined(__unix__) || defined(__unix) || defined(__APPLE__)
++#elif defined(__unix__) || defined(__unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
      ret = mkdir (dirname,0775);
  #else
      (void)dirname;
 diff --git a/third_party/zlib/contrib/minizip/minizip.c b/third_party/zlib/contrib/minizip/minizip.c
-index 26ee8d029efe6..9eb3956a55e00 100644
+index a44e36a01869d..53fdd363e6222 100644
 --- a/third_party/zlib/contrib/minizip/minizip.c
 +++ b/third_party/zlib/contrib/minizip/minizip.c
 @@ -12,8 +12,7 @@
@@ -76,14 +71,12 @@
  // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
  #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
  #define FTELLO_FUNC(stream) ftello(stream)
-@@ -92,7 +91,7 @@ static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
+@@ -96,7 +95,7 @@ static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
+   }
    return ret;
  }
- #else
--#if defined(unix) || defined(__APPLE__)
-+#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+-#elif defined(__unix__) || defined(__unix) || defined(__APPLE__)
++#elif defined(__unix__) || defined(__unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
  /* f: name of file to get info on, tmzip: return value: access,
     modification and creation times, dt: dostime */
  static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
---
-2.31.1.818.g46aad6cb9e-goog
diff --git a/third_party/zlib/patches/0015-minizip-unzip-enable-decryption.patch b/third_party/zlib/patches/0015-minizip-unzip-enable-decryption.patch
index 966e83c..feeeb1c 100644
--- a/third_party/zlib/patches/0015-minizip-unzip-enable-decryption.patch
+++ b/third_party/zlib/patches/0015-minizip-unzip-enable-decryption.patch
@@ -18,17 +18,6 @@
 index 82275d6c1775d..c8a01b23efd42 100644
 --- a/third_party/zlib/contrib/minizip/unzip.c
 +++ b/third_party/zlib/contrib/minizip/unzip.c
-@@ -68,10 +68,6 @@
- #include <stdlib.h>
- #include <string.h>
- 
--#ifndef NOUNCRYPT
--        #define NOUNCRYPT
--#endif
--
- #include "zlib.h"
- #include "unzip.h"
- 
 @@ -1502,6 +1498,7 @@ extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method,
              zdecode(s->keys,s->pcrc_32_tab,source[i]);
  
diff --git a/third_party/zstd/README.chromium b/third_party/zstd/README.chromium
index 6bfd8af..3cbb1bf3 100644
--- a/third_party/zstd/README.chromium
+++ b/third_party/zstd/README.chromium
@@ -1,7 +1,7 @@
 Name: Zstandard
 Short Name: zstd
 URL: https://github.com/facebook/zstd
-Version: b0a179d469680276adbd4007435989a6b7fd8b4f
+Version: 80af41e08a630946a75a5cda9e4cdf192247f20a
 License: BSD-3-Clause
 License File: src/LICENSE
 CPEPrefix: cpe:/a:facebook:zstandard:1.5.5
diff --git a/third_party/zstd/src b/third_party/zstd/src
index b0a179d..80af41e 160000
--- a/third_party/zstd/src
+++ b/third_party/zstd/src
@@ -1 +1 @@
-Subproject commit b0a179d469680276adbd4007435989a6b7fd8b4f
+Subproject commit 80af41e08a630946a75a5cda9e4cdf192247f20a
diff --git a/tools/determinism/deterministic_build_ignorelist.pyl b/tools/determinism/deterministic_build_ignorelist.pyl
index 1983438..5b8db0b 100644
--- a/tools/determinism/deterministic_build_ignorelist.pyl
+++ b/tools/determinism/deterministic_build_ignorelist.pyl
@@ -19,6 +19,9 @@
   ],
 
   'fuchsia': [
+    # https://crbug.com/40271942
+    'target1_test_rlib_crate_v0_2_unittests',
+    'target2_test_rlib_crate_v0_2_unittests',
   ],
 
   'linux': [
@@ -68,6 +71,11 @@
   ],
 
   'linux_component': [
+    # https://crbug.com/40271942
+    'target1_test_rlib_crate_v0_2_unittests',
+    'target2_test_rlib_crate_v0_2_unittests',
+    'obj/third_party/swiftshader/third_party/llvm-10.0/swiftshader_llvm_most/Attributes.o',
+
     # https://crbug.com/1008035
     'nacl_test_data/extension_vcache_test/glibc/extension_validation_cache_libs/lib64/libppapi_cpp_lib.so',
     'nacl_test_data/glibc/pm_exit_status_test_libs/lib64/libppapi_cpp_lib.so',
@@ -121,6 +129,32 @@
 
   # https://crbug.com/330260
   'win': [
+    # https://crbug.com/40271942
+    'bindgen_static_fns_test_lib_unittests.exe',
+    'bindgen_static_fns_test_lib_unittests.exe.pdb',
+    'bindgen_test_lib_unittests.exe',
+    'bindgen_test_lib_unittests.exe.pdb',
+    'foo_tests.exe',
+    'foo_tests.exe.pdb',
+    'target1_test_rlib_crate_v0_2_unittests.exe',
+    'target1_test_rlib_crate_v0_2_unittests.exe.pdb',
+    'target2_test_rlib_crate_v0_2_unittests.exe',
+    'target2_test_rlib_crate_v0_2_unittests.exe.pdb',
+    'test_aliased_deps_unittests.exe',
+    'test_aliased_deps_unittests.exe.pdb',
+    'test_lib_v1_unittests.exe',
+    'test_lib_v1_unittests.exe.pdb',
+    'test_lib_v2_unittests.exe',
+    'test_lib_v2_unittests.exe.pdb',
+    'test_rust_exe_unittests.exe',
+    'test_rust_exe_unittests.exe.pdb',
+    'test_rust_metadata_unittests.exe',
+    'test_rust_metadata_unittests.exe.pdb',
+    'test_rust_static_library_unittests.exe',
+    'test_rust_static_library_unittests.exe.pdb',
+    'test_rust_unittests.exe',
+    'test_rust_unittests.exe.pdb',
+
     # https://crbug.com/1008035
     'ppapi_nacl_tests_pnacl_newlib_x32.nexe',
     'ppapi_nacl_tests_pnacl_newlib_x64.nexe',
diff --git a/tools/grit/grit/testdata/allowlist_resources.grd b/tools/grit/grit/testdata/allowlist_resources.grd
index eaffe8b7..f9b7587 100644
--- a/tools/grit/grit/testdata/allowlist_resources.grd
+++ b/tools/grit/grit/testdata/allowlist_resources.grd
@@ -1,7 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0"
-      current_release="1"
-      output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="allowlist_test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index c92e398..034a8fcc 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -350,7 +350,7 @@
 </histogram>
 
 <histogram name="Accessibility.Android.PageZoom.MainFrameZoomFactor"
-    units="zoom factor %" expires_after="2025-05-11">
+    units="zoom factor %" expires_after="2025-07-13">
   <owner>mschillaci@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -817,7 +817,7 @@
 </histogram>
 
 <histogram name="Accessibility.CrosDictation.ToggleDictationMethod"
-    enum="CrosDictationToggleDictationMethod" expires_after="2025-02-28">
+    enum="CrosDictationToggleDictationMethod" expires_after="2025-07-13">
   <owner>anastasi@google.com</owner>
   <owner>dtseng@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -1543,7 +1543,7 @@
 </histogram>
 
 <histogram name="Accessibility.InactiveTime" units="ms"
-    expires_after="2025-02-28">
+    expires_after="2025-07-13">
   <owner>aleventhal@chromium.org</owner>
   <owner>abigailbklein@chromium.org</owner>
   <owner>janewman@microsoft.com</owner>
@@ -1908,7 +1908,7 @@
 </histogram>
 
 <histogram name="Accessibility.MainNodeAnnotations.AnnotationResult"
-    enum="MainNodeAnnotationResult" expires_after="2025-02-28">
+    enum="MainNodeAnnotationResult" expires_after="2025-07-13">
   <owner>abigailbklein@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -1920,7 +1920,7 @@
 </histogram>
 
 <histogram name="Accessibility.ManuallyEnabled" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>aleventhal@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/account_manager/histograms.xml b/tools/metrics/histograms/metadata/account_manager/histograms.xml
index 01f3261..41babab4 100644
--- a/tools/metrics/histograms/metadata/account_manager/histograms.xml
+++ b/tools/metrics/histograms/metadata/account_manager/histograms.xml
@@ -156,7 +156,7 @@
 </histogram>
 
 <histogram name="AccountManager.NumAccounts" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sinhak@chromium.org</owner>
   <owner>emaamari@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ai/enums.xml b/tools/metrics/histograms/metadata/ai/enums.xml
index 64f633c1..56989a2 100644
--- a/tools/metrics/histograms/metadata/ai/enums.xml
+++ b/tools/metrics/histograms/metadata/ai/enums.xml
@@ -117,6 +117,9 @@
     Success to load TranslateKit binary but one or more function pointers are
     null.
   </int>
+  <int value="4" label="InvalidVersion">
+    Success to load TranslateKit binary but the binary version is invalid.
+  </int>
 </enum>
 
 <!-- LINT.ThenChange(//components/services/on_device_translation/translate_kit_client.h:LoadTranslateKitResult) -->
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index fd433fef..254157a0 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -279,7 +279,7 @@
 </variants>
 
 <histogram name="Android.ActivityStop.NumberOfTabsUsed" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gauravjj@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -295,7 +295,7 @@
 </histogram>
 
 <histogram name="Android.ActivityStop.PercentageOfTabsUsed" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gauravjj@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -1409,7 +1409,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.Files.Count" units="files"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>joelhockey@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1433,7 +1433,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.FromWebContent.DropInWebContent.Duration"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1445,7 +1445,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.FromWebContent.Duration{DropResult}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1465,7 +1465,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.FromWebContent.TargetType"
-    enum="AndroidDragTargetType" expires_after="2025-05-11">
+    enum="AndroidDragTargetType" expires_after="2025-07-13">
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1477,7 +1477,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.Image.OpenFileTime.FirstAttempt" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1491,7 +1491,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.Image.OpenFileTime.FirstExpired" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1508,7 +1508,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.Image.OpenFileTime.LastAttempt" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1524,7 +1524,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.Image.Size" units="KB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1610,7 +1610,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.Tab.SourceWindowClosed" enum="Boolean"
-    expires_after="2025-05-13">
+    expires_after="2025-07-13">
   <owner>aishwaryarj@google.com</owner>
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -2009,7 +2009,7 @@
 </histogram>
 
 <histogram name="Android.HistoryPage.ClearBrowsingData.PerProfileType"
-    enum="BrowserProfileType" expires_after="2025-05-11">
+    enum="BrowserProfileType" expires_after="2025-07-13">
   <owner>roagarwal@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -2092,7 +2092,7 @@
 </histogram>
 
 <histogram name="Android.IncognitoReauth.AuthResult"
-    enum="DeviceAuthFinalResult" expires_after="2025-05-11">
+    enum="DeviceAuthFinalResult" expires_after="2025-07-13">
   <owner>roagarwal@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -2102,7 +2102,7 @@
 </histogram>
 
 <histogram name="Android.IncognitoReauth.PrefToggledFromSettingPage"
-    enum="IncognitoReauthToggleValueType" expires_after="2025-05-11">
+    enum="IncognitoReauthToggleValueType" expires_after="2025-07-13">
   <owner>roagarwal@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -2287,7 +2287,7 @@
 </histogram>
 
 <histogram name="Android.Intent.MainFrameIntentLaunch"
-    enum="MainFrameIntentLaunch" expires_after="2025-05-11">
+    enum="MainFrameIntentLaunch" expires_after="2025-07-13">
   <owner>mthiesse@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -2297,7 +2297,7 @@
 </histogram>
 
 <histogram name="Android.Intent.ShareIntentUrlCount" units="URLs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mthiesse@chromium.org</owner>
   <owner>tedchoc@google.com</owner>
   <summary>
@@ -2442,7 +2442,7 @@
 </histogram>
 
 <histogram name="Android.Messages.Dismissed{MessageIdentifier}"
-    enum="MessageDismissReason" expires_after="2025-05-11">
+    enum="MessageDismissReason" expires_after="2025-07-13">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/components/messages/OWNERS</owner>
   <summary>
@@ -2593,7 +2593,7 @@
 </histogram>
 
 <histogram name="Android.Messages.Stacking.{Action}" enum="MessageIdentifier"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/components/messages/OWNERS</owner>
   <summary>
@@ -2643,7 +2643,7 @@
 </histogram>
 
 <histogram name="Android.Messages.TimeToAction{MessageIdentifier}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/components/messages/OWNERS</owner>
   <summary>
@@ -2854,7 +2854,7 @@
 
 <histogram
     name="Android.MultiWindowMode.AssertIndicesMatch{ActivityIndexMismatchAssignmentState}"
-    enum="PreAssignedActivityState" expires_after="2025-05-11">
+    enum="PreAssignedActivityState" expires_after="2025-07-13">
   <owner>wenyufu@chromium.org</owner>
   <owner>aishwaryarj@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -2887,7 +2887,7 @@
 </histogram>
 
 <histogram name="Android.MultiWindowMode.DraggedTabOpenedNewWindow"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>aishwaryarj@google.com</owner>
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
@@ -3918,7 +3918,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DocumentLoadResult.Paired" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -3940,7 +3940,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DocumentLoadTime.FirstPaired" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -3951,7 +3951,7 @@
 </histogram>
 
 <histogram name="Android.Pdf.DocumentLoadTime.Paired" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shuyng@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -4702,7 +4702,7 @@
 </histogram>
 
 <histogram name="Android.SpareTab.FinalStatus" enum="SpareTabFinalStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sreejakshetty@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <summary>
@@ -4839,7 +4839,7 @@
 </histogram>
 
 <histogram name="Android.Tab.CreateNewTabDuration.{TabLaunchType}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sreejakshetty@chromium.org</owner>
   <owner>spelchat@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
@@ -5239,7 +5239,7 @@
 </histogram>
 
 <histogram name="Android.ThumbnailCache.InMemoryCacheEntries"
-    units="thumbnails" expires_after="2025-05-11">
+    units="thumbnails" expires_after="2025-07-13">
   <owner>ckitagawa@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <summary>
@@ -5250,7 +5250,7 @@
 </histogram>
 
 <histogram name="Android.ThumbnailCache.InMemoryCacheSize" units="KiB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ckitagawa@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <summary>
@@ -5664,7 +5664,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Callback.Counts" enum="WebViewCallbackType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ntfschr@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5694,7 +5694,7 @@
 </histogram>
 
 <histogram name="Android.WebView.ComponentUpdater.GetFilesDuration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5705,7 +5705,7 @@
 </histogram>
 
 <histogram name="Android.WebView.ComponentUpdater.GetFilesResult"
-    enum="WebViewComponentUpdaterGetFilesResult" expires_after="2025-05-11">
+    enum="WebViewComponentUpdaterGetFilesResult" expires_after="2025-07-13">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5727,7 +5727,7 @@
 </histogram>
 
 <histogram name="Android.WebView.ComponentUpdater.UnexpectedExit"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5738,7 +5738,7 @@
 </histogram>
 
 <histogram name="Android.WebView.ComponentUpdater.UpdateJobDuration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -6204,7 +6204,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Gfx.HardwareDrawType"
-    enum="WebViewDrawAndSubmissionType" expires_after="2025-05-11">
+    enum="WebViewDrawAndSubmissionType" expires_after="2025-07-13">
   <owner>vasilyt@chromium.org</owner>
   <owner>boliu@chromium.org</owner>
   <summary>
@@ -6944,7 +6944,7 @@
 
 <histogram
     name="Android.WebView.RequestedWithHeader.HadWebContentsForPartitionOrigin"
-    enum="BooleanAvailable" expires_after="2025-05-11">
+    enum="BooleanAvailable" expires_after="2025-07-13">
   <owner>pbirk@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -7154,7 +7154,7 @@
 </histogram>
 
 <histogram name="Android.WebView.SecureCookieAction" enum="SecureCookieAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ntfschr@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 6c039b6..4cbcd102 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -338,7 +338,7 @@
   <token key="AppInstallSurface" variants="AppInstallSurface"/>
 </histogram>
 
-<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2025-05-11">
+<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2025-07-13">
   <owner>tapted@chromium.org</owner>
   <owner>benwells@chromium.org</owner>
   <summary>
@@ -348,7 +348,7 @@
 </histogram>
 
 <histogram name="Apps.AppLaunchPerAppType" enum="AppType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ovn@google.com</owner>
   <owner>cros-web-apps-team@google.com</owner>
   <summary>
@@ -358,7 +358,7 @@
 </histogram>
 
 <histogram name="Apps.AppLaunchPerAppTypeV2" enum="AppTypeV2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ovn@google.com</owner>
   <owner>cros-web-apps-team@google.com</owner>
   <summary>
@@ -368,7 +368,7 @@
 </histogram>
 
 <histogram name="Apps.AppLaunchSource" enum="LaunchSource"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ovn@google.com</owner>
   <owner>cros-web-apps-team@google.com</owner>
   <summary>Records an app launch grouped by launch source.</summary>
@@ -637,7 +637,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.DriveSearchProvider.DriveFSLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tby@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
   <summary>
@@ -874,7 +874,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.NumberOfApps" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tbarzic@chromium.org</owner>
   <owner>mmourgos@chromium.org</owner>
   <owner>gzadina@google.com</owner>
@@ -1295,7 +1295,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.Search.Session2.{LauncherSearchEntryPoint}"
-    enum="LauncherSearchSessionConclusion" expires_after="2025-05-11">
+    enum="LauncherSearchSessionConclusion" expires_after="2025-07-13">
   <owner>yulunwu@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>tbarzic@chromium.org</owner>
@@ -1463,7 +1463,7 @@
 
 <histogram
     name="Apps.AppList.SortDiscoveryDurationAfterEducationNudgeV2.{TabletOrClamshell}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>andrewxu@chromium.org</owner>
   <owner>tbarzic@chromium.org</owner>
   <summary>
@@ -1719,7 +1719,7 @@
 </histogram>
 
 <histogram name="Apps.AppListAppLaunchedV2{AppListState}"
-    enum="AppListLaunchedFrom" expires_after="2025-05-11">
+    enum="AppListLaunchedFrom" expires_after="2025-07-13">
   <owner>tbarzic@chromium.org</owner>
   <owner>mmourgos@chromium.org</owner>
   <owner>newcomer@chromium.org</owner>
@@ -2050,7 +2050,7 @@
 </histogram>
 
 <histogram name="Apps.AppListPageSwitcherSource"
-    enum="AppListPageSwitcherSource" expires_after="2025-05-11">
+    enum="AppListPageSwitcherSource" expires_after="2025-07-13">
   <owner>tbarzic@chromium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <owner>mmourgos@chromium.org</owner>
@@ -2125,7 +2125,7 @@
 </histogram>
 
 <histogram name="Apps.AppListSearchResultOpenTypeV2" enum="AppListSearchResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" -->
 
   <owner>tbarzic@chromium.org</owner>
@@ -2151,7 +2151,7 @@
 </histogram>
 
 <histogram name="Apps.AppListShowSource" enum="AppListShowSource"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tbarzic@chromium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <summary>
@@ -2204,7 +2204,7 @@
 </histogram>
 
 <histogram name="Apps.ArcGhostWindowLaunch" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sstan@chromium.org</owner>
   <summary>
@@ -2309,7 +2309,7 @@
 </histogram>
 
 <histogram name="Apps.CreateShortcuts.Mac.Result2"
-    enum="WebAppCreateShortcutMacResult" expires_after="2025-05-11">
+    enum="WebAppCreateShortcutMacResult" expires_after="2025-07-13">
   <owner>mek@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -2791,7 +2791,7 @@
 </histogram>
 
 <histogram name="Apps.RestoreNotification" enum="RestoreAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index e3eef33..95c0d852 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -372,7 +372,7 @@
 </histogram>
 
 <histogram name="Arc.App.LowMemoryKills.{ArcAppKillType}Count10Minutes"
-    units="Apps" expires_after="2025-05-11">
+    units="Apps" expires_after="2025-07-13">
   <owner>cwd@google.com</owner>
   <owner>cros-vm-technology@google.com</owner>
   <summary>
@@ -384,7 +384,7 @@
 
 <histogram
     name="Arc.App.LowMemoryKills.{ArcBackgroundVms}.{ArcAppKillType}Count10Minutes"
-    units="Apps" expires_after="2025-05-11">
+    units="Apps" expires_after="2025-07-13">
   <owner>cwd@google.com</owner>
   <owner>cros-vm-technology@google.com</owner>
   <summary>
@@ -397,7 +397,7 @@
 
 <histogram
     name="Arc.App.LowMemoryKills{ArcAppKillDailyBackgroundVms}{ArcAppKillDailyType}"
-    units="Apps" expires_after="2025-05-11">
+    units="Apps" expires_after="2025-07-13">
   <owner>cwd@google.com</owner>
   <owner>cros-vm-technology@google.com</owner>
   <summary>
@@ -420,7 +420,7 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.AppCount" units="units" expires_after="2025-05-11">
+<histogram name="Arc.AppCount" units="units" expires_after="2025-07-13">
   <owner>khmel@google.com</owner>
   <owner>fahdi@google.com</owner>
   <summary>
@@ -529,7 +529,7 @@
 </histogram>
 
 <histogram name="Arc.AppInstalledReason" enum="InstallationCounterReasonEnum"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thanhdng@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <summary>
@@ -609,7 +609,7 @@
 </histogram>
 
 <histogram name="Arc.AppSync.InitialSession.InstalledAppSize" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>batoon@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -848,7 +848,7 @@
 </histogram>
 
 <histogram name="Arc.CompanionLibraryApisCounter"
-    enum="CompanionLibraryApisList" expires_after="2025-05-11">
+    enum="CompanionLibraryApisList" expires_after="2025-07-13">
   <owner>sstan@google.com</owner>
   <owner>preranap@google.com</owner>
   <owner>arc-commercial@google.com</owner>
@@ -1057,7 +1057,7 @@
 </histogram>
 
 <histogram name="Arc.EngagementTime.ArcTotal" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mduggan@google.com</owner>
   <owner>yhanada@google.com</owner>
   <owner>arc-framework@google.com</owner>
@@ -1071,7 +1071,7 @@
 </histogram>
 
 <histogram name="Arc.EngagementTime.Background" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mduggan@google.com</owner>
   <owner>yhanada@google.com</owner>
   <owner>arc-framework@google.com</owner>
@@ -1083,7 +1083,7 @@
 </histogram>
 
 <histogram name="Arc.EngagementTime.Foreground" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mduggan@google.com</owner>
   <owner>yhanada@google.com</owner>
   <owner>arc-framework@google.com</owner>
@@ -1094,7 +1094,7 @@
 </histogram>
 
 <histogram name="Arc.EngagementTime.Total" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mduggan@google.com</owner>
   <owner>yhanada@google.com</owner>
   <owner>arc-framework@google.com</owner>
@@ -1514,7 +1514,7 @@
 </histogram>
 
 <histogram name="Arc.Net.ArcNetworkError" enum="ArcNetworkError"
-    expires_after="2024-12-31">
+    expires_after="2025-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-networking@google.com</owner>
   <summary>
@@ -1562,7 +1562,7 @@
 </histogram>
 
 <histogram name="Arc.Net.Qos.QosSocketPercentage" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>chuweih@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1592,7 +1592,7 @@
 </histogram>
 
 <histogram name="Arc.Notifications.IsCustomNotification"
-    enum="BooleanIsCustomNotification" expires_after="2025-05-11">
+    enum="BooleanIsCustomNotification" expires_after="2025-07-13">
   <owner>shuminghao@google.com</owner>
   <owner>arc-framework@google.com</owner>
   <summary>
@@ -1628,7 +1628,7 @@
 </histogram>
 
 <histogram name="Arc.OptInAction" enum="ArcOptInAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jhorwich@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1914,7 +1914,7 @@
 </histogram>
 
 <histogram name="Arc.Provisioning.DeviceAffiliationAction"
-    enum="UnaffiliatedDeviceArcAllowedStatus" expires_after="2025-05-11">
+    enum="UnaffiliatedDeviceArcAllowedStatus" expires_after="2025-07-13">
   <owner>preranap@google.com</owner>
   <owner>arc-commercial@google.com</owner>
   <summary>
@@ -2279,7 +2279,7 @@
 </histogram>
 
 <histogram name="Arc.Supervision.Transition.Result"
-    enum="ArcSupervisionTransitionResult" expires_after="2025-04-27">
+    enum="ArcSupervisionTransitionResult" expires_after="2025-07-13">
   <owner>jhorwich@google.com</owner>
   <owner>arc-commercial@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 1574638..267e34c 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -460,7 +460,7 @@
 </variants>
 
 <histogram name="Ash.Accelerators.Actions.{ActionName}" units="Shortcuts"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dpad@google.com</owner>
   <owner>jimmyxgong@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -1074,7 +1074,7 @@
 </histogram>
 
 <histogram name="Ash.Birch.Coral.Action" enum="CoralActionType"
-    expires_after="2025-03-30">
+    expires_after="2025-07-13">
   <owner>zxdan@chromium.org</owner>
   <owner>cros-coral@google.com</owner>
   <summary>
@@ -1104,7 +1104,7 @@
 </histogram>
 
 <histogram name="Ash.Birch.Coral.ClusterItemRemoved" units="count"
-    expires_after="2025-03-30">
+    expires_after="2025-07-13">
   <owner>zxdan@chromium.org</owner>
   <owner>cros-coral@google.com</owner>
   <summary>
@@ -2539,7 +2539,7 @@
 </histogram>
 
 <histogram name="Ash.CaptureModeController.ScreenshotsPerDay" units="int"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>afakhry@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <owner>chromeos-wm@google.com</owner>
@@ -2591,7 +2591,7 @@
 
 <histogram
     name="Ash.CaptureModeController.SearchResultClicked.{TabletOrClamshell}"
-    enum="Boolean" expires_after="2025-05-07">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>hewer@chromium.org</owner>
   <owner>sophiewen@google.com</owner>
   <summary>
@@ -3053,7 +3053,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.DesksCount3" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>afakhry@chromium.org</owner>
   <owner>chromeos-wm@google.com</owner>
   <summary>
@@ -3388,7 +3388,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.WeeklyActiveDesks" units="active desks"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>afakhry@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <owner>chromeos-wm@google.com</owner>
@@ -3793,7 +3793,7 @@
 </histogram>
 
 <histogram name="Ash.Display.{DisplayType}.ActiveEffectiveDPI" units="dpi"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -3959,7 +3959,7 @@
 </histogram>
 
 <histogram name="Ash.EventLatency.Core.NoOverflow.TotalLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xiyuan@chromium.org</owner>
   <owner>yichenz@chromium.org</owner>
   <owner>cros-sw-perf@google.com</owner>
@@ -4151,7 +4151,7 @@
 </histogram>
 
 <histogram name="Ash.Float.MultitaskMenuActionType.{TabletOrClamshell}"
-    enum="MultitaskMenuActionType" expires_after="2025-05-11">
+    enum="MultitaskMenuActionType" expires_after="2025-07-13">
   <owner>sophiewen@chromium.org</owner>
   <owner>chromeos-wm@chromium.org</owner>
   <summary>
@@ -5520,7 +5520,7 @@
 </histogram>
 
 <histogram name="Ash.LoginAnimation.Duration2.{TabletOrClamshell}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>oshima@chromium.org</owner>
   <owner>zhzhliu@google.com</owner>
   <owner>cros-sw-perf@google.com</owner>
@@ -6788,7 +6788,7 @@
 </histogram>
 
 <histogram name="Ash.Overview.AnimationSmoothness.Enter{OverviewAnimationMode}"
-    units="%" expires_after="2025-05-11">
+    units="%" expires_after="2025-07-13">
   <owner>achuith@chromium.org</owner>
   <owner>cros-sw-perf@google.com</owner>
   <summary>
@@ -6800,7 +6800,7 @@
 </histogram>
 
 <histogram name="Ash.Overview.AnimationSmoothness.Exit{OverviewAnimationMode}"
-    units="%" expires_after="2025-05-11">
+    units="%" expires_after="2025-07-13">
   <owner>achuith@chromium.org</owner>
   <owner>cros-sw-perf@google.com</owner>
   <summary>
@@ -6872,7 +6872,7 @@
 </histogram>
 
 <histogram name="Ash.Overview.EndAction" enum="OverviewEndAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>minch@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -6979,7 +6979,7 @@
 </histogram>
 
 <histogram name="Ash.Overview.StartAction" enum="OverviewStartAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>minch@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -7234,7 +7234,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.DynamicColor.StaticColorButton"
-    enum="PersonalizationDynamicColorStaticColor" expires_after="2025-05-11">
+    enum="PersonalizationDynamicColorStaticColor" expires_after="2025-07-13">
   <owner>ericamlee@google.com</owner>
   <owner>cros-p13n-eng@google.com</owner>
   <summary>
@@ -7264,7 +7264,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.KeyboardBacklight.Color"
-    enum="PersonalizationKeyboardBacklightColor" expires_after="2025-05-11">
+    enum="PersonalizationKeyboardBacklightColor" expires_after="2025-07-13">
   <owner>jasontt@chromium.org</owner>
   <owner>cros-p13n-eng@google.com</owner>
   <summary>
@@ -8745,7 +8745,7 @@
 </histogram>
 
 <histogram name="Ash.Shelf.NumberOfPinnedItems" units="Icons"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>anasalazar@chromium.org</owner>
   <owner>mmourgos@google.com</owner>
   <summary>
@@ -9018,7 +9018,7 @@
 </histogram>
 
 <histogram name="Ash.SnapGroups.SnapGroupActualDuration" units="seconds"
-    expires_after="2025-05-08">
+    expires_after="2025-07-13">
   <owner>sophiewen@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <owner>cros-snap-groups@google.com</owner>
@@ -9029,7 +9029,7 @@
 </histogram>
 
 <histogram name="Ash.SnapGroups.SnapGroupExitPoint" enum="SnapGroupExitPoint"
-    expires_after="2025-05-08">
+    expires_after="2025-07-13">
   <owner>sophiewen@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <owner>cros-snap-groups@google.com</owner>
@@ -9037,7 +9037,7 @@
 </histogram>
 
 <histogram name="Ash.SnapGroups.SnapGroupPersistenceDuration" units="seconds"
-    expires_after="2025-05-08">
+    expires_after="2025-07-13">
   <owner>sophiewen@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <owner>cros-snap-groups@google.com</owner>
@@ -9048,7 +9048,7 @@
 </histogram>
 
 <histogram name="Ash.SnapGroups.SnapGroupsCount" units="int"
-    expires_after="2025-05-08">
+    expires_after="2025-07-13">
   <owner>sophiewen@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <owner>cros-snap-groups@google.com</owner>
@@ -10065,7 +10065,7 @@
 </histogram>
 
 <histogram name="Ash.Wallpaper.Source2" enum="WallpaperType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thuongphan@chromium.org</owner>
   <owner>cros-p13n-eng@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 a9bf0a3..cf79c634 100644
--- a/tools/metrics/histograms/metadata/ash_growth/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash_growth/histograms.xml
@@ -74,7 +74,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsManager.GetCampaignBySlot"
-    enum="CampaignSlot" expires_after="2025-04-27">
+    enum="CampaignSlot" expires_after="2025-07-13">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/assistant/histograms.xml b/tools/metrics/histograms/metadata/assistant/histograms.xml
index bc935fd8..bfc73f9 100644
--- a/tools/metrics/histograms/metadata/assistant/histograms.xml
+++ b/tools/metrics/histograms/metadata/assistant/histograms.xml
@@ -54,7 +54,7 @@
 </histogram>
 
 <histogram name="Assistant.EntryPoint" enum="AssistantEntryPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
@@ -176,7 +176,7 @@
 </histogram>
 
 <histogram name="Assistant.QueryResponseType" enum="AssistantQueryResponseType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>The Assistant query response type.</summary>
@@ -193,7 +193,7 @@
 </histogram>
 
 <histogram name="Assistant.ServiceEnabledUserCount" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
index dd55cbef..ad7aa907 100644
--- a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
+++ b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
@@ -153,7 +153,7 @@
 
 <histogram
     name="Conversions.AggregatableReport.ExtraReportDelayForSuccessfulSend"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>tquintanilla@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -687,7 +687,7 @@
 </histogram>
 
 <histogram name="Conversions.HeadersSize.Register{Type}" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tquintanilla@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -737,7 +737,7 @@
 </histogram>
 
 <histogram name="Conversions.ImpressionNavigationHasDeadInitiator"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -879,7 +879,7 @@
 
 <histogram
     name="Conversions.NumDataHostsRegisteredOnClientBounce.{Interaction}.{Duration}"
-    units="data hosts" expires_after="2025-05-11">
+    units="data hosts" expires_after="2025-07-13">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1295,7 +1295,7 @@
 </histogram>
 
 <histogram name="Conversions.Storage.FindMatchingSourceTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>apaseltiner@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 1e3c0e1d..cd910b7a5 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -863,7 +863,7 @@
 </histogram>
 
 <histogram name="Autofill.Address.IsEnabled.PageLoad" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -873,7 +873,7 @@
 </histogram>
 
 <histogram name="Autofill.Address.IsEnabled.Startup" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1150,7 +1150,7 @@
 
 <histogram
     name="Autofill.Autocomplete.PredictionCollisionType2.{PredictionType}.{AutocompleteState}"
-    enum="AutofillFieldType" expires_after="2025-05-11">
+    enum="AutofillFieldType" expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -1661,7 +1661,7 @@
 
 <histogram
     name="Autofill.CreditCard.Seamless{AutofillSeamlessnessFillability}{AutofillSeamlessnessMeasurementTime}{AutofillSeamlessnessVisibility}"
-    enum="CreditCardSeamlessFill" expires_after="2025-05-11">
+    enum="CreditCardSeamlessFill" expires_after="2025-07-13">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1705,7 +1705,7 @@
 
 <histogram
     name="Autofill.CreditCard.Seamless{AutofillSeamlessnessFillability}{AutofillSeamlessnessMeasurementTime}{AutofillSeamlessnessVisibility}.Bitmask"
-    enum="AutofillCreditCardSeamlessnessBitmask" expires_after="2025-05-11">
+    enum="AutofillCreditCardSeamlessnessBitmask" expires_after="2025-07-13">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -2305,7 +2305,7 @@
 
 <histogram
     name="Autofill.Deduplication.ExistingProfiles.RankOfStoredQuasiDuplicateProfiles"
-    units="Rank" expires_after="2025-05-11">
+    units="Rank" expires_after="2025-07-13">
   <owner>koerber@chromium.org</owner>
   <owner>fleimgruber@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -2375,7 +2375,7 @@
 
 <histogram
     name="Autofill.Deduplication.{Scenario}.TypeOfQuasiDuplicateToken.{DuplicationRank}"
-    enum="AutofillSettingsVisibleTypes" expires_after="2025-05-11">
+    enum="AutofillSettingsVisibleTypes" expires_after="2025-07-13">
   <owner>koerber@chromium.org</owner>
   <owner>fleimgruber@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -2707,7 +2707,7 @@
 </histogram>
 
 <histogram name="Autofill.FieldFillingStats{AutofillFormType}{FillingStatus}"
-    units="fields" expires_after="2025-05-11">
+    units="fields" expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3073,7 +3073,7 @@
 </histogram>
 
 <histogram name="Autofill.FormFillingScore{AutofillFormType}"
-    units="filling score" expires_after="2025-05-11">
+    units="filling score" expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3563,7 +3563,7 @@
 </histogram>
 
 <histogram name="Autofill.iOS.FormSubmission.IsProgrammatic" enum="Boolean"
-    expires_after="M135">
+    expires_after="2025-07-13">
   <owner>eic@google.com</owner>
   <owner>vincb@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -3757,7 +3757,7 @@
 </histogram>
 
 <histogram name="Autofill.Leipzig.FillingAssistanceCategory"
-    enum="AutofillCategoryResolvedFillingAssistance" expires_after="2025-05-11">
+    enum="AutofillCategoryResolvedFillingAssistance" expires_after="2025-07-13">
   <owner>koerber@chromium.org</owner>
   <owner>fleimgruber@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -3768,7 +3768,7 @@
 </histogram>
 
 <histogram name="Autofill.Leipzig.FillingCorrectness.{Category}"
-    enum="BooleanAutofillFillingCorrectness" expires_after="2025-05-11">
+    enum="BooleanAutofillFillingCorrectness" expires_after="2025-07-13">
   <owner>koerber@chromium.org</owner>
   <owner>fleimgruber@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -4616,7 +4616,7 @@
 </histogram>
 
 <histogram name="Autofill.PerfectFilling.{FormType}" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -4840,7 +4840,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.MigrateProfileEditedType"
-    enum="AutofillSettingsVisibleTypes" expires_after="2025-05-11">
+    enum="AutofillSettingsVisibleTypes" expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>fleimgruber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
@@ -5132,7 +5132,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileTokenQuality.{Type}" units="Percents"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -5905,7 +5905,7 @@
 </histogram>
 
 <histogram name="Autofill.StoredProfileUsedCount.{Category}" units="Profiles"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -6247,7 +6247,7 @@
 </histogram>
 
 <histogram name="Autofill.SuggestionShown.OffTheRecord" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>arabm@google.com</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/background/histograms.xml b/tools/metrics/histograms/metadata/background/histograms.xml
index dd3804e9..44bce54f 100644
--- a/tools/metrics/histograms/metadata/background/histograms.xml
+++ b/tools/metrics/histograms/metadata/background/histograms.xml
@@ -80,7 +80,7 @@
 </histogram>
 
 <histogram name="BackgroundSync.Event.OneShotResultPattern"
-    enum="BackgroundSyncResultPattern" expires_after="2025-05-11">
+    enum="BackgroundSyncResultPattern" expires_after="2025-07-13">
   <owner>nator@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 0755f00..056a571 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -254,7 +254,7 @@
 </histogram>
 
 <histogram name="Blink.Canvas.2DLayerBridge.Compression.DecompressionTime"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>jpgravel@chromium.org</owner>
   <summary>
@@ -264,7 +264,7 @@
 </histogram>
 
 <histogram name="Blink.Canvas.2DLayerBridge.Compression.Ratio" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>jpgravel@chromium.org</owner>
   <summary>
@@ -274,7 +274,7 @@
 </histogram>
 
 <histogram name="Blink.Canvas.2DLayerBridge.Compression.SnapshotSizeKb"
-    units="KB" expires_after="2025-05-11">
+    units="KB" expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>jpgravel@chromium.org</owner>
   <summary>
@@ -284,7 +284,7 @@
 </histogram>
 
 <histogram name="Blink.Canvas.2DLayerBridge.Compression.ThreadTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>jpgravel@chromium.org</owner>
   <summary>
@@ -847,7 +847,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImage.AvifDensity.Count.{ImageArea}"
-    units="0.01 bits per pixel" expires_after="2025-05-11">
+    units="0.01 bits per pixel" expires_after="2025-07-13">
   <owner>wtc@google.com</owner>
   <owner>jzern@google.com</owner>
   <owner>
@@ -887,7 +887,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImage.AvifDensity.KiBWeighted2"
-    units="0.01 bits per pixel" expires_after="2025-05-11">
+    units="0.01 bits per pixel" expires_after="2025-07-13">
   <owner>wtc@google.com</owner>
   <owner>jzern@google.com</owner>
   <owner>
@@ -903,7 +903,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImage.JpegDensity.Count.{ImageArea}"
-    units="0.01 bits per pixel" expires_after="2025-05-11">
+    units="0.01 bits per pixel" expires_after="2025-07-13">
   <owner>wtc@google.com</owner>
   <owner>jzern@google.com</owner>
   <owner>src/third_party/blink/renderer/platform/image-decoders/OWNERS</owner>
@@ -953,7 +953,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImage.WebPDensity.Count.{ImageArea}"
-    units="0.01 bits per pixel" expires_after="2025-05-11">
+    units="0.01 bits per pixel" expires_after="2025-07-13">
   <owner>wtc@google.com</owner>
   <owner>jzern@google.com</owner>
   <owner>src/third_party/blink/renderer/platform/image-decoders/OWNERS</owner>
@@ -1005,7 +1005,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImage.WebPFileFormat" enum="WebPFileFormat"
-    expires_after="2025-04-13">
+    expires_after="2025-07-13">
   <owner>mcasas@chromium.org</owner>
   <owner>andrescj@chromium.org</owner>
   <summary>
@@ -2629,7 +2629,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.InputCharacterCount4" units="characters"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>masonf@chromium.org</owner>
   <owner>dom-dev@google.com</owner>
   <summary>
@@ -2644,7 +2644,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.ParsingTimeMax4" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>masonf@chromium.org</owner>
   <owner>dom-dev@google.com</owner>
   <summary>
@@ -2659,7 +2659,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.ParsingTimeMin4" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>masonf@chromium.org</owner>
   <owner>dom-dev@google.com</owner>
   <summary>
@@ -2718,7 +2718,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.TokensParsedAverage4" units="tokens"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>masonf@chromium.org</owner>
   <owner>dom-dev@google.com</owner>
   <summary>
@@ -3165,7 +3165,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.DeferUnusedPreload.PredictionFailed{Trigger}"
-    enum="ResourceType" expires_after="2025-05-11">
+    enum="ResourceType" expires_after="2025-07-13">
   <owner>sisidovski@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3885,7 +3885,7 @@
 </histogram>
 
 <histogram name="Blink.Network.ParseDataURLTime{Type}{CharacterCount}"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -3986,7 +3986,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.ParseStyleSheet.UpdateTime"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimeSuffixes" -->
 
   <owner>cduvall@chromium.org</owner>
@@ -4140,7 +4140,7 @@
 </histogram>
 
 <histogram name="Blink.ResourceRequest.BackgroundResourceFetchSupportStatus"
-    enum="BackgroundResourceFetchSupportStatus" expires_after="2025-05-11">
+    enum="BackgroundResourceFetchSupportStatus" expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -4162,7 +4162,7 @@
 </histogram>
 
 <histogram name="Blink.ResourceRequest.CompletionDelay2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -4186,7 +4186,7 @@
 </histogram>
 
 <histogram name="Blink.ResourceRequest.RedirectDelay2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -4197,7 +4197,7 @@
 </histogram>
 
 <histogram name="Blink.ResourceRequest.ResponseDelay2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -4208,7 +4208,7 @@
 </histogram>
 
 <histogram name="Blink.ResourceRequest.StartDelay2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -4967,7 +4967,7 @@
 </histogram>
 
 <histogram name="Blink.UseCounter.FeaturePolicy.Header"
-    enum="FeaturePolicyFeature" expires_after="2025-05-11">
+    enum="FeaturePolicyFeature" expires_after="2025-07-13">
   <owner>iclelland@chromium.org</owner>
   <owner>feature-control@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
index c48f4ce..cba7720b 100644
--- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml
+++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -169,7 +169,7 @@
 
 <histogram
     name="Bookmarks.BookmarkBar.NavigationOrActivationToFirstContentfulPaint"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>robertlin@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -194,7 +194,7 @@
 
 <histogram
     name="Bookmarks.BookmarkBar.NavigationOrActivationToLargestContentfulPaint"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>robertlin@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -216,7 +216,7 @@
 </histogram>
 
 <histogram name="Bookmarks.BookmarkBar.Shown" enum="BooleanShown"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>amelies@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -225,7 +225,7 @@
 </histogram>
 
 <histogram name="Bookmarks.BookmarksBar.DragDropType"
-    enum="BookmarkBarDragDropType" expires_after="2025-05-11">
+    enum="BookmarkBarDragDropType" expires_after="2025-07-13">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -277,7 +277,7 @@
 </histogram>
 
 <histogram name="Bookmarks.EditLocation" enum="BookmarkLaunchLocation"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dfried@chromium.org</owner>
   <owner>mickeyburks@chromium.org</owner>
   <summary>
@@ -295,7 +295,7 @@
 </histogram>
 
 <histogram name="Bookmarks.EntryPoint" enum="BookmarksEntryPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ianwen@chromium.org</owner>
   <summary>How users add a new bookmark.</summary>
 </histogram>
@@ -391,7 +391,7 @@
 </histogram>
 
 <histogram name="Bookmarks.OpenBookmarkManager.PerProfileType"
-    enum="BrowserProfileType" expires_after="2025-05-11">
+    enum="BrowserProfileType" expires_after="2025-07-13">
   <owner>roagarwal@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index d885614..9a8410ca 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -416,7 +416,7 @@
 </histogram>
 
 <histogram name="Browser.ERP.SingleRequestPayloadSize" units="bytes"
-    expires_after="2025-05-09">
+    expires_after="2025-07-13">
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
   <summary>
@@ -1269,7 +1269,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareProcessDelayTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kerenzhu@chromium.org</owner>
   <owner>dayeung@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
@@ -1281,7 +1281,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareProcessEvictedOtherSpare"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>jam@chromium.org</owner>
   <owner>cduvall@chromium.org</owner>
   <summary>
@@ -1292,7 +1292,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareProcessMaybeTakeAction"
-    enum="SpareProcessMaybeTakeAction" expires_after="2025-05-11">
+    enum="SpareProcessMaybeTakeAction" expires_after="2025-07-13">
   <owner>alexmos@chromium.org</owner>
   <owner>lukasza@chromium.org</owner>
   <summary>
@@ -1340,7 +1340,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareProcessStartupTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kerenzhu@chromium.org</owner>
   <owner>dayeung@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
@@ -1695,7 +1695,7 @@
   <summary>Records true when the side panel combobox is opened.</summary>
 </histogram>
 
-<histogram name="SidePanel.OpenDuration" units="ms" expires_after="2025-05-11">
+<histogram name="SidePanel.OpenDuration" units="ms" expires_after="2025-07-13">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1718,7 +1718,7 @@
 </histogram>
 
 <histogram name="SidePanel.OpenTrigger" enum="SidePanelOpenTrigger"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1780,7 +1780,7 @@
 </histogram>
 
 <histogram name="SidePanel.{SidePanelEntry}.ShownDuration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1792,7 +1792,7 @@
 </histogram>
 
 <histogram name="SidePanel.{SidePanelEntry}.ShowTriggered"
-    enum="SidePanelOpenTrigger" expires_after="2025-05-11">
+    enum="SidePanelOpenTrigger" expires_after="2025-07-13">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/browsing_topics/histograms.xml b/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
index c008eac..fd825ff 100644
--- a/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
+++ b/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
@@ -109,7 +109,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.EpochTopicsCalculation.HistoryTopicsCount"
-    units="topics" expires_after="2025-05-11">
+    units="topics" expires_after="2025-07-13">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -147,7 +147,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.EpochTopicsCalculation.TimeBetweenCalculations"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/chrome/histograms.xml b/tools/metrics/histograms/metadata/chrome/histograms.xml
index 18ff532a..53d4b19 100644
--- a/tools/metrics/histograms/metadata/chrome/histograms.xml
+++ b/tools/metrics/histograms/metadata/chrome/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Chrome.AppMenu.MenuHostInitToNextFramePresented" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>temao@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -66,7 +66,7 @@
 </histogram>
 
 <histogram name="Chrome.KAnonymityService.JoinSet.Action"
-    enum="KAnonymityServiceJoinSetAction" expires_after="2025-05-11">
+    enum="KAnonymityServiceJoinSetAction" expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -90,7 +90,7 @@
 </histogram>
 
 <histogram name="Chrome.KAnonymityService.QuerySet.Action"
-    enum="KAnonymityServiceQuerySetAction" expires_after="2025-05-11">
+    enum="KAnonymityServiceQuerySetAction" expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -115,7 +115,7 @@
 </histogram>
 
 <histogram name="Chrome.KAnonymityService.QuerySet.Size" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -344,7 +344,7 @@
 </histogram>
 
 <histogram name="ChromeColors.ColorOnLoad" enum="ChromeColorsInfo"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index e07e422..daf9cf1 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -272,7 +272,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Apps.IntentPickerDestinationPlatform"
-    enum="ArcIntentHandlerDestinationPlatform" expires_after="2025-05-11">
+    enum="ArcIntentHandlerDestinationPlatform" expires_after="2025-07-13">
   <owner>tsergeant@chromium.org</owner>
   <owner>chromeos-apps-foundation-team@google.com</owner>
   <summary>
@@ -1244,7 +1244,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CWP.{PPath}.{PType}" units="failures"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>raging@google.com</owner>
   <owner>chromeos-memory@google.com</owner>
   <summary>
@@ -1947,7 +1947,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.AttachmentForm.{Type}" enum="AttachmentForm"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wmahon@google.com</owner>
   <owner>chromeos-tango@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -1967,7 +1967,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.AttachmentType.{Form}" enum="AttachmentType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wmahon@google.com</owner>
   <owner>chromeos-tango@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -2331,7 +2331,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.{DeviceType}.MetadataTier" enum="MetadataTier"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wangdanny@google.com</owner>
   <owner>dpad@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -2593,7 +2593,7 @@
 </histogram>
 
 <histogram name="ChromeOS.LanguagePacks.InstallError.Handwriting"
-    enum="LanguagePackDlcErrorType" expires_after="2025-05-11">
+    enum="LanguagePackDlcErrorType" expires_after="2025-07-13">
   <owner>mlcui@google.com</owner>
   <owner>dvallet@chromium.org</owner>
   <owner>tranbaoduy@chromium.org</owner>
@@ -2661,7 +2661,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Liveness.PingResult" enum="BooleanSuccess"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>iby@google.com</owner>
   <owner>xiyuan@google.com</owner>
   <summary>
@@ -2926,7 +2926,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Ownership.OwnerKeyUmaEvent" enum="OwnerKeyUmaEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>miersh@google.com</owner>
   <owner>chromeos-commercial-networking@google.com</owner>
   <summary>
@@ -2945,7 +2945,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Printing.TimeCostOfFailedFoomaticShell"
-    units="seconds" expires_after="2025-05-11">
+    units="seconds" expires_after="2025-07-13">
   <owner>pawliczek@chromium.org</owner>
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
@@ -2957,7 +2957,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Printing.TimeCostOfSuccessfulFoomaticShell"
-    units="seconds" expires_after="2025-05-11">
+    units="seconds" expires_after="2025-07-13">
   <owner>pawliczek@chromium.org</owner>
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
@@ -3188,7 +3188,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sandboxing.LandlockEnabled" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -4471,7 +4471,7 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.FirstInteraction"
-    enum="CrosSystemTrayFirstInteraction" expires_after="2025-05-11">
+    enum="CrosSystemTrayFirstInteraction" expires_after="2025-07-13">
   <owner>amehfooz@chromium.org</owner>
   <owner>cros-status-area@google.com</owner>
   <summary>
@@ -4832,7 +4832,7 @@
 </histogram>
 
 <histogram name="ChromeOS.WXMountCount" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jorgelo@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index 5bcfd32..1c3f10b 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -352,7 +352,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Display.NewDisplayConnected"
-    enum="DisplayType" expires_after="2025-05-11">
+    enum="DisplayType" expires_after="2025-07-13">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -374,7 +374,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Display.{DisplayType}"
-    enum="DisplaySettingsType" expires_after="2025-05-11">
+    enum="DisplaySettingsType" expires_after="2025-07-13">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -684,7 +684,7 @@
 </histogram>
 
 <histogram base="true" name="ChromeOS.Settings.NumSearchesUntilChange"
-    units="searches" expires_after="2025-05-11">
+    units="searches" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="OsSettingsChangeType" -->
 
   <owner>wesokuhara@google.com</owner>
@@ -752,7 +752,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.PathVisited"
-    enum="WebUIOSSettingsPathHashes" expires_after="2025-05-11">
+    enum="WebUIOSSettingsPathHashes" expires_after="2025-07-13">
   <owner>wesokuhara@google.com</owner>
   <owner>xiaohuic@chromium.org</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 dc7c31d..37d7801 100644
--- a/tools/metrics/histograms/metadata/commerce/histograms.xml
+++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="Commerce.Compare.Table.PercentageValidProducts2" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mdjones@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
   <summary>
@@ -433,7 +433,7 @@
 </histogram>
 
 <histogram name="Commerce.PDPNavigation.{FeatureName}.Eligible" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ayman@chromium.org</owner>
   <owner>mdjones@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -518,7 +518,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceDrop.NotificationChannelCreated" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zhiyuancai@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
   <summary>
@@ -530,7 +530,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceDrop.SystemNotificationEnabled" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zhiyuancai@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
   <summary>
@@ -696,7 +696,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceTracking.EmailNotificationsEnabled"
-    enum="PriceNotificationEmailState" expires_after="2025-05-11">
+    enum="PriceNotificationEmailState" expires_after="2025-07-13">
   <owner>ayman@chromium.org</owner>
   <owner>mdjones@chromium.org</owner>
   <owner>chrome-shopping@google.org</owner>
diff --git a/tools/metrics/histograms/metadata/compose/histograms.xml b/tools/metrics/histograms/metadata/compose/histograms.xml
index b533a7d..0f0c6fb 100644
--- a/tools/metrics/histograms/metadata/compose/histograms.xml
+++ b/tools/metrics/histograms/metadata/compose/histograms.xml
@@ -38,7 +38,7 @@
 </variants>
 
 <histogram name="Compose.ContextMenu.CTR" enum="ComposeContextMenuCtrEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sophey@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -50,7 +50,7 @@
 </histogram>
 
 <histogram name="Compose.ContextMenu.OpenComposeDialogResult"
-    enum="OpenComposeDialogResult" expires_after="2025-05-11">
+    enum="OpenComposeDialogResult" expires_after="2025-07-13">
   <owner>carlosk@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -61,7 +61,7 @@
 </histogram>
 
 <histogram name="Compose.ContextMenu.SelectedAll" enum="ComposeSelectAllStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dewittj@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -71,7 +71,7 @@
 </histogram>
 
 <histogram name="Compose.ContextMenu.ShowStatus" enum="ComposeShowStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sophey@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -82,7 +82,7 @@
 </histogram>
 
 <histogram name="Compose.Dialog.InnerTextNodeOffsetFound"
-    enum="ComposeInnerTextNodeOffset" expires_after="2025-05-11">
+    enum="ComposeInnerTextNodeOffset" expires_after="2025-07-13">
   <owner>jeffreycohen@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="Compose.Dialog.InnerTextSize" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sophey@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -116,7 +116,7 @@
 </histogram>
 
 <histogram name="Compose.Dialog.OpenLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cuianthony@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -136,7 +136,7 @@
 </histogram>
 
 <histogram name="Compose.EntryPoint.SessionResume" enum="ComposeEntryPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -146,7 +146,7 @@
 </histogram>
 
 <histogram name="Compose.EntryPoint.SessionStart" enum="ComposeEntryPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -156,7 +156,7 @@
 </histogram>
 
 <histogram name="Compose.ProactiveNudge.CTR" enum="ComposeNudgeCtrEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -179,7 +179,7 @@
 </histogram>
 
 <histogram name="Compose.ProactiveNudge.ShowStatus" enum="ComposeShowStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -202,7 +202,7 @@
 </histogram>
 
 <histogram name="Compose.Session.Duration.OverOneDay" enum="BooleanYesNo"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -212,7 +212,7 @@
 </histogram>
 
 <histogram name="Compose.Session.EvalLocation"
-    enum="ComposeSessionEvalLocation" expires_after="2025-05-11">
+    enum="ComposeSessionEvalLocation" expires_after="2025-07-13">
   <owner>harringtond@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -222,7 +222,7 @@
 </histogram>
 
 <histogram name="Compose.Session.FRE.Disclaimer.CloseReason"
-    enum="ComposeFreOrMsbbSessionCloseReasonType" expires_after="2025-05-11">
+    enum="ComposeFreOrMsbbSessionCloseReasonType" expires_after="2025-07-13">
   <owner>cuianthony@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -247,7 +247,7 @@
 </histogram>
 
 <histogram name="Compose.Session.FRE.MSBB.CloseReason"
-    enum="ComposeFreOrMsbbSessionCloseReasonType" expires_after="2025-05-11">
+    enum="ComposeFreOrMsbbSessionCloseReasonType" expires_after="2025-07-13">
   <owner>jeffreycohen@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -284,7 +284,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Request.Duration.Error"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -296,7 +296,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Request.Duration.Ok" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -308,7 +308,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Request.Feedback"
-    enum="ComposeRequestFeedback" expires_after="2025-05-11">
+    enum="ComposeRequestFeedback" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -341,7 +341,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Request.Status"
-    enum="ComposeRequestStatus" expires_after="2025-05-11">
+    enum="ComposeRequestStatus" expires_after="2025-07-13">
   <owner>cuianthony@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -353,7 +353,7 @@
 
 <histogram
     name="Compose.{ComposeEvalLocation}Request.{PageLanguageStatus}.Status"
-    enum="ComposeRequestStatus" expires_after="2025-05-11">
+    enum="ComposeRequestStatus" expires_after="2025-07-13">
   <owner>carlosk@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -373,7 +373,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Session.CloseReason"
-    enum="ComposeSessionCloseReasonType" expires_after="2025-05-11">
+    enum="ComposeSessionCloseReasonType" expires_after="2025-07-13">
   <owner>petewil@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -388,7 +388,7 @@
 
 <histogram
     name="Compose.{ComposeEvalLocation}Session.ComposeCount.{FinalStatus}"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -403,7 +403,7 @@
 
 <histogram
     name="Compose.{ComposeEvalLocation}Session.DialogShownCount.{FinalStatus}"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -419,7 +419,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Session.Duration.{SessionType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -438,7 +438,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Session.EventCounts"
-    enum="ComposeSessionEventTypes" expires_after="2025-05-11">
+    enum="ComposeSessionEventTypes" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -458,7 +458,7 @@
 
 <histogram
     name="Compose.{ComposeEvalLocation}Session.SubmitEditCount.{FinalStatus}"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>cuianthony@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -473,7 +473,7 @@
 </histogram>
 
 <histogram name="Compose.{ComposeEvalLocation}Session.UndoCount.{FinalStatus}"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml
index 11bd86c..a0058e3 100644
--- a/tools/metrics/histograms/metadata/compositing/histograms.xml
+++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -83,7 +83,7 @@
 </variants>
 
 <histogram name="Compositing.Browser.LayersUpdateTime" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>pdr@chromium.org</owner>
   <owner>animations-dev@chromium.org</owner>
   <summary>
@@ -163,7 +163,7 @@
 </histogram>
 
 <histogram name="Compositing.DidMainThreadBlockDuringCommit" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>szager@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <owner>sky@chromium.org</owner>
@@ -185,7 +185,7 @@
 </histogram>
 
 <histogram name="Compositing.DirectRenderer.OverlayProcessingUs"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>khaslett@chromium.org</owner>
   <owner>kylechar@chromium.org</owner>
   <summary>
@@ -333,7 +333,7 @@
 </histogram>
 
 <histogram name="Compositing.Display.Draw.LastPass.Quads" units="quads"
-    expires_after="2025-05-13">
+    expires_after="2025-07-13">
   <owner>berlu@chromium.org</owner>
   <owner>chromeos-gfx-compositor@google.com</owner>
   <summary>
@@ -411,7 +411,7 @@
 </histogram>
 
 <histogram name="Compositing.Display.Draw.Occlusion.Calculation.Time"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>yiyix@chromium.org</owner>
   <owner>chromeos-gfx@chromium.org</owner>
   <summary>
@@ -439,7 +439,7 @@
 </histogram>
 
 <histogram name="Compositing.Display.DrawToSwapUs" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -478,7 +478,7 @@
 </histogram>
 
 <histogram name="Compositing.Display.FlattenedRenderPassCount" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -529,7 +529,7 @@
 
 <histogram
     name="Compositing.Display.OverlayProcessorUsingStrategy.FramesScalingRequiredOverlays"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>zoraiznaeem@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -555,7 +555,7 @@
 
 <histogram
     name="Compositing.Display.OverlayProcessorUsingStrategy.NumOverlays{Counted}"
-    units="overlay candidates" expires_after="2025-05-11">
+    units="overlay candidates" expires_after="2025-07-13">
   <owner>khaslett@chromium.org</owner>
   <owner>kylechar@chromium.org</owner>
   <owner>chromeos-gfx-compositor@chromium.org</owner>
@@ -613,7 +613,7 @@
 
 <histogram
     name="Compositing.Display.OverlayProcessorUsingStrategy.WorkingScaleFactorForRequiredOverlays"
-    units="scale_factor" expires_after="2025-05-11">
+    units="scale_factor" expires_after="2025-07-13">
   <owner>zoraiznaeem@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -722,7 +722,7 @@
 </histogram>
 
 <histogram name="Compositing.Renderer.CALayerResult" enum="CALayerResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ccameron@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -733,7 +733,7 @@
 </histogram>
 
 <histogram name="Compositing.Renderer.LayersUpdateTime" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>pdr@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
@@ -802,7 +802,7 @@
 </histogram>
 
 <histogram name="Compositing.SkiaRenderer.SkipOverlayRenderPassDrawQuad"
-    enum="BooleanSkipped" expires_after="2025-05-11">
+    enum="BooleanSkipped" expires_after="2025-07-13">
   <owner>magchen@chromium.org</owner>
   <owner>ccameron@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 74044e8..794fe39 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -353,7 +353,7 @@
 </histogram>
 
 <histogram name="ContentSettings.GetCookieSettingInternal.Duration"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>dullweber@chromium.org</owner>
   <owner>wanderview@chromium.org</owner>
   <summary>
@@ -459,7 +459,7 @@
 </histogram>
 
 <histogram name="ContentSettings.RegularProfile.DefaultBackgroundSyncSetting"
-    enum="ContentSetting" expires_after="2025-05-11">
+    enum="ContentSetting" expires_after="2025-07-13">
   <owner>tungnh@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -481,7 +481,7 @@
 </histogram>
 
 <histogram name="ContentSettings.RegularProfile.DefaultStorageAccessSetting"
-    enum="ContentSetting" expires_after="2025-05-11">
+    enum="ContentSetting" expires_after="2025-07-13">
   <owner>dullweber@chromium.org</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 81c7aff7..6adf6c2e 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -117,7 +117,7 @@
 </histogram>
 
 <histogram name="Cookie.CookieJarSize" units="kibibytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -139,7 +139,7 @@
 </histogram>
 
 <histogram name="Cookie.CookiePrefix" enum="CookiePrefix"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>estark@chromium.org</owner>
   <summary>
     Number of times a cookie was set with a name prefixed by
@@ -149,7 +149,7 @@
 </histogram>
 
 <histogram name="Cookie.CookieSchemeRequestScheme" enum="CookieRequestScheme"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -216,7 +216,7 @@
 </histogram>
 
 <histogram name="Cookie.CrossSiteRedirectDowngradeChangesInclusionAge"
-    units="minutes" expires_after="2025-04-13">
+    units="minutes" expires_after="2025-07-13">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -301,7 +301,7 @@
 </histogram>
 
 <histogram name="Cookie.DoubleUnderscorePrefixedName" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -389,7 +389,7 @@
 </histogram>
 
 <histogram name="Cookie.FirstPartyPartitioned.HasCrossSiteAncestor"
-    enum="BooleanPresent" expires_after="2025-03-30">
+    enum="BooleanPresent" expires_after="2025-07-13">
   <owner>selya@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -614,7 +614,7 @@
 </histogram>
 
 <histogram name="Cookie.IncludedRequestEffectiveSameSite"
-    enum="CookieEffectiveSameSite" expires_after="2025-05-12">
+    enum="CookieEffectiveSameSite" expires_after="2025-07-13">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -634,7 +634,7 @@
 </histogram>
 
 <histogram name="Cookie.IsPartitionedValid" enum="BooleanValid"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>bingler@chromium.org</owner>
   <summary>
@@ -667,7 +667,7 @@
 </histogram>
 
 <histogram name="Cookie.MaxSameSiteNoneCookiesPerKey" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -723,7 +723,7 @@
 </histogram>
 
 <histogram name="Cookie.PartitionCount" units="partitions"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -746,7 +746,7 @@
 </histogram>
 
 <histogram name="Cookie.PartitionedCookieCount" units="cookies"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -772,7 +772,7 @@
 </histogram>
 
 <histogram name="Cookie.PartitionedCookieJarSizeKibibytes" units="kibibytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -783,7 +783,7 @@
 </histogram>
 
 <histogram name="Cookie.PartitionedCookieJarSizeKibibytes.{NonceType}"
-    units="kibibytes" expires_after="2025-05-11">
+    units="kibibytes" expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -799,7 +799,7 @@
 </histogram>
 
 <histogram name="Cookie.PartitionedCookiesInRequest" units="cookies"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -884,7 +884,7 @@
 </histogram>
 
 <histogram name="Cookie.Port.ReadDiffersFromSet.{HostType}"
-    enum="CookieSentToSamePort" expires_after="2025-05-11">
+    enum="CookieSentToSamePort" expires_after="2025-07-13">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -938,7 +938,7 @@
 </histogram>
 
 <histogram name="Cookie.RequestSameSiteContext" enum="SameSiteCookieContext"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bingler@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -959,7 +959,7 @@
 </histogram>
 
 <histogram name="Cookie.SameSiteNoneSizeBytes" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -969,7 +969,7 @@
 </histogram>
 
 <histogram name="Cookie.SameSiteNoneSizeBytes.{IsPartitioned}" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml
index 50fa555..9d7ef77 100644
--- a/tools/metrics/histograms/metadata/cras/histograms.xml
+++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -131,14 +131,14 @@
   </summary>
 </histogram>
 
-<histogram name="Cras.ApNcRuntime" units="seconds" expires_after="2025-05-11">
+<histogram name="Cras.ApNcRuntime" units="seconds" expires_after="2025-07-13">
   <owner>hunghsienchen@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>Tracks the runtime of the APM when AP NC is active.</summary>
 </histogram>
 
 <histogram name="Cras.ApNcStartStatus" enum="CrasApNcStartStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hunghsienchen@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -799,7 +799,7 @@
 </histogram>
 
 <histogram name="Cras.RtcDevicePair" enum="CrasDevicePair"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yuhsuan@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -809,7 +809,7 @@
 </histogram>
 
 <histogram name="Cras.RtcRuntime.{InDevice}.{OutDevice}" units="seconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yuhsuan@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -1063,7 +1063,7 @@
   </summary>
 </histogram>
 
-<histogram name="Cras.StreamRuntime" units="seconds" expires_after="2025-05-11">
+<histogram name="Cras.StreamRuntime" units="seconds" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes
      name="Cras.Direction" and
      name="Cras.ClientType" and
@@ -1169,7 +1169,7 @@
 </histogram>
 
 <histogram name="Cras.UnderrunsPerDevice{Device}" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yuhsuan@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cros_federated/histograms.xml b/tools/metrics/histograms/metadata/cros_federated/histograms.xml
index 44c07fb2..36246da 100644
--- a/tools/metrics/histograms/metadata/cros_federated/histograms.xml
+++ b/tools/metrics/histograms/metadata/cros_federated/histograms.xml
@@ -32,7 +32,7 @@
 </variants>
 
 <histogram name="FederatedService.ServiceEvent" enum="FederatedServiceEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <owner>cros-federated-team@google.com</owner>
@@ -110,7 +110,7 @@
 </histogram>
 
 <histogram name="FederatedService.{Population}.Event"
-    enum="FederatedClientEvent" expires_after="2025-05-11">
+    enum="FederatedClientEvent" expires_after="2025-07-13">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <owner>cros-federated-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/cros_ml/histograms.xml b/tools/metrics/histograms/metadata/cros_ml/histograms.xml
index ca42e17..c266eac 100644
--- a/tools/metrics/histograms/metadata/cros_ml/histograms.xml
+++ b/tools/metrics/histograms/metadata/cros_ml/histograms.xml
@@ -63,7 +63,7 @@
 </variants>
 
 <histogram name="MachineLearningService.CpuUsageMilliPercent"
-    units="1/1000ths of %" expires_after="2025-05-11">
+    units="1/1000ths of %" expires_after="2025-07-13">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -229,7 +229,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.MojoConnectionEvent"
-    enum="MachineLearningServiceMojoConnectionEvent" expires_after="2025-05-11">
+    enum="MachineLearningServiceMojoConnectionEvent" expires_after="2025-07-13">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -259,7 +259,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.ProcessError"
-    enum="MachineLearningServiceProcessError" expires_after="2025-05-11">
+    enum="MachineLearningServiceProcessError" expires_after="2025-07-13">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -318,7 +318,7 @@
 <histogram
     name="MachineLearningService.WebPlatformHandwritingModel.LoadModelResult.Event"
     enum="MachineLearningServiceLoadHandwritingModelResultEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -378,7 +378,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.WorkerProcessCleanUpTime"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -449,7 +449,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.{RequestName}.CpuTimeMicrosec"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -461,7 +461,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.{RequestName}.TotalMemoryDeltaKb"
-    units="KB" expires_after="2025-05-11">
+    units="KB" expires_after="2025-07-13">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>Memory usage increase caused by {RequestName} request.</summary>
diff --git a/tools/metrics/histograms/metadata/cross_device/histograms.xml b/tools/metrics/histograms/metadata/cross_device/histograms.xml
index 14a7148..e34e7b47 100644
--- a/tools/metrics/histograms/metadata/cross_device/histograms.xml
+++ b/tools/metrics/histograms/metadata/cross_device/histograms.xml
@@ -1763,7 +1763,7 @@
 
 <histogram name="MultiDevice.SecureChannel.Nearby.ConnectionResult"
     enum="MultiDeviceNearbyConnectionsInitiatorResult"
-    expires_after="2025-05-05">
+    expires_after="2025-07-13">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/crostini/histograms.xml b/tools/metrics/histograms/metadata/crostini/histograms.xml
index 47958e2a..4ec8666a 100644
--- a/tools/metrics/histograms/metadata/crostini/histograms.xml
+++ b/tools/metrics/histograms/metadata/crostini/histograms.xml
@@ -103,7 +103,7 @@
 </histogram>
 
 <histogram name="Crostini.Backup" enum="CrostiniExportContainerResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Result of crostini backup.</summary>
@@ -194,7 +194,7 @@
 </histogram>
 
 <histogram name="Crostini.DiskResize.Result" enum="CrostiniDiskImageStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -261,7 +261,7 @@
 </histogram>
 
 <histogram name="Crostini.FilesystemCorruption" enum="CorruptionStates"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sidereal@google.com</owner>
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
@@ -414,7 +414,7 @@
 </histogram>
 
 <histogram name="Crostini.SetupResult" enum="CrostiniSetupResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -484,7 +484,7 @@
 </histogram>
 
 <histogram name="Crostini.Stability" enum="GuestOsFailureClasses"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -595,7 +595,7 @@
 </histogram>
 
 <histogram name="Crostini.UpgradeDialogEvent" enum="CrostiniUpgradeDialogEvent"
-    expires_after="2025-05-12">
+    expires_after="2025-07-13">
   <owner>denniskempin@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
index 0a4ec47..86fb04f5 100644
--- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -57,7 +57,7 @@
 </variants>
 
 <histogram name="Cryptohome.AuthFactorBackingStoreConfig"
-    enum="CryptohomeAuthFactorBackingStoreConfig" expires_after="2025-05-11">
+    enum="CryptohomeAuthFactorBackingStoreConfig" expires_after="2025-07-13">
   <owner>jadmanski@chromium.org</owner>
   <owner>cros-security-cryptohome+uma@google.com</owner>
   <summary>
@@ -150,7 +150,7 @@
 </histogram>
 
 <histogram name="Cryptohome.Errors" enum="CryptohomeError"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>apronin@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>Cryptohome errors.</summary>
@@ -481,7 +481,7 @@
 </histogram>
 
 <histogram name="Cryptohome.TimeToGenerateEccAuthValue" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -505,7 +505,7 @@
 </histogram>
 
 <histogram name="Cryptohome.TimeToMountEx" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sarthakkukreti@chromium.org</owner>
   <owner>cros-security-cryptohome+uma@google.com</owner>
   <summary>
@@ -536,7 +536,7 @@
 </histogram>
 
 <histogram name="Cryptohome.TimeToPerformMount" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sarthakkukreti@chromium.org</owner>
   <owner>cros-security-cryptohome+uma@google.com</owner>
   <summary>
@@ -602,7 +602,7 @@
 </histogram>
 
 <histogram name="Cryptohome.VaultKeysetMetric.{VaultKeysetMetric}"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>thomascedeno@google.com</owner>
   <owner>cros-security-cryptohome+uma@google.com</owner>
   <summary>
@@ -628,7 +628,7 @@
 </histogram>
 
 <histogram name="Cryptohome.VkToUssMigrationStatus"
-    enum="VkToUssMigrationStatus" expires_after="2025-05-11">
+    enum="VkToUssMigrationStatus" expires_after="2025-07-13">
   <owner>jadmanski@chromium.org</owner>
   <owner>cros-security-cryptohome+uma@google.com</owner>
   <summary>
@@ -671,7 +671,7 @@
 </histogram>
 
 <histogram name="Cryptohome.{Action}AuthBlockType"
-    enum="CryptohomeAuthBlockType" expires_after="2025-05-11">
+    enum="CryptohomeAuthBlockType" expires_after="2025-07-13">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -708,7 +708,7 @@
 </histogram>
 
 <histogram name="Cryptohome.{AuthSessionFunction}.{AuthBlockType}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thomascedeno@google.com</owner>
   <owner>cros-security-cryptohome+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 5fc89f1e..1cda1fa 100644
--- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
+++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -156,7 +156,7 @@
 </histogram>
 
 <histogram name="CustomTabs.ClientAppId" enum="ClientAppId"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yusufo@chromium.org</owner>
   <summary>
     Android: AppId declared by the launching application in EXTRA_APPLICATION_ID
@@ -188,7 +188,7 @@
 </histogram>
 
 <histogram name="CustomTabs.CloseCause" enum="CustomTabsCloseCause"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jinsukkim@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>cct-team@google.com</owner>
@@ -214,7 +214,7 @@
 </histogram>
 
 <histogram name="CustomTabs.ConnectionStatusOnReturn.NonGSA"
-    enum="CustomTabsConnection" expires_after="2025-05-11">
+    enum="CustomTabsConnection" expires_after="2025-07-13">
   <owner>kgrosu@google.com</owner>
   <owner>jinsukkim@chromium.org</owner>
   <owner>cct-team@google.com</owner>
@@ -843,7 +843,7 @@
 </histogram>
 
 <histogram name="CustomTabs.WarmupStateOnLaunch" enum="WarmupStateOnLaunch"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <summary>
     Recorded only on Android. Reports whether warmup() has been called when a
diff --git a/tools/metrics/histograms/metadata/data/histograms.xml b/tools/metrics/histograms/metadata/data/histograms.xml
index fd92e11..8ea526cf 100644
--- a/tools/metrics/histograms/metadata/data/histograms.xml
+++ b/tools/metrics/histograms/metadata/data/histograms.xml
@@ -107,7 +107,7 @@
 </histogram>
 
 <histogram name="DataUse.BytesSent3.Delegate" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>curranmax@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>spelchat@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml
index c766a12e..67543ab 100644
--- a/tools/metrics/histograms/metadata/dev/histograms.xml
+++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="DevTools.ActionTaken" enum="DevToolsAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>bmeurer@google.com</owner>
   <summary>Specified DevTools action has been taken.</summary>
@@ -58,7 +58,7 @@
 </histogram>
 
 <histogram name="DevTools.CDPCommandFrom{ClientType}" enum="CDPCommands"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wolfi@google.com</owner>
   <owner>danilsomsikov@google.com</owner>
   <owner>yangguo@google.com</owner>
@@ -151,7 +151,7 @@
 </histogram>
 
 <histogram name="DevTools.ExperimentDisabled" enum="DevtoolsExperiments"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>changhaohan@google.com</owner>
   <summary>
@@ -169,7 +169,7 @@
 </histogram>
 
 <histogram name="DevTools.ExperimentEnabled" enum="DevtoolsExperiments"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>changhaohan@google.com</owner>
   <summary>
@@ -178,7 +178,7 @@
 </histogram>
 
 <histogram name="DevTools.ExperimentEnabledAtLaunch" enum="DevtoolsExperiments"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>changhaohan@google.com</owner>
   <summary>
@@ -205,7 +205,7 @@
   </summary>
 </histogram>
 
-<histogram name="DevTools.InspectElement" units="ms" expires_after="2025-05-11">
+<histogram name="DevTools.InspectElement" units="ms" expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>bmeurer@google.com</owner>
   <summary>
@@ -237,7 +237,7 @@
 </histogram>
 
 <histogram name="DevTools.IssueCreated" enum="DevToolsIssueCreated"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>danilsomsikov@google.com</owner>
   <summary>
@@ -329,7 +329,7 @@
 </histogram>
 
 <histogram name="DevTools.LighthouseModeRun" enum="DevToolsLighthouseModeRun"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asraine@google.com</owner>
   <owner>paulirish@google.com</owner>
   <owner>cjamcl@google.com</owner>
@@ -347,7 +347,7 @@
 </histogram>
 
 <histogram name="DevTools.OpenedByAction" enum="DevToolsOpenedByAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>changhaohan@google.com</owner>
   <owner>yangguo@google.com</owner>
   <owner>mathiasb@google.com</owner>
@@ -357,7 +357,7 @@
 </histogram>
 
 <histogram name="DevTools.PanelShown" enum="DevToolsPanel"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yangguo@google.com</owner>
   <owner>bmeurer@google.com</owner>
   <summary>Specified DevTools panel was shown.</summary>
@@ -490,7 +490,7 @@
 </histogram>
 
 <histogram name="DevTools.SwatchActivated" enum="DevToolsSwatchActivated"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ergunsh@google.com</owner>
   <owner>changhaohan@google.com</owner>
   <owner>bmeurer@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/disk/histograms.xml b/tools/metrics/histograms/metadata/disk/histograms.xml
index bf8c579..e90d2c50 100644
--- a/tools/metrics/histograms/metadata/disk/histograms.xml
+++ b/tools/metrics/histograms/metadata/disk/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="DiskCache.0.Error" enum="DiskCacheError"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wfh@chromium.org</owner>
   <owner>src/net/disk_cache/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 4f8755c8c..0c69ff2 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -163,7 +163,7 @@
 </histogram>
 
 <histogram name="Download.Bubble.ProcessedCommand2" enum="DownloadCommand"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>chlily@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -277,7 +277,7 @@
 </histogram>
 
 <histogram base="true" name="Download.Counts" enum="DownloadCountType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="DownloadSource" -->
 
   <owner>shaktisahu@chromium.org</owner>
@@ -357,7 +357,7 @@
 </histogram>
 
 <histogram name="Download.DOMEvent" enum="DownloadDOMEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dtrainor@chromium.org</owner>
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
@@ -702,7 +702,7 @@
 </histogram>
 
 <histogram name="Download.Open.ContentType" enum="DownloadContentType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1110,7 +1110,7 @@
 </histogram>
 
 <histogram name="Download.Start.ContentType.NormalProfile"
-    enum="DownloadContentType" expires_after="2025-05-11">
+    enum="DownloadContentType" expires_after="2025-07-13">
   <owner>shaktisahu@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -1190,7 +1190,7 @@
 </histogram>
 
 <histogram name="Download.WarningData.ActionAdded" enum="DownloadWarningAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1203,7 +1203,7 @@
 </histogram>
 
 <histogram name="Download.WarningData.AddWarningActionEventOutcome2"
-    enum="DownloadAddWarningActionEventOutcome" expires_after="2025-05-04">
+    enum="DownloadAddWarningActionEventOutcome" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1214,7 +1214,7 @@
 </histogram>
 
 <histogram name="Download.WarningData.SurfaceWithoutWarningShown"
-    enum="DownloadWarningSurface" expires_after="2025-05-11">
+    enum="DownloadWarningSurface" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 6aa48ce..7e5cbd9 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -756,7 +756,7 @@
 </histogram>
 
 <histogram name="Enterprise.DeviceRemoteCommand.Crd.Result"
-    enum="EnterpriseCrdSessionResultCode" expires_after="2025-05-11">
+    enum="EnterpriseCrdSessionResultCode" expires_after="2025-07-13">
   <owner>macinashutosh@google.com</owner>
   <owner>chromeos-commercial-crd@google.com</owner>
   <summary>Reports success/failure when a session is attempted.</summary>
@@ -1555,7 +1555,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.FileActionWarnProceeded"
-    enum="EnterpriseDlpPolicyFileAction" expires_after="2025-05-11">
+    enum="EnterpriseDlpPolicyFileAction" expires_after="2025-07-13">
   <owner>accorsi@google.com</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1635,7 +1635,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.FilesWarnedCount" units="entries"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ayaelattar@google.com</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1693,7 +1693,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.ReportedBlockLevelRestriction"
-    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-05-11">
+    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-07-13">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1703,7 +1703,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.ReportedEventStatus" enum="GoogleRpcCode"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1712,7 +1712,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.ReportedReportLevelRestriction"
-    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-05-11">
+    enum="EnterpriseDlpPolicyRestriction" expires_after="2025-07-13">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1887,7 +1887,7 @@
 </histogram>
 
 <histogram name="Enterprise.DMServerRequestSuccess{EnterpriseDMServerRequest}"
-    enum="EnterpriseDMServerRequestSuccess" expires_after="2025-05-11">
+    enum="EnterpriseDMServerRequestSuccess" expires_after="2025-07-13">
   <owner>rbock@google.com</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
   <owner>managed-devices@google.com</owner>
@@ -2710,7 +2710,7 @@
 </histogram>
 
 <histogram name="Enterprise.Policies.{PolicyLevel}" enum="EnterprisePolicies"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zmin@chromium.org</owner>
   <owner>qiutanw@google.com</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
@@ -2817,7 +2817,7 @@
 </histogram>
 
 <histogram name="Enterprise.PolicyUI.ButtonUsage.{ButtonType}" units="counts"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zmin@chromium.org</owner>
   <owner>src/components/policy/OWNERS</owner>
   <summary>
@@ -2939,7 +2939,7 @@
 </histogram>
 
 <histogram name="Enterprise.PublicSession.SessionLength" units="minutes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bfranz@chromium.org</owner>
   <owner>chromeos-kiosk-eng@google.com</owner>
   <summary>
@@ -3017,7 +3017,7 @@
 </histogram>
 
 <histogram name="Enterprise.SafeSites.Latency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ftirelo@chromium.org</owner>
   <owner>ljjlee@google.com</owner>
   <owner>cbe-eng@google.com</owner>
@@ -3047,7 +3047,7 @@
 
 <histogram name="Enterprise.SecondaryGoogleAccountUsage.PolicyFetch.Status"
     enum="SecondaryGoogleAccountUsagePolicyFetchStatus"
-    expires_after="2025-03-09">
+    expires_after="2025-07-13">
   <owner>rodmartin@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <summary>
@@ -3653,7 +3653,7 @@
 </histogram>
 
 <histogram name="Enterprise.VpdUpdateStatus" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>igorcov@chromium.org</owner>
   <owner>tnagel@chromium.org</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
@@ -3680,7 +3680,7 @@
 
 <histogram
     name="Enterprise.{ContentAnalysisProtocol}Request.{ContentAnalysisRequestType}.Result"
-    enum="SafeBrowsingBinaryUploadResult" expires_after="2025-05-11">
+    enum="SafeBrowsingBinaryUploadResult" expires_after="2025-07-13">
   <owner>nancylanxiao@google.com</owner>
   <owner>domfc@chromium.org</owner>
   <owner>dpr-eng@google.com</owner>
@@ -3836,7 +3836,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.IsManaged2" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zmin@chromium.org</owner>
   <owner>rogerta@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
@@ -3902,7 +3902,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.WindowsProfileType" enum="WindowsProfileType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wfh@chromium.org</owner>
   <owner>chrome-platform-security-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml
index 0443e52..0827bf04 100644
--- a/tools/metrics/histograms/metadata/event/histograms.xml
+++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -72,7 +72,7 @@
 <histogram
     name="Event.DownEventCount.PerInputFormFactorDestinationCombination2"
     enum="DownEventInputFormFactorDestinationCombination2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tbuckley@chromium.org</owner>
   <summary>
     The number of down events received per destination, input and form factor
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index 30fadd8..01155da 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -1549,7 +1549,7 @@
 </histogram>
 
 <histogram name="Extensions.DisableReason2" enum="ExtensionDisableReason"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -2637,7 +2637,7 @@
 </histogram>
 
 <histogram name="Extensions.Functions.ExtensionMV3Calls"
-    enum="ExtensionFunctions" expires_after="2025-05-11">
+    enum="ExtensionFunctions" expires_after="2025-07-13">
   <owner>tjudkins@chromium.org</owner>
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
@@ -3808,7 +3808,7 @@
 </histogram>
 
 <histogram name="Extensions.LoadType2" enum="ExtensionType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4112,7 +4112,7 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NetworkDelay" units="ms" expires_after="2025-05-11">
+<histogram name="Extensions.NetworkDelay" units="ms" expires_after="2025-07-13">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>kelvinjiang@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
@@ -4803,7 +4803,7 @@
 </histogram>
 
 <histogram name="Extensions.ServiceWorkerBackground.StartWorkerStatus"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -5095,7 +5095,7 @@
 </histogram>
 
 <histogram name="Extensions.Toolbar.InvocationSource"
-    enum="ExtensionActionInvocationSource" expires_after="2025-05-11">
+    enum="ExtensionActionInvocationSource" expires_after="2025-07-13">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/families/histograms.xml b/tools/metrics/histograms/metadata/families/histograms.xml
index c987bf670..30f211e 100644
--- a/tools/metrics/histograms/metadata/families/histograms.xml
+++ b/tools/metrics/histograms/metadata/families/histograms.xml
@@ -409,7 +409,7 @@
 </histogram>
 
 <histogram name="FamilyLinkUser.LocalWebApprovalCompleteRequestTotalDuration"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>anthie@google.com</owner>
   <owner>ljjlee@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
@@ -423,7 +423,7 @@
 </histogram>
 
 <histogram name="FamilyLinkUser.LocalWebApprovalOutcome"
-    enum="FamilyLinkUserLocalWebApprovalOutcome" expires_after="2025-05-11">
+    enum="FamilyLinkUserLocalWebApprovalOutcome" expires_after="2025-07-13">
   <owner>anthie@google.com</owner>
   <owner>ljjlee@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
@@ -435,7 +435,7 @@
 </histogram>
 
 <histogram name="FamilyLinkUser.LocalWebApprovalResult"
-    enum="FamilyLinkUserLocalWebApprovalResult" expires_after="2025-05-11">
+    enum="FamilyLinkUserLocalWebApprovalResult" expires_after="2025-07-13">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
@@ -863,7 +863,7 @@
 </histogram>
 
 <histogram name="SupervisedUsers.ClassifyUrlThrottle.Status"
-    enum="ClassifyUrlThrottleStatus" expires_after="2025-05-11">
+    enum="ClassifyUrlThrottleStatus" expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -1121,7 +1121,7 @@
 </histogram>
 
 <histogram name="{RequestType}.AuthError" enum="GoogleServiceAuthError"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ljjlee@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -1133,7 +1133,7 @@
 </histogram>
 
 <histogram name="{RequestType}.HttpStatusOrNetError"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-05-11">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index a569cf7..61e9127 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -646,7 +646,7 @@
 </histogram>
 
 <histogram name="InProductHelp.Db.TotalEvents" units="events"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>nyquist@chromium.org</owner>
   <summary>
     Records the total number of event records in the database for in-product
@@ -683,7 +683,7 @@
 </histogram>
 
 <histogram name="InProductHelp.NotifyEventReadyState.{IPHFeature}"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>nyquist@chromium.org</owner>
   <summary>
     Records if the model is ready when in-product help event happens for
@@ -693,7 +693,7 @@
 </histogram>
 
 <histogram name="InProductHelp.ShouldTriggerHelpUI.{IPHFeature}"
-    enum="TriggerHelpUIResult" expires_after="2025-05-11">
+    enum="TriggerHelpUIResult" expires_after="2025-07-13">
   <owner>nyquist@chromium.org</owner>
   <summary>
     Records if in-product help for {IPHFeature} is shown to the user, and the
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index c7c4315..10c7fd72 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -1457,7 +1457,7 @@
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.OfficeWebAppOfflineInstallation"
-    enum="WebAppInstallResultCode" expires_after="2025-05-01">
+    enum="WebAppInstallResultCode" expires_after="2025-07-13">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/fingerprint/histograms.xml b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
index c76c280..333c000 100644
--- a/tools/metrics/histograms/metadata/fingerprint/histograms.xml
+++ b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
@@ -385,7 +385,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.RecordFormatVersion"
-    enum="FingerprintRecordFormatVersion" expires_after="2025-05-11">
+    enum="FingerprintRecordFormatVersion" expires_after="2025-07-13">
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gcm/histograms.xml b/tools/metrics/histograms/metadata/gcm/histograms.xml
index b9304e2..45e85cc0 100644
--- a/tools/metrics/histograms/metadata/gcm/histograms.xml
+++ b/tools/metrics/histograms/metadata/gcm/histograms.xml
@@ -102,7 +102,7 @@
 </histogram>
 
 <histogram name="GCM.DeliveredToAppHandler{AppHandler}" enum="BooleanDelivered"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>peter@chromium.org</owner>
   <owner>rushans@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml
index 4a0e8a00..4124c43 100644
--- a/tools/metrics/histograms/metadata/geolocation/histograms.xml
+++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -272,7 +272,7 @@
 </histogram>
 
 <histogram name="Geolocation.NetworkLocationRequest.ResponseCode"
-    enum="HttpResponseCode" expires_after="2025-05-11">
+    enum="HttpResponseCode" expires_after="2025-07-13">
   <owner>mattreynolds@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 d06ccaa..dd6e544 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -396,7 +396,7 @@
 </histogram>
 
 <histogram name="GPU.ANGLE.MetalShaderCompilationTimeUs" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>geofflang@chromium.org</owner>
   <owner>angle-team@google.com</owner>
   <summary>
@@ -462,7 +462,7 @@
 </histogram>
 
 <histogram name="GPU.BlocklistFeatureTestResults.{GPUBlocklistPerFeature}"
-    enum="GPUBlocklistFeatureTestResults" expires_after="2025-05-11">
+    enum="GPUBlocklistFeatureTestResults" expires_after="2025-07-13">
   <owner>vmiura@chromium.org</owner>
   <owner>kylechar@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -541,7 +541,7 @@
 </histogram>
 
 <histogram name="GPU.D3D11FeatureLevel" enum="D3D11FeatureLevel"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -551,7 +551,7 @@
 </histogram>
 
 <histogram name="GPU.D3D12FeatureLevel" enum="D3D12FeatureLevel"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <summary>
@@ -561,7 +561,7 @@
 </histogram>
 
 <histogram name="GPU.D3D12HighestShaderModel2" enum="D3DShaderModel"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <owner>amaiorano@google.com</owner>
@@ -634,7 +634,7 @@
 
 <histogram
     name="GPU.DirectComposition.DCLayerResult.{OverlayProcessingQuadType}"
-    enum="DCLayerResult" expires_after="2025-05-11">
+    enum="DCLayerResult" expires_after="2025-07-13">
   <owner>sunnyps@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -776,7 +776,7 @@
 </histogram>
 
 <histogram name="GPU.EnsureWorkVisibleDuration" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alemate@chromium.org</owner>
   <owner>magchen@chromium.org</owner>
   <owner>oshima@chromium.org</owner>
@@ -795,7 +795,7 @@
 </histogram>
 
 <histogram name="GPU.EnsureWorkVisibleDurationLowRes" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alemate@chromium.org</owner>
   <owner>magchen@chromium.org</owner>
   <owner>oshima@chromium.org</owner>
@@ -842,7 +842,7 @@
 </histogram>
 
 <histogram name="GPU.EstablishGpuChannelSyncTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <summary>
@@ -928,7 +928,7 @@
 </histogram>
 
 <histogram name="GPU.GPUInitializationTime.V4" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -990,7 +990,7 @@
 </histogram>
 
 <histogram name="Gpu.Graphite.GraphiteImageProviderAccessHitInCache"
-    enum="Boolean" expires_after="2025-04-06">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>blundell@chromium.org</owner>
   <owner>sunnyps@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -1208,7 +1208,7 @@
 </histogram>
 
 <histogram name="Gpu.MetalShaderCache.WaitTime" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sky@chromium.org</owner>
   <owner>angle-team@google.com</owner>
   <summary>
@@ -1250,7 +1250,7 @@
   </summary>
 </histogram>
 
-<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2025-05-11">
+<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2025-07-13">
   <owner>hubbe@chromium.org</owner>
   <owner>cassew@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -1378,7 +1378,7 @@
 </histogram>
 
 <histogram name="Gpu.Rasterization.Raster.MSAASampleCountLog2" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>penghuang@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1419,7 +1419,7 @@
 </histogram>
 
 <histogram name="GPU.SharedImage.ContentConsumed" enum="BooleanMatched"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>penghuang@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1606,7 +1606,7 @@
 </histogram>
 
 <histogram name="GPU.{GraphiteDawnOrWebGPU}.Create{Module}Success"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>enga@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
@@ -1618,7 +1618,7 @@
 </histogram>
 
 <histogram name="GPU.{GraphiteDawnOrWebGPU}.Create{Module}US"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>enga@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
@@ -1631,7 +1631,7 @@
 </histogram>
 
 <histogram name="GPU.{GraphiteDawnOrWebGPU}.HasGpuAdapter" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cduvall@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
@@ -1668,7 +1668,7 @@
 </histogram>
 
 <histogram name="GPU.{GraphiteDawnOrWebGPU}.Support" enum="WebGPUSupport"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cwallez@google.com</owner>
   <owner>enga@google.com</owner>
   <owner>kainino@google.com</owner>
@@ -1922,7 +1922,7 @@
 </histogram>
 
 <histogram name="Viz.DelegatedCompositing.Status" enum="DelegatedStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>petermcneeley@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1956,7 +1956,7 @@
 </histogram>
 
 <histogram name="Viz.DisplayCompositor.OverlayStrategy"
-    enum="OverlayStrategies" expires_after="2025-05-11">
+    enum="OverlayStrategies" expires_after="2025-07-13">
   <owner>khaslett@chromium.org</owner>
   <owner>kylechar@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index ee8ed05..70b3ad7 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -109,7 +109,7 @@
 </histogram>
 
 <histogram name="History.ClearBrowsingData.Duration.ChromeTask.{Task}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>dullweber@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <component>1456716</component>
@@ -237,7 +237,7 @@
 </histogram>
 
 <histogram name="History.ClearBrowsingData.Duration.Task.{Task}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dullweber@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <component>1456716</component>
@@ -442,7 +442,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Actions.FinalState.WasSuccessful"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -455,7 +455,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Actions.InitialState"
-    enum="HistoryClustersInitialState" expires_after="2025-05-11">
+    enum="HistoryClustersInitialState" expires_after="2025-07-13">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -480,7 +480,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Actions.NumQueries"
-    units="number queries made" expires_after="2025-05-11">
+    units="number queries made" expires_after="2025-07-13">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -728,7 +728,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Backend.KeywordCache.AllKeywordsCount"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -810,7 +810,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Backend.ProcessBatchOfVisits.ThreadTime"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -826,7 +826,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Backend.QueryAnnotatedVisits.ThreadTime"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -1291,7 +1291,7 @@
 </histogram>
 
 <histogram name="History.Clusters.ServiceLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1457319</component>
@@ -1617,7 +1617,7 @@
 </histogram>
 
 <histogram name="History.DomainCount28Day_V3" units="domains"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1695,7 +1695,7 @@
 </histogram>
 
 <histogram name="History.DomainCount7Day_V3" units="domains"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -2516,7 +2516,7 @@
 </histogram>
 
 <histogram name="History.HistoryPageView" enum="HistoryPageView"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>calamity@chromium.org</owner>
   <owner>src/chrome/browser/resources/history/OWNERS</owner>
   <component>1456716</component>
@@ -2789,7 +2789,7 @@
 </histogram>
 
 <histogram name="History.VisitedLinkTableCount" units="VisitedLinks"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kyraseevers@chromium.org</owner>
   <owner>brgoldstein@google.com</owner>
   <component>1456589</component>
@@ -2800,7 +2800,7 @@
 </histogram>
 
 <histogram name="History.VisitTableCount" units="visits"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mpearson@chromium.org</owner>
   <owner>sky@chromium.org</owner>
   <component>1456716</component>
diff --git a/tools/metrics/histograms/metadata/image/histograms.xml b/tools/metrics/histograms/metadata/image/histograms.xml
index a0eda5e..358c4c7 100644
--- a/tools/metrics/histograms/metadata/image/histograms.xml
+++ b/tools/metrics/histograms/metadata/image/histograms.xml
@@ -415,7 +415,7 @@
 </histogram>
 
 <histogram name="ImageDecoder.Png.UiGfxIntoSkBitmap" units="microseconds"
-    expires_after="M137">
+    expires_after="2025-07-13">
   <owner>lukasza@chromium.org</owner>
   <owner>chrome-rust-experiments@google.com</owner>
   <summary>
@@ -433,7 +433,7 @@
 </histogram>
 
 <histogram name="ImageDecoder.Png.UiGfxIntoVector" units="microseconds"
-    expires_after="M137">
+    expires_after="2025-07-13">
   <owner>lukasza@chromium.org</owner>
   <owner>chrome-rust-experiments@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/input/histograms.xml b/tools/metrics/histograms/metadata/input/histograms.xml
index cab2b1126..b2f1d56 100644
--- a/tools/metrics/histograms/metadata/input/histograms.xml
+++ b/tools/metrics/histograms/metadata/input/histograms.xml
@@ -1878,7 +1878,7 @@
 </histogram>
 
 <histogram name="InputMethod.SessionDuration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -1986,7 +1986,7 @@
 </histogram>
 
 <histogram name="InputMethod.TouchSelection.DragType"
-    enum="TouchSelectionDragType" expires_after="2025-05-11">
+    enum="TouchSelectionDragType" expires_after="2025-07-13">
   <owner>michellegc@google.com</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -1996,7 +1996,7 @@
 </histogram>
 
 <histogram name="InputMethod.TouchSelection.MenuAction"
-    enum="TouchSelectionMenuAction" expires_after="2025-05-11">
+    enum="TouchSelectionMenuAction" expires_after="2025-07-13">
   <owner>michellegc@google.com</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/installer/histograms.xml b/tools/metrics/histograms/metadata/installer/histograms.xml
index f0e17cb..75d8edc5 100644
--- a/tools/metrics/histograms/metadata/installer/histograms.xml
+++ b/tools/metrics/histograms/metadata/installer/histograms.xml
@@ -46,7 +46,7 @@
 </histogram>
 
 <histogram name="Installer.Postinstall.EfiBootEntryCount" units="entries"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>tbrandston@google.com</owner>
   <owner>chromeos-flex-eng@google.com</owner>
   <summary>
@@ -64,7 +64,7 @@
 </histogram>
 
 <histogram name="Installer.Postinstall.EfiBootEntryFailedLoad" units="entries"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>tbrandston@google.com</owner>
   <owner>chromeos-flex-eng@google.com</owner>
   <summary>
@@ -109,7 +109,7 @@
 </histogram>
 
 <histogram name="Installer.Postinstall.ManagedEfiBootEntryCount"
-    units="entries" expires_after="2025-05-04">
+    units="entries" expires_after="2025-07-13">
   <owner>tbrandston@google.com</owner>
   <owner>chromeos-flex-eng@google.com</owner>
   <summary>
@@ -154,7 +154,7 @@
 </histogram>
 
 <histogram name="Installer.PowerwashCount" units="powerwashes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@chromium.org</owner>
   <summary>
@@ -165,7 +165,7 @@
 </histogram>
 
 <histogram name="Installer.PowerwashDays" units="powerwashdays"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>qianwan@google.com</owner>
   <owner>chromeos-data@google.com</owner>
   <summary>
@@ -195,7 +195,7 @@
 </histogram>
 
 <histogram name="Installer.Recovery.Reason" enum="ChromeOSRecoveryReason"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/interstitial/histograms.xml b/tools/metrics/histograms/metadata/interstitial/histograms.xml
index 4e24d474..d73feabb 100644
--- a/tools/metrics/histograms/metadata/interstitial/histograms.xml
+++ b/tools/metrics/histograms/metadata/interstitial/histograms.xml
@@ -70,7 +70,7 @@
 </variants>
 
 <histogram name="interstitial.captive_portal"
-    enum="CaptivePortalBlockingPageEvent" expires_after="2025-05-11">
+    enum="CaptivePortalBlockingPageEvent" expires_after="2025-07-13">
   <owner>meacer@chromium.org</owner>
   <owner>michaeldo@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 9f662bb..37052619 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1268,7 +1268,7 @@
 </histogram>
 
 <histogram name="IOS.DockingPromo.Action" enum="IOSDockingPromoAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bwwilliams@google.com</owner>
   <owner>hiramahmood@google.com</owner>
   <owner>bling-team@google.com</owner>
@@ -2124,7 +2124,7 @@
 </histogram>
 
 <histogram name="IOS.MagicStack.Module.Click" enum="IOSMagicStackModuleType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>scottyoder@chromium.org</owner>
   <summary>
@@ -2161,7 +2161,7 @@
 </histogram>
 
 <histogram name="IOS.MagicStack.Module.Click.ParcelTracking" units="index"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-get-set-up@google.com</owner>
   <summary>
@@ -2199,7 +2199,7 @@
 </histogram>
 
 <histogram name="IOS.MagicStack.Module.Click.Shortcuts" units="index"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-get-set-up@google.com</owner>
   <summary>
@@ -2208,7 +2208,7 @@
 </histogram>
 
 <histogram name="IOS.MagicStack.Module.Click.TabResumption" units="index"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-get-set-up@google.com</owner>
   <summary>
@@ -2234,7 +2234,7 @@
 </histogram>
 
 <histogram name="IOS.MagicStack.Module.TopImpression"
-    enum="IOSMagicStackModuleType" expires_after="2025-05-11">
+    enum="IOSMagicStackModuleType" expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>scottyoder@chromium.org</owner>
   <summary>
@@ -2371,7 +2371,7 @@
 </histogram>
 
 <histogram name="IOS.MetricKit.{MXVersion}ApplicationResumeTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -2393,7 +2393,7 @@
 </histogram>
 
 <histogram name="IOS.MetricKit.{MXVersion}AverageSuspendedMemory" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -2569,7 +2569,7 @@
 </histogram>
 
 <histogram name="IOS.MetricKit.{MXVersion}ForegroundTimePerDay" units="s"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -2596,7 +2596,7 @@
 </histogram>
 
 <histogram name="IOS.MetricKit.{MXVersion}OptimizedTimeToFirstDraw" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -2622,7 +2622,7 @@
 </histogram>
 
 <histogram name="IOS.MetricKit.{MXVersion}PeakMemoryUsage" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -2650,7 +2650,7 @@
 </histogram>
 
 <histogram name="IOS.MetricKit.{MXVersion}TimeToFirstDraw" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -2729,7 +2729,7 @@
 </histogram>
 
 <histogram name="IOS.Notifications.OptInPrompt.Action"
-    enum="IOSNotificationsOptInActionOnPrompt" expires_after="2025-05-11">
+    enum="IOSNotificationsOptInActionOnPrompt" expires_after="2025-07-13">
   <owner>hiramahmood@google.com</owner>
   <owner>scottyoder@chromium.org</owner>
   <summary>Logs a user's action on the Notifications Opt-In Prompt.</summary>
@@ -2873,7 +2873,7 @@
 </histogram>
 
 <histogram name="IOS.Notifications.Tips.Triggered"
-    enum="IOSTipsNotificationType" expires_after="2025-05-11">
+    enum="IOSTipsNotificationType" expires_after="2025-07-13">
   <owner>scottyoder@chromium.org</owner>
   <owner>hiramahmood@google.com</owner>
   <summary>
@@ -2950,7 +2950,7 @@
 </histogram>
 
 <histogram name="IOS.NTP.OverscrollAction" enum="IOSNTPOverscrollAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>guiperez@google.com</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -3121,7 +3121,7 @@
 </histogram>
 
 <histogram name="IOS.OverflowMenu.ActionType" enum="IOSOverflowMenuActionType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rkgibson@google.com</owner>
   <owner>bling-team@google.com</owner>
   <summary>The type of action the user took in the overflow/tools menu</summary>
@@ -3262,7 +3262,7 @@
 </histogram>
 
 <histogram name="IOS.OverflowMenu.DestinationsOrderChangedProgrammatically"
-    enum="IOSOverflowMenuReorderingReason" expires_after="2025-05-11">
+    enum="IOSOverflowMenuReorderingReason" expires_after="2025-07-13">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -3272,7 +3272,7 @@
 </histogram>
 
 <histogram name="IOS.OverflowMenu.OverflowMenuVisited" units="bitfield value"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -3291,14 +3291,14 @@
 </histogram>
 
 <histogram name="IOS.OverflowMenu.TimeOpen" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rkgibson@google.com</owner>
   <owner>bling-team@google.com</owner>
   <summary>The amount of time the overflow/tools menu is open.</summary>
 </histogram>
 
 <histogram name="IOS.OverflowMenu.TimeOpen.ActionChosen" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -3318,7 +3318,7 @@
 </histogram>
 
 <histogram name="IOS.OverflowMenu.UserScrolledToEndAndStartedCustomization"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>rkgibson@google.com</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -3448,7 +3448,7 @@
 </histogram>
 
 <histogram name="IOS.PasswordBottomSheet.Activated" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vincb@google.com</owner>
   <owner>tmartino@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -3460,7 +3460,7 @@
 </histogram>
 
 <histogram name="IOS.PasswordBottomSheet.ExitReason"
-    enum="PasswordSuggestionBottomSheetExitReason" expires_after="2025-05-11">
+    enum="PasswordSuggestionBottomSheetExitReason" expires_after="2025-07-13">
   <owner>sugoi@chromium.org</owner>
   <owner>veronguyen@google.com</owner>
   <owner>tmartino@chromium.org</owner>
@@ -3699,7 +3699,7 @@
 </histogram>
 
 <histogram name="IOS.PromosManager.EligiblePromosInQueueCount" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gayane@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -3710,7 +3710,7 @@
 </histogram>
 
 <histogram name="IOS.PromosManager.Promo" enum="IOSPromosManagerPromo"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bwwilliams@google.com</owner>
   <owner>rkgibson@google.com</owner>
   <owner>huitingyu@google.com</owner>
@@ -3747,7 +3747,7 @@
 </histogram>
 
 <histogram name="IOS.PromosManager.Promo.Type" enum="IOSPromosManagerPromoType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bwwilliams@google.com</owner>
   <owner>rkgibson@google.com</owner>
   <owner>huitingyu@google.com</owner>
@@ -4026,7 +4026,7 @@
 </histogram>
 
 <histogram name="IOS.Reauth.Password.BottomSheet" enum="ReauthenticationEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sugoi@chromium.org</owner>
   <owner>veronguyen@google.com</owner>
   <owner>tmartino@chromium.org</owner>
@@ -4047,7 +4047,7 @@
 </histogram>
 
 <histogram name="IOS.ReconcileEULAPref" enum="Boolean"
-    expires_after="2025-03-11">
+    expires_after="2025-07-13">
   <owner>olivierrobin@google.com</owner>
   <owner>rohitrao@google.com</owner>
   <summary>
@@ -4173,7 +4173,7 @@
 </histogram>
 
 <histogram name="IOS.SandboxMetrics.AverageGreySnapshotSize" units="KB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -4206,7 +4206,7 @@
 </histogram>
 
 <histogram name="IOS.SandboxMetrics.DocumentsSize2" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -4229,7 +4229,7 @@
 </histogram>
 
 <histogram name="IOS.SandboxMetrics.LibrarySize" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -4241,7 +4241,7 @@
 </histogram>
 
 <histogram name="IOS.SandboxMetrics.OptimizationGuideModelDownloadedItems"
-    units="items" expires_after="2025-05-11">
+    units="items" expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -4252,7 +4252,7 @@
 </histogram>
 
 <histogram name="IOS.SandboxMetrics.OptimizationGuideModelDownloadsSize"
-    units="MB" expires_after="2025-05-11">
+    units="MB" expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -5439,7 +5439,7 @@
 </histogram>
 
 <histogram name="IOS.WhatsNew.ItemsClickedCount" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cheickcisse@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>The number of clicked What's New items per impression</summary>
@@ -5476,7 +5476,7 @@
 </histogram>
 
 <histogram name="IOS.WhatsNew.TableViewDidScroll" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cheickcisse@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -5484,7 +5484,7 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.WhatsNew.TimeSpent" units="ms" expires_after="2025-05-11">
+<histogram name="IOS.WhatsNew.TimeSpent" units="ms" expires_after="2025-07-13">
   <owner>cheickcisse@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>Logs the time a user spent on What's New.</summary>
diff --git a/tools/metrics/histograms/metadata/lens/histograms.xml b/tools/metrics/histograms/metadata/lens/histograms.xml
index 9a504122..e2c5f684 100644
--- a/tools/metrics/histograms/metadata/lens/histograms.xml
+++ b/tools/metrics/histograms/metadata/lens/histograms.xml
@@ -531,7 +531,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.Shown" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>erikchen@chromium.org</owner>
   <owner>mercerd@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml
index 758c622..5e596b7 100644
--- a/tools/metrics/histograms/metadata/login/histograms.xml
+++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -180,7 +180,7 @@
 </histogram>
 
 <histogram name="Login.NumberOfUsersOnLoginScreen" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mslus@chromium.org</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <summary>
@@ -271,7 +271,7 @@
 </histogram>
 
 <histogram name="Login.SessionExitType" enum="LoginSessionExitType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>iby@chromium.org</owner>
   <summary>
     Tracks whether a ChromeOS user was logged out because Chrome repeatedly
diff --git a/tools/metrics/histograms/metadata/mac/histograms.xml b/tools/metrics/histograms/metadata/mac/histograms.xml
index af29006..257d6ef 100644
--- a/tools/metrics/histograms/metadata/mac/histograms.xml
+++ b/tools/metrics/histograms/metadata/mac/histograms.xml
@@ -43,7 +43,7 @@
 </histogram>
 
 <histogram name="Mac.AppCodeSignCloneCreationTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bur@google.com</owner>
   <owner>src/ui/base/cocoa/OWNERS</owner>
   <summary>
@@ -64,7 +64,7 @@
 </histogram>
 
 <histogram name="Mac.AppFileSystemType" enum="MacFileSystemType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bur@google.com</owner>
   <owner>src/ui/base/cocoa/OWNERS</owner>
   <summary>
@@ -84,7 +84,7 @@
 </histogram>
 
 <histogram name="Mac.AppUpgradeCodeSignatureValidationStatus"
-    enum="CodeSigningOSStatus" expires_after="2025-05-11">
+    enum="CodeSigningOSStatus" expires_after="2025-07-13">
   <owner>bur@google.com</owner>
   <owner>src/ui/base/cocoa/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/magic_stack/histograms.xml b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
index 66ead19..3eb9a4b9 100644
--- a/tools/metrics/histograms/metadata/magic_stack/histograms.xml
+++ b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
@@ -72,7 +72,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.ContextMenu.ShownV2"
-    enum="ModuleType" expires_after="2025-05-11">
+    enum="ModuleType" expires_after="2025-07-13">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -312,7 +312,7 @@
 
 <histogram name="MagicStack.Clank.TabResumption.ModuleNotShownReason"
     enum="MagicStack.Clank.TabResumption.ModuleNotShownReason"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangs@google.com</owner>
   <owner>hanxi@google.com</owner>
   <summary>
@@ -327,7 +327,7 @@
 
 <histogram name="MagicStack.Clank.TabResumption.ModuleShowConfig"
     enum="MagicStack.Clank.TabResumption.ModuleShowConfig"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangs@google.com</owner>
   <owner>hanxi@google.com</owner>
   <summary>
@@ -350,7 +350,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.TabResumption.StabilityDelay" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangs@google.com</owner>
   <owner>hanxi@google.com</owner>
   <summary>
@@ -364,7 +364,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.TabResumption.TabRecency.Click" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangs@google.com</owner>
   <owner>hanxi@google.com</owner>
   <summary>
@@ -374,7 +374,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.TabResumption.TabRecency.Show" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangs@google.com</owner>
   <owner>hanxi@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index b4992802..b4917bda 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -154,7 +154,7 @@
 </histogram>
 
 <histogram name="Cast.Channel.LaunchSession.Flags" enum="CastChannelFlag"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mfoltz@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -424,7 +424,7 @@
 </histogram>
 
 <histogram name="Media.AImageReaderGLOwner.HasFence" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vasilyt@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -862,7 +862,7 @@
 </histogram>
 
 <histogram name="Media.Audio.CrasUnifiedStreamOpenSuccess"
-    enum="CrasUnifiedStreamOpenSuccess" expires_after="2025-05-11">
+    enum="CrasUnifiedStreamOpenSuccess" expires_after="2025-07-13">
   <owner>peah@chromium.org</owner>
   <owner>hychao@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -884,7 +884,7 @@
 </histogram>
 
 <histogram name="Media.Audio.InputStartupSuccessMac" enum="BooleanSuccess"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>henrika@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
   <summary>
@@ -907,7 +907,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Mac.HardwareLatency.{Direction}.{Component}"
-    units="misses" expires_after="2025-05-11">
+    units="misses" expires_after="2025-07-13">
   <owner>tguilbert@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -1180,7 +1180,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTimedOut"
-    enum="BooleanTimedOut" expires_after="2025-05-11">
+    enum="BooleanTimedOut" expires_after="2025-07-13">
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1423,7 +1423,7 @@
 </histogram>
 
 <histogram name="Media.AudioCapturerAudioGlitches" enum="AudioGlitchResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>olka@chromium.org</owner>
   <owner>gustaf@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1434,7 +1434,7 @@
 </histogram>
 
 <histogram name="Media.AudioCapturerDroppedData10sIntervals" units="drops"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1462,7 +1462,7 @@
 </histogram>
 
 <histogram name="Media.AudioCapturerMissedReadDeadline10sIntervals"
-    units="misses" expires_after="2025-05-11">
+    units="misses" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1533,7 +1533,7 @@
 </histogram>
 
 <histogram name="Media.AudioInputDevice.AudioServiceDelay" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1544,7 +1544,7 @@
 </histogram>
 
 <histogram name="Media.AudioInputDevice.AudioServiceGlitchCount{Duration}"
-    units="glitches" expires_after="2025-05-11">
+    units="glitches" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1558,7 +1558,7 @@
 </histogram>
 
 <histogram name="Media.AudioInputDevice.AudioServiceGlitchDuration{Duration}"
-    units="permille" expires_after="2025-05-11">
+    units="permille" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1572,7 +1572,7 @@
 </histogram>
 
 <histogram name="Media.AudioOutputController.CallbackError" enum="BooleanError"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>olka@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1652,7 +1652,7 @@
 </histogram>
 
 <histogram name="Media.AudioOutputDevice.AudioServiceDelay{LatencyTag}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
@@ -1667,7 +1667,7 @@
 
 <histogram
     name="Media.AudioOutputDevice.AudioServiceGlitchCount{Duration}{LatencyTag}"
-    units="glitches" expires_after="2025-05-11">
+    units="glitches" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
@@ -1685,7 +1685,7 @@
 
 <histogram
     name="Media.AudioOutputDevice.AudioServiceGlitchDuration{Duration}{LatencyTag}"
-    units="permille" expires_after="2025-05-11">
+    units="permille" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
@@ -1703,7 +1703,7 @@
 
 <histogram name="Media.AudioOutputResampler.OpenLowLatencyStream2"
     enum="AudioOutputResamplerLowLatencyOpenStreamResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>olka@chromium.org</owner>
   <owner>armax@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
@@ -1731,7 +1731,7 @@
 </histogram>
 
 <histogram name="Media.AudioRendererAudioGlitches2.{LatencyTag}"
-    enum="AudioGlitchResult" expires_after="2025-05-11">
+    enum="AudioGlitchResult" expires_after="2025-07-13">
   <owner>dalecurtis@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>tguilbert@chromium.org</owner>
@@ -1767,7 +1767,7 @@
 
 <histogram
     name="Media.AudioRendererMissedDeadline3{Mixing}{Duration}{LatencyTag}"
-    units="misses" expires_after="2025-05-11">
+    units="misses" expires_after="2025-07-13">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
@@ -1835,7 +1835,7 @@
 
 <histogram
     name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}"
-    enum="MediaAutoPictureInPicturePromptResult" expires_after="2025-05-11">
+    enum="MediaAutoPictureInPicturePromptResult" expires_after="2025-07-13">
   <owner>bkeen@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -2168,7 +2168,7 @@
 </histogram>
 
 <histogram name="Media.DocumentPictureInPicture.CloseReason"
-    enum="DocumentPictureInPictureCloseReason" expires_after="2025-05-11">
+    enum="DocumentPictureInPictureCloseReason" expires_after="2025-07-13">
   <owner>steimel@chromium.org</owner>
   <owner>liberato@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -2233,7 +2233,7 @@
 </histogram>
 
 <histogram name="Media.DroppedFrameCount2.{RendererType}.{ClearOrEncrypted}"
-    units="units" expires_after="2025-05-11">
+    units="units" expires_after="2025-07-13">
   <owner>dalecurtis@chromium.org</owner>
   <owner>frankli@microsoft.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -3460,7 +3460,7 @@
 </histogram>
 
 <histogram name="Media.FrameInfo.GuessedInitialCodedSizeSuccess"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -3592,7 +3592,7 @@
 </histogram>
 
 <histogram name="Media.GlobalMediaControls.EntryPoint"
-    enum="GlobalMediaControlsEntryPoint" expires_after="2025-05-11">
+    enum="GlobalMediaControlsEntryPoint" expires_after="2025-07-13">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -3652,7 +3652,7 @@
 </histogram>
 
 <histogram name="Media.GlobalMediaControls.RepeatUsage" enum="BooleanIsRepeat"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -3663,7 +3663,7 @@
 </histogram>
 
 <histogram name="Media.GlobalMediaControls.UserActionFocus"
-    enum="BooleanFocused" expires_after="2025-05-11">
+    enum="BooleanFocused" expires_after="2025-07-13">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -3674,7 +3674,7 @@
 </histogram>
 
 <histogram name="Media.GPU.OutputFormat" enum="OutputFormat"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hitawala@chromium.org</owner>
   <owner>vasilyt@chromium.org</owner>
   <owner>shared-image-team@google.com</owner>
@@ -3686,7 +3686,7 @@
 </histogram>
 
 <histogram name="Media.GPU.OutputFormatHardwareGmb" enum="OutputFormat"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hitawala@chromium.org</owner>
   <owner>vasilyt@chromium.org</owner>
   <owner>shared-image-team@google.com</owner>
@@ -3698,7 +3698,7 @@
 </histogram>
 
 <histogram name="Media.GPU.OutputFormatSoftwareGmb" enum="OutputFormat"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hitawala@chromium.org</owner>
   <owner>vasilyt@chromium.org</owner>
   <owner>shared-image-team@google.com</owner>
@@ -3765,7 +3765,7 @@
 </histogram>
 
 <histogram name="Media.GpuMemoryBufferVideoFramePool.UnsupportedFormat"
-    enum="VideoPixelFormatUnion" expires_after="2025-05-11">
+    enum="VideoPixelFormatUnion" expires_after="2025-07-13">
   <owner>magchen@chromium.org</owner>
   <owner>mcasas@chromium.org</owner>
   <summary>
@@ -3802,7 +3802,7 @@
 </histogram>
 
 <histogram name="Media.HardwareKeyPressed" enum="MediaHardwareKeyAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -3815,7 +3815,7 @@
 </histogram>
 
 <histogram name="Media.HasAcceleratedVideoDecode.{CodecType}"
-    enum="BooleanSupported" expires_after="2025-05-11">
+    enum="BooleanSupported" expires_after="2025-07-13">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -4002,7 +4002,7 @@
 </histogram>
 
 <histogram name="Media.InputStreamDurationWithoutCallback" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>olka@chromium.org</owner>
   <owner>henrika@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -4034,7 +4034,7 @@
 </histogram>
 
 <histogram name="Media.MeanTimeBetweenRebuffers" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     The total watch time (see Media.WatchTime) of a given playback divided by
@@ -4884,7 +4884,7 @@
 </histogram>
 
 <histogram name="Media.PipelineStatus.Start" enum="PipelineStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xhwang@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -5424,7 +5424,7 @@
 </histogram>
 
 <histogram name="Media.ScreenCaptureKit.FullscreenModuleMode"
-    enum="ScreenCaptureKitFullscreenModuleMode" expires_after="2025-05-11">
+    enum="ScreenCaptureKitFullscreenModuleMode" expires_after="2025-07-13">
   <owner>kron@chromium.org</owner>
   <owner>webrtc-video@google.com</owner>
   <summary>
@@ -5448,7 +5448,7 @@
 </histogram>
 
 <histogram name="Media.Session.EnterPictureInPicture"
-    enum="MediaSessionEnterPictureInPictureType" expires_after="2025-05-11">
+    enum="MediaSessionEnterPictureInPictureType" expires_after="2025-07-13">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -5604,7 +5604,7 @@
 </histogram>
 
 <histogram name="Media.Ui.GetDisplayMedia.BasicFlow.SourceCount.{Type}"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>eladalon@chromium.org</owner>
   <owner>tovep@chromium.org</owner>
   <summary>
@@ -5789,7 +5789,7 @@
 </histogram>
 
 <histogram name="Media.VaapiVideoDecoder.DecodeError" enum="BooleanError"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mcasas@chromium.org</owner>
   <owner>chromeos-gfx@chromium.org</owner>
   <summary>
@@ -5799,7 +5799,7 @@
 </histogram>
 
 <histogram name="Media.VaapiVideoDecoder.VaapiWrapperCreationSuccess"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>mcasas@chromium.org</owner>
   <owner>chromeos-gfx-video@google.com</owner>
   <summary>
@@ -6747,7 +6747,7 @@
   </summary>
 </histogram>
 
-<histogram name="Media.WatchTime" units="ms" expires_after="2025-05-11">
+<histogram name="Media.WatchTime" units="ms" expires_after="2025-07-13">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     Watch time is defined as the amount of elapsed media time for audio+video
@@ -6820,7 +6820,7 @@
 </histogram>
 
 <histogram name="Media.WebMediaPlayerImpl.HLS{Variant}.MimeType"
-    enum="MimeTypeOfHlsManifest" expires_after="2025-05-11">
+    enum="MimeTypeOfHlsManifest" expires_after="2025-07-13">
   <owner>tmathmeyer@chromium.org</owner>
   <owner>lukasza@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -7161,7 +7161,7 @@
 </histogram>
 
 <histogram name="MediaPreviews.UI.{UiLocation}.OriginTrialAllowed"
-    enum="Boolean" expires_after="2025-05-08">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>mfoltz@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -7407,7 +7407,7 @@
 </histogram>
 
 <histogram name="MediaRouter.CastStreaming.Start.Success" enum="MirrorType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index bdeb8c6..82504a9 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -219,7 +219,7 @@
 </histogram>
 
 <histogram name="HeapProfiling.InProcess.TotalSampledMemory{Process}"
-    units="MB" expires_after="2025-05-11">
+    units="MB" expires_after="2025-07-13">
   <owner>joenotcharles@google.com</owner>
   <owner>etienneb@chromium.org</owner>
   <owner>chrome-memory@google.com</owner>
@@ -275,7 +275,7 @@
 </histogram>
 
 <histogram name="Memory.Browser.MemoryFootprint.Active" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -331,7 +331,7 @@
 </histogram>
 
 <histogram name="Memory.Browser.MemoryFootprint.NumOpenTabs" units="tabs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>justincohen@chromium.org</owner>
   <owner>rkgibson@google.com</owner>
   <summary>
@@ -548,7 +548,7 @@
 </histogram>
 
 <histogram name="Memory.Experimental.AvailableMemoryPercent" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -779,7 +779,7 @@
 </histogram>
 
 <histogram name="Memory.Experimental.MacAvailableMemoryPercentFreePageCache2"
-    units="%" expires_after="2025-05-11">
+    units="%" expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1187,7 +1187,7 @@
 </histogram>
 
 <histogram name="Memory.GPU.PeakMemoryAllocationSource2.{Usage}.{Source}"
-    units="MB" expires_after="2025-05-11">
+    units="MB" expires_after="2025-07-13">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1207,7 +1207,7 @@
 </histogram>
 
 <histogram name="Memory.GPU.PeakMemoryUsage2.{Usage}" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1404,7 +1404,7 @@
 </histogram>
 
 <histogram name="Memory.NetworkService.PrivateMemoryFootprint" units="MiB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mmenke@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <owner>erikchen@chromium.org</owner>
@@ -1460,14 +1460,14 @@
 </histogram>
 
 <histogram name="Memory.OOMKills.Count" units="kills"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vovoy@google.com</owner>
   <owner>wvk@google.com</owner>
   <summary>Cumulative count of OOM kills in one user session.</summary>
 </histogram>
 
 <histogram name="Memory.OOMKills.Daily" units="kills"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vovoy@google.com</owner>
   <owner>src/chromeos/ash/components/memory/OWNERS</owner>
   <summary>
@@ -1658,7 +1658,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableString.OnDiskSizeKb.5min" units="KB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -1710,7 +1710,7 @@
 </histogram>
 
 <histogram name="Memory.PartitionAlloc.MemoryReclaim" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yukishiino@chromium.org</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1949,7 +1949,7 @@
 </histogram>
 
 <histogram name="Memory.RendererProcessCount" units="processes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>creis@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
   <summary>
@@ -2145,7 +2145,7 @@
 </histogram>
 
 <histogram name="Memory.Total.GpuMappedMemory" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>chrome-memory@chromium.org</owner>
   <summary>
@@ -2157,7 +2157,7 @@
 </histogram>
 
 <histogram name="Memory.Total.HibernatedCanvas.OriginalSize" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>chrome-memory@chromium.org</owner>
   <summary>
@@ -2170,7 +2170,7 @@
 </histogram>
 
 <histogram name="Memory.Total.HibernatedCanvas.Size" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>chrome-memory@chromium.org</owner>
   <summary>
@@ -2208,7 +2208,7 @@
 </histogram>
 
 <histogram name="Memory.Total.PrivateMemoryFootprintExcludingWaivedRenderers"
-    units="MB" expires_after="2025-05-11">
+    units="MB" expires_after="2025-07-13">
   <owner>ckitagawa@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -2222,7 +2222,7 @@
 
 <histogram
     name="Memory.Total.PrivateMemoryFootprintVisibleOrHigherPriorityRenderers"
-    units="MB" expires_after="2025-05-11">
+    units="MB" expires_after="2025-07-13">
   <owner>ckitagawa@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -2273,7 +2273,7 @@
 </histogram>
 
 <histogram name="Memory.Total.RendererPrivateMemoryFootprint" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tommckee@chromium.org</owner>
   <summary>
     A rough estimate of the private memory footprint of all renderer processes.
@@ -2305,7 +2305,7 @@
 
 <histogram
     name="Memory.Total.RendererPrivateMemoryFootprintVisibleOrHigherPriority"
-    units="MB" expires_after="2025-05-11">
+    units="MB" expires_after="2025-07-13">
   <owner>ckitagawa@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -2369,7 +2369,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.Total.TileMemory" units="MB" expires_after="2025-05-11">
+<histogram name="Memory.Total.TileMemory" units="MB" expires_after="2025-07-13">
   <owner>lizeb@chromium.org</owner>
   <owner>chrome-gpu-memory@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index b515453..aff5631f 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -103,7 +103,7 @@
 </histogram>
 
 <histogram name="Mobile.ContextMenu.EntryPoints" enum="IOSMenuScenario"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@chromium.org</owner>
   <summary>
@@ -317,7 +317,7 @@
 </histogram>
 
 <histogram name="Mobile.Messages.Banner.Event.{MobileInfobarType}"
-    enum="MobileMessagesBannerEvent" expires_after="2025-05-11">
+    enum="MobileMessagesBannerEvent" expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>Records infobar banner events. {MobileInfobarType}</summary>
@@ -1013,7 +1013,7 @@
 </histogram>
 
 <histogram name="MobileFre.Progress.{MobileFreEntryType}"
-    enum="MobileFreProgress" expires_after="2025-05-11">
+    enum="MobileFreProgress" expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>samarchehade@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1276,7 +1276,7 @@
 </histogram>
 
 <histogram name="MobileStartup.IntentToCreationTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tedchoc@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index e31b565..0d99a60f 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -298,7 +298,7 @@
 
 <histogram
     name="BackForwardCache.Experimental.UnexpectedIPCMessagePostedToCachedFrame.MethodHash"
-    enum="MojoInterfaceName" expires_after="2025-05-11">
+    enum="MojoInterfaceName" expires_after="2025-07-13">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -766,7 +766,7 @@
 
 <histogram
     name="Navigation.CommitNavigationWithParams.Time.IsStandardLoadType.IsHTTPOrHTTPS"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -790,7 +790,7 @@
 
 <histogram
     name="Navigation.CommitRenderFrame.OutermostMainFrame.NewNavigation.IsHTTPOrHTTPS"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -802,7 +802,7 @@
 </histogram>
 
 <histogram name="Navigation.CommitRenderFrame.{FrameType}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -863,7 +863,7 @@
 </histogram>
 
 <histogram name="Navigation.DidCommitSameDocumentNavigation.Duration"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>peilinwang@google.com</owner>
   <owner>woa-performance-bugs+jank@google.com</owner>
   <summary>
@@ -1129,7 +1129,7 @@
 
 <histogram
     name="Navigation.GetFrameHostForNavigationTime.InDidCreateNavigationRequest.IsHTTPOrHTTPS"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1401,7 +1401,7 @@
 </histogram>
 
 <histogram name="Navigation.MainFrame.SiteEngagementLevel"
-    enum="SiteEngagementLevel" expires_after="2025-05-11">
+    enum="SiteEngagementLevel" expires_after="2025-07-13">
   <owner>meacer@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -1411,7 +1411,7 @@
 </histogram>
 
 <histogram name="Navigation.MainFrame.ThirdPartyCookieBlockingEnabled"
-    enum="ThirdPartyCookieBlockState" expires_after="2025-05-11">
+    enum="ThirdPartyCookieBlockState" expires_after="2025-07-13">
   <owner>dullweber@chromium.org</owner>
   <owner>feuunk@chromium.org</owner>
   <summary>
@@ -1509,7 +1509,7 @@
 </histogram>
 
 <histogram name="Navigation.MainFrameSchemeDifferentPageOTR2"
-    enum="NavigationScheme" expires_after="2025-05-11">
+    enum="NavigationScheme" expires_after="2025-07-13">
   <owner>estark@chromium.org</owner>
   <owner>elawrence@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
@@ -1545,7 +1545,7 @@
 </histogram>
 
 <histogram name="Navigation.OnBeforeUnloadTotalTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1783,7 +1783,7 @@
 
 <histogram
     name="Navigation.Prerender.ActivationCommitDeferTime{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-prerendering@chromium.org</owner>
   <summary>
@@ -2400,7 +2400,7 @@
 </histogram>
 
 <histogram name="Navigation.TimeToActivatePrerender{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>sreejakshetty@chromium.org</owner>
   <owner>chrome-prerendering@chromium.org</owner>
@@ -2428,7 +2428,7 @@
 </histogram>
 
 <histogram name="Navigation.TpcdMitigations.MetadataCohortDistribution"
-    enum="TpcdMetadataCohort" expires_after="2025-05-11">
+    enum="TpcdMetadataCohort" expires_after="2025-07-13">
   <owner>njeunje@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -2444,7 +2444,7 @@
 </histogram>
 
 <histogram name="Navigation.TpcdMitigations.MetadataInstallationResult"
-    enum="TpcdMetadataInstallationResult" expires_after="2025-05-11">
+    enum="TpcdMetadataInstallationResult" expires_after="2025-07-13">
   <owner>njeunje@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -2785,7 +2785,7 @@
 
 <histogram
     name="Prerender.Experimental.ActivationHeadersMismatch{PreloadingTriggerType}"
-    enum="PrerenderActivationHeaderMismatchType" expires_after="2025-05-11">
+    enum="PrerenderActivationHeaderMismatchType" expires_after="2025-07-13">
   <owner>lingqi@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -2906,7 +2906,7 @@
 </histogram>
 
 <histogram name="Prerender.Experimental.PredictionStatus.DefaultSearchEngine"
-    enum="PrerenderPredictionStatus" expires_after="2025-05-11">
+    enum="PrerenderPredictionStatus" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -2944,7 +2944,7 @@
 
 <histogram
     name="Prerender.Experimental.PrerenderCancelledInterface{PreloadingTriggerType}"
-    enum="PrerenderCancelledInterface" expires_after="2025-05-11">
+    enum="PrerenderCancelledInterface" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>toyoshim@chromium.org</owner>
   <owner>lingqi@chromium.org</owner>
@@ -2958,7 +2958,7 @@
 
 <histogram
     name="Prerender.Experimental.PrerenderCancelledUnknownInterface{PreloadingTriggerType}"
-    enum="PrerenderCancelledUnknownInterface" expires_after="2025-05-11">
+    enum="PrerenderCancelledUnknownInterface" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>toyoshim@chromium.org</owner>
   <owner>lingqi@chromium.org</owner>
@@ -3010,7 +3010,7 @@
 
 <histogram
     name="Prerender.Experimental.PrerenderHostFinalStatus{PreloadingTriggerType}"
-    enum="PrerenderHostFinalStatus" expires_after="2025-05-11">
+    enum="PrerenderHostFinalStatus" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>toyoshim@chromium.org</owner>
   <owner>lingqi@chromium.org</owner>
@@ -3108,7 +3108,7 @@
 </histogram>
 
 <histogram name="Prerender.FinalStatus" enum="PrerenderFinalStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ryansturm@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -3117,7 +3117,7 @@
 </histogram>
 
 <histogram name="Prerender.IsPrerenderingSRPUrl.{PreloadingEmbedderType}"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>robertlin@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -3146,7 +3146,7 @@
 </histogram>
 
 <histogram name="Prerender.PrerenderTimeSaved" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gambard@chromium.org</owner>
   <owner>justincohen@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/nearby/histograms.xml b/tools/metrics/histograms/metadata/nearby/histograms.xml
index 951d763..815042c9 100644
--- a/tools/metrics/histograms/metadata/nearby/histograms.xml
+++ b/tools/metrics/histograms/metadata/nearby/histograms.xml
@@ -1378,7 +1378,7 @@
 <histogram
     name="Nearby.Share.Certificates.Manager.GetDecryptedPublicCertificateResult"
     enum="NearbyShareCertificateManagerGetDecryptedPublicCertificateResult"
-    expires_after="2025-04-30">
+    expires_after="2025-07-13">
   <owner>crisrael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/net/enums.xml b/tools/metrics/histograms/metadata/net/enums.xml
index cf38288d..f214431 100644
--- a/tools/metrics/histograms/metadata/net/enums.xml
+++ b/tools/metrics/histograms/metadata/net/enums.xml
@@ -2698,6 +2698,8 @@
   <int value="3" label="Cross-site redirect with storage access override"/>
 </enum>
 
+<!-- LINT.IfChange(StreamSocketCloseReason) -->
+
 <enum name="StreamSocketCloseReason">
   <int value="0" label="Unspecified"/>
   <int value="1" label="Close all connections"/>
@@ -2708,8 +2710,11 @@
   <int value="6" label="QUIC session created"/>
   <int value="7" label="Using existing SPDY session"/>
   <int value="8" label="Using existing QUIC session"/>
+  <int value="9" label="Abort"/>
 </enum>
 
+<!-- LINT.ThenChange(//net/socket/stream_socket_close_reason.h:StreamSocketCloseReason) -->
+
 <enum name="TPMSupport">
   <int value="0" label="None"/>
   <int value="1" label="RSA"/>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 274653e..3e74b98 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -369,7 +369,7 @@
   </summary>
 </histogram>
 
-<histogram name="HttpCache.AccessToDone2" units="ms" expires_after="2025-05-11">
+<histogram name="HttpCache.AccessToDone2" units="ms" expires_after="2025-07-13">
   <owner>morlovich@chromium.org</owner>
   <owner>olivierli@chromium.org</owner>
   <summary>
@@ -390,7 +390,7 @@
   </summary>
 </histogram>
 
-<histogram name="HttpCache.BeforeSend" units="ms" expires_after="2025-05-11">
+<histogram name="HttpCache.BeforeSend" units="ms" expires_after="2025-07-13">
   <owner>morlovich@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -401,7 +401,7 @@
 </histogram>
 
 <histogram name="HttpCache.CreateDiskEntry" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yhirano@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -465,7 +465,7 @@
   </summary>
 </histogram>
 
-<histogram name="HttpCache.OpenDiskEntry" units="ms" expires_after="2025-05-11">
+<histogram name="HttpCache.OpenDiskEntry" units="ms" expires_after="2025-07-13">
   <owner>yhirano@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -483,7 +483,7 @@
 </histogram>
 
 <histogram name="HttpCache.TotalDiskCacheTimePerTransaction.{AccessType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -507,7 +507,7 @@
 </histogram>
 
 <histogram name="Net.AlternateProtocolUsage" enum="AlternateProtocolUsage"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -517,7 +517,7 @@
 </histogram>
 
 <histogram name="Net.AlternateProtocolUsageGoogle"
-    enum="AlternateProtocolUsage" expires_after="2025-05-11">
+    enum="AlternateProtocolUsage" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -878,7 +878,7 @@
 </histogram>
 
 <histogram name="Net.ConnectionInfo.MainFrame" enum="ConnectionInfo"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -889,7 +889,7 @@
 </histogram>
 
 <histogram name="Net.ConnectionInfo.SubResource" enum="ConnectionInfo"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -1068,7 +1068,7 @@
 </histogram>
 
 <histogram name="Net.DNS.DnsConfig.SecureDnsMode" enum="SecureDnsModeDetails"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>src/net/dns/OWNERS</owner>
   <summary>
@@ -1533,7 +1533,7 @@
 </histogram>
 
 <histogram name="Net.DNS.JobQueueTime.Failure" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -1544,7 +1544,7 @@
 </histogram>
 
 <histogram name="Net.DNS.JobQueueTime.PerTransaction" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>horo@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -1786,7 +1786,7 @@
 </histogram>
 
 <histogram name="Net.DNS.UpgradeConfig.DotUpgradeSucceeded" enum="Boolean"
-    expires_after="2025-05-08">
+    expires_after="2025-07-13">
   <owner>awillia@chromium.org</owner>
   <owner>src/net/dns/OWNERS</owner>
   <summary>
@@ -2084,7 +2084,7 @@
 
 <histogram
     name="Net.HttpJob.IpProtection.AllowListMatch.PrefilterBytesRead.Net"
-    units="bytes" expires_after="2025-05-11">
+    units="bytes" expires_after="2025-07-13">
   <owner>abhijithnair@chromium.org</owner>
   <owner>ashleynewson@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
@@ -2164,7 +2164,7 @@
 </histogram>
 
 <histogram name="Net.HttpJob.IpProtection.TotalTimeNotCached.{Chain}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>djmitche@chromium.org</owner>
   <owner>ashleynewson@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
@@ -2411,7 +2411,7 @@
 </histogram>
 
 <histogram name="Net.HttpRequestSSLUpgradeDecision"
-    enum="HttpRequestSSLUpgradeDecision" expires_after="2025-05-11">
+    enum="HttpRequestSSLUpgradeDecision" expires_after="2025-07-13">
   <owner>cthomp@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <owner>joenotcharles@google.com</owner>
@@ -2455,8 +2455,24 @@
   </summary>
 </histogram>
 
+<histogram name="Net.HttpStreamPool.Existing{Protocol}SessionFoundTime"
+    units="ms" expires_after="2025-07-13">
+  <owner>bashi@chromium.org</owner>
+  <owner>blink-network-stack@google.com</owner>
+  <summary>
+    Time from when a service endpoint request is started to when an existing
+    {Protocol} session is found by IP-based matching. Recorded when an existing
+    {Protocol} session is found after the service endpoint request is updated or
+    finished.
+  </summary>
+  <token key="Protocol">
+    <variant name="Quic" summary="QUIC"/>
+    <variant name="Spdy" summary="SPDY"/>
+  </token>
+</histogram>
+
 <histogram name="Net.HttpStreamPool.JobCompleteTime.{Result}" units="ms"
-    expires_after="2025-07-06">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2471,7 +2487,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.JobCreateToResumeTime.{Result}" units="ms"
-    expires_after="2025-07-06">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2486,7 +2502,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.JobErrorCode" enum="NetErrorCodes"
-    expires_after="2025-06-29">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2495,8 +2511,19 @@
   </summary>
 </histogram>
 
+<histogram name="Net.HttpStreamPool.NewSpdySessionEstablishTime" units="ms"
+    expires_after="2025-07-13">
+  <owner>bashi@chromium.org</owner>
+  <owner>blink-network-stack@google.com</owner>
+  <summary>
+    Time from when a stream attempt is created to when a new SPDY session is
+    created from the attempt. Recorded when a new SPDY session is created as a
+    result of a stream attempt.
+  </summary>
+</histogram>
+
 <histogram name="Net.HttpStreamPool.QuicTaskTime.{Result}" units="ms"
-    expires_after="2025-02-27">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2511,7 +2538,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.StreamAttemptCancelCount.{Reason}"
-    units="attempts" expires_after="2025-02-27">
+    units="attempts" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2532,7 +2559,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.StreamAttemptCancelReason"
-    enum="StreamSocketCloseReason" expires_after="2025-06-22">
+    enum="StreamSocketCloseReason" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2542,7 +2569,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.StreamAttemptDelay" units="ms"
-    expires_after="2025-02-27">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2552,7 +2579,7 @@
 </histogram>
 
 <histogram name="Net.HttpStreamPool.StreamAttemptTime.{Result}" units="ms"
-    expires_after="2025-06-22">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2610,7 +2637,7 @@
 </histogram>
 
 <histogram name="Net.NetworkChangeNotifier.NewConnectionType"
-    enum="NetworkConnectionType" expires_after="2025-05-11">
+    enum="NetworkConnectionType" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2635,7 +2662,7 @@
 
 <histogram
     name="Net.NetworkTransaction.Create{StreamType}Time{HostType}.{Protocol}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2741,7 +2768,7 @@
 </histogram>
 
 <histogram name="Net.NetworkTransaction.NegotiatedProtocol{HostType}"
-    enum="SSLNegotiatedAlpnProtocol" expires_after="2025-06-22">
+    enum="SSLNegotiatedAlpnProtocol" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2764,7 +2791,7 @@
 </histogram>
 
 <histogram name="Net.NetworkTransaction.StreamAddressFamily"
-    enum="AddressFamily" expires_after="2025-02-27">
+    enum="AddressFamily" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2776,7 +2803,7 @@
 
 <histogram
     name="Net.NetworkTransaction.StreamRequestCompleteTime{HostType}.{SuccessOrFailure}"
-    units="ms" expires_after="2025-06-22">
+    units="ms" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2788,7 +2815,7 @@
 </histogram>
 
 <histogram name="Net.NetworkTransaction.StreamRequestErrorCode"
-    enum="NetErrorCodes" expires_after="2025-06-22">
+    enum="NetErrorCodes" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2818,7 +2845,7 @@
 </histogram>
 
 <histogram name="Net.OnTransferSizeUpdated.Experimental.OverridenBy"
-    enum="OnTransferSizeUpdatedFrom" expires_after="2025-04-13">
+    enum="OnTransferSizeUpdatedFrom" expires_after="2025-07-13">
   <owner>amanvr@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
   <summary>
@@ -3749,7 +3776,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.ConnectionMigration"
-    enum="QuicConnectionMigrationStatus" expires_after="2025-05-11">
+    enum="QuicConnectionMigrationStatus" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -3845,7 +3872,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.EncryptionEstablishedTime"
-    units="Milliseconds" expires_after="2025-05-11">
+    units="Milliseconds" expires_after="2025-07-13">
   <owner>fayang@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -3923,7 +3950,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.HandshakeConfirmedTime" units="Milliseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -4189,7 +4216,7 @@
   </summary>
 </histogram>
 
-<histogram name="Net.QuicSession.MinRTT" units="ms" expires_after="2025-05-11">
+<histogram name="Net.QuicSession.MinRTT" units="ms" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -4466,7 +4493,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.PortMigration"
-    enum="QuicConnectionMigrationStatus" expires_after="2025-05-11">
+    enum="QuicConnectionMigrationStatus" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>The result of a QUIC port migration attempt.</summary>
@@ -4547,7 +4574,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.QuicVersion" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>Version of the QUIC protocol used for this connection.</summary>
@@ -4735,7 +4762,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.SmoothedRTT" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -5044,7 +5071,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.ZeroRttReason"
-    enum="SSLHandshakeEarlyDataReason" expires_after="2025-05-11">
+    enum="SSLHandshakeEarlyDataReason" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -5370,15 +5397,21 @@
 </histogram>
 
 <histogram
-    name="Net.SessionCreate.GoogleSearch.Preconnect.Quic.CompletionResult"
+    name="Net.SessionCreate.GoogleSearch.Preconnect.Quic.CompletionResult{JobType}"
     enum="NetErrorCodes" expires_after="2025-05-18">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
     The network error code of the session creation for preconnect to
-    GoogleSearch using Quic. This is recorded everytime a preconnect is
-    attempted to GoogleSearch, after preconnect attempt is finished.
+    GoogleSearch using Quic for {JobType} job type. This is recorded everytime a
+    preconnect is attempted to GoogleSearch, after preconnect attempt is
+    finished.
   </summary>
+  <token key="JobType">
+    <variant name="" summary="any"/>
+    <variant name=".PreconnectDnsAlpnH3Job" summary="PRECONNECT_DNS_ALPN_H3"/>
+    <variant name=".PreconnectJob" summary="PRECONNECT"/>
+  </token>
 </histogram>
 
 <histogram name="Net.SharedDictionaryManagerOnDisk.DictionarySizeKB" units="KB"
@@ -5641,7 +5674,7 @@
 </histogram>
 
 <histogram name="Net.Socket.SkipCompletionPortOnSuccessOutcome"
-    enum="SkipCompletionPortOnSuccessOutcome" expires_after="2025-04-13">
+    enum="SkipCompletionPortOnSuccessOutcome" expires_after="2025-07-13">
   <owner>fdoray@chromium.org</owner>
   <owner>ricea@chromium.org</owner>
   <summary>
@@ -6004,7 +6037,7 @@
 </histogram>
 
 <histogram name="Net.SSLHandshakeEarlyDataReason"
-    enum="SSLHandshakeEarlyDataReason" expires_after="2025-05-11">
+    enum="SSLHandshakeEarlyDataReason" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -6019,7 +6052,7 @@
 </histogram>
 
 <histogram name="Net.SSLHandshakeEarlyDataReason.Google"
-    enum="SSLHandshakeEarlyDataReason" expires_after="2025-05-11">
+    enum="SSLHandshakeEarlyDataReason" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -6046,7 +6079,7 @@
 </histogram>
 
 <histogram name="Net.SSLNegotiatedAlpnProtocol"
-    enum="SSLNegotiatedAlpnProtocol" expires_after="2025-05-11">
+    enum="SSLNegotiatedAlpnProtocol" expires_after="2025-07-13">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -6114,7 +6147,7 @@
 </histogram>
 
 <histogram name="Net.TcpConnectAttempt.Latency.Success" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -6214,7 +6247,7 @@
 </histogram>
 
 <histogram base="true" name="Net.TrustTokens.RequestHelperFactoryOutcome"
-    enum="TrustTokenRequestHelperFactoryOutcome" expires_after="2025-05-11">
+    enum="TrustTokenRequestHelperFactoryOutcome" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="TrustTokenOperationType" -->
 
   <owner>svaldez@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 317c22e..a839d5f 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -2037,7 +2037,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.ARC.WiFi.{Protocol}.ActiveCount"
-    units="packets" expires_after="2025-05-11">
+    units="packets" expires_after="2025-07-13">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2053,7 +2053,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.ARC.WiFi.{Protocol}.InactiveCount"
-    units="packets" expires_after="2025-05-11">
+    units="packets" expires_after="2025-07-13">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2205,7 +2205,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.Dbus" enum="NetworkPatchpanelDbusEvent"
-    expires_after="2025-02-20">
+    expires_after="2025-12-31">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2229,7 +2229,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.Tethering.DHCPServer"
-    enum="NetworkPatchpanelDHCPServerEvent" expires_after="2025-05-11">
+    enum="NetworkPatchpanelDHCPServerEvent" expires_after="2025-07-13">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2380,7 +2380,7 @@
 
 <histogram name="Network.Shill.Cellular.3GPPRegistrationDelayedDrop"
     enum="NetworkCellular3GPPRegistrationDelayedDrop"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2455,7 +2455,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.Drop" enum="NetworkCellularTechnology"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2519,7 +2519,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.SignalStrengthBeforeDrop" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2579,7 +2579,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToInitialize" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2599,7 +2599,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToPortal" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3109,7 +3109,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.OpenVPNCipher" enum="VPNOpenVPNCipher"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>taoyl@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3129,7 +3129,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.ServicesNumber" units="units"
-    expires_after="2025-02-20">
+    expires_after="2025-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3200,7 +3200,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.ConnectFailureReason"
-    enum="VPNConnectFailureReason" expires_after="2025-04-27">
+    enum="VPNConnectFailureReason" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3212,7 +3212,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.ConnectionLostReason"
-    enum="VPNConnectionLostReason" expires_after="2025-04-27">
+    enum="VPNConnectionLostReason" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3225,7 +3225,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.EspEncryptionAlgorithm"
-    enum="VPNIPsecEncryptionAlgorithm" expires_after="2025-04-27">
+    enum="VPNIPsecEncryptionAlgorithm" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3238,7 +3238,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.EspIntegrityAlgorithm"
-    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2025-04-27">
+    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3251,7 +3251,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeDHGroup" enum="VPNIPsecDHGroup"
-    expires_after="2025-04-27">
+    expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3264,7 +3264,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeEncryptionAlgorithm"
-    enum="VPNIPsecEncryptionAlgorithm" expires_after="2025-04-27">
+    enum="VPNIPsecEncryptionAlgorithm" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3277,7 +3277,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeIntegrityAlgorithm"
-    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2025-04-27">
+    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3302,7 +3302,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IPv4ExcludedRoutesLargestPrefix"
-    units="units" expires_after="2025-05-11">
+    units="units" expires_after="2025-07-13">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3370,7 +3370,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IPv6ExcludedRoutesLargestPrefix"
-    units="units" expires_after="2025-02-20">
+    units="units" expires_after="2025-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3521,7 +3521,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.TimeReconnectToIdleMillis"
-    units="ms" expires_after="2025-02-20">
+    units="ms" expires_after="2025-12-31">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
index b8ef9f8..ee1a7d4 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="NewTabPage.ActionAndroid2" enum="NewTabPageActionAndroid2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>twellington@chromium.org</owner>
   <owner>finkm@chromium.org</owner>
   <summary>
@@ -47,7 +47,7 @@
 </histogram>
 
 <histogram name="NewTabPage.AsHomeSurface" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -58,7 +58,7 @@
 </histogram>
 
 <histogram name="NewTabPage.AsHomeSurface.ShownAtStartup" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -69,7 +69,7 @@
 </histogram>
 
 <histogram name="NewTabPage.BackgroundImageSource"
-    enum="NTPBackgroundImageSource" expires_after="2025-05-11">
+    enum="NTPBackgroundImageSource" expires_after="2025-07-13">
   <owner>danpeng@google.com</owner>
   <owner>pauladedeji@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -80,7 +80,7 @@
 </histogram>
 
 <histogram name="NewTabPage.BackgroundService.Collections.RequestLatency"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>pauladedeji@google.com</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -180,7 +180,7 @@
 </histogram>
 
 <histogram name="NewTabPage.ConcretePage" enum="NewTabPageConcretePage"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -191,7 +191,7 @@
 </histogram>
 
 <histogram name="NewTabPage.ContentSuggestions.ArticlesListVisible"
-    enum="BooleanVisible" expires_after="2025-05-11">
+    enum="BooleanVisible" expires_after="2025-07-13">
   <owner>freedjm@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -253,7 +253,7 @@
 </histogram>
 
 <histogram name="NewTabPage.CustomizeChromeOpened"
-    enum="NTPCustomizeChromeEntryPoint" expires_after="2025-05-11">
+    enum="NTPCustomizeChromeEntryPoint" expires_after="2025-07-13">
   <owner>pauladedeji@google.com</owner>
   <owner>danpeng@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -291,7 +291,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Customized" enum="NTPCustomizedFeatures"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -302,7 +302,7 @@
 </histogram>
 
 <histogram name="NewTabPage.CustomizedShortcuts"
-    enum="NTPCustomizedShortcutSettings" expires_after="2025-05-11">
+    enum="NTPCustomizedShortcutSettings" expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -448,7 +448,7 @@
   </summary>
 </histogram>
 
-<histogram name="NewTabPage.Height" units="pixels" expires_after="2025-05-11">
+<histogram name="NewTabPage.Height" units="pixels" expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -461,7 +461,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Images.ShownTime{ImageType}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>danpeng@google.com</owner>
   <owner>pauladedeji@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -525,7 +525,7 @@
   </summary>
 </histogram>
 
-<histogram name="NewTabPage.LoadTime" units="ms" expires_after="2025-05-11">
+<histogram name="NewTabPage.LoadTime" units="ms" expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -693,7 +693,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.Dismissed" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -706,7 +706,7 @@
 </histogram>
 
 <histogram base="true" name="NewTabPage.Modules.EnabledOnNTPLoad"
-    enum="BooleanEnabled" expires_after="2025-05-11">
+    enum="BooleanEnabled" expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -758,7 +758,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.Impression" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -828,7 +828,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.Loaded" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>yyushkina@chromium.org</owner>
@@ -884,7 +884,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.ShownTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -895,7 +895,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.Usage" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1266,7 +1266,7 @@
 </histogram>
 
 <histogram name="NewTabPage.SuggestTiles.DeletedTileType"
-    enum="SuggestTileType" expires_after="2025-05-11">
+    enum="SuggestTileType" expires_after="2025-07-13">
   <owner>ender@google.com</owner>
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -1281,7 +1281,7 @@
 </histogram>
 
 <histogram name="NewTabPage.SuggestTiles.SelectedTileType"
-    enum="SuggestTileType" expires_after="2025-05-11">
+    enum="SuggestTileType" expires_after="2025-07-13">
   <owner>ender@google.com</owner>
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -1296,7 +1296,7 @@
 </histogram>
 
 <histogram name="NewTabPage.TabResumption.ClickIndex" units="index"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mfacey@google.com</owner>
   <owner>romanarora@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1341,7 +1341,7 @@
 </histogram>
 
 <histogram name="NewTabPage.TabResumption.TimeElapsedSinceLastVisit" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mfacey@google.com</owner>
   <owner>romanarora@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1461,7 +1461,7 @@
   </summary>
 </histogram>
 
-<histogram name="NewTabPage.TimeSpent" units="ms" expires_after="2025-05-11">
+<histogram name="NewTabPage.TimeSpent" units="ms" expires_after="2025-07-13">
   <owner>freedjm@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
@@ -1549,7 +1549,7 @@
 
 <histogram
     name="NewTabPage.WallpaperSearch.SetInspirationThemeProcessingLatency"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>pauladedeji@google.com</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>rtatum@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/notifications/histograms.xml b/tools/metrics/histograms/metadata/notifications/histograms.xml
index 1eaca597..9851a3d 100644
--- a/tools/metrics/histograms/metadata/notifications/histograms.xml
+++ b/tools/metrics/histograms/metadata/notifications/histograms.xml
@@ -709,7 +709,7 @@
 <histogram
     name="Notifications.NotificationHelper.NotificationActivatorPrimaryStatus"
     enum="NotificationHelperNotificationActivatorPrimaryStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -903,7 +903,7 @@
 </histogram>
 
 <histogram name="Notifications.PersistentNotificationActionCount"
-    units="buttons" expires_after="2025-05-11">
+    units="buttons" expires_after="2025-07-13">
   <owner>peter@chromium.org</owner>
   <summary>
     The number of action buttons the developer provided for a persistent Web
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index e97f5510..bf53d1c 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -122,7 +122,7 @@
 </variants>
 
 <histogram name="Omnibox.AcceptedKeywordSuggestion"
-    enum="OmniboxEnteredKeywordMode2" expires_after="2025-05-11">
+    enum="OmniboxEnteredKeywordMode2" expires_after="2025-07-13">
   <owner>yoangela@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -237,7 +237,7 @@
 </histogram>
 
 <histogram name="Omnibox.AnswerParseSuccess" enum="BooleanSuccess"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -247,7 +247,7 @@
 </histogram>
 
 <histogram name="Omnibox.AnswerParseType" enum="SuggestionAnswerType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -263,7 +263,7 @@
 
 <histogram
     name="Omnibox.AsyncAutocompletionTime2.Provider.{Provider}{Completed}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -326,7 +326,7 @@
 </histogram>
 
 <histogram name="Omnibox.AsyncAutocompletionTime2.{Change}{Completed}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -408,7 +408,7 @@
 </histogram>
 
 <histogram name="Omnibox.AutocompletionTime.UpdateResult{Slice}"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -465,7 +465,7 @@
 </histogram>
 
 <histogram name="Omnibox.CalculateVisibleHint.Duration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>peilinwang@google.com</owner>
   <owner>woa-performance-bugs+jank@google.com</owner>
   <summary>
@@ -475,7 +475,7 @@
 </histogram>
 
 <histogram name="Omnibox.CharTypedToRepaintLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
@@ -508,7 +508,7 @@
 </histogram>
 
 <histogram name="Omnibox.CharTypedToRepaintLatency.InsertToPresent" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
@@ -557,7 +557,7 @@
 </histogram>
 
 <histogram name="Omnibox.CharTypedToRepaintLatency.ToPaint" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
@@ -682,7 +682,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.HttpResponseCode"
-    enum="HttpResponseCode" expires_after="2025-05-11">
+    enum="HttpResponseCode" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -714,7 +714,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.ProviderAllowed"
-    enum="DocumentProviderAllowedReason" expires_after="2025-05-11">
+    enum="DocumentProviderAllowedReason" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -735,7 +735,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.Requests"
-    enum="DocumentSuggestRequestEvent" expires_after="2025-05-11">
+    enum="DocumentSuggestRequestEvent" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -745,7 +745,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.RequestTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -761,7 +761,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.RequestTime.Interrupted" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -780,7 +780,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.RequestTime.NotInterrupted" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -799,7 +799,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.ResultCount" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
@@ -811,7 +811,7 @@
 </histogram>
 
 <histogram name="Omnibox.DocumentSuggest.TotalTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -860,7 +860,7 @@
 </histogram>
 
 <histogram name="Omnibox.EnteredKeywordMode2" enum="OmniboxEnteredKeywordMode2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -926,7 +926,7 @@
 </histogram>
 
 <histogram name="Omnibox.FocusToOpenTimeAnyPopupState3" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1096,7 +1096,7 @@
 </histogram>
 
 <histogram name="Omnibox.KeywordModeUsageByEngineType.{Usage}"
-    enum="OmniboxBuiltinEngineType" expires_after="2025-05-11">
+    enum="OmniboxBuiltinEngineType" expires_after="2025-07-13">
   <owner>yoangela@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -1143,7 +1143,7 @@
 </histogram>
 
 <histogram name="Omnibox.LocalHistoryPrefixSuggest.SearchTermsExtractionTimeV2"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -1191,7 +1191,7 @@
 
 <histogram
     name="Omnibox.MatchStability2.MatchChangeInAnyPosition{OmniboxAutocompleteUpdateSlice}"
-    enum="BooleanChanged" expires_after="2025-05-11">
+    enum="BooleanChanged" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -1238,7 +1238,7 @@
 
 <histogram
     name="Omnibox.MatchStability2.MatchChangeIndex{OmniboxAutocompleteUpdateSlice}"
-    units="position" expires_after="2025-05-11">
+    units="position" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
@@ -1343,7 +1343,7 @@
   </summary>
 </histogram>
 
-<histogram name="Omnibox.PaintTime" units="ms" expires_after="2025-05-11">
+<histogram name="Omnibox.PaintTime" units="ms" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
@@ -1364,7 +1364,7 @@
 </histogram>
 
 <histogram name="Omnibox.PedalShown" enum="SuggestionPedalType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>orinj@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1385,7 +1385,7 @@
 </histogram>
 
 <histogram name="Omnibox.ProviderTime2.{OmniboxProvider}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1396,7 +1396,7 @@
   <token key="OmniboxProvider" variants="OmniboxProviders"/>
 </histogram>
 
-<histogram name="Omnibox.QueryTime2" units="ms" expires_after="2025-05-11">
+<histogram name="Omnibox.QueryTime2" units="ms" expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1443,7 +1443,7 @@
 </histogram>
 
 <histogram name="Omnibox.RichAutocompletion.Triggered"
-    enum="OmniboxRichAutocompletionType" expires_after="2025-05-11">
+    enum="OmniboxRichAutocompletionType" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1474,7 +1474,7 @@
 </histogram>
 
 <histogram name="Omnibox.RichAutocompletion.Triggered.Any" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1623,7 +1623,7 @@
 </histogram>
 
 <histogram name="Omnibox.SearchPreload.ForwardingResult.NotServedToPrerender"
-    enum="SearchPreloadForwardingResult" expires_after="2025-05-11">
+    enum="SearchPreloadForwardingResult" expires_after="2025-07-13">
   <owner>lingqi@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
@@ -1637,7 +1637,7 @@
 </histogram>
 
 <histogram name="Omnibox.SearchPreload.ForwardingResult.WasServedToPrerender"
-    enum="SearchPreloadForwardingResult" expires_after="2025-05-11">
+    enum="SearchPreloadForwardingResult" expires_after="2025-07-13">
   <owner>lingqi@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
@@ -1650,7 +1650,7 @@
 </histogram>
 
 <histogram name="Omnibox.SearchPreload.ResponseDataReaderFinalStatus.Prerender"
-    enum="SearchPrefetchResponseDataReaderStatus" expires_after="2025-05-11">
+    enum="SearchPrefetchResponseDataReaderStatus" expires_after="2025-07-13">
   <owner>lingqi@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
@@ -1715,7 +1715,7 @@
 </histogram>
 
 <histogram name="Omnibox.Start.WantAsyncMatches" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <summary>
     Whether asynchronous matches are requested. Recorded every time
@@ -1765,7 +1765,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.OfferedTabMatch" enum="BooleanOffered"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gangwu@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
@@ -1788,7 +1788,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.Pedal" enum="SuggestionPedalType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>orinj@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1881,7 +1881,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.ResumeJourneyCTR"
-    enum="BooleanSelected" expires_after="2025-05-11">
+    enum="BooleanSelected" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <summary>
@@ -1902,7 +1902,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.RichAutocompletion"
-    enum="OmniboxRichAutocompletionType" expires_after="2025-05-11">
+    enum="OmniboxRichAutocompletionType" expires_after="2025-07-13">
   <owner>manukh@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1925,7 +1925,7 @@
 
 <histogram
     name="Omnibox.SuggestionUsed.Search.Experimental.NavigationToFirstMeaningfulPaint"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1936,7 +1936,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.Search.InputToNavigationStart2"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>spelchat@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1949,7 +1949,7 @@
 
 <histogram
     name="Omnibox.SuggestionUsed.Search.NavigationToFirstContentfulPaint"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -1990,7 +1990,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.SelectedTabMatch"
-    enum="BooleanSelected" expires_after="2025-05-11">
+    enum="BooleanSelected" expires_after="2025-07-13">
   <owner>gangwu@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
@@ -2031,7 +2031,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.URL.InputToNavigationStart2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>spelchat@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -2066,7 +2066,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestRequest.Failure.GoogleResponseTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>cch@chromium.org</owner>
@@ -2078,7 +2078,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestRequest.Success.GoogleResponseTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>cch@chromium.org</owner>
@@ -2515,7 +2515,7 @@
 </histogram>
 
 <histogram name="Omnibox.Views.PopupFirstPaint" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tluk@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -2609,7 +2609,7 @@
 </histogram>
 
 <histogram name="Omnibox.ZeroSuggestProvider.Eligibility"
-    enum="ZeroSuggestEligibility" expires_after="2025-05-11">
+    enum="ZeroSuggestEligibility" expires_after="2025-07-13">
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -2623,7 +2623,7 @@
 </histogram>
 
 <histogram name="Omnibox.ZeroSuggestProvider.{ResultType}.{RequestType}"
-    enum="ZeroSuggestRequestEvent" expires_after="2025-05-11">
+    enum="ZeroSuggestRequestEvent" expires_after="2025-07-13">
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -2710,7 +2710,7 @@
 
 <histogram
     name="Omnibox.{SearchPrefetch}.NavigationInterceptedToForwardingComplete"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>spelchat@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -2729,7 +2729,7 @@
 
 <histogram
     name="Omnibox.{SearchPrefetch}.PrefetchEligibilityReason2.{NavigationOrSuggestionPrefetch}"
-    enum="SearchPrefetchEligibilityReason" expires_after="2025-05-11">
+    enum="SearchPrefetchEligibilityReason" expires_after="2025-07-13">
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -2748,7 +2748,7 @@
 
 <histogram
     name="Omnibox.{SearchPrefetch}.PrefetchFinalStatus.{NavigationOrSuggestionPrefetch}"
-    enum="SearchPrefetchStatus" expires_after="2025-05-11">
+    enum="SearchPrefetchStatus" expires_after="2025-07-13">
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -2766,7 +2766,7 @@
 
 <histogram
     name="Omnibox.{SearchPrefetch}.PrefetchServingReason2{PrerenderOrNavigation}"
-    enum="SearchPrefetchServingReason" expires_after="2025-05-11">
+    enum="SearchPrefetchServingReason" expires_after="2025-07-13">
   <owner>ryansturm@chromium.org</owner>
   <owner>lingqi@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -2790,7 +2790,7 @@
 
 <histogram
     name="Omnibox.{SearchPrefetch}.ReceivedServableResponse2.{FallbackOrInitial}.{NavigationOrSuggestionPrefetch}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <owner>chrome-prerendering@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml
index f4ca5b9..68ecce5a 100644
--- a/tools/metrics/histograms/metadata/oobe/histograms.xml
+++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -988,7 +988,7 @@
 </histogram>
 
 <histogram name="OOBE.NetworkErrorShown.{OOBEScreenShownBeforeNetworkError}"
-    enum="NetworkErrorType" expires_after="2025-05-11">
+    enum="NetworkErrorType" expires_after="2025-07-13">
   <owner>achuith@google.com</owner>
   <owner>cros-oobe@google.com</owner>
   <summary>
@@ -1082,7 +1082,7 @@
 </histogram>
 
 <histogram name="OOBE.PerksDiscoveryScreen.ErrorReason"
-    enum="PerksDiscoveryErrorReason" expires_after="2025-05-11">
+    enum="PerksDiscoveryErrorReason" expires_after="2025-07-13">
   <owner>bchikhaoui@google.com</owner>
   <owner>bohdanty@google.com</owner>
   <owner>cros-oobe@google.com</owner>
@@ -1094,7 +1094,7 @@
 </histogram>
 
 <histogram name="OOBE.PerksDiscoveryScreen.Selected.{PerksID}" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bchikhaoui@google.com</owner>
   <owner>bohdanty@google.com</owner>
   <owner>cros-oobe@google.com</owner>
@@ -1106,7 +1106,7 @@
 </histogram>
 
 <histogram name="OOBE.PerksDiscoveryScreen.SelectedPerksCount" units="perks"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bchikhaoui@google.com</owner>
   <owner>bohdanty@google.com</owner>
   <owner>cros-oobe@google.com</owner>
@@ -1307,7 +1307,7 @@
 
 <histogram
     name="OOBE.StepCompletionTimeByExitReason.{OOBEScreenName_ExitReason}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>Time spent on specific OOBE screen grouped by exit reason.</summary>
@@ -1451,7 +1451,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.SyncEnabled" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -1489,7 +1489,7 @@
 </histogram>
 
 <histogram name="OOBE.UpdateScreen.StageTime.{UpdateStage}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index 9dcdc58..f154cb8 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -40,6 +40,7 @@
   <variant name="HistorySearch" summary="History Search"/>
   <variant name="PasswordChangeSubmission"
       summary="Password Change Submission"/>
+  <variant name="PermissionsAi" summary="Permissions AI"/>
   <variant name="PromptApi" summary="Prompt API"/>
   <variant name="ScamDetection" summary="Scam Detection"/>
   <variant name="Summarize" summary="Summarize"/>
@@ -69,10 +70,12 @@
       summary="Model Execution Feature: History Query Intent"/>
   <variant name="ModelExecutionFeatureHistorySearch"
       summary="Model Execution Feature: History Search"/>
+  <variant name="ModelExecutionFeaturePermissionsAi"
+      summary="Model Execution Feature: Permissions AI"/>
   <variant name="ModelExecutionFeaturePromptAPI"
       summary="Model Execution Feature: Prompt API"/>
   <variant name="ModelExecutionFeatureScamDetection"
-      summary="Model ExecutionFeature: Scam Detection"/>
+      summary="Model Execution Feature: Scam Detection"/>
   <variant name="ModelExecutionFeatureSummarize"
       summary="Model Execution Feature: Summarize"/>
   <variant name="ModelValidation" summary="Model validation triggered via CLI"/>
@@ -568,7 +571,7 @@
 
 <histogram
     name="OptimizationGuide.HintsFetcher.GetHintsRequest.UrlCount.{RequestContext}"
-    units="total url count" expires_after="2025-05-11">
+    units="total url count" expires_after="2025-07-13">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/enums.xml b/tools/metrics/histograms/metadata/others/enums.xml
index 7090b5a..d25a9918 100644
--- a/tools/metrics/histograms/metadata/others/enums.xml
+++ b/tools/metrics/histograms/metadata/others/enums.xml
@@ -97,6 +97,8 @@
   <int value="4" label="InvalidSignalFormat"/>
   <int value="5" label="InvalidVariantFormat"/>
   <int value="6" label="NoResponse"/>
+  <int value="7" label="PromptDismissed"/>
+  <int value="8" label="PromptFailedSignalConnection"/>
 </enum>
 
 <enum name="FreedesktopSecretKeyProviderInitStatus">
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index ddd5db7..f72adea 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -290,7 +290,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Session.FreezeCount" units="instances"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -301,7 +301,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Session.FreezeDuration" units="ms"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -359,7 +359,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Ui.AccessCodeInputTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -395,7 +395,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Ui.DialogCloseReason"
-    enum="AccessCodeCastDialogCloseReason" expires_after="2025-05-11">
+    enum="AccessCodeCastDialogCloseReason" expires_after="2025-07-13">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -405,7 +405,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Ui.DialogLoadTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -416,7 +416,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Ui.DialogOpenLocation"
-    enum="AccessCodeCastDialogOpenLocation" expires_after="2025-05-04">
+    enum="AccessCodeCastDialogOpenLocation" expires_after="2025-07-13">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -528,7 +528,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.AdditionalBids.DecodeLatency"
-    units="ms" expires_after="2025-03-02">
+    units="ms" expires_after="2025-07-13">
   <owner>orrb@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -543,7 +543,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.AdditionalBids.HeaderReceived"
-    enum="AdditionalBidHeaderType" expires_after="2025-03-02">
+    enum="AdditionalBidHeaderType" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -557,7 +557,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.AdditionalBids.Result"
-    enum="AdditionalBidResult" expires_after="2025-03-02">
+    enum="AdditionalBidResult" expires_after="2025-07-13">
   <owner>orrb@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -846,7 +846,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.IdleProcessExpired" enum="Boolean"
-    expires_after="2025-05-13">
+    expires_after="2025-07-13">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -916,7 +916,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NonPremadeContextsCreated"
-    units="contexts" expires_after="2025-05-10">
+    units="contexts" expires_after="2025-07-13">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1180,7 +1180,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.PremadeContextsScheduledPerThread"
-    units="contexts" expires_after="2025-05-10">
+    units="contexts" expires_after="2025-07-13">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1346,7 +1346,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.TrustedBidderSignalsOriginRelation"
-    enum="BidderSignalsOriginRelation" expires_after="2025-05-10">
+    enum="BidderSignalsOriginRelation" expires_after="2025-07-13">
   <owner>morlovich@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1394,7 +1394,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.TrustedSellerSignalsOriginRelation"
-    enum="SellerSignalsOriginRelation" expires_after="2025-05-10">
+    enum="SellerSignalsOriginRelation" expires_after="2025-07-13">
   <owner>morlovich@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1407,7 +1407,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.UnusedPremadeContexts"
-    units="contexts" expires_after="2025-05-10">
+    units="contexts" expires_after="2025-07-13">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1423,7 +1423,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.UsedPremadeContext" enum="Boolean"
-    expires_after="2025-05-10">
+    expires_after="2025-07-13">
   <owner>abigailkatcoff@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -1507,7 +1507,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.BaDataSize2" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -1521,7 +1521,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.EnumNaming.{When}.{Type}"
-    enum="BooleanDeprecatedJSEnumName" expires_after="2025-05-11">
+    enum="BooleanDeprecatedJSEnumName" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -2080,7 +2080,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.ServerAuction.PrevWinsArraySize"
-    units="bytes" expires_after="2025-05-11">
+    units="bytes" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -2174,7 +2174,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Update.AuctionExecutionMode"
-    enum="InterestGroupAdAuctionExecutionMode" expires_after="2025-05-11">
+    enum="InterestGroupAdAuctionExecutionMode" expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -2846,7 +2846,7 @@
 </histogram>
 
 <histogram name="BrotliFilter.CompressionPercent" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>eustas@chromium.org</owner>
   <summary>Compressed/Decompressed size ratio.</summary>
 </histogram>
@@ -3176,7 +3176,7 @@
 </histogram>
 
 <histogram name="ContextMenu.LensSupportStatus" enum="LensSupportStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>benwgold@google.com</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
@@ -3186,30 +3186,8 @@
   </summary>
 </histogram>
 
-<histogram name="ContextMenu.SelectedOptionAndroid{Type}"
-    enum="ContextMenuOptionAndroid" expires_after="never">
-<!-- expires-never: part of top-line metric (internal: go/chrome-browser-nsm) -->
-
-  <owner>avi@chromium.org</owner>
-  <owner>mpearson@chromium.org</owner>
-  <owner>chrome-analysis-team@google.com</owner>
-  <summary>
-    {Type}
-
-    The option that the user selected from a context menu on Android. This is
-    logged on Android only; check out ContextMenu.SelectedOptionIOS for iOS, and
-    ContextMenu.SelectedOptionDesktop for desktop. Note that if a menu is
-    invoked on mixed content, only one of the submetrics receives the log; read
-    the code to determine which one.
-
-    This histogram is of special interest to the chrome-analysis-team@. Do not
-    change its semantics or retire it without talking to them first.
-  </summary>
-  <token key="Type" variants="ContextMenuAndroidTypes"/>
-</histogram>
-
 <histogram base="true" name="ContextMenu.SelectedOptionDesktop"
-    enum="ContextMenuOptionDesktop" expires_after="2025-05-11">
+    enum="ContextMenuOptionDesktop" expires_after="2025-07-13">
   <owner>avi@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <summary>
@@ -3439,7 +3417,7 @@
 </histogram>
 
 <histogram name="DefaultBrowser.AppMenu.DefaultChipShown" enum="BooleanShown"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>agale@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3463,7 +3441,7 @@
 </histogram>
 
 <histogram name="DefaultBrowser.AppMenu.TimeToSetDefault" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>agale@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3473,7 +3451,7 @@
 </histogram>
 
 <histogram name="DefaultBrowser.InfoBar.TimesShownBeforeAccept" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>agale@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3483,7 +3461,7 @@
 </histogram>
 
 <histogram name="DefaultBrowser.InfoBar.UserInteraction"
-    enum="DefaultBrowserInfoBarUserInteraction" expires_after="2025-05-11">
+    enum="DefaultBrowserInfoBarUserInteraction" expires_after="2025-07-13">
   <owner>pmonette@chromium.org</owner>
   <owner>robliao@chromium.org</owner>
   <summary>
@@ -3524,7 +3502,7 @@
 </histogram>
 
 <histogram name="DemoMode.ActiveApp" enum="DemoModeApp"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3535,7 +3513,7 @@
 </histogram>
 
 <histogram name="DemoMode.AppLaunched" enum="DemoModeApp"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3547,7 +3525,7 @@
 </histogram>
 
 <histogram name="DemoMode.AppLaunchSource" enum="DemoModeAppLaunchSource"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>wanghaifan@google.com</owner>
@@ -3559,7 +3537,7 @@
 </histogram>
 
 <histogram name="DemoMode.AttractLoop.Timestamp" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@google.com</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3569,7 +3547,7 @@
   </summary>
 </histogram>
 
-<histogram name="DemoMode.DwellTime" units="seconds" expires_after="2025-05-11">
+<histogram name="DemoMode.DwellTime" units="seconds" expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3649,7 +3627,7 @@
 </histogram>
 
 <histogram name="DemoMode.IdleLogoutWarningEvent"
-    enum="DemoModeIdleLogoutWarningEvent" expires_after="2025-05-11">
+    enum="DemoModeIdleLogoutWarningEvent" expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3691,7 +3669,7 @@
 </histogram>
 
 <histogram name="DemoMode.SessionLength" units="minutes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3794,7 +3772,7 @@
 </histogram>
 
 <histogram name="DemoMode.UniqueAppsLaunched" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3805,7 +3783,7 @@
 </histogram>
 
 <histogram name="DemoMode.UserClicksAndPresses" units="clicks"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>cros-demo-mode-eng@google.com</owner>
@@ -3890,7 +3868,7 @@
 </histogram>
 
 <histogram name="DisplayManager.MirroringImplementation"
-    enum="DisplayMirroringImplementation" expires_after="2025-05-11">
+    enum="DisplayMirroringImplementation" expires_after="2025-07-13">
   <owner>jshargo@chromium.org</owner>
   <owner>oshima@chromium.org</owner>
   <owner>chromeos-gfx-compositor@google.com</owner>
@@ -4751,7 +4729,7 @@
 
 <histogram name="Feedback.HappinessTrackingSurvey.ShouldShowSurveyReason"
     enum="HappinessTrackingSurveyShouldShowSurveyReasons"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sauski@google.com</owner>
   <owner>msramek@chromium.org</owner>
   <summary>
@@ -4806,7 +4784,7 @@
 </histogram>
 
 <histogram name="Feedback.RedactionTool.CreditCardMatch"
-    enum="CreditCardDetection" expires_after="2025-05-11">
+    enum="CreditCardDetection" expires_after="2025-07-13">
   <owner>cschlosser@chromium.org</owner>
   <owner>dpchromeos-core-eng@google.com</owner>
   <summary>
@@ -4865,7 +4843,7 @@
 </histogram>
 
 <histogram name="Feedback.RequestSource" enum="FeedbackSource"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>afakhry@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>Records the source that requested showing the feedback app.</summary>
@@ -5573,7 +5551,7 @@
 </histogram>
 
 <histogram base="true" name="Hwsec.Attestation.Status"
-    enum="HwsecAttestationOpsStatus" expires_after="2025-05-11">
+    enum="HwsecAttestationOpsStatus" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="AttestationOps" -->
 
   <owner>chingkang@chromium.org</owner>
@@ -5670,7 +5648,7 @@
 </histogram>
 
 <histogram name="ImportantFile.SerializationDuration{ImportantFileClients}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>battre@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -5684,7 +5662,7 @@
 </histogram>
 
 <histogram name="ImportantFile.WriteDuration{ImportantFileClients}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wylieb@chromium.org</owner>
   <owner>chrome-collections@google.com</owner>
   <summary>
@@ -6045,7 +6023,7 @@
 </histogram>
 
 <histogram name="Manifest.HasProperty" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mgiuca@chromium.org</owner>
   <summary>
     Tracks which properties of a Manifest were present when it was parsed. If a
@@ -6139,7 +6117,7 @@
 </histogram>
 
 <histogram name="Mojo.Channel.WriteMessageLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>amistry@chromium.org</owner>
   <owner>bgeffon@chromium.org</owner>
   <owner>rockot@google.com</owner>
@@ -6338,7 +6316,7 @@
 </histogram>
 
 <histogram name="MPArch.ChildProcessLauncher.{Event}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ajgo@chromium.org</owner>
   <owner>src/sandbox/policy/win/OWNERS</owner>
   <summary>
@@ -6358,7 +6336,7 @@
 </histogram>
 
 <histogram name="MPArch.ChildProcessLaunchFirst" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>pasko@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -6377,7 +6355,7 @@
 </histogram>
 
 <histogram name="MultiProfile.UsersPerSessionIncremental" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>skuhne@chromium.org</owner>
   <owner>antrim@chromium.org</owner>
   <summary>
@@ -6517,7 +6495,7 @@
 </histogram>
 
 <histogram name="NQE.RTT.ObservationSource" enum="NQEObservationSource"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -6531,7 +6509,7 @@
 </histogram>
 
 <histogram name="NQE.RTT.OnECTComputation" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -6556,7 +6534,7 @@
 </histogram>
 
 <histogram name="OAuth2Login.SessionRestore" enum="GaiaSessionRestoreOutcome"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>emaamari@google.com</owner>
   <owner>sinhak@chromium.org</owner>
   <summary>Outcome of Chrome OS GAIA cookie session restore process.</summary>
@@ -6954,7 +6932,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AppBoundProvider.Decrypt.ResultCode" enum="Hresult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -6979,7 +6957,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AppBoundProvider.Encrypt.ResultCode" enum="Hresult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -7049,7 +7027,7 @@
 </histogram>
 
 <histogram name="OSCrypt.DPAPIProvider.Status" enum="OSCryptDPAPIKeyStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -7453,7 +7431,7 @@
 </histogram>
 
 <histogram name="PageImageService.Backend.OptimizationGuide.Result{ClientId}"
-    enum="PageImageServiceResult" expires_after="2025-05-11">
+    enum="PageImageServiceResult" expires_after="2025-07-13">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>1456757</component>
@@ -7596,7 +7574,7 @@
 </histogram>
 
 <histogram name="PLT.iOS.BrowserInitiatedPageLoadTime2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -7642,7 +7620,7 @@
 </histogram>
 
 <histogram name="PLT.iOS.RendererInitiatedPageLoadTime2" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>michaeldo@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -7790,7 +7768,7 @@
 </histogram>
 
 <histogram name="Process.Sandbox.StartSandboxedWin.{Event}Duration"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>ajgo@chromium.org</owner>
   <owner>src/sandbox/policy/win/OWNERS</owner>
   <summary>
@@ -7856,7 +7834,7 @@
 </histogram>
 
 <histogram name="PushMessaging.UnregistrationReason"
-    enum="PushUnregistrationReason" expires_after="2025-05-11">
+    enum="PushUnregistrationReason" expires_after="2025-07-13">
   <owner>peter@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
   <summary>
@@ -7939,7 +7917,7 @@
 </histogram>
 
 <histogram name="ReadingList.OfflineVersionDisplayed" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>Whether the displayed version is the offline one.</summary>
@@ -8135,7 +8113,7 @@
 </histogram>
 
 <histogram name="RenderTextHarfBuzz.GetFallbackFontsTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dayeung@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -8146,7 +8124,7 @@
 </histogram>
 
 <histogram name="RenderTextHarfBuzz.GetFallbackFontTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dayeung@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -8157,14 +8135,14 @@
 </histogram>
 
 <histogram name="RenderTextHarfBuzz.MissingGlyphCount" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dayeung@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>Count of missing glyphs at the end of text shaping.</summary>
 </histogram>
 
 <histogram name="RenderTextHarfBuzz.ShapeRunsFallback" enum="ShapeRunFallback"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dayeung@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -8174,7 +8152,7 @@
 </histogram>
 
 <histogram name="RenderTextHarfBuzz.ShapeRunsWithFallbackFontsTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dayeung@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -8197,7 +8175,7 @@
 </histogram>
 
 <histogram name="RenderViewContextMenu.Shown" enum="RenderViewContextMenuItem"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>avi@chromium.org</owner>
   <owner>edwardjung@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
@@ -8394,7 +8372,7 @@
   </token>
 </histogram>
 
-<histogram name="SB2.RemoteCall.Elapsed" units="ms" expires_after="2025-05-11">
+<histogram name="SB2.RemoteCall.Elapsed" units="ms" expires_after="2025-07-13">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -8676,7 +8654,7 @@
 </histogram>
 
 <histogram name="Shutdown.OtherExit.Time2" units="ms"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -8764,7 +8742,7 @@
 </histogram>
 
 <histogram name="SignedExchange.LoadResult2" enum="SignedExchangeLoadResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ksakamoto@chromium.org</owner>
   <owner>webpackage-dev@chromium.org</owner>
   <summary>
@@ -9147,7 +9125,7 @@
 </histogram>
 
 <histogram name="SpellCheck.SpellingService.RequestHttpResponseCode"
-    enum="HttpResponseCode" expires_after="2025-05-11">
+    enum="HttpResponseCode" expires_after="2025-07-13">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>The HTTP code of Spelling service responses.</summary>
@@ -9866,7 +9844,7 @@
 </histogram>
 
 <histogram name="Tracing.Background.FinalizationDisallowedReason"
-    enum="TracingFinalizationDisallowedReason" expires_after="2025-05-11">
+    enum="TracingFinalizationDisallowedReason" expires_after="2025-07-13">
   <owner>ssid@chromium.org</owner>
   <summary>
     Reason why background tracing finalization was not allowed. Also see
@@ -9922,7 +9900,7 @@
 </histogram>
 
 <histogram name="Tracing.Background.ScenarioState"
-    enum="BackgroundTracingState" expires_after="2025-05-11">
+    enum="BackgroundTracingState" expires_after="2025-07-13">
   <owner>oysteine@chromium.org</owner>
   <summary>
     Records state of the Background Tracing system, from when scenarios are
@@ -10110,7 +10088,7 @@
   </summary>
 </histogram>
 
-<histogram name="Uptime.Logout" units="ms" expires_after="2025-05-11">
+<histogram name="Uptime.Logout" units="ms" expires_after="2025-07-13">
   <owner>alemate@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <owner>xiyuan@chromium.org</owner>
@@ -10382,7 +10360,7 @@
 </histogram>
 
 <histogram name="WebDatabase.AutofillAccountStorage"
-    enum="WebDatabaseAutofillAccountStorageResult" expires_after="2025-04-12">
+    enum="WebDatabaseAutofillAccountStorageResult" expires_after="2025-07-13">
   <owner>mastiz@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -10412,7 +10390,7 @@
 </histogram>
 
 <histogram name="WebDatabase.FailedMigrationToVersion" units="version"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>battre@chromium.org</owner>
   <owner>asully@chromium.org</owner>
   <summary>
@@ -10422,7 +10400,7 @@
 </histogram>
 
 <histogram name="WebDatabase.InitResult" enum="WebDatabaseInitResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>battre@chromium.org</owner>
   <owner>asully@chromium.org</owner>
   <summary>
@@ -10441,7 +10419,7 @@
 </histogram>
 
 <histogram name="WebFont.BlankTextShownTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kenjibaheux@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
   <summary>
@@ -10477,7 +10455,7 @@
 </histogram>
 
 <histogram name="WebFont.DownloadTime.LoadError" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kenjibaheux@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
   <summary>
@@ -10487,7 +10465,7 @@
 </histogram>
 
 <histogram name="WebFont.HadBlankText" enum="BooleanHadBlankText"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kenjibaheux@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
   <summary>
@@ -10498,7 +10476,7 @@
 </histogram>
 
 <histogram name="WebFont.LocalFontUsed" enum="BooleanUsage"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@chromium.org</owner>
   <owner>kouhei@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 9419e97..84f34424 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -619,7 +619,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.AverageViewportAdDensity" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yaoxia@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
@@ -1020,7 +1020,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleHomepage.DomainLookupTiming.NavigationToDomainLookupStart.{NavigationCountType}{BrowserInitializationStatus}"
-    units="ms" expires_after="2025-02-01">
+    units="ms" expires_after="2025-06-08">
   <owner>suzukikeita@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1174,7 +1174,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.GoogleSearch.CSI.{Event}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1600,7 +1600,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.LCPP.Subresource.Count.Precision" units="%"
-    expires_after="2025-05-14">
+    expires_after="2025-07-13">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -1618,7 +1618,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.LCPP.Subresource.Count.Recall" units="%"
-    expires_after="2025-05-14">
+    expires_after="2025-07-13">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -1636,7 +1636,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.LCPP.Subresource.Count.SameSiteRatio"
-    units="%" expires_after="2025-05-14">
+    units="%" expires_after="2025-07-13">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -1652,7 +1652,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.LCPP.Subresource.Count.Type"
-    enum="RequestDestination" expires_after="2025-05-14">
+    enum="RequestDestination" expires_after="2025-07-13">
   <owner>yoichio@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -1679,7 +1679,7 @@
 
 <histogram
     name="PageLoad.Clients.MultiTabLoading{OtherLoadingCount}.{Timing}{Background}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>{Timing} {OtherLoadingCount} {Background}</summary>
@@ -1826,7 +1826,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.InteractiveTiming.FirstInputDelay4{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1839,7 +1839,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.LayoutInstability.CumulativeShiftScore.MainFrame{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1853,7 +1853,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.LayoutInstability.CumulativeShiftScore{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1880,7 +1880,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.NavigationToActivation{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1894,7 +1894,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.PaintTiming.ActivationToFirstContentfulPaint{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1909,7 +1909,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.PaintTiming.ActivationToFirstPaint{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1923,7 +1923,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.PaintTiming.ActivationToLargestContentfulPaint2{PreloadingTriggerType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -2104,7 +2104,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.TPCD.AdTPCAccess.BlockedByExperiment2"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>johnidel@chromium.org</owner>
   <owner>victortan@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
@@ -2118,7 +2118,7 @@
 
 <histogram
     name="PageLoad.Clients.TPCD.CookieAccess.ThirdPartyCookieAllowMechanism3"
-    enum="ThirdPartyCookieAllowMechanism" expires_after="2025-05-11">
+    enum="ThirdPartyCookieAllowMechanism" expires_after="2025-07-13">
   <owner>victortan@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -2133,7 +2133,7 @@
 
 <histogram
     name="PageLoad.Clients.TPCD.ThirdPartyCookieAccessBlockedByExperiment2"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>victortan@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -2165,7 +2165,7 @@
 
 <histogram
     name="PageLoad.Clients.TPCD.TPCAccess.BlockedByExperiment.IsAdOrNonAd2"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>johnidel@chromium.org</owner>
   <owner>victortan@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
@@ -2178,7 +2178,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.TPCD.TPCAccess.CookieReadStatus2"
-    enum="CookieReadStatus" expires_after="2025-05-11">
+    enum="CookieReadStatus" expires_after="2025-07-13">
   <owner>johnidel@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -2532,7 +2532,7 @@
 </histogram>
 
 <histogram name="PageLoad.Cpu.TotalUsageForegrounded" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alexmt@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
@@ -2565,7 +2565,7 @@
 </histogram>
 
 <histogram name="PageLoad.Experimental.ClickInputBurst" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dougarnett@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
@@ -2957,7 +2957,7 @@
 </histogram>
 
 <histogram name="PageLoad.Experimental.TotalForegroundDuration{PageVisitType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>npm@chromium.org</owner>
   <owner>toyoshim@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -3398,7 +3398,7 @@
 </histogram>
 
 <histogram name="PageLoad.Internal.PageLoadTimingStatus{Condition}"
-    enum="PageLoadTimingStatus" expires_after="2025-05-11">
+    enum="PageLoadTimingStatus" expires_after="2025-07-13">
   <owner>toyoshim@chromium.org</owner>
   <owner>src/components/page_load_metrics/OWNERS</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
@@ -3419,7 +3419,7 @@
 </histogram>
 
 <histogram name="PageLoad.Internal.PageType" enum="PageLoadTrackerPageType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>toyoshim@chromium.org</owner>
   <owner>mparch-dev@chromium.org</owner>
   <summary>
@@ -3468,7 +3468,7 @@
 
 <histogram
     name="PageLoad.Internal.Prerender2.ActivatedPageLoaderStatus{PreloadingTriggerType}"
-    enum="NetErrorCodes" expires_after="2025-05-11">
+    enum="NetErrorCodes" expires_after="2025-07-13">
   <owner>lingqi@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -3483,7 +3483,7 @@
 </histogram>
 
 <histogram
-    name="PageLoad.Internal.Prerender2.DomContentLoadedToActivation2{PreloadingTriggerType}"
+    name="PageLoad.Internal.Prerender2.DomContentLoadedToActivation3{PreloadingTriggerType}"
     units="ms" expires_after="2025-05-11">
   <owner>lingqi@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
@@ -3912,7 +3912,7 @@
 </histogram>
 
 <histogram name="PageLoad.PaintTiming.NavigationToFirstImagePaint" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -3982,7 +3982,7 @@
 </histogram>
 
 <histogram name="PageLoad.PaintTiming.NavigationToLargestContentfulPaint2"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -4057,7 +4057,7 @@
 
 <histogram
     name="PageLoad.PaintTiming.NavigationToLargestContentfulPaint2.MainFrame"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -4086,7 +4086,7 @@
 
 <histogram
     name="PageLoad.PaintTiming.NavigationToLargestContentfulPaint2.SetSpeculationRulesPrerender"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>yoichio@chromium.org</owner>
   <owner>loading-dev@chromium.org</owner>
   <summary>
@@ -4151,7 +4151,7 @@
 </histogram>
 
 <histogram name="PageLoad.PaintTiming.ParseStartToFirstContentfulPaint"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 91f73ddb..ef1a31e7 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -386,7 +386,7 @@
 </histogram>
 
 <histogram name="PasswordGeneration.GeneratedPasswordWasEdited"
-    enum="BooleanGeneratedPasswordWasEdited" expires_after="2025-05-11">
+    enum="BooleanGeneratedPasswordWasEdited" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -409,7 +409,7 @@
 </histogram>
 
 <histogram name="PasswordGeneration.iOS.AcceptedGeneratedPasswordSource"
-    enum="AcceptedGeneratedPasswordSourceType" expires_after="2025-05-11">
+    enum="AcceptedGeneratedPasswordSourceType" expires_after="2025-07-13">
   <owner>cloutierc@google.com</owner>
   <owner>vincb@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -466,7 +466,7 @@
 </histogram>
 
 <histogram name="PasswordGeneration.SubmissionEvent"
-    enum="PasswordSubmissionEvent" expires_after="2025-05-11">
+    enum="PasswordSubmissionEvent" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -527,7 +527,7 @@
 
 <histogram
     name="PasswordManager.AccountStorage.MoveToAccountStoreFlowAccepted2"
-    enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2025-05-11">
+    enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2025-07-13">
   <owner>treib@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -540,7 +540,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AccountStorage.MoveToAccountStoreFlowOffered"
-    enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2025-05-11">
+    enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2025-07-13">
   <owner>treib@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -552,7 +552,7 @@
 
 <histogram
     name="PasswordManager.AccountStorage.UnsyncedPasswordsFoundDuringSignOut"
-    units="passwords" expires_after="2025-05-11">
+    units="passwords" expires_after="2025-07-13">
   <owner>treib@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -564,7 +564,7 @@
 
 <histogram
     name="PasswordManager.AccountStorageUserStateDuration{UserSyncingType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>mamir@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -672,7 +672,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AddCredentialFromSettings.UserAction2"
-    enum="AddCredentialFromSettingsUserInteractions" expires_after="2025-05-11">
+    enum="AddCredentialFromSettingsUserInteractions" expires_after="2025-07-13">
   <owner>vidhanj@google.com</owner>
   <summary>
     Records the user actions performed when a new credential is added from
@@ -715,7 +715,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationDatabase.DatabaseSize" units="KB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -919,7 +919,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BiometricAuthBeforeFillingEnabled2"
-    enum="BooleanEnabled" expires_after="2025-05-11">
+    enum="BooleanEnabled" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1097,7 +1097,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.UserAction"
-    enum="PasswordCheckInteraction" expires_after="2025-05-11">
+    enum="PasswordCheckInteraction" expires_after="2025-07-13">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1267,7 +1267,7 @@
 </histogram>
 
 <histogram name="PasswordManager.CompromisedCredentials3.{Issue}"
-    units="credentials" expires_after="2025-05-11">
+    units="credentials" expires_after="2025-07-13">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1467,7 +1467,7 @@
 </histogram>
 
 <histogram name="PasswordManager.EnableState" enum="PasswordManagerEnableState"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>markusheintz@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -1479,7 +1479,7 @@
 
 <histogram
     name="PasswordManager.ErrorMessageDismissalReason.{ErrorMessageType}"
-    enum="MessageDismissReason" expires_after="2025-05-11">
+    enum="MessageDismissReason" expires_after="2025-07-13">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -1508,7 +1508,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ErrorMessageDisplayReason"
-    enum="PasswordStoreBackendErrorType" expires_after="2025-05-11">
+    enum="PasswordStoreBackendErrorType" expires_after="2025-07-13">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -1604,7 +1604,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillingAssistanceForSingleUsername"
-    enum="SingleUsernameFillingAssistance" expires_after="2025-05-11">
+    enum="SingleUsernameFillingAssistance" expires_after="2025-07-13">
   <owner>vincb@google.com</owner>
   <owner>eic@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -1632,7 +1632,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillingSource"
-    enum="PasswordManagerFillingSource" expires_after="2025-05-11">
+    enum="PasswordManagerFillingSource" expires_after="2025-07-13">
   <owner>mamir@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -1655,7 +1655,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillSuggestionsGroupedMatchAccepted"
-    enum="Boolean" expires_after="M137">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>atsvirchkova@google.com</owner>
   <owner>src/components/password_manager/OWNERS</owner>
   <summary>
@@ -1666,7 +1666,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillSuggestionsHasGroupedMatch" enum="Boolean"
-    expires_after="M137">
+    expires_after="2025-07-13">
   <owner>atsvirchkova@google.com</owner>
   <owner>src/components/password_manager/OWNERS</owner>
   <summary>
@@ -1782,7 +1782,7 @@
 </histogram>
 
 <histogram name="PasswordManager.Import.DesktopInteractions"
-    enum="PasswordsImportDesktopInteractions" expires_after="2025-05-11">
+    enum="PasswordsImportDesktopInteractions" expires_after="2025-07-13">
   <owner>natiahlyi@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -1866,7 +1866,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ImportDuration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>natiahlyi@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -1902,7 +1902,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ImportFileSize" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>natiahlyi@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -2014,7 +2014,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ItemSelected.OffTheRecord" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>arabm@chromium.org</owner>
   <owner>chrome-privacy-team@google.com</owner>
   <summary>
@@ -2034,7 +2034,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.AnalyzeSingleLeakResponseResult"
-    enum="PasswordAnalyzeLeakResponseResult" expires_after="2025-05-11">
+    enum="PasswordAnalyzeLeakResponseResult" expires_after="2025-07-13">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>Result of analyzing a single leak response.</summary>
@@ -2209,7 +2209,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LoginDatabaseInit2"
-    enum="LoginDatabaseInitError" expires_after="2025-05-11">
+    enum="LoginDatabaseInitError" expires_after="2025-07-13">
   <owner>vasilii@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -2360,7 +2360,7 @@
 
 <histogram
     name="PasswordManager.NewlySavedPasswordHasEmptyUsername.{PasswordType}"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>khamutov@google.com</owner>
   <owner>kazinova@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -2372,7 +2372,7 @@
 </histogram>
 
 <histogram name="PasswordManager.NonSyncPasswordHashChange"
-    enum="GaiaPasswordHashChange" expires_after="2025-05-11">
+    enum="GaiaPasswordHashChange" expires_after="2025-07-13">
   <owner>nwokedi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2394,7 +2394,7 @@
 </histogram>
 
 <histogram name="PasswordManager.OpenedAsShortcut" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -2495,7 +2495,7 @@
 
 <histogram
     name="PasswordManager.PasswordAccessLossWarningDialog{AccessLossWarningType}.UserAction"
-    enum="PasswordAccessLossWarningUserActions" expires_after="2025-05-11">
+    enum="PasswordAccessLossWarningUserActions" expires_after="2025-07-13">
   <owner>izuzic@google.com</owner>
   <owner>atsvirchkova@google.com</owner>
   <summary>
@@ -2520,7 +2520,7 @@
 
 <histogram
     name="PasswordManager.PasswordAccessLossWarningSheet.{AccessLossWarningType}.UserAction"
-    enum="PasswordAccessLossWarningUserActions" expires_after="2025-05-11">
+    enum="PasswordAccessLossWarningUserActions" expires_after="2025-07-13">
   <owner>izuzic@google.com</owner>
   <owner>atsvirchkova@google.com</owner>
   <summary>
@@ -2533,7 +2533,7 @@
 
 <histogram
     name="PasswordManager.PasswordAccessLossWarningSheet{AccessLossWarningType}Trigger"
-    enum="PasswordAccessLossWarningTriggers" expires_after="2025-05-11">
+    enum="PasswordAccessLossWarningTriggers" expires_after="2025-07-13">
   <owner>izuzic@google.com</owner>
   <owner>atsvirchkova@google.com</owner>
   <summary>
@@ -2545,7 +2545,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.Launch.Success"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>ioanap@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -2558,7 +2558,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.{Operation}.APIError"
-    enum="PasswordStoreAndroidBackendAPIError" expires_after="2025-05-11">
+    enum="PasswordStoreAndroidBackendAPIError" expires_after="2025-07-13">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -2600,7 +2600,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.{Operation}.Latency"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -2613,7 +2613,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.{Operation}.Success"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -2633,7 +2633,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordDropdownShown"
-    enum="PasswordDropdownState" expires_after="2025-05-11">
+    enum="PasswordDropdownState" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>Logs the state of the password dropdown when it's shown.</summary>
@@ -2641,7 +2641,7 @@
 
 <histogram
     name="PasswordManager.PasswordDropdownShown.NonWebAuthnRequest.TotalCount"
-    units="credentials" expires_after="2025-05-11">
+    units="credentials" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -2662,7 +2662,7 @@
 
 <histogram
     name="PasswordManager.PasswordDropdownShown.WebAuthnRequest.PasskeyCount"
-    units="credentials" expires_after="2025-05-11">
+    units="credentials" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -2673,7 +2673,7 @@
 
 <histogram
     name="PasswordManager.PasswordDropdownShown.WebAuthnRequest.PasswordCount"
-    units="credentials" expires_after="2025-05-11">
+    units="credentials" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -2684,7 +2684,7 @@
 
 <histogram
     name="PasswordManager.PasswordDropdownShown.WebAuthnRequest.TotalCount"
-    units="credentials" expires_after="2025-05-11">
+    units="credentials" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -2696,7 +2696,7 @@
 
 <histogram
     name="PasswordManager.PasswordDropdownShown.WebAuthnRequest.UseAnotherDeviceShown"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <summary>
@@ -2815,7 +2815,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordReuse.NumberOfMatches"
-    units="credentials" expires_after="2025-05-11">
+    units="credentials" expires_after="2025-07-13">
   <owner>nwokedi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2938,7 +2938,7 @@
 
 <histogram
     name="PasswordManager.PasswordSettings.{Function}.{Setting}{Type}.Latency"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -3085,7 +3085,7 @@
 
 <histogram
     name="PasswordManager.PasswordStore.WasEnrolledInUPMWhenBackendWasCreated"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>friedrichh@chromium.org</owner>
@@ -3307,7 +3307,7 @@
 
 <histogram
     name="PasswordManager.PasswordStoreAndroidBackend{Function}.APIError"
-    enum="PasswordStoreAndroidBackendAPIError" expires_after="2025-05-11">
+    enum="PasswordStoreAndroidBackendAPIError" expires_after="2025-07-13">
   <owner>maxan@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
@@ -3336,7 +3336,7 @@
 <histogram
     name="PasswordManager.PasswordStoreAndroidBackend{Function}.ConnectionResultCode"
     enum="PasswordStoreAndroidBackendConnectionResultCode"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3363,7 +3363,7 @@
 
 <histogram
     name="PasswordManager.PasswordStoreAndroidBackend{Function}.ErrorCode"
-    enum="PasswordStoreAndroidBackendError" expires_after="2025-05-11">
+    enum="PasswordStoreAndroidBackendError" expires_after="2025-07-13">
   <owner>maxan@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
@@ -3427,7 +3427,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordStore{Backend}.{Function}"
-    enum="PasswordStoreAndroidBackendRequestStatus" expires_after="2025-05-11">
+    enum="PasswordStoreAndroidBackendRequestStatus" expires_after="2025-07-13">
   <owner>maxan@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
@@ -3448,7 +3448,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordStore{Backend}.{Function}.Latency"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>maxan@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
@@ -3468,7 +3468,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordStore{Backend}.{Function}.Success"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>maxan@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
@@ -3499,7 +3499,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordViewPage.UserActions"
-    enum="PasswordViewPageInteractions" expires_after="2025-05-11">
+    enum="PasswordViewPageInteractions" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -3560,7 +3560,7 @@
 <histogram
     name="PasswordManager.ProcessIncomingPasswordSharingInvitationResult"
     enum="PasswordManager.ProcessIncomingPasswordSharingInvitationResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mamir@chromium.org</owner>
   <owner>rushans@google.com</owner>
   <component>1457410</component>
@@ -3749,7 +3749,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SaveUIDismissalReason{UserSyncingType}"
-    enum="PasswordManagerUIDismissalReason" expires_after="2025-05-11">
+    enum="PasswordManagerUIDismissalReason" expires_after="2025-07-13">
   <owner>vasilii@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
@@ -3763,7 +3763,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SavingOnUsernameFirstFlow"
-    enum="SavingOnUsernameFirstFlow" expires_after="2025-05-11">
+    enum="SavingOnUsernameFirstFlow" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3942,7 +3942,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SubmittedFormType2" enum="PasswordFormType2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <owner>chrome-password-manager-metrics-alerts@google.com</owner>
@@ -4070,7 +4070,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TimesReceivedFillDataForForm" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4197,7 +4197,7 @@
 </histogram>
 
 <histogram name="PasswordManager.UIDismissalReason"
-    enum="PasswordManagerUIDismissalReason" expires_after="2025-05-11">
+    enum="PasswordManagerUIDismissalReason" expires_after="2025-07-13">
   <owner>vasilii@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -4417,7 +4417,7 @@
 </histogram>
 
 <histogram name="PasswordManager.UsernameDetectionMethod"
-    enum="UsernameDetectionMethod" expires_after="2025-05-11">
+    enum="UsernameDetectionMethod" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4477,7 +4477,7 @@
 </histogram>
 
 <histogram name="PasswordManager.WellKnownChangePasswordResult"
-    enum="WellKnownChangePasswordResult" expires_after="2025-05-11">
+    enum="WellKnownChangePasswordResult" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>jkeitel@google.com</owner>
   <summary>
@@ -4505,7 +4505,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Location}.AuthenticationResult"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4553,7 +4553,7 @@
 
 <histogram
     name="PasswordManager.{Store}BlacklistedSitesHiRes3{CustomPassphraseStatus}"
-    units="sites" expires_after="2025-05-11">
+    units="sites" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -4568,7 +4568,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Store}InaccessiblePasswords3"
-    units="saved passwords" expires_after="2025-05-11">
+    units="saved passwords" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
@@ -4584,7 +4584,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Store}LoginDatabaseEncryptionStatus"
-    enum="LoginDatabaseEncryptionStatus" expires_after="2025-05-11">
+    enum="LoginDatabaseEncryptionStatus" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -4681,7 +4681,7 @@
 
 <histogram
     name="PasswordManager.{Store}TimesPasswordUsed3.{PasswordType}{CustomPassphraseStatus}"
-    units="PasswordUses" expires_after="2025-05-11">
+    units="PasswordUses" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>battre@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
@@ -4699,7 +4699,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Store}TotalAccountsHiRes3.WithScheme{Scheme}"
-    units="accounts" expires_after="2025-05-11">
+    units="accounts" expires_after="2025-07-13">
   <owner>battre@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -4716,7 +4716,7 @@
 
 <histogram
     name="PasswordManager.{Store}{Metric3}.{PasswordType}{CustomPassphraseStatus}"
-    units="units" expires_after="2025-05-11">
+    units="units" expires_after="2025-07-13">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/payment/histograms.xml b/tools/metrics/histograms/metadata/payment/histograms.xml
index e7fa5e55..468f989a 100644
--- a/tools/metrics/histograms/metadata/payment/histograms.xml
+++ b/tools/metrics/histograms/metadata/payment/histograms.xml
@@ -48,7 +48,7 @@
 </histogram>
 
 <histogram name="PaymentRequest.CheckoutFunnel"
-    enum="PaymentRequestCheckoutFunnelSteps" expires_after="2025-05-11">
+    enum="PaymentRequestCheckoutFunnelSteps" expires_after="2025-07-13">
   <owner>rouslan@chromium.org</owner>
   <owner>web-payments-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/pdf/histograms.xml b/tools/metrics/histograms/metadata/pdf/histograms.xml
index bb6d595d..00fa8bf 100644
--- a/tools/metrics/histograms/metadata/pdf/histograms.xml
+++ b/tools/metrics/histograms/metadata/pdf/histograms.xml
@@ -170,7 +170,7 @@
 </histogram>
 
 <histogram name="PDF.RenderAndPaintVisiblePagesTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>nigi@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>
@@ -200,7 +200,7 @@
   </summary>
 </histogram>
 
-<histogram name="PDF.Version" enum="PDFVersion" expires_after="2025-05-11">
+<histogram name="PDF.Version" enum="PDFVersion" expires_after="2025-07-13">
   <owner>dhoss@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>Tracks versions of documents opened in the PDF viewer.</summary>
diff --git a/tools/metrics/histograms/metadata/performance_manager/histograms.xml b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
index dba52c8..83e4a4d 100644
--- a/tools/metrics/histograms/metadata/performance_manager/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
@@ -40,7 +40,7 @@
 </histogram>
 
 <histogram name="CPU.Experimental.CpuEstimationTaskQueuedTime.{CoreType}"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -96,7 +96,7 @@
 </histogram>
 
 <histogram name="CPU.Experimental.CpuEstimationThreadTimePercent.{CoreType}"
-    units="%" expires_after="2025-05-11">
+    units="%" expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -112,7 +112,7 @@
 
 <histogram
     name="CPU.Experimental.EstimatedFrequencyAsPercentOfLimit.{CoreType}"
-    units="%" expires_after="2025-05-11">
+    units="%" expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -190,7 +190,7 @@
 </histogram>
 
 <histogram name="PerformanceManager.Experimental.AccessibilityModeFlag"
-    enum="AccessibilityModeFlagEnum" expires_after="2025-05-11">
+    enum="AccessibilityModeFlagEnum" expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
   <summary>
@@ -200,7 +200,7 @@
 </histogram>
 
 <histogram name="PerformanceManager.Experimental.HasAccessibilityModeFlag"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>anthonyvd@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index 336f875..4bcd145 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -264,7 +264,7 @@
 
 <histogram
     name="Permissions.ActivityIndicator.{Disposition}.{PermissionType}.{Action}"
-    enum="ActivityIndicatorState" expires_after="2025-05-11">
+    enum="ActivityIndicatorState" expires_after="2025-07-13">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -384,7 +384,7 @@
 </histogram>
 
 <histogram name="Permissions.CrowdDeny.PreloadData.DelayedPushNotification"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -399,7 +399,7 @@
 </histogram>
 
 <histogram name="Permissions.CrowdDeny.PreloadData.NotificationUxQuality"
-    enum="CrowdDenyNotificationUxQuality" expires_after="2025-05-11">
+    enum="CrowdDenyNotificationUxQuality" expires_after="2025-07-13">
   <owner>andypaicu@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <owner>hkamila@chromium.org</owner>
@@ -432,7 +432,7 @@
 </histogram>
 
 <histogram name="Permissions.CrowdDeny.SafeBrowsing.Verdict"
-    enum="CrowdDenySafeBrowsingVerdict" expires_after="2025-05-11">
+    enum="CrowdDenySafeBrowsingVerdict" expires_after="2025-07-13">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -589,7 +589,7 @@
 </histogram>
 
 <histogram name="Permissions.MissingOSLevelPermission.ShouldShow"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>andypaicu@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <owner>hkamila@chromium.org</owner>
@@ -655,7 +655,7 @@
 
 <histogram
     name="Permissions.PageInfo.Changed.{PermissionType}.Reallowed.Outcome"
-    enum="PermissionChangeInfo" expires_after="2025-05-11">
+    enum="PermissionChangeInfo" expires_after="2025-07-13">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -701,7 +701,7 @@
 </histogram>
 
 <histogram name="Permissions.PredictionService.PredictionSource"
-    enum="PermissionPredictionSource" expires_after="2025-05-11">
+    enum="PermissionPredictionSource" expires_after="2025-07-13">
   <owner>ravjit@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -723,7 +723,7 @@
 </histogram>
 
 <histogram name="Permissions.PredictionService.Response.{PermissionType}"
-    enum="BooleanIgnored" expires_after="2025-05-11">
+    enum="BooleanIgnored" expires_after="2025-07-13">
   <owner>ravjit@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1035,7 +1035,7 @@
 </histogram>
 
 <histogram name="Permissions.Prompt.{PermissionType}.{Disposition}.Action"
-    enum="PermissionAction" expires_after="2025-05-11">
+    enum="PermissionAction" expires_after="2025-07-13">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1298,7 +1298,7 @@
 </histogram>
 
 <histogram name="Permissions.Request.SameOrigin.{FrameLevel}"
-    enum="PermissionType" expires_after="2025-05-11">
+    enum="PermissionType" expires_after="2025-07-13">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1460,7 +1460,7 @@
 </histogram>
 
 <histogram name="SiteEngagementService.MeanEngagement" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jdeblasio@chromium.org</owner>
   <owner>chrome-secure-web-and-net@chromium.org</owner>
   <summary>
@@ -1509,7 +1509,7 @@
 </histogram>
 
 <histogram name="WebsiteSettings.Action" enum="WebsiteSettingsAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>estark@chromium.org</owner>
   <owner>dullweber@chromium.org</owner>
   <summary>
@@ -1530,7 +1530,7 @@
 </histogram>
 
 <histogram name="WebsiteSettings.OriginInfo.PermissionChanged"
-    enum="ContentType" expires_after="2025-05-11">
+    enum="ContentType" expires_after="2025-07-13">
   <owner>andypaicu@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <owner>hkamila@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 760c205..4738dc2 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -72,7 +72,7 @@
 </histogram>
 
 <histogram name="Platform.BootMode.FirmwareWriteProtect.{FirmwareType}"
-    enum="Platform.BootMode.FirmwareWriteProtect" expires_after="2025-05-11">
+    enum="Platform.BootMode.FirmwareWriteProtect" expires_after="2025-07-13">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -90,7 +90,7 @@
 </histogram>
 
 <histogram name="Platform.BootMode.WriteProtectSwitch"
-    enum="Platform.BootMode.SwitchStatus" expires_after="2025-05-11">
+    enum="Platform.BootMode.SwitchStatus" expires_after="2025-07-13">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -167,7 +167,7 @@
 </histogram>
 
 <histogram name="Platform.Chaps.TokenManager.UnloadToken"
-    enum="TokenManagerStatus" expires_after="2025-05-11">
+    enum="TokenManagerStatus" expires_after="2025-07-13">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -637,7 +637,7 @@
 </histogram>
 
 <histogram name="Platform.DiskUsage.NumUserHomeDirectories"
-    units="home directories" expires_after="2025-05-11">
+    units="home directories" expires_after="2025-07-13">
   <owner>achuith@chromium.org</owner>
   <owner>tls@chromium.org</owner>
   <summary>
@@ -697,7 +697,7 @@
 </histogram>
 
 <histogram name="Platform.DlcService.TotalUsedMBytes" units="MiB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yuanpengni@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -875,7 +875,7 @@
 </histogram>
 
 <histogram name="Platform.FlexCpuIsaLevel" enum="FlexCpuIsaLevel"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>nicholasbishop@google.com</owner>
   <owner>chromeos-flex-eng@google.com</owner>
   <summary>
@@ -1020,7 +1020,7 @@
 </histogram>
 
 <histogram name="Platform.IntelMaxMicroArchitecture"
-    enum="IntelMaxMicroArchitecture" expires_after="2025-05-11">
+    enum="IntelMaxMicroArchitecture" expires_after="2025-07-13">
   <owner>fbarchard@chromium.org</owner>
   <owner>pwnall@chromium.org</owner>
   <summary>
@@ -1176,7 +1176,7 @@
 </histogram>
 
 <histogram name="Platform.Libhwsec.RetryAction{Category}"
-    enum="HwsecRetryActionEnum" expires_after="2025-05-11">
+    enum="HwsecRetryActionEnum" expires_after="2025-07-13">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -1385,7 +1385,7 @@
   </summary>
 </histogram>
 
-<histogram name="Platform.Memory.ARC" units="MiB" expires_after="2025-05-11">
+<histogram name="Platform.Memory.ARC" units="MiB" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
 
   <owner>bgeffon@chromium.org</owner>
@@ -1398,7 +1398,7 @@
 </histogram>
 
 <histogram name="Platform.Memory.Browser" units="MiB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
 
   <owner>bgeffon@chromium.org</owner>
@@ -1420,7 +1420,7 @@
   </summary>
 </histogram>
 
-<histogram name="Platform.Memory.Gpu" units="MiB" expires_after="2025-05-11">
+<histogram name="Platform.Memory.Gpu" units="MiB" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
 
   <owner>bgeffon@chromium.org</owner>
@@ -1466,7 +1466,7 @@
   </summary>
 </histogram>
 
-<histogram name="Platform.Memory.VMs" units="MiB" expires_after="2025-05-11">
+<histogram name="Platform.Memory.VMs" units="MiB" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
 
   <owner>bgeffon@chromium.org</owner>
@@ -1590,7 +1590,7 @@
 </histogram>
 
 <histogram name="Platform.Missive.ClientEnqueueResult"
-    enum="EnterpriseCloudReportingStatusCode" expires_after="2025-05-11">
+    enum="EnterpriseCloudReportingStatusCode" expires_after="2025-07-13">
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
   <summary>
@@ -1758,7 +1758,7 @@
 </histogram>
 
 <histogram name="Platform.Modemfwd.DlcInstallResult"
-    enum="ModemfwdDlcInstallResult" expires_after="2025-05-11">
+    enum="ModemfwdDlcInstallResult" expires_after="2025-07-13">
   <owner>andrewlassalle@google.com</owner>
   <owner>ujjwalpande@google.com</owner>
   <summary>
@@ -1779,7 +1779,7 @@
 </histogram>
 
 <histogram name="Platform.Modemfwd.FWInstallResult"
-    enum="ModemfwdFWInstallResult" expires_after="2025-05-11">
+    enum="ModemfwdFWInstallResult" expires_after="2025-07-13">
   <owner>andrewlassalle@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>The result of each modem FW install attempt.</summary>
@@ -1799,7 +1799,7 @@
 </histogram>
 
 <histogram name="Platform.Modemfwd.FWUpdateLocation"
-    enum="ModemfwdFWUpdateLocation" expires_after="2025-05-11">
+    enum="ModemfwdFWUpdateLocation" expires_after="2025-07-13">
   <owner>andrewlassalle@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -2418,7 +2418,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.ExpandedApRoVerificationStatus"
-    enum="ExpandedApRoVerificationStatus" expires_after="2025-05-11">
+    enum="ExpandedApRoVerificationStatus" expires_after="2025-07-13">
   <owner>granaghan@google.com</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2502,7 +2502,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.TimeToTakeOwnership" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2512,7 +2512,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.TpmManagerSecretStatus"
-    enum="TpmManagerSecretStatus" expires_after="2025-05-11">
+    enum="TpmManagerSecretStatus" expires_after="2025-07-13">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2534,7 +2534,7 @@
 </histogram>
 
 <histogram name="Platform.TPM1.CommandAndResponse.{Client}"
-    enum="TPM1CommandAndResponse" expires_after="2025-05-11">
+    enum="TPM1CommandAndResponse" expires_after="2025-07-13">
   <owner>chingkang@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2556,7 +2556,7 @@
 </histogram>
 
 <histogram name="Platform.TPM2.CommandAndResponse.{Client}"
-    enum="TPM2CommandAndResponse" expires_after="2025-05-11">
+    enum="TPM2CommandAndResponse" expires_after="2025-07-13">
   <owner>chingkang@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2632,7 +2632,7 @@
 </histogram>
 
 <histogram name="Platform.Trunks.TpmErrorCode" enum="TPMResponseCode"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2696,7 +2696,7 @@
 </histogram>
 
 <histogram name="Platform.UnaggregatedUsageTime" units="seconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>iby@chromium.org</owner>
   <owner>chromeos-data-eng@google.com</owner>
   <summary>
@@ -2850,7 +2850,7 @@
 </histogram>
 
 <histogram name="Platform.{GSC}.BoardIdFlags" enum="Cr50BoardIdFlags"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>apronin@chromium.org</owner>
   <owner>vbendeb@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
@@ -2866,7 +2866,7 @@
 </histogram>
 
 <histogram name="Platform.{GSC}.BoardIdOfRlzMismatch" enum="Cr50CrosRlzCodes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vbendeb@chromium.org</owner>
   <owner>apronin@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
@@ -2915,7 +2915,7 @@
 </histogram>
 
 <histogram name="Platform.{GSC}.RlzOfBoardIdMismatch" enum="Cr50CrosRlzCodes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vbendeb@chromium.org</owner>
   <owner>apronin@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/plus_addresses/histograms.xml b/tools/metrics/histograms/metadata/plus_addresses/histograms.xml
index a32e967d..dc4a37a3 100644
--- a/tools/metrics/histograms/metadata/plus_addresses/histograms.xml
+++ b/tools/metrics/histograms/metadata/plus_addresses/histograms.xml
@@ -210,7 +210,7 @@
 </histogram>
 
 <histogram name="PlusAddresses.{ModalType}.{Status}.Refreshes"
-    units="refreshes" expires_after="2025-05-11">
+    units="refreshes" expires_after="2025-07-13">
   <owner>jkeitel@google.com</owner>
   <owner>brunobraga@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index 1e60e26..bbb76fd 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -308,7 +308,7 @@
 
 <histogram name="PerformanceMonitor.UsageScenario.LongInterval"
     enum="PerformanceMonitor.UsageScenario.LongInterval"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>olivierli@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -349,7 +349,7 @@
 
 <histogram
     name="Power.AdaptiveChargingDelayDelta.{AdaptiveChargingState}.{OnTimeStatus}"
-    units="minutes" expires_after="2025-05-11">
+    units="minutes" expires_after="2025-07-13">
   <owner>dbasehore@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -672,7 +672,7 @@
 </histogram>
 
 <histogram name="Power.BatteryDischargeRate" units="mW"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -940,7 +940,7 @@
 </histogram>
 
 <histogram name="Power.BatterySaver.UserBrightenedSec" units="seconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>cwd@google.com</owner>
   <owner>chromeos-bsm@google.com</owner>
   <summary>
@@ -990,7 +990,7 @@
 </histogram>
 
 <histogram name="Power.CpuTimeSecondsPerProcessType" enum="ProcessType2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>eseckler@chromium.org</owner>
   <owner>skyostil@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
@@ -1281,7 +1281,7 @@
 </histogram>
 
 <histogram name="Power.ForegroundBatteryDrain.30Seconds{Exclusive}" units="uAh"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>eseckler@chromium.org</owner>
   <owner>skyostil@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
@@ -1323,7 +1323,7 @@
 </histogram>
 
 <histogram name="Power.ForegroundBatteryDrain{Exclusive}" units="0.1 mAh"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>eseckler@chromium.org</owner>
   <owner>skyostil@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
@@ -1541,7 +1541,7 @@
   </token>
 </histogram>
 
-<histogram base="true" name="Power.Mac" units="mW" expires_after="2025-05-11">
+<histogram base="true" name="Power.Mac" units="mW" expires_after="2025-07-13">
   <owner>olivierli@chromium.org</owner>
   <owner>markchang@chromium.org</owner>
   <summary>
@@ -1743,7 +1743,7 @@
 </histogram>
 
 <histogram name="Power.SuspendAttemptsBeforeCancel" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -1757,7 +1757,7 @@
 </histogram>
 
 <histogram name="Power.SuspendAttemptsBeforeSuccess" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/prefetch/histograms.xml b/tools/metrics/histograms/metadata/prefetch/histograms.xml
index e88b21aa..4fe8bb47 100644
--- a/tools/metrics/histograms/metadata/prefetch/histograms.xml
+++ b/tools/metrics/histograms/metadata/prefetch/histograms.xml
@@ -40,7 +40,7 @@
 
 <histogram
     name="PrefetchProxy.AfterClick.BlockUntilHeadDuration.{WasServed}.{SpeculationEagerness}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -252,7 +252,7 @@
 
 <histogram
     name="PrefetchProxy.AfterClick.WasBlockedUntilHeadWhenServing.{SpeculationEagerness}"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -275,7 +275,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.AfterClick.WasFullRedirectChainServed"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -488,7 +488,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.TotalTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -564,7 +564,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.RedirectChainSize" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>liviutinta@chromium.org</owner>
   <owner>jbroman@chromium.org</owner>
   <owner>curranmax@chromium.org</owner>
@@ -575,7 +575,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.StreamingURLLoaderFinalStatus"
-    enum="PrefetchStreamingURLLoaderStatus" expires_after="2025-05-11">
+    enum="PrefetchStreamingURLLoaderStatus" expires_after="2025-07-13">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
@@ -629,7 +629,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Redirect.Result" enum="PrefetchRedirectResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kouhei@chromium.org</owner>
   <owner>chrome-loading@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index ed25349d..6438936 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -273,7 +273,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterEditDialogActions"
-    enum="PrinterEditDialogActions" expires_after="2025-05-11">
+    enum="PrinterEditDialogActions" expires_after="2025-07-13">
   <owner>nmuggli@google.com</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -335,7 +335,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterSetupResult.SettingsDiscoveredPrinters"
-    enum="PrinterSetupResult" expires_after="2025-05-11">
+    enum="PrinterSetupResult" expires_after="2025-07-13">
   <owner>gavinwill@chromium.org</owner>
   <owner>bmgordon@chromium.org</owner>
   <owner>src/chromeos/printing/OWNERS</owner>
@@ -525,7 +525,7 @@
 </histogram>
 
 <histogram name="Printing.PrintManagement.GetPrintJobsRequestDuration"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -729,7 +729,7 @@
 </histogram>
 
 <histogram name="PrintPreview.PrintSettings" enum="PrintSettings"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thestig@chromium.org</owner>
   <owner>awscreen@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index f597e48..397dcbf 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -157,7 +157,7 @@
 </variants>
 
 <histogram name="Privacy.3PCD.AdsHeuristicAddedToOverrides"
-    enum="AdsHeuristicCookieOverride" expires_after="2025-05-11">
+    enum="AdsHeuristicCookieOverride" expires_after="2025-07-13">
   <owner>johnidel@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -203,7 +203,7 @@
 </histogram>
 
 <histogram name="Privacy.3PCD.SecCookieDeprecationHeaderStatus"
-    enum="SecCookieDeprecationHeaderStatus" expires_after="2025-05-11">
+    enum="SecCookieDeprecationHeaderStatus" expires_after="2025-07-13">
   <owner>linnan@chromium.org</owner>
   <owner>src/chrome/browser/tpcd/OWNERS</owner>
   <summary>
@@ -355,7 +355,7 @@
 </histogram>
 
 <histogram name="Privacy.DeleteBrowsingData.Dialog"
-    enum="DeleteBrowsingDataDialogAction" expires_after="2025-05-11">
+    enum="DeleteBrowsingDataDialogAction" expires_after="2025-07-13">
   <owner>fsenra@google.com</owner>
   <owner>alimariam@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
@@ -444,7 +444,7 @@
 </histogram>
 
 <histogram name="Privacy.DIPS.ClearedSitesCount{DIPSCookieMode}" units="sites"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>wanderview@chromium.org</owner>
   <owner>src/chrome/browser/dips/OWNERS</owner>
   <summary>
@@ -469,7 +469,7 @@
 </histogram>
 
 <histogram name="Privacy.DIPS.Database.Operation.{DIPSDatabaseOperation}Time"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>etienneb@chromium.org</owner>
   <owner>jdh@chromium.org</owner>
   <owner>src/chrome/browser/dips/OWNERS</owner>
@@ -560,7 +560,7 @@
 </histogram>
 
 <histogram name="Privacy.DIPS.Deletion{DIPSCookieMode}"
-    enum="DIPSDeletionAction" expires_after="2025-05-11">
+    enum="DIPSDeletionAction" expires_after="2025-07-13">
   <owner>njeunje@chromium.org</owner>
   <owner>src/chrome/browser/dips/OWNERS</owner>
   <summary>
@@ -657,7 +657,7 @@
 </histogram>
 
 <histogram name="Privacy.QuickDelete" enum="QuickDeleteAction"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>fsenra@google.com</owner>
   <owner>zalmashni@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
@@ -1137,7 +1137,7 @@
 
 <histogram
     name="PrivacySandbox.Attestations.EstimateMemoryUsage.AttestationsMap"
-    units="KB" expires_after="2025-05-11">
+    units="KB" expires_after="2025-07-13">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1195,7 +1195,7 @@
 </histogram>
 
 <histogram name="PrivacySandbox.Attestations.InitializationDuration.Parsing"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1220,7 +1220,7 @@
 </histogram>
 
 <histogram name="PrivacySandbox.Attestations.IsSiteAttested.FileSource"
-    enum="PrivacySandboxAttestationsFileSource" expires_after="2025-05-11">
+    enum="PrivacySandboxAttestationsFileSource" expires_after="2025-07-13">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1232,7 +1232,7 @@
 </histogram>
 
 <histogram name="PrivacySandbox.Attestations.IsSiteAttested.FirstCheckTime"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1264,7 +1264,7 @@
 </histogram>
 
 <histogram name="PrivacySandbox.Attestations.Parsing.Status"
-    enum="PrivacySandboxAttestationParsingStatus" expires_after="2025-05-11">
+    enum="PrivacySandboxAttestationParsingStatus" expires_after="2025-07-13">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1632,7 +1632,7 @@
 
 <histogram name="PrivacySandbox.PrivateAggregation.Budgeter.RequestResult3"
     enum="PrivacySandboxPrivateAggregationBudgeterRequestResult3"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alexmt@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <summary>
@@ -1766,7 +1766,7 @@
 
 <histogram name="PrivacySandbox.PrivateAggregation.Host.PipeResult"
     enum="PrivacySandboxPrivateAggregationHostPipeResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alexmt@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml
index 019c356..0a76b6b 100644
--- a/tools/metrics/histograms/metadata/profile/histograms.xml
+++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Profile.AddNewUser" enum="ProfileAddNewUser"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rogerta@chromium.org</owner>
   <summary>The frequency of ways that new user profiles are added.</summary>
 </histogram>
@@ -39,7 +39,7 @@
 </histogram>
 
 <histogram name="Profile.AllAccounts.Names" enum="ProfileAllAccountsNames"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -192,7 +192,7 @@
 </histogram>
 
 <histogram name="Profile.Guest.TypeCreated" enum="GuestProfileCreatedType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -203,7 +203,7 @@
 </histogram>
 
 <histogram name="Profile.Incognito.Lifetime" units="minutes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -361,7 +361,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfActiveProfiles" units="profiles"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>feuunk@chromium.org</owner>
   <summary>
@@ -383,7 +383,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfManagedProfiles" units="profiles"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
@@ -397,7 +397,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfProfiles" units="profiles"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -448,7 +448,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfUnusedProfiles" units="profiles"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -458,7 +458,7 @@
 </histogram>
 
 <histogram name="Profile.PercentageOfManagedProfiles" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
@@ -478,7 +478,7 @@
 </histogram>
 
 <histogram name="Profile.SessionDuration.PerProfile" enum="Profile"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>msarda@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
@@ -500,7 +500,7 @@
 </histogram>
 
 <histogram base="true" name="Profile.State.LastUsed" units="days"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -520,7 +520,7 @@
 </histogram>
 
 <histogram base="true" name="Profile.State.UnconsentedPrimaryAccountType"
-    enum="ProfileUnconsentedPrimaryAccountType" expires_after="2025-05-11">
+    enum="ProfileUnconsentedPrimaryAccountType" expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -529,7 +529,7 @@
   </summary>
 </histogram>
 
-<histogram name="Profile.TotalSize" units="MB" expires_after="2025-05-11">
+<histogram name="Profile.TotalSize" units="MB" expires_after="2025-07-13">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>Total size of the profile data (excluding sub-folders).</summary>
@@ -797,7 +797,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.StartupReason.{StartupStep}"
-    enum="ProfilePickerStartupProfileReason" expires_after="2025-05-11">
+    enum="ProfilePickerStartupProfileReason" expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/quick_answers/histograms.xml b/tools/metrics/histograms/metadata/quick_answers/histograms.xml
index 0c19a6db..9cfc045e2 100644
--- a/tools/metrics/histograms/metadata/quick_answers/histograms.xml
+++ b/tools/metrics/histograms/metadata/quick_answers/histograms.xml
@@ -37,7 +37,7 @@
 </variants>
 
 <histogram name="QuickAnswers.ActiveImpression" enum="QuickAnswersResultType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>angelaxiao@chromium.org</owner>
   <owner>yawano@google.com</owner>
   <owner>llin@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/quota/histograms.xml b/tools/metrics/histograms/metadata/quota/histograms.xml
index 1944f83..409bb91b 100644
--- a/tools/metrics/histograms/metadata/quota/histograms.xml
+++ b/tools/metrics/histograms/metadata/quota/histograms.xml
@@ -53,7 +53,7 @@
 </histogram>
 
 <histogram name="Quota.AvailableDiskSpace2" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -352,7 +352,7 @@
   </summary>
 </histogram>
 
-<histogram name="Quota.TotalDiskSpace" units="MB" expires_after="2025-05-11">
+<histogram name="Quota.TotalDiskSpace" units="MB" expires_after="2025-07-13">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml
index c452e6a..cda1cfd 100644
--- a/tools/metrics/histograms/metadata/renderer/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -51,7 +51,7 @@
 </variants>
 
 <histogram name="Renderer.BrowserLaunchToRunLoopStart" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sky@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <summary>
@@ -245,7 +245,7 @@
 </histogram>
 
 <histogram name="Renderer.Font.PrimaryFont.DomContentLoaded" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kojii@chromium.org</owner>
   <owner>tkent@chromium.org</owner>
   <owner>layout-dev@chromium.org</owner>
@@ -269,7 +269,7 @@
 </histogram>
 
 <histogram name="Renderer.Font.PrimaryFont.FCP" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kojii@chromium.org</owner>
   <owner>tkent@chromium.org</owner>
   <owner>layout-dev@chromium.org</owner>
@@ -293,7 +293,7 @@
 </histogram>
 
 <histogram name="Renderer.Font.SystemFallback.DomContentLoaded" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kojii@chromium.org</owner>
   <owner>tkent@chromium.org</owner>
   <owner>layout-dev@chromium.org</owner>
@@ -308,7 +308,7 @@
 </histogram>
 
 <histogram name="Renderer.Font.SystemFallback.FCP" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kojii@chromium.org</owner>
   <owner>tkent@chromium.org</owner>
   <owner>layout-dev@chromium.org</owner>
@@ -562,7 +562,7 @@
 </histogram>
 
 <histogram name="RendererScheduler.QueueingDuration.{Priority}Priority"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>szager@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer4/histograms.xml b/tools/metrics/histograms/metadata/renderer4/histograms.xml
index 20189e6..67689aa 100644
--- a/tools/metrics/histograms/metadata/renderer4/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer4/histograms.xml
@@ -175,7 +175,7 @@
 </histogram>
 
 <histogram name="Renderer4.MainThreadGestureScrollReason2"
-    enum="MainThreadScrollingReason2" expires_after="2025-05-11">
+    enum="MainThreadScrollingReason2" expires_after="2025-07-13">
   <owner>flackr@chromium.org</owner>
   <owner>pdr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
@@ -194,7 +194,7 @@
 </histogram>
 
 <histogram name="Renderer4.MainThreadWheelScrollReason2"
-    enum="MainThreadScrollingReason2" expires_after="2025-05-11">
+    enum="MainThreadScrollingReason2" expires_after="2025-07-13">
   <owner>flackr@chromium.org</owner>
   <owner>pdr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index d2465994..7aa090887 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -289,7 +289,7 @@
 
 <histogram
     name="SafeBrowsing.BrowserThrottle.IntervalBetweenStartAndProcess{ResponseType}"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -332,7 +332,7 @@
 
 <histogram
     name="SafeBrowsing.BrowserThrottle.IsCheckCompletedOnProcessResponse"
-    enum="BooleanCompleted" expires_after="2025-05-11">
+    enum="BooleanCompleted" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -508,7 +508,7 @@
 
 <histogram
     name="SafeBrowsing.ClientSafeBrowsingReport.DownloadWarningActionSize"
-    units="units" expires_after="2025-05-11">
+    units="units" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -645,7 +645,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.CookieAgeHours2" units="hours"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>chlily@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -794,7 +794,7 @@
 
 <histogram
     name="SafeBrowsing.EsbDisabled.TimesDisabledLast28Days.{EnabledDuration}"
-    units="times" expires_after="2025-05-11">
+    units="times" expires_after="2025-07-13">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1465,7 +1465,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HasCookieAtStartup2" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>chlily@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1518,7 +1518,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.BackoffState" enum="BooleanBackoff"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1634,7 +1634,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.GetCache.Time" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1660,7 +1660,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.HasOhttpKey" enum="BooleanHasKey"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1763,7 +1763,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.Network.{ResponseSource}Result"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-05-11">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-07-13">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1821,7 +1821,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.OhttpKeyService.HasCachedKey"
-    enum="BooleanHasKey" expires_after="2025-05-11">
+    enum="BooleanHasKey" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1853,7 +1853,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.OhttpKeyService.Network.Result"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-05-11">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1863,7 +1863,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.OhttpKeyService.Network.Time" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1900,7 +1900,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.ThreatInfoSize{SourceDetails}"
-    units="verdicts" expires_after="2025-05-11">
+    units="verdicts" expires_after="2025-07-13">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2216,7 +2216,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Pref.Daily.Extended" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2261,7 +2261,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Pref.Enhanced" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2283,7 +2283,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Pref.Extended" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2295,7 +2295,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Pref.General" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2332,7 +2332,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ReferrerURLChainSize" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2343,7 +2343,7 @@
 
 <histogram
     name="SafeBrowsing.RendererThrottle.IsCheckCompletedOnProcessResponse"
-    enum="BooleanCompleted" expires_after="2025-05-11">
+    enum="BooleanCompleted" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2831,7 +2831,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Settings.UserAction.{AccessPoint}"
-    enum="SafeBrowsingSettingsUserAction" expires_after="2025-05-11">
+    enum="SafeBrowsingSettingsUserAction" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2961,7 +2961,7 @@
 
 <histogram
     name="SafeBrowsing.TailoredSecurity.ConsentedDesktopDialogEnabledOutcome"
-    enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2025-05-11">
+    enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2025-07-13">
   <owner>jacastro@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -2997,7 +2997,7 @@
 <histogram
     name="SafeBrowsing.TailoredSecurity.SyncPromptEnabledNotificationResult2"
     enum="SafeBrowsingTailoredSecurityNotificationResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jacastro@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3010,7 +3010,7 @@
 
 <histogram
     name="SafeBrowsing.TailoredSecurityConsented{Status}{PromptType}Outcome"
-    enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2025-05-11">
+    enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2025-07-13">
   <owner>jacastro@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3099,7 +3099,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.TokenFetcher.ErrorType"
-    enum="GoogleServiceAuthError" expires_after="2025-05-11">
+    enum="GoogleServiceAuthError" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3269,7 +3269,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4GetHash.Network.Result"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-05-11">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-07-13">
   <owner>vakh@google.com</owner>
   <owner>kcarattini@google.com</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
@@ -3380,7 +3380,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4ProcessFullUpdate.ApplyUpdateDuration"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3522,7 +3522,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4ReadFromDisk.VerifyChecksumDuration" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3717,7 +3717,7 @@
 
 <histogram
     name="SafeBrowsing.{CloudOrLocal}DeepScan.{Connector}{Result}.Duration"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>domfc@chromium.org</owner>
   <owner>drubery@chromium.org</owner>
   <owner>nancylanxiao@google.com</owner>
@@ -3748,7 +3748,7 @@
 </histogram>
 
 <histogram name="SafeBrowsingBinaryUploadRequest.DlpResult"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>domfc@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 a09bcbe..265a25e 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -274,7 +274,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.ServerRequestsDeepScanningPrompt{Encryption}"
-    enum="BooleanRequested" expires_after="2025-05-11">
+    enum="BooleanRequested" expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -324,7 +324,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.TailoredWarningType"
-    enum="TailoredWarningType" expires_after="2025-05-11">
+    enum="TailoredWarningType" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -367,7 +367,7 @@
 
 <histogram
     name="SBClientDownload.Warning.DownloadIsHttps.{DangerType}.{Action}"
-    enum="BooleanHttps" expires_after="2025-05-11">
+    enum="BooleanHttps" expires_after="2025-07-13">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -441,7 +441,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.{Encryption}MalwareDeepScanResult2.{trigger}"
-    enum="SBClientDownloadCheckResult" expires_after="2025-05-11">
+    enum="SBClientDownloadCheckResult" expires_after="2025-07-13">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -674,7 +674,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.LocalModelDetectsPhishing{RequestType}"
-    enum="BooleanIsPhishing" expires_after="2025-05-11">
+    enum="BooleanIsPhishing" expires_after="2025-07-13">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -733,7 +733,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.NetworkResult2"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-05-11">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-07-13">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml
index ac8f2ea..30b7661 100644
--- a/tools/metrics/histograms/metadata/search/histograms.xml
+++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -29,7 +29,7 @@
 </variants>
 
 <histogram name="Search.Ambient.Query" enum="AmbientSearchEntryPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>juanmojica@google.com</owner>
   <owner>schechter@google.com</owner>
   <owner>stanfield@google.com</owner>
@@ -930,7 +930,7 @@
 </histogram>
 
 <histogram name="Search.Image.Camera.Open" enum="CameraOpenEntryPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>juanmojica@google.com</owner>
   <owner>schechter@google.com</owner>
   <owner>stanfield@google.com</owner>
@@ -1006,7 +1006,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.DelayFromDialogShownToFirstStatus"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>dgn@google.com</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1026,7 +1026,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.DelayFromObservationToFirstStatus"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>dgn@google.com</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1043,7 +1043,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.DialogShownAttempt" units="attempts"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dgn@google.com</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1063,7 +1063,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.DialogStatusChange"
-    enum="OsDefaultsChoiceDialogStatus" expires_after="2025-05-11">
+    enum="OsDefaultsChoiceDialogStatus" expires_after="2025-07-13">
   <owner>dgn@google.com</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1081,7 +1081,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.DialogStatusOnAppOpen"
-    enum="OsDefaultsChoiceDialogStatus" expires_after="2025-05-11">
+    enum="OsDefaultsChoiceDialogStatus" expires_after="2025-07-13">
   <owner>dgn@google.com</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1092,7 +1092,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.DialogSuppressionStatus"
-    enum="OsDefaultsChoiceDialogSuppressionStatus" expires_after="2025-05-11">
+    enum="OsDefaultsChoiceDialogSuppressionStatus" expires_after="2025-07-13">
   <owner>dgn@google.com</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1313,7 +1313,7 @@
 </histogram>
 
 <histogram name="Search.RegionSearch.Lens.Result"
-    enum="LensRegionSearchCaptureResult" expires_after="2025-05-11">
+    enum="LensRegionSearchCaptureResult" expires_after="2025-07-13">
   <owner>juanmojica@google.com</owner>
   <owner>benwgold@google.com</owner>
   <owner>stanfield@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index 16d79273..4a17fad 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Security.DataDecoder.Image.DecodingTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lukasza@chromium.org</owner>
   <owner>rsesek@chromium.org</owner>
   <summary>
@@ -398,7 +398,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.AboutThisSiteLanguageSupported"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>dullweber@chromium.org</owner>
   <owner>olesiamarukhno@chromium.org</owner>
   <summary>
@@ -408,7 +408,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.AboutThisSiteStatus"
-    enum="AboutThisSiteStatus" expires_after="2025-05-11">
+    enum="AboutThisSiteStatus" expires_after="2025-07-13">
   <owner>dullweber@chromium.org</owner>
   <owner>olesiamarukhno@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 03e07bf..f522b25f 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -458,7 +458,7 @@
 
 <histogram
     name="ServiceWorker.FetchEvent.{Resource}.RaceNetworkRequest.IsCloningDataFinishedBeforeResponseComplete"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1340,7 +1340,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.SkipCallingFindRegistrationForClientUrl"
-    enum="BooleanSkipped" expires_after="2025-05-11">
+    enum="BooleanSkipped" expires_after="2025-07-13">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index aaddf494..5cb38a6 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -49,7 +49,7 @@
 </histogram>
 
 <histogram name="Session.BrowserFullscreen.DurationUpTo24H" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bur@chromium.org</owner>
   <owner>chrome-mac-dev@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index 4b12ae29..c48341e 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -195,7 +195,7 @@
 </histogram>
 
 <histogram name="Settings.ClearBrowsingData.Advanced.TimePeriod"
-    enum="SettingsClearBrowsingDataTimePeriod" expires_after="2025-05-11">
+    enum="SettingsClearBrowsingDataTimePeriod" expires_after="2025-07-13">
   <owner>rainhard@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -206,7 +206,7 @@
 </histogram>
 
 <histogram name="Settings.ClearBrowsingData.Basic.TimePeriod"
-    enum="SettingsClearBrowsingDataTimePeriod" expires_after="2025-05-11">
+    enum="SettingsClearBrowsingDataTimePeriod" expires_after="2025-07-13">
   <owner>rainhard@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -361,7 +361,7 @@
 </histogram>
 
 <histogram name="Settings.OverscrollHistoryNavigation.Enabled"
-    enum="BooleanEnabled" expires_after="2025-05-11">
+    enum="BooleanEnabled" expires_after="2025-07-13">
   <owner>charlesmeng@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <summary>
@@ -562,7 +562,7 @@
 </histogram>
 
 <histogram name="Settings.PrivacySandbox.PromptStartupState"
-    enum="SettingsPrivacySandboxPromptStartupState" expires_after="2025-05-11">
+    enum="SettingsPrivacySandboxPromptStartupState" expires_after="2025-07-13">
   <owner>boujane@google.com</owner>
   <owner>koilos@google.com</owner>
   <summary>
@@ -591,7 +591,7 @@
 </histogram>
 
 <histogram name="Settings.PrivacySandbox.Topics.Enabled" enum="BooleanEnabled"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>boujane@google.com</owner>
   <owner>koilos@google.com</owner>
   <summary>
@@ -612,7 +612,7 @@
 </histogram>
 
 <histogram name="Settings.SafetyCheck.Interactions"
-    enum="SettingsSafetyCheckInteractions" expires_after="2025-05-11">
+    enum="SettingsSafetyCheckInteractions" expires_after="2025-07-13">
   <owner>rainhard@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <owner>anaudrey@chromium.org</owner>
@@ -643,7 +643,7 @@
 </histogram>
 
 <histogram name="Settings.SafetyCheck.UnusedSitePermissionsAllowAgainDays"
-    units="days" expires_after="2025-05-11">
+    units="days" expires_after="2025-07-13">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <summary>
@@ -1003,7 +1003,7 @@
 </histogram>
 
 <histogram name="Settings.SearchEngines.Interactions"
-    enum="SettingsSearchEnginesInteractions" expires_after="2025-05-11">
+    enum="SettingsSearchEnginesInteractions" expires_after="2025-07-13">
   <owner>yoangela@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index 853cd7e..38a2d528 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -290,7 +290,7 @@
 </histogram>
 
 <histogram name="Sharing.MessageReceivedType" enum="SharingMessageType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mvanouwerkerk@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index abd0426..f9111754 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -45,7 +45,7 @@
 <!-- LINT.ThenChange(/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediator.java:Event) -->
 
 <histogram name="Signin.AccountCapabilities.FetchLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -98,7 +98,7 @@
 </histogram>
 
 <histogram name="Signin.AccountCapabilities.ImmediatelyAvailable"
-    enum="BooleanAvailable" expires_after="2025-05-11">
+    enum="BooleanAvailable" expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -117,7 +117,7 @@
 </histogram>
 
 <histogram name="Signin.AccountCapabilities.UserVisibleLatency" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -191,7 +191,7 @@
 </histogram>
 
 <histogram name="Signin.AccountConsistencyPromoAction"
-    enum="AccountConsistencyPromoAction" expires_after="2025-05-11">
+    enum="AccountConsistencyPromoAction" expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="Signin.AccountConsistencyPromoAction.{PromoEvent}"
-    enum="SigninAccessPoint" expires_after="2025-05-11">
+    enum="SigninAccessPoint" expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -404,7 +404,7 @@
 </histogram>
 
 <histogram name="Signin.AccountTracker.GaiaIdMigrationState"
-    enum="OAuth2LoginAccountRevokedMigrationState" expires_after="2025-05-11">
+    enum="OAuth2LoginAccountRevokedMigrationState" expires_after="2025-07-13">
   <owner>msarda@chromium.org</owner>
   <owner>sdefresne@chromium.org</owner>
   <summary>
@@ -451,7 +451,7 @@
 </histogram>
 
 <histogram name="Signin.AccountType.SigninConsent" enum="SigninAccountType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jlebel@chromium.org</owner>
   <owner>chrome-signin-team@chromium.org</owner>
   <summary>
@@ -895,7 +895,7 @@
 
 <histogram
     name="Signin.BoundSessionCredentials.SessionRegistrationTotalDuration"
-    units="ms" expires_after="2025-03-30">
+    units="ms" expires_after="2025-07-13">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1182,7 +1182,7 @@
 </histogram>
 
 <histogram name="Signin.Extensions.GetAuthTokenResult"
-    enum="GetAuthTokenResult" expires_after="2025-05-11">
+    enum="GetAuthTokenResult" expires_after="2025-07-13">
 <!-- Name completed by histogram_suffixes name="GetAuthTokenType" -->
 
   <owner>alexilin@chromium.org</owner>
@@ -1260,7 +1260,7 @@
 </histogram>
 
 <histogram name="Signin.GetAccessTokenFinished" enum="GoogleServiceAuthError"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
@@ -1474,7 +1474,7 @@
 </histogram>
 
 <histogram name="Signin.Intercept.ChromeSignin.ResponseTime{Result}" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -1500,7 +1500,7 @@
 
 <histogram
     name="Signin.Intercept.Heuristic.ShouldShowChromeSigninBubbleWithReason"
-    enum="ShouldShowChromeSigninBubbleWithReason" expires_after="2025-05-11">
+    enum="ShouldShowChromeSigninBubbleWithReason" expires_after="2025-07-13">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -1550,7 +1550,7 @@
 </histogram>
 
 <histogram name="Signin.Intercept.HeuristicOutcome"
-    enum="SigninInterceptHeuristicOutcome" expires_after="2025-05-11">
+    enum="SigninInterceptHeuristicOutcome" expires_after="2025-07-13">
   <owner>droger@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
@@ -1560,7 +1560,7 @@
 </histogram>
 
 <histogram name="Signin.InterceptResult.ChromeSignin{State}"
-    enum="SigninInterceptResult" expires_after="2025-05-11">
+    enum="SigninInterceptResult" expires_after="2025-07-13">
   <owner>rsult@google.com</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -1580,7 +1580,7 @@
 </histogram>
 
 <histogram name="Signin.InterceptResult.Enterprise{Mode}.{Status}"
-    enum="SigninInterceptResult" expires_after="2025-05-11">
+    enum="SigninInterceptResult" expires_after="2025-07-13">
   <owner>alexilin@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -1603,7 +1603,7 @@
 </histogram>
 
 <histogram name="Signin.InterceptResult.{InterceptType}{SigninState}"
-    enum="SigninInterceptResult" expires_after="2025-05-11">
+    enum="SigninInterceptResult" expires_after="2025-07-13">
   <owner>alexilin@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -1775,7 +1775,7 @@
 </histogram>
 
 <histogram name="Signin.ListFamilyMembersRequest.OverallStatus"
-    enum="SupervisedUserProtoFetcherStatus" expires_after="2025-05-11">
+    enum="SupervisedUserProtoFetcherStatus" expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -1786,7 +1786,7 @@
 </histogram>
 
 <histogram name="Signin.ListFamilyMembersRequest.RetryCount" units="retries"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -2090,7 +2090,7 @@
 </histogram>
 
 <histogram name="Signin.Reconciler.Operation" enum="SigninReconcilerOperation"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -2282,7 +2282,7 @@
 </histogram>
 
 <histogram name="Signin.SignIn.Completed" enum="SigninAccessPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2314,7 +2314,7 @@
 </histogram>
 
 <histogram name="Signin.SignIn.Started" enum="SigninAccessPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2358,7 +2358,7 @@
 </histogram>
 
 <histogram name="Signin.SigninCompletedAccessPoint" enum="SigninAccessPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>msarda@chromium.org</owner>
   <owner>bsazonov@chromium.org</owner>
   <owner>droger@chromium.org</owner>
@@ -2459,7 +2459,7 @@
 </histogram>
 
 <histogram name="Signin.SigninStartedAccessPoint" enum="SigninAccessPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>msarda@chromium.org</owner>
   <owner>bsazonov@chromium.org</owner>
   <owner>droger@chromium.org</owner>
@@ -2471,7 +2471,7 @@
 </histogram>
 
 <histogram name="Signin.SignOut.Completed" enum="SigninSignoutProfile"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2591,7 +2591,7 @@
 </histogram>
 
 <histogram name="Signin.SyncButtons.Clicked" enum="SyncButtonClicked"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tju@chromium.org</owner>
   <owner>chrome-kids-team@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2614,7 +2614,7 @@
 </histogram>
 
 <histogram name="Signin.SyncButtons.Shown" enum="SyncButtonsType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>tju@chromium.org</owner>
   <owner>chrome-kids-team@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2681,7 +2681,7 @@
 </histogram>
 
 <histogram name="Signin.SyncOptIn.Completed" enum="SigninAccessPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2706,7 +2706,7 @@
 </histogram>
 
 <histogram name="Signin.SyncOptIn.Started" enum="SigninAccessPoint"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2748,7 +2748,7 @@
 </histogram>
 
 <histogram name="Signin.SyncTurnOff.Completed" enum="SigninSignoutProfile"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bsazonov@chromium.org</owner>
   <owner>dgn@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/stability/histograms.xml b/tools/metrics/histograms/metadata/stability/histograms.xml
index 5e88d2ad..4cb14553 100644
--- a/tools/metrics/histograms/metadata/stability/histograms.xml
+++ b/tools/metrics/histograms/metadata/stability/histograms.xml
@@ -169,7 +169,7 @@
 </histogram>
 
 <histogram name="Stability.Android.ProcessedRealMinidumps"
-    enum="AndroidProcessedMinidumps" expires_after="2025-05-11">
+    enum="AndroidProcessedMinidumps" expires_after="2025-07-13">
   <owner>wnwen@chromium.org</owner>
   <owner>src/components/minidump_uploader/OWNERS</owner>
   <summary>
@@ -190,7 +190,7 @@
 </histogram>
 
 <histogram base="true" name="Stability.Android.SystemExitReason"
-    enum="AndroidProcessExitReason" expires_after="2025-05-11">
+    enum="AndroidProcessExitReason" expires_after="2025-07-13">
   <owner>boliu@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <owner>wnwen@chromium.org</owner>
@@ -612,7 +612,7 @@
 </histogram>
 
 <histogram name="Stability.Media.{ProcessType}.Launch" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>sangbaekpark@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -679,7 +679,7 @@
 </histogram>
 
 <histogram name="Stability.RendererAbnormalTermination2.HostedContentType"
-    enum="RendererHostedContentType" expires_after="2025-05-11">
+    enum="RendererHostedContentType" expires_after="2025-07-13">
   <owner>fdoray@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -689,7 +689,7 @@
 </histogram>
 
 <histogram name="Stability.RendererAbnormalTermination2.{HostedContentType}"
-    enum="TerminationStatus" expires_after="2025-05-11">
+    enum="TerminationStatus" expires_after="2025-07-13">
   <owner>fdoray@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/startup/histograms.xml b/tools/metrics/histograms/metadata/startup/histograms.xml
index 395f426..9e597a0 100644
--- a/tools/metrics/histograms/metadata/startup/histograms.xml
+++ b/tools/metrics/histograms/metadata/startup/histograms.xml
@@ -56,7 +56,7 @@
 </histogram>
 
 <histogram name="Startup.Android.Cold.FirstPaintOccurredPreForeground"
-    enum="Boolean" expires_after="2025-05-11">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>blundell@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -104,7 +104,7 @@
 </histogram>
 
 <histogram base="true" name="Startup.Android.Cold.TimeToFirstContentfulPaint"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>pasko@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
@@ -156,7 +156,7 @@
 </histogram>
 
 <histogram base="true" name="Startup.Android.Cold.TimeToFirstNavigationCommit"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>pasko@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
@@ -170,7 +170,7 @@
 </histogram>
 
 <histogram name="Startup.Android.Cold.TimeToFirstNavigationCommit2.Tabbed"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>pasko@chromium.org</owner>
   <owner>agrieve@chromium.org</owner>
   <summary>
@@ -409,7 +409,7 @@
 </histogram>
 
 <histogram name="Startup.Android.Cold.TimeToForegroundSessionStart" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>pasko@chromium.org</owner>
   <owner>mthiesse@chromium.org</owner>
   <summary>
@@ -419,7 +419,7 @@
 </histogram>
 
 <histogram name="Startup.Android.Cold.TimeToVisibleContent" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ckitagawa@chromium.org</owner>
   <summary>
     Android: The time from the activity creation point to the moment the content
@@ -556,7 +556,7 @@
 </histogram>
 
 <histogram name="Startup.Android.MainIconLaunchTotalWaitTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>nafisabedin@google.com</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -656,7 +656,7 @@
 </histogram>
 
 <histogram name="Startup.BringToForegroundReason"
-    enum="BooleanBringToForegroundReason" expires_after="2025-05-11">
+    enum="BooleanBringToForegroundReason" expires_after="2025-07-13">
   <owner>peter@chromium.org</owner>
   <summary>
     Records the cause, each time Chrome is brought to the foreground. Currently
@@ -1147,7 +1147,7 @@
 </histogram>
 
 <histogram name="Startup.MobileSessionStartAction"
-    enum="MobileSessionStartAction" expires_after="2025-05-11">
+    enum="MobileSessionStartAction" expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -1157,7 +1157,7 @@
 </histogram>
 
 <histogram name="Startup.MobileSessionStartFromApps"
-    enum="MobileSessionCallerApp" expires_after="2025-05-11">
+    enum="MobileSessionCallerApp" expires_after="2025-07-13">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>The calling application (if any).</summary>
@@ -1179,7 +1179,7 @@
 </histogram>
 
 <histogram name="Startup.PreMainMessageLoopRunImplLongTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during
@@ -1189,7 +1189,7 @@
 
 <histogram
     name="Startup.Renderer.LoadTime.ApplicationStartToRendererStartRunLoop"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>spvw@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -1206,7 +1206,7 @@
 </histogram>
 
 <histogram name="Startup.Renderer.LoadTime.ChromeMainToRendererStartRunLoop"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>spvw@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -1221,7 +1221,7 @@
 
 <histogram
     name="Startup.Renderer.LoadTime.ProcessCreationToRendererStartRunLoop"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>spvw@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -1307,7 +1307,7 @@
 </histogram>
 
 <histogram name="Startup.{Process}.LoadTime.PreReadFile" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>spvw@chromium.org</owner>
   <owner>fdoray@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index eb145ab..891ef7f3 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -116,7 +116,7 @@
 </histogram>
 
 <histogram name="API.StorageAccess.RequestOutcome"
-    enum="StorageAccessAPIRequestOutcome" expires_after="2025-05-11">
+    enum="StorageAccessAPIRequestOutcome" expires_after="2025-07-13">
   <owner>cfredric@chromium.org</owner>
   <owner>brandm@microsoft.com</owner>
   <summary>
@@ -127,7 +127,7 @@
 </histogram>
 
 <histogram name="API.StorageAccess.RequestStorageAccess2"
-    enum="RequestStorageResult" expires_after="2025-05-11">
+    enum="RequestStorageResult" expires_after="2025-07-13">
   <owner>mkwst@chromium.org</owner>
   <owner>cfredric@chromium.org</owner>
   <owner>brandm@microsoft.com</owner>
@@ -200,7 +200,7 @@
 </histogram>
 
 <histogram name="API.TopLevelStorageAccess.RequestOutcome"
-    enum="TopLevelStorageAccessRequestOutcome" expires_after="2025-05-11">
+    enum="TopLevelStorageAccessRequestOutcome" expires_after="2025-07-13">
   <owner>cfredric@chromium.org</owner>
   <owner>mreichhoff@chromium.org</owner>
   <summary>
@@ -224,7 +224,7 @@
 </histogram>
 
 <histogram name="Clipboard.Read" enum="ClipboardFormatRead"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangdarwin@chromium.org</owner>
   <owner>src/ui/base/clipboard/OWNERS</owner>
   <summary>
@@ -251,7 +251,7 @@
 </histogram>
 
 <histogram name="Clipboard.Write" enum="ClipboardFormatWrite"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>huangdarwin@chromium.org</owner>
   <owner>src/ui/base/clipboard/OWNERS</owner>
   <summary>
@@ -863,7 +863,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.AdComponentRenderURLSize" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -873,7 +873,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.AdProtoCompressionRatio" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -898,7 +898,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.AdProtoDecompressionOutcome"
-    enum="AdProtoDecompressionOutcome" expires_after="2025-05-11">
+    enum="AdProtoDecompressionOutcome" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -939,7 +939,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.AdProtoSizeCompressed" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -951,7 +951,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.AdProtoSizeUncompressed" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -963,7 +963,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.AdRenderURLSize" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -983,7 +983,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.DBMaintenanceTime" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -996,7 +996,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.DBSize" units="KB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1006,7 +1006,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.InitializationResult"
-    enum="InterestGroupStorageInitializationResult" expires_after="2025-05-11">
+    enum="InterestGroupStorageInitializationResult" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1017,7 +1017,7 @@
 
 <histogram name="Storage.InterestGroup.JSONDeserializationResult"
     enum="InterestGroupStorageJSONDeserializationResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1027,7 +1027,7 @@
 
 <histogram name="Storage.InterestGroup.JSONSerializationResult"
     enum="InterestGroupStorageJSONSerializationResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1036,7 +1036,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.PerInterestGroup.NumAdComponents"
-    units="ad components" expires_after="2025-05-11">
+    units="ad components" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1047,7 +1047,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.PerInterestGroup.NumAds" units="ads"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1058,7 +1058,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.PerSiteCount" units="groups"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1082,7 +1082,7 @@
 
 <histogram name="Storage.InterestGroup.ProtoDeserializationResult.{Type}"
     enum="InterestGroupStorageProtoDeserializationResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1094,7 +1094,7 @@
 
 <histogram name="Storage.InterestGroup.ProtoSerializationResult.{Type}"
     enum="InterestGroupStorageProtoSerializationResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1105,7 +1105,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.Upgrade{Outcome}{Version}Version"
-    units="version" expires_after="2025-05-11">
+    units="version" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -1123,7 +1123,7 @@
 </histogram>
 
 <histogram name="Storage.InterestGroup.VacuumResult"
-    enum="InterestGroupStorageVacuumResult" expires_after="2025-05-11">
+    enum="InterestGroupStorageVacuumResult" expires_after="2025-07-13">
   <owner>caraitto@chromium.org</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/subresource/histograms.xml b/tools/metrics/histograms/metadata/subresource/histograms.xml
index f0912ee..c8b9e23 100644
--- a/tools/metrics/histograms/metadata/subresource/histograms.xml
+++ b/tools/metrics/histograms/metadata/subresource/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="SubresourceFilter.Actions2" enum="SubresourceFilterActions2"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
@@ -257,7 +257,7 @@
 </histogram>
 
 <histogram name="SubresourceFilter.PageLoad.ActivationList"
-    enum="ActivationList" expires_after="2025-05-11">
+    enum="ActivationList" expires_after="2025-07-13">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
@@ -267,7 +267,7 @@
 </histogram>
 
 <histogram name="SubresourceFilter.PageLoad.ActivationState"
-    enum="SubresourceFilterActivationState" expires_after="2025-05-11">
+    enum="SubresourceFilterActivationState" expires_after="2025-07-13">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index 8003953..0fc12512 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -320,7 +320,7 @@
 </histogram>
 
 <histogram name="Sync.BookmarkModelMergerTime{UpdatesCount}" units="ms"
-    expires_after="2025-04-13">
+    expires_after="2025-07-13">
   <owner>rushans@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -426,7 +426,7 @@
 </histogram>
 
 <histogram name="Sync.ConfigureDataTypeManagerOption"
-    enum="SyncFeatureOrTransport" expires_after="2025-05-11">
+    enum="SyncFeatureOrTransport" expires_after="2025-07-13">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -578,7 +578,7 @@
 </histogram>
 
 <histogram name="Sync.CryptographerPendingKeys"
-    enum="SyncCryptographerPendingKeysState" expires_after="2025-05-11">
+    enum="SyncCryptographerPendingKeysState" expires_after="2025-07-13">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -753,7 +753,7 @@
 </histogram>
 
 <histogram name="Sync.DataTypeErrorSite{SyncDataType}"
-    enum="SyncDataTypeErrorSite" expires_after="2025-05-11">
+    enum="SyncDataTypeErrorSite" expires_after="2025-07-13">
   <owner>treib@chromium.org</owner>
   <owner>rushans@google.com</owner>
   <summary>
@@ -961,7 +961,7 @@
 </histogram>
 
 <histogram name="Sync.DeviceCount2.{DeviceType}" units="devices"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ssid@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
@@ -978,7 +978,7 @@
 </histogram>
 
 <histogram name="Sync.EntityEncryptionSucceeded{SyncDataType}"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>rushans@google.com</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -1380,7 +1380,7 @@
 </histogram>
 
 <histogram name="Sync.PaymentsAccountStorageUponSyncConfiguration"
-    enum="PaymentsAccountStorageUponConfiguration" expires_after="2025-04-30">
+    enum="PaymentsAccountStorageUponConfiguration" expires_after="2025-07-13">
   <owner>mastiz@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>src/components/sync/OWNERS</owner>
@@ -1477,7 +1477,7 @@
 </histogram>
 
 <histogram name="Sync.PostedGetUpdatesOrigin" enum="SyncGetUpdatesOrigin"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mastiz@chromium.org</owner>
   <owner>rushans@google.com</owner>
   <summary>
@@ -1518,7 +1518,7 @@
 </histogram>
 
 <histogram name="Sync.ResetEngineReason" enum="SyncResetEngineReason"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rushans@google.com</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -2061,7 +2061,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultKeyRetrievalTrigger"
-    enum="TrustedVaultUserActionTrigger" expires_after="2025-05-11">
+    enum="TrustedVaultUserActionTrigger" expires_after="2025-07-13">
   <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 ddc369e..204fb6982 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -73,7 +73,7 @@
 </variants>
 
 <histogram name="Discarding.DailyDiscards{TabDiscardReason}" units="tabs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vovoy@chromium.org</owner>
   <owner>fdoray@chromium.org</owner>
   <summary>
@@ -85,7 +85,7 @@
 </histogram>
 
 <histogram name="Discarding.DailyReloads{TabDiscardReason}" units="tabs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>vovoy@chromium.org</owner>
   <owner>fdoray@chromium.org</owner>
   <summary>
@@ -337,7 +337,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tab.NewTab" enum="NewTabType" expires_after="2025-05-11">
+<histogram name="Tab.NewTab" enum="NewTabType" expires_after="2025-07-13">
   <owner>tbergquist@chromium.org</owner>
   <owner>bsep@chromium.org</owner>
   <summary>
@@ -741,7 +741,7 @@
 </histogram>
 
 <histogram name="TabGroups.CollapsedGroupCountPerLoad" units="groups"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dpenning@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -841,7 +841,7 @@
 </histogram>
 
 <histogram name="TabGroups.SavedTabGroupLifespan" units="minutes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dljames@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -899,7 +899,7 @@
 </histogram>
 
 <histogram name="TabGroups.SavedTabGroupTabCount" units="tabs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dljames@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1213,7 +1213,7 @@
 </histogram>
 
 <histogram name="TabGroups.Sync.SavedTabGroupAge" units="minutes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>shaktisahu@chromium.org</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -1525,7 +1525,7 @@
 </histogram>
 
 <histogram name="TabGroups.UnsavedTabGroupCount" units="groups"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dljames@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1536,7 +1536,7 @@
 </histogram>
 
 <histogram name="TabGroups.UnsavedTabGroupTabCount" units="tabs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dljames@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1572,7 +1572,7 @@
 </histogram>
 
 <histogram name="TabGroups.UserGroupCountPerLoad" units="groups"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dpenning@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1708,7 +1708,7 @@
 </histogram>
 
 <histogram name="TabManager.Discarding.DiscardToReloadTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>chrisha@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1784,7 +1784,7 @@
 </histogram>
 
 <histogram name="TabRestore.{RestoreType}.TimeBetweenClosedAndRestored"
-    units="ms" expires_after="2025-05-11">
+    units="ms" expires_after="2025-07-13">
   <owner>sreejakshetty@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
   <summary>
@@ -3487,7 +3487,7 @@
 </histogram>
 
 <histogram name="Tabs.{TabActiveState}TabWidth" units="px"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dpenning@chromium.org</owner>
   <owner>tbergquist@chromium.org</owner>
   <summary>
@@ -3585,7 +3585,7 @@
   </summary>
 </histogram>
 
-<histogram name="TabStrip.TimeToSwitch" units="ms" expires_after="2025-05-11">
+<histogram name="TabStrip.TimeToSwitch" units="ms" expires_after="2025-07-13">
   <owner>dpenning@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ui/histograms.xml b/tools/metrics/histograms/metadata/ui/histograms.xml
index 2583c15..8fe1dc0 100644
--- a/tools/metrics/histograms/metadata/ui/histograms.xml
+++ b/tools/metrics/histograms/metadata/ui/histograms.xml
@@ -84,7 +84,7 @@
 <!-- LINT.ThenChange(//tools/metrics/histograms/metadata/others/histograms.xml:WebUIHostnameForCodeCache) -->
 
 <histogram name="Bubble.{BubbleName}.CloseReason" enum="WidgetClosedReason"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>kerenzhu@chromium.org</owner>
   <owner>dayeung@chromium.org</owner>
   <owner>temao@chromium.org</owner>
@@ -96,7 +96,7 @@
 </histogram>
 
 <histogram name="Bubble.{BubbleName}.CreateToPresentationTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>temao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
   <owner>kerenzhu@chromium.org</owner>
@@ -111,7 +111,7 @@
 </histogram>
 
 <histogram name="Bubble.{BubbleName}.CreateToVisibleTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>temao@chromium.org</owner>
   <owner>yuhengh@chromium.org</owner>
   <owner>kerenzhu@chromium.org</owner>
@@ -126,7 +126,7 @@
 </histogram>
 
 <histogram name="Bubble.{BubbleName}.TimeVisible" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>yuhengh@chromium.org</owner>
   <owner>kerenzhu@chromium.org</owner>
   <owner>dayeung@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ukm/histograms.xml b/tools/metrics/histograms/metadata/ukm/histograms.xml
index 00870573..be9a70f 100644
--- a/tools/metrics/histograms/metadata/ukm/histograms.xml
+++ b/tools/metrics/histograms/metadata/ukm/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="UKM.AppVersionDifferentWhenPurging" enum="BooleanChanged"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>rkaplow@google.com</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml
index 75f9f31..8862cb8 100644
--- a/tools/metrics/histograms/metadata/uma/histograms.xml
+++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -124,7 +124,7 @@
 </histogram>
 
 <histogram name="UMA.ChildProcess.Ping.{Source}" enum="UmaChildPingStatus"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>lucnguyen@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -203,7 +203,7 @@
 </histogram>
 
 <histogram name="UMA.ClientIdSource" enum="ClientIdSource"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>pdyson@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>The source of the client id when its creation is forced.</summary>
@@ -345,7 +345,7 @@
 </histogram>
 
 <histogram name="UMA.InitialStabilityRecordBeacon" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>mpearson@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -357,7 +357,7 @@
 </histogram>
 
 <histogram name="UMA.InitSequence" enum="UmaInitSequence"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -514,7 +514,7 @@
 </histogram>
 
 <histogram name="UMA.MetricsService.PendingOngoingLogOnBackgrounded"
-    enum="Boolean" expires_after="2025-05-04">
+    enum="Boolean" expires_after="2025-07-13">
   <owner>lucnguyen@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -626,7 +626,7 @@
 </histogram>
 
 <histogram name="UMA.PersistentHistograms.InitResult"
-    enum="PersistentHistogramsInitResult" expires_after="2025-05-11">
+    enum="PersistentHistogramsInitResult" expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -636,7 +636,7 @@
 </histogram>
 
 <histogram name="UMA.PrimaryUserType" enum="UserType"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>michaelpg@chromium.org</owner>
   <owner>yilkal@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -871,7 +871,7 @@
 </histogram>
 
 <histogram name="UMA.StructuredMetrics.InternalError2"
-    enum="StructuredMetricsInternalError2" expires_after="2025-05-11">
+    enum="StructuredMetricsInternalError2" expires_after="2025-07-13">
   <owner>jongahn@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
@@ -899,7 +899,7 @@
 </histogram>
 
 <histogram name="UMA.StructuredMetrics.NumEventsInUpload" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jongahn@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
@@ -911,7 +911,7 @@
 </histogram>
 
 <histogram name="UMA.StructuredMetrics.NumFilesPerExternalMetricsScan"
-    units="count" expires_after="2025-05-11">
+    units="count" expires_after="2025-07-13">
   <owner>tby@chromium.org</owner>
   <owner>jongahn@chromium.org</owner>
   <summary>
@@ -966,7 +966,7 @@
 </histogram>
 
 <histogram name="UMA.UnsentLogs.Dropped" units="logs"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>holte@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <owner>lucnguyen@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index db9297c..1d75f3e 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -2245,7 +2245,7 @@
 </histogram>
 
 <histogram name="V8.WasmCompileFunctionMicroSeconds" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2287,7 +2287,7 @@
 </histogram>
 
 <histogram name="V8.WasmCompileModuleAsyncMicroSeconds" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2300,7 +2300,7 @@
 </histogram>
 
 <histogram name="V8.WasmCompileModuleMicroSeconds" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2318,7 +2318,7 @@
 </histogram>
 
 <histogram name="V8.WasmCompileModuleStreamingMicroSeconds"
-    units="microseconds" expires_after="2025-05-11">
+    units="microseconds" expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2384,7 +2384,7 @@
 </histogram>
 
 <histogram name="V8.WasmFinishModuleStreamingMicroSeconds" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>bbudge@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
@@ -2420,7 +2420,7 @@
 </histogram>
 
 <histogram name="V8.WasmFunctionsPerModule" units="functions"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2432,7 +2432,7 @@
 </histogram>
 
 <histogram name="V8.WasmHugeFunctionSizeBytes" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2445,7 +2445,7 @@
 </histogram>
 
 <histogram name="V8.WasmInstantiateModuleMicroSeconds" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2488,7 +2488,7 @@
 </histogram>
 
 <histogram name="V8.WasmMemoryProtectionKeysSupport" enum="BooleanSupported"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>clemensb@chromium.org</owner>
   <owner>jkummerow@chromium.org</owner>
   <owner>ecmziegler@chromium.org</owner>
@@ -2515,7 +2515,7 @@
 </histogram>
 
 <histogram name="V8.WasmModuleCodeSizeMiB" units="MB"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2527,7 +2527,7 @@
 </histogram>
 
 <histogram name="V8.WasmModuleCodeSizePercentFreed" units="%"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2564,7 +2564,7 @@
 </histogram>
 
 <histogram name="V8.WasmModuleNumberOfCodeSpaces" units="spaces"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -2589,7 +2589,7 @@
 </histogram>
 
 <histogram name="V8.WasmModulesPerEngine" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>clemensb@chromium.org</owner>
   <owner>ecmziegler@chromium.org</owner>
   <owner>wasm-v8@google.com</owner>
@@ -2600,7 +2600,7 @@
 </histogram>
 
 <histogram name="V8.WasmModulesPerIsolate" units="count"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>clemensb@chromium.org</owner>
   <owner>ecmziegler@chromium.org</owner>
   <owner>wasm-v8@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml
index 3762f9c..3b213eb 100644
--- a/tools/metrics/histograms/metadata/variations/histograms.xml
+++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Variations.AppliedSeed.Size" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caitlinfischer@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -36,7 +36,7 @@
 </histogram>
 
 <histogram name="Variations.AppliedSeed.Size.V2" units="bytes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caitlinfischer@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -49,7 +49,7 @@
 </histogram>
 
 <histogram name="Variations.AppliedSeed.StudyCount" units="studies"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>caitlinfischer@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="Variations.ExtendedSafeMode.BeaconFileStateAtStartup"
-    enum="BeaconFileState" expires_after="2025-05-11">
+    enum="BeaconFileState" expires_after="2025-07-13">
   <owner>caitlinfischer@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <component>1456342</component>
@@ -189,7 +189,7 @@
 </histogram>
 
 <histogram name="Variations.FirstRunResult" enum="VariationsFirstRunResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -225,7 +225,7 @@
 </histogram>
 
 <histogram name="Variations.Headers.ExperimentCount" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -398,7 +398,7 @@
 </histogram>
 
 <histogram name="Variations.SafeMode.LoadSafeSeed.Result"
-    enum="VariationsSeedLoadResult" expires_after="2025-05-11">
+    enum="VariationsSeedLoadResult" expires_after="2025-07-13">
   <owner>isherman@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -451,7 +451,7 @@
 </histogram>
 
 <histogram name="Variations.SafeMode.Streak.Crashes" units="crashes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>isherman@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -465,7 +465,7 @@
 </histogram>
 
 <histogram name="Variations.SafeMode.Streak.FetchFailures" units="failures"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>isherman@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -526,7 +526,7 @@
 </histogram>
 
 <histogram name="Variations.SeedDateChange" enum="VariationsSeedDateChange"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>jwd@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -540,7 +540,7 @@
 </histogram>
 
 <histogram name="Variations.SeedFetchResponseOrErrorCode{ConnectionType}"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-05-11">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -586,7 +586,7 @@
 </histogram>
 
 <histogram name="Variations.SeedFileWriteEmptySeed.{SeedFile}"
-    enum="BooleanEmpty" expires_after="2025-05-06">
+    enum="BooleanEmpty" expires_after="2025-07-13">
   <owner>caitlinfischer@google.com</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -602,7 +602,7 @@
 </histogram>
 
 <histogram name="Variations.SeedFreshness" units="minutes"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -665,7 +665,7 @@
 </histogram>
 
 <histogram name="Variations.SeedLoadResult" enum="VariationsSeedLoadResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -677,7 +677,7 @@
 </histogram>
 
 <histogram name="Variations.SeedProcessingTime" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>isherman@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -756,7 +756,7 @@
 </histogram>
 
 <histogram name="Variations.UserChannel" enum="UserChannels"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -797,7 +797,7 @@
 </histogram>
 
 <histogram name="Variations.{Mode}CreateTrials.SeedExpiry"
-    enum="VariationsSeedExpiry" expires_after="2025-05-11">
+    enum="VariationsSeedExpiry" expires_after="2025-07-13">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml
index 7610233..78a4155 100644
--- a/tools/metrics/histograms/metadata/web_apk/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -72,7 +72,7 @@
 </histogram>
 
 <histogram name="WebApk.Install.GooglePlayInstallResult"
-    enum="WebApkGooglePlayInstallResult" expires_after="2025-05-11">
+    enum="WebApkGooglePlayInstallResult" expires_after="2025-07-13">
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
@@ -104,7 +104,7 @@
 </histogram>
 
 <histogram name="WebApk.Install.InstallResult" enum="WebApkInstallResult"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>eirage@chromium.org</owner>
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
@@ -161,7 +161,7 @@
 </histogram>
 
 <histogram name="WebApk.LaunchFromViewIntent" enum="Boolean"
-    expires_after="2025-03-01">
+    expires_after="2025-07-13">
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
@@ -207,7 +207,7 @@
 </histogram>
 
 <histogram name="WebApk.ShellApkVersion2{WebApkDistributorType}" units="units"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
@@ -336,7 +336,7 @@
 </histogram>
 
 <histogram name="WebApk.Uninstall{WebApkDistributorType}" enum="BooleanHit"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index 29a0abf5..8b555fdf 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -353,7 +353,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.DelayedPacketOutageEventsPerMinute"
-    units="events/minute" expires_after="2025-05-11">
+    units="events/minute" expires_after="2025-07-13">
   <owner>hlundin@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
   <summary>
@@ -757,7 +757,7 @@
 </histogram>
 
 <histogram name="WebRTC.BWE.InitialBandwidthEstimate" units="kbps"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>holmer@chromium.org</owner>
   <summary>The bandwidth estimate 2 seconds into a WebRTC call.</summary>
 </histogram>
@@ -797,7 +797,7 @@
 </histogram>
 
 <histogram name="WebRTC.BWE.RampUpTimeTo2000kbpsInMs" units="ms"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>holmer@chromium.org</owner>
   <summary>
     The time it takes the estimated bandwidth to reach 2000 kbps from the first
@@ -912,7 +912,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.BitrateReceivedInKbps" units="kbps"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>holmer@chromium.org</owner>
   <summary>
     Average total bitrate received during a call (audio + video + RTCP), counted
@@ -986,7 +986,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.VideoBitrateReceivedInKbps" units="kbps"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>holmer@chromium.org</owner>
   <summary>
     Average video bitrate received during a call, counted from first packet
@@ -1185,7 +1185,7 @@
 </histogram>
 
 <histogram name="WebRTC.DesktopCaptureCounters" enum="DesktopCaptureCounters"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>toprice@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1323,7 +1323,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Duration.Signaling" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>handellm@google.com</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1419,7 +1419,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Latency.Signaling" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>handellm@google.com</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1435,7 +1435,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Latency.Worker" units="microseconds"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>handellm@google.com</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index 2705d757..4f201ec7 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -67,7 +67,7 @@
 </variants>
 
 <histogram name="AppBanners.BeforeInstallEvent"
-    enum="AppBannersBeforeInstallEvent" expires_after="2025-05-11">
+    enum="AppBannersBeforeInstallEvent" expires_after="2025-07-13">
   <owner>dominickn@chromium.org</owner>
   <owner>pjmclachlan@google.com</owner>
   <owner>pwa-team@google.com</owner>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="AppBanners.DisplayEvent" enum="AppBannersDisplayEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>pjmclachlan@google.com</owner>
   <owner>pcovell@google.com</owner>
   <summary>
@@ -106,7 +106,7 @@
 </histogram>
 
 <histogram name="AppBanners.InstallableStatusCode" enum="InstallableStatusCode"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dominickn@chromium.org</owner>
   <owner>pjmclachlan@google.com</owner>
   <summary>
@@ -119,7 +119,7 @@
 </histogram>
 
 <histogram name="AppBanners.InstallEvent" enum="AppBannersInstallEvent"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dominickn@chromium.org</owner>
   <owner>pjmclachlan@google.com</owner>
   <owner>pcovell@google.com</owner>
@@ -132,7 +132,7 @@
 </histogram>
 
 <histogram name="AppBanners.UserResponse" enum="AppBannersUserResponse"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dominickn@chromium.org</owner>
   <owner>pjmclachlan@google.com</owner>
   <summary>
@@ -214,7 +214,7 @@
 </histogram>
 
 <histogram name="Launch.WebApp.DiyOrCrafted" enum="LaunchedAppType"
-    expires_after="2025-05-10">
+    expires_after="2025-07-13">
   <owner>dibyapal@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -224,7 +224,7 @@
 </histogram>
 
 <histogram name="Launch.WebAppDisplayMode" enum="WebAppDisplayMode"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>peter@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -269,7 +269,7 @@
 </histogram>
 
 <histogram name="Webapp.AmbientBadge.Terminate"
-    enum="InstallableAmbientBadgeState" expires_after="2025-05-11">
+    enum="InstallableAmbientBadgeState" expires_after="2025-07-13">
   <owner>eirage@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
@@ -1072,7 +1072,7 @@
 </histogram>
 
 <histogram name="WebApp.InstallConfirmation.CloseReason"
-    enum="WidgetClosedReason" expires_after="2025-05-11">
+    enum="WidgetClosedReason" expires_after="2025-07-13">
   <owner>dmurph@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -1417,7 +1417,7 @@
 </histogram>
 
 <histogram name="WebApp.Launcher.LaunchResult"
-    enum="WebAppLauncherLaunchResult" expires_after="2025-05-11">
+    enum="WebAppLauncherLaunchResult" expires_after="2025-07-13">
   <owner>davidbienvenu@chromium.org</owner>
   <owner>jessemckenna@google.com</owner>
   <summary>
@@ -1544,7 +1544,7 @@
 </histogram>
 
 <histogram name="WebApp.OsSettingsUninstallRegistration.Result"
-    enum="BooleanSuccess" expires_after="2025-05-11">
+    enum="BooleanSuccess" expires_after="2025-07-13">
   <owner>dmurph@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -1834,14 +1834,14 @@
 </histogram>
 
 <histogram name="WebApp.Shortcuts.Creation.Result"
-    enum="ShortcutsCreationResult" expires_after="2025-05-11">
+    enum="ShortcutsCreationResult" expires_after="2025-07-13">
   <owner>phillis@chromium.org</owner>
   <owner>dmurph@chromium.org</owner>
   <summary>Records the result of shortcut creation for PWA.</summary>
 </histogram>
 
 <histogram name="WebApp.Shortcuts.Delete.Result" enum="BooleanSuccess"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>dmurph@google.com</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -1855,7 +1855,7 @@
 </histogram>
 
 <histogram name="WebApp.Shortcuts.Update.Result" enum="BooleanSuccess"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>camdenking@google.com</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 8c2cbb4..3ff628d 100644
--- a/tools/metrics/histograms/metadata/webauthn/histograms.xml
+++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="WebAuthentication.Android.CredManAvailability" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>kenrb@chromium.org</owner>
   <summary>
@@ -53,7 +53,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.Android.CredManModalRequests"
-    enum="CredManGetRequestEnum" expires_after="2025-05-11">
+    enum="CredManGetRequestEnum" expires_after="2025-07-13">
   <owner>derinel@google.com</owner>
   <owner>kenrb@chromium.org</owner>
   <summary>
@@ -451,7 +451,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.PinRenewalEvent"
-    enum="WebAuthenticationPinRenewalEvent" expires_after="2025-05-11">
+    enum="WebAuthenticationPinRenewalEvent" expires_after="2025-07-13">
   <owner>agl@google.com</owner>
   <owner>kenrb@chromium.org</owner>
   <summary>Records events related to GPM PIN renewals</summary>
diff --git a/tools/metrics/histograms/metadata/webnn/enums.xml b/tools/metrics/histograms/metadata/webnn/enums.xml
index 8d12d8d6..23df64cb 100644
--- a/tools/metrics/histograms/metadata/webnn/enums.xml
+++ b/tools/metrics/histograms/metadata/webnn/enums.xml
@@ -134,6 +134,7 @@
   <int value="89" label="Triangular"/>
   <int value="90" label="Where"/>
   <int value="91" label="Reverse"/>
+  <int value="92" label="NotEqual"/>
 </enum>
 
 </enums>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml
index bf1e2715..df49cc7 100644
--- a/tools/metrics/histograms/metadata/windows/histograms.xml
+++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -113,7 +113,7 @@
 </histogram>
 
 <histogram name="Windows.HasHighResolutionTimeTicks" enum="Boolean"
-    expires_after="2025-05-11">
+    expires_after="2025-07-13">
   <owner>brucedawson@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -182,7 +182,7 @@
 </histogram>
 
 <histogram name="Windows.LegacyDisplayIdAlgorithm" enum="UsedDisplayIdFallback"
-    expires_after="2025-05-04">
+    expires_after="2025-07-13">
   <owner>btriebw@google.com</owner>
   <owner>msw@google.com</owner>
   <summary>
diff --git a/tools/metrics/structured/sync/structured.xml b/tools/metrics/structured/sync/structured.xml
index 553a502..49b46b7a 100644
--- a/tools/metrics/structured/sync/structured.xml
+++ b/tools/metrics/structured/sync/structured.xml
@@ -1232,7 +1232,6 @@
     <variant value="0">UNKNOWN</variant>
     <variant value="1">OPEN_EDITOR_WRITE</variant>
     <variant value="2">OPEN_EDITOR_REWRITE</variant>
-    <variant value="2">OPEN_LOBSTER</variant>
     <variant value="3">OPEN_LINKS</variant>
     <variant value="4">OPEN_EXPRESSIONS</variant>
     <variant value="5">OPEN_CLIPBOARD</variant>
@@ -1247,6 +1246,7 @@
     <variant value="14">CAPS_ON</variant>
     <variant value="15">CAPS_OFF</variant>
     <variant value="16">OPEN_GIFS</variant>
+    <variant value="17">OPEN_LOBSTER</variant>
   </enum>
 
   <enum name="PickerResultSource">
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index 29155159..27914555 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -1316,8 +1316,7 @@
     if (!root_) {
       ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
           AXTreeUnserializeError::kNoRoot);
-      // TODO(b/368660753): make this fatal once root cause resolved.
-      RecordError(update_state, "Tree has no root.", /*is_fatal=*/false);
+      RecordError(update_state, "Tree has no root.", true);
       return false;
     }
 
diff --git a/ui/chromeos/resources/ui_chromeos_resources.grd b/ui/chromeos/resources/ui_chromeos_resources.grd
index 786f813..f9b263bc 100644
--- a/ui/chromeos/resources/ui_chromeos_resources.grd
+++ b/ui/chromeos/resources/ui_chromeos_resources.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/ui_chromeos_resources.h" type="rc_header" context="default_100_percent">
       <emit emit_type='prepend'></emit>
diff --git a/ui/chromeos/ui_chromeos_strings.grd b/ui/chromeos/ui_chromeos_strings.grd
index 2346a55..ad1bda2 100644
--- a/ui/chromeos/ui_chromeos_strings.grd
+++ b/ui/chromeos/ui_chromeos_strings.grd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/ui_chromeos_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/ozone/platform/wayland/common/wayland_util.cc b/ui/ozone/platform/wayland/common/wayland_util.cc
index 7a52871..e12202f 100644
--- a/ui/ozone/platform/wayland/common/wayland_util.cc
+++ b/ui/ozone/platform/wayland/common/wayland_util.cc
@@ -20,6 +20,7 @@
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/base/hit_test.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/event.h"
 #include "ui/gfx/geometry/skia_conversions.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc b/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
index 7239159..373fe02 100644
--- a/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
+++ b/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
@@ -20,6 +20,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/gfx/buffer_types.h"
+#include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/linux/gbm_buffer.h"
 #include "ui/gfx/linux/gbm_device.h"
 #include "ui/gfx/linux/test/mock_gbm_device.h"
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
index b7f52e7..5e6ed297 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -20,7 +20,6 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/display/tablet_state.h"
-#include "ui/events/event.h"
 #include "ui/gl/gl_display.h"
 #include "ui/ozone/platform/wayland/common/wayland_object.h"
 #include "ui/ozone/platform/wayland/host/single_pixel_buffer.h"
diff --git a/ui/strings/app_locale_settings.grd b/ui/strings/app_locale_settings.grd
index 27a6a07..7bd6a4ba 100644
--- a/ui/strings/app_locale_settings.grd
+++ b/ui/strings/app_locale_settings.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/app_locale_settings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/strings/auto_image_annotation_strings.grd b/ui/strings/auto_image_annotation_strings.grd
index 12395ac..93be094 100644
--- a/ui/strings/auto_image_annotation_strings.grd
+++ b/ui/strings/auto_image_annotation_strings.grd
@@ -5,7 +5,7 @@
 need to be translated for each locale. Note that some accessibility strings remain in blink_strings.grd; those strings need to be part of Android webview. -->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/auto_image_annotation_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/strings/ax_strings.grd b/ui/strings/ax_strings.grd
index b5118379..f3b2ac7 100644
--- a/ui/strings/ax_strings.grd
+++ b/ui/strings/ax_strings.grd
@@ -5,7 +5,7 @@
 need to be translated for each locale.-->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en">
+      source_lang_id="en">
   <outputs>
     <output filename="grit/ax_strings.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/strings/ui_strings.grd b/ui/strings/ui_strings.grd
index bc540c3e0..928a563a 100644
--- a/ui/strings/ui_strings.grd
+++ b/ui/strings/ui_strings.grd
@@ -5,7 +5,7 @@
 need to be translated for each locale.-->
 
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <!-- TODO add each of your output files.  Modify the three below, and add
     your own for your various languages.  See the user's guide
diff --git a/ui/webui/examples/resources/webui_examples_resources.grd b/ui/webui/examples/resources/webui_examples_resources.grd
index 0d2f186b..a4ffa5ce 100644
--- a/ui/webui/examples/resources/webui_examples_resources.grd
+++ b/ui/webui/examples/resources/webui_examples_resources.grd
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+      source_lang_id="en" enc_check="möl">
   <outputs>
     <output filename="grit/webui_examples_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/webui/resources/tools/generate_grd.py b/ui/webui/resources/tools/generate_grd.py
index 4627c19..63dfeef2 100644
--- a/ui/webui/resources/tools/generate_grd.py
+++ b/ui/webui/resources/tools/generate_grd.py
@@ -46,8 +46,7 @@
 _CWD = os.getcwd()
 
 GRD_BEGIN_TEMPLATE = '<?xml version="1.0" encoding="UTF-8"?>\n'\
-                     '<grit latest_public_release="0" current_release="1" '\
-                     'output_all_resource_defines="false">\n'\
+                     '<grit latest_public_release="0" current_release="1">\n'\
                      '  <outputs>\n'\
                      '    <output filename="{out_dir}/{prefix}_resources.h" '\
                      'type="rc_header">\n'\
diff --git a/ui/webui/resources/tools/generate_grd_test.py b/ui/webui/resources/tools/generate_grd_test.py
index 2443b5ca..bec2914b 100755
--- a/ui/webui/resources/tools/generate_grd_test.py
+++ b/ui/webui/resources/tools/generate_grd_test.py
@@ -20,7 +20,7 @@
 # exist. We can't alter the translation script, so work around it by
 # hardcoding this string, instead of checking in even more dummy files.
 EXPECTED_GRD_WITH_GRDP_FILES = '''<?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/webui/resources/tools/tests/generate_grd/expected_grd.grd b/ui/webui/resources/tools/tests/generate_grd/expected_grd.grd
index 1a85c39..6e13725 100644
--- a/ui/webui/resources/tools/tests/generate_grd/expected_grd.grd
+++ b/ui/webui/resources/tools/tests/generate_grd/expected_grd.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_generated_input_files.grd b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_generated_input_files.grd
index 237387d..b9d02e4 100644
--- a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_generated_input_files.grd
+++ b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_generated_input_files.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_input_files.grd b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_input_files.grd
index 957f5024..949c9c5 100644
--- a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_input_files.grd
+++ b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_input_files.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_output_files_base_dir.grd b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_output_files_base_dir.grd
index b9c8477..bc5bbb1 100644
--- a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_output_files_base_dir.grd
+++ b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_output_files_base_dir.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="foo/bar/test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>
diff --git a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_rewrites.grd b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_rewrites.grd
index 41339a5..b88a05b 100644
--- a/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_rewrites.grd
+++ b/ui/webui/resources/tools/tests/generate_grd/expected_grd_with_rewrites.grd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+<grit latest_public_release="0" current_release="1">
   <outputs>
     <output filename="grit/test_resources.h" type="rc_header">
       <emit emit_type='prepend'></emit>